Skip affine evaluation based on warp parameters Introduced a speed feature to gate warp evaluation for motions of type IDENTITY, TRANSLATION and AFFINE based on number of warp neighbors. This speed feature is turned on for speeds >= 3. For speed = 4 and 3 presets, BD-rate impact is seen by -0.02% and 0.01% (as per AWCY runs) with encode time reduction of 0.85% and 0.65% (averaged across multiple test cases) respectively. STATS_CHANGED Change-Id: Ic7e11408023578602244b165bb34ab4cbfff28a7
diff --git a/av1/common/mv.h b/av1/common/mv.h index 5b02251..737d715 100644 --- a/av1/common/mv.h +++ b/av1/common/mv.h
@@ -263,7 +263,7 @@ return res; } -static INLINE TransformationType get_gmtype(const WarpedMotionParams *gm) { +static INLINE TransformationType get_wmtype(const WarpedMotionParams *gm) { if (gm->wmmat[5] == (1 << WARPEDMODEL_PREC_BITS) && !gm->wmmat[4] && gm->wmmat[2] == (1 << WARPEDMODEL_PREC_BITS) && !gm->wmmat[3]) { return ((!gm->wmmat[1] && !gm->wmmat[0]) ? IDENTITY : TRANSLATION);
diff --git a/av1/encoder/global_motion.c b/av1/encoder/global_motion.c index 24d2c42..495c0ef 100644 --- a/av1/encoder/global_motion.c +++ b/av1/encoder/global_motion.c
@@ -106,7 +106,7 @@ void av1_convert_model_to_params(const double *params, WarpedMotionParams *model) { convert_to_params(params, model->wmmat); - model->wmtype = get_gmtype(model); + model->wmtype = get_wmtype(model); model->invalid = 0; } @@ -239,7 +239,7 @@ } } force_wmtype(wm, wmtype); - wm->wmtype = get_gmtype(wm); + wm->wmtype = get_wmtype(wm); return best_error; }
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 759775c..3195768 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -9132,6 +9132,23 @@ mbmi->wm_params = wm_params0; mbmi->num_proj_ref = num_proj_ref0; } + } else { + if (cpi->sf.prune_warp_using_wmtype) { + TransformationType wmtype = get_wmtype(&mbmi->wm_params); + // If number of valid neighbours is 1, + // 1) ROTZOOM parameters can be obtained reliably (2 parameters from + // one neighbouring MV) + // 2) For IDENTITY/TRANSLATION cases, warp can perform better due to + // a different interpolation filter being used. However the quality + // gains (due to the same) may not be much + // For above 2 cases warp evaluation is skipped + // TODO(any) : Extend this logic for NEWMV case + if (mbmi->num_proj_ref == 1) { + if (wmtype != ROTZOOM) continue; + } else { + if (wmtype < ROTZOOM) continue; + } + } } av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index 8e99887..94c698e 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -290,6 +290,7 @@ sf->gm_search_type = GM_DISABLE_SEARCH; sf->prune_comp_search_by_single_result = 2; sf->prune_motion_mode_level = boosted ? 2 : 3; + sf->prune_warp_using_wmtype = 1; } if (speed >= 4) { @@ -527,6 +528,7 @@ sf->skip_sharp_interp_filter_search = 0; sf->prune_comp_type_by_comp_avg = 0; sf->prune_motion_mode_level = 0; + sf->prune_warp_using_wmtype = 0; if (oxcf->mode == GOOD) set_good_speed_features_framesize_independent(cpi, sf, oxcf->speed);
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index b2ff8e2..a9d9338 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -605,6 +605,10 @@ // Values are 0 (not used) , 1 - 3 with progressively increasing // aggressiveness int prune_motion_mode_level; + + // Gate warp evaluation for motions of type IDENTITY, + // TRANSLATION and AFFINE(based on number of warp neighbors) + int prune_warp_using_wmtype; } SPEED_FEATURES; struct AV1_COMP;