From 9bc4e21a9b7900f95d056ae0d450c104a9e80108 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Fri, 2 Sep 2011 11:37:39 +0200 Subject: wavpack: use context reset in appropriate places This fixes improper flushing in the cases when the same frame is decoded in several iterations (for being too large to fit into output buffer) and flush is called mid-decoding and it also resets context in case of decoding errors. Signed-off-by: Anton Khirnov --- libavcodec/wavpack.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'libavcodec/wavpack.c') diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 62f68804b3..ea5dfbae16 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -470,6 +470,7 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) static void wv_reset_saved_context(WavpackFrameContext *s) { s->pos = 0; + s->samples_left = 0; s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF; } @@ -582,6 +583,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo s->samples_left -= count; if(!s->samples_left){ + wv_reset_saved_context(s); if(crc != s->CRC){ av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); return -1; @@ -590,7 +592,6 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); return -1; } - wv_reset_saved_context(s); }else{ s->pos = pos; s->sc.crc = crc; @@ -660,6 +661,7 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void s->samples_left -= count; if(!s->samples_left){ + wv_reset_saved_context(s); if(crc != s->CRC){ av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); return -1; @@ -668,7 +670,6 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); return -1; } - wv_reset_saved_context(s); }else{ s->pos = pos; s->sc.crc = crc; @@ -1195,7 +1196,7 @@ static void wavpack_decode_flush(AVCodecContext *avctx) int i; for (i = 0; i < s->fdec_num; i++) - s->fdec[i]->samples_left = 0; + wv_reset_saved_context(s->fdec[i]); } AVCodec ff_wavpack_decoder = { -- cgit v1.2.3 From bcd4aa8bec19a17bd633e3db13357784c05b6ca5 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Mon, 5 Sep 2011 12:37:50 +0200 Subject: wavpack: fix wrong return value in wavpack_decode_block() This function should return number of samples decoded, not number of bytes decoded. Spotted by Uoti Urpala. Signed-off-by: Luca Barbato --- libavcodec/wavpack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libavcodec/wavpack.c') diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index ea5dfbae16..22fab3804c 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -780,7 +780,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, s->samples = AV_RL32(buf); buf += 4; if(!s->samples){ *data_size = 0; - return buf_size; + return 0; } }else{ s->samples = wc->samples; -- cgit v1.2.3