Decompose single and compound inter prediction
Separate the single and compound inter prediction functionality.
Change-Id: Ifd6f2b6ef7aff10617dbfdb9cc4238dac83d2a14
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 22a0429..52b4173 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -74,7 +74,8 @@
inter_pred_params->is_intrabc = is_intrabc;
inter_pred_params->scale_factors = sf;
inter_pred_params->ref_frame_buf = *ref_buf;
- inter_pred_params->mode = UNIFORM_PRED;
+ inter_pred_params->mode = TRANSLATION_PRED;
+ inter_pred_params->comp_mode = UNIFORM_SINGLE;
if (is_intrabc) {
inter_pred_params->interp_filter_params[0] = &av1_intrabc_filter_params;
@@ -89,6 +90,10 @@
}
}
+void av1_init_comp_mode(InterPredParams *inter_pred_params) {
+ inter_pred_params->comp_mode = UNIFORM_COMP;
+}
+
void av1_init_warp_params(InterPredParams *inter_pred_params,
const struct buf_2d *ref_buf,
const WarpTypesAllowed *warp_types, int ref,
@@ -109,10 +114,8 @@
void av1_init_mask_comp(InterPredParams *inter_pred_params, BLOCK_SIZE bsize,
const INTERINTER_COMPOUND_DATA *mask_comp) {
inter_pred_params->sb_type = bsize;
- if (inter_pred_params->conv_params.do_average &&
- is_masked_compound_type(mask_comp->type)) {
- inter_pred_params->mask_comp = *mask_comp;
- }
+ inter_pred_params->mask_comp = *mask_comp;
+ inter_pred_params->comp_mode = MASK_COMP;
}
void av1_make_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
@@ -134,7 +137,7 @@
inter_pred_params->block_width, inter_pred_params->block_height,
dst_stride, inter_pred_params->subsampling_x,
inter_pred_params->subsampling_y, &inter_pred_params->conv_params);
- } else if (inter_pred_params->mode == UNIFORM_PRED) {
+ } else if (inter_pred_params->mode == TRANSLATION_PRED) {
#if CONFIG_AV1_HIGHBITDEPTH
if (inter_pred_params->use_hbd_buf) {
highbd_inter_predictor(
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index 5e6488a..7b3b51f 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -92,13 +92,19 @@
};
typedef enum InterPredMode {
- UNIFORM_PRED,
+ TRANSLATION_PRED,
WARP_PRED,
- MASK_PRED,
} InterPredMode;
+typedef enum InterCompMode {
+ UNIFORM_SINGLE,
+ UNIFORM_COMP,
+ MASK_COMP,
+} InterCompMode;
+
typedef struct InterPredParams {
InterPredMode mode;
+ InterCompMode comp_mode;
WarpedMotionParams warp_params;
ConvolveParams conv_params;
const InterpFilterParams *interp_filter_params[2];
@@ -125,6 +131,8 @@
const struct buf_2d *ref_buf,
int_interpfilters interp_filters);
+void av1_init_comp_mode(InterPredParams *inter_pred_params);
+
void av1_init_warp_params(InterPredParams *inter_pred_params,
const struct buf_2d *ref_buf,
const WarpTypesAllowed *warp_types, int ref,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index cbea8f3..284cbd0 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -826,13 +826,16 @@
mi_x >> pd->subsampling_x, pd->subsampling_x,
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);
if (!build_for_obmc)
av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types,
ref, xd, mi);
- av1_init_mask_comp(&inter_pred_params, mi->sb_type, &mi->interinter_comp);
- inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+ if (is_masked_compound_type(mi->interinter_comp.type)) {
+ av1_init_mask_comp(&inter_pred_params, mi->sb_type,
+ &mi->interinter_comp);
+ inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+ }
if (ref && is_masked_compound_type(mi->interinter_comp.type)) {
// masked compound type has its own average mechanism
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index b424829..6c9ec55 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -175,55 +175,61 @@
{
InterPredParams inter_pred_params;
- inter_pred_params.conv_params = get_conv_params_no_round(
- 0, plane, xd->tmp_conv_dst, MAX_SB_SIZE, is_compound, xd->bd);
-
- av1_dist_wtd_comp_weight_assign(
- cm, mi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, is_compound);
struct buf_2d *const dst_buf = &pd->dst;
uint8_t *const dst = dst_buf->buf;
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];
+ struct buf_2d pre_buf = is_intrabc ? *dst_buf : pd->pre[ref];
const MV mv = mi->mv[ref].as_mv;
uint8_t *pre;
SubpelParams subpel_params;
- calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, 0, 0, pre_buf, &pre,
+ calc_subpel_params(xd, sf, mv, plane, pre_x, pre_y, 0, 0, &pre_buf, &pre,
&subpel_params, bw, bh);
WarpTypesAllowed warp_types;
warp_types.global_warp_allowed = is_global[ref];
warp_types.local_warp_allowed = mi->motion_mode == WARPED_CAUSAL;
- av1_init_inter_params(&inter_pred_params, bw, bh,
- mi_y >> pd->subsampling_y,
- mi_x >> pd->subsampling_x, pd->subsampling_x,
- pd->subsampling_y, xd->bd, is_cur_buf_hbd(xd),
- mi->use_intrabc, sf, pre_buf, mi->interp_filters);
+ 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,
+ mi->interp_filters);
+
+ if (is_compound) av1_init_comp_mode(&inter_pred_params);
+
+ inter_pred_params.conv_params = get_conv_params_no_round(
+ 0, plane, xd->tmp_conv_dst, MAX_SB_SIZE, is_compound, xd->bd);
+
+ av1_dist_wtd_comp_weight_assign(
+ cm, mi, 0, &inter_pred_params.conv_params.fwd_offset,
+ &inter_pred_params.conv_params.bck_offset,
+ &inter_pred_params.conv_params.use_dist_wtd_comp_avg, is_compound);
inter_pred_params.conv_params.do_average = ref;
- av1_init_warp_params(&inter_pred_params, &pd->pre[ref], &warp_types, ref,
- xd, mi);
+ av1_init_warp_params(&inter_pred_params, &pre_buf, &warp_types, ref, xd,
+ mi);
- av1_init_mask_comp(&inter_pred_params, mi->sb_type, &mi->interinter_comp);
- // Assigne physical buffer
- inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+ if (is_masked_compound_type(mi->interinter_comp.type)) {
+ av1_init_mask_comp(&inter_pred_params, mi->sb_type,
+ &mi->interinter_comp);
+ // Assigne physical buffer
+ inter_pred_params.mask_comp.seg_mask = xd->seg_mask;
+ }
if (ref && is_masked_compound_type(mi->interinter_comp.type)) {
// masked compound type has its own average mechanism
inter_pred_params.conv_params.do_average = 0;
- av1_make_masked_inter_predictor(pre, pre_buf->stride, dst,
+ av1_make_masked_inter_predictor(pre, pre_buf.stride, dst,
dst_buf->stride, &inter_pred_params,
&subpel_params);
} else {
- av1_make_inter_predictor(pre, pre_buf->stride, dst, dst_buf->stride,
- &inter_pred_params, &subpel_params);
+ av1_build_inter_predictor(pre_buf.buf, pre_buf.stride, dst,
+ dst_buf->stride, &mv, mi_x, mi_y,
+ &inter_pred_params);
}
}
}
@@ -272,7 +278,6 @@
InterPredParams *inter_pred_params) {
SubpelParams subpel_params;
const struct scale_factors *sf = inter_pred_params->scale_factors;
-
(void)pix_row;
(void)pix_col;