AAC parser: Don't write channels, sample rate, and frame size each frame.
authorAlex Converse <alex.converse@gmail.com>
Thu, 4 Mar 2010 02:30:51 +0000 (02:30 +0000)
committerAlex Converse <alex.converse@gmail.com>
Thu, 4 Mar 2010 02:30:51 +0000 (02:30 +0000)
Thanks to backwards compatible HE-AAC signalling these values are unreliable.

Originally committed as revision 22194 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/aac_ac3_parser.c

index 85993c0..83ad9c5 100644 (file)
@@ -71,10 +71,16 @@ get_next:
     *poutbuf_size = buf_size;
 
     /* update codec info */
     *poutbuf_size = buf_size;
 
     /* update codec info */
-    avctx->sample_rate = s->sample_rate;
     if(s->codec_id)
         avctx->codec_id = s->codec_id;
 
     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 &&
     /* allow downmixing to stereo (or mono for AC-3) */
     if(avctx->request_channels > 0 &&
             avctx->request_channels < s->channels &&
@@ -83,12 +89,14 @@ get_next:
             (avctx->codec_id == CODEC_ID_AC3 ||
              avctx->codec_id == CODEC_ID_EAC3)))) {
         avctx->channels = avctx->request_channels;
             (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->channels = s->channels;
         avctx->channel_layout = s->channel_layout;
     }
-    avctx->bit_rate = s->bit_rate;
     avctx->frame_size = s->samples;
     avctx->frame_size = s->samples;
+    }
+
+    avctx->bit_rate = s->bit_rate;
 
     return i;
 }
 
     return i;
 }