Decompose single and compound inter prediction

Separate the single and compound inter prediction functionality.

Change-Id: Ifd6f2b6ef7aff10617dbfdb9cc4238dac83d2a14
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 22a0429..52b4173 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -74,7 +74,8 @@
   inter_pred_params->is_intrabc = is_intrabc;
   inter_pred_params->scale_factors = sf;
   inter_pred_params->ref_frame_buf = *ref_buf;
-  inter_pred_params->mode = UNIFORM_PRED;
+  inter_pred_params->mode = TRANSLATION_PRED;
+  inter_pred_params->comp_mode = UNIFORM_SINGLE;
 
   if (is_intrabc) {
     inter_pred_params->interp_filter_params[0] = &av1_intrabc_filter_params;
@@ -89,6 +90,10 @@
   }
 }
 
+void av1_init_comp_mode(InterPredParams *inter_pred_params) {
+  inter_pred_params->comp_mode = UNIFORM_COMP;
+}
+
 void av1_init_warp_params(InterPredParams *inter_pred_params,
                           const struct buf_2d *ref_buf,
                           const WarpTypesAllowed *warp_types, int ref,
@@ -109,10 +114,8 @@
 void av1_init_mask_comp(InterPredParams *inter_pred_params, BLOCK_SIZE bsize,
                         const INTERINTER_COMPOUND_DATA *mask_comp) {
   inter_pred_params->sb_type = bsize;
-  if (inter_pred_params->conv_params.do_average &&
-      is_masked_compound_type(mask_comp->type)) {
-    inter_pred_params->mask_comp = *mask_comp;
-  }
+  inter_pred_params->mask_comp = *mask_comp;
+  inter_pred_params->comp_mode = MASK_COMP;
 }
 
 void av1_make_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
@@ -134,7 +137,7 @@
         inter_pred_params->block_width, inter_pred_params->block_height,
         dst_stride, inter_pred_params->subsampling_x,
         inter_pred_params->subsampling_y, &inter_pred_params->conv_params);
-  } else if (inter_pred_params->mode == UNIFORM_PRED) {
+  } else if (inter_pred_params->mode == TRANSLATION_PRED) {
 #if CONFIG_AV1_HIGHBITDEPTH
     if (inter_pred_params->use_hbd_buf) {
       highbd_inter_predictor(
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index 5e6488a..7b3b51f 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -92,13 +92,19 @@
 };
 
 typedef enum InterPredMode {
-  UNIFORM_PRED,
+  TRANSLATION_PRED,
   WARP_PRED,
-  MASK_PRED,
 } InterPredMode;
 
+typedef enum InterCompMode {
+  UNIFORM_SINGLE,
+  UNIFORM_COMP,
+  MASK_COMP,
+} InterCompMode;
+
 typedef struct InterPredParams {
   InterPredMode mode;
+  InterCompMode comp_mode;
   WarpedMotionParams warp_params;
   ConvolveParams conv_params;
   const InterpFilterParams *interp_filter_params[2];
@@ -125,6 +131,8 @@
                            const struct buf_2d *ref_buf,
                            int_interpfilters interp_filters);
 
+void av1_init_comp_mode(InterPredParams *inter_pred_params);
+
 void av1_init_warp_params(InterPredParams *inter_pred_params,
                           const struct buf_2d *ref_buf,
                           const WarpTypesAllowed *warp_types, int ref,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index cbea8f3..284cbd0 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -826,13 +826,16 @@
                             mi_x >> pd->subsampling_x, pd->subsampling_x,
                             pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd),
                             mi->use_intrabc, sf, pre_buf, mi->interp_filters);
-
+      if (is_compound) av1_init_comp_mode(&inter_pred_params);
       if (!build_for_obmc)
         av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types,
                              ref, xd, mi);
 
