diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-11-07 16:55:26 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2012-11-12 11:46:22 +0000 |
commit | e8a9b1a1a0ed1c09d31c6b3ef0649f643d74b161 (patch) | |
tree | 6a883dd6a568370aad826ee2274d959baeb3fa56 /libavcodec/adpcm.c | |
parent | 0baec57d09ebe7e6e2c701cce5e4346cc9b516fa (diff) | |
download | ffmpeg-e8a9b1a1a0ed1c09d31c6b3ef0649f643d74b161.tar.gz |
adpcm: ADPCM IMA SMJPEG stereo decoding
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r-- | libavcodec/adpcm.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 10da0062ed..0504ab377c 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -473,7 +473,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, case AV_CODEC_ID_ADPCM_4XM: case AV_CODEC_ID_ADPCM_IMA_ISS: header_size = 4 * ch; break; case AV_CODEC_ID_ADPCM_IMA_AMV: header_size = 8; break; - case AV_CODEC_ID_ADPCM_IMA_SMJPEG: header_size = 4; break; + case AV_CODEC_ID_ADPCM_IMA_SMJPEG: header_size = 4 * ch; break; } if (header_size > 0) return (buf_size - header_size) * 2 / ch; @@ -1153,20 +1153,22 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, } break; case AV_CODEC_ID_ADPCM_IMA_SMJPEG: - c->status[0].predictor = sign_extend(bytestream2_get_be16u(&gb), 16); - c->status[0].step_index = bytestream2_get_byteu(&gb); + for (i = 0; i < avctx->channels; i++) { + c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16); + c->status[i].step_index = bytestream2_get_byteu(&gb); bytestream2_skipu(&gb, 1); - if (c->status[0].step_index > 88u) { + if (c->status[i].step_index > 88u) { av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", - c->status[0].step_index); + c->status[i].step_index); return AVERROR_INVALIDDATA; } + } for (n = nb_samples >> (1 - st); n > 0; n--) { int v = bytestream2_get_byteu(&gb); - *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0], v >> 4, 3); - *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0], v & 0xf, 3); + *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4, 3); + *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf, 3); } break; case AV_CODEC_ID_ADPCM_CT: |