x = (overflow << rice->k) + get_bits(gb, rice->k);
} else {
av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %"PRIu32"\n", rice->k);
+ ctx->error = 1;
return AVERROR_INVALIDDATA;
}
rice->ksum += x - (rice->ksum + 8 >> 4);
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)
{
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;
}
}
+end:
for (i = 0; i < blockstodecode; i++)
out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1;
}
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]);
p->buf = p->historybuffer;
}
- p->filterA[0] = currentA + ((int)(p->filterA[0] * 31U) >> 5);
+ p->filterA[0] = currentA + (unsigned)((int)(p->filterA[0] * 31U) >> 5);
*(decoded0++) = p->filterA[0];
}
f->adaptcoeffs - order,
order, APESIGN(*data));
res = (int)(res + (1U << (fracbits - 1))) >> fracbits;
- res += *data;
+ res += (unsigned)*data;
*data++ = res;
/* Update the output history */
else
*f->adaptcoeffs = 0;
- f->avg += (absres - f->avg) / 16;
+ f->avg += (int)(absres - (unsigned)f->avg) / 16;
f->adaptcoeffs[-1] >>= 1;
f->adaptcoeffs[-2] >>= 1;
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;
}