Common av1_build_one_inter_predictor function.

This refactors dec_build_one_inter_predictor() and
av1_enc_build_one_inter_predictor() functions, using a function pointer
for the logic that differs between the encoder and decoder. Thin
wrappers for encoder and decoder still exist, as they are directly
called in some places.

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

BUG=aomedia:2635

Change-Id: I1b07d193e4df24a8c1f0f6038151b7eeafd4ab95
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index b11f178..34ae969 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -702,6 +702,26 @@
       inter_pred_params->block_width, inter_pred_params);
 }
 
+void av1_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, CalcSubpelParamsFunc calc_subpel_params_func) {
+  SubpelParams subpel_params;
+  uint8_t *src;
+  int src_stride;
+  calc_subpel_params_func(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);
+  }
+}
+
 void av1_dist_wtd_comp_weight_assign(const AV1_COMMON *cm,
                                      const MB_MODE_INFO *mbmi, int order_idx,
                                      int *fwd_offset, int *bck_offset,
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index 89f9ca7..12e9832 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -246,6 +246,18 @@
                                      InterPredParams *inter_pred_params,
                                      const SubpelParams *subpel_params);
 
+typedef void (*CalcSubpelParamsFunc)(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);
+
+void av1_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, CalcSubpelParamsFunc calc_subpel_params_func);
+
 // TODO(jkoleszar): yet another mv clamping function :-(
 static INLINE MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd,
                                            const MV *src_mv, int bw, int bh,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 88637de..e78e49d 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -649,20 +649,9 @@
                                           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);
-  }
+  av1_build_one_inter_predictor(dst, dst_stride, src_mv, inter_pred_params, xd,
+                                mi_x, mi_y, ref,
+                                dec_calc_subpel_params_and_extend);
 }
 
 static void dec_build_inter_predictors(const AV1_COMMON *cm, MACROBLOCKD *xd,
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index 51c6e0e..fa950ad 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -228,8 +228,16 @@
 
 static void enc_calc_subpel_params(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) {
+  // These are part of the function signature to use this function through a
+  // function pointer. See typedef of 'CalcSubpelParamsFunc'.
+  (void)xd;
+  (void)mi_x;
+  (void)mi_y;
+  (void)ref;
+
   const struct scale_factors *sf = inter_pred_params->scale_factors;
 
   struct buf_2d *pre_buf = &inter_pred_params->ref_frame_buf;
@@ -263,19 +271,9 @@
 void av1_enc_build_one_inter_predictor(uint8_t *dst, int dst_stride,
                                        const MV *src_mv,
                                        InterPredParams *inter_pred_params) {
-  uint8_t *src;
-  SubpelParams subpel_params;
-  int src_stride;
-  enc_calc_subpel_params(src_mv, inter_pred_params, &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);
+  av1_build_one_inter_predictor(dst, dst_stride, src_mv, inter_pred_params,
+                                NULL /* xd */, 0 /* mi_x */, 0 /* mi_y */,
+                                0 /* ref */, enc_calc_subpel_params);
 }
 
 static INLINE void build_obmc_prediction(MACROBLOCKD *xd, int rel_mi_row,