Allintra: Extend sf dc_blk_pred_level to allintra speed>=6
The speed feature dc_blk_pred_level determines if a block should
be coded as transform skip or dc only block based on residual
statistics. In this CL, the speed feature is extended to allintra
speed>=6 by introducing intermediate levels to the speed feature
and predict_dc_levels to check if the block should be coded as
transform skip. The existing speed feature levels 1 and 2 become
levels 2 and 3 and the existing level 1 of predict_dc_levels
becomes level 2.
For AVIF still-image encode,
Encode Time BD-Rate Loss(%)
cpu-used Reduction(%) psnr ssim
6 1.012 0.0827 0.0936
STATS_CHANGED
Change-Id: I017175e10d730d2f2bdb9945b44ff8a24c003c86
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 434a20b..46a56a5 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -448,7 +448,12 @@
TX_MODE tx_mode_search_type;
/*!
- * Flag to enable/disable DC block prediction.
+ * Determines whether a block can be predicted as transform skip or DC only
+ * based on residual mean and variance.
+ * Type 0 : No skip block or DC only block prediction
+ * Type 1 : Prediction of skip block based on residual mean and variance
+ * Type 2 : Prediction of skip block or DC only block based on residual mean
+ * and variance
*/
unsigned int predict_dc_level;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 221e9d6..b43f80f 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -119,15 +119,21 @@
{ 1, 1, 1 },
{ 1, 2, 1 } };
-// Predict DC block levels to be used for default, mode and winner mode
-// evaluation. Index 0: Default mode evaluation, Winner mode processing is not
-// applicable. Index 1: Mode evaluation, Index 2: Winner mode evaluation
-// Values indicate the aggressiveness of skip flag prediction.
-// 0 : no early DC block prediction
-// 1 : Early DC block prediction based on error variance
-static unsigned int predict_dc_levels[3][MODE_EVAL_TYPES] = { { 0, 0, 0 },
- { 1, 1, 0 },
- { 1, 1, 1 } };
+// Predict skip or DC block level used during transform type search. It is
+// indexed using the following:
+// First index : Speed feature 'dc_blk_pred_level' (0 to 3)
+// Second index : Mode evaluation type (DEFAULT_EVAL, MODE_EVAL and
+// WINNER_MODE_EVAL).
+//
+// The values of predict_dc_levels[][] indicate the aggressiveness of predicting
+// a block as transform skip or DC only.
+// Type 0 : No skip block or DC only block prediction
+// Type 1 : Prediction of skip block based on residual mean and variance
+// Type 2 : Prediction of skip block or DC only block based on residual mean and
+// variance
+static unsigned int predict_dc_levels[4][MODE_EVAL_TYPES] = {
+ { 0, 0, 0 }, { 1, 1, 0 }, { 2, 2, 0 }, { 2, 2, 2 }
+};
#if !CONFIG_FPMT_TEST
// This table holds the maximum number of reference frames for global motion.
@@ -512,6 +518,7 @@
sf->winner_mode_sf.multi_winner_mode_type = MULTI_WINNER_MODE_OFF;
sf->winner_mode_sf.prune_winner_mode_eval_level = 1;
+ sf->winner_mode_sf.dc_blk_pred_level = 1;
}
// The following should make all-intra mode speed 7 approximately equal
// to real-time speed 6,
@@ -1160,7 +1167,7 @@
sf->winner_mode_sf.multi_winner_mode_type =
frame_is_intra_only(&cpi->common) ? MULTI_WINNER_MODE_DEFAULT
: MULTI_WINNER_MODE_OFF;
- sf->winner_mode_sf.dc_blk_pred_level = boosted ? 0 : 1;
+ sf->winner_mode_sf.dc_blk_pred_level = boosted ? 0 : 2;
sf->lpf_sf.lpf_pick = LPF_PICK_FROM_FULL_IMAGE_NON_DUAL;
}
@@ -1195,7 +1202,7 @@
sf->tpl_sf.subpel_force_stop = FULL_PEL;
sf->tpl_sf.gop_length_decision_method = 2;
- sf->winner_mode_sf.dc_blk_pred_level = 1;
+ sf->winner_mode_sf.dc_blk_pred_level = 2;
sf->fp_sf.disable_recon = 1;
}
@@ -1233,7 +1240,7 @@
sf->rd_sf.perform_coeff_opt = is_boosted_arf2_bwd_type ? 6 : 8;
- sf->winner_mode_sf.dc_blk_pred_level = 2;
+ sf->winner_mode_sf.dc_blk_pred_level = 3;
sf->winner_mode_sf.multi_winner_mode_type = MULTI_WINNER_MODE_OFF;
sf->fp_sf.skip_zeromv_motion_search = 1;
@@ -1536,7 +1543,7 @@
sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH_LVL4;
sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
- sf->winner_mode_sf.dc_blk_pred_level = frame_is_intra_only(cm) ? 0 : 2;
+ sf->winner_mode_sf.dc_blk_pred_level = frame_is_intra_only(cm) ? 0 : 3;
sf->winner_mode_sf.enable_winner_mode_for_tx_size_srch = 1;
sf->winner_mode_sf.tx_size_search_level = 1;
sf->winner_mode_sf.winner_mode_ifs = 1;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 19b190a4..c55202d 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1293,9 +1293,11 @@
// 1 / 2 : Use configured number of winner candidates
int motion_mode_for_winner_cand;
- // Early DC only txfm block prediction
- // 0: speed feature OFF
- // 1 / 2 : Use the configured level for different modes
+ // Controls the prediction of transform skip block or DC only block.
+ //
+ // Different speed feature values (0 to 3) decide the aggressiveness of
+ // prediction (refer to predict_dc_levels[][] in speed_features.c) to be used
+ // during different mode evaluation stages.
int dc_blk_pred_level;
// If on, disables interpolation filter search in handle_inter_mode loop, and
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c
index 0774ec7..ea0288b 100644
--- a/av1/encoder/tx_search.c
+++ b/av1/encoder/tx_search.c
@@ -1969,10 +1969,14 @@
uint64_t var_threshold = (uint64_t)(1.8 * qstep * qstep);
if (is_cur_buf_hbd(xd))
block_var = ROUND_POWER_OF_TWO(block_var, (xd->bd - 8) * 2);
- // Early prediction of skip block if residual mean and variance are less
+
+ if (block_var >= var_threshold) return;
+ const unsigned int predict_dc_level = x->txfm_search_params.predict_dc_level;
+ assert(predict_dc_level != 0);
+
+ // Prediction of skip block if residual mean and variance are less
// than qstep based threshold
- if (((llabs(*per_px_mean) * dc_coeff_scale[tx_size]) < (dc_qstep << 12)) &&
- (block_var < var_threshold)) {
+ if ((llabs(*per_px_mean) * dc_coeff_scale[tx_size]) < (dc_qstep << 12)) {
// If the normalized mean of residual block is less than the dc qstep and
// the normalized block variance is less than ac qstep, then the block is
// assumed to be a skip block and its rdcost is updated accordingly.
@@ -2003,9 +2007,9 @@
RDCOST(x->rdmult, best_rd_stats->rate, best_rd_stats->sse);
x->plane[plane].txb_entropy_ctx[block] = 0;
- } else if (block_var < var_threshold) {
+ } else if (predict_dc_level > 1) {
// Predict DC only blocks based on residual variance.
- // For chroma plane, this early prediction is disabled for intra blocks.
+ // For chroma plane, this prediction is disabled for intra blocks.
if ((plane == 0) || (plane > 0 && is_inter_block(mbmi))) *dc_only_blk = 1;
}
}
@@ -2055,7 +2059,7 @@
unsigned int block_mse_q8;
int dc_only_blk = 0;
const bool predict_dc_block =
- txfm_params->predict_dc_level && txw != 64 && txh != 64;
+ txfm_params->predict_dc_level >= 1 && txw != 64 && txh != 64;
int64_t per_px_mean = INT64_MAX;
if (predict_dc_block) {
predict_dc_only_block(x, plane, plane_bsize, tx_size, block, blk_row,