X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fapedec.c;h=2d1925018eb47bcc1bd5da45a3d3fec8cac0446e;hb=f66ac83c22d8c088832ce8df922b08a0caa11833;hp=1b23e541531147f264f38e73991a7ee1ca82b433;hpb=2c2ee67fd36edaac88914e9d75e00f16a9a7cc17;p=ffmpeg diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 1b23e541531..2d1925018eb 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,25 +602,34 @@ 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] - out[i - 64]; + rice->ksum += out[i] - (unsigned)out[i - 64]; while (rice->ksum < ksummin) { rice->k--; ksummin = rice->k ? ksummin >> 1 : 0; @@ -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; } @@ -1208,14 +1223,14 @@ static void predictor_decode_mono_3950(APEContext *ctx, int count) A = *decoded0; p->buf[YDELAYA] = currentA; - p->buf[YDELAYA - 1] = p->buf[YDELAYA] - p->buf[YDELAYA - 1]; + p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (unsigned)p->buf[YDELAYA - 1]; predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] + p->buf[YDELAYA - 1] * p->coeffsA[0][1] + p->buf[YDELAYA - 2] * p->coeffsA[0][2] + p->buf[YDELAYA - 3] * p->coeffsA[0][3]; - currentA = A + (predictionA >> 10); + currentA = A + (unsigned)(predictionA >> 10); p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]); p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]); @@ -1555,7 +1570,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data, for (ch = 0; ch < s->channels; ch++) { sample24 = (int32_t *)frame->data[ch]; for (i = 0; i < blockstodecode; i++) - *sample24++ = s->decoded[ch][i] << 8; + *sample24++ = s->decoded[ch][i] * 256; } break; }