AV1 RT: Introduce speed 9
With this change speed 9 gived overall 5.8% BDRate decrease (4% on low
bitrates) with 30-45% speed up comparing to speed 8.
one rtc (midres) set the BDRate decrease is 14%
Change-Id: I1e53e963c410a7a3ccd284acf128e6e4c2ed61be
diff --git a/apps/aomenc.c b/apps/aomenc.c
index 3863c8a..432009f 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -408,7 +408,7 @@
#if CONFIG_AV1_ENCODER
static const arg_def_t cpu_used_av1 =
ARG_DEF(NULL, "cpu-used", 1,
- "Speed setting (0..6 in good mode, 6..8 in realtime mode)");
+ "Speed setting (0..6 in good mode, 6..9 in realtime mode)");
static const arg_def_t rowmtarg =
ARG_DEF(NULL, "row-mt", 1,
"Enable row based multi-threading (0: off, 1: on (default))");
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index faa7999..712a0eb 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -423,7 +423,7 @@
RANGE_CHECK_HI(extra_cfg, ext_tile_debug, 1);
RANGE_CHECK_HI(extra_cfg, enable_auto_alt_ref, 1);
RANGE_CHECK_HI(extra_cfg, enable_auto_bwd_ref, 2);
- RANGE_CHECK(extra_cfg, cpu_used, 0, 8);
+ RANGE_CHECK(extra_cfg, cpu_used, 0, 9);
RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6);
RANGE_CHECK(extra_cfg, superblock_size, AOM_SUPERBLOCK_SIZE_64X64,
AOM_SUPERBLOCK_SIZE_DYNAMIC);
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index af5f16b..3d45e27 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -1621,7 +1621,9 @@
const int mode_rd_thresh = rd_threshes[mode_index];
// Only check DC for blocks >= 32X32.
- if (this_mode > 0 && bsize >= BLOCK_32X32) continue;
+ if (this_mode > 0 &&
+ (bsize >= BLOCK_32X32 || cpi->sf.rt_sf.nonrd_intra_dc_only))
+ continue;
if (rd_less_than_thresh(best_rdc->rdcost, mode_rd_thresh,
rd_thresh_freq_fact[mode_index]) &&
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8f66b60..e495d7e 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -279,6 +279,9 @@
sf->rt_sf.use_modeled_non_rd_cost = 0;
sf->rt_sf.use_nonrd_filter_search = 0;
}
+ if (speed >= 9) {
+ sf->rt_sf.use_modeled_non_rd_cost = 1;
+ }
}
if (!is_480p_or_larger) {
if (speed == 7) {
@@ -286,9 +289,12 @@
}
if (speed >= 8) {
sf->mv_sf.subpel_search_method = SUBPEL_TREE;
-
sf->rt_sf.estimate_motion_for_var_based_partition = 1;
}
+ if (speed >= 9) {
+ sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED;
+ sf->rt_sf.estimate_motion_for_var_based_partition = 0;
+ }
}
}
@@ -903,6 +909,10 @@
sf->rt_sf.skip_intra_pred_if_tx_skip = 0;
sf->interp_sf.cb_pred_filter_search = 1;
}
+ if (speed >= 9) {
+ sf->rt_sf.force_large_partition_blocks = 1;
+ sf->rt_sf.nonrd_intra_dc_only = 1;
+ }
}
static AOM_INLINE void init_hl_sf(HIGH_LEVEL_SPEED_FEATURES *hl_sf) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 44910e7..2798fce 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -973,6 +973,12 @@
// Check for scene/content change detection on every frame before encoding.
int check_scene_detection;
+
+ // Forces larger partition blocks in variance based partitioning
+ int force_large_partition_blocks;
+
+ // Only checks intra DCPRED mode in nonrd_pick_inter_mode
+ int nonrd_intra_dc_only;
} REAL_TIME_SPEED_FEATURES;
typedef struct SPEED_FEATURES {
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index b3fc0e3..4b94a29 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -403,6 +403,11 @@
} else {
thresholds[2] = (5 * threshold_base) >> 1;
}
+ if (cpi->sf.rt_sf.force_large_partition_blocks) {
+ thresholds[1] <<= 2;
+ thresholds[2] <<= 3;
+ thresholds[3] <<= 2;
+ }
}
}