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,