static int vlc_decode_block(MimicContext *ctx, int num_coeffs, int qscale) { int16_t *block = ctx->dct_block; unsigned int pos; ctx->bdsp.clear_block(block); block[0] = get_bits(&ctx->gb, 8) << 3; for (pos = 1; pos < num_coeffs; pos++) { uint32_t vlc, num_bits; int value; int coeff; vlc = get_vlc2(&ctx->gb, ctx->vlc.table, ctx->vlc.bits, 3); if (!vlc) /* end-of-block code */ return 0; if (vlc == -1) return AVERROR_INVALIDDATA; /* pos_add and num_bits are coded in the vlc code */ pos += vlc & 15; // pos_add num_bits = vlc >> 4; // num_bits if (pos >= 64) return AVERROR_INVALIDDATA; value = get_bits(&ctx->gb, num_bits); /* FFmpeg's IDCT behaves somewhat different from the original code, so * a factor of 4 was added to the input */ coeff = vlcdec_lookup[num_bits][value]; if (pos < 3) coeff *= 16; else /* TODO Use >> 10 instead of / 1001 */ coeff = (coeff * qscale) / 1001; block[ctx->scantable.permutated[pos]] = coeff; } return 0; }