Enable ml_early_term_after_part_split for speed 0 This affects low and mid resolutions. Coding loss(%): lowres 0.04% midres 0.01% Speed gains(%): lowres 7.0% midres 6.7% STATS_CHANGED for speed 0 only Change-Id: I24d9f64454319f66b2f1f063031808684ec456ac
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index b2b4a6a..544cec4 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -2968,15 +2968,16 @@ restore_context(x, &x_ctx, mi_row, mi_col, bsize, num_planes); } // if (do_split) - if (cpi->sf.ml_early_term_after_part_split && !frame_is_intra_only(cm) && - !terminate_partition_search && do_rectangular_split && + if (cpi->sf.ml_early_term_after_part_split_level && + !frame_is_intra_only(cm) && !terminate_partition_search && + do_rectangular_split && (partition_horz_allowed || partition_vert_allowed)) { av1_ml_early_term_after_split(cpi, x, pc_tree, bsize, best_rdc.rdcost, part_none_rd, part_split_rd, split_rd, mi_row, mi_col, &terminate_partition_search); } - if (!cpi->sf.ml_early_term_after_part_split && + if (!cpi->sf.ml_early_term_after_part_split_level && cpi->sf.ml_prune_rect_partition && !frame_is_intra_only(cm) && (partition_horz_allowed || partition_vert_allowed) && !(prune_horz || prune_vert) && !terminate_partition_search) {
diff --git a/av1/encoder/partition_strategy.c b/av1/encoder/partition_strategy.c index 695a80e..b379218 100644 --- a/av1/encoder/partition_strategy.c +++ b/av1/encoder/partition_strategy.c
@@ -899,6 +899,9 @@ } if (!nn_config) return; + // Use more conservative threshold for level 1. + if (cpi->sf.ml_early_term_after_part_split_level < 2) thresh -= 0.3f; + const MACROBLOCKD *const xd = &x->e_mbd; const int dc_q = av1_dc_quant_QTX(x->qindex, 0, xd->bd) >> (xd->bd - 8); const int bs = block_size_wide[bsize];
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index 66d47e8..e3eb193 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -114,6 +114,7 @@ sf->ml_partition_search_breakout_thresh[2] = 300; // BLOCK_32X32 sf->ml_partition_search_breakout_thresh[3] = 500; // BLOCK_64X64 sf->ml_partition_search_breakout_thresh[4] = -1; // BLOCK_128X128 + sf->ml_early_term_after_part_split_level = 1; } if (is_720p_or_larger && speed >= CONFIG_2PASS_PARTITION_SEARCH_LVL_START && @@ -143,7 +144,7 @@ // TODO(chiyotsai@google.com): Try to disable two pass partition search // and turn on hdres sf->simple_motion_search_split_speed = 1; - sf->ml_early_term_after_part_split = 1; + sf->ml_early_term_after_part_split_level = 2; } } @@ -172,7 +173,7 @@ if (speed >= 3) { sf->simple_motion_search_split_speed = 2; - sf->ml_early_term_after_part_split = 0; + sf->ml_early_term_after_part_split_level = 0; if (is_720p_or_larger) { sf->partition_search_breakout_dist_thr = (1 << 25); sf->partition_search_breakout_rate_thr = 200; @@ -765,7 +766,7 @@ sf->ml_prune_rect_partition = 0; sf->ml_prune_ab_partition = 0; sf->ml_prune_4_partition = 0; - sf->ml_early_term_after_part_split = 0; + sf->ml_early_term_after_part_split_level = 0; sf->fast_cdef_search = 0; for (i = 0; i < PARTITION_BLOCK_SIZES; ++i) { sf->ml_partition_search_breakout_thresh[i] = -1; // -1 means not enabled.
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index e82f3d9..1cc1b82 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -386,8 +386,9 @@ int ml_prune_4_partition; // Use a ML model to adaptively terminate partition search after trying - // PARTITION_SPLIT. - int ml_early_term_after_part_split; + // PARTITION_SPLIT. Can take values 0 - 2, 0 meaning not being enabled, and + // 1 - 2 increasing aggressiveness in order. + int ml_early_term_after_part_split_level; int fast_cdef_search;