aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZane van Iperen <zane@zanevaniperen.com>2021-03-23 20:52:16 +1000
committerZane van Iperen <zane@zanevaniperen.com>2021-03-25 16:34:39 +1000
commit0b9d7b6f8d5db5204573105270114796d8c8a02f (patch)
treeb0e84ae40b2381f206b07adf4260d8fa70c65928
parentebe065c177bc91359d2acd97db28b8f88ae9d152 (diff)
downloadffmpeg-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.c24
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;
}