Turn off global motion for sub8x8 blocks

Lowres: 0.03% improvement, 1% improvement on waterfall_cif.y4m
Midres: 0.085% overall improvement, 1.253% improvement on station2_480p25.y4m
Change-Id: I3872934d978bb4ca828c6b9acd2fdb951d9da299
diff --git a/av1/common/mv.h b/av1/common/mv.h
index b43c3ab..981076d 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -13,6 +13,7 @@
 #define AV1_COMMON_MV_H_
 
 #include "av1/common/common.h"
+#include "av1/common/common_data.h"
 #include "aom_dsp/aom_filter.h"
 
 #ifdef __cplusplus
@@ -146,12 +147,37 @@
 #define GM_VERTRAPEZOID_BITS \
   (GM_AFFINE_BITS - GM_ABS_ALPHA_BITS + GM_ABS_ROW3HOMO_BITS)
 
+// Use global motion parameters for sub8x8 blocks
+#define GLOBAL_SUB8X8_USED 0
+
+static INLINE int block_center_x(int mi_col, BLOCK_SIZE bs) {
+  const int bw = block_size_wide[bs];
+  return mi_col * MI_SIZE + AOMMAX(bw, MI_SIZE) / 2;
+}
+
+static INLINE int block_center_y(int mi_row, BLOCK_SIZE bs) {
+  const int bh = block_size_high[bs];
+  return mi_row * MI_SIZE + AOMMAX(bh, MI_SIZE) / 2;
+}
+
 // Convert a global motion translation vector (which may have more bits than a
 // regular motion vector) into a motion vector
 static INLINE int_mv gm_get_motion_vector(const WarpedMotionParams *gm,
-                                          int allow_hp, int x, int y) {
+                                          int allow_hp, BLOCK_SIZE bsize,
+                                          int mi_col, int mi_row) {
+#if !GLOBAL_SUB8X8_USED
+  if (bsize < BLOCK_8X8) {
+    int_mv res_zero;
+    res_zero.as_mv.row = 0;
+    res_zero.as_mv.col = 0;
+    return res_zero;
+  }
+#endif
+
   int_mv res;
   const int32_t *mat = gm->wmmat;
+  const int x = block_center_x(mi_col, bsize);
+  const int y = block_center_y(mi_row, bsize);
   int xc, yc;
   int shift = allow_hp ? WARPEDMODEL_PREC_BITS - 3 : WARPEDMODEL_PREC_BITS - 2;
   int scale = allow_hp ? 0 : 1;
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index 1c33b64..e8079e5 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -940,24 +940,21 @@
 #if CONFIG_GLOBAL_MOTION
 #if CONFIG_REF_MV
   av1_set_ref_frame(rf, ref_frame);
-  zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
-                                          cm->allow_high_precision_mv,
-                                          block_center_x(mi_col, bsize),
-                                          block_center_y(mi_row, bsize))
-                         .as_int;
+  zeromv[0].as_int =
+      gm_get_motion_vector(&cm->global_motion[rf[0]],
+                           cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+          .as_int;
   zeromv[1].as_int = (rf[1] != NONE_FRAME)
                          ? gm_get_motion_vector(&cm->global_motion[rf[1]],
                                                 cm->allow_high_precision_mv,
-                                                block_center_x(mi_col, bsize),
-                                                block_center_y(mi_row, bsize))
+                                                bsize, mi_col, mi_row)
                                .as_int
                          : 0;
 #else
-  zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame],
-                                          cm->allow_high_precision_mv,
-                                          block_center_x(mi_col, bsize),
-                                          block_center_y(mi_row, bsize))
-                         .as_int;
+  zeromv[0].as_int =
+      gm_get_motion_vector(&cm->global_motion[ref_frame],
+                           cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+          .as_int;
   zeromv[1].as_int = 0;
 #endif  // CONFIG_REF_MV
 #else
@@ -1044,8 +1041,7 @@
 #if CONFIG_GLOBAL_MOTION
   zeromv.as_int =
       gm_get_motion_vector(&cm->global_motion[ref], cm->allow_high_precision_mv,
-                           block_center_x(mi_col, mi->mbmi.sb_type),
-                           block_center_y(mi_row, mi->mbmi.sb_type))
+                           mi->mbmi.sb_type, mi_col, mi_row)
           .as_int;
 #else
   zeromv.as_int = 0;
diff --git a/av1/common/mvref_common.h b/av1/common/mvref_common.h
index 9b3a246..f5a3919 100644
--- a/av1/common/mvref_common.h
+++ b/av1/common/mvref_common.h
@@ -255,18 +255,6 @@
 };
 #endif
 
