diff options
author | Martin Storsjö <martin@martin.st> | 2011-12-15 16:53:19 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2011-12-21 22:52:39 +0200 |
commit | 132846b0c86303ec99a1c9288ef74384a7ebd669 (patch) | |
tree | b47588e980f5b11640b1d82d45a444bd2160cf26 /libavcodec/aacdec.c | |
parent | 251f320f7deeae22d25c013fb29d162517dd3c91 (diff) | |
download | ffmpeg-132846b0c86303ec99a1c9288ef74384a7ebd669.tar.gz |
aacdec: Handle new extradata passed as side data
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavcodec/aacdec.c')
-rw-r--r-- | libavcodec/aacdec.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 4d002edf6a..4d3f1ff0d0 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2247,12 +2247,31 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data, static int aac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { + AACContext *ac = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; GetBitContext gb; int buf_consumed; int buf_offset; int err; + int new_extradata_size; + const uint8_t *new_extradata = av_packet_get_side_data(avpkt, + AV_PKT_DATA_NEW_EXTRADATA, + &new_extradata_size); + + if (new_extradata) { + av_free(avctx->extradata); + avctx->extradata = av_mallocz(new_extradata_size + + FF_INPUT_BUFFER_PADDING_SIZE); + if (!avctx->extradata) + return AVERROR(ENOMEM); + avctx->extradata_size = new_extradata_size; + memcpy(avctx->extradata, new_extradata, new_extradata_size); + if (decode_audio_specific_config(ac, ac->avctx, &ac->m4ac, + avctx->extradata, + avctx->extradata_size*8, 1) < 0) + return AVERROR_INVALIDDATA; + } init_get_bits(&gb, buf, buf_size * 8); |