|
|
|
@@ -551,6 +551,11 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, |
|
|
|
buf_size = FFMIN(buf_size, avctx->block_align); |
|
|
|
nb_samples = 1 + (buf_size - 4 * ch) * 2 / ch; |
|
|
|
break; |
|
|
|
case AV_CODEC_ID_ADPCM_IMA_RAD: |
|
|
|
if (avctx->block_align > 0) |
|
|
|
buf_size = FFMIN(buf_size, avctx->block_align); |
|
|
|
nb_samples = (buf_size - 4 * ch) * 2 / ch; |
|
|
|
break; |
|
|
|
case AV_CODEC_ID_ADPCM_IMA_WAV: |
|
|
|
if (avctx->block_align > 0) |
|
|
|
buf_size = FFMIN(buf_size, avctx->block_align); |
|
|
|
@@ -912,6 +917,31 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
*samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F); |
|
|
|
} |
|
|
|
break; |
|
|
|
case AV_CODEC_ID_ADPCM_IMA_RAD: |
|
|
|
for (channel = 0; channel < avctx->channels; channel++) { |
|
|
|
cs = &c->status[channel]; |
|
|
|
cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16); |
|
|
|
cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16); |
|
|
|
if (cs->step_index > 88u){ |
|
|
|
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n", |
|
|
|
channel, cs->step_index); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
} |
|
|
|
for (n = 0; n < nb_samples / 2; n++) { |
|
|
|
int byte[2]; |
|
|
|
|
|
|
|
byte[0] = bytestream2_get_byteu(&gb); |
|
|
|
if (st) |
|
|
|
byte[1] = bytestream2_get_byteu(&gb); |
|
|
|
for(channel = 0; channel < avctx->channels; channel++) { |
|
|
|
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] & 0x0F, 3); |
|
|
|
} |
|
|
|
for(channel = 0; channel < avctx->channels; channel++) { |
|
|
|
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] >> 4 , 3); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case AV_CODEC_ID_ADPCM_IMA_WS: |
|
|
|
if (c->vqa_version == 3) { |
|
|
|
for (channel = 0; channel < avctx->channels; channel++) { |
|
|
|
@@ -1489,6 +1519,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_OKI, sample_fmts_s16, adpcm_ima_oki, "ADPCM IMA Dialogic OKI"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT, sample_fmts_s16p, adpcm_ima_qt, "ADPCM IMA QuickTime"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_RAD, sample_fmts_s16, adpcm_ima_rad, "ADPCM IMA Radical"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG, sample_fmts_s16, adpcm_ima_smjpeg, "ADPCM IMA Loki SDL MJPEG"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV, sample_fmts_s16p, adpcm_ima_wav, "ADPCM IMA WAV"); |
|
|
|
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA Westwood"); |
|
|
|
|