Support for homography in global motion experiment
Change-Id: If4a480633032d8738a84fa8173c6ebd90564f0a4
diff --git a/av1/common/entropymv.c b/av1/common/entropymv.c
index a727169..2443d71 100644
--- a/av1/common/entropymv.c
+++ b/av1/common/entropymv.c
@@ -128,7 +128,15 @@
};
#if CONFIG_GLOBAL_MOTION
-#if GLOBAL_TRANS_TYPES == 4
+#if GLOBAL_TRANS_TYPES == 5
+const aom_tree_index av1_global_motion_types_tree[TREE_SIZE(
+ GLOBAL_TRANS_TYPES)] = { -IDENTITY, 2, -TRANSLATION, 4, -ROTZOOM, 6,
+ -AFFINE, -HOMOGRAPHY };
+
+static const aom_prob default_global_motion_types_prob[GLOBAL_TRANS_TYPES - 1] =
+ { 224, 128, 192, 192 };
+
+#elif GLOBAL_TRANS_TYPES == 4
const aom_tree_index av1_global_motion_types_tree[TREE_SIZE(
GLOBAL_TRANS_TYPES)] = { -IDENTITY, 2, -TRANSLATION, 4, -ROTZOOM, -AFFINE };
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 4870899..b4a56f5 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4027,17 +4027,21 @@
set_default_gmparams(params);
params->wmtype = type;
switch (type) {
- case IDENTITY: break;
+ case HOMOGRAPHY:
+ params->wmmat[6] = aom_read_primitive_symmetric(r, GM_ABS_ROW3HOMO_BITS) *
+ GM_ROW3HOMO_DECODE_FACTOR;
+ params->wmmat[7] = aom_read_primitive_symmetric(r, GM_ABS_ROW3HOMO_BITS) *
+ GM_ROW3HOMO_DECODE_FACTOR;
case AFFINE:
case ROTZOOM:
- params->wmmat[2] = (aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
- GM_ALPHA_DECODE_FACTOR) +
+ params->wmmat[2] = aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
+ GM_ALPHA_DECODE_FACTOR +
(1 << WARPEDMODEL_PREC_BITS);
params->wmmat[3] = aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
GM_ALPHA_DECODE_FACTOR;
- if (type == AFFINE) {
- params->wmmat[4] = (aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
- GM_ALPHA_DECODE_FACTOR);
+ if (type == AFFINE || type == HOMOGRAPHY) {
+ params->wmmat[4] = aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
+ GM_ALPHA_DECODE_FACTOR;
params->wmmat[5] = aom_read_primitive_symmetric(r, GM_ABS_ALPHA_BITS) *
GM_ALPHA_DECODE_FACTOR +
(1 << WARPEDMODEL_PREC_BITS);
@@ -4052,6 +4056,7 @@
params->wmmat[1] = aom_read_primitive_symmetric(r, GM_ABS_TRANS_BITS) *
GM_TRANS_DECODE_FACTOR;
break;
+ case IDENTITY: break;
default: assert(0);
}
}
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 4192801..a36f0c9 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3970,7 +3970,14 @@
av1_write_token(w, av1_global_motion_types_tree, probs,
&global_motion_types_encodings[type]);
switch (type) {
- case IDENTITY: break;
+ case HOMOGRAPHY:
+ aom_write_primitive_symmetric(
+ w, (params->wmmat[6] >> GM_ROW3HOMO_PREC_DIFF),
+ GM_ABS_ROW3HOMO_BITS);
+ aom_write_primitive_symmetric(
+ w, (params->wmmat[7] >> GM_ROW3HOMO_PREC_DIFF),
+ GM_ABS_ROW3HOMO_BITS);
+ // fallthrough intended
case AFFINE:
case ROTZOOM:
aom_write_primitive_symmetric(
@@ -3979,7 +3986,7 @@
GM_ABS_ALPHA_BITS);
aom_write_primitive_symmetric(w, (params->wmmat[3] >> GM_ALPHA_PREC_DIFF),
GM_ABS_ALPHA_BITS);
- if (type == AFFINE) {
+ if (type == AFFINE || type == HOMOGRAPHY) {
aom_write_primitive_symmetric(
w, (params->wmmat[4] >> GM_ALPHA_PREC_DIFF), GM_ABS_ALPHA_BITS);
aom_write_primitive_symmetric(w,
@@ -3994,6 +4001,7 @@
aom_write_primitive_symmetric(w, (params->wmmat[1] >> GM_TRANS_PREC_DIFF),
GM_ABS_TRANS_BITS);
break;
+ case IDENTITY: break;
default: assert(0);
}
}
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 8922417..bbd84d5 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4614,7 +4614,6 @@
#if CONFIG_GLOBAL_MOTION
#define MIN_TRANS_THRESH (1 * GM_TRANS_DECODE_FACTOR)
#define GLOBAL_MOTION_ADVANTAGE_THRESH 0.75
-#define GLOBAL_MOTION_MODEL ROTZOOM
// Adds some offset to a global motion parameter and handles
// all of the necessary precision shifts, clamping, and
@@ -4798,7 +4797,7 @@
for (frame = LAST_FRAME; frame <= ALTREF_FRAME; ++frame) {
ref_buf = get_ref_frame_buffer(cpi, frame);
if (ref_buf) {
- if (compute_global_motion_feature_based(GLOBAL_MOTION_MODEL,
+ if (compute_global_motion_feature_based(GLOBAL_TRANS_TYPES - 1,
cpi->Source, ref_buf, params)) {
convert_model_to_params(params, &cm->global_motion[frame]);
if (cm->global_motion[frame].wmtype != IDENTITY) {
diff --git a/av1/encoder/ransac.c b/av1/encoder/ransac.c
index 33b45ca..31614ea 100644
--- a/av1/encoder/ransac.c
+++ b/av1/encoder/ransac.c
@@ -240,7 +240,6 @@
int temp;
double fracinliers, pNoOutliers, mean_distance, variance;
- assert(num_inliers > 1);
mean_distance = sum_distance / ((double)num_inliers);
variance = sum_distance_squared / ((double)num_inliers - 1.0) -
mean_distance * mean_distance * ((double)num_inliers) /
@@ -262,7 +261,6 @@
pNoOutliers = 1 - pow(fracinliers, minpts);
pNoOutliers = fmax(EPS, pNoOutliers);
pNoOutliers = fmin(1 - EPS, pNoOutliers);
- // assert(fabs(1.0 - pNoOutliers) > 0.00001);
temp = (int)(log(1.0 - PROBABILITY_REQUIRED) / log(pNoOutliers));
if (temp > 0 && temp < N) {
N = AOMMAX(temp, MIN_TRIALS);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index b2d78f9..3242f3d 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -4337,6 +4337,10 @@
TransformationType type = gm->wmtype;
av1_cost_tokens(gmtype_cost, probs, av1_global_motion_types_tree);
switch (type) {
+ case HOMOGRAPHY:
+ bits = (GM_ABS_TRANS_BITS + 1) * 2 + (GM_ABS_ALPHA_BITS + 1) * 4 +
+ (GM_ABS_ROW3HOMO_BITS + 1) * 2;
+ break;
case AFFINE:
bits = (GM_ABS_TRANS_BITS + 1) * 2 + (GM_ABS_ALPHA_BITS + 1) * 4;
break;