Add speed feature to reduce wiener_win size
This patch will introduce a speed feature to reduce window
size of wiener filter search for all frames except boosted
frames. This speed feature is enabled for preset 4 and above.
Quality drop(AWCY)
Preset Cb Cr Overall Encode time reduction
4 0.07% 0.06% 0.05% 2.85%
Encode time is averaged across multiple test cases
STATS_CHANGED
Change-Id: I9f5716e0e8baa064b2ca255fac3c22fbaac1b249
diff --git a/av1/common/restoration.h b/av1/common/restoration.h
index 6d6ba37..81ad3ba 100644
--- a/av1/common/restoration.h
+++ b/av1/common/restoration.h
@@ -122,6 +122,7 @@
// If WIENER_WIN_CHROMA == WIENER_WIN - 2, that implies 5x5 filters are used for
// chroma. To use 7x7 for chroma set WIENER_WIN_CHROMA to WIENER_WIN.
#define WIENER_WIN_CHROMA (WIENER_WIN - 2)
+#define WIENER_WIN_REDUCED (WIENER_WIN - 2)
#define WIENER_WIN2_CHROMA ((WIENER_WIN_CHROMA) * (WIENER_WIN_CHROMA))
#define WIENER_FILT_PREC_BITS 7
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 1b4f26c..b62789e 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -1191,18 +1191,24 @@
const int wiener_win =
(rsc->plane == AOM_PLANE_Y) ? WIENER_WIN : WIENER_WIN_CHROMA;
+ int reduced_wiener_win = wiener_win;
+ if (rsc->sf->reduce_wiener_window_size) {
+ reduced_wiener_win =
+ (rsc->plane == AOM_PLANE_Y) ? WIENER_WIN_REDUCED : WIENER_WIN_CHROMA;
+ }
+
int64_t M[WIENER_WIN2];
int64_t H[WIENER_WIN2 * WIENER_WIN2];
int32_t vfilter[WIENER_WIN], hfilter[WIENER_WIN];
const AV1_COMMON *const cm = rsc->cm;
if (cm->seq_params.use_highbitdepth) {
- av1_compute_stats_highbd(wiener_win, rsc->dgd_buffer, rsc->src_buffer,
- limits->h_start, limits->h_end, limits->v_start,
- limits->v_end, rsc->dgd_stride, rsc->src_stride, M,
- H, cm->seq_params.bit_depth);
+ av1_compute_stats_highbd(reduced_wiener_win, rsc->dgd_buffer,
+ rsc->src_buffer, limits->h_start, limits->h_end,
+ limits->v_start, limits->v_end, rsc->dgd_stride,
+ rsc->src_stride, M, H, cm->seq_params.bit_depth);
} else {
- av1_compute_stats(wiener_win, rsc->dgd_buffer, rsc->src_buffer,
+ av1_compute_stats(reduced_wiener_win, rsc->dgd_buffer, rsc->src_buffer,
limits->h_start, limits->h_end, limits->v_start,
limits->v_end, rsc->dgd_stride, rsc->src_stride, M, H);
}
@@ -1210,7 +1216,7 @@
const MACROBLOCK *const x = rsc->x;
const int64_t bits_none = x->wiener_restore_cost[0];
- if (!wiener_decompose_sep_sym(wiener_win, M, H, vfilter, hfilter)) {
+ if (!wiener_decompose_sep_sym(reduced_wiener_win, M, H, vfilter, hfilter)) {
rsc->bits += bits_none;
rsc->sse += rusi->sse[RESTORE_NONE];
rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
@@ -1221,13 +1227,13 @@
RestorationUnitInfo rui;
memset(&rui, 0, sizeof(rui));
rui.restoration_type = RESTORE_WIENER;
- finalize_sym_filter(wiener_win, vfilter, rui.wiener_info.vfilter);
- finalize_sym_filter(wiener_win, hfilter, rui.wiener_info.hfilter);
+ finalize_sym_filter(reduced_wiener_win, vfilter, rui.wiener_info.vfilter);
+ finalize_sym_filter(reduced_wiener_win, hfilter, rui.wiener_info.hfilter);
// Filter score computes the value of the function x'*A*x - x'*b for the
// learned filter and compares it against identity filer. If there is no
// reduction in the function, the filter is reverted back to identity
- if (compute_score(wiener_win, M, H, rui.wiener_info.vfilter,
+ if (compute_score(reduced_wiener_win, M, H, rui.wiener_info.vfilter,
rui.wiener_info.hfilter) > 0) {
rsc->bits += bits_none;
rsc->sse += rusi->sse[RESTORE_NONE];
@@ -1238,11 +1244,11 @@
aom_clear_system_state();
- rusi->sse[RESTORE_WIENER] =
- finer_tile_search_wiener(rsc, limits, tile_rect, &rui, wiener_win);
+ rusi->sse[RESTORE_WIENER] = finer_tile_search_wiener(
+ rsc, limits, tile_rect, &rui, reduced_wiener_win);
rusi->wiener = rui.wiener_info;
- if (wiener_win != WIENER_WIN) {
+ if (reduced_wiener_win != WIENER_WIN) {
assert(rui.wiener_info.vfilter[0] == 0 &&
rui.wiener_info.vfilter[WIENER_WIN - 1] == 0);
assert(rui.wiener_info.hfilter[0] == 0 &&
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 51a52bc..7f81d50 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -354,6 +354,7 @@
sf->tx_type_search.fast_intra_tx_type_search = 1;
sf->disable_loop_restoration_chroma =
(boosted || cm->allow_screen_content_tools) ? 0 : 1;
+ sf->reduce_wiener_window_size = !boosted;
sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
sf->adaptive_pred_interp_filter = 0;
sf->cb_pred_filter_search = 1;
@@ -720,6 +721,7 @@
sf->use_first_partition_pass_interintra_stats = 0;
sf->disable_wedge_search_var_thresh = 0;
sf->disable_loop_restoration_chroma = 0;
+ sf->reduce_wiener_window_size = 0;
sf->fast_wedge_sign_estimate = 0;
sf->prune_wedge_pred_diff_based = 0;
sf->drop_ref = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 59c0015..32d8f5f 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -678,6 +678,9 @@
// Disable loop restoration for Chroma plane
int disable_loop_restoration_chroma;
+ // Reduce the wiener filter win size for luma
+ int reduce_wiener_window_size;
+
// Flag used to control the extent of coeff R-D optimization
int perform_coeff_opt;