summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorYaowu Xu <yaowu@google.com>2015-03-16 09:42:33 -0700
committerYaowu Xu <yaowu@google.com>2015-03-16 10:08:02 -0700
commit51d529a5786ef5654ac318c14971eb6857c420e3 (patch)
tree24106be46c77f69a3f23804cb01e898e982fa580 /vp9/encoder
parent1f9b2b77ad794a68b267d70c88288d5700297384 (diff)
downloadlibvpx-51d529a5786ef5654ac318c14971eb6857c420e3.tar
libvpx-51d529a5786ef5654ac318c14971eb6857c420e3.tar.gz
libvpx-51d529a5786ef5654ac318c14971eb6857c420e3.tar.bz2
libvpx-51d529a5786ef5654ac318c14971eb6857c420e3.zip
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
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_pickmode.c37
1 files 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,