adpcm: ADPCM IMA SMJPEG stereo decoding

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol 2012-11-07 16:55:26 +00:00
parent 0baec57d09
commit e8a9b1a1a0
1 changed files with 9 additions and 7 deletions

View File

@ -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: