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));