rtc: Use local variable for frequently dereferenced variables Declared local variables for frequently dereferenced structure members. This patch created local variables for the following. - frame_mv - cpi->sf.rt_sf Change-Id: I4345e18db75e781c315e9c1226cffa160311632e
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c index 1f54d38..77d4808 100644 --- a/av1/encoder/nonrd_pickmode.c +++ b/av1/encoder/nonrd_pickmode.c
@@ -321,8 +321,11 @@ int_mv *mv, MV ref_mv, FULLPEL_MV start_mv, bool fullpel_performed_well) { const int frame_lowmotion = cpi->rc.avg_frame_low_motion; + const int reduce_mv_pel_precision_highmotion = + cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion; + // Reduce MV precision for higher int MV value & frame-level motion - if (cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion >= 3) { + if (reduce_mv_pel_precision_highmotion >= 3) { int mv_thresh = 4; const int is_low_resoln = (cpi->common.width * cpi->common.height <= 320 * 240); @@ -332,10 +335,10 @@ if (abs(mv->as_fullmv.row) >= mv_thresh || abs(mv->as_fullmv.col) >= mv_thresh) return HALF_PEL; - } else if (cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion >= 1) { + } else if (reduce_mv_pel_precision_highmotion >= 1) { int mv_thresh; const int th_vals[2][3] = { { 4, 8, 10 }, { 4, 6, 8 } }; - const int th_idx = cpi->sf.rt_sf.reduce_mv_pel_precision_highmotion - 1; + const int th_idx = reduce_mv_pel_precision_highmotion - 1; assert(th_idx >= 0 && th_idx < 2); if (frame_lowmotion > 0 && frame_lowmotion < 40) mv_thresh = 12; @@ -546,6 +549,7 @@ MACROBLOCKD *const xd = &x->e_mbd; MB_MODE_INFO *const mi = xd->mi[0]; AV1_COMMON *cm = &cpi->common; + int_mv *this_ref_frm_newmv = &frame_mv[NEWMV][ref_frame]; if (ref_frame > LAST_FRAME && cpi->oxcf.rc_cfg.mode == AOM_CBR && gf_temporal_ref) { int tmp_sad; @@ -559,13 +563,13 @@ if (tmp_sad > x->pred_mv_sad[LAST_FRAME]) return -1; - frame_mv[NEWMV][ref_frame].as_int = mi->mv[0].as_int; + this_ref_frm_newmv->as_int = mi->mv[0].as_int; int_mv best_mv = mi->mv[0]; best_mv.as_mv.row >>= 3; best_mv.as_mv.col >>= 3; MV ref_mv = av1_get_ref_mv(x, 0).as_mv; - frame_mv[NEWMV][ref_frame].as_mv.row >>= 3; - frame_mv[NEWMV][ref_frame].as_mv.col >>= 3; + this_ref_frm_newmv->as_mv.row >>= 3; + this_ref_frm_newmv->as_mv.col >>= 3; SUBPEL_MOTION_SEARCH_PARAMS ms_params; av1_make_default_subpel_ms_params(&ms_params, cpi, x, bsize, &ref_mv, NULL); @@ -579,17 +583,17 @@ cpi->mv_search_params.find_fractional_mv_step( xd, cm, &ms_params, start_mv, &best_mv.as_mv, &dis, &x->pred_sse[ref_frame], NULL); - frame_mv[NEWMV][ref_frame].as_int = best_mv.as_int; + this_ref_frm_newmv->as_int = best_mv.as_int; // When NEWMV is same as ref_mv from the drl, it is preferred to code the // MV as NEARESTMV or NEARMV. In this case, NEWMV needs to be skipped to // avoid an assert failure at a later stage. The scenario can occur if // NEARESTMV was not evaluated for ALTREF. - if (frame_mv[NEWMV][ref_frame].as_mv.col == ref_mv.col && - frame_mv[NEWMV][ref_frame].as_mv.row == ref_mv.row) + if (this_ref_frm_newmv->as_mv.col == ref_mv.col && + this_ref_frm_newmv->as_mv.row == ref_mv.row) return -1; - *rate_mv = av1_mv_bit_cost(&frame_mv[NEWMV][ref_frame].as_mv, &ref_mv, + *rate_mv = av1_mv_bit_cost(&this_ref_frm_newmv->as_mv, &ref_mv, x->mv_costs->nmv_joint_cost, x->mv_costs->mv_cost_stack, MV_COST_WEIGHT); } else if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col, @@ -2716,6 +2720,7 @@ const bool is_screen_content = cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN; struct macroblockd_plane *const pd = &xd->plane[0]; + const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; const CommonQuantParams *quant_params = &cm->quant_params; @@ -2726,7 +2731,7 @@ cm->seq_params->bit_depth); int64_t inter_mode_thresh = RDCOST(x->rdmult, ref_cost_intra + intra_cost_penalty, 0); - int perform_intra_pred = cpi->sf.rt_sf.check_intra_pred_nonrd; + int perform_intra_pred = rt_sf->check_intra_pred_nonrd; int force_intra_check = 0; // For spatial enhancement layer: turn off intra prediction if the // previous spatial layer as golden ref is not chosen as best reference. @@ -2744,8 +2749,8 @@ // Adjust thresholds to make intra mode likely tested if the other // references (golden, alt) are skipped/not checked. For now always // adjust for svc mode. - if (cpi->ppi->use_svc || (cpi->sf.rt_sf.use_nonrd_altref_frame == 0 && - cpi->sf.rt_sf.nonrd_prune_ref_frame_search > 0)) { + if (cpi->ppi->use_svc || (rt_sf->use_nonrd_altref_frame == 0 && + rt_sf->nonrd_prune_ref_frame_search > 0)) { spatial_var_thresh = 150; motion_thresh = 0; } @@ -2773,15 +2778,15 @@ // For big blocks worth checking intra (since only DC will be checked), // even if best_early_term is set. if (bsize >= BLOCK_32X32) best_early_term = 0; - } else if (cpi->sf.rt_sf.source_metrics_sb_nonrd && + } else if (rt_sf->source_metrics_sb_nonrd && x->content_state_sb.source_sad_nonrd <= kLowSad) { perform_intra_pred = 0; } if (best_rdc->skip_txfm && best_pickmode->best_mode_initial_skip_flag) { - if (cpi->sf.rt_sf.skip_intra_pred == 1 && best_pickmode->best_mode != NEWMV) + if (rt_sf->skip_intra_pred == 1 && best_pickmode->best_mode != NEWMV) perform_intra_pred = 0; - else if (cpi->sf.rt_sf.skip_intra_pred == 2) + else if (rt_sf->skip_intra_pred == 2) perform_intra_pred = 0; } @@ -2832,7 +2837,7 @@ x->color_sensitivity)) continue; - if (is_screen_content && cpi->sf.rt_sf.source_metrics_sb_nonrd) { + if (is_screen_content && rt_sf->source_metrics_sb_nonrd) { // For spatially flat blocks with zero motion only check // DC mode. if (x->content_state_sb.source_sad_nonrd == kZeroSad && @@ -2888,7 +2893,7 @@ this_rdc.rate += mode_cost; this_rdc.rdcost = RDCOST(x->rdmult, this_rdc.rate, this_rdc.dist); - if (is_screen_content && cpi->sf.rt_sf.source_metrics_sb_nonrd) { + if (is_screen_content && rt_sf->source_metrics_sb_nonrd) { // For blocks with low spatial variance and color sad, // favor the intra-modes, only on scene/slide change. if (cpi->rc.high_source_sad && x->source_variance < 800 && @@ -3403,6 +3408,7 @@ const SVC *const svc = &cpi->svc; MACROBLOCKD *const xd = &x->e_mbd; MB_MODE_INFO *const mi = xd->mi[0]; + const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; if (idx >= num_inter_modes) { const int comp_index = idx - num_inter_modes; @@ -3444,7 +3450,7 @@ *ref_frame != LAST_FRAME)) return true; - if (cpi->sf.rt_sf.prune_compoundmode_with_singlemode_var && *comp_pred && + if (rt_sf->prune_compoundmode_with_singlemode_var && *comp_pred && prune_compoundmode_with_singlemode_var( *this_mode, *ref_frame, *ref_frame2, search_state->frame_mv, search_state->mode_checked, search_state->vars, @@ -3488,7 +3494,7 @@ // For the latter condition: the same condition should apply // to newmv if (0, 0), so this latter condition is repeated // below after search_new_mv. - if (cpi->sf.rt_sf.source_metrics_sb_nonrd) { + if (rt_sf->source_metrics_sb_nonrd) { if ((search_state->frame_mv[*this_mode][*ref_frame].as_int != 0 && x->content_state_sb.source_sad_nonrd == kZeroSad) || (search_state->frame_mv[*this_mode][*ref_frame].as_int == 0 && @@ -3508,7 +3514,7 @@ if (skip_mode_by_bsize_and_ref_frame( *this_mode, *ref_frame, bsize, x->nonrd_prune_ref_frame_search, - sse_zeromv_norm, cpi->sf.rt_sf.nonrd_aggressive_skip)) + sse_zeromv_norm, rt_sf->nonrd_aggressive_skip)) return true; if (skip_mode_by_low_temp(*this_mode, *ref_frame, bsize, x->content_state_sb, @@ -3521,7 +3527,7 @@ // end up unable to pick any mode. if (!segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) { // Check for skipping GOLDEN and ALTREF based pred_mv_sad. - if (cpi->sf.rt_sf.nonrd_prune_ref_frame_search > 0 && + if (rt_sf->nonrd_prune_ref_frame_search > 0 && x->pred_mv_sad[*ref_frame] != INT_MAX && *ref_frame != LAST_FRAME) { if ((int64_t)(x->pred_mv_sad[*ref_frame]) > *thresh_sad_pred) return true; } @@ -3539,7 +3545,7 @@ cpi->rc.frames_since_golden, cpi->rd.threshes[segment_id][bsize], x->thresh_freq_fact[bsize], search_state->best_rdc.rdcost, search_state->best_pickmode.best_mode_skip_txfm, - (cpi->sf.rt_sf.nonrd_aggressive_skip ? 1 : 0))) + (rt_sf->nonrd_aggressive_skip ? 1 : 0))) return true; } return false; @@ -3571,9 +3577,11 @@ const InterpFilter default_interp_filter = EIGHTTAP_REGULAR; TxfmSearchInfo *txfm_info = &x->txfm_search_info; const ModeCosts *mode_costs = &x->mode_costs; + const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; MV_REFERENCE_FRAME ref_frame = mi->ref_frame[0]; MV_REFERENCE_FRAME ref_frame2 = mi->ref_frame[1]; + int_mv *const this_mv = &search_state->frame_mv[this_mode][ref_frame]; const int num_8x8_blocks = ctx->num_4x4_blk / 4; unsigned int var = UINT_MAX; int this_early_term = 0; @@ -3606,7 +3614,7 @@ inter_mv_mode++) { if (inter_mv_mode == this_mode) continue; if (!comp_pred && search_state->mode_checked[inter_mv_mode][ref_frame] && - search_state->frame_mv[this_mode][ref_frame].as_int == + this_mv->as_int == search_state->frame_mv[inter_mv_mode][ref_frame].as_int) { skip_this_mv = 1; break; @@ -3618,8 +3626,8 @@ // For screen: for spatially flat blocks with non-zero motion, // skip newmv if the motion vector is (0, 0), and color is not set. if (this_mode == NEWMV && cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && - cpi->svc.spatial_layer_id == 0 && cpi->sf.rt_sf.source_metrics_sb_nonrd) { - if (search_state->frame_mv[this_mode][ref_frame].as_int == 0 && + cpi->svc.spatial_layer_id == 0 && rt_sf->source_metrics_sb_nonrd) { + if (this_mv->as_int == 0 && x->content_state_sb.source_sad_nonrd != kZeroSad && ((x->color_sensitivity[0] == 0 && x->color_sensitivity[1] == 0) || cpi->rc.high_source_sad) && @@ -3628,7 +3636,7 @@ } mi->mode = this_mode; - mi->mv[0].as_int = search_state->frame_mv[this_mode][ref_frame].as_int; + mi->mv[0].as_int = this_mv->as_int; mi->mv[1].as_int = 0; if (comp_pred) mi->mv[1].as_int = search_state->frame_mv[this_mode][ref_frame2].as_int; @@ -3674,7 +3682,7 @@ } #endif // set variance threshold for compound more pruning - if (cpi->sf.rt_sf.prune_compoundmode_with_singlecompound_var && comp_pred && + if (rt_sf->prune_compoundmode_with_singlecompound_var && comp_pred && use_model_yrd_large) { const PREDICTION_MODE single_mode0 = compound_ref0_mode(this_mode); const PREDICTION_MODE single_mode1 = compound_ref1_mode(this_mode); @@ -3715,7 +3723,7 @@ &this_early_term, use_model_yrd_large, &rate_mv, search_state->best_pickmode.best_sse); if (this_mode == NEWMV) { - search_state->frame_mv[this_mode][ref_frame] = mi->mv[0]; + this_mv[0] = mi->mv[0]; } #endif } else { @@ -3765,7 +3773,7 @@ // update variance for single mode if (!comp_pred) { search_state->vars[INTER_OFFSET(this_mode)][ref_frame] = var; - if (search_state->frame_mv[this_mode][ref_frame].as_int == 0) { + if (this_mv->as_int == 0) { search_state->vars[INTER_OFFSET(GLOBALMV)][ref_frame] = var; } } @@ -3775,18 +3783,16 @@ return true; } - if (ref_frame == LAST_FRAME && - search_state->frame_mv[this_mode][ref_frame].as_int == 0) { + if (ref_frame == LAST_FRAME && this_mv->as_int == 0) { *sse_zeromv_norm = (unsigned int)(search_state->this_rdc.sse >> (b_width_log2_lookup[bsize] + b_height_log2_lookup[bsize])); } - if (cpi->sf.rt_sf.sse_early_term_inter_search && + if (rt_sf->sse_early_term_inter_search && early_term_inter_search_with_sse( - cpi->sf.rt_sf.sse_early_term_inter_search, bsize, - search_state->this_rdc.sse, search_state->best_pickmode.best_sse, - this_mode)) { + rt_sf->sse_early_term_inter_search, bsize, search_state->this_rdc.sse, + search_state->best_pickmode.best_sse, this_mode)) { if (reuse_inter_pred) free_pred_buffer(*this_mode_pred); return true; } @@ -3870,8 +3876,7 @@ // If the current mode has zeromv but is not GLOBALMV, compare the rate // cost. If GLOBALMV is cheaper, use GLOBALMV instead. if (this_mode != GLOBALMV && - search_state->frame_mv[this_mode][ref_frame].as_int == - search_state->frame_mv[GLOBALMV][ref_frame].as_int) { + this_mv->as_int == search_state->frame_mv[GLOBALMV][ref_frame].as_int) { if (is_globalmv_better(this_mode, ref_frame, rate_mv, mode_costs, search_state->single_inter_mode_costs, mbmi_ext)) { this_best_mode = GLOBALMV; @@ -3883,8 +3888,7 @@ ->single_inter_mode_costs[INTER_OFFSET(this_best_mode)][ref_frame]; } - if (!comp_pred && search_state->frame_mv[this_mode][ref_frame].as_int == 0 && - var < UINT_MAX) { + if (!comp_pred && this_mv->as_int == 0 && var < UINT_MAX) { search_state->vars[INTER_OFFSET(GLOBALMV)][ref_frame] = var; } @@ -3904,8 +3908,7 @@ cpi->denoiser.denoising_level > kDenLowLow) { av1_denoiser_update_frame_stats(mi, sse_y, this_mode, ctx); // Keep track of zero_last cost. - if (ref_frame == LAST_FRAME && - search_state->frame_mv[this_mode][ref_frame].as_int == 0) + if (ref_frame == LAST_FRAME && this_mv->as_int == 0) *zero_last_cost_orig = search_state->this_rdc.rdcost; } #else @@ -3968,7 +3971,7 @@ if (reuse_inter_pred) free_pred_buffer(*this_mode_pred); } - if (*best_early_term && (idx > 0 || cpi->sf.rt_sf.nonrd_aggressive_skip)) { + if (*best_early_term && (idx > 0 || rt_sf->nonrd_aggressive_skip)) { txfm_info->skip_txfm = 1; return false; } @@ -3991,12 +3994,13 @@ unsigned int sse_zeromv_norm = UINT_MAX; int skip_pred_mv = 0; const int num_inter_modes = NUM_INTER_MODES; - bool check_globalmv = cpi->sf.rt_sf.check_globalmv_on_single_ref; + const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf; + bool check_globalmv = rt_sf->check_globalmv_on_single_ref; PRED_BUFFER tmp_buffer[4]; DECLARE_ALIGNED(16, uint8_t, pred_buf[3 * 128 * 128]); PRED_BUFFER *this_mode_pred = NULL; - const int reuse_inter_pred = cpi->sf.rt_sf.reuse_inter_pred_nonrd && - cm->seq_params->bit_depth == AOM_BITS_8; + const int reuse_inter_pred = + rt_sf->reuse_inter_pred_nonrd && cm->seq_params->bit_depth == AOM_BITS_8; InterModeSearchStateNonrd search_state; av1_zero(search_state.use_ref_frame_mask); @@ -4062,11 +4066,10 @@ #endif ); - if (cpi->sf.rt_sf.use_comp_ref_nonrd && is_comp_ref_allowed(bsize)) { + if (rt_sf->use_comp_ref_nonrd && is_comp_ref_allowed(bsize)) { // Only search compound if bsize \gt BLOCK_16X16. if (bsize > BLOCK_16X16) { - comp_use_zero_zeromv_only = - cpi->sf.rt_sf.check_only_zero_zeromv_on_large_blocks; + comp_use_zero_zeromv_only = rt_sf->check_only_zero_zeromv_on_large_blocks; } else { tot_num_comp_modes = 0; } @@ -4077,7 +4080,7 @@ if (x->pred_mv_sad[LAST_FRAME] != INT_MAX) { thresh_sad_pred = ((int64_t)x->pred_mv_sad[LAST_FRAME]) << 1; // Increase threshold for less aggressive pruning. - if (cpi->sf.rt_sf.nonrd_prune_ref_frame_search == 1) + if (rt_sf->nonrd_prune_ref_frame_search == 1) thresh_sad_pred += (x->pred_mv_sad[LAST_FRAME] >> 2); } @@ -4126,7 +4129,7 @@ for (int idx = 0; idx < num_inter_modes + tot_num_comp_modes; ++idx) { // If we are at the first compound mode, and the single modes already // perform well, then end the search. - if (cpi->sf.rt_sf.skip_compound_based_on_var && idx == num_inter_modes && + if (rt_sf->skip_compound_based_on_var && idx == num_inter_modes && skip_comp_based_on_var(search_state.vars, bsize)) { break; } @@ -4225,8 +4228,8 @@ cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && !skip_idtx_palette && !cpi->oxcf.txfm_cfg.use_inter_dct_only && !x->force_zeromv_skip_for_blk && is_inter_mode(search_state.best_pickmode.best_mode) && - (!cpi->sf.rt_sf.prune_idtx_nonrd || - (cpi->sf.rt_sf.prune_idtx_nonrd && bsize <= BLOCK_32X32 && + (!rt_sf->prune_idtx_nonrd || + (rt_sf->prune_idtx_nonrd && bsize <= BLOCK_32X32 && search_state.best_pickmode.best_mode_skip_txfm != 1 && x->source_variance > 200))) { RD_STATS idtx_rdc;