X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Flatmenc.c;h=c919976d49d8cd53027b582366b045539f4e8dcd;hb=2f3a3a7e3270d9c4486fc4d1ed708c2f54338f9c;hp=43ca4821cb1a3c841b25fd7f981a9d1d8243afba;hpb=6a3538bb233e5bdaf6448b1a897e5459fcc0c44f;p=ffmpeg diff --git a/libavformat/latmenc.c b/libavformat/latmenc.c index 43ca4821cb1..c919976d49d 100644 --- a/libavformat/latmenc.c +++ b/libavformat/latmenc.c @@ -146,20 +146,34 @@ static void latm_write_frame_header(AVFormatContext *s, PutBitContext *bs) static int latm_write_packet(AVFormatContext *s, AVPacket *pkt) { LATMContext *ctx = s->priv_data; + AVCodecParameters *par = s->streams[0]->codecpar; AVIOContext *pb = s->pb; PutBitContext bs; int i, len; uint8_t loas_header[] = "\x56\xe0\x00"; - if (s->streams[0]->codecpar->codec_id == AV_CODEC_ID_AAC_LATM) + if (par->codec_id == AV_CODEC_ID_AAC_LATM) return ff_raw_write_packet(s, pkt); - if (!s->streams[0]->codecpar->extradata) { + if (!par->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); - else - return AVERROR_INVALIDDATA; + else { + uint8_t *side_data; + int side_data_size = 0, ret; + + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + &side_data_size); + if (side_data_size) { + if (latm_decode_extradata(ctx, side_data, side_data_size) < 0) + return AVERROR_INVALIDDATA; + ret = ff_alloc_extradata(par, side_data_size); + if (ret < 0) + return ret; + memcpy(par->extradata, side_data, side_data_size); + } + } } if (pkt->size > 0x1fff)