summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2009-07-10 21:53:04 +0000
committerAlex Converse <alex.converse@gmail.com>2009-07-10 21:53:04 +0000
commit6308765cb554f7bbc675376915f38d9c8e0706ab (patch)
treef7d543877ee0aa20b515063c54e775e2efaa9dfc
parentc8ec2f1cb8b0cdea17a94468b89b66334f5f523e (diff)
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
-rw-r--r--libavcodec/aac.c21
-rw-r--r--libavcodec/aac.h2
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 */