diff options
author | Max Kellermann <max@duempel.org> | 2009-02-17 23:26:51 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-02-17 23:26:51 +0100 |
commit | 161bfc4bc09b4746299d35c26edee89e0b66c43c (patch) | |
tree | 16cf479c62f938cab545689d1a593c4b74cb722e /src | |
parent | a72c7a7b18589fdbdab1d5d8e8045069b0774a5e (diff) | |
download | mpd-161bfc4bc09b4746299d35c26edee89e0b66c43c.tar.gz mpd-161bfc4bc09b4746299d35c26edee89e0b66c43c.tar.xz mpd-161bfc4bc09b4746299d35c26edee89e0b66c43c.zip |
faad: call decoder_initialized() after libfaad initialization
Don't wait for the first frame to be decoded. We already have the
sample rate and the channel count from faacDecInit().
Diffstat (limited to '')
-rw-r--r-- | src/decoder/faad_plugin.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/src/decoder/faad_plugin.c b/src/decoder/faad_plugin.c index 5c3d0e6df..290a7c7f0 100644 --- a/src/decoder/faad_plugin.c +++ b/src/decoder/faad_plugin.c @@ -348,6 +348,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is) float file_time; float total_time = 0; faacDecHandle decoder; + struct audio_format audio_format; faacDecFrameInfo frame_info; faacDecConfigurationPtr config; uint32_t sample_rate; @@ -358,7 +359,6 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is) size_t decoded_length; uint16_t bit_rate = 0; struct decoder_buffer *buffer; - bool initialized = false; enum decoder_command cmd; buffer = decoder_buffer_new(mpd_decoder, is, @@ -392,6 +392,20 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is) return; } + audio_format = (struct audio_format){ + .bits = 16, + .channels = channels, + .sample_rate = sample_rate, + }; + + if (!audio_format_valid(&audio_format)) { + g_warning("invalid audio format\n"); + faacDecClose(decoder); + return; + } + + decoder_initialized(mpd_decoder, &audio_format, false, total_time); + file_time = 0.0; do { @@ -406,26 +420,21 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is) faacDecGetErrorMessage(frame_info.error)); break; } -#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE - sample_rate = frame_info.samplerate; -#endif - if (!initialized) { - const struct audio_format audio_format = { - .bits = 16, - .channels = frame_info.channels, - .sample_rate = sample_rate, - }; - - if (!audio_format_valid(&audio_format)) { - g_warning("invalid audio format\n"); - break; - } + if (frame_info.channels != channels) { + g_warning("channel count changed from %u to %u", + channels, frame_info.channels); + break; + } - decoder_initialized(mpd_decoder, &audio_format, - false, total_time); - initialized = true; +#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE + if (frame_info.samplerate != sample_rate) { + g_warning("sample rate changed from %u to %lu", + sample_rate, + (unsigned long)frame_info.samplerate); + break; } +#endif decoder_buffer_consume(buffer, frame_info.bytesconsumed); |