changeset 6205:1327f1008940 libavformat

Allow remuxing of explicitly signalled AAC files into ADTS. The ADTS output files are not explicitly signaled because the format does not support explicit signalling.
author alexc
date Thu, 01 Jul 2010 14:49:32 +0000
parents fbc809c24e5b
children 8515b7b4fe87
files adtsenc.c
diffstat 1 files changed, 10 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/adtsenc.c	Thu Jul 01 13:50:15 2010 +0000
+++ b/adtsenc.c	Thu Jul 01 14:49:32 2010 +0000
@@ -23,6 +23,7 @@
 #include "libavcodec/get_bits.h"
 #include "libavcodec/put_bits.h"
 #include "libavcodec/avcodec.h"
+#include "libavcodec/mpeg4audio.h"
 #include "avformat.h"
 #include "adts.h"
 
@@ -30,11 +31,17 @@
 {
     GetBitContext gb;
     PutBitContext pb;
+    MPEG4AudioConfig m4ac;
+    int off;
 
     init_get_bits(&gb, buf, size * 8);
-    adts->objecttype = get_bits(&gb, 5) - 1;
-    adts->sample_rate_index = get_bits(&gb, 4);
-    adts->channel_conf = get_bits(&gb, 4);
+    off = ff_mpeg4audio_get_config(&m4ac, buf, size);
+    if (off < 0)
+        return off;
+    skip_bits_long(&gb, off);
+    adts->objecttype        = m4ac.object_type - 1;
+    adts->sample_rate_index = m4ac.sampling_index;
+    adts->channel_conf      = m4ac.chan_config;
 
     if (adts->objecttype > 3U) {
         av_log(s, AV_LOG_ERROR, "MPEG-4 AOT %d is not allowed in ADTS\n", adts->objecttype+1);
@@ -52,10 +59,6 @@
         av_log(s, AV_LOG_ERROR, "Scalable configurations are not allowed in ADTS\n");
         return -1;
     }
-    if (get_bits(&gb, 1)) {
-        av_log_missing_feature(s, "Signaled SBR or PS", 0);
-        return -1;
-    }
     if (!adts->channel_conf) {
         init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE);