diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-12-18 23:10:30 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-12-18 23:49:34 +0400 |
commit | bdd62a615a74ba7d29b528263462937da132c62c (patch) | |
tree | 929b34c074e94aaeeb6fd460c1bded1e54c0ed2e | |
parent | 3bf1d787b58cf268f3c055d6f2509fd75258450b (diff) |
adxdec: Do not require extradata.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/adxdec.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/libavcodec/adxdec.c b/libavcodec/adxdec.c index f049def626..20f2606a90 100644 --- a/libavcodec/adxdec.c +++ b/libavcodec/adxdec.c @@ -38,16 +38,15 @@ static av_cold int adx_decode_init(AVCodecContext *avctx) ADXContext *c = avctx->priv_data; int ret, header_size; - if (avctx->extradata_size < 24) - return AVERROR_INVALIDDATA; - - if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata, - avctx->extradata_size, &header_size, - c->coeff)) < 0) { - av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); - return AVERROR_INVALIDDATA; + if (avctx->extradata_size >= 24) { + if ((ret = avpriv_adx_decode_header(avctx, avctx->extradata, + avctx->extradata_size, &header_size, + c->coeff)) < 0) { + av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); + return AVERROR_INVALIDDATA; + } + c->channels = avctx->channels; } - c->channels = avctx->channels; avctx->sample_fmt = AV_SAMPLE_FMT_S16; @@ -107,6 +106,21 @@ static int adx_decode_frame(AVCodecContext *avctx, void *data, return buf_size; } + if(AV_RB16(buf) == 0x8000){ + int header_size; + if ((ret = avpriv_adx_decode_header(avctx, buf, + buf_size, &header_size, + c->coeff)) < 0) { + av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n"); + return AVERROR_INVALIDDATA; + } + c->channels = avctx->channels; + if(buf_size < header_size) + return AVERROR_INVALIDDATA; + buf += header_size; + buf_size -= header_size; + } + /* calculate number of blocks in the packet */ num_blocks = buf_size / (BLOCK_SIZE * c->channels); |