diff options
author | Paul B Mahol <onemda@gmail.com> | 2020-02-22 17:20:27 +0300 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-02-22 17:27:05 +0300 |
commit | c116dd84682a2b2fb2880a75a8dbf6367f671b17 (patch) | |
tree | c3404f0931a11117c7d160a254bfb81faf9b70e7 /libavcodec/apedec.c | |
parent | 8e197a96388a0891b05e60dd79ef3817f7662cba (diff) |
avcodec/apedec: fix decoding 3800 version with 2000 compression level
Diffstat (limited to 'libavcodec/apedec.c')
-rw-r--r-- | libavcodec/apedec.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index d643d6790e..2d1925018e 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -586,6 +586,11 @@ static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice) return ((x >> 1) ^ ((x & 1) - 1)) + 1; } +static int get_k(int ksum) +{ + return av_log2(ksum) + !!ksum; +} + static void decode_array_0000(APEContext *ctx, GetBitContext *gb, int32_t *out, APERice *rice, int blockstodecode) { @@ -597,22 +602,31 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb, out[i] = get_rice_ook(&ctx->gb, 10); rice->ksum += out[i]; } - rice->k = av_log2(rice->ksum / 10) + 1; + + if (blockstodecode <= 5) + goto end; + + rice->k = get_k(rice->ksum / 10); if (rice->k >= 24) return; for (; i < FFMIN(blockstodecode, 64); i++) { out[i] = get_rice_ook(&ctx->gb, rice->k); rice->ksum += out[i]; - rice->k = av_log2(rice->ksum / ((i + 1) * 2)) + 1; + rice->k = get_k(rice->ksum / ((i + 1) * 2)); if (rice->k >= 24) return; } + + if (blockstodecode <= 64) + goto end; + + rice->k = get_k(rice->ksum >> 7); ksummax = 1 << rice->k + 7; ksummin = rice->k ? (1 << rice->k + 6) : 0; for (; i < blockstodecode; i++) { if (get_bits_left(&ctx->gb) < 1) { ctx->error = 1; - return ; + return; } out[i] = get_rice_ook(&ctx->gb, rice->k); rice->ksum += out[i] - (unsigned)out[i - 64]; @@ -630,6 +644,7 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb, } } +end: for (i = 0; i < blockstodecode; i++) out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1; } |