- if (s->frame_size == 0) {
- if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
- len = s->sync(s, &frame_flag);
- if (len == 0) {
- /* no sync found : move by one byte (inefficient, but simple!) */
- memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
- s->inbuf_ptr--;
- } else {
- s->frame_size = len;
- /* update codec info */
- avctx->sample_rate = s->sample_rate;
- /* allow downmixing to stereo (or mono for AC3) */
- if(avctx->request_channels > 0 &&
- avctx->request_channels < s->channels &&
- (avctx->request_channels <= 2 ||
- (avctx->request_channels == 1 &&
- avctx->codec_id == CODEC_ID_AC3))) {
- avctx->channels = avctx->request_channels;
- } else {
- avctx->channels = s->channels;
- }
- avctx->bit_rate = s->bit_rate;
- avctx->frame_size = s->samples;
- }
- }
+ /* update codec info */
+ 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 &&
+ (avctx->request_channels <= 2 ||
+ (avctx->request_channels == 1 &&
+ (avctx->codec_id == CODEC_ID_AC3 ||
+ avctx->codec_id == CODEC_ID_EAC3)))) {
+ avctx->channels = avctx->request_channels;