-      av1_init_mask_comp(&inter_pred_params, mi->sb_type, &mi->interinter_comp);
-      inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+      if (is_masked_compound_type(mi->interinter_comp.type)) {
+        av1_init_mask_comp(&inter_pred_params, mi->sb_type,
+                           &mi->interinter_comp);
+        inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+      }
 
       if (ref && is_masked_compound_type(mi->interinter_comp.type)) {
         // masked compound type has its own average mechanism
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index b424829..6c9ec55 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -175,55 +175,61 @@
 
   {
     InterPredParams inter_pred_params;
-    inter_pred_params.conv_params = get_conv_params_no_round(
-        0, plane, xd->tmp_conv_dst, MAX_SB_SIZE, is_compound, xd->bd);
-
-    av1_dist_wtd_comp_weight_assign(
-        cm, mi, 0, &inter_pred_params.conv_params.fwd_offset,
-        &inter_pred_params.conv_params.bck_offset,
-        &inter_pred_params.conv_params.use_dist_wtd_comp_avg, is_compound);
 
     struct buf_2d *const dst_buf = &pd->dst;
     uint8_t *const dst = dst_buf->buf;
     for (ref = 0; ref < 1 + is_compound; ++ref) {
       const struct scale_factors *const sf =
           is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref];
-      struct buf_2d *const pre_buf = is_intrabc ? dst_buf : &pd->pre[ref];
+      struct buf_2d pre_buf = is_intrabc ? *dst_buf : pd->pre[ref];
       const MV mv = mi->mv[ref].as_mv;
 
       uint8_t *pre;
       SubpelParams subpel_params;
-      calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, 0, 0, pre_buf, &pre,
+      calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, 0, 0, &pre_buf, &pre,
                          &subpel_params, bw, bh);
 
       WarpTypesAllowed warp_types;
       warp_types.global_warp_allowed = is_global[ref];
       warp_types.local_warp_allowed = mi->motion_mode == WARPED_CAUSAL;
 
-      av1_init_inter_params(&inter_pred_params, bw, bh,
-                            mi_y >> pd->subsampling_y,
-                            mi_x >> pd->subsampling_x, pd->subsampling_x,
-                            pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd),
-                            mi->use_intrabc, sf, pre_buf, mi->interp_filters);
+      av1_init_inter_params(&inter_pred_params, bw, bh, pre_y, pre_x,
+                            pd->subsampling_x, pd->subsampling_y, xd->bd,
+                            is_cur_buf_hbd(xd), mi->use_intrabc, sf, &pre_buf,
+                            mi->interp_filters);
+
+      if (is_compound) av1_init_comp_mode(&inter_pred_params);
+
+      inter_pred_params.conv_params = get_conv_params_no_round(
+          0, plane, xd->tmp_conv_dst, MAX_SB_SIZE, is_compound, xd->bd);
+
+      av1_dist_wtd_comp_weight_assign(
+          cm, mi, 0, &inter_pred_params.conv_params.fwd_offset,
+          &inter_pred_params.conv_params.bck_offset,
+          &inter_pred_params.conv_params.use_dist_wtd_comp_avg, is_compound);
 
       inter_pred_params.conv_params.do_average = ref;
 
-      av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types, ref,
-                           xd, mi);
+      av1_init_warp_params(&inter_pred_params, &pre_buf, &warp_types, ref, xd,
+                           mi);
 
-      av1_init_mask_comp(&inter_pred_params, mi->sb_type, &mi->interinter_comp);
-      // Assigne physical buffer
-      inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+      if (is_masked_compound_type(mi->interinter_comp.type)) {
+        av1_init_mask_comp(&inter_pred_params, mi->sb_type,
+                           &mi->interinter_comp);
+        // Assigne physical buffer
+        inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+      }
 
       if (ref && is_masked_compound_type(mi->interinter_comp.type)) {
         // masked compound type has its own average mechanism
         inter_pred_params.conv_params.do_average = 0;
-        av1_make_masked_inter_predictor(pre, pre_buf->stride, dst,
+        av1_make_masked_inter_predictor(pre, pre_buf.stride, dst,
                                         dst_buf->stride, &inter_pred_params,
                                         &subpel_params);
       } else {
-        av1_make_inter_predictor(pre, pre_buf->stride, dst, dst_buf->stride,
-                                 &inter_pred_params, &subpel_params);
+        av1_build_inter_predictor(pre_buf.buf, pre_buf.stride, dst,
+                                  dst_buf->stride, &mv, mi_x, mi_y,
+                                  &inter_pred_params);
       }
     }
   }
@@ -272,7 +278,6 @@
                                InterPredParams *inter_pred_params) {
   SubpelParams subpel_params;
   const struct scale_factors *sf = inter_pred_params->scale_factors;
-
   (void)pix_row;
   (void)pix_col;