ref: 24c7ee78c59eb2237d12658f8ca01ad0862bc444
parent: 17b1e92d6cdf2fbb9ae984b6d36465d3c9b7b3f3
author: Jingning Han <[email protected]>
date: Fri Feb 28 04:35:08 EST 2014
Skip some mode SAD calculation in non-RD mode This commit checks if the motion vector associated with the current mode has been computed in previous mode tests. If possible, skip the redundant reference block generation and SAD calculation in the non-RD mode decision process. For test sequence pedestrian_area 1080p, the runtime goes from 24261 ms to 23770 ms. This does not change compression performance. The speed-up is mostly around places with consistent motion. Change-Id: I97be63c6a2d07c57be26b3c600fbda3803adddda
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -270,12 +270,21 @@
&frame_mv[NEWMV][ref_frame]);
}
- mbmi->mode = this_mode;
- mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
- vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
+ if (frame_mv[this_mode][ref_frame].as_int == 0) {
+ dist = x->mode_sad[ref_frame][INTER_OFFSET(ZEROMV)];
+ } else if (this_mode != NEARESTMV &&
+ frame_mv[NEARESTMV][ref_frame].as_int ==
+ frame_mv[this_mode][ref_frame].as_int) {
+ dist = x->mode_sad[ref_frame][INTER_OFFSET(NEARESTMV)];
+ } else {
+ mbmi->mode = this_mode;
+ mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
+ vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
+ dist = x->mode_sad[ref_frame][INTER_OFFSET(this_mode)] =
+ cpi->fn_ptr[bsize].sdf(p->src.buf, p->src.stride,
+ pd->dst.buf, pd->dst.stride, INT_MAX);
+ }
- dist = cpi->fn_ptr[bsize].sdf(p->src.buf, p->src.stride,
- pd->dst.buf, pd->dst.stride, INT_MAX);
this_rd = rate + dist;
if (this_rd < best_rd) {