AV1 RT: Implement extra pruning of warped motion
1.2% worse quality on speed 6 comparing to default warped motion
(with warped motion ON) and 32% faster
Change-Id: Ia8c63d848c1ce4b3e711d672d30f9d275de5250b
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 15648d9..7eb4db5 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2304,7 +2304,10 @@
if (sf->part_sf.partition_search_type == VAR_BASED_PARTITION)
variance_partition_alloc(cpi);
- if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);
+ if (cm->current_frame.frame_type == KEY_FRAME ||
+ ((sf->inter_sf.extra_prune_warped &&
+ cm->current_frame.refresh_frame_flags & (1 << GOLDEN_FRAME))))
+ copy_frame_prob_info(cpi);
#if CONFIG_COLLECT_COMPONENT_TIMING
printf("\n Encoding a frame:");
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 58c5925..39b8ffa 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1167,12 +1167,10 @@
return 0;
}
-static INLINE void update_mode_start_end_index(const AV1_COMP *const cpi,
- int *mode_index_start,
- int *mode_index_end,
- int last_motion_mode_allowed,
- int interintra_allowed,
- int eval_motion_mode) {
+static INLINE void update_mode_start_end_index(
+ const AV1_COMP *const cpi, const MB_MODE_INFO *const mbmi,
+ int *mode_index_start, int *mode_index_end, int last_motion_mode_allowed,
+ int interintra_allowed, int eval_motion_mode) {
*mode_index_start = (int)SIMPLE_TRANSLATION;
*mode_index_end = (int)last_motion_mode_allowed + interintra_allowed;
if (cpi->sf.winner_mode_sf.motion_mode_for_winner_cand) {
@@ -1184,6 +1182,8 @@
*mode_index_start = 1;
}
}
+ if (cpi->sf.inter_sf.extra_prune_warped && mbmi->bsize > BLOCK_16X16)
+ *mode_index_end = SIMPLE_TRANSLATION;
}
/*!\brief AV1 motion mode search
@@ -1328,7 +1328,7 @@
// if SIMPLE_TRANSLATION has already been searched according to
// the motion_mode_for_winner_cand speed feature, update the mode_index_start
// to avoid searching it again.
- update_mode_start_end_index(cpi, &mode_index_start, &mode_index_end,
+ update_mode_start_end_index(cpi, mbmi, &mode_index_start, &mode_index_end,
last_motion_mode_allowed, interintra_allowed,
eval_motion_mode);
// Main function loop. This loops over all of the possible motion modes and
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index d1bb672..5bf7aec 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1435,6 +1435,8 @@
sf->mv_sf.use_fullpel_costlist = 1;
sf->tx_sf.tx_type_search.fast_inter_tx_type_prob_thresh = 0;
+ sf->inter_sf.prune_warped_prob_thresh = 8;
+ sf->inter_sf.extra_prune_warped = 1;
}
if (speed >= 7) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 1d7096b..77de5cc 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -915,6 +915,9 @@
// Cap the no. of txfm searches for a given prediction mode.
// 0: no cap, 1: cap beyond first 4 searches, 2: cap beyond first 3 searches.
int limit_txfm_eval_per_mode;
+
+ // Prune warped motion search based on block size.
+ int extra_prune_warped;
} INTER_MODE_SPEED_FEATURES;
typedef struct INTERP_FILTER_SPEED_FEATURES {