From 6308765cb554f7bbc675376915f38d9c8e0706ab Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Fri, 10 Jul 2009 21:53:04 +0000 Subject: [PATCH] Ignore subsequent channel configurations after the first in an AAC file. The current code doesn't handle them properly, and they are a dubious construction at best. Originally committed as revision 19399 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/aac.c | 21 ++++++++++++++------- libavcodec/aac.h | 2 ++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/libavcodec/aac.c b/libavcodec/aac.c index c7c5a9f69f..df13f0c77f 100644 --- a/libavcodec/aac.c +++ b/libavcodec/aac.c @@ -199,6 +199,8 @@ static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_ avctx->channels = channels; + ac->output_configured = 1; + return 0; } @@ -445,12 +447,6 @@ static av_cold int aac_decode_init(AVCodecContext * avccontext) { return -1; avccontext->sample_rate = ac->m4ac.sample_rate; } else if (avccontext->channels > 0) { - enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; - memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); - if(set_default_channel_config(ac, new_che_pos, avccontext->channels - (avccontext->channels == 8))) - return -1; - if(output_configure(ac, ac->che_pos, new_che_pos, 1)) - return -1; ac->m4ac.sample_rate = avccontext->sample_rate; } @@ -1579,8 +1575,15 @@ static int parse_adts_frame_header(AACContext * ac, GetBitContext * gb) { size = ff_aac_parse_header(gb, &hdr_info); if (size > 0) { - if (hdr_info.chan_config) + if (!ac->output_configured && hdr_info.chan_config) { + enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; + memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); ac->m4ac.chan_config = hdr_info.chan_config; + if (set_default_channel_config(ac, new_che_pos, hdr_info.chan_config)) + return -7; + if (output_configure(ac, ac->che_pos, new_che_pos, 1)) + return -7; + } ac->m4ac.sample_rate = hdr_info.sample_rate; ac->m4ac.sampling_index = hdr_info.sampling_index; ac->m4ac.object_type = hdr_info.object_type; @@ -1655,6 +1658,10 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); if((err = decode_pce(ac, new_che_pos, &gb))) break; + if (ac->output_configured) + av_log(avccontext, AV_LOG_ERROR, + "Not evaluating a further program_config_element as this construct is dubious at best.\n"); + else err = output_configure(ac, ac->che_pos, new_che_pos, 0); break; } diff --git a/libavcodec/aac.h b/libavcodec/aac.h index 1d24a59667..cd295499ed 100644 --- a/libavcodec/aac.h +++ b/libavcodec/aac.h @@ -274,6 +274,8 @@ typedef struct { /** @} */ DECLARE_ALIGNED(16, float, temp[128]); + + int output_configured; } AACContext; #endif /* AVCODEC_AAC_H */