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;