# HG changeset patch # User alexc # Date 1267669851 0 # Node ID 9056fd7652557a4e43f19603f2919eea01a7acee # Parent 3f7b7e3695c071506c62ac737e102a2f79d64f14 AAC parser: Don't write channels, sample rate, and frame size each frame. Thanks to backwards compatible HE-AAC signalling these values are unreliable. diff -r 3f7b7e3695c0 -r 9056fd765255 aac_ac3_parser.c --- a/aac_ac3_parser.c Thu Mar 04 02:00:05 2010 +0000 +++ b/aac_ac3_parser.c Thu Mar 04 02:30:51 2010 +0000 @@ -71,10 +71,16 @@ *poutbuf_size = buf_size; /* update codec info */ - avctx->sample_rate = s->sample_rate; if(s->codec_id) avctx->codec_id = s->codec_id; + /* Due to backwards compatible HE-AAC the sample rate, channel count, + and total number of samples found in an AAC ADTS header are not + reliable. Bit rate is still accurate because the total frame duration in + seconds is still correct (as is the number of bits in the frame). */ + if (avctx->codec_id != CODEC_ID_AAC) { + avctx->sample_rate = s->sample_rate; + /* allow downmixing to stereo (or mono for AC-3) */ if(avctx->request_channels > 0 && avctx->request_channels < s->channels && @@ -83,12 +89,14 @@ (avctx->codec_id == CODEC_ID_AC3 || avctx->codec_id == CODEC_ID_EAC3)))) { avctx->channels = avctx->request_channels; - } else if (avctx->codec_id != CODEC_ID_AAC || s->channels) { + } else { avctx->channels = s->channels; avctx->channel_layout = s->channel_layout; } + avctx->frame_size = s->samples; + } + avctx->bit_rate = s->bit_rate; - avctx->frame_size = s->samples; return i; }