From 39fb3f18c52dd2be3a4c13fe6cce97bfb87f43c8 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 12 Jan 2016 23:32:58 +0100 Subject: [PATCH] avcodec/diracdec: Handle the 0 vlc case at the top of coeff_unpack_golomb() decoding changes from 17 to 20 fps Reviewed-by; Rostislav Pehlivanov Signed-off-by: Michael Niedermayer --- libavcodec/diracdec.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index bbe6d87bc9..942376bb3c 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -491,6 +491,12 @@ static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffse UPDATE_CACHE(re, gb); buf = GET_CACHE(re, gb); + if (buf & 0x80000000) { + LAST_SKIP_BITS(re,gb,1); + CLOSE_READER(re, gb); + return 0; + } + if (buf & 0xAA800000) { buf >>= 32 - 8; SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]); @@ -516,12 +522,12 @@ static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffse coeff = ret - 1; } - if (coeff) { - coeff = (coeff * qfactor + qoffset) >> 2; - sign = SHOW_SBITS(re, gb, 1); - LAST_SKIP_BITS(re, gb, 1); - coeff = (coeff ^ sign) - sign; - } + + coeff = (coeff * qfactor + qoffset) >> 2; + sign = SHOW_SBITS(re, gb, 1); + LAST_SKIP_BITS(re, gb, 1); + coeff = (coeff ^ sign) - sign; + CLOSE_READER(re, gb); return coeff; }