Add variance-based pel MV search
Used for ILLUM_MCOMP experiment
Change-Id: I9ce6676c225804a047f9c4a93dfa42d0690c460a
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c
index a2e58ef..495f7ce 100644
--- a/av1/encoder/mcomp.c
+++ b/av1/encoder/mcomp.c
@@ -3786,7 +3786,7 @@
const MV neighbors[4] = { { -1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 0 } };
const MV fcenter_mv = { center_mv->row >> 3, center_mv->col >> 3 };
unsigned int bestvar =
- av1_get_mvpred_var(cm, x, center_mv, ref_mv, fn_ptr, 1);
+ av1_get_mvpred_var(cm, x, &fcenter_mv, ref_mv, fn_ptr, 1);
int i, j;
for (i = 0; i < search_range; i++) {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index e91d747..0fa322b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -10702,6 +10702,8 @@
// ignored. This value must be non-zero.
#define IGNORE_MODE -1
+#define ILLUM_MCOMP_VAR_SEARCH 1
+
static int handle_smooth_inter_intra_mode(
const AV1_COMP *const cpi, MACROBLOCK *const x, BLOCK_SIZE bsize,
MB_MODE_INFO *mbmi, int64_t ref_best_rd, int *rate_mv, int *rmode,
@@ -10717,10 +10719,27 @@
const int mi_row = xd->mi_row;
const int mi_col = xd->mi_col;
mbmi->use_wedge_interintra = 0;
+#if CONFIG_ILLUM_MCOMP
+ MV old_best = x->best_mv.as_mv;
+ bool mv_changed = false;
+#endif
int j = 0;
if (cpi->sf.reuse_inter_intra_mode == 0 ||
*best_interintra_mode == INTERINTRA_MODES) {
for (j = 0; j < total_modes; ++j) {
+#if CONFIG_ILLUM_MCOMP
+ if (j == II_ILLUM_MCOMP_PRED && ILLUM_MCOMP_VAR_SEARCH) {
+ mv_changed = true;
+ single_motion_search(cpi, x, bsize, 0, &tmp_rate_mv, true);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
+ } else if (j != II_ILLUM_MCOMP_PRED && mv_changed) {
+ mv_changed = false;
+ x->best_mv.as_mv = old_best;
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
+ }
+#endif // CONFIG_ILLUM_MCOMP
if ((!cpi->oxcf.enable_smooth_intra || cpi->sf.disable_smooth_intra) &&
(INTERINTRA_MODE)j == II_SMOOTH_PRED)
continue;
@@ -10767,6 +10786,20 @@
args->inter_intra_mode[mbmi->ref_frame[0]] = *best_interintra_mode;
}
+#if CONFIG_ILLUM_MCOMP
+ if (*best_interintra_mode == II_ILLUM_MCOMP_PRED && ILLUM_MCOMP_VAR_SEARCH &&
+ !mv_changed) {
+ mv_changed = true;
+ single_motion_search(cpi, x, bsize, 0, &tmp_rate_mv, true);
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
+ } else if (*best_interintra_mode != II_ILLUM_MCOMP_PRED && mv_changed) {
+ mv_changed = false;
+ x->best_mv.as_mv = old_best;
+ av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize,
+ AOM_PLANE_Y, AOM_PLANE_Y);
+ }
+#endif // CONFIG_ILLUM_MCOMP
assert(IMPLIES(
!cpi->oxcf.enable_smooth_interintra || cpi->sf.disable_smooth_interintra,
*best_interintra_mode != II_SMOOTH_PRED));