ref: 1e30547984e1d80f5b98214efc9f781cbcc85999
parent: 6e086548cbb7c6802b5f0cfacd60600f6ae6e45b
author: Jingning Han <[email protected]>
date: Mon Aug 11 14:02:18 EDT 2014
Skip mode search based on reference frame consistency This commit enables the encoder to skip NEARMV and ZEROMV if the above and left blocks have identical reference frame, and the current reference is different from that. It reduces the runtime of speed 3 for test sequences: bus cif at 1000 kbps 10064 ms -> 9823 ms pedestrian 1080p at 2000 kbps 193078 ms -> 189559 ms The compression performance is changed by derf -0.085% stdhd -0.103% Change-Id: If304f26d42e6412152a84c3dd7b02635c38444f4
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -2687,17 +2687,24 @@
tile->mi_col_end - mi_col);
const int mi_height = MIN(num_8x8_blocks_high_lookup[bsize],
tile->mi_row_end - mi_row);
+ const int bsl = mi_width_log2(bsize);
+ int cb_partition_search_ctrl = (((mi_row + mi_col) >> bsl)
+ + get_chessboard_index(cm->current_video_frame)) & 0x1;
MB_MODE_INFO *ref_mbmi;
int const_motion = 1;
+ int skip_ref_frame = !cb_partition_search_ctrl;
+ MV_REFERENCE_FRAME rf = NONE;
int_mv ref_mv;
ref_mv.as_int = INVALID_MV;
if ((mi_row - 1) >= tile->mi_row_start) {
ref_mv = xd->mi[-xd->mi_stride]->mbmi.mv[0];
+ rf = xd->mi[-xd->mi_stride]->mbmi.ref_frame[0];
for (i = 0; i < mi_width; ++i) {
ref_mbmi = &xd->mi[-xd->mi_stride + i]->mbmi;
const_motion &= (ref_mv.as_int == ref_mbmi->mv[0].as_int) &&
(ref_frame == ref_mbmi->ref_frame[0]);
+ skip_ref_frame &= (rf == ref_mbmi->ref_frame[0]);
}
}
@@ -2704,12 +2711,20 @@
if ((mi_col - 1) >= tile->mi_col_start) {
if (ref_mv.as_int == INVALID_MV)
ref_mv = xd->mi[-1]->mbmi.mv[0];
+ if (rf == NONE)
+ rf = xd->mi[-1]->mbmi.ref_frame[0];
for (i = 0; i < mi_height; ++i) {
ref_mbmi = &xd->mi[i * xd->mi_stride - 1]->mbmi;
const_motion &= (ref_mv.as_int == ref_mbmi->mv[0].as_int) &&
(ref_frame == ref_mbmi->ref_frame[0]);
+ skip_ref_frame &= (rf == ref_mbmi->ref_frame[0]);
}
}
+
+ if (skip_ref_frame && this_mode != NEARESTMV && this_mode != NEWMV)
+ if (rf > INTRA_FRAME)
+ if (ref_frame != rf)
+ continue;
if (const_motion)
if (this_mode == NEARMV || this_mode == ZEROMV)