Avoid changing motion_mode after rd search
Check if the global motion undergoes non-translation mode. If that
is the case, do not force a newmv mode into globalmv mode.
This will resolve a mismatch bug of txk_sel.
Change-Id: I589f1619427f02045f8cf49bdea05f348f076236
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c7713d8..d0fbe6b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -10686,6 +10686,14 @@
)
.as_int
: 0;
+
+ // Check if the global motion mode is non-translational.
+ int is_nontran_gm = cm->global_motion[refs[0]].wmtype <= TRANSLATION;
+ if (comp_pred_mode)
+ is_nontran_gm &= cm->global_motion[refs[1]].wmtype <= TRANSLATION;
+ if (AOMMIN(block_size_wide[bsize], block_size_high[bsize]) < 8)
+ is_nontran_gm = 1;
+
if (!comp_pred_mode) {
int ref_set = (mbmi_ext->ref_mv_count[rf_type] >= 2)
? AOMMIN(2, mbmi_ext->ref_mv_count[rf_type] - 2)
@@ -10701,7 +10709,7 @@
if (frame_mv[NEARESTMV][refs[0]].as_int == best_mbmode.mv[0].as_int)
best_mbmode.mode = NEARESTMV;
- else if (best_mbmode.mv[0].as_int == zeromv[0].as_int)
+ else if (best_mbmode.mv[0].as_int == zeromv[0].as_int && is_nontran_gm)
best_mbmode.mode = GLOBALMV;
} else {
int_mv nearestmv[2];
@@ -10744,7 +10752,7 @@
if (best_mbmode.mode == NEW_NEWMV &&
best_mbmode.mv[0].as_int == zeromv[0].as_int &&
- best_mbmode.mv[1].as_int == zeromv[1].as_int)
+ best_mbmode.mv[1].as_int == zeromv[1].as_int && is_nontran_gm)
best_mbmode.mode = GLOBAL_GLOBALMV;
}
}
@@ -10815,13 +10823,11 @@
// Correct the motion mode for GLOBALMV
const MOTION_MODE last_motion_mode_allowed =
motion_mode_allowed(xd->global_motion, xd, xd->mi[0]);
- if (mbmi->motion_mode > last_motion_mode_allowed)
- mbmi->motion_mode = last_motion_mode_allowed;
-
- // Correct the interpolation filter for GLOBALMV
+ if (mbmi->motion_mode > last_motion_mode_allowed) assert(0);
if (is_nontrans_global_motion(xd)) {
- mbmi->interp_filters = av1_broadcast_interp_filter(
- av1_unswitchable_filter(cm->interp_filter));
+ assert(mbmi->interp_filters ==
+ av1_broadcast_interp_filter(
+ av1_unswitchable_filter(cm->interp_filter)));
}
}