Pack loop filter speed features into their own struct
BUG=aomedia:2562
Change-Id: Idd78fa2de804a904b53131da6c74eed00fcda16a
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 7230aff..3812579 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4581,7 +4581,7 @@
#endif
// Find CDEF parameters
av1_cdef_search(&cm->cur_frame->buf, cpi->source, cm, xd,
- cpi->sf.cdef_pick_method, cpi->td.mb.rdmult);
+ cpi->sf.lpf_sf.cdef_pick_method, cpi->td.mb.rdmult);
// Apply the filter
av1_cdef_frame(&cm->cur_frame->buf, cm, xd);
@@ -4644,7 +4644,7 @@
#endif
if (use_loopfilter) {
aom_clear_system_state();
- av1_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_pick);
+ av1_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_sf.lpf_pick);
} else {
lf->filter_level[0] = 0;
lf->filter_level[1] = 0;
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 520649bd..7b9d874 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -886,7 +886,7 @@
dgd_start, limits->h_end - limits->h_start,
limits->v_end - limits->v_start, rsc->dgd_stride, src_start,
rsc->src_stride, highbd, bit_depth, procunit_width, procunit_height,
- tmpbuf, rsc->sf->enable_sgr_ep_pruning);
+ tmpbuf, rsc->sf->lpf_sf.enable_sgr_ep_pruning);
RestorationUnitInfo rui;
rui.restoration_type = RESTORE_SGRPROJ;
@@ -903,7 +903,8 @@
double cost_sgr =
RDCOST_DBL(x->rdmult, bits_sgr >> 4, rusi->sse[RESTORE_SGRPROJ]);
if (rusi->sgrproj.ep < 10)
- cost_sgr *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level);
+ cost_sgr *=
+ (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->lpf_sf.dual_sgr_penalty_level);
RestorationType rtype =
(cost_sgr < cost_none) ? RESTORE_SGRPROJ : RESTORE_NONE;
@@ -1443,7 +1444,7 @@
(rsc->plane == AOM_PLANE_Y) ? WIENER_WIN : WIENER_WIN_CHROMA;
int reduced_wiener_win = wiener_win;
- if (rsc->sf->reduce_wiener_window_size) {
+ if (rsc->sf->lpf_sf.reduce_wiener_window_size) {
reduced_wiener_win =
(rsc->plane == AOM_PLANE_Y) ? WIENER_WIN_REDUCED : WIENER_WIN_CHROMA;
}
@@ -1477,7 +1478,7 @@
rsc->sse += rusi->sse[RESTORE_NONE];
rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
rusi->sse[RESTORE_WIENER] = INT64_MAX;
- if (rsc->sf->prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
+ if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
return;
}
@@ -1496,7 +1497,7 @@
rsc->sse += rusi->sse[RESTORE_NONE];
rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
rusi->sse[RESTORE_WIENER] = INT64_MAX;
- if (rsc->sf->prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
+ if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
return;
}
@@ -1529,9 +1530,9 @@
// Set 'skip_sgr_eval' based on rdcost ratio of RESTORE_WIENER and
// RESTORE_NONE or based on best_rtype
- if (rsc->sf->prune_sgr_based_on_wiener == 1) {
+ if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 1) {
rusi->skip_sgr_eval = cost_wiener > (1.01 * cost_none);
- } else if (rsc->sf->prune_sgr_based_on_wiener == 2) {
+ } else if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) {
rusi->skip_sgr_eval = rusi->best_rtype[RESTORE_WIENER - 1] == RESTORE_NONE;
}
@@ -1606,7 +1607,8 @@
const int64_t bits = x->switchable_restore_cost[r] + coeff_bits;
double cost = RDCOST_DBL(x->rdmult, bits >> 4, sse);
if (r == RESTORE_SGRPROJ && rusi->sgrproj.ep < 10)
- cost *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level);
+ cost *=
+ (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->lpf_sf.dual_sgr_penalty_level);
if (r == 0 || cost < best_cost) {
best_cost = cost;
best_bits = bits;
@@ -1687,7 +1689,7 @@
RestorationType best_rtype = RESTORE_NONE;
const int highbd = rsc.cm->seq_params.use_highbitdepth;
- if (!cpi->sf.disable_loop_restoration_chroma || !plane) {
+ if (!cpi->sf.lpf_sf.disable_loop_restoration_chroma || !plane) {
av1_extend_frame(rsc.dgd_buffer, rsc.plane_width, rsc.plane_height,
rsc.dgd_stride, RESTORATION_BORDER, RESTORATION_BORDER,
highbd);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 05edcfb..1afd941 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -318,7 +318,7 @@
sf->tx_sf.tx_type_search.ml_tx_split_thresh = 4000;
sf->tx_sf.adaptive_txb_search_level = 2;
sf->tx_sf.use_intra_txb_hash = 1;
- sf->dual_sgr_penalty_level = 1;
+ sf->lpf_sf.dual_sgr_penalty_level = 1;
sf->mv_sf.use_accurate_subpel_search = USE_4_TAPS;
sf->inter_sf.reuse_inter_intra_mode = 1;
sf->inter_sf.prune_comp_search_by_single_result = boosted ? 2 : 1;
@@ -345,10 +345,10 @@
: (boosted ? 1 : 2);
sf->part_sf.intra_cnn_split = 1;
- sf->enable_sgr_ep_pruning = 1;
+ sf->lpf_sf.enable_sgr_ep_pruning = 1;
sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
sf->tx_sf.inter_tx_size_search_init_depth_sqr = 1;
- sf->cdef_pick_method = CDEF_FAST_SEARCH;
+ sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH;
sf->interp_sf.cb_pred_filter_search = 0;
sf->tx_sf.model_based_prune_tx_search_level = 0;
sf->inter_sf.reduce_inter_modes = boosted ? 1 : 2;
@@ -361,7 +361,8 @@
sf->gm_erroradv_type = GM_ERRORADV_TR_2;
sf->inter_sf.selective_ref_frame = 3;
- sf->prune_sgr_based_on_wiener = cm->allow_screen_content_tools ? 0 : 1;
+ sf->lpf_sf.prune_sgr_based_on_wiener =
+ cm->allow_screen_content_tools ? 0 : 1;
// TODO(chiyotsai@google.com): We can get 10% speed up if we move
// adaptive_rd_thresh to speed 1. But currently it performs poorly on some
@@ -419,8 +420,9 @@
frame_is_intra_only(&cpi->common) ? 0 : 1;
sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist =
cm->allow_screen_content_tools ? 0 : 1;
- sf->reduce_wiener_window_size = is_boosted_arf2_bwd_type ? 0 : 1;
- sf->prune_sgr_based_on_wiener = cm->allow_screen_content_tools ? 0 : 2;
+ sf->lpf_sf.reduce_wiener_window_size = is_boosted_arf2_bwd_type ? 0 : 1;
+ sf->lpf_sf.prune_sgr_based_on_wiener =
+ cm->allow_screen_content_tools ? 0 : 2;
sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED;
sf->part_sf.simple_motion_search_prune_agg = 1;
sf->inter_sf.disable_sb_level_mv_cost_upd = 1;
@@ -440,9 +442,9 @@
// is reset during winner mode processing
sf->tx_sf.use_intra_txb_hash = 0;
sf->tx_sf.tx_type_search.fast_intra_tx_type_search = 1;
- sf->disable_loop_restoration_chroma =
+ sf->lpf_sf.disable_loop_restoration_chroma =
(boosted || cm->allow_screen_content_tools) ? 0 : 1;
- sf->reduce_wiener_window_size = !boosted;
+ sf->lpf_sf.reduce_wiener_window_size = !boosted;
sf->interp_sf.cb_pred_filter_search = 1;
sf->inter_sf.adaptive_mode_search = 1;
sf->inter_sf.alt_ref_search_fp = 1;
@@ -493,7 +495,7 @@
}
if (speed >= 5) {
- sf->disable_lr_filter = 1;
+ sf->lpf_sf.disable_lr_filter = 1;
sf->inter_sf.disable_obmc = 1;
sf->inter_sf.disable_interinter_wedge = 1;
sf->inter_sf.disable_smooth_interintra = 1;
@@ -568,7 +570,7 @@
sf->tx_sf.adaptive_txb_search_level = 2;
sf->tx_sf.use_intra_txb_hash = 1;
sf->rd_sf.optimize_b_precheck = 1;
- sf->dual_sgr_penalty_level = 1;
+ sf->lpf_sf.dual_sgr_penalty_level = 1;
sf->mv_sf.use_accurate_subpel_search = USE_4_TAPS;
sf->inter_sf.reuse_inter_intra_mode = 1;
sf->inter_sf.prune_comp_search_by_single_result = 1;
@@ -597,7 +599,7 @@
sf->inter_sf.selective_ref_frame = 3;
sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
sf->tx_sf.inter_tx_size_search_init_depth_sqr = 1;
- sf->cdef_pick_method = CDEF_FAST_SEARCH;
+ sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH;
sf->inter_sf.adaptive_rd_thresh = 1;
sf->mv_sf.auto_mv_step_size = 1;
@@ -686,7 +688,7 @@
}
sf->part_sf.partition_search_breakout_rate_thr = 500;
sf->rd_sf.simple_model_rd_from_var = 1;
- sf->lpf_pick = LPF_PICK_FROM_Q;
+ sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
sf->mv_sf.subpel_force_stop = QUARTER_PEL;
sf->part_sf.default_max_partition_size = BLOCK_128X128;
sf->part_sf.default_min_partition_size = BLOCK_8X8;
@@ -699,7 +701,7 @@
sf->winner_mode_sf.tx_size_search_level = 1;
sf->rt_sf.use_comp_ref_nonrd = 0;
sf->inter_sf.inter_mode_rd_model_estimation = 2;
- sf->cdef_pick_method = CDEF_PICK_FROM_Q;
+ sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->part_sf.max_intra_bsize = BLOCK_32X32;
sf->tx_sf.use_inter_txb_hash = 0;
sf->rt_sf.skip_interp_filter_search = 1;
@@ -709,7 +711,7 @@
sf->rt_sf.use_simple_rd_model = 1;
}
if (speed >= 7) {
- sf->lpf_pick = LPF_PICK_FROM_Q;
+ sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
sf->mv_sf.subpel_force_stop = QUARTER_PEL;
sf->part_sf.default_max_partition_size = BLOCK_128X128;
sf->part_sf.default_min_partition_size = BLOCK_8X8;
@@ -720,7 +722,7 @@
sf->rt_sf.use_nonrd_pick_mode = 1;
sf->rt_sf.use_comp_ref_nonrd = 0;
sf->inter_sf.inter_mode_rd_model_estimation = 2;
- sf->cdef_pick_method = CDEF_PICK_FROM_Q;
+ sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->rt_sf.skip_interp_filter_search = 0;
sf->rt_sf.short_circuit_low_temp_var = 0;
sf->rt_sf.reuse_inter_pred_nonrd = 0;
@@ -922,6 +924,18 @@
winner_mode_sf->enable_multiwinner_mode_process = 0;
}
+static AOM_INLINE void init_lpf_sf(LOOP_FILTER_SPEED_FEATURES *lpf_sf) {
+ lpf_sf->disable_loop_restoration_chroma = 0;
+ lpf_sf->prune_sgr_based_on_wiener = 0;
+ lpf_sf->enable_sgr_ep_pruning = 0;
+ lpf_sf->reduce_wiener_window_size = 0;
+ lpf_sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
+ lpf_sf->cdef_pick_method = CDEF_FULL_SEARCH;
+ // Set decoder side speed feature to use less dual sgr modes
+ lpf_sf->dual_sgr_penalty_level = 0;
+ lpf_sf->disable_lr_filter = 0;
+}
+
static AOM_INLINE void init_rt_sf(REAL_TIME_SPEED_FEATURES *rt_sf) {
rt_sf->mode_search_skip_flags = 0;
rt_sf->skip_interp_filter_search = 0;
@@ -970,16 +984,10 @@
sf->gm_erroradv_type = GM_ERRORADV_TR_0;
sf->disable_adaptive_warp_error_thresh = 1;
sf->selective_ref_gm = 1;
- sf->disable_loop_restoration_chroma = 0;
- sf->prune_sgr_based_on_wiener = 0;
- sf->enable_sgr_ep_pruning = 0;
- sf->reduce_wiener_window_size = 0;
sf->reduce_high_precision_mv_usage = 0;
sf->disable_overlay_frames = 0;
// TODO(yunqing): turn it on for speed 0 if there is gain.
sf->adaptive_overlay_encoding = 1;
- sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
- sf->cdef_pick_method = CDEF_FULL_SEARCH;
// Recode loop tolerance %.
sf->recode_tolerance = 25;
@@ -989,10 +997,6 @@
sf->tpl_sf.prune_intra_modes = 0;
sf->tpl_sf.reduce_first_step_size = 0;
- // Set decoder side speed feature to use less dual sgr modes
- sf->dual_sgr_penalty_level = 0;
- sf->disable_lr_filter = 0;
-
init_part_sf(&sf->part_sf);
init_mv_sf(&sf->mv_sf);
init_inter_sf(&sf->inter_sf);
@@ -1001,6 +1005,7 @@
init_tx_sf(&sf->tx_sf);
init_rd_sf(&sf->rd_sf, cpi);
init_winner_mode_sf(&sf->winner_mode_sf);
+ init_lpf_sf(&sf->lpf_sf);
init_rt_sf(&sf->rt_sf);
if (oxcf->mode == GOOD)
@@ -1011,7 +1016,7 @@
if (!cpi->seq_params_locked) {
cpi->common.seq_params.enable_dual_filter &=
!sf->interp_sf.disable_dual_filter;
- cpi->common.seq_params.enable_restoration &= !sf->disable_lr_filter;
+ cpi->common.seq_params.enable_restoration &= !sf->lpf_sf.disable_lr_filter;
}
// sf->part_sf.partition_search_breakout_dist_thr is set assuming max 64x64
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 7b64ca8..a3ba756 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -730,6 +730,38 @@
int motion_mode_for_winner_cand;
} WINNER_MODE_SPEED_FEATURES;
+typedef struct LOOP_FILTER_SPEED_FEATURES {
+ // This feature controls how the loop filter level is determined.
+ LPF_PICK_METHOD lpf_pick;
+
+ // Control how the CDEF strength is determined.
+ CDEF_PICK_METHOD cdef_pick_method;
+
+ // Decoder side speed feature to add penalty for use of dual-sgr filters.
+ // Takes values 0 - 10, 0 indicating no penalty and each additional level
+ // adding a penalty of 1%
+ int dual_sgr_penalty_level;
+
+ // prune sgr ep using binary search like mechanism
+ int enable_sgr_ep_pruning;
+
+ // Disable loop restoration for Chroma plane
+ int disable_loop_restoration_chroma;
+
+ // Prune self-guided loop restoration based on wiener search results
+ // 0 : no pruning
+ // 1 : pruning based on rdcost ratio of RESTORE_WIENER and RESTORE_NONE
+ // 2 : pruning based on winner restoration type among RESTORE_WIENER and
+ // RESTORE_NONE
+ int prune_sgr_based_on_wiener;
+
+ // Reduce the wiener filter win size for luma
+ int reduce_wiener_window_size;
+
+ // Disable loop restoration filter
+ int disable_lr_filter;
+} LOOP_FILTER_SPEED_FEATURES;
+
typedef struct REAL_TIME_SPEED_FEATURES {
// check intra prediction for non-RD mode.
int check_intra_pred_nonrd;
@@ -896,35 +928,7 @@
/*
* In-loop filter speed features:
*/
- // This feature controls how the loop filter level is determined.
- LPF_PICK_METHOD lpf_pick;
-
- // Control how the CDEF strength is determined.
- CDEF_PICK_METHOD cdef_pick_method;
-
- // Decoder side speed feature to add penalty for use of dual-sgr filters.
- // Takes values 0 - 10, 0 indicating no penalty and each additional level
- // adding a penalty of 1%
- int dual_sgr_penalty_level;
-
- // prune sgr ep using binary search like mechanism
- int enable_sgr_ep_pruning;
-
- // Disable loop restoration for Chroma plane
- int disable_loop_restoration_chroma;
-
- // Prune self-guided loop restoration based on wiener search results
- // 0 : no pruning
- // 1 : pruning based on rdcost ratio of RESTORE_WIENER and RESTORE_NONE
- // 2 : pruning based on winner restoration type among RESTORE_WIENER and
- // RESTORE_NONE
- int prune_sgr_based_on_wiener;
-
- // Reduce the wiener filter win size for luma
- int reduce_wiener_window_size;
-
- // Disable loop restoration filter
- int disable_lr_filter;
+ LOOP_FILTER_SPEED_FEATURES lpf_sf;
/*
* Real-time mode speed features: