Merge "more cleanup of vp8 and vp9" into nextgenv2
diff --git a/vp10/common/mv.h b/vp10/common/mv.h
index f45f2ab..aee3109 100644
--- a/vp10/common/mv.h
+++ b/vp10/common/mv.h
@@ -50,31 +50,34 @@
 //
 // The ABS parameters are used to create an upper and lower bound
 // for each parameter. In other words, after a parameter is integerized
-// it is clamped between -(1 << ABS_XXX_BITS) and (1 << ABS_XXX_BITS)
+// it is clamped between -(1 << ABS_XXX_BITS) and (1 << ABS_XXX_BITS).
 //
-// XXX_PREC_DIFF and XXX_DECODE_FACTOR are computed once here to
-// prevent repetetive computation on the decoder side. These are
+// XXX_PREC_DIFF, XXX_ENCODE_FACTOR and XXX_DECODE_FACTOR
+// are computed once here to prevent repetitive
+// computation on the decoder side. These are
 // to allow the global motion parameters to be encoded in a lower
 // precision than the warped model precision. This means that they
 // need to be changed to warped precision when they are decoded.
 //
 // XX_MIN, XX_MAX are also computed to avoid repeated computation
 
-#define GM_TRANS_PREC_BITS        3
-#define GM_TRANS_PREC_DIFF        (WARPEDMODEL_PREC_BITS - GM_TRANS_PREC_BITS)
-#define GM_TRANS_DECODE_FACTOR    (1 << GM_TRANS_PREC_DIFF)
+#define GM_TRANS_PREC_BITS      5
+#define GM_TRANS_PREC_DIFF      (WARPEDMODEL_PREC_BITS - GM_TRANS_PREC_BITS)
+#define GM_TRANS_DECODE_FACTOR  (1 << GM_TRANS_PREC_DIFF)
+#define GM_TRANS_ENCODE_FACTOR  (1 / (GM_TRANS_DECODE_FACTOR))
 
-#define GM_ALPHA_PREC_BITS        5
-#define GM_ALPHA_PREC_DIFF        (WARPEDMODEL_PREC_BITS - GM_ALPHA_PREC_BITS)
-#define GM_ALPHA_DECODE_FACTOR    (1 << GM_ALPHA_PREC_DIFF)
+#define GM_ALPHA_PREC_BITS      5
+#define GM_ALPHA_PREC_DIFF      (WARPEDMODEL_PREC_BITS - GM_ALPHA_PREC_BITS)
+#define GM_ALPHA_DECODE_FACTOR  (1 << GM_ALPHA_PREC_DIFF)
+#define GM_ALPHA_ENCODE_FACTOR  (1 / (GM_ALPHA_DECODE_FACTOR))
 
-#define GM_ABS_ALPHA_BITS         5
-#define GM_ABS_TRANS_BITS         5
+#define GM_ABS_ALPHA_BITS       8
+#define GM_ABS_TRANS_BITS       8
 
-#define GM_TRANS_MAX              (1 << GM_ABS_TRANS_BITS)
-#define GM_ALPHA_MAX              (1 << GM_ABS_ALPHA_BITS)
-#define GM_TRANS_MIN              -GM_TRANS_MAX
-#define GM_ALPHA_MIN              -GM_ALPHA_MAX
+#define GM_TRANS_MAX            (1 << GM_ABS_TRANS_BITS)
+#define GM_ALPHA_MAX            (1 << GM_ABS_ALPHA_BITS)
+#define GM_TRANS_MIN            -GM_TRANS_MAX
+#define GM_ALPHA_MIN            -GM_ALPHA_MAX
 
 typedef enum {
   GLOBAL_ZERO = 0,
diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c
index 3a51a48..ec04e56 100644
--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -3473,6 +3473,7 @@
       params->motion_params.wmmat[5] =
           vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
           GM_ALPHA_DECODE_FACTOR;
+      // fallthrough intended
     case GLOBAL_ROTZOOM:
       params->motion_params.wmmat[2] =
           (vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
@@ -3480,6 +3481,7 @@
       params->motion_params.wmmat[3] =
           vp10_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
           GM_ALPHA_DECODE_FACTOR;
+      // fallthrough intended
     case GLOBAL_TRANSLATION:
       params->motion_params.wmmat[0] =
           vp10_read_primitive_symmetric(r, GM_ABS_TRANS_BITS) *
diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c
index 5d09713..57b19d5 100644
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -3199,19 +3199,29 @@
     case GLOBAL_ZERO:
       break;
     case GLOBAL_AFFINE:
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[4],
+      vp10_write_primitive_symmetric(w, (params->motion_params.wmmat[4] *
+                                     GM_ALPHA_ENCODE_FACTOR) -
+                                     (1 << GM_ALPHA_PREC_BITS),
                                      GM_ABS_ALPHA_BITS);
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[5],
+      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[5] *
+                                     GM_ALPHA_ENCODE_FACTOR,
                                      GM_ABS_ALPHA_BITS);
+      // fallthrough intended
     case GLOBAL_ROTZOOM:
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[2],
+      vp10_write_primitive_symmetric(w, (params->motion_params.wmmat[2] *
+                                     GM_ALPHA_ENCODE_FACTOR) -
+                                     (1 << GM_ALPHA_PREC_BITS),
                                      GM_ABS_ALPHA_BITS);
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[3],
+      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[3] *
+                                     GM_ALPHA_ENCODE_FACTOR,
                                      GM_ABS_ALPHA_BITS);
