diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-03-09 00:18:49 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-03-09 00:18:49 +0000 |
commit | 8fdd542ce4c357d38b4601e9a327f499c9a096f1 (patch) | |
tree | 185be31d52cf63791037dbaa3963fd1764000d24 /libavformat/adtsenc.c | |
parent | e17d77bb674879505f9f438e610441e1834fb908 (diff) | |
download | ffmpeg-8fdd542ce4c357d38b4601e9a327f499c9a096f1.tar.gz |
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
Diffstat (limited to 'libavformat/adtsenc.c')
-rw-r--r-- | libavformat/adtsenc.c | 40 |
1 files changed, 15 insertions, 25 deletions
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); |