-#if CONFIG_GLOBAL_MOTION
-static INLINE int block_center_x(int mi_col, BLOCK_SIZE bs) {
-  const int bw = block_size_wide[bs];
-  return mi_col * MI_SIZE + AOMMAX(bw, MI_SIZE) / 2;
-}
-
-static INLINE int block_center_y(int mi_row, BLOCK_SIZE bs) {
-  const int bh = block_size_high[bs];
-  return mi_row * MI_SIZE + AOMMAX(bh, MI_SIZE) / 2;
-}
-#endif  // CONFIG_GLOBAL_MOTION
-
 static const int idx_n_column_to_subblock[4][2] = {
   { 1, 2 }, { 1, 3 }, { 3, 2 }, { 3, 3 }
 };
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index fdd2b8b..ec0e9f0 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -767,6 +767,20 @@
 }
 #endif  // CONFIG_AOM_HIGHBITDEPTH
 
+#if CONFIG_GLOBAL_MOTION
+static INLINE int is_global_mv_block(const MODE_INFO *mi, int block,
+                                     TransformationType type) {
+  PREDICTION_MODE mode = get_y_mode(mi, block);
+#if GLOBAL_SUB8X8_USED
+  const int block_size_allowed = 1;
+#else
+  const BLOCK_SIZE bsize = mi->mbmi.sb_type;
+  const int block_size_allowed = (bsize >= BLOCK_8X8);
+#endif  // GLOBAL_SUB8X8_USED
+  return mode == ZEROMV && type > TRANSLATION && block_size_allowed;
+}
+#endif  // CONFIG_GLOBAL_MOTION
+
 void av1_build_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
                                int dst_stride, const MV *src_mv,
                                const struct scale_factors *sf, int w, int h,
@@ -822,8 +836,7 @@
   int is_global[2];
   for (ref = 0; ref < 1 + is_compound; ++ref) {
     WarpedMotionParams *const wm = &xd->global_motion[mi->mbmi.ref_frame[ref]];
-    is_global[ref] =
-        (get_y_mode(mi, block) == ZEROMV && wm->wmtype > TRANSLATION);
+    is_global[ref] = is_global_mv_block(mi, block, wm->wmtype);
   }
 #endif  // CONFIG_GLOBAL_MOTION
 
@@ -2750,8 +2763,7 @@
   ConvolveParams conv_params = get_conv_params(0, plane);
 #if CONFIG_GLOBAL_MOTION
   WarpedMotionParams *const wm = &xd->global_motion[mi->mbmi.ref_frame[ref]];
-  const int is_global =
-      (get_y_mode(mi, block) == ZEROMV && wm->wmtype > TRANSLATION);
+  const int is_global = is_global_mv_block(mi, block, wm->wmtype);
 #endif  // CONFIG_GLOBAL_MOTION
 
   if (is_scaled) {
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 0b97099..22686bf 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1359,15 +1359,13 @@
     case ZEROMV: {
 #if CONFIG_GLOBAL_MOTION
       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
-                                          cm->allow_high_precision_mv,
-                                          block_center_x(mi_col, bsize),
-                                          block_center_y(mi_row, bsize))
+                                          cm->allow_high_precision_mv, bsize,
+                                          mi_col, mi_row)
                          .as_int;
       if (is_compound)
         mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
-                                            cm->allow_high_precision_mv,
-                                            block_center_x(mi_col, bsize),
-                                            block_center_y(mi_row, bsize))
+                                            cm->allow_high_precision_mv, bsize,
+                                            mi_col, mi_row)
                            .as_int;
 #else
       mv[0].as_int = 0;
@@ -1516,14 +1514,12 @@
       assert(is_compound);
 #if CONFIG_GLOBAL_MOTION
       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
-                                          cm->allow_high_precision_mv,
-                                          block_center_x(mi_col, bsize),
-                                          block_center_y(mi_row, bsize))
+                                          cm->allow_high_precision_mv, bsize,
+                                          mi_col, mi_row)
                          .as_int;
       mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
-                                          cm->allow_high_precision_mv,
-                                          block_center_x(mi_col, bsize),
-                                          block_center_y(mi_row, bsize))
+                                          cm->allow_high_precision_mv, bsize,
+                                          mi_col, mi_row)
                          .as_int;
 #else
       mv[0].as_int = 0;
@@ -1631,17 +1627,14 @@
 #if CONFIG_GLOBAL_MOTION
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
                                               cm->allow_high_precision_mv,
-                                              block_center_x(mi_col, bsize),
-                                              block_center_y(mi_row, bsize))
+                                              bsize, mi_col, mi_row)
                              .as_int;
-      zeromv[1].as_int =
-          (rf[1] != NONE_FRAME)
-              ? gm_get_motion_vector(&cm->global_motion[rf[1]],
-                                     cm->allow_high_precision_mv,
-                                     block_center_x(mi_col, bsize),
-                                     block_center_y(mi_row, bsize))
-                    .as_int
-              : 0;
+      zeromv[1].as_int = (rf[1] != NONE_FRAME)
+                             ? gm_get_motion_vector(&cm->global_motion[rf[1]],
+                                                    cm->allow_high_precision_mv,
+                                                    bsize, mi_col, mi_row)
+                                   .as_int
+                             : 0;
 #else
       zeromv[0].as_int = zeromv[1].as_int = 0;
 #endif
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 6054735..a4c50ce 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5045,9 +5045,8 @@
         this_mv[ref].as_int =
             gm_get_motion_vector(
                 &cpi->common.global_motion[mbmi->ref_frame[ref]],
-                cpi->common.allow_high_precision_mv,
-                block_center_x(mi_col, mbmi->sb_type),
-                block_center_y(mi_row, mbmi->sb_type))
+                cpi->common.allow_high_precision_mv, mbmi->sb_type, mi_col,
+                mi_row)
                 .as_int;
         thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[ref]);
 #else
@@ -5105,14 +5104,12 @@
       this_mv[0].as_int =
           gm_get_motion_vector(&cpi->common.global_motion[mbmi->ref_frame[0]],
                                cpi->common.allow_high_precision_mv,
-                               block_center_x(mi_col, mbmi->sb_type),
-                               block_center_y(mi_row, mbmi->sb_type))
+                               mbmi->sb_type, mi_col, mi_row)
               .as_int;
       this_mv[1].as_int =
           gm_get_motion_vector(&cpi->common.global_motion[mbmi->ref_frame[1]],
                                cpi->common.allow_high_precision_mv,
-                               block_center_x(mi_col, mbmi->sb_type),
-                               block_center_y(mi_row, mbmi->sb_type))
+                               mbmi->sb_type, mi_col, mi_row)
               .as_int;
       thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[0]) +
                     GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[1]);
@@ -5382,9 +5379,8 @@
         )
       zeromv[cur_frm].as_int =
           gm_get_motion_vector(&cpi->common.global_motion[ref_frames[cur_frm]],
-                               cpi->common.allow_high_precision_mv,
-                               block_center_x(mi_col, bsize),
-                               block_center_y(mi_row, bsize))
+                               cpi->common.allow_high_precision_mv, bsize,
+                               mi_col, mi_row)
               .as_int;
     else
 #endif  // CONFIG_GLOBAL_MOTION
@@ -5845,9 +5841,8 @@
 #if CONFIG_GLOBAL_MOTION
         frame_mv[ZEROMV][frame].as_int =
             gm_get_motion_vector(&cm->global_motion[frame],
-                                 cm->allow_high_precision_mv,
-                                 block_center_x(mi_col, mbmi->sb_type),
-                                 block_center_y(mi_row, mbmi->sb_type))
+                                 cm->allow_high_precision_mv, mbmi->sb_type,
+                                 mi_col, mi_row)
                 .as_int;
 #else   // CONFIG_GLOBAL_MOTION
         frame_mv[ZEROMV][frame].as_int = 0;
@@ -5879,9 +5874,8 @@
 #if CONFIG_GLOBAL_MOTION
           frame_mv[ZERO_ZEROMV][frame].as_int =
               gm_get_motion_vector(&cm->global_motion[frame],
-                                   cm->allow_high_precision_mv,
-                                   block_center_x(mi_col, mbmi->sb_type),
-                                   block_center_y(mi_row, mbmi->sb_type))
+                                   cm->allow_high_precision_mv, mbmi->sb_type,
+                                   mi_col, mi_row)
                   .as_int;
 #else
           frame_mv[ZERO_ZEROMV][frame].as_int = 0;
@@ -9607,9 +9601,8 @@
     frame_mv[NEWMV][ref_frame].as_int = INVALID_MV;
 #if CONFIG_GLOBAL_MOTION
     frame_mv[ZEROMV][ref_frame].as_int =
