rtc: Remove unused speed feature and some cleanup.
Remove the use_modeled_non_rd_cost speed feature
as it has not been used in a while, and last time tested
did not have good tradeoff.
Move some screen and svc speed features to their related
code area, where the other screen/svc settings are set.
No change in stats.
Change-Id: I988b51f83408b87534c2aa48d48403c88736ab67
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index c4d8288..714e6ca 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2142,8 +2142,6 @@
* \param[in] x Pointer to structure holding all the
* data for the current macroblock
* \param[in] bsize Current block size
- * \param[in] use_modeled_non_rd_cost Flag, indicating usage of curvfit
- * model for RD cost
* \param[in] best_early_term Flag, indicating that TX for the
* best inter mode was skipped
* \param[in] ref_cost_intra Cost of signalling intra mode
@@ -2164,10 +2162,9 @@
* \c best_rdc and best selected mode is placed to \c best_pickmode
*/
static void estimate_intra_mode(
- AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, int use_modeled_non_rd_cost,
- int best_early_term, unsigned int ref_cost_intra, int reuse_prediction,
- struct buf_2d *orig_dst, PRED_BUFFER *tmp_buffers,
- PRED_BUFFER **this_mode_pred, RD_STATS *best_rdc,
+ AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, int best_early_term,
+ unsigned int ref_cost_intra, int reuse_prediction, struct buf_2d *orig_dst,
+ PRED_BUFFER *tmp_buffers, PRED_BUFFER **this_mode_pred, RD_STATS *best_rdc,
BEST_PICKMODE *best_pickmode, PICK_MODE_CONTEXT *ctx) {
AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &x->e_mbd;
@@ -2321,11 +2318,8 @@
mi->tx_size = intra_tx_size;
compute_intra_yprediction(cm, this_mode, bsize, x, xd);
// Look into selecting tx_size here, based on prediction residual.
- if (use_modeled_non_rd_cost)
- model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc, NULL, 1);
- else
- av1_block_yrd(cpi, x, mi_row, mi_col, &this_rdc, &args.skippable, bsize,
- mi->tx_size, DCT_DCT, 0);
+ av1_block_yrd(cpi, x, mi_row, mi_col, &this_rdc, &args.skippable, bsize,
+ mi->tx_size, DCT_DCT, 0);
// TODO(kyslov@) Need to account for skippable
if (x->color_sensitivity[0]) {
av1_foreach_transformed_block_in_plane(xd, uv_bsize, 1,
@@ -2806,7 +2800,6 @@
int svc_mv_col = 0;
int svc_mv_row = 0;
int force_mv_inter_layer = 0;
- int use_modeled_non_rd_cost = 0;
bool comp_use_zero_zeromv_only = 0;
int tot_num_comp_modes = NUM_COMP_INTER_MODES_RT;
unsigned int vars[RTC_INTER_MODES][REF_FRAMES];
@@ -2923,21 +2916,6 @@
const int enable_filter_search =
is_filter_search_enabled(cpi, mi_row, mi_col, bsize, segment_id);
- // TODO(marpan): Look into reducing these conditions. For now constrain
- // it to avoid significant bdrate loss.
- if (cpi->sf.rt_sf.use_modeled_non_rd_cost) {
- if (cpi->svc.non_reference_frame)
- use_modeled_non_rd_cost = 1;
- else if (cpi->svc.number_temporal_layers > 1 &&
- cpi->svc.temporal_layer_id == 0)
- use_modeled_non_rd_cost = 0;
- else
- use_modeled_non_rd_cost =
- (quant_params->base_qindex > 120 && x->source_variance > 100 &&
- bsize <= BLOCK_16X16 && !x->content_state_sb.lighting_change &&
- x->content_state_sb.source_sad_nonrd != kHighSad);
- }
-
#if COLLECT_PICK_MODE_STAT
ms_stat.num_blocks[bsize]++;
#endif
@@ -3263,11 +3241,10 @@
}
if (use_model_yrd_large) {
model_skip_for_sb_y_large(cpi, bsize, mi_row, mi_col, x, xd, &this_rdc,
- &this_early_term, use_modeled_non_rd_cost,
- best_pickmode.best_sse, &var, var_threshold);
+ &this_early_term, 0, best_pickmode.best_sse,
+ &var, var_threshold);
} else {
- model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc, &var,
- use_modeled_non_rd_cost);
+ model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc, &var, 0);
}
if (!comp_pred) {
vars[INTER_OFFSET(this_mode)][ref_frame] = var;
@@ -3313,33 +3290,25 @@
this_rdc.rate = skip_txfm_cost;
this_rdc.dist = this_rdc.sse << 4;
} else {
- if (use_modeled_non_rd_cost) {
- if (this_rdc.skip_txfm) {
- this_rdc.rate = skip_txfm_cost;
- } else {
- this_rdc.rate += no_skip_txfm_cost;
- }
- } else {
#if COLLECT_PICK_MODE_STAT
- aom_usec_timer_start(&ms_stat.timer2);
+ aom_usec_timer_start(&ms_stat.timer2);
#endif
- av1_block_yrd(cpi, x, mi_row, mi_col, &this_rdc, &is_skippable, bsize,
- mi->tx_size, DCT_DCT, 1);
- if (this_rdc.skip_txfm ||
- RDCOST(x->rdmult, this_rdc.rate, this_rdc.dist) >=
- RDCOST(x->rdmult, 0, this_rdc.sse)) {
- if (!this_rdc.skip_txfm) {
- // Need to store "real" rdc for possible furure use if UV rdc
- // disallows tx skip
- nonskip_rdc = this_rdc;
- nonskip_rdc.rate += no_skip_txfm_cost;
- }
- this_rdc.rate = skip_txfm_cost;
- this_rdc.skip_txfm = 1;
- this_rdc.dist = this_rdc.sse;
- } else {
- this_rdc.rate += no_skip_txfm_cost;
+ av1_block_yrd(cpi, x, mi_row, mi_col, &this_rdc, &is_skippable, bsize,
+ mi->tx_size, DCT_DCT, 1);
+ if (this_rdc.skip_txfm ||
+ RDCOST(x->rdmult, this_rdc.rate, this_rdc.dist) >=
+ RDCOST(x->rdmult, 0, this_rdc.sse)) {
+ if (!this_rdc.skip_txfm) {
+ // Need to store "real" rdc for possible furure use if UV rdc
+ // disallows tx skip
+ nonskip_rdc = this_rdc;
+ nonskip_rdc.rate += no_skip_txfm_cost;
}
+ this_rdc.rate = skip_txfm_cost;
+ this_rdc.skip_txfm = 1;
+ this_rdc.dist = this_rdc.sse;
+ } else {
+ this_rdc.rate += no_skip_txfm_cost;
}
if ((x->color_sensitivity[0] || x->color_sensitivity[1])) {
RD_STATS rdc_uv;
@@ -3442,7 +3411,7 @@
best_pickmode.best_mode_skip_txfm = this_rdc.skip_txfm;
best_pickmode.best_mode_initial_skip_flag =
(nonskip_rdc.rate == INT_MAX && this_rdc.skip_txfm);
- if (!best_pickmode.best_mode_skip_txfm && !use_modeled_non_rd_cost) {
+ if (!best_pickmode.best_mode_skip_txfm) {
memcpy(best_pickmode.blk_skip, txfm_info->blk_skip,
sizeof(txfm_info->blk_skip[0]) * num_8x8_blocks);
}
@@ -3499,7 +3468,7 @@
#endif
if (!x->force_zeromv_skip)
- estimate_intra_mode(cpi, x, bsize, use_modeled_non_rd_cost, best_early_term,
+ estimate_intra_mode(cpi, x, bsize, best_early_term,
ref_costs_single[INTRA_FRAME], reuse_inter_pred,
&orig_dst, tmp, &this_mode_pred, &best_rdc,
&best_pickmode, ctx);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index c4bb054..becb2d0 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1354,6 +1354,7 @@
sf->rt_sf.reduce_mv_pel_precision = 2;
}
}
+ // SVC settings.
if (cpi->ppi->use_svc) {
// For SVC: for greater than 2 temporal layers, use better mv search on
// base temporal layers, and only on base spatial layer if highest
@@ -1376,6 +1377,14 @@
sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
}
}
+ if (speed <= 9 && cpi->svc.number_temporal_layers > 2 &&
+ cpi->svc.temporal_layer_id == 0)
+ sf->rt_sf.check_only_zero_zeromv_on_large_blocks = false;
+ else
+ sf->rt_sf.check_only_zero_zeromv_on_large_blocks = true;
+ if (cpi->svc.number_temporal_layers > 1 && cpi->svc.temporal_layer_id == 0)
+ sf->rt_sf.source_metrics_sb_nonrd = 0;
+ // Compound mode enabling.
if (cpi->svc.ref_frame_comp[0] || cpi->svc.ref_frame_comp[1] ||
cpi->svc.ref_frame_comp[2]) {
sf->rt_sf.use_comp_ref_nonrd = 1;
@@ -1388,12 +1397,8 @@
} else {
sf->rt_sf.use_comp_ref_nonrd = 0;
}
- if (speed <= 9 && cpi->svc.number_temporal_layers > 2 &&
- cpi->svc.temporal_layer_id == 0)
- sf->rt_sf.check_only_zero_zeromv_on_large_blocks = false;
- else
- sf->rt_sf.check_only_zero_zeromv_on_large_blocks = true;
}
+ // Screen settings.
if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) {
// TODO(marpan): Check settings for speed 7 and 8.
if (speed >= 9) {
@@ -1406,11 +1411,13 @@
sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
sf->rt_sf.reduce_mv_pel_precision = 2;
sf->rt_sf.reduce_zeromv_mvres = true;
+ sf->rt_sf.screen_content_cdef_filter_qindex_thresh = 20;
}
if (speed >= 10) {
if (cm->width * cm->height > 1920 * 1080)
sf->part_sf.disable_8x8_part_based_on_qidx = 1;
sf->rt_sf.set_zeromv_skip_based_on_source_sad = 2;
+ sf->rt_sf.screen_content_cdef_filter_qindex_thresh = 80;
}
sf->rt_sf.skip_cdef_sb = 1;
sf->rt_sf.use_rtc_tf = 0;
@@ -1432,8 +1439,6 @@
}
sf->rt_sf.partition_direct_merging = 0;
}
- if (cpi->svc.number_temporal_layers > 1 && cpi->svc.temporal_layer_id == 0)
- sf->rt_sf.source_metrics_sb_nonrd = 0;
}
// TODO(kyslov): now this is very similar to
@@ -1704,7 +1709,6 @@
if (speed >= 9) {
sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->rt_sf.sse_early_term_inter_search = EARLY_TERM_IDX_3;
- sf->rt_sf.screen_content_cdef_filter_qindex_thresh = 20;
sf->rt_sf.estimate_motion_for_var_based_partition = 0;
sf->rt_sf.prefer_large_partition_blocks = 3;
sf->rt_sf.skip_intra_pred = 2;
@@ -1732,7 +1736,6 @@
sf->rt_sf.var_part_split_threshold_shift = 10;
sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
sf->rt_sf.reduce_mv_pel_precision = 2;
- sf->rt_sf.screen_content_cdef_filter_qindex_thresh = 80;
}
}
@@ -2021,7 +2024,6 @@
rt_sf->use_comp_ref_nonrd = 0;
rt_sf->use_real_time_ref_set = 0;
rt_sf->short_circuit_low_temp_var = 0;
- rt_sf->use_modeled_non_rd_cost = 0;
rt_sf->reuse_inter_pred_nonrd = 0;
rt_sf->num_inter_modes_for_tx_search = INT_MAX;
rt_sf->use_nonrd_filter_search = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 0015f1c..64e2b6c 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1423,9 +1423,6 @@
// temporal variance.
int short_circuit_low_temp_var;
- // Use modeled (currently CurvFit model) RDCost for fast non-RD mode
- int use_modeled_non_rd_cost;
-
// Reuse inter prediction in fast non-rd mode.
int reuse_inter_pred_nonrd;