From: Jingning Han Date: Fri, 28 Feb 2014 17:35:08 +0000 (-0800) Subject: Skip some mode SAD calculation in non-RD mode X-Git-Tag: v1.4.0~2205^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=24c7ee78c59eb2237d12658f8ca01ad0862bc444;p=libvpx 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 --- diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 87f20fa1c..0f2e3034f 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -270,12 +270,21 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, &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) {