Allow global motion based translation for sub8x8

Also handle block centers for sub8x8 blocks correctly.

BDRATE: lowres: -1.308%

Change-Id: I6bdb25bdaceb5086a8b951617fd62ed41cd89023
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 6d3bfbb..9d044fe 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -1131,6 +1131,9 @@
     if (mbmi->mode != ZEROMV) return 0;
 #endif  // CONFIG_EXT_INTER
   } else {
+#if !GLOBAL_SUB8X8_USED
+    return 0;
+#endif  // !GLOBAL_SUB8X8_USED
 #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 ||
diff --git a/av1/common/mv.h b/av1/common/mv.h
index 981076d..a2ba42c 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -152,33 +152,33 @@
 
 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;
+  return mi_col * MI_SIZE + bw / 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;
+  return mi_row * MI_SIZE + bh / 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, 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 mi_col, int mi_row,
+                                          int block_idx) {
+  const int unify_bsize = CONFIG_CB4X4;
   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 xc, yc, x, y;
+  if (bsize >= BLOCK_8X8 || unify_bsize) {
+    x = block_center_x(mi_col, bsize);
+    y = block_center_y(mi_row, bsize);
+  } else {
+    x = block_center_x(mi_col, bsize);
+    y = block_center_y(mi_row, bsize);
+    x += (block_idx & 1) * MI_SIZE / 2;
+    y += (block_idx & 2) * MI_SIZE / 4;
+  }
   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 5088ad0..0ffe2a0 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -940,21 +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, bsize, mi_col, mi_row)
-          .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, 0)
+                         .as_int;
   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)
+                                                bsize, mi_col, mi_row, 0)
                                .as_int
                          : 0;
 #else
-  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[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame],
+                                          cm->allow_high_precision_mv, bsize,
+                                          mi_col, mi_row, 0)
+                         .as_int;
   zeromv[1].as_int = 0;
 #endif  // CONFIG_REF_MV
 #else
@@ -1041,7 +1041,7 @@
 #if CONFIG_GLOBAL_MOTION
   zeromv.as_int =
       gm_get_motion_vector(&cm->global_motion[ref], cm->allow_high_precision_mv,
-                           mi->mbmi.sb_type, mi_col, mi_row)
+                           mi->mbmi.sb_type, mi_col, mi_row, block)
           .as_int;
 #else
   zeromv.as_int = 0;
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 6ffaf07..e13dfb9 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1360,12 +1360,12 @@
 #if CONFIG_GLOBAL_MOTION
       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
                                           cm->allow_high_precision_mv, bsize,
-                                          mi_col, mi_row)
+                                          mi_col, mi_row, block)
                          .as_int;
       if (is_compound)
         mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
                                             cm->allow_high_precision_mv, bsize,
-                                            mi_col, mi_row)
+                                            mi_col, mi_row, block)
                            .as_int;
 #else
       mv[0].as_int = 0;
@@ -1373,8 +1373,8 @@
 #endif  // CONFIG_GLOBAL_MOTION
 
 #if CONFIG_REF_MV
-      pred_mv[0].as_int = 0;
-      if (is_compound) pred_mv[1].as_int = 0;
+      pred_mv[0].as_int = mv[0].as_int;
+      if (is_compound) pred_mv[1].as_int = mv[1].as_int;
 #endif
       break;
     }
@@ -1515,11 +1515,11 @@
 #if CONFIG_GLOBAL_MOTION
       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
                                           cm->allow_high_precision_mv, bsize,
-                                          mi_col, mi_row)
+                                          mi_col, mi_row, block)
                          .as_int;
       mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
                                           cm->allow_high_precision_mv, bsize,
-                                          mi_col, mi_row)
+                                          mi_col, mi_row, block)
                          .as_int;
 #else
       mv[0].as_int = 0;
@@ -1627,12 +1627,12 @@
 #if CONFIG_GLOBAL_MOTION
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
                                               cm->allow_high_precision_mv,
-                                              bsize, mi_col, mi_row)
+                                              bsize, mi_col, mi_row, 0)
                              .as_int;
       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)
