From 18cfcc64581f0b279b47168675f1919a7d4e0df8 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Thu, 19 Jan 2017 20:42:14 +0100 Subject: [PATCH] avcodec/wmaprodec: add xma_flush for seeking in XMA2 Signed-off-by: Paul B Mahol --- libavcodec/wmaprodec.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index d8e570cece..4d530264df 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -1861,13 +1861,8 @@ static av_cold int xma_decode_end(AVCodecContext *avctx) return 0; } -/** - *@brief Clear decoder buffers (for seeking). - *@param avctx codec context - */ -static void flush(AVCodecContext *avctx) +static void flush(WMAProDecodeCtx *s) { - WMAProDecodeCtx *s = avctx->priv_data; int i; /** reset output buffer as a part of it is used during the windowing of a new frame */ @@ -1875,6 +1870,30 @@ static void flush(AVCodecContext *avctx) memset(s->channel[i].out, 0, s->samples_per_frame * sizeof(*s->channel[i].out)); s->packet_loss = 1; + s->skip_packets = 0; +} + + +/** + *@brief Clear decoder buffers (for seeking). + *@param avctx codec context + */ +static void wmapro_flush(AVCodecContext *avctx) +{ + WMAProDecodeCtx *s = avctx->priv_data; + + flush(s); +} + +static void xma_flush(AVCodecContext *avctx) +{ + XMADecodeCtx *s = avctx->priv_data; + int i; + for (i = 0; i < (avctx->channels + 1) / 2; i++) + flush(&s->xma[i]); + + memset(s->offset, 0, sizeof(s->offset)); + s->current_stream = 0; } @@ -1891,7 +1910,7 @@ AVCodec ff_wmapro_decoder = { .close = wmapro_decode_end, .decode = wmapro_decode_packet, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, - .flush = flush, + .flush = wmapro_flush, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, }; @@ -1919,6 +1938,7 @@ AVCodec ff_xma2_decoder = { .init = xma_decode_init, .close = xma_decode_end, .decode = xma_decode_packet, + .flush = xma_flush, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE },