diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index ff8cbfb0b4..2cf82abc19 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -252,6 +252,16 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx) return 0; } +static av_cold void ac3_decode_flush(AVCodecContext *avctx) +{ + AC3DecodeContext *s = avctx->priv_data; + + memset(&s->frame_type, 0, sizeof(*s) - offsetof(AC3DecodeContext, frame_type)); + + AC3_RENAME(ff_kbd_window_init)(s->window, 5.0, 256); + av_lfg_init(&s->dith_state, 0); +} + /** * Parse the 'sync info' and 'bit stream info' from the AC-3 bitstream. * GetBitContext within AC3DecodeContext must point to diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h index 0a6bba7c63..4042a99b80 100644 --- a/libavcodec/ac3dec.h +++ b/libavcodec/ac3dec.h @@ -96,6 +96,7 @@ typedef struct AC3DecodeContext { SHORTFLOAT *downmix_coeffs[2]; ///< stereo downmix coefficients // Start of flushable fields. +// frame_type must be the flushable field, or the offset changed in ac3_decode_flush(). ///@name Bit stream information ///@{ diff --git a/libavcodec/ac3dec_fixed.c b/libavcodec/ac3dec_fixed.c index e0db9b2260..e284140e74 100644 --- a/libavcodec/ac3dec_fixed.c +++ b/libavcodec/ac3dec_fixed.c @@ -181,6 +181,7 @@ const FFCodec ff_ac3_fixed_decoder = { .p.priv_class = &ac3_decoder_class, .priv_data_size = sizeof (AC3DecodeContext), .init = ac3_decode_init, + .flush = ac3_decode_flush, .close = ac3_decode_end, FF_CODEC_DECODE_CB(ac3_decode_frame), .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | diff --git a/libavcodec/ac3dec_float.c b/libavcodec/ac3dec_float.c index 53d9d472c4..31f5590729 100644 --- a/libavcodec/ac3dec_float.c +++ b/libavcodec/ac3dec_float.c @@ -70,6 +70,7 @@ const FFCodec ff_ac3_decoder = { .p.id = AV_CODEC_ID_AC3, .priv_data_size = sizeof (AC3DecodeContext), .init = ac3_decode_init, + .flush = ac3_decode_flush, .close = ac3_decode_end, FF_CODEC_DECODE_CB(ac3_decode_frame), .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | @@ -88,6 +89,7 @@ const FFCodec ff_eac3_decoder = { .p.id = AV_CODEC_ID_EAC3, .priv_data_size = sizeof (AC3DecodeContext), .init = ac3_decode_init, + .flush = ac3_decode_flush, .close = ac3_decode_end, FF_CODEC_DECODE_CB(ac3_decode_frame), .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |