From f199900874c10db78dad4d1919abde6361fd458a Mon Sep 17 00:00:00 2001 From: kostya Date: Fri, 20 Nov 2009 07:49:53 +0000 Subject: [PATCH] Implement missing case for decoding samples with large pivot value in APE decoder. This fixes issue 1555 git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20560 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b --- libavcodec/apedec.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 1e21e6a40..20ebe9ed6 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -408,8 +408,24 @@ static inline int ape_decode_value(APEContext * ctx, APERice *rice) overflow |= range_decode_bits(ctx, 16); } - base = range_decode_culfreq(ctx, pivot); - range_decode_update(ctx, 1, base); + if (pivot < 0x10000) { + base = range_decode_culfreq(ctx, pivot); + range_decode_update(ctx, 1, base); + } else { + int base_hi = pivot, base_lo; + int bbits = 0; + + while (base_hi & ~0xFFFF) { + base_hi >>= 1; + bbits++; + } + base_hi = range_decode_culfreq(ctx, base_hi + 1); + range_decode_update(ctx, 1, base_hi); + base_lo = range_decode_culfreq(ctx, 1 << bbits); + range_decode_update(ctx, 1, base_lo); + + base = (base_hi << bbits) + base_lo; + } x = base + overflow * pivot; } -- 2.39.2