aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/aacdec.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2011-12-15 16:53:19 +0200
committerMartin Storsjö <martin@martin.st>2011-12-21 22:52:39 +0200
commit132846b0c86303ec99a1c9288ef74384a7ebd669 (patch)
treeb47588e980f5b11640b1d82d45a444bd2160cf26 /libavcodec/aacdec.c
parent251f320f7deeae22d25c013fb29d162517dd3c91 (diff)
downloadffmpeg-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.c19
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);