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