X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Flatmenc.c;h=43ca4821cb1a3c841b25fd7f981a9d1d8243afba;hb=2aad631a818cc49fc30da349c319abfb119adea1;hp=db6977e58536aabde498334301a9493e6eda5fe8;hpb=ef7ce480c848267a77bd89666b9b22b2298c181d;p=ffmpeg diff --git a/libavformat/latmenc.c b/libavformat/latmenc.c index db6977e5853..43ca4821cb1 100644 --- a/libavformat/latmenc.c +++ b/libavformat/latmenc.c @@ -25,6 +25,7 @@ #include "libavcodec/mpeg4audio.h" #include "libavutil/opt.h" #include "avformat.h" +#include "internal.h" #include "rawenc.h" #define MAX_EXTRADATA_SIZE 1024 @@ -84,13 +85,13 @@ static int latm_decode_extradata(LATMContext *ctx, uint8_t *buf, int size) static int latm_write_header(AVFormatContext *s) { LATMContext *ctx = s->priv_data; - AVCodecContext *avctx = s->streams[0]->codec; + AVCodecParameters *par = s->streams[0]->codecpar; - if (avctx->codec_id == AV_CODEC_ID_AAC_LATM) + if (par->codec_id == AV_CODEC_ID_AAC_LATM) return 0; - if (avctx->extradata_size > 0 && - latm_decode_extradata(ctx, avctx->extradata, avctx->extradata_size) < 0) + if (par->extradata_size > 0 && + latm_decode_extradata(ctx, par->extradata, par->extradata_size) < 0) return AVERROR_INVALIDDATA; return 0; @@ -99,7 +100,7 @@ static int latm_write_header(AVFormatContext *s) static void latm_write_frame_header(AVFormatContext *s, PutBitContext *bs) { LATMContext *ctx = s->priv_data; - AVCodecContext *avctx = s->streams[0]->codec; + AVCodecParameters *par = s->streams[0]->codecpar; int header_size; /* AudioMuxElement */ @@ -115,16 +116,16 @@ static void latm_write_frame_header(AVFormatContext *s, PutBitContext *bs) /* AudioSpecificConfig */ if (ctx->object_type == AOT_ALS) { - header_size = avctx->extradata_size-(ctx->off >> 3); - avpriv_copy_bits(bs, &avctx->extradata[ctx->off >> 3], header_size); + header_size = par->extradata_size-(ctx->off >> 3); + avpriv_copy_bits(bs, &par->extradata[ctx->off >> 3], header_size); } else { // + 3 assumes not scalable and dependsOnCoreCoder == 0, // see decode_ga_specific_config in libavcodec/aacdec.c - avpriv_copy_bits(bs, avctx->extradata, ctx->off + 3); + avpriv_copy_bits(bs, par->extradata, ctx->off + 3); if (!ctx->channel_conf) { GetBitContext gb; - int ret = init_get_bits8(&gb, avctx->extradata, avctx->extradata_size); + int ret = init_get_bits8(&gb, par->extradata, par->extradata_size); av_assert0(ret >= 0); // extradata size has been checked already, so this should not fail skip_bits_long(&gb, ctx->off + 3); avpriv_copy_pce_data(bs, &gb); @@ -150,15 +151,10 @@ static int latm_write_packet(AVFormatContext *s, AVPacket *pkt) int i, len; uint8_t loas_header[] = "\x56\xe0\x00"; - if (s->streams[0]->codec->codec_id == AV_CODEC_ID_AAC_LATM) + if (s->streams[0]->codecpar->codec_id == AV_CODEC_ID_AAC_LATM) return ff_raw_write_packet(s, pkt); - if (pkt->size > 2 && pkt->data[0] == 0xff && (pkt->data[1] >> 4) == 0xf) { - av_log(s, AV_LOG_ERROR, "ADTS header detected - ADTS will not be incorrectly muxed into LATM\n"); - return AVERROR_INVALIDDATA; - } - - if (!s->streams[0]->codec->extradata) { + if (!s->streams[0]->codecpar->extradata) { if(pkt->size > 2 && pkt->data[0] == 0x56 && (pkt->data[1] >> 4) == 0xe && (AV_RB16(pkt->data + 1) & 0x1FFF) + 3 == pkt->size) return ff_raw_write_packet(s, pkt); @@ -217,6 +213,19 @@ too_large: return AVERROR_INVALIDDATA; } +static int latm_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +{ + int ret = 1; + AVStream *st = s->streams[pkt->stream_index]; + + if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { + if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) + ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL); + } + + return ret; +} + AVOutputFormat ff_latm_muxer = { .name = "latm", .long_name = NULL_IF_CONFIG_SMALL("LOAS/LATM"), @@ -228,5 +237,6 @@ AVOutputFormat ff_latm_muxer = { .write_header = latm_write_header, .write_packet = latm_write_packet, .priv_class = &latm_muxer_class, + .check_bitstream= latm_check_bitstream, .flags = AVFMT_NOTIMESTAMPS, };