diff options
author | Jingning Han <jingning@google.com> | 2014-08-11 18:02:18 -0700 |
---|---|---|
committer | Jingning Han <jingning@google.com> | 2014-08-13 14:16:18 -0700 |
commit | 1e30547984e1d80f5b98214efc9f781cbcc85999 (patch) | |
tree | da1bac5f4b3118c2d058b8478ca7a508e7d18934 /vp9 | |
parent | 6e086548cbb7c6802b5f0cfacd60600f6ae6e45b (diff) | |
download | libvpx-1e30547984e1d80f5b98214efc9f781cbcc85999.tar libvpx-1e30547984e1d80f5b98214efc9f781cbcc85999.tar.gz libvpx-1e30547984e1d80f5b98214efc9f781cbcc85999.tar.bz2 libvpx-1e30547984e1d80f5b98214efc9f781cbcc85999.zip |
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
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 3850548d6..e368037a6 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -2687,30 +2687,45 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, 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]); } } 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) continue; |