Introduce dec_calc_subpel_params_and_extend() func
In preparation for refactoring build_inter_predictors() and
dec_build_inter_predictors() functions.
BUG=aomedia:2635
Change-Id: I3bd52e68ab762b27eef71b30a91ce91489b2836b
(Partial cherry pick from experimental branch commit:
e36804fd8e99be6a875e5de3cb5d2b325402adf6)
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 4495f1c..a91c04b 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -619,11 +619,36 @@
}
}
-static INLINE void dec_build_inter_predictors(const AV1_COMMON *cm,
- MACROBLOCKD *xd, int plane,
- const MB_MODE_INFO *mi,
- int build_for_obmc, int bw,
- int bh, int mi_x, int mi_y) {
+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,
+ 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,
+ &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);
+}
+
+static void dec_build_inter_predictors(const AV1_COMMON *cm, MACROBLOCKD *xd,
+ int plane, const MB_MODE_INFO *mi,
+ int build_for_obmc, int bw, int bh,
+ int mi_x, int mi_y) {
struct macroblockd_plane *const pd = &xd->plane[plane];
int is_compound = has_second_ref(mi);
int ref;
@@ -677,7 +702,6 @@
const struct buf_2d orig_pred_buf[2] = { pd->pre[0], pd->pre[1] };
int row = row_start;
- int src_stride;
ref = 0;
for (int y = 0; y < b8_h; y += b4_h) {
int col = col_start;
@@ -713,24 +737,19 @@
const MV mv = this_mbmi->mv[ref].as_mv;
- uint8_t *pre;
+ const WarpTypesAllowed warp_types = {
+ is_global[ref], this_mbmi->motion_mode == WARPED_CAUSAL
+ };
+
SubpelParams subpel_params;
- PadBlock block;
- MV32 scaled_mv;
- int subpel_x_mv, subpel_y_mv;
- int highbd;
+ 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);
- 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, &subpel_x_mv, &subpel_y_mv);
- pre = pre_buf->buf0 + block.y0 * pre_buf->stride + block.x0;
- src_stride = pre_buf->stride;
- highbd = is_cur_buf_hbd(xd);
- extend_mc_border(sf, pre_buf, scaled_mv, block, subpel_x_mv,
- subpel_y_mv, 0, is_intrabc, highbd, xd->mc_buf[ref],
- &pre, &src_stride);
inter_pred_params.conv_params.do_average = ref;
-
av1_init_inter_params(
&inter_pred_params, b4_w, b4_h, (mi_y >> pd->subsampling_y) + y,
(mi_x >> pd->subsampling_x) + x, pd->subsampling_x,
@@ -752,48 +771,23 @@
{
struct buf_2d *const dst_buf = &pd->dst;
uint8_t *const dst = dst_buf->buf;
- uint8_t *pre[2];
InterPredParams inter_pred_params;
- SubpelParams subpel_params[2];
- int src_stride[2];
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];
const MV mv = mi->mv[ref].as_mv;
- PadBlock block;
- MV32 scaled_mv;
- int subpel_x_mv, subpel_y_mv;
- int highbd;
+ const WarpTypesAllowed warp_types = { is_global[ref],
+ mi->motion_mode == WARPED_CAUSAL };
- dec_calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, 0, 0, pre_buf,
- &subpel_params[ref], bw, bh, &block, mi_x, mi_y,
- &scaled_mv, &subpel_x_mv, &subpel_y_mv);
- pre[ref] = pre_buf->buf0 + (int64_t)block.y0 * pre_buf->stride + block.x0;
- src_stride[ref] = pre_buf->stride;
- highbd = is_cur_buf_hbd(xd);
+ 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);
- WarpTypesAllowed warp_types;
- warp_types.global_warp_allowed = is_global[ref];
- warp_types.local_warp_allowed = mi->motion_mode == WARPED_CAUSAL;
- 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));
- do_warp = (do_warp && 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[ref],
- &src_stride[ref]);
- }
-
- for (ref = 0; ref < 1 + is_compound; ++ref) {
- struct buf_2d *const pre_buf = is_intrabc ? dst_buf : &pd->pre[ref];
- const struct scale_factors *const sf =
- is_intrabc ? &cm->sf_identity : xd->block_ref_scale_factors[ref];
- WarpTypesAllowed warp_types;
- warp_types.global_warp_allowed = is_global[ref];
- warp_types.local_warp_allowed = mi->motion_mode == WARPED_CAUSAL;
inter_pred_params.conv_params.do_average = ref;
av1_init_inter_params(&inter_pred_params, bw, bh,
@@ -802,7 +796,6 @@
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(
ref, plane, xd->tmp_conv_dst, MAX_SB_SIZE, is_compound, xd->bd);
@@ -824,13 +817,11 @@
// masked compound type has its own average mechanism
inter_pred_params.conv_params.do_average = 0;
- av1_make_masked_inter_predictor(pre[ref], src_stride[ref], dst,
- dst_buf->stride, &inter_pred_params,
- &subpel_params[ref]);
+ av1_make_masked_inter_predictor(pre, src_stride, dst, dst_buf->stride,
+ &inter_pred_params, &subpel_params);
} else {
- av1_make_inter_predictor(pre[ref], src_stride[ref], dst,
- dst_buf->stride, &inter_pred_params,
- &subpel_params[ref]);
+ av1_make_inter_predictor(pre, src_stride, dst, dst_buf->stride,
+ &inter_pred_params, &subpel_params);
}
}
}