From 8fdd542ce4c357d38b4601e9a327f499c9a096f1 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Tue, 9 Mar 2010 00:18:49 +0000 Subject: In mpegts muxer, write adts header if aac bitstream does not contain it Originally committed as revision 22355 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/adtsenc.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) (limited to 'libavformat/adtsenc.c') diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c index 260c5932a3..ecc8dc40de 100644 --- a/libavformat/adtsenc.c +++ b/libavformat/adtsenc.c @@ -23,21 +23,10 @@ #include "libavcodec/get_bits.h" #include "libavcodec/put_bits.h" #include "libavcodec/avcodec.h" -#include "libavcodec/mpeg4audio.h" #include "avformat.h" +#include "adts.h" -#define ADTS_HEADER_SIZE 7 - -typedef struct { - int write_adts; - int objecttype; - int sample_rate_index; - int channel_conf; - int pce_size; - uint8_t pce_data[MAX_PCE_SIZE]; -} ADTSContext; - -static int decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf, int size) +int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf, int size) { GetBitContext gb; PutBitContext pb; @@ -86,17 +75,16 @@ static int adts_write_header(AVFormatContext *s) AVCodecContext *avc = s->streams[0]->codec; if(avc->extradata_size > 0 && - decode_extradata(s, adts, avc->extradata, avc->extradata_size) < 0) + ff_adts_decode_extradata(s, adts, avc->extradata, avc->extradata_size) < 0) return -1; return 0; } -static int adts_write_frame_header(AVFormatContext *s, int size) +int ff_adts_write_frame_header(ADTSContext *ctx, + uint8_t *buf, int size, int pce_size) { - ADTSContext *ctx = s->priv_data; PutBitContext pb; - uint8_t buf[ADTS_HEADER_SIZE]; init_put_bits(&pb, buf, ADTS_HEADER_SIZE); @@ -115,16 +103,11 @@ static int adts_write_frame_header(AVFormatContext *s, int size) /* adts_variable_header */ put_bits(&pb, 1, 0); /* copyright_identification_bit */ put_bits(&pb, 1, 0); /* copyright_identification_start */ - put_bits(&pb, 13, ADTS_HEADER_SIZE + size + ctx->pce_size); /* aac_frame_length */ + put_bits(&pb, 13, ADTS_HEADER_SIZE + size + pce_size); /* aac_frame_length */ put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */ put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */ flush_put_bits(&pb); - put_buffer(s->pb, buf, ADTS_HEADER_SIZE); - if (ctx->pce_size) { - put_buffer(s->pb, ctx->pce_data, ctx->pce_size); - ctx->pce_size = 0; - } return 0; } @@ -133,11 +116,18 @@ static int adts_write_packet(AVFormatContext *s, AVPacket *pkt) { ADTSContext *adts = s->priv_data; ByteIOContext *pb = s->pb; + uint8_t buf[ADTS_HEADER_SIZE]; if (!pkt->size) return 0; - if(adts->write_adts) - adts_write_frame_header(s, pkt->size); + if(adts->write_adts) { + ff_adts_write_frame_header(adts, buf, pkt->size, adts->pce_size); + put_buffer(pb, buf, ADTS_HEADER_SIZE); + if(adts->pce_size) { + put_buffer(pb, adts->pce_data, adts->pce_size); + adts->pce_size = 0; + } + } put_buffer(pb, pkt->data, pkt->size); put_flush_packet(pb); -- cgit v1.2.3