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,