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