Introduce dec_build_one_inter_predictor function

Similar to a function on the encoder side.
Also, cleanup function arguments for related helper functions.

Patch #6 in preparation for refactoring build_inter_predictors() and
dec_build_inter_predictors() functions.

BUG=aomedia:2635

Change-Id: I05da6ffd0556b63a567ae84af7f72206c3c5bc57
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 5056e8f..88637de 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -539,21 +539,25 @@
   }
 }
 
-static INLINE void dec_calc_subpel_params(
-    MACROBLOCKD *xd, const struct scale_factors *const sf, const MV mv,
-    int plane, const int pre_x, const int pre_y, int x, int y,
-    struct buf_2d *const pre_buf, SubpelParams *subpel_params, int bw, int bh,
-    PadBlock *block, int mi_x, int mi_y, MV32 *scaled_mv, int *subpel_x_mv,
-    int *subpel_y_mv) {
-  struct macroblockd_plane *const pd = &xd->plane[plane];
+static void dec_calc_subpel_params(const MV *const src_mv,
+                                   InterPredParams *const inter_pred_params,
+                                   const MACROBLOCKD *const xd, int mi_x,
+                                   int mi_y, uint8_t **pre,
+                                   SubpelParams *subpel_params, int *src_stride,
+                                   PadBlock *block, MV32 *scaled_mv,
+                                   int *subpel_x_mv, int *subpel_y_mv) {
+  const struct scale_factors *sf = inter_pred_params->scale_factors;
+  struct buf_2d *pre_buf = &inter_pred_params->ref_frame_buf;
+  const int bw = inter_pred_params->block_width;
+  const int bh = inter_pred_params->block_height;
   const int is_scaled = av1_is_scaled(sf);
   if (is_scaled) {
-    int ssx = pd->subsampling_x;
-    int ssy = pd->subsampling_y;
-    int orig_pos_y = (pre_y + y) << SUBPEL_BITS;
-    orig_pos_y += mv.row * (1 << (1 - ssy));
-    int orig_pos_x = (pre_x + x) << SUBPEL_BITS;
-    orig_pos_x += mv.col * (1 << (1 - ssx));
+    int ssx = inter_pred_params->subsampling_x;
+    int ssy = inter_pred_params->subsampling_y;
+    int orig_pos_y = inter_pred_params->pix_row << SUBPEL_BITS;
+    orig_pos_y += src_mv->row * (1 << (1 - ssy));
+    int orig_pos_x = inter_pred_params->pix_col << SUBPEL_BITS;
+    orig_pos_x += src_mv->col * (1 << (1 - ssx));
     int pos_y = sf->scale_value_y(orig_pos_y, sf);
     int pos_x = sf->scale_value_x(orig_pos_x, sf);
     pos_x += SCALE_EXTRA_OFF;
@@ -583,9 +587,10 @@
         ((pos_y + (bh - 1) * subpel_params->ys) >> SCALE_SUBPEL_BITS) + 1;
 
     MV temp_mv;
-    temp_mv = clamp_mv_to_umv_border_sb(xd, &mv, bw, bh, pd->subsampling_x,
-                                        pd->subsampling_y);
-    *scaled_mv = av1_scale_mv(&temp_mv, (mi_x + x), (mi_y + y), sf);
+    temp_mv = clamp_mv_to_umv_border_sb(xd, src_mv, bw, bh,
+                                        inter_pred_params->subsampling_x,
+                                        inter_pred_params->subsampling_y);
+    *scaled_mv = av1_scale_mv(&temp_mv, mi_x, mi_y, sf);
     scaled_mv->row += SCALE_EXTRA_OFF;
     scaled_mv->col += SCALE_EXTRA_OFF;
 
@@ -593,11 +598,12 @@
     *subpel_y_mv = scaled_mv->row & SCALE_SUBPEL_MASK;
   } else {
     // Get block position in current frame.
-    int pos_x = (pre_x + x) << SUBPEL_BITS;
-    int pos_y = (pre_y + y) << SUBPEL_BITS;
+    int pos_x = inter_pred_params->pix_col << SUBPEL_BITS;
+    int pos_y = inter_pred_params->pix_row << SUBPEL_BITS;
 
     const MV mv_q4 = clamp_mv_to_umv_border_sb(
-        xd, &mv, bw, bh, pd->subsampling_x, pd->subsampling_y);
+        xd, src_mv, bw, bh, inter_pred_params->subsampling_x,
+        inter_pred_params->subsampling_y);
     subpel_params->xs = subpel_params->ys = SCALE_SUBPEL_SHIFTS;
     subpel_params->subpel_x = (mv_q4.col & SUBPEL_MASK) << SCALE_EXTRA_BITS;
     subpel_params->subpel_y = (mv_q4.row & SUBPEL_MASK) << SCALE_EXTRA_BITS;
@@ -617,32 +623,46 @@
     *subpel_x_mv = scaled_mv->col & SUBPEL_MASK;
     *subpel_y_mv = scaled_mv->row & SUBPEL_MASK;
   }
+  *pre = pre_buf->buf0 + block->y0 * pre_buf->stride + block->x0;
+  *src_stride = pre_buf->stride;
 }
 
 static void dec_calc_subpel_params_and_extend(
-    MACROBLOCKD *xd, const struct scale_factors *const sf, const MV mv,
-    int plane, const MB_MODE_INFO *mi, int pre_x, int pre_y, int x, int y,
-    struct buf_2d *const pre_buf, int bw, int bh, int mi_x, int mi_y, int ref,
-    int is_intrabc, int build_for_obmc,
-    const WarpTypesAllowed *const warp_types, uint8_t **pre,
+    const MV *const src_mv, InterPredParams *const inter_pred_params,
+    MACROBLOCKD *xd, int mi_x, int mi_y, int ref, uint8_t **pre,
     SubpelParams *subpel_params, int *src_stride) {
   PadBlock block;
   MV32 scaled_mv;
   int subpel_x_mv, subpel_y_mv;
-  dec_calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, x, y, pre_buf,
-                         subpel_params, bw, bh, &block, mi_x, mi_y, &scaled_mv,
+  dec_calc_subpel_params(src_mv, inter_pred_params, xd, mi_x, mi_y, pre,
+                         subpel_params, src_stride, &block, &scaled_mv,
                          &subpel_x_mv, &subpel_y_mv);
-  *pre = pre_buf->buf0 + block.y0 * pre_buf->stride + block.x0;
-  *src_stride = pre_buf->stride;
-  const int highbd = is_cur_buf_hbd(xd);
-  const int do_warp =
-      bw >= 8 && bh >= 8 &&
-      av1_allow_warp(mi, warp_types, &xd->global_motion[mi->ref_frame[ref]],
-                     build_for_obmc, sf, NULL) &&
-      (xd->cur_frame_force_integer_mv == 0);
-  extend_mc_border(sf, pre_buf, scaled_mv, block, subpel_x_mv, subpel_y_mv,
-                   do_warp, is_intrabc, highbd, xd->mc_buf[ref], pre,
-                   src_stride);
+  extend_mc_border(
+      inter_pred_params->scale_factors, &inter_pred_params->ref_frame_buf,
+      scaled_mv, block, subpel_x_mv, subpel_y_mv,
+      inter_pred_params->mode == WARP_PRED, inter_pred_params->is_intrabc,
+      inter_pred_params->use_hbd_buf, xd->mc_buf[ref], pre, src_stride);
+}
+
+static void dec_build_one_inter_predictor(uint8_t *dst, int dst_stride,
+                                          const MV *const src_mv,
+                                          InterPredParams *inter_pred_params,
+                                          MACROBLOCKD *xd, int mi_x, int mi_y,
+                                          int ref) {
+  SubpelParams subpel_params;
+  uint8_t *src;
+  int src_stride;
+  dec_calc_subpel_params_and_extend(src_mv, inter_pred_params, xd, mi_x, mi_y,
+                                    ref, &src, &subpel_params, &src_stride);
+
+  if (inter_pred_params->comp_mode == UNIFORM_SINGLE ||
+      inter_pred_params->comp_mode == UNIFORM_COMP) {
+    av1_make_inter_predictor(src, src_stride, dst, dst_stride,
+                             inter_pred_params, &subpel_params);
+  } else {
+    av1_make_masked_inter_predictor(src, src_stride, dst, dst_stride,
+                                    inter_pred_params, &subpel_params);
+  }
 }
 
 static void dec_build_inter_predictors(const AV1_COMMON *cm, MACROBLOCKD *xd,
@@ -726,18 +746,6 @@
 
         const MV mv = this_mbmi->mv[ref].as_mv;
 
-        const WarpTypesAllowed warp_types = {
-          is_global[ref], this_mbmi->motion_mode == WARPED_CAUSAL
-        };
-
-        SubpelParams subpel_params;
-        uint8_t *pre;
-        int src_stride;
-        dec_calc_subpel_params_and_extend(
-            xd, sf, mv, plane, mi, pre_x, pre_y, x, y, &pre_buf, bw, bh, mi_x,
-            mi_y, ref, is_intrabc, build_for_obmc, &warp_types, &pre,
-            &subpel_params, &src_stride);
-
         InterPredParams inter_pred_params;
         av1_init_inter_params(&inter_pred_params, b4_w, b4_h, pre_y + y,
                               pre_x + x, pd->subsampling_x, pd->subsampling_y,
@@ -747,8 +755,9 @@
             ref, plane, xd->tmp_conv_dst, tmp_dst_stride, is_compound, xd->bd);
         inter_pred_params.conv_params.use_dist_wtd_comp_avg = 0;
 
-        av1_make_inter_predictor(pre, src_stride, dst, dst_buf->stride,
-                                 &inter_pred_params, &subpel_params);
+        dec_build_one_inter_predictor(dst, dst_buf->stride, &mv,
+                                      &inter_pred_params, xd, mi_x + x,
+                                      mi_y + y, ref);
 
         ++col;
       }
