Validate tpl frame index before using it Check if the tpl frame index is < MAX_TPL_FRAME_IDX before using it as the index for the cpi->ppi->tpl_data.tpl_frame[] array. BUG=aomedia:3054 Change-Id: Ie5593e0c0baad4d655eb169a0e3fb1049629ce7f (cherry picked from commit d43470b76bc2dceb43c0dbd00dddfffb72df77bf)
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 35305ed..e431448 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -331,14 +331,14 @@ MACROBLOCK *x = &td->mb; const int frame_idx = cpi->gf_frame_index; TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[frame_idx]; const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2; av1_zero(x->tpl_keep_ref_frame); + if (frame_idx >= MAX_TPL_FRAME_IDX) return; + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[frame_idx]; if (tpl_frame->is_valid == 0) return; if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return; - if (frame_idx >= MAX_TPL_FRAME_IDX) return; if (cpi->oxcf.q_cfg.aq_mode != NO_AQ) return; const int is_overlay = cpi->gf_group.update_type[frame_idx] == OVERLAY_UPDATE;
diff --git a/av1/encoder/encodeframe_utils.c b/av1/encoder/encodeframe_utils.c index 27f306f..c9b1afb 100644 --- a/av1/encoder/encodeframe_utils.c +++ b/av1/encoder/encodeframe_utils.c
@@ -90,12 +90,12 @@ assert(IMPLIES(cpi->gf_group.size > 0, cpi->gf_frame_index < cpi->gf_group.size)); const int tpl_idx = cpi->gf_frame_index; - const TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; const int deltaq_rdmult = set_deltaq_rdmult(cpi, x); + if (tpl_idx >= MAX_TPL_FRAME_IDX) return deltaq_rdmult; + const TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; if (tpl_frame->is_valid == 0) return deltaq_rdmult; if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return deltaq_rdmult; - if (tpl_idx >= MAX_TPL_FRAME_IDX) return deltaq_rdmult; if (cpi->oxcf.q_cfg.aq_mode != NO_AQ) return deltaq_rdmult; const int mi_col_sr = @@ -688,21 +688,21 @@ cpi->gf_frame_index < cpi->gf_group.size)); const int tpl_idx = cpi->gf_frame_index; TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2; - int tpl_stride = tpl_frame->stride; int64_t intra_cost = 0; int64_t mc_dep_cost = 0; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; + if (tpl_idx >= MAX_TPL_FRAME_IDX) return orig_rdmult; + + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; if (tpl_frame->is_valid == 0) return orig_rdmult; if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return orig_rdmult; - if (cpi->gf_frame_index >= MAX_TPL_FRAME_IDX) return orig_rdmult; - int mi_count = 0; const int mi_col_sr = coded_to_superres_mi(mi_col, cm->superres_scale_denominator); @@ -825,15 +825,16 @@ AV1_COMMON *const cm = &cpi->common; const int gf_group_index = cpi->gf_frame_index; TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[gf_group_index]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; - int tpl_stride = tpl_frame->stride; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; - if (tpl_frame->is_valid == 0) return; if (gf_group_index >= MAX_TPL_FRAME_IDX) return; + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[gf_group_index]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; + if (tpl_frame->is_valid == 0) return; + int mi_count = 0; int count = 0; const int mi_col_sr = @@ -896,22 +897,22 @@ cpi->gf_frame_index < cpi->gf_group.size)); const int tpl_idx = cpi->gf_frame_index; TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2; - int tpl_stride = tpl_frame->stride; int64_t intra_cost = 0; int64_t mc_dep_cost = 0; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; const int base_qindex = cm->quant_params.base_qindex; + if (tpl_idx >= MAX_TPL_FRAME_IDX) return base_qindex; + + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; if (tpl_frame->is_valid == 0) return base_qindex; if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return base_qindex; - if (cpi->gf_frame_index >= MAX_TPL_FRAME_IDX) return base_qindex; - int mi_count = 0; const int mi_col_sr = coded_to_superres_mi(mi_col, cm->superres_scale_denominator);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index a695335..f462b65 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -2178,8 +2178,11 @@ cpi->gf_frame_index < cpi->gf_group.size)); const int tpl_idx = cpi->gf_frame_index; TplParams *const tpl_data = &cpi->tpl_data; + if (tpl_idx >= MAX_TPL_FRAME_IDX) { + return; + } const TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; - if (tpl_idx >= MAX_TPL_FRAME_IDX || !tpl_frame->is_valid) { + if (!tpl_frame->is_valid) { return; } @@ -2591,10 +2594,10 @@ const PREDICTION_MODE this_mode = mbmi->mode; const int tpl_idx = cpi->gf_frame_index; - TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; + TplParams *const tpl_data = &cpi->tpl_data; const int prune_modes_based_on_tpl = cpi->sf.inter_sf.prune_inter_modes_based_on_tpl && - tpl_idx < MAX_TPL_FRAME_IDX && tpl_frame->is_valid; + tpl_idx < MAX_TPL_FRAME_IDX && tpl_data->tpl_frame[tpl_idx].is_valid; int i; // Reference frames for this mode const int refs[2] = { mbmi->ref_frame[0],
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c index 2643665..2cf5a18 100644 --- a/av1/encoder/tpl_model.c +++ b/av1/encoder/tpl_model.c
@@ -1661,11 +1661,11 @@ assert(IMPLIES(cpi->gf_group.size > 0, cpi->gf_frame_index < cpi->gf_group.size)); const int tpl_idx = cpi->gf_frame_index; - TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; + if (tpl_idx >= MAX_TPL_FRAME_IDX) return; + TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; if (tpl_frame->is_valid == 0) return; if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return; - if (tpl_idx >= MAX_TPL_FRAME_IDX) return; if (cpi->oxcf.q_cfg.aq_mode != NO_AQ) return; const int mi_col_sr =