mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
avcodec/apedec: fix decoding 3800 version with 2000 compression level
This commit is contained in:
parent
8e197a9638
commit
c116dd8468
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user