Commit c116dd84 authored by Paul B Mahol's avatar Paul B Mahol

avcodec/apedec: fix decoding 3800 version with 2000 compression level

parent 8e197a96
...@@ -586,6 +586,11 @@ static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice) ...@@ -586,6 +586,11 @@ static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice)
return ((x >> 1) ^ ((x & 1) - 1)) + 1; 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, static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
int32_t *out, APERice *rice, int blockstodecode) int32_t *out, APERice *rice, int blockstodecode)
{ {
...@@ -597,22 +602,31 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb, ...@@ -597,22 +602,31 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
out[i] = get_rice_ook(&ctx->gb, 10); out[i] = get_rice_ook(&ctx->gb, 10);
rice->ksum += out[i]; 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) if (rice->k >= 24)
return; return;
for (; i < FFMIN(blockstodecode, 64); i++) { for (; i < FFMIN(blockstodecode, 64); i++) {
out[i] = get_rice_ook(&ctx->gb, rice->k); out[i] = get_rice_ook(&ctx->gb, rice->k);
rice->ksum += out[i]; 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) if (rice->k >= 24)
return; return;
} }
if (blockstodecode <= 64)
goto end;
rice->k = get_k(rice->ksum >> 7);
ksummax = 1 << rice->k + 7; ksummax = 1 << rice->k + 7;
ksummin = rice->k ? (1 << rice->k + 6) : 0; ksummin = rice->k ? (1 << rice->k + 6) : 0;
for (; i < blockstodecode; i++) { for (; i < blockstodecode; i++) {
if (get_bits_left(&ctx->gb) < 1) { if (get_bits_left(&ctx->gb) < 1) {
ctx->error = 1; ctx->error = 1;
return ; return;
} }
out[i] = get_rice_ook(&ctx->gb, rice->k); out[i] = get_rice_ook(&ctx->gb, rice->k);
rice->ksum += out[i] - (unsigned)out[i - 64]; rice->ksum += out[i] - (unsigned)out[i - 64];
...@@ -630,6 +644,7 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb, ...@@ -630,6 +644,7 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
} }
} }
end:
for (i = 0; i < blockstodecode; i++) for (i = 0; i < blockstodecode; i++)
out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1; out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment