This seems like a more reliable way to determine whether to add ADTS headers
than basing it on the existence of extradata.
---
 libavcodec/Makefile   |    2 +-
 libavformat/adtsenc.c |   24 ++++++++++++++++++++++--
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 6308e82..5182f9b 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -535,7 +535,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o 
adpcm_data.o
 OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
 
 # libavformat dependencies
-OBJS-$(CONFIG_ADTS_MUXER)              += mpeg4audio.o
+OBJS-$(CONFIG_ADTS_MUXER)              += mpeg4audio.o aacadtsdec.o
 OBJS-$(CONFIG_ADX_DEMUXER)             += adx.o
 OBJS-$(CONFIG_CAF_DEMUXER)             += mpeg4audio.o mpegaudiodata.o
 OBJS-$(CONFIG_DV_DEMUXER)              += dvdata.o
diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c
index ef3d8e2..f437372 100644
--- a/libavformat/adtsenc.c
+++ b/libavformat/adtsenc.c
@@ -23,6 +23,7 @@
 #include "libavcodec/get_bits.h"
 #include "libavcodec/put_bits.h"
 #include "libavcodec/avcodec.h"
+#include "libavcodec/aacadtsdec.h"
 #include "libavcodec/mpeg4audio.h"
 #include "avformat.h"
 #include "adts.h"
@@ -73,8 +74,6 @@ int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext 
*adts, uint8_t *buf
         flush_put_bits(&pb);
     }
 
-    adts->write_adts = 1;
-
     return 0;
 }
 
@@ -83,6 +82,8 @@ static int adts_write_header(AVFormatContext *s)
     ADTSContext *adts = s->priv_data;
     AVCodecContext *avc = s->streams[0]->codec;
 
+    adts->write_adts = -1;
+
     if (avc->extradata_size > 0 &&
             ff_adts_decode_extradata(s, adts, avc->extradata, 
avc->extradata_size) < 0)
         return -1;
@@ -136,6 +137,25 @@ static int adts_write_packet(AVFormatContext *s, AVPacket 
*pkt)
 
     if (!pkt->size)
         return 0;
+
+    /* detect ADTS vs. raw AAC */
+    if (adts->write_adts < 0) {
+        if (pkt->size < ADTS_HEADER_SIZE) {
+            adts->write_adts = 1;
+        } else {
+            int size;
+            GetBitContext gb;
+            AACADTSHeaderInfo hdr;
+
+            init_get_bits(&gb, pkt->data, pkt->size * 8);
+            size = avpriv_aac_parse_header(&gb, &hdr);
+            if (size < 0 || size != pkt->size)
+                adts->write_adts = 1;
+            else
+                adts->write_adts = 0;
+        }
+    }
+
     if (adts->write_adts) {
         int err = ff_adts_write_frame_header(adts, buf, pkt->size,
                                              adts->pce_size);
-- 
1.7.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to