Pack global motion speed features into their own struct
BUG=aomedia:2562
Change-Id: I7f68af69d2a51159a0c7b71a97b6d87073246078
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 21ba8d8..b629afa 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4686,7 +4686,7 @@
static int do_gm_search_logic(SPEED_FEATURES *const sf, int frame) {
(void)frame;
- switch (sf->gm_search_type) {
+ switch (sf->gm_sf.gm_search_type) {
case GM_FULL_SEARCH: return 1;
case GM_REDUCED_REF_SEARCH_SKIP_L2_L3:
return !(frame == LAST2_FRAME || frame == LAST3_FRAME);
@@ -4859,9 +4859,9 @@
// TODO(Remya): Can include erroradv_prod_tr[] for threshold calculation
static INLINE int64_t calc_erroradv_threshold(AV1_COMP *cpi,
int64_t ref_frame_error) {
- if (!cpi->sf.disable_adaptive_warp_error_thresh)
- return (int64_t)(ref_frame_error * erroradv_tr[cpi->sf.gm_erroradv_type] +
- 0.5);
+ if (!cpi->sf.gm_sf.disable_adaptive_warp_error_thresh)
+ return (int64_t)(
+ ref_frame_error * erroradv_tr[cpi->sf.gm_sf.gm_erroradv_type] + 0.5);
else
return INT64_MAX;
}
@@ -4985,7 +4985,7 @@
(double)best_warp_error / ref_frame_error,
gm_get_params_cost(&cm->global_motion[frame], ref_params,
cm->allow_high_precision_mv),
- cpi->sf.gm_erroradv_type)) {
+ cpi->sf.gm_sf.gm_erroradv_type)) {
cm->global_motion[frame] = default_warp_params;
}
@@ -5028,7 +5028,7 @@
!prune_ref_by_selective_ref_frame(
cpi, ref_frame, cm->cur_frame->ref_display_order_hint,
cm->current_frame.display_order_hint) &&
- !(cpi->sf.selective_ref_gm && skip_gm_frame(cm, frame))) {
+ !(cpi->sf.gm_sf.selective_ref_gm && skip_gm_frame(cm, frame))) {
assert(ref_buf[frame] != NULL);
int relative_frame_dist = av1_encoder_get_relative_dist(
order_hint_info, buf->display_order_hint,
@@ -5099,7 +5099,7 @@
// the remaining ref frames in that direction. The below exit is disabled
// when ref frame distance w.r.t. current frame is zero. E.g.:
// source_alt_ref_frame w.r.t. ARF frames
- if (cpi->sf.prune_ref_frame_for_gm_search &&
+ if (cpi->sf.gm_sf.prune_ref_frame_for_gm_search &&
reference_frame[frame].distance != 0 &&
cm->global_motion[ref_frame].wmtype != ROTZOOM)
break;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 3812579..ff1ec9d 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5171,7 +5171,7 @@
loop = 0;
}
- if (allow_recode && !cpi->sf.gm_disable_recode &&
+ if (allow_recode && !cpi->sf.gm_sf.gm_disable_recode &&
recode_loop_test_global_motion(cpi)) {
loop = 1;
}
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 1afd941..397a529 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -291,8 +291,8 @@
? 0
: (is_boosted_arf2_bwd_type ? 1 : 2);
sf->part_sf.less_rectangular_check_level = 1;
- sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
- sf->gm_disable_recode = 1;
+ sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
+ sf->gm_sf.gm_disable_recode = 1;
sf->interp_sf.use_fast_interpolation_filter_search = 1;
sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
sf->intra_sf.intra_pruning_with_hog = 1;
@@ -310,7 +310,7 @@
if (speed >= 1) {
sf->inter_sf.selective_ref_frame = 2;
- sf->prune_ref_frame_for_gm_search = boosted ? 0 : 1;
+ sf->gm_sf.prune_ref_frame_for_gm_search = boosted ? 0 : 1;
sf->tx_sf.intra_tx_size_search_init_depth_rect = 1;
sf->interp_sf.use_interp_filter = 1;
@@ -334,8 +334,8 @@
sf->inter_sf.disable_interinter_wedge_newmv_search = boosted ? 0 : 1;
sf->inter_sf.prune_comp_type_by_comp_avg = 1;
sf->inter_sf.prune_motion_mode_level = 2;
- sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
- sf->disable_adaptive_warp_error_thresh = 0;
+ sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
+ sf->gm_sf.disable_adaptive_warp_error_thresh = 0;
sf->rd_sf.tx_domain_dist_level = boosted ? 1 : 2;
sf->rd_sf.tx_domain_dist_thres_level = 1;
sf->rd_sf.perform_coeff_opt = boosted ? 1 : 2;
@@ -358,7 +358,7 @@
}
if (speed >= 2) {
- sf->gm_erroradv_type = GM_ERRORADV_TR_2;
+ sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_2;
sf->inter_sf.selective_ref_frame = 3;
sf->lpf_sf.prune_sgr_based_on_wiener =
@@ -403,7 +403,7 @@
sf->mv_sf.use_accurate_subpel_search = USE_2_TAPS;
if (cpi->oxcf.enable_smooth_interintra)
sf->inter_sf.disable_smooth_interintra = boosted ? 0 : 1;
- sf->gm_search_type = GM_DISABLE_SEARCH;
+ sf->gm_sf.gm_search_type = GM_DISABLE_SEARCH;
sf->inter_sf.prune_comp_search_by_single_result = boosted ? 4 : 2;
sf->inter_sf.prune_motion_mode_level = boosted ? 2 : 3;
// TODO(yunqing): evaluate this speed feature for speed 1 & 2, and combine
@@ -533,8 +533,8 @@
sf->inter_sf.prune_ref_frame_for_rect_partitions = !boosted;
sf->part_sf.less_rectangular_check_level = 1;
- sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
- sf->gm_disable_recode = 1;
+ sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
+ sf->gm_sf.gm_disable_recode = 1;
sf->interp_sf.use_fast_interpolation_filter_search = 1;
sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
sf->intra_sf.intra_pruning_with_hog = 1;
@@ -558,7 +558,7 @@
sf->rt_sf.hybrid_intra_pickmode = 0;
if (speed >= 1) {
- sf->gm_erroradv_type = GM_ERRORADV_TR_1;
+ sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_1;
sf->inter_sf.selective_ref_frame = 2;
sf->tx_sf.intra_tx_size_search_init_depth_rect = 1;
@@ -587,14 +587,14 @@
sf->inter_sf.disable_wedge_search_edge_thresh = 0;
sf->inter_sf.prune_comp_type_by_comp_avg = 1;
sf->inter_sf.prune_motion_mode_level = 2;
- sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
+ sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
sf->interp_sf.cb_pred_filter_search = 1;
sf->rd_sf.tx_domain_dist_level = boosted ? 0 : 1;
sf->rd_sf.tx_domain_dist_thres_level = 1;
}
if (speed >= 2) {
- sf->gm_erroradv_type = GM_ERRORADV_TR_2;
+ sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_2;
sf->inter_sf.selective_ref_frame = 3;
sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
@@ -633,7 +633,7 @@
sf->mv_sf.use_accurate_subpel_search = USE_2_TAPS;
sf->inter_sf.adaptive_rd_thresh = 2;
sf->tx_sf.tx_type_search.prune_mode = PRUNE_2D_FAST;
- sf->gm_search_type = GM_DISABLE_SEARCH;
+ sf->gm_sf.gm_search_type = GM_DISABLE_SEARCH;
sf->inter_sf.prune_comp_search_by_single_result = 2;
sf->inter_sf.prune_motion_mode_level = boosted ? 2 : 3;
sf->inter_sf.prune_warp_using_wmtype = 1;
@@ -750,6 +750,15 @@
}
}
+static AOM_INLINE void init_gm_sf(GLOBAL_MOTION_SPEED_FEATURES *gm_sf) {
+ gm_sf->gm_erroradv_type = GM_ERRORADV_TR_0;
+ gm_sf->disable_adaptive_warp_error_thresh = 1;
+ gm_sf->selective_ref_gm = 1;
+ gm_sf->gm_search_type = GM_FULL_SEARCH;
+ gm_sf->gm_disable_recode = 0;
+ gm_sf->prune_ref_frame_for_gm_search = 0;
+}
+
static AOM_INLINE void init_part_sf(PARTITION_SPEED_FEATURES *part_sf) {
part_sf->partition_search_type = SEARCH_PARTITION;
part_sf->less_rectangular_check_level = 0;
@@ -981,9 +990,6 @@
// best quality defaults
sf->frame_parameter_update = 1;
sf->recode_loop = ALLOW_RECODE;
- sf->gm_erroradv_type = GM_ERRORADV_TR_0;
- sf->disable_adaptive_warp_error_thresh = 1;
- sf->selective_ref_gm = 1;
sf->reduce_high_precision_mv_usage = 0;
sf->disable_overlay_frames = 0;
// TODO(yunqing): turn it on for speed 0 if there is gain.
@@ -991,12 +997,10 @@
// Recode loop tolerance %.
sf->recode_tolerance = 25;
- sf->gm_search_type = GM_FULL_SEARCH;
- sf->gm_disable_recode = 0;
- sf->prune_ref_frame_for_gm_search = 0;
sf->tpl_sf.prune_intra_modes = 0;
sf->tpl_sf.reduce_first_step_size = 0;
+ init_gm_sf(&sf->gm_sf);
init_part_sf(&sf->part_sf);
init_mv_sf(&sf->mv_sf);
init_inter_sf(&sf->inter_sf);
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index a3ba756..fe2b6a3 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -261,6 +261,38 @@
ADAPT_PRED
} UENUM1BYTE(MAX_PART_PRED_MODE);
+typedef struct TPL_SPEED_FEATURES {
+ // Prune the intra modes search by tpl.
+ // If set to 0, we will search all intra modes from DC_PRED to PAETH_PRED.
+ // If set to 1, we only search DC_PRED, V_PRED, and H_PRED.
+ int prune_intra_modes;
+ // This parameter controls which step in the n-step process we start at.
+ int reduce_first_step_size;
+} TPL_SPEED_FEATURES;
+
+typedef struct GLOBAL_MOTION_SPEED_FEATURES {
+ // Global motion warp error threshold
+ GM_ERRORADV_TYPE gm_erroradv_type;
+
+ // Disable adaptive threshold for global motion warp error
+ int disable_adaptive_warp_error_thresh;
+
+ // Do not compute the global motion parameters for a LAST2_FRAME or
+ // LAST3_FRAME if the GOLDEN_FRAME is closer and it has a non identity
+ // global model.
+ int selective_ref_gm;
+
+ GM_SEARCH_TYPE gm_search_type;
+
+ // whether to disable the global motion recode loop
+ int gm_disable_recode;
+
+ // During global motion estimation, prune remaining reference frames in a
+ // given direction(past/future), if the evaluated ref_frame in that direction
+ // yields gm_type as INVALID/TRANSLATION/IDENTITY
+ int prune_ref_frame_for_gm_search;
+} GLOBAL_MOTION_SPEED_FEATURES;
+
typedef struct PARTITION_SPEED_FEATURES {
PARTITION_SEARCH_TYPE partition_search_type;
@@ -554,15 +586,6 @@
int model_based_post_interp_filter_breakout;
} INTER_MODE_SPEED_FEATURES;
-typedef struct TPL_SPEED_FEATURES {
- // Prune the intra modes search by tpl.
- // If set to 0, we will search all intra modes from DC_PRED to PAETH_PRED.
- // If set to 1, we only search DC_PRED, V_PRED, and H_PRED.
- int prune_intra_modes;
- // This parameter controls which step in the n-step process we start at.
- int reduce_first_step_size;
-} TPL_SPEED_FEATURES;
-
typedef struct INTERP_FILTER_SPEED_FEATURES {
// A source variance threshold below which filter search is disabled
// Choose a very large value (UINT_MAX) to use 8-tap always
@@ -864,26 +887,7 @@
/*
* Global motion speed features:
*/
- // Global motion warp error threshold
- GM_ERRORADV_TYPE gm_erroradv_type;
-
- // Disable adaptive threshold for global motion warp error
- int disable_adaptive_warp_error_thresh;
-
- // Do not compute the global motion parameters for a LAST2_FRAME or
- // LAST3_FRAME if the GOLDEN_FRAME is closer and it has a non identity
- // global model.
- int selective_ref_gm;
-
- GM_SEARCH_TYPE gm_search_type;
-
- // whether to disable the global motion recode loop
- int gm_disable_recode;
-
- // During global motion estimation, prune remaining reference frames in a
- // given direction(past/future), if the evaluated ref_frame in that direction
- // yields gm_type as INVALID/TRANSLATION/IDENTITY
- int prune_ref_frame_for_gm_search;
+ GLOBAL_MOTION_SPEED_FEATURES gm_sf;
/*
* Partition search speed features: