if (c_avail && (n != 1 && n != 3)) {
q2 = FFABS(s->current_picture.qscale_table[mb_pos - 1]);
if (q2 && q2 != q1)
- c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+ c = (int)((unsigned)c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
}
if (a_avail && (n != 2 && n != 3)) {
q2 = FFABS(s->current_picture.qscale_table[mb_pos - s->mb_stride]);
if (q2 && q2 != q1)
- a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+ a = (int)((unsigned)a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
}
if (a_avail && c_avail && (n != 3)) {
int off = mb_pos;
off -= s->mb_stride;
q2 = FFABS(s->current_picture.qscale_table[off]);
if (q2 && q2 != q1)
- b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+ b = (int)((unsigned)b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
}
if (c_avail && (!a_avail || abs(a - b) <= abs(b - c))) {
* @param codingset set of VLC to decode data
* @see 8.1.3.4
*/
-static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
+static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
int *value, int codingset)
{
GetBitContext *gb = &v->s.gb;
int index, run, level, lst, sign;
index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
+ if (index < 0)
+ return index;
if (index != ff_vc1_ac_sizes[codingset] - 1) {
run = vc1_index_decode_table[codingset][index][0];
level = vc1_index_decode_table[codingset][index][1];
int escape = decode210(gb);
if (escape != 2) {
index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
+ if (index < 0)
+ return AVERROR_INVALIDDATA;
run = vc1_index_decode_table[codingset][index][0];
level = vc1_index_decode_table[codingset][index][1];
lst = index >= vc1_last_decode_table[codingset];
*last = lst;
*skip = run;
*value = (level ^ -sign) + sign;
+
+ return 0;
}
/** Decode intra block in intra frames - should be faster than decode_intra_block
zz_table = v->zz_8x8[1];
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 63)
break;
}
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 63)
break;
int k;
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 63)
break;
i = 0;
last = 0;
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 63)
break;
i = 0;
off = (j & 1) * 4 + (j & 2) * 16;
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 15)
break;
i = 0;
off = j * 32;
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 31)
break;
i = 0;
off = j * 4;
while (!last) {
- vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+ if (ret < 0)
+ return ret;
i += skip;
if (i > 31)
break;
v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
if (v->rangeredfrm)
for (j = 0; j < 64; j++)
- v->block[v->cur_blk_idx][block_map[i]][j] <<= 1;
+ v->block[v->cur_blk_idx][block_map[i]][j] *= 2;
block_cbp |= 0xF << (i << 2);
block_intra |= 1 << i;
} else if (val) {
if (v->rangeredfrm)
for (k = 0; k < 6; k++)
for (j = 0; j < 64; j++)
- v->block[v->cur_blk_idx][block_map[k]][j] <<= 1;
+ v->block[v->cur_blk_idx][block_map[k]][j] *= 2;
vc1_put_blocks_clamped(v, 1);
} else {
if (v->rangeredfrm)
for (k = 0; k < 6; k++)
for (j = 0; j < 64; j++)
- v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) << 1;
+ v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) * 2;
vc1_put_blocks_clamped(v, 0);
}