+
+ /* Just nuke the entire state and re-init. */
+ memset(c, 0, sizeof(ADPCMDecodeContext));
+
+ switch(avctx->codec_id) {
+ case AV_CODEC_ID_ADPCM_CT:
+ c->status[0].step = c->status[1].step = 511;
+ break;
+
+ case AV_CODEC_ID_ADPCM_IMA_APC:
+ if (avctx->extradata && avctx->extradata_size >= 8) {
+ c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata ), 18);
+ c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
+ }
+ break;
+
+ case AV_CODEC_ID_ADPCM_IMA_APM:
+ if (avctx->extradata) {
+ if (avctx->extradata_size >= 28) {
+ c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 16), 18);
+ c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 20), 0, 88);
+ c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
+ c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 8), 0, 88);
+ } else if (avctx->extradata_size >= 16) {
+ c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 0), 18);
+ c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 4), 0, 88);
+ c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 8), 18);
+ c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 12), 0, 88);
+ }
+ }
+ break;
+
+ case AV_CODEC_ID_ADPCM_IMA_WS:
+ if (avctx->extradata && avctx->extradata_size >= 2)
+ c->vqa_version = AV_RL16(avctx->extradata);
+ break;
+ default:
+ /* Other codecs may want to handle this during decoding. */
+ c->has_status = 0;
+ return;
+ }
+
+ c->has_status = 1;