mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-04-23 07:26:43 +00:00
avcodec/h264_parse: Check picture structure when initializing weight table
Fixes: runtime error: index 49 out of bounds for type 'int [48][2][2]' Fixes: 2159/clusterfuzz-testcase-minimized-5267945972301824 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
e1b0044c23
commit
09096fb687
@ -26,7 +26,8 @@
|
|||||||
|
|
||||||
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
|
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
|
||||||
const int *ref_count, int slice_type_nos,
|
const int *ref_count, int slice_type_nos,
|
||||||
H264PredWeightTable *pwt, void *logctx)
|
H264PredWeightTable *pwt,
|
||||||
|
int picture_structure, void *logctx)
|
||||||
{
|
{
|
||||||
int list, i, j;
|
int list, i, j;
|
||||||
int luma_def, chroma_def;
|
int luma_def, chroma_def;
|
||||||
@ -98,11 +99,13 @@ int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// for MBAFF
|
// for MBAFF
|
||||||
pwt->luma_weight[16 + 2 * i][list][0] = pwt->luma_weight[16 + 2 * i + 1][list][0] = pwt->luma_weight[i][list][0];
|
if (picture_structure == PICT_FRAME) {
|
||||||
pwt->luma_weight[16 + 2 * i][list][1] = pwt->luma_weight[16 + 2 * i + 1][list][1] = pwt->luma_weight[i][list][1];
|
pwt->luma_weight[16 + 2 * i][list][0] = pwt->luma_weight[16 + 2 * i + 1][list][0] = pwt->luma_weight[i][list][0];
|
||||||
for (j = 0; j < 2; j++) {
|
pwt->luma_weight[16 + 2 * i][list][1] = pwt->luma_weight[16 + 2 * i + 1][list][1] = pwt->luma_weight[i][list][1];
|
||||||
pwt->chroma_weight[16 + 2 * i][list][j][0] = pwt->chroma_weight[16 + 2 * i + 1][list][j][0] = pwt->chroma_weight[i][list][j][0];
|
for (j = 0; j < 2; j++) {
|
||||||
pwt->chroma_weight[16 + 2 * i][list][j][1] = pwt->chroma_weight[16 + 2 * i + 1][list][j][1] = pwt->chroma_weight[i][list][j][1];
|
pwt->chroma_weight[16 + 2 * i][list][j][0] = pwt->chroma_weight[16 + 2 * i + 1][list][j][0] = pwt->chroma_weight[i][list][j][0];
|
||||||
|
pwt->chroma_weight[16 + 2 * i][list][j][1] = pwt->chroma_weight[16 + 2 * i + 1][list][j][1] = pwt->chroma_weight[i][list][j][1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (slice_type_nos != AV_PICTURE_TYPE_B)
|
if (slice_type_nos != AV_PICTURE_TYPE_B)
|
||||||
|
@ -55,7 +55,8 @@ typedef struct H264POCContext {
|
|||||||
|
|
||||||
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
|
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps,
|
||||||
const int *ref_count, int slice_type_nos,
|
const int *ref_count, int slice_type_nos,
|
||||||
H264PredWeightTable *pwt, void *logctx);
|
H264PredWeightTable *pwt,
|
||||||
|
int picture_structure, void *logctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the top & left blocks are available if needed & change the
|
* Check if the top & left blocks are available if needed & change the
|
||||||
|
@ -202,7 +202,7 @@ static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb,
|
|||||||
if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) ||
|
if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) ||
|
||||||
(p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B))
|
(p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B))
|
||||||
ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos,
|
ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos,
|
||||||
&pwt, logctx);
|
&pwt, p->picture_structure, logctx);
|
||||||
|
|
||||||
if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag
|
if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag
|
||||||
int i;
|
int i;
|
||||||
|
@ -1801,7 +1801,8 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl,
|
|||||||
(pps->weighted_bipred_idc == 1 &&
|
(pps->weighted_bipred_idc == 1 &&
|
||||||
sl->slice_type_nos == AV_PICTURE_TYPE_B)) {
|
sl->slice_type_nos == AV_PICTURE_TYPE_B)) {
|
||||||
ret = ff_h264_pred_weight_table(&sl->gb, sps, sl->ref_count,
|
ret = ff_h264_pred_weight_table(&sl->gb, sps, sl->ref_count,
|
||||||
sl->slice_type_nos, &sl->pwt, h->avctx);
|
sl->slice_type_nos, &sl->pwt,
|
||||||
|
picture_structure, h->avctx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user