+      // fallthrough intended
     case GLOBAL_TRANSLATION:
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[0],
+      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[0] *
+                                     GM_TRANS_ENCODE_FACTOR,
                                      GM_ABS_TRANS_BITS);
-      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[1],
+      vp10_write_primitive_symmetric(w, params->motion_params.wmmat[1] *
+                                     GM_TRANS_ENCODE_FACTOR,
                                      GM_ABS_TRANS_BITS);
       break;
     default:
diff --git a/vp10/encoder/encodeframe.c b/vp10/encoder/encodeframe.c
index b5d0ce9..2e92f0d 100644
--- a/vp10/encoder/encodeframe.c
+++ b/vp10/encoder/encodeframe.c
@@ -4549,18 +4549,20 @@
                                               (1 << GM_TRANS_PREC_BITS) + 0.5);
   model->motion_params.wmmat[0] =
       clamp(model->motion_params.wmmat[0],
-            GM_TRANS_MIN, GM_TRANS_MAX);
+            GM_TRANS_MIN, GM_TRANS_MAX) *
+            GM_TRANS_DECODE_FACTOR;
   model->motion_params.wmmat[1] =
       clamp(model->motion_params.wmmat[1],
-            GM_TRANS_MIN, GM_TRANS_MAX);
+            GM_TRANS_MIN, GM_TRANS_MAX) *
+            GM_TRANS_DECODE_FACTOR;
 
   for (i = 2; i < n_params; ++i) {
     model->motion_params.wmmat[i] =
         (int) floor(H[i] *
-                    (1 << GM_ALPHA_PREC_BITS) + 0.5) -
-                    (!(i & 1) * (1 << GM_ALPHA_PREC_BITS));
+                    (1 << GM_ALPHA_PREC_BITS) + 0.5);
     model->motion_params.wmmat[i] = clamp(model->motion_params.wmmat[i],
-                                          GM_ALPHA_MIN, GM_ALPHA_MAX);
+                                          GM_ALPHA_MIN, GM_ALPHA_MAX) *
+                                          GM_ALPHA_DECODE_FACTOR;
     alpha_present |= (model->motion_params.wmmat[i] != 0);
   }
 
@@ -4579,6 +4581,7 @@
   if (type > HOMOGRAPHY)
       convert_to_params(H, type, model);
   model->gmtype = get_gmtype(model);
+  model->motion_params.wmtype = gm_to_trans_type(model->gmtype);
 }
 #endif  // CONFIG_GLOBAL_MOTION
 
@@ -4610,7 +4613,7 @@
     int frame;
     double H[9] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
     for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame)
-      convert_model_to_params(H, ROTZOOM, &cm->global_motion[frame]);
+      convert_model_to_params(H, AFFINE, &cm->global_motion[frame]);
   }
 #endif  // CONFIG_GLOBAL_MOTION
 
diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c
index faf15ff..2b867ef 100644
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -4077,7 +4077,8 @@
       this_rate += write_uniform_cost(2 * MAX_ANGLE_DELTAS + 1,
                                       MAX_ANGLE_DELTAS +
                                       mbmi->angle_delta[1]);