-        gm_get_motion_vector(
-            &cm->global_motion[ref_frame], cm->allow_high_precision_mv,
-            block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
+        gm_get_motion_vector(&cm->global_motion[ref_frame],
+                             cm->allow_high_precision_mv, bsize, mi_col, mi_row)
             .as_int;
 #else   // CONFIG_GLOBAL_MOTION
     frame_mv[ZEROMV][ref_frame].as_int = 0;
@@ -9619,9 +9612,8 @@
     frame_mv[NEW_NEWMV][ref_frame].as_int = INVALID_MV;
 #if CONFIG_GLOBAL_MOTION
     frame_mv[ZERO_ZEROMV][ref_frame].as_int =
-        gm_get_motion_vector(
-            &cm->global_motion[ref_frame], cm->allow_high_precision_mv,
-            block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
+        gm_get_motion_vector(&cm->global_motion[ref_frame],
+                             cm->allow_high_precision_mv, bsize, mi_col, mi_row)
             .as_int;
 #else   // CONFIG_GLOBAL_MOTION
     frame_mv[ZERO_ZEROMV][ref_frame].as_int = 0;
@@ -9728,9 +9720,8 @@
       mode_skip_mask[ALTREF_FRAME] = ~INTER_NEAREST_NEAR_ZERO;
 #if CONFIG_GLOBAL_MOTION
       zeromv.as_int = gm_get_motion_vector(&cm->global_motion[ALTREF_FRAME],
-                                           cm->allow_high_precision_mv,
-                                           block_center_x(mi_col, bsize),
-                                           block_center_y(mi_row, bsize))
+                                           cm->allow_high_precision_mv, bsize,
+                                           mi_col, mi_row)
                           .as_int;
 #else
       zeromv.as_int = 0;
@@ -10924,16 +10915,14 @@
     const uint8_t rf_type = av1_ref_frame_type(best_mbmode.ref_frame);
 #endif  // CONFIG_REF_MV
 #if CONFIG_GLOBAL_MOTION
-    zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
-                                            cm->allow_high_precision_mv,
-                                            block_center_x(mi_col, bsize),
-                                            block_center_y(mi_row, bsize))
-                           .as_int;
+    zeromv[0].as_int =
+        gm_get_motion_vector(&cm->global_motion[refs[0]],
+                             cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+            .as_int;
     zeromv[1].as_int = comp_pred_mode
                            ? gm_get_motion_vector(&cm->global_motion[refs[1]],
                                                   cm->allow_high_precision_mv,
-                                                  block_center_x(mi_col, bsize),
-                                                  block_center_y(mi_row, bsize))
+                                                  bsize, mi_col, mi_row)
                                  .as_int
                            : 0;
 #else
@@ -11045,17 +11034,14 @@
 #if CONFIG_GLOBAL_MOTION
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
                                               cm->allow_high_precision_mv,
-                                              block_center_x(mi_col, bsize),
-                                              block_center_y(mi_row, bsize))
+                                              bsize, mi_col, mi_row)
                              .as_int;
-      zeromv[1].as_int =
-          comp_pred_mode
-              ? gm_get_motion_vector(&cm->global_motion[refs[1]],
-                                     cm->allow_high_precision_mv,
-                                     block_center_x(mi_col, bsize),
-                                     block_center_y(mi_row, bsize))
-                    .as_int
-              : 0;
+      zeromv[1].as_int = comp_pred_mode
+                             ? gm_get_motion_vector(&cm->global_motion[refs[1]],
+                                                    cm->allow_high_precision_mv,
+                                                    bsize, mi_col, mi_row)
+                                   .as_int
+                             : 0;
 #else
       zeromv[0].as_int = 0;
       zeromv[1].as_int = 0;
@@ -11099,13 +11085,11 @@
                                            best_mbmode.ref_frame[1] };
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
                                               cm->allow_high_precision_mv,
-                                              block_center_x(mi_col, bsize),
-                                              block_center_y(mi_row, bsize))
+                                              bsize, mi_col, mi_row)
                              .as_int;
       zeromv[1].as_int = gm_get_motion_vector(&cm->global_motion[refs[1]],
                                               cm->allow_high_precision_mv,
-                                              block_center_x(mi_col, bsize),
-                                              block_center_y(mi_row, bsize))
+                                              bsize, mi_col, mi_row)
                              .as_int;
       lower_mv_precision(&zeromv[0].as_mv, cm->allow_high_precision_mv);
       lower_mv_precision(&zeromv[1].as_mv, cm->allow_high_precision_mv);
@@ -11266,9 +11250,8 @@
   mbmi->ref_frame[1] = NONE_FRAME;
 #if CONFIG_GLOBAL_MOTION
   mbmi->mv[0].as_int =
-      gm_get_motion_vector(
-          &cm->global_motion[mbmi->ref_frame[0]], cm->allow_high_precision_mv,
-          block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
+      gm_get_motion_vector(&cm->global_motion[mbmi->ref_frame[0]],
+                           cm->allow_high_precision_mv, bsize, mi_col, mi_row)
           .as_int;
 #else   // CONFIG_GLOBAL_MOTION
   mbmi->mv[0].as_int = 0;