From 51d529a5786ef5654ac318c14971eb6857c420e3 Mon Sep 17 00:00:00 2001 From: Yaowu Xu Date: Mon, 16 Mar 2015 09:42:33 -0700 Subject: [PATCH] vp9_pick_inter_mode(): minor optimizations 1. remove duplicate initialization to mbmi->interp_filter. 2. move mv clamping into ref_frame loop instead of mode checking loop. 3. move the check if last frame is same as golden frame earlier to avoid initialization of Golden reference related variables. Change-Id: Idf2d05e19e94a24f69cc289687869fc71d2ff289 --- vp9/encoder/vp9_pickmode.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 88003ec17..5bc9fcad7 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -636,6 +636,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, struct macroblockd_plane *const pd = &xd->plane[0]; PREDICTION_MODE best_mode = ZEROMV; MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; + MV_REFERENCE_FRAME usable_ref_frame; TX_SIZE best_tx_size = TX_SIZES; INTERP_FILTER best_pred_filter = EIGHTTAP; int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; @@ -718,14 +719,17 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, mbmi->ref_frame[1] = NONE; mbmi->tx_size = MIN(max_txsize_lookup[bsize], tx_mode_to_biggest_tx_size[cm->tx_mode]); - mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? - EIGHTTAP : cm->interp_filter; #if CONFIG_VP9_TEMPORAL_DENOISING vp9_denoiser_reset_frame_stats(ctx); #endif - - for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { + if (cpi->rc.frames_since_golden == 0) { + ref_frame_skip_mask |= (1 << GOLDEN_FRAME); + usable_ref_frame = LAST_FRAME; + } else { + usable_ref_frame = GOLDEN_FRAME; + } + for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) { const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); x->pred_mv_sad[ref_frame] = INT_MAX; @@ -751,6 +755,8 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, &frame_mv[NEARESTMV][ref_frame], &frame_mv[NEARMV][ref_frame]); + clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); + clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); if (!vp9_is_scaled(sf) && bsize >= BLOCK_8X8) vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride, @@ -760,28 +766,25 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } } - if (cpi->rc.frames_since_golden == 0) - ref_frame_skip_mask |= (1 << GOLDEN_FRAME); - for (idx = 0; idx < RT_INTER_MODES; ++idx) { int rate_mv = 0; int mode_rd_thresh; int mode_index; int i; PREDICTION_MODE this_mode = ref_mode_set[idx].pred_mode; + if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) + continue; ref_frame = ref_mode_set[idx].ref_frame; - mode_index = mode_idx[ref_frame][INTER_OFFSET(this_mode)]; - - i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME; - if (!(cpi->ref_frame_flags & flag_list[ref_frame])) continue; + if (const_motion[ref_frame] && this_mode == NEARMV) + continue; + i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME; if (cpi->ref_frame_flags & flag_list[i]) if (x->pred_mv_sad[ref_frame] > (x->pred_mv_sad[i] << 1)) ref_frame_skip_mask |= (1 << ref_frame); - if (ref_frame_skip_mask & (1 << ref_frame)) continue; @@ -789,18 +792,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, for (i = 0; i < MAX_MB_PLANE; i++) xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; - clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); - clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); - mbmi->ref_frame[0] = ref_frame; set_ref_ptrs(cm, xd, ref_frame, NONE); - if (const_motion[ref_frame] && this_mode == NEARMV) - continue; - - if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) - continue; - + mode_index = mode_idx[ref_frame][INTER_OFFSET(this_mode)]; mode_rd_thresh = best_mode_skip_txfm ? rd_threshes[mode_index] << 1 : rd_threshes[mode_index]; if (rd_less_than_thresh(best_rdc.rdcost, mode_rd_thresh, -- 2.40.0