aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/wmaprodec.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2017-01-19 20:42:14 +0100
committerPaul B Mahol <onemda@gmail.com>2017-01-20 13:58:41 +0100
commit18cfcc64581f0b279b47168675f1919a7d4e0df8 (patch)
tree967b58ee8c47e3b432c876cf3c3928d66bb2fa5b /libavcodec/wmaprodec.c
parent5d2609929d481c7c137370b64d5d495cd024ee61 (diff)
downloadffmpeg-18cfcc64581f0b279b47168675f1919a7d4e0df8.tar.gz
avcodec/wmaprodec: add xma_flush for seeking in XMA2
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/wmaprodec.c')
-rw-r--r--libavcodec/wmaprodec.c34
1 files 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 },