ref: 55859e842806ef172ca4df7468624c224ee08d78
parent: 9917842f07b16f2d59aeebb9783f473b644a6565
author: Alex Converse <[email protected]>
date: Mon Mar 14 06:09:57 EDT 2016
Use whole pixel only at speed 8 screen content. +5.857% BD-RATE on SCREEN_CONTENT Leaving this off for non-screen content because: +25.300% on TWITCH120 +37.833% BD-RATE on RTC Change-Id: Ie0a312182d6cc859fb04298e4cd81d02b39e23fe
--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -383,6 +383,51 @@
(cost_list[4] - 2 * cost_list[0] + cost_list[2]));
}
+int vp9_skip_sub_pixel_tree(
+ const MACROBLOCK *x,
+ MV *bestmv, const MV *ref_mv,
+ int allow_hp,
+ int error_per_bit,
+ const vp9_variance_fn_ptr_t *vfp,
+ int forced_stop,
+ int iters_per_step,
+ int *cost_list,
+ int *mvjcost, int *mvcost[2],
+ int *distortion,
+ unsigned int *sse1,
+ const uint8_t *second_pred,
+ int w, int h) {
+ SETUP_SUBPEL_SEARCH;
+ besterr = setup_center_error(xd, bestmv, ref_mv, error_per_bit, vfp,
+ z, src_stride, y, y_stride, second_pred,
+ w, h, offset, mvjcost, mvcost,
+ sse1, distortion);
+ (void) halfiters;
+ (void) quarteriters;
+ (void) eighthiters;
+ (void) whichdir;
+ (void) allow_hp;
+ (void) forced_stop;
+ (void) hstep;
+ (void) rr;
+ (void) rc;
+ (void) minr;
+ (void) minc;
+ (void) maxr;
+ (void) maxc;
+ (void) tr;
+ (void) tc;
+ (void) sse;
+ (void) thismse;
+ (void) cost_list;
+
+ if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) ||
+ (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3)))
+ return INT_MAX;
+
+ return besterr;
+}
+
int vp9_find_best_sub_pixel_tree_pruned_evenmore(
const MACROBLOCK *x,
MV *bestmv, const MV *ref_mv,
--- a/vp9/encoder/vp9_mcomp.h
+++ b/vp9/encoder/vp9_mcomp.h
@@ -92,6 +92,7 @@
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned;
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_more;
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_evenmore;
+extern fractional_mv_step_fp vp9_skip_sub_pixel_tree;
typedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x,
const MV *ref_mv, int sad_per_bit,
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -441,7 +441,7 @@
}
if (speed >= 8) {
sf->adaptive_rd_thresh = 4;
- sf->mv.subpel_force_stop = 2;
+ sf->mv.subpel_force_stop = (content == VP9E_CONTENT_SCREEN) ? 3 : 2;
sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
}
}
@@ -607,7 +607,10 @@
sf->optimize_coefficients = 0;
}
- if (sf->mv.subpel_search_method == SUBPEL_TREE) {
+ if (sf->mv.subpel_force_stop == 3) {
+ // Whole pel only
+ cpi->find_fractional_mv_step = vp9_skip_sub_pixel_tree;
+ } else if (sf->mv.subpel_search_method == SUBPEL_TREE) {
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
} else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
--- a/vp9/encoder/vp9_speed_features.h
+++ b/vp9/encoder/vp9_speed_features.h
@@ -188,7 +188,11 @@
// Maximum number of steps in logarithmic subpel search before giving up.
int subpel_iters_per_step;
- // Control when to stop subpel search
+ // Control when to stop subpel search:
+ // 0: Full subpel search.
+ // 1: Stop at quarter pixel.
+ // 2: Stop at half pixel.
+ // 3: Stop at full pixel.
int subpel_force_stop;
// This variable sets the step_param used in full pel motion search.