Add gm parameter coding based on ref parameters
Change-Id: Ic2344a6475b967fa07f70b3ffad2714de657bb49
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 382d5cc..8ebbedc 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -4598,6 +4598,7 @@
#if CONFIG_GLOBAL_MOTION
static void write_global_motion_params(WarpedMotionParams *params,
+ WarpedMotionParams *ref_params,
aom_prob *probs, aom_writer *w,
int allow_hp) {
TransformationType type = params->wmtype;
@@ -4610,31 +4611,40 @@
case HORTRAPEZOID:
case VERTRAPEZOID:
if (type != HORTRAPEZOID)
- aom_write_primitive_symmetric(
- w, (params->wmmat[6] >> GM_ROW3HOMO_PREC_DIFF),
- GM_ABS_ROW3HOMO_BITS);
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ROW3HOMO_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[6] >> GM_ROW3HOMO_PREC_DIFF),
+ (params->wmmat[6] >> GM_ROW3HOMO_PREC_DIFF));
if (type != VERTRAPEZOID)
- aom_write_primitive_symmetric(
- w, (params->wmmat[7] >> GM_ROW3HOMO_PREC_DIFF),
- GM_ABS_ROW3HOMO_BITS);
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ROW3HOMO_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[7] >> GM_ROW3HOMO_PREC_DIFF),
+ (params->wmmat[7] >> GM_ROW3HOMO_PREC_DIFF));
// fallthrough intended
case AFFINE:
case ROTZOOM:
- aom_write_primitive_symmetric(
- w,
- (params->wmmat[2] >> GM_ALPHA_PREC_DIFF) - (1 << GM_ALPHA_PREC_BITS),
- GM_ABS_ALPHA_BITS);
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ALPHA_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[2] >> GM_ALPHA_PREC_DIFF) -
+ (1 << GM_ALPHA_PREC_BITS),
+ (params->wmmat[2] >> GM_ALPHA_PREC_DIFF) - (1 << GM_ALPHA_PREC_BITS));
if (type != VERTRAPEZOID)
- aom_write_primitive_symmetric(
- w, (params->wmmat[3] >> GM_ALPHA_PREC_DIFF), GM_ABS_ALPHA_BITS);
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ALPHA_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[3] >> GM_ALPHA_PREC_DIFF),
+ (params->wmmat[3] >> GM_ALPHA_PREC_DIFF));
if (type >= AFFINE) {
if (type != HORTRAPEZOID)
- aom_write_primitive_symmetric(
- w, (params->wmmat[4] >> GM_ALPHA_PREC_DIFF), GM_ABS_ALPHA_BITS);
- aom_write_primitive_symmetric(w,
- (params->wmmat[5] >> GM_ALPHA_PREC_DIFF) -
- (1 << GM_ALPHA_PREC_BITS),
- GM_ABS_ALPHA_BITS);
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ALPHA_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[4] >> GM_ALPHA_PREC_DIFF),
+ (params->wmmat[4] >> GM_ALPHA_PREC_DIFF));
+ aom_write_signed_primitive_refsubexpfin(
+ w, GM_ALPHA_MAX + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[5] >> GM_ALPHA_PREC_DIFF) -
+ (1 << GM_ALPHA_PREC_BITS),
+ (params->wmmat[5] >> GM_ALPHA_PREC_DIFF) -
+ (1 << GM_ALPHA_PREC_BITS));
}
// fallthrough intended
case TRANSLATION:
@@ -4643,10 +4653,14 @@
trans_prec_diff = (type == TRANSLATION)
? GM_TRANS_ONLY_PREC_DIFF + !allow_hp
: GM_TRANS_PREC_DIFF;
- aom_write_primitive_symmetric(w, (params->wmmat[0] >> trans_prec_diff),
- trans_bits);
- aom_write_primitive_symmetric(w, (params->wmmat[1] >> trans_prec_diff),
- trans_bits);
+ aom_write_signed_primitive_refsubexpfin(
+ w, (1 << trans_bits) + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[0] >> trans_prec_diff),
+ (params->wmmat[0] >> trans_prec_diff));
+ aom_write_signed_primitive_refsubexpfin(
+ w, (1 << trans_bits) + 1, SUBEXPFIN_K,
+ (ref_params->wmmat[1] >> trans_prec_diff),
+ (params->wmmat[1] >> trans_prec_diff));
break;
case IDENTITY: break;
default: assert(0);
@@ -4665,9 +4679,9 @@
set_default_gmparams(&cm->global_motion[frame]);
}
#endif
- write_global_motion_params(&cm->global_motion[frame],
- cm->fc->global_motion_types_prob, w,
- cm->allow_high_precision_mv);
+ write_global_motion_params(
+ &cm->global_motion[frame], &cm->prev_frame->global_motion[frame],
+ cm->fc->global_motion_types_prob, w, cm->allow_high_precision_mv);
/*
printf("Frame %d/%d: Enc Ref %d (used %d): %d %d %d %d\n",
cm->current_video_frame, cm->show_frame, frame,