From 161bfc4bc09b4746299d35c26edee89e0b66c43c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 17 Feb 2009 23:26:51 +0100 Subject: 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(). --- src/decoder/faad_plugin.c | 45 +++++++++++++++++++++++++++------------------ 1 file 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); -- cgit v1.2.3