diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 9fd57240af..ed6d0c5028 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -647,18 +647,22 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, break; case CODEC_ID_ADPCM_4XM: for (i = 0; i < avctx->channels; i++) - c->status[i].predictor= (int16_t)bytestream_get_le16(&src); + c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16); for (i = 0; i < avctx->channels; i++) { - c->status[i].step_index= (int16_t)bytestream_get_le16(&src); - c->status[i].step_index = av_clip(c->status[i].step_index, 0, 88); + c->status[i].step_index = sign_extend(bytestream2_get_le16u(&gb), 16); + if (c->status[i].step_index > 88u) { + av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n", + i, c->status[i].step_index); + return AVERROR_INVALIDDATA; + } } for (i = 0; i < avctx->channels; i++) { samples = (short *)c->frame.data[0] + i; cs = &c->status[i]; - for (n = nb_samples >> 1; n > 0; n--, src++) { - uint8_t v = *src; + for (n = nb_samples >> 1; n > 0; n--) { + int v = bytestream2_get_byteu(&gb); *samples = adpcm_ima_expand_nibble(cs, v & 0x0F, 4); samples += avctx->channels; *samples = adpcm_ima_expand_nibble(cs, v >> 4 , 4);