Refactor gm/wm/obmc for cleaner warping interactions
This creates a central function which defines when a
block should be warped. It also refactors the
WARPED_MOTION code so that all calls to av1_warp_plane
happen in the same location.
No change in performance.
Change-Id: Icaf9ec7700d34523809258594bb9843bb2975f46
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 38892c4..e6e88b5 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3701,9 +3701,9 @@
if (count[i]) {
#if CONFIG_MOTION_VAR && (CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION)
#if CONFIG_WARPED_MOTION
- if (i == EIGHTTAP_REGULAR || WARP_NEIGHBORS_WITH_OBMC)
+ if (i == EIGHTTAP_REGULAR || WARP_WM_NEIGHBORS_WITH_OBMC)
#else
- if (i == EIGHTTAP_REGULAR || WARP_NEIGHBORS_WITH_GM)
+ if (i == EIGHTTAP_REGULAR || WARP_GM_NEIGHBORS_WITH_OBMC)
#endif // CONFIG_WARPED_MOTION
#endif // CONFIG_MOTION_VAR && (CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION)
cm->interp_filter = i;
@@ -4662,7 +4662,7 @@
// unsafe, and we need to rely on the recode loop to do it
// instead. See av1_find_mv_refs for details.
if (!cpi->global_motion_used[frame]) {
- set_default_gmparams(&cm->global_motion[frame]);
+ set_default_warp_params(&cm->global_motion[frame]);
}
#endif
write_global_motion_params(
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 0b479a6..5084216 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5169,7 +5169,7 @@
}
if (cm->global_motion[frame].wmtype <= AFFINE)
if (!get_shear_params(&cm->global_motion[frame]))
- set_default_gmparams(&cm->global_motion[frame]);
+ set_default_warp_params(&cm->global_motion[frame]);
if (cm->global_motion[frame].wmtype == TRANSLATION) {
cm->global_motion[frame].wmmat[0] =
@@ -5189,7 +5189,7 @@
gm_get_params_cost(&cm->global_motion[frame],
&cm->prev_frame->global_motion[frame],
cm->allow_high_precision_mv))) {
- set_default_gmparams(&cm->global_motion[frame]);
+ set_default_warp_params(&cm->global_motion[frame]);
}
if (cm->global_motion[frame].wmtype != IDENTITY) break;
@@ -5908,46 +5908,12 @@
av1_setup_pre_planes(xd, ref, cfg, mi_row, mi_col,
&xd->block_refs[ref]->sf);
}
-#if CONFIG_WARPED_MOTION
- if (mbmi->motion_mode == WARPED_CAUSAL) {
- int i;
- assert_motion_mode_valid(WARPED_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- mi);
- for (i = 0; i < 3; ++i) {
- const struct macroblockd_plane *pd = &xd->plane[i];
- av1_warp_plane(&mbmi->wm_params[0],
-#if CONFIG_HIGHBITDEPTH
- xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
-#endif // CONFIG_HIGHBITDEPTH
- pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
- pd->pre[0].stride, pd->dst.buf,
- ((mi_col * MI_SIZE) >> pd->subsampling_x),
- ((mi_row * MI_SIZE) >> pd->subsampling_y),
- xd->n8_w * (MI_SIZE >> pd->subsampling_x),
- xd->n8_h * (MI_SIZE >> pd->subsampling_y),
- pd->dst.stride, pd->subsampling_x, pd->subsampling_y, 16,
- 16, 0);
- }
- } else {
-#endif // CONFIG_WARPED_MOTION
- if (!(cpi->sf.reuse_inter_pred_sby && ctx->pred_pixel_ready) || seg_skip)
- av1_build_inter_predictors_sby(xd, mi_row, mi_col, NULL, block_size);
+ if (!(cpi->sf.reuse_inter_pred_sby && ctx->pred_pixel_ready) || seg_skip)
+ av1_build_inter_predictors_sby(xd, mi_row, mi_col, NULL, block_size);
- av1_build_inter_predictors_sbuv(xd, mi_row, mi_col, NULL, block_size);
-#if CONFIG_WARPED_MOTION
- }
-#endif // CONFIG_WARPED_MOTION
-
+ av1_build_inter_predictors_sbuv(xd, mi_row, mi_col, NULL, block_size);
#if CONFIG_MOTION_VAR
if (mbmi->motion_mode == OBMC_CAUSAL) {
- assert_motion_mode_valid(OBMC_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- mi);
#if CONFIG_NCOBMC
if (dry_run == OUTPUT_ENABLED)
av1_build_ncobmc_inter_predictors_sb(cm, xd, mi_row, mi_col);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 931c54f..e430ed4 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3052,7 +3052,7 @@
if (cm->global_motion[i].wmtype != IDENTITY &&
cpi->global_motion_used[i] * GM_RECODE_LOOP_NUM4X4_FACTOR <
cpi->gmparams_cost[i]) {
- set_default_gmparams(&cm->global_motion[i]);
+ set_default_warp_params(&cm->global_motion[i]);
cpi->gmparams_cost[i] = 0;
#if CONFIG_REF_MV
recode = 1;
@@ -3839,7 +3839,7 @@
#if CONFIG_GLOBAL_MOTION
int i;
for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
- set_default_gmparams(&cpi->common.global_motion[i]);
+ set_default_warp_params(&cpi->common.global_motion[i]);
}
cpi->global_motion_search_done = 0;
#endif // CONFIG_GLOBAL_MOTION
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index f8d99ac..7f0d00c 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5524,12 +5524,13 @@
#endif // CONFIG_DUAL_FILTER
struct scale_factors sf;
struct macroblockd_plane *const pd = &xd->plane[0];
-#if CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
// ic and ir are the 4x4 coordiantes of the sub8x8 at index "block"
const int ic = block & 1;
const int ir = (block - ic) >> 1;
const int p_col = ((mi_col * MI_SIZE) >> pd->subsampling_x) + 4 * ic;
const int p_row = ((mi_row * MI_SIZE) >> pd->subsampling_y) + 4 * ir;
+#if CONFIG_GLOBAL_MOTION
int is_global[2];
for (ref = 0; ref < 2; ++ref) {
WarpedMotionParams *const wm =
@@ -5537,6 +5538,7 @@
is_global[ref] = is_global_mv_block(xd->mi[0], block, wm->wmtype);
}
#endif // CONFIG_GLOBAL_MOTION
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
// Do joint motion search in compound mode to get more accurate mv.
struct buf_2d backup_yv12[2][MAX_MB_PLANE];
@@ -5608,6 +5610,15 @@
// found for the 'other' reference frame is factored in.
const int plane = 0;
ConvolveParams conv_params = get_conv_params(0, plane);
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ WarpTypesAllowed warp_types;
+#if CONFIG_GLOBAL_MOTION
+ warp_types.global_warp_allowed = is_global[!id];
+#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_WARPED_MOTION
+ warp_types.local_warp_allowed = mbmi->motion_mode == WARPED_CAUSAL;
+#endif // CONFIG_WARPED_MOTION
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
// Initialized here because of compiler problem in Visual Studio.
ref_yv12[0] = xd->plane[plane].pre[0];
@@ -5628,27 +5639,27 @@
av1_highbd_build_inter_predictor(
ref_yv12[!id].buf, ref_yv12[!id].stride, second_pred, pw,
&frame_mv[refs[!id]].as_mv, &sf, pw, ph, 0, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- is_global[!id], p_col, p_row,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, p_col, p_row,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
plane, MV_PRECISION_Q3, mi_col * MI_SIZE, mi_row * MI_SIZE, xd);
} else {
second_pred = (uint8_t *)second_pred_alloc_16;
av1_build_inter_predictor(
ref_yv12[!id].buf, ref_yv12[!id].stride, second_pred, pw,
&frame_mv[refs[!id]].as_mv, &sf, pw, ph, &conv_params, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- is_global[!id], p_col, p_row, plane, !id,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, p_col, p_row, plane, !id,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
MV_PRECISION_Q3, mi_col * MI_SIZE, mi_row * MI_SIZE, xd);
}
#else
av1_build_inter_predictor(
ref_yv12[!id].buf, ref_yv12[!id].stride, second_pred, pw,
&frame_mv[refs[!id]].as_mv, &sf, pw, ph, &conv_params, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- is_global[!id], p_col, p_row, plane, !id,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, p_col, p_row, plane, !id,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
MV_PRECISION_Q3, mi_col * MI_SIZE, mi_row * MI_SIZE, xd);
#endif // CONFIG_HIGHBITDEPTH
@@ -8233,11 +8244,6 @@
mbmi->motion_mode = motion_mode;
#if CONFIG_MOTION_VAR
if (mbmi->motion_mode == OBMC_CAUSAL) {
- assert_motion_mode_valid(OBMC_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- mi);
#if CONFIG_EXT_INTER
*mbmi = *best_bmc_mbmi;
mbmi->motion_mode = OBMC_CAUSAL;
@@ -8282,11 +8288,6 @@
#if CONFIG_WARPED_MOTION
if (mbmi->motion_mode == WARPED_CAUSAL) {
- assert_motion_mode_valid(WARPED_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, xd->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- mi);
#if CONFIG_EXT_INTER
*mbmi = *best_bmc_mbmi;
mbmi->motion_mode = WARPED_CAUSAL;
@@ -8307,24 +8308,7 @@
if (find_projection(mbmi->num_proj_ref[0], pts, pts_inref, bsize,
mbmi->mv[0].as_mv.row, mbmi->mv[0].as_mv.col,
&mbmi->wm_params[0], mi_row, mi_col) == 0) {
- int plane;
- for (plane = 0; plane < 3; ++plane) {
- const struct macroblockd_plane *pd = &xd->plane[plane];
-
- av1_warp_plane(&mbmi->wm_params[0],
-#if CONFIG_HIGHBITDEPTH
- xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
-#endif // CONFIG_HIGHBITDEPTH
- pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
- pd->pre[0].stride, pd->dst.buf,
- (mi_col * MI_SIZE) >> pd->subsampling_x,
- (mi_row * MI_SIZE) >> pd->subsampling_y,
- (xd->n8_w * MI_SIZE) >> pd->subsampling_x,
- (xd->n8_h * MI_SIZE) >> pd->subsampling_y,
- pd->dst.stride, pd->subsampling_x, pd->subsampling_y,
- 16, 16, 0);
- }
-
+ av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL, bsize);
model_rd_for_sb(cpi, bsize, x, xd, 0, MAX_MB_PLANE - 1, &tmp_rate,
&tmp_dist, skip_txfm_sb, skip_sse_sb);
} else {
@@ -10785,45 +10769,9 @@
}
if (is_inter_mode(mbmi->mode)) {
-#if CONFIG_WARPED_MOTION
- if (mbmi->motion_mode == WARPED_CAUSAL) {
- assert_motion_mode_valid(WARPED_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, xd->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- xd->mi[0]);
- assert(!has_second_ref(mbmi));
-
- int plane;
- for (plane = 0; plane < 3; ++plane) {
- const struct macroblockd_plane *pd = &xd->plane[plane];
-
- av1_warp_plane(&mbmi->wm_params[0],
-#if CONFIG_HIGHBITDEPTH
- xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
-#endif // CONFIG_HIGHBITDEPTH
- pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
- pd->pre[0].stride, pd->dst.buf,
- ((mi_col * MI_SIZE) >> pd->subsampling_x),
- ((mi_row * MI_SIZE) >> pd->subsampling_y),
- xd->n8_w * (MI_SIZE >> pd->subsampling_x),
- xd->n8_h * (MI_SIZE >> pd->subsampling_y),
- pd->dst.stride, pd->subsampling_x, pd->subsampling_y,
- 16, 16, 0);
- }
- } else {
-#endif // CONFIG_WARPED_MOTION
- av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL, bsize);
-#if CONFIG_WARPED_MOTION
- }
-#endif // CONFIG_WARPED_MOTION
+ av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL, bsize);
#if CONFIG_MOTION_VAR
if (mbmi->motion_mode == OBMC_CAUSAL) {
- assert_motion_mode_valid(OBMC_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- xd->mi[0]);
av1_build_obmc_inter_prediction(
cm, xd, mi_row, mi_col, args.above_pred_buf, args.above_pred_stride,
args.left_pred_buf, args.left_pred_stride);
@@ -12569,11 +12517,6 @@
// Check non-causal mode
mbmi->motion_mode = OBMC_CAUSAL;
- assert_motion_mode_valid(OBMC_CAUSAL,
-#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
-#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- xd->mi[0]);
av1_build_ncobmc_inter_predictors_sb(cm, xd, mi_row, mi_col);
av1_subtract_plane(x, bsize, 0);
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 93e8115..e9ed6fd 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -56,6 +56,10 @@
#else
const InterpFilter interp_filter = xd->mi[0]->mbmi.interp_filter;
#endif // USE_TEMPORALFILTER_12TAP
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ WarpTypesAllowed warp_types;
+ memset(&warp_types, 0, sizeof(WarpTypesAllowed));
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
if (uv_block_width == 8) {
uv_stride = (stride + 1) >> 1;
@@ -69,50 +73,50 @@
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
av1_highbd_build_inter_predictor(y_mb_ptr, stride, &pred[0], 16, &mv, scale,
16, 16, which_mv, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
0, MV_PRECISION_Q3, x, y, xd);
av1_highbd_build_inter_predictor(u_mb_ptr, uv_stride, &pred[256],
uv_block_width, &mv, scale, uv_block_width,
uv_block_height, which_mv, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
1, mv_precision_uv, x, y, xd);
av1_highbd_build_inter_predictor(v_mb_ptr, uv_stride, &pred[512],
uv_block_width, &mv, scale, uv_block_width,
uv_block_height, which_mv, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
2, mv_precision_uv, x, y, xd);
return;
}
#endif // CONFIG_HIGHBITDEPTH
av1_build_inter_predictor(y_mb_ptr, stride, &pred[0], 16, &mv, scale, 16, 16,
&conv_params, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y, 0, 0,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y, 0, 0,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
MV_PRECISION_Q3, x, y, xd);
av1_build_inter_predictor(u_mb_ptr, uv_stride, &pred[256], uv_block_width,
&mv, scale, uv_block_width, uv_block_height,
&conv_params, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y, 1, 0,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y, 1, 0,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
mv_precision_uv, x, y, xd);
av1_build_inter_predictor(v_mb_ptr, uv_stride, &pred[512], uv_block_width,
&mv, scale, uv_block_width, uv_block_height,
&conv_params, interp_filter,
-#if CONFIG_GLOBAL_MOTION
- 0, x, y, 2, 0,
-#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
+ &warp_types, x, y, 2, 0,
+#endif // CONFIG_GLOBAL_MOTION || CONFIG_WARPED_MOTION
mv_precision_uv, x, y, xd);
}