rtc: Updates/fixes for temporal layers
Increase the motion search for the base temporal (TL0)
layers (every 4 frames for 3 temporal layers). This
leads to quality increase with slowdown. To offset the
slowdown, for the non_reference_frames (TL2): increase
the base partition threshold and adjust motion search
parameter (use prune_more and max step_size).
Add rt speed flag to directly set/control the step_param
in nonrd_pickmode.
For 3 temporal layers at speed 7: avg. bdrate gains of
~2% on rtc set (max 8%), with ~3% slowdown.
Change-Id: I735c566e7f82af6ac77a0894fed51e22d9506251
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 678658c..6dab777 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -148,7 +148,9 @@
const int num_planes = av1_num_planes(cm);
MB_MODE_INFO *mi = xd->mi[0];
struct buf_2d backup_yv12[MAX_MB_PLANE] = { { 0, 0, 0, 0, 0 } };
- int step_param = cpi->mv_search_params.mv_step_param;
+ int step_param = (cpi->sf.rt_sf.fullpel_search_step_param)
+ ? cpi->sf.rt_sf.fullpel_search_step_param
+ : cpi->mv_search_params.mv_step_param;
FULLPEL_MV start_mv;
const int ref = mi->ref_frame[0];
const MV ref_mv = av1_get_ref_mv(x, mi->ref_mv_idx).as_mv;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index a15091c..3aaf66d 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -695,6 +695,7 @@
sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
sf->tx_sf.model_based_prune_tx_search_level = 1;
sf->tx_sf.tx_type_search.use_reduced_intra_txset = 1;
+ sf->rt_sf.fullpel_search_step_param = 0;
if (speed >= 1) {
sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
@@ -898,6 +899,21 @@
sf->rt_sf.nonrd_check_partition_split = 0;
sf->rt_sf.hybrid_intra_pickmode = 1;
sf->rt_sf.skip_intra_pred_if_tx_skip = 1;
+ // For SVC: use better mv search on base temporal layer, and only
+ // on base spatial layer if highest resolution is above 640x360.
+ if (cpi->svc.number_temporal_layers > 1) {
+ if (cpi->svc.temporal_layer_id == 0 &&
+ (cpi->svc.spatial_layer_id == 0 ||
+ cpi->oxcf.frm_dim_cfg.width * cpi->oxcf.frm_dim_cfg.height <=
+ 640 * 360)) {
+ sf->mv_sf.search_method = NSTEP;
+ sf->mv_sf.subpel_search_method = SUBPEL_TREE;
+ sf->rt_sf.fullpel_search_step_param = 6;
+ } else if (cpi->svc.non_reference_frame) {
+ sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
+ sf->rt_sf.fullpel_search_step_param = 10;
+ }
+ }
}
if (speed >= 8) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 6be4587..39440c7 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -998,6 +998,12 @@
// uses results of temporal noise estimate
int use_temporal_noise_estimate;
+
+ // Parameter indicating initial search window to be used in full-pixel search
+ // for nonrd_pickmode. Range [0, MAX_MVSEARCH_STEPS - 1]. Lower value
+ // indicates larger window. If set to 0, step_param is set based on internal
+ // logic in set_mv_search_params().
+ int fullpel_search_step_param;
} REAL_TIME_SPEED_FEATURES;
/*!\endcond */
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index 54de8fb..10e9fe2 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -326,16 +326,19 @@
}
// TODO(kyslov) Bring back threshold adjustment based on content state
-static int64_t scale_part_thresh_sumdiff(int64_t threshold_base, int speed,
+static int64_t scale_part_thresh_content(int64_t threshold_base, int speed,
int width, int height,
- int content_state) {
+ int content_state,
+ int non_reference_frame) {
(void)width;
(void)height;
(void)content_state;
+ int64_t threshold = threshold_base;
+ if (non_reference_frame) threshold = (3 * threshold) >> 1;
if (speed >= 8) {
- return (5 * threshold_base) >> 2;
+ return (5 * threshold) >> 2;
}
- return threshold_base;
+ return threshold;
}
static AOM_INLINE void set_vbp_thresholds(AV1_COMP *cpi, int64_t thresholds[],
@@ -366,8 +369,9 @@
}
// Increase base variance threshold based on content_state/sum_diff level.
- threshold_base = scale_part_thresh_sumdiff(
- threshold_base, cpi->oxcf.speed, cm->width, cm->height, content_state);
+ threshold_base = scale_part_thresh_content(
+ threshold_base, cpi->oxcf.speed, cm->width, cm->height, content_state,
+ cpi->svc.non_reference_frame);
thresholds[0] = threshold_base >> 1;
thresholds[1] = threshold_base;