Reduce encode_time on slide change for non_reference_frame
For rtc-screen: for slide changes that occur on a non_reference frame
(i.e, top temporal enhancement layer frames): add a speed feature to
skip encode the frame. This option is currently set as default.
Regardless of this option: adjust some speed features and turn off
palette to significantly reduce the encode_time spike for that frame,
if it's not skip encoded.
Change-Id: I70cefdfa7d158fd53e8c4720c7266fdd24fe9635
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 45d81aa..317d5c7 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2494,7 +2494,8 @@
return true;
// For screen content: skip mode testing based on source_sad.
- if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) {
+ if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN &&
+ !x->force_zeromv_skip_for_blk) {
// If source_sad is computed: skip non-zero motion
// check for stationary (super)blocks. Otherwise if superblock
// has motion skip the modes with zero motion on last reference
@@ -3113,6 +3114,34 @@
}
}
+static AOM_INLINE bool enable_palette(AV1_COMP *cpi, bool is_mode_intra,
+ BLOCK_SIZE bsize,
+ unsigned int source_variance,
+ int force_zeromv_skip,
+ int skip_idtx_palette,
+ int force_palette_test) {
+ if (!cpi->oxcf.tool_cfg.enable_palette) return false;
+ if (!av1_allow_palette(cpi->common.features.allow_screen_content_tools,
+ bsize)) {
+ return false;
+ }
+ if (skip_idtx_palette) return false;
+
+ if (cpi->sf.rt_sf.prune_palette_search_nonrd > 1 &&
+ ((cpi->rc.high_source_sad && cpi->ppi->rtc_ref.non_reference_frame) ||
+ bsize > BLOCK_16X16)) {
+ return false;
+ }
+
+ if ((is_mode_intra || force_palette_test) && source_variance > 0 &&
+ !force_zeromv_skip &&
+ (cpi->rc.high_source_sad || source_variance > 300)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
/*!\brief AV1 inter mode selection based on Non-RD optimized model.
*
* \ingroup nonrd_mode_search
@@ -3468,18 +3497,9 @@
x->content_state_sb.source_sad_nonrd != kZeroSad &&
!cpi->rc.high_source_sad;
- int try_palette =
- !skip_idtx_palette && cpi->oxcf.tool_cfg.enable_palette &&
- av1_allow_palette(cpi->common.features.allow_screen_content_tools,
- mi->bsize);
- try_palette =
- try_palette &&
- (is_mode_intra(best_pickmode->best_mode) || force_palette_test) &&
- x->source_variance > 0 && !x->force_zeromv_skip_for_blk &&
- (cpi->rc.high_source_sad || x->source_variance > 300);
-
- if (rt_sf->prune_palette_search_nonrd > 1 && bsize > BLOCK_16X16)
- try_palette = 0;
+ bool try_palette = enable_palette(
+ cpi, is_mode_intra(best_pickmode->best_mode), bsize, x->source_variance,
+ x->force_zeromv_skip_for_blk, skip_idtx_palette, force_palette_test);
// Perform screen content mode evaluation for non-rd
handle_screen_content_mode_nonrd(
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index a788af8..a65ac30 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1592,6 +1592,7 @@
sf->rt_sf.prune_h_pred_using_best_mode_so_far = true;
sf->rt_sf.enable_intra_mode_pruning_using_neighbors = true;
}
+ sf->rt_sf.skip_encoding_non_reference_slide_change = 1;
sf->rt_sf.skip_newmv_flat_blocks_screen = 1;
sf->rt_sf.use_idtx_nonrd = 1;
sf->rt_sf.higher_thresh_scene_detection = 0;
@@ -1616,6 +1617,12 @@
sf->mv_sf.search_method = NSTEP;
sf->rt_sf.fullpel_search_step_param = 2;
}
+ if (cpi->rc.high_source_sad && cpi->ppi->rtc_ref.non_reference_frame) {
+ sf->rt_sf.use_idtx_nonrd = 0;
+ sf->rt_sf.prefer_large_partition_blocks = 1;
+ sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
+ sf->rt_sf.fullpel_search_step_param = 10;
+ }
sf->rt_sf.partition_direct_merging = 0;
sf->hl_sf.accurate_bit_estimate = 0;
// This feature is for nonrd_pickmode.
@@ -2311,6 +2318,7 @@
rt_sf->force_only_last_ref = 0;
rt_sf->higher_thresh_scene_detection = 1;
rt_sf->skip_newmv_flat_blocks_screen = 0;
+ rt_sf->skip_encoding_non_reference_slide_change = 0;
}
static fractional_mv_step_fp
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 77e6622..c768ff3 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1916,6 +1916,9 @@
// FLag to indicate skip testing of NEWMV for flat blocks.
int skip_newmv_flat_blocks_screen;
+
+ // Flag to force skip encoding for non_reference_frame on slide/scene changes.
+ int skip_encoding_non_reference_slide_change;
} REAL_TIME_SPEED_FEATURES;
/*!\endcond */
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index f664795..2c9772d 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -27,6 +27,7 @@
#include "av1/common/blockd.h"
#include "av1/encoder/encodeframe.h"
+#include "av1/encoder/encodeframe_utils.h"
#include "av1/encoder/var_based_part.h"
#include "av1/encoder/reconinter_enc.h"
#include "av1/encoder/rdopt_utils.h"
@@ -1620,6 +1621,17 @@
unsigned int y_sad_last = UINT_MAX;
BLOCK_SIZE bsize = is_small_sb ? BLOCK_64X64 : BLOCK_128X128;
+ // Force skip encoding for all superblocks on slide change for
+ // non_reference_frames.
+ if (cpi->sf.rt_sf.skip_encoding_non_reference_slide_change &&
+ cpi->rc.high_source_sad && cpi->ppi->rtc_ref.non_reference_frame) {
+ MB_MODE_INFO **mi = cm->mi_params.mi_grid_base +
+ get_mi_grid_idx(&cm->mi_params, mi_row, mi_col);
+ av1_set_fixed_partitioning(cpi, tile, mi, mi_row, mi_col, bsize);
+ x->force_zeromv_skip_for_sb = 1;
+ return 0;
+ }
+
// Ref frame used in partitioning.
MV_REFERENCE_FRAME ref_frame_partition = LAST_FRAME;