[NORMATIVE] Add sequence header control for dual filter
Add a sequence header control to turn on and off the use of
dual direction interpolation filter. This allows the encoder to
select and code only one filter type per coding block, when
turning off the dual filter option.
Thanks to Ankur and the Nvidia team for identifying the potential
issues for hw encoder and proposing the solution.
BUG=aomedia:1326
Change-Id: Icfb82940d85c5f77406f613be7fa829763289514
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 0820e99..687144a 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2425,6 +2425,8 @@
setup_sb_size(seq_params, rb);
+ seq_params->enable_dual_filter = aom_rb_read_bit(rb);
+
if (aom_rb_read_bit(rb)) {
seq_params->force_screen_content_tools = 2;
} else {
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index a8c5176..517cc58 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1340,6 +1340,11 @@
(InterpFilter)aom_read_symbol(r, ec_ctx->switchable_interp_cdf[ctx],
SWITCHABLE_FILTERS, ACCT_STR);
}
+
+ if (cm->seq_params.enable_dual_filter == 0) {
+ ref0_filter[1] = ref0_filter[0];
+ break;
+ }
}
// The index system works as: (0, 1) -> (vertical, horizontal) filter types
mbmi->interp_filters =
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 7bb540d..ed77a85 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -702,6 +702,7 @@
assert(av1_extract_interp_filter(mbmi->interp_filters, dir) ==
EIGHTTAP_REGULAR);
}
+ if (cm->seq_params.enable_dual_filter == 0) return;
}
}
}
@@ -3098,6 +3099,8 @@
write_sb_size(seq_params, wb);
+ aom_wb_write_bit(wb, seq_params->enable_dual_filter);
+
if (seq_params->force_screen_content_tools == 2) {
aom_wb_write_bit(wb, 1);
} else {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 0869a07..3dabf35 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -7368,7 +7368,8 @@
InterpFilters best_filters = mbmi->interp_filters;
restore_dst_buf(xd, *tmp_dst, num_planes);
- if (cpi->sf.use_fast_interpolation_filter_search) {
+ if (cpi->sf.use_fast_interpolation_filter_search &&
+ cm->seq_params.enable_dual_filter) {
int tmp_skip_sb = 0;
int64_t tmp_skip_sse = INT64_MAX;
int tmp_rs;
@@ -7415,8 +7416,8 @@
tmp_skip_sb = 0;
tmp_skip_sse = INT64_MAX;
- mbmi->interp_filters =
- av1_make_interp_filters(filter_sets[i][0], filter_sets[i][1]);
+ if (cm->seq_params.enable_dual_filter == 0)
+ if (filter_sets[i][0] != filter_sets[i][1]) continue;
tmp_rs = av1_get_switchable_rate(cm, x, xd);
av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, orig_dst,
@@ -7446,6 +7447,10 @@
int64_t tmp_skip_sse = INT64_MAX;
int tmp_rs;
int64_t tmp_rd;
+
+ if (cm->seq_params.enable_dual_filter == 0)
+ if (filter_sets[i][0] != filter_sets[i][1]) continue;
+
mbmi->interp_filters =
av1_make_interp_filters(filter_sets[i][0], filter_sets[i][1]);
tmp_rs = av1_get_switchable_rate(cm, x, xd);
@@ -7482,7 +7487,6 @@
av1_broadcast_interp_filter(EIGHTTAP_REGULAR));
}
}
-
return 0;
}