# HG changeset patch # User kostya # Date 1258703393 0 # Node ID e5a8a6b9a717dd5d9ec1d550beb1745ea7a06fc4 # Parent b9fdb6b4c2dce28eac51c150d6fbd1c7173d0a8e Implement missing case for decoding samples with large pivot value in APE decoder. This fixes issue 1555 diff -r b9fdb6b4c2dc -r e5a8a6b9a717 apedec.c --- a/apedec.c Fri Nov 20 07:26:17 2009 +0000 +++ b/apedec.c Fri Nov 20 07:49:53 2009 +0000 @@ -408,8 +408,24 @@ 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; }