diff options
author | Zane van Iperen <zane@zanevaniperen.com> | 2021-03-23 20:52:16 +1000 |
---|---|---|
committer | Zane van Iperen <zane@zanevaniperen.com> | 2021-03-25 16:34:39 +1000 |
commit | 0b9d7b6f8d5db5204573105270114796d8c8a02f (patch) | |
tree | b0e84ae40b2381f206b07adf4260d8fa70c65928 | |
parent | ebe065c177bc91359d2acd97db28b8f88ae9d152 (diff) | |
download | ffmpeg-0b9d7b6f8d5db5204573105270114796d8c8a02f.tar.gz |
avcodec/adpcm_zork: reset state in flush callback
Signed-off-by: Zane van Iperen <zane@zanevaniperen.com>
(cherry picked from commit 95280cf3e795c18175f7e5ca8bb05ef40abb6c42)
-rw-r--r-- | libavcodec/adpcm.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 5c28b745b9..b145622f4f 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -2077,13 +2077,6 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, } break; case AV_CODEC_ID_ADPCM_ZORK: - if (!c->has_status) { - for (channel = 0; channel < avctx->channels; channel++) { - c->status[channel].predictor = 0; - c->status[channel].step_index = 0; - } - c->has_status = 1; - } for (n = 0; n < nb_samples * avctx->channels; n++) { int v = bytestream2_get_byteu(&gb); *samples++ = adpcm_zork_expand_nibble(&c->status[n % avctx->channels], v); @@ -2121,7 +2114,22 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, static void adpcm_flush(AVCodecContext *avctx) { ADPCMDecodeContext *c = avctx->priv_data; - c->has_status = 0; + + switch(avctx->codec_id) { + case AV_CODEC_ID_ADPCM_ZORK: + for (int channel = 0; channel < avctx->channels; channel++) { + c->status[channel].predictor = 0; + c->status[channel].step_index = 0; + } + break; + + default: + /* Other codecs may want to handle this during decoding. */ + c->has_status = 0; + return; + } + + c->has_status = 1; } |