Extend prune_nearmv_using_neighbors to speed 5
Extended speed feature prune_nearmv_using_neighbors
to speed 5
cpu-used Instruction Count BD-Rate Loss(%)
Reduction(%) avg.psnr ovr.psnr ssim
5 1.373 0.1141 0.1192 0.1211
STATS_CHANGED
Change-Id: Ibe43c06fa06695162100f550a1372ddb2e5ec1e6
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 82ed80f..4db0abe 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -4065,8 +4065,17 @@
const MACROBLOCKD *const xd = &x->e_mbd;
if (search_state->best_rd != INT64_MAX && xd->left_available &&
xd->up_available) {
+ const int thresholds[PRUNE_NEARMV_MAX][3] = { { 1, 0, 0 },
+ { 1, 1, 0 },
+ { 2, 1, 0 } };
+ const int qindex_sub_range = x->qindex * 3 / QINDEX_RANGE;
+
+ assert(sf->inter_sf.prune_nearmv_using_neighbors <= PRUNE_NEARMV_MAX &&
+ qindex_sub_range < 3);
const int num_ref_frame_pair_match_thresh =
- 2 - (x->qindex * 3 / QINDEX_RANGE);
+ thresholds[sf->inter_sf.prune_nearmv_using_neighbors - 1]
+ [qindex_sub_range];
+
assert(num_ref_frame_pair_match_thresh <= 2 &&
num_ref_frame_pair_match_thresh >= 0);
int num_ref_frame_pair_match = 0;
@@ -4075,10 +4084,7 @@
num_ref_frame_pair_match +=
match_ref_frame_pair(xd->above_mbmi, ref_frame);
- // Prune modes if:
- // num_ref_frame_pair_match < 2 for qindex 0 to 85
- // num_ref_frame_pair_match < 1 for qindex 86 to 170
- // No pruning for qindex 171 to 255
+ // Pruning based on ref frame pair match with neighbors.
if (num_ref_frame_pair_match < num_ref_frame_pair_match_thresh) return 1;
}
}
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index dc48b16..2711760 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -734,9 +734,16 @@
sf->tx_sf.tx_type_search.fast_inter_tx_type_prob_thresh =
boosted ? INT_MAX : 250;
}
+
+ if (is_480p_or_lesser) {
+ sf->inter_sf.prune_nearmv_using_neighbors = PRUNE_NEARMV_LEVEL1;
+ } else {
+ sf->inter_sf.prune_nearmv_using_neighbors = PRUNE_NEARMV_LEVEL2;
+ }
}
if (speed >= 6) {
+ sf->inter_sf.prune_nearmv_using_neighbors = PRUNE_NEARMV_LEVEL3;
if (is_720p_or_larger) {
sf->part_sf.auto_max_partition_based_on_simple_motion = NOT_IN_USE;
} else if (is_480p_or_larger) {
@@ -1128,7 +1135,6 @@
sf->hl_sf.recode_tolerance = 55;
sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 3;
- sf->inter_sf.prune_nearmv_using_neighbors = 1;
sf->inter_sf.selective_ref_frame = 6;
sf->inter_sf.prune_ext_comp_using_neighbors = 3;
@@ -1342,7 +1348,7 @@
sf->inter_sf.adaptive_rd_thresh = 4;
sf->inter_sf.txfm_rd_gate_level = boosted ? 0 : 4;
sf->inter_sf.prune_inter_modes_if_skippable = 1;
- sf->inter_sf.prune_nearmv_using_neighbors = 1;
+ sf->inter_sf.prune_nearmv_using_neighbors = PRUNE_NEARMV_LEVEL3;
sf->inter_sf.reduce_inter_modes = boosted ? 1 : 3;
sf->inter_sf.skip_newmv_in_drl = 4;
@@ -1639,7 +1645,7 @@
inter_sf->coeff_cost_upd_level = INTERNAL_COST_UPD_SB;
inter_sf->mode_cost_upd_level = INTERNAL_COST_UPD_SB;
inter_sf->prune_inter_modes_based_on_tpl = 0;
- inter_sf->prune_nearmv_using_neighbors = 0;
+ inter_sf->prune_nearmv_using_neighbors = PRUNE_NEARMV_OFF;
inter_sf->prune_comp_search_by_single_result = 0;
inter_sf->skip_repeated_ref_mv = 0;
inter_sf->skip_newmv_in_drl = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index c285276..831f164 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -221,6 +221,14 @@
MULTI_WINNER_MODE_DEFAULT = 2,
} UENUM1BYTE(MULTI_WINNER_MODE_TYPE);
+enum {
+ PRUNE_NEARMV_OFF = 0, // Turn off nearmv pruning
+ PRUNE_NEARMV_LEVEL1 = 1, // Prune nearmv for qindex (0-85)
+ PRUNE_NEARMV_LEVEL2 = 2, // Prune nearmv for qindex (0-170)
+ PRUNE_NEARMV_LEVEL3 = 3, // Prune nearmv more aggressively for qindex (0-170)
+ PRUNE_NEARMV_MAX = PRUNE_NEARMV_LEVEL3,
+} UENUM1BYTE(PRUNE_NEARMV_LEVEL);
+
typedef struct {
TX_TYPE_PRUNE_MODE prune_2d_txfm_mode;
int fast_intra_tx_type_search;
@@ -856,7 +864,7 @@
// Skip NEARMV and NEAR_NEARMV modes using ref frames of above and left
// neighbor blocks and qindex.
- int prune_nearmv_using_neighbors;
+ PRUNE_NEARMV_LEVEL prune_nearmv_using_neighbors;
// Model based breakout after interpolation filter search
// 0: no breakout