Fix interp filter type bit cost calculation
Fix interp filter type bit cost calculation when dual fitler
is disabled, which is the case for speed >= 2 currently.
Coding gains for speed 2 (150 frames, constant-q mode):
lowres 0.22%
midres 0.15%
STATS_CHANGED for speed >= 2.
Change-Id: I1057cf806b08e0144bdb6902c100de81e190a0aa
(cherry picked from commit 22100852882b21a0972c149789d7468d7f73f8ba)
diff --git a/av1/encoder/encodeframe_utils.h b/av1/encoder/encodeframe_utils.h
index e8ff43b..ef70292 100644
--- a/av1/encoder/encodeframe_utils.h
+++ b/av1/encoder/encodeframe_utils.h
@@ -165,6 +165,9 @@
}
static AOM_INLINE void update_filter_type_cdf(const MACROBLOCKD *xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ int dual_filter,
+#endif // CONFIG_REMOVE_DUAL_FILTER
const MB_MODE_INFO *mbmi) {
#if CONFIG_REMOVE_DUAL_FILTER
const int ctx = av1_get_pred_context_switchable_interp(xd, 0);
@@ -172,6 +175,7 @@
SWITCHABLE_FILTERS);
#else
for (int dir = 0; dir < 2; ++dir) {
+ if (dir && !dual_filter) break;
const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
InterpFilter filter = av1_extract_interp_filter(mbmi->interp_filters, dir);
update_cdf(xd->tile_ctx->switchable_interp_cdf[ctx], filter,
diff --git a/av1/encoder/interp_search.c b/av1/encoder/interp_search.c
index 9e036cb..e38eb11 100644
--- a/av1/encoder/interp_search.c
+++ b/av1/encoder/interp_search.c
@@ -134,12 +134,14 @@
#else
static INLINE int get_switchable_rate(MACROBLOCK *const x,
const int_interpfilters filters,
- const int ctx[2]) {
- int inter_filter_cost;
+ int dual_filter, const int ctx[2]) {
const InterpFilter filter0 = filters.as_filters.y_filter;
- const InterpFilter filter1 = filters.as_filters.x_filter;
- inter_filter_cost = x->mode_costs.switchable_interp_costs[ctx[0]][filter0];
- inter_filter_cost += x->mode_costs.switchable_interp_costs[ctx[1]][filter1];
+ int inter_filter_cost =
+ x->mode_costs.switchable_interp_costs[ctx[0]][filter0];
+ if (dual_filter) {
+ const InterpFilter filter1 = filters.as_filters.x_filter;
+ inter_filter_cost += x->mode_costs.switchable_interp_costs[ctx[1]][filter1];
+ }
return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
}
#endif // CONFIG_REMOVE_DUAL_FILTER
@@ -203,6 +205,7 @@
mbmi->interp_fltr,
#else
mbmi->interp_filters,
+ cm->seq_params.enable_dual_filter,
#endif // CONFIG_REMOVE_DUAL_FILTER
switchable_ctx);
@@ -736,6 +739,7 @@
mbmi->interp_fltr,
#else
mbmi->interp_filters,
+ cm->seq_params.enable_dual_filter,
#endif // CONFIG_REMOVE_DUAL_FILTER
switchable_ctx);
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 3584cb5..dd1b502 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -1430,8 +1430,7 @@
int best_filter_index = -1;
InterpFilter filters[FILTER_SEARCH_SIZE] = { EIGHTTAP_REGULAR,
EIGHTTAP_SMOOTH };
- int i;
- for (i = 0; i < FILTER_SEARCH_SIZE; ++i) {
+ for (int i = 0; i < FILTER_SEARCH_SIZE; ++i) {
int64_t cost;
InterpFilter filter = filters[i];
#if CONFIG_REMOVE_DUAL_FILTER
@@ -1446,7 +1445,11 @@
else
model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rd_stats[i], 1);
pf_rd_stats[i].rate +=
- av1_get_switchable_rate(x, xd, cm->features.interp_filter);
+ av1_get_switchable_rate(x, xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ cm->seq_params.enable_dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
+ cm->features.interp_filter);
cost = RDCOST(x->rdmult, pf_rd_stats[i].rate, pf_rd_stats[i].dist);
pf_tx_size[i] = mi->tx_size;
if (cost < best_cost) {
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index df9bc0e..183f06e 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -1066,7 +1066,11 @@
if (inter_block && cm->features.interp_filter == SWITCHABLE &&
mbmi->motion_mode != WARPED_CAUSAL &&
!is_nontrans_global_motion(xd, mbmi)) {
- update_filter_type_cdf(xd, mbmi);
+ update_filter_type_cdf(xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ cm->seq_params.enable_dual_filter,
+#endif // CONFIG_REMOVE_DUAL_FILTER
+ mbmi);
}
if (inter_block &&
!segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 6176abc..6e5f347 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -1082,6 +1082,9 @@
}
int av1_get_switchable_rate(const MACROBLOCK *x, const MACROBLOCKD *xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ int dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
InterpFilter interp_filter) {
if (interp_filter == SWITCHABLE) {
const MB_MODE_INFO *const mbmi = xd->mi[0];
@@ -1092,6 +1095,7 @@
#else
int inter_filter_cost = 0;
for (int dir = 0; dir < 2; ++dir) {
+ if (dir && !dual_filter) break;
const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
const InterpFilter filter =
av1_extract_interp_filter(mbmi->interp_filters, dir);
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index 0f0062b..5e9bfcd 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -243,6 +243,9 @@
double yl, double *rate_f, double *distbysse_f);
int av1_get_switchable_rate(const MACROBLOCK *x, const MACROBLOCKD *xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ int dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
InterpFilter interp_filter);
YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const struct AV1_COMP *cpi,
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 76573b8..4a2e8d3 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1330,8 +1330,13 @@
MB_MODE_INFO best_mbmi;
const int interp_filter = features->interp_filter;
const int switchable_rate =
- av1_is_interp_needed(xd) ? av1_get_switchable_rate(x, xd, interp_filter)
- : 0;
+ av1_is_interp_needed(xd)
+ ? av1_get_switchable_rate(x, xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ cm->seq_params.enable_dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
+ interp_filter)
+ : 0;
int64_t best_rd = INT64_MAX;
int best_rate_mv = rate_mv0;
const int mi_row = xd->mi_row;
@@ -5519,7 +5524,11 @@
#else
mbmi->interp_filters = av1_broadcast_interp_filter(i);
#endif // CONFIG_REMOVE_DUAL_FILTER
- rs = av1_get_switchable_rate(x, xd, interp_filter);
+ rs = av1_get_switchable_rate(x, xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ cm->seq_params.enable_dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
+ interp_filter);
if (rs < best_rs) {
best_rs = rs;
best_filter = i;
@@ -5533,7 +5542,11 @@
#else
mbmi->interp_filters = av1_broadcast_interp_filter(best_filter);
#endif // CONFIG_REMOVE_DUAL_FILTER
- rate2 += av1_get_switchable_rate(x, xd, interp_filter);
+ rate2 += av1_get_switchable_rate(x, xd,
+#if !CONFIG_REMOVE_DUAL_FILTER
+ cm->seq_params.enable_dual_filter,
+#endif // !CONFIG_REMOVE_DUAL_FILTER
+ interp_filter);
if (cm->current_frame.reference_mode == REFERENCE_MODE_SELECT)
rate2 += comp_inter_cost[comp_pred];