Remove interp filter for non-translation global mv
BDRATE results:
lowres: -0.880% (up from -0.844%)
Change-Id: I017c0beddcc687148fed33c1e9963e05f1eaf6ea
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 37ae545..c0114fa 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -1100,6 +1100,46 @@
if (cols_within_bounds) *cols_within_bounds = block_cols >> pd->subsampling_x;
}
+#if CONFIG_GLOBAL_MOTION
+static INLINE int is_nontrans_global_motion(const MACROBLOCKD *xd) {
+ const MODE_INFO *mi = xd->mi[0];
+ const MB_MODE_INFO *const mbmi = &mi->mbmi;
+ int ref;
+#if CONFIG_CB4X4
+ const int unify_bsize = 1;
+#else
+ const int unify_bsize = 0;
+#endif
+
+ // First check if all modes are ZEROMV
+ if (mbmi->sb_type >= BLOCK_8X8 || unify_bsize) {
+#if CONFIG_EXT_INTER
+ if (mbmi->mode != ZEROMV && mbmi->mode != ZERO_ZEROMV) return 0;
+#else
+ if (mbmi->mode != ZEROMV) return 0;
+#endif // CONFIG_EXT_INTER
+ } else {
+#if CONFIG_EXT_INTER
+ if (mi->bmi[0].as_mode != ZEROMV || mi->bmi[1].as_mode != ZEROMV ||
+ mi->bmi[2].as_mode != ZEROMV || mi->bmi[3].as_mode != ZEROMV ||
+ mi->bmi[0].as_mode != ZERO_ZEROMV ||
+ mi->bmi[1].as_mode != ZERO_ZEROMV ||
+ mi->bmi[2].as_mode != ZERO_ZEROMV || mi->bmi[3].as_mode != ZERO_ZEROMV)
+ return 0;
+#else
+ if (mi->bmi[0].as_mode != ZEROMV || mi->bmi[1].as_mode != ZEROMV ||
+ mi->bmi[2].as_mode != ZEROMV || mi->bmi[3].as_mode != ZEROMV)
+ return 0;
+#endif // CONFIG_EXT_INTER
+ }
+ // Now check if all global motion is non translational
+ for (ref = 0; ref < 1 + has_second_ref(mbmi); ++ref) {
+ if (xd->global_motion[mbmi->ref_frame[ref]].wmtype <= TRANSLATION) return 0;
+ }
+ return 1;
+}
+#endif // CONFIG_GLOBAL_MOTION
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 17887c7..0f4b25d 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -1458,6 +1458,7 @@
MB_MODE_INFO *mbmi;
mbmi = set_offsets(cm, xd, bsize, mi_row, mi_col, bw, bh, x_mis, y_mis);
+
#if CONFIG_DELTA_Q
if (cm->delta_q_present_flag) {
int i;
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 4f16940..d59bd9e 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1115,11 +1115,29 @@
FRAME_CONTEXT *ec_ctx = cm->fc;
#endif
+#if CONFIG_GLOBAL_MOTION
+ if (is_nontrans_global_motion(xd)) {
#if CONFIG_DUAL_FILTER
- int dir;
+ mbmi->interp_filter[0] =
+ cm->interp_filter == SWITCHABLE ? EIGHTTAP_REGULAR : cm->interp_filter;
+ mbmi->interp_filter[1] =
+ cm->interp_filter == SWITCHABLE ? EIGHTTAP_REGULAR : cm->interp_filter;
+#else
+ mbmi->interp_filter =
+ cm->interp_filter == SWITCHABLE ? EIGHTTAP_REGULAR : cm->interp_filter;
+#endif // CONFIG_DUAL_FILTER
+ return;
+ }
+#endif // CONFIG_GLOBAL_MOTION
+
+#if CONFIG_DUAL_FILTER
if (cm->interp_filter != SWITCHABLE) {
+ int dir;
+
for (dir = 0; dir < 4; ++dir) mbmi->interp_filter[dir] = cm->interp_filter;
} else {
+ int dir;
+
for (dir = 0; dir < 2; ++dir) {
const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
mbmi->interp_filter[dir] = EIGHTTAP_REGULAR;
@@ -1708,7 +1726,7 @@
}
#endif
-#if !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION
+#if !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION && !CONFIG_GLOBAL_MOTION
read_mb_interp_filter(cm, xd, mbmi, r);
#endif // !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION
@@ -1951,7 +1969,7 @@
#if CONFIG_WARPED_MOTION
if (mbmi->motion_mode != WARPED_CAUSAL) {
#endif // CONFIG_WARPED_MOTION
-#if CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION
+#if CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION
read_mb_interp_filter(cm, xd, mbmi, r);
#endif // CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION
#if CONFIG_WARPED_MOTION
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 9dce985..3340906 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1148,6 +1148,9 @@
FRAME_CONTEXT *ec_ctx = cm->fc;
#endif
+#if CONFIG_GLOBAL_MOTION
+ if (is_nontrans_global_motion(xd)) return;
+#endif // CONFIG_GLOBAL_MOTION
if (cm->interp_filter == SWITCHABLE) {
#if CONFIG_DUAL_FILTER
int dir;
@@ -1518,7 +1521,7 @@
}
}
-#if !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION
+#if !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION && !CONFIG_GLOBAL_MOTION
write_mb_interp_filter(cpi, xd, w);
#endif // !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION
@@ -1715,7 +1718,7 @@
#if CONFIG_WARPED_MOTION
if (mbmi->motion_mode != WARPED_CAUSAL)
#endif // CONFIG_WARPED_MOTION
-#if CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION
+#if CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION
write_mb_interp_filter(cpi, xd, w);
#endif // CONFIG_DUAL_FILTE || CONFIG_WARPED_MOTION
}
diff --git a/av1/encoder/corner_detect.c b/av1/encoder/corner_detect.c
index f08ff59..e4c59dd 100644
--- a/av1/encoder/corner_detect.c
+++ b/av1/encoder/corner_detect.c
@@ -20,7 +20,7 @@
#include "av1/encoder/corner_detect.h"
// Fast_9 wrapper
-#define FAST_BARRIER 20
+#define FAST_BARRIER 18
int fast_corner_detect(unsigned char *buf, int width, int height, int stride,
int *points, int max_points) {
int num_points;
diff --git a/av1/encoder/corner_match.c b/av1/encoder/corner_match.c
index 99368ee..63225a8 100644
--- a/av1/encoder/corner_match.c
+++ b/av1/encoder/corner_match.c
@@ -22,7 +22,7 @@
#define SEARCH_SZ 9
#define SEARCH_SZ_BY2 ((SEARCH_SZ - 1) / 2)
-#define THRESHOLD_NCC 0.80
+#define THRESHOLD_NCC 0.75
static double compute_variance(unsigned char *im, int stride, int x, int y,
double *mean) {
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index e6ce637..c6a7c8a 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -1200,7 +1200,10 @@
#if CONFIG_WARPED_MOTION
&& mbmi->motion_mode != WARPED_CAUSAL
#endif // CONFIG_WARPED_MOTION
- ) {
+#if CONFIG_GLOBAL_MOTION
+ && !is_nontrans_global_motion(xd)
+#endif // CONFIG_GLOBAL_MOTION
+ ) {
#if CONFIG_DUAL_FILTER
update_filter_type_count(td->counts, xd, mbmi);
#else
@@ -1377,6 +1380,9 @@
#if CONFIG_DUAL_FILTER
&& av1_is_interp_needed(xd)
#endif
+#if CONFIG_GLOBAL_MOTION
+ && !is_nontrans_global_motion(xd)
+#endif // CONFIG_GLOBAL_MOTION
) {
#if CONFIG_DUAL_FILTER
update_filter_type_count(td->counts, xd, mbmi);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index e08baa3..25d0af1 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8893,6 +8893,7 @@
if (!is_comp_pred && mbmi->motion_mode == SIMPLE_TRANSLATION)
single_skippable[this_mode][refs[0]] = rd_stats->skip;
#endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
+
#if CONFIG_GLOBAL_MOTION
if (this_mode == ZEROMV
#if CONFIG_EXT_INTER
@@ -8902,6 +8903,21 @@
rd_stats->rate += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[0]);
if (is_comp_pred)
rd_stats->rate += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[1]);
+ if (is_nontrans_global_motion(xd)) {
+ rd_stats->rate -= rs;
+#if CONFIG_DUAL_FILTER
+ mbmi->interp_filter[0] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+ mbmi->interp_filter[1] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#else
+ mbmi->interp_filter = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#endif // CONFIG_DUAL_FILTER
+ }
}
#endif // CONFIG_GLOBAL_MOTION
@@ -11046,6 +11062,30 @@
*mbmi = best_mbmode;
x->skip |= best_skip2;
+// Note: this section is needed since the mode may have been forced to
+// ZEROMV by the all-zero mode handling of ref-mv.
+#if CONFIG_GLOBAL_MOTION
+ if (mbmi->mode == ZEROMV
+#if CONFIG_EXT_INTER
+ || mbmi->mode == ZERO_ZEROMV
+#endif // CONFIG_EXT_INTER
+ ) {
+ if (is_nontrans_global_motion(xd)) {
+#if CONFIG_DUAL_FILTER
+ mbmi->interp_filter[0] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+ mbmi->interp_filter[1] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#else
+ mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#endif // CONFIG_DUAL_FILTER
+ }
+ }
+#endif // CONFIG_GLOBAL_MOTION
+
#if CONFIG_REF_MV
for (i = 0; i < 1 + has_second_ref(mbmi); ++i) {
if (mbmi->mode != NEWMV)
@@ -11978,6 +12018,29 @@
mbmi->mv[1].as_int = xd->mi[0]->bmi[3].as_mv[1].as_int;
}
+// Note: this section is needed since the mode may have been forced to ZEROMV
+#if CONFIG_GLOBAL_MOTION
+ if (mbmi->mode == ZEROMV
+#if CONFIG_EXT_INTER
+ || mbmi->mode == ZERO_ZEROMV
+#endif // CONFIG_EXT_INTER
+ ) {
+ if (is_nontrans_global_motion(xd)) {
+#if CONFIG_DUAL_FILTER
+ mbmi->interp_filter[0] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+ mbmi->interp_filter[1] = cm->interp_filter == SWITCHABLE
+ ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#else
+ mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? EIGHTTAP_REGULAR
+ : cm->interp_filter;
+#endif // CONFIG_DUAL_FILTER
+ }
+ }
+#endif // CONFIG_GLOBAL_MOTION
+
for (i = 0; i < REFERENCE_MODES; ++i) {
if (best_pred_rd[i] == INT64_MAX)
best_pred_diff[i] = INT_MIN;