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;