@@ -770,14 +779,6 @@
       const WarpTypesAllowed warp_types = { is_global[ref],
                                             mi->motion_mode == WARPED_CAUSAL };
 
-      SubpelParams subpel_params;
-      uint8_t *pre;
-      int src_stride;
-      dec_calc_subpel_params_and_extend(xd, sf, mv, plane, mi, pre_x, pre_y, 0,
-                                        0, pre_buf, bw, bh, mi_x, mi_y, ref,
-                                        is_intrabc, build_for_obmc, &warp_types,
-                                        &pre, &subpel_params, &src_stride);
-
       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,
@@ -801,14 +802,8 @@
         inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
       }
 
-      if (inter_pred_params.comp_mode == UNIFORM_SINGLE ||
-          inter_pred_params.comp_mode == UNIFORM_COMP) {
-        av1_make_inter_predictor(pre, src_stride, dst, dst_buf->stride,
-                                 &inter_pred_params, &subpel_params);
-      } else {
-        av1_make_masked_inter_predictor(pre, src_stride, dst, dst_buf->stride,
-                                        &inter_pred_params, &subpel_params);
-      }
+      dec_build_one_inter_predictor(dst, dst_buf->stride, &mv,
+                                    &inter_pred_params, xd, mi_x, mi_y, ref);
     }
   }
 }