-    if (mode == DC_PRED)
+    if (mbmi->sb_type >= BLOCK_8X8 && mode == DC_PRED &&
+        ALLOW_FILTER_INTRA_MODES)
       this_rate += vp10_cost_bit(cpi->common.fc->ext_intra_probs[1], 0);
 #else
     if (!super_block_uvrd(cpi, x, &this_rate_tokenonly,
@@ -8349,25 +8350,18 @@
 }
 
 #if CONFIG_EXT_INTRA
-static void pick_ext_intra_iframe(VP10_COMP *cpi, MACROBLOCK *x,
-                                  PICK_MODE_CONTEXT *ctx, BLOCK_SIZE bsize,
-                                  int *rate_uv_intra, int *rate_uv_tokenonly,
-                                  int64_t *dist_uv, int *skip_uv,
-                                  PREDICTION_MODE *mode_uv,
-                                  EXT_INTRA_MODE_INFO *ext_intra_mode_info_uv,
-                                  PALETTE_MODE_INFO *pmi_uv,
-                                  int8_t *uv_angle_delta,
-                                  int palette_ctx, int skip_mask,
-                                  unsigned int *ref_costs_single,
-                                  int64_t *best_rd, int64_t *best_intra_rd,
-                                  PREDICTION_MODE *best_intra_mode,
-                                  int *best_mode_index, int *best_skip2,
-                                  int *best_mode_skippable,
+static void pick_ext_intra_interframe(
+    VP10_COMP *cpi, MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, BLOCK_SIZE bsize,
+    int *rate_uv_intra, int *rate_uv_tokenonly, int64_t *dist_uv, int *skip_uv,
+    PREDICTION_MODE *mode_uv, EXT_INTRA_MODE_INFO *ext_intra_mode_info_uv,
+    PALETTE_MODE_INFO *pmi_uv, int8_t *uv_angle_delta, int palette_ctx,
+    int skip_mask, unsigned int *ref_costs_single, int64_t *best_rd,
+    int64_t *best_intra_rd, PREDICTION_MODE *best_intra_mode,
+    int *best_mode_index, int *best_skip2, int *best_mode_skippable,
 #if CONFIG_SUPERTX
-                                  int *returnrate_nocoef,
+    int *returnrate_nocoef,
 #endif  // CONFIG_SUPERTX
-                                  int64_t *best_pred_rd,
-                                  MB_MODE_INFO *best_mbmode, RD_COST *rd_cost) {
+    int64_t *best_pred_rd, MB_MODE_INFO *best_mbmode, RD_COST *rd_cost) {
   VP10_COMMON *const cm = &cpi->common;
   MACROBLOCKD *const xd = &x->e_mbd;
   MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
@@ -8457,7 +8451,7 @@
                                 MAX_ANGLE_DELTAS +
                                 mbmi->angle_delta[1]);
   }
-  if (ALLOW_FILTER_INTRA_MODES && mbmi->mode == DC_PRED) {
+  if (mbmi->mode == DC_PRED) {
     rate2 += vp10_cost_bit(cpi->common.fc->ext_intra_probs[1],
                            mbmi->ext_intra_mode_info.use_ext_intra_mode[1]);
     if (mbmi->ext_intra_mode_info.use_ext_intra_mode[1])
@@ -9899,19 +9893,20 @@
   // TODO(huisu): ext-intra is turned off in lossless mode for now to
   // avoid a unit test failure
   if (!xd->lossless[mbmi->segment_id] &&
+      ALLOW_FILTER_INTRA_MODES &&
       mbmi->palette_mode_info.palette_size[0] == 0 && !dc_skipped &&
       best_mode_index >= 0 && (best_intra_rd >> 1)  < best_rd) {
-    pick_ext_intra_iframe(cpi, x, ctx, bsize, rate_uv_intra,
-                          rate_uv_tokenonly, dist_uv, skip_uv,
-                          mode_uv, ext_intra_mode_info_uv,
-                          pmi_uv, uv_angle_delta, palette_ctx, 0,
-                          ref_costs_single, &best_rd, &best_intra_rd,
-                          &best_intra_mode, &best_mode_index,
-                          &best_skip2, &best_mode_skippable,
+    pick_ext_intra_interframe(cpi, x, ctx, bsize, rate_uv_intra,
+                              rate_uv_tokenonly, dist_uv, skip_uv,
+                              mode_uv, ext_intra_mode_info_uv,
+                              pmi_uv, uv_angle_delta, palette_ctx, 0,
+                              ref_costs_single, &best_rd, &best_intra_rd,
+                              &best_intra_mode, &best_mode_index,
+                              &best_skip2, &best_mode_skippable,
 #if CONFIG_SUPERTX
-                          returnrate_nocoef,
+                              returnrate_nocoef,
 #endif  // CONFIG_SUPERTX
-                          best_pred_rd, &best_mbmode, rd_cost);
+                              best_pred_rd, &best_mbmode, rd_cost);
   }
 #endif  // CONFIG_EXT_INTRA