mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
vc1: Do not read from array if index is invalid.
Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind CC: libav-stable@libav.org Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
2ad405548b
commit
95b192de5d
@ -492,7 +492,7 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
|
|||||||
int nr, dr;
|
int nr, dr;
|
||||||
nr = get_bits(gb, 8);
|
nr = get_bits(gb, 8);
|
||||||
dr = get_bits(gb, 4);
|
dr = get_bits(gb, 4);
|
||||||
if (nr && nr < 8 && dr && dr < 3) {
|
if (nr > 0 && nr < 8 && dr > 0 && dr < 3) {
|
||||||
v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
|
v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
|
||||||
v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
|
v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 },
|
const int ff_vc1_fps_nr[7] = { 24, 25, 30, 50, 60, 48, 72 },
|
||||||
ff_vc1_fps_dr[2] = { 1000, 1001 };
|
ff_vc1_fps_dr[2] = { 1000, 1001 };
|
||||||
const uint8_t ff_vc1_pquant_table[3][32] = {
|
const uint8_t ff_vc1_pquant_table[3][32] = {
|
||||||
/* Implicit quantizer */
|
/* Implicit quantizer */
|
||||||
|
@ -41,7 +41,7 @@ extern const int ff_vc1_ttfrm_to_tt[4];
|
|||||||
extern const uint8_t ff_vc1_mv_pmode_table[2][5];
|
extern const uint8_t ff_vc1_mv_pmode_table[2][5];
|
||||||
extern const uint8_t ff_vc1_mv_pmode_table2[2][4];
|
extern const uint8_t ff_vc1_mv_pmode_table2[2][4];
|
||||||
|
|
||||||
extern const int ff_vc1_fps_nr[5], ff_vc1_fps_dr[2];
|
extern const int ff_vc1_fps_nr[7], ff_vc1_fps_dr[2];
|
||||||
extern const uint8_t ff_vc1_pquant_table[3][32];
|
extern const uint8_t ff_vc1_pquant_table[3][32];
|
||||||
|
|
||||||
/* MBMODE table for interlaced frame P-picture */
|
/* MBMODE table for interlaced frame P-picture */
|
||||||
|
@ -2370,6 +2370,7 @@ static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
|
|||||||
int16_t *dc_val;
|
int16_t *dc_val;
|
||||||
int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
||||||
int q1, q2 = 0;
|
int q1, q2 = 0;
|
||||||
|
int dqscale_index;
|
||||||
|
|
||||||
wrap = s->block_wrap[n];
|
wrap = s->block_wrap[n];
|
||||||
dc_val = s->dc_val[0] + s->block_index[n];
|
dc_val = s->dc_val[0] + s->block_index[n];
|
||||||
@ -2382,15 +2383,18 @@ static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
|
|||||||
a = dc_val[ - wrap];
|
a = dc_val[ - wrap];
|
||||||
/* scale predictors if needed */
|
/* scale predictors if needed */
|
||||||
q1 = s->current_picture.f.qscale_table[mb_pos];
|
q1 = s->current_picture.f.qscale_table[mb_pos];
|
||||||
|
dqscale_index = s->y_dc_scale_table[q1] - 1;
|
||||||
|
if (dqscale_index < 0)
|
||||||
|
return 0;
|
||||||
if (c_avail && (n != 1 && n != 3)) {
|
if (c_avail && (n != 1 && n != 3)) {
|
||||||
q2 = s->current_picture.f.qscale_table[mb_pos - 1];
|
q2 = s->current_picture.f.qscale_table[mb_pos - 1];
|
||||||
if (q2 && q2 != q1)
|
if (q2 && q2 != q1)
|
||||||
c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
|
c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
if (a_avail && (n != 2 && n != 3)) {
|
if (a_avail && (n != 2 && n != 3)) {
|
||||||
q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
|
q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
|
||||||
if (q2 && q2 != q1)
|
if (q2 && q2 != q1)
|
||||||
a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
|
a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
if (a_avail && c_avail && (n != 3)) {
|
if (a_avail && c_avail && (n != 3)) {
|
||||||
int off = mb_pos;
|
int off = mb_pos;
|
||||||
@ -2400,7 +2404,7 @@ static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
|
|||||||
off -= s->mb_stride;
|
off -= s->mb_stride;
|
||||||
q2 = s->current_picture.f.qscale_table[off];
|
q2 = s->current_picture.f.qscale_table[off];
|
||||||
if (q2 && q2 != q1)
|
if (q2 && q2 != q1)
|
||||||
b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
|
b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a_avail && c_avail) {
|
if (a_avail && c_avail) {
|
||||||
@ -2817,6 +2821,8 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
if (dc_pred_dir) { // left
|
if (dc_pred_dir) { // left
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
@ -2859,6 +2865,8 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
if (q2 && q1 != q2) {
|
if (q2 && q1 != q2) {
|
||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
@ -2869,6 +2877,8 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
if (q2 && q1 != q2) {
|
if (q2 && q1 != q2) {
|
||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
@ -3027,6 +3037,8 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
if (dc_pred_dir) { // left
|
if (dc_pred_dir) { // left
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
@ -3069,6 +3081,8 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
if (q2 && q1 != q2) {
|
if (q2 && q1 != q2) {
|
||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
@ -3079,6 +3093,8 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
if (q2 && q1 != q2) {
|
if (q2 && q1 != q2) {
|
||||||
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
||||||
|
if (q1 < 1)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
for (k = 1; k < 8; k++)
|
for (k = 1; k < 8; k++)
|
||||||
ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user