+                                                    bsize, mi_col, mi_row, 0)
                                    .as_int
                              : 0;
 #else
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index a64e8df..70f4e1b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5046,7 +5046,7 @@
             gm_get_motion_vector(
                 &cpi->common.global_motion[mbmi->ref_frame[ref]],
                 cpi->common.allow_high_precision_mv, mbmi->sb_type, mi_col,
-                mi_row)
+                mi_row, i)
                 .as_int;
         thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[ref]);
 #else
@@ -5104,12 +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,
-                               mbmi->sb_type, mi_col, mi_row)
+                               mbmi->sb_type, mi_col, mi_row, i)
               .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,
-                               mbmi->sb_type, mi_col, mi_row)
+                               mbmi->sb_type, mi_col, mi_row, i)
               .as_int;
       thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[0]) +
                     GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[1]);
@@ -5380,7 +5380,7 @@
       zeromv[cur_frm].as_int =
           gm_get_motion_vector(&cpi->common.global_motion[ref_frames[cur_frm]],
                                cpi->common.allow_high_precision_mv, bsize,
-                               mi_col, mi_row)
+                               mi_col, mi_row, block)
               .as_int;
     else
 #endif  // CONFIG_GLOBAL_MOTION
@@ -5842,7 +5842,7 @@
         frame_mv[ZEROMV][frame].as_int =
             gm_get_motion_vector(&cm->global_motion[frame],
                                  cm->allow_high_precision_mv, mbmi->sb_type,
-                                 mi_col, mi_row)
+                                 mi_col, mi_row, index)
                 .as_int;
 #else   // CONFIG_GLOBAL_MOTION
         frame_mv[ZEROMV][frame].as_int = 0;
@@ -5875,7 +5875,7 @@
           frame_mv[ZERO_ZEROMV][frame].as_int =
               gm_get_motion_vector(&cm->global_motion[frame],
                                    cm->allow_high_precision_mv, mbmi->sb_type,
-                                   mi_col, mi_row)
+                                   mi_col, mi_row, index)
                   .as_int;
 #else
           frame_mv[ZERO_ZEROMV][frame].as_int = 0;
@@ -9602,7 +9602,8 @@
 #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, bsize, mi_col, mi_row)
+                             cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+                             0)
             .as_int;
 #else   // CONFIG_GLOBAL_MOTION
     frame_mv[ZEROMV][ref_frame].as_int = 0;
@@ -9613,7 +9614,8 @@
 #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, bsize, mi_col, mi_row)
+                             cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+                             0)
             .as_int;
 #else   // CONFIG_GLOBAL_MOTION
     frame_mv[ZERO_ZEROMV][ref_frame].as_int = 0;
@@ -9724,7 +9726,7 @@
 #if CONFIG_GLOBAL_MOTION
       zeromv.as_int = gm_get_motion_vector(&cm->global_motion[ALTREF_FRAME],
                                            cm->allow_high_precision_mv, bsize,
-                                           mi_col, mi_row)
+                                           mi_col, mi_row, 0)
                           .as_int;
 #else
       zeromv.as_int = 0;
@@ -10918,14 +10920,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, bsize, mi_col, mi_row)
-            .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, 0)
+                           .as_int;
     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)
+                                                  bsize, mi_col, mi_row, 0)
                                  .as_int
                            : 0;
 #else
@@ -11037,12 +11039,12 @@
 #if CONFIG_GLOBAL_MOTION
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
                                               cm->allow_high_precision_mv,
-                                              bsize, mi_col, mi_row)
+                                              bsize, mi_col, mi_row, 0)
                              .as_int;
       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)
+                                                    bsize, mi_col, mi_row, 0)
                                    .as_int
                              : 0;
 #else
@@ -11088,11 +11090,11 @@
                                            best_mbmode.ref_frame[1] };
       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
                                               cm->allow_high_precision_mv,
-                                              bsize, mi_col, mi_row)
+                                              bsize, mi_col, mi_row, 0)
                              .as_int;
       zeromv[1].as_int = gm_get_motion_vector(&cm->global_motion[refs[1]],
                                               cm->allow_high_precision_mv,
-                                              bsize, mi_col, mi_row)
+                                              bsize, mi_col, mi_row, 0)
                              .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);
@@ -11254,7 +11256,8 @@
 #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, bsize, mi_col, mi_row)
+                           cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+                           0)
           .as_int;
 #else   // CONFIG_GLOBAL_MOTION
   mbmi->mv[0].as_int = 0;