Revert 92652ac7 and commit new fix for tip mismatch
diff --git a/av1/common/mv.h b/av1/common/mv.h
index cdb09ec..22e407b 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -348,12 +348,6 @@
mv->row = clamp(mv->row, mv_limits->row_min, mv_limits->row_max);
}
-static INLINE int av1_is_subpelmv_in_range(const SubpelMvLimits *mv_limits,
- MV mv) {
- return (mv.col >= mv_limits->col_min) && (mv.col <= mv_limits->col_max) &&
- (mv.row >= mv_limits->row_min) && (mv.row <= mv_limits->row_max);
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/av1/common/tip.h b/av1/common/tip.h
index 02268c0..6c87e1e 100644
--- a/av1/common/tip.h
+++ b/av1/common/tip.h
@@ -18,7 +18,6 @@
#endif
#include "av1/common/av1_common_int.h"
-#include "av1/common/mv.h"
#include "av1/common/mvref_common.h"
#include "av1/common/reconinter.h"
@@ -142,68 +141,6 @@
return clamped_mv;
}
-// Set TIP mv fullpel range constraint
-static INLINE void av1_set_tip_mv_range(
- FullMvLimits *mv_limits, const MACROBLOCKD *const xd, BLOCK_SIZE bsize,
- const CommonModeInfoParams *const mi_params) {
- const int mi_row = xd->mi_row;
- const int mi_col = xd->mi_col;
- const int mi_width = mi_size_wide[bsize];
- const int mi_height = mi_size_high[bsize];
- const int mi_rows = mi_params->mi_rows;
- const int mi_cols = mi_params->mi_cols;
- const int tmvp_mv = (TIP_MV_SEARCH_RANGE << TMVP_MI_SZ_LOG2);
-
- int col_min = -tmvp_mv;
- int row_min = -tmvp_mv;
- int col_max = tmvp_mv;
- int row_max = tmvp_mv;
-
- mv_limits->col_min = AOMMAX(col_min, -(mi_col * MI_SIZE));
- mv_limits->col_max = AOMMIN(col_max, (mi_cols - mi_col - mi_width) * MI_SIZE);
- mv_limits->row_min = AOMMAX(row_min, -(mi_row * MI_SIZE));
- mv_limits->row_max =
- AOMMIN(row_max, (mi_rows - mi_row - mi_height) * MI_SIZE);
-}
-
-// Set TIP mv subpel range constraint
-static INLINE void av1_set_tip_subpel_mv_range(
- SubpelMvLimits *subpel_limits, const MACROBLOCKD *const xd,
- BLOCK_SIZE bsize, const CommonModeInfoParams *const mi_params) {
- const int mi_row = xd->mi_row;
- const int mi_col = xd->mi_col;
- const int mi_width = mi_size_wide[bsize];
- const int mi_height = mi_size_high[bsize];
- const int mi_rows = mi_params->mi_rows;
- const int mi_cols = mi_params->mi_cols;
- const int tmvp_mv = GET_MV_SUBPEL(TIP_MV_SEARCH_RANGE << TMVP_MI_SZ_LOG2);
-
- const int col_min = -tmvp_mv;
- const int row_min = -tmvp_mv;
- const int col_max = tmvp_mv;
- const int row_max = tmvp_mv;
-
- subpel_limits->col_min = AOMMAX(col_min, GET_MV_SUBPEL(-(mi_col * MI_SIZE)));
- subpel_limits->col_max =
- AOMMIN(col_max, GET_MV_SUBPEL((mi_cols - mi_col - mi_width) * MI_SIZE));
- subpel_limits->row_min = AOMMAX(row_min, GET_MV_SUBPEL(-(mi_row * MI_SIZE)));
- subpel_limits->row_max =
- AOMMIN(row_max, GET_MV_SUBPEL((mi_rows - mi_row - mi_height) * MI_SIZE));
-}
-
-// Clamp refmv for TIP nearmv mode
-static INLINE int tip_clamp_and_check_mv(int_mv *out_mv, int_mv in_mv,
- BLOCK_SIZE bsize, const AV1_COMMON *cm,
- const MACROBLOCKD *const xd) {
- *out_mv = in_mv;
- lower_mv_precision(&out_mv->as_mv, cm->features.allow_high_precision_mv,
- cm->features.cur_frame_force_integer_mv);
- SubpelMvLimits subpel_mv_limits;
- av1_set_tip_subpel_mv_range(&subpel_mv_limits, xd, bsize, &cm->mi_params);
- clamp_mv(&out_mv->as_mv, &subpel_mv_limits);
- return av1_is_subpelmv_in_range(&subpel_mv_limits, out_mv->as_mv);
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 62ad1fa..0e73e4b 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -848,50 +848,73 @@
ROUND_POWER_OF_TWO(cm->mi_params.mi_rows, TMVP_SHIFT_BITS);
const int mvs_cols =
ROUND_POWER_OF_TWO(cm->mi_params.mi_cols, TMVP_SHIFT_BITS);
+ const int extra_pixel = 1 << TMVP_MI_SZ_LOG2;
const int mi_row = xd->mi_row;
const int mi_col = xd->mi_col;
const int x_mis = xd->width;
const int y_mis = xd->height;
+ // define the block start and end pixel locations
+ FULLPEL_MV start_mv = get_fullmv_from_mv(mv);
const int bw = (x_mis << MI_SIZE_LOG2);
const int bh = (y_mis << MI_SIZE_LOG2);
- int pixel_row = (mi_row << MI_SIZE_LOG2);
- int pixel_col = (mi_col << MI_SIZE_LOG2);
+ int start_pixel_row = (mi_row << MI_SIZE_LOG2) + start_mv.row;
+ int start_pixel_col = (mi_col << MI_SIZE_LOG2) + start_mv.col;
+ int end_pixel_row = start_pixel_row + bh;
+ int end_pixel_col = start_pixel_col + bw;
- FULLPEL_MV start_mv = get_fullmv_from_mv(mv);
-
- pixel_row += start_mv.row;
- pixel_col += start_mv.col;
- pixel_row = AOMMAX(0, pixel_row);
- pixel_col = AOMMAX(0, pixel_col);
- int end_pixel_row = pixel_row + bh;
- int end_pixel_col = pixel_col + bw;
-
- int tpl_start_row = pixel_row >> TMVP_MI_SZ_LOG2;
- int tpl_end_row = (end_pixel_row + TMVP_MI_SIZE - 1) >> TMVP_MI_SZ_LOG2;
- int tpl_start_col = pixel_col >> TMVP_MI_SZ_LOG2;
- int tpl_end_col = (end_pixel_col + TMVP_MI_SIZE - 1) >> TMVP_MI_SZ_LOG2;
-
- const int extra_order = 1;
+ // extend for handling interpolation
if (mv->row != 0) {
- tpl_start_row = AOMMAX(0, tpl_start_row - extra_order);
- tpl_end_row = AOMMIN(mvs_rows, tpl_end_row + extra_order);
+ start_pixel_row -= extra_pixel;
+ end_pixel_row += extra_pixel;
}
if (mv->col != 0) {
- tpl_start_col = AOMMAX(0, tpl_start_col - extra_order);
- tpl_end_col = AOMMIN(mvs_cols, tpl_end_col + extra_order);
+ start_pixel_col -= extra_pixel;
+ end_pixel_col += extra_pixel;
}
+ // clamp block start and end locations to make sure the block is in the frame
+ start_pixel_row = AOMMAX(0, start_pixel_row);
+ start_pixel_col = AOMMAX(0, start_pixel_col);
+ end_pixel_row = AOMMAX(0, end_pixel_row);
+ end_pixel_col = AOMMAX(0, end_pixel_col);
+ start_pixel_row = AOMMIN(cm->mi_params.mi_rows * MI_SIZE, start_pixel_row);
+ start_pixel_col = AOMMIN(cm->mi_params.mi_cols * MI_SIZE, start_pixel_col);
+ end_pixel_row = AOMMIN(cm->mi_params.mi_rows * MI_SIZE, end_pixel_row);
+ end_pixel_col = AOMMIN(cm->mi_params.mi_cols * MI_SIZE, end_pixel_col);
+
+ // convert the pixel block location to MV field grid location
+ int tpl_start_row = start_pixel_row >> TMVP_MI_SZ_LOG2;
+ int tpl_end_row = (end_pixel_row + TMVP_MI_SIZE - 1) >> TMVP_MI_SZ_LOG2;
+ int tpl_start_col = start_pixel_col >> TMVP_MI_SZ_LOG2;
+ int tpl_end_col = (end_pixel_col + TMVP_MI_SIZE - 1) >> TMVP_MI_SZ_LOG2;
+
+ // handling the boundary case when start and end locations are the same
+ if (tpl_start_row == tpl_end_row) {
+ if (tpl_start_row > 0) {
+ tpl_start_row -= 1;
+ } else {
+ tpl_end_row += 1;
+ }
+ }
+
+ if (tpl_start_col == tpl_end_col) {
+ if (tpl_start_col > 0) {
+ tpl_start_col -= 1;
+ } else {
+ tpl_end_col += 1;
+ }
+ }
+
+ // handle SIMD alignment for the chroma case
tpl_start_row = (tpl_start_row >> 1) << 1;
tpl_start_col = (tpl_start_col >> 1) << 1;
tpl_end_row = ((tpl_end_row + 1) >> 1) << 1;
tpl_end_col = ((tpl_end_col + 1) >> 1) << 1;
tpl_end_row = AOMMIN(mvs_rows, tpl_end_row);
tpl_end_col = AOMMIN(mvs_cols, tpl_end_col);
- assert(tpl_start_row != tpl_end_row);
- assert(tpl_start_col != tpl_end_col);
av1_setup_tip_on_the_fly(cm, xd, tpl_start_row, tpl_start_col, tpl_end_row,
tpl_end_col, mvs_cols, mc_buf, conv_dst,
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 914fa89..fcddc28 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -22,9 +22,6 @@
#include "av1/common/reconinter.h"
#include "av1/common/reconintra.h"
#include "av1/common/seg_common.h"
-#if CONFIG_TIP
-#include "av1/common/tip.h"
-#endif // CONFIG_TIP
#include "av1/common/warped_motion.h"
#include "av1/decoder/decodeframe.h"
@@ -1730,15 +1727,7 @@
break;
}
case NEARMV: {
-#if CONFIG_TIP
- int_mv this_mv = ref_mv[0];
- if (is_tip_ref_frame(ref_frame[0])) {
- tip_clamp_and_check_mv(&this_mv, this_mv, bsize, cm, xd);
- }
- mv[0].as_int = this_mv.as_int;
-#else
- mv[0].as_int = near_mv[0].as_int;
-#endif // CONFIG_TIP
+ mv[0].as_int = ref_mv[0].as_int;
break;
}
case GLOBALMV: {
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c
index 7b5fcaa..140b115 100644
--- a/av1/encoder/mcomp.c
+++ b/av1/encoder/mcomp.c
@@ -26,9 +26,6 @@
#include "av1/common/filter.h"
#include "av1/common/mvref_common.h"
#include "av1/common/reconinter.h"
-#if CONFIG_TIP
-#include "av1/common/tip.h"
-#endif // CONFIG_TIP
#include "av1/encoder/encoder.h"
#include "av1/encoder/encodemv.h"
@@ -149,8 +146,7 @@
ms_params->mv_limits = x->mv_limits;
#if CONFIG_TIP
if (is_tip_ref_frame(mbmi->ref_frame[0])) {
- av1_set_tip_mv_range(&ms_params->mv_limits, &x->e_mbd, bsize,
- &cpi->common.mi_params);
+ av1_set_tip_mv_search_range(&ms_params->mv_limits);
} else {
#endif // CONFIG_TIP
av1_set_mv_search_range(&ms_params->mv_limits, ref_mv);
@@ -186,8 +182,7 @@
#if CONFIG_TIP
if (is_tip_ref_frame(mbmi->ref_frame[0])) {
- av1_set_tip_subpel_mv_range(&ms_params->mv_limits, &x->e_mbd, bsize,
- &cm->mi_params);
+ av1_set_tip_subpel_mv_search_range(&ms_params->mv_limits, &x->mv_limits);
} else {
#endif // CONFIG_TIP
av1_set_subpel_mv_search_range(&ms_params->mv_limits, &x->mv_limits,
@@ -244,6 +239,23 @@
if (mv_limits->row_max > row_max) mv_limits->row_max = row_max;
}
+#if CONFIG_TIP
+void av1_set_tip_mv_search_range(FullMvLimits *mv_limits) {
+ const int tmvp_mv = (TIP_MV_SEARCH_RANGE << TMVP_MI_SZ_LOG2);
+ const int col_min = -tmvp_mv;
+ const int row_min = -tmvp_mv;
+ const int col_max = tmvp_mv;
+ const int row_max = tmvp_mv;
+
+ // Get intersection of UMV window and valid MV window to reduce # of checks
+ // in diamond search.
+ if (mv_limits->col_min < col_min) mv_limits->col_min = col_min;
+ if (mv_limits->col_max > col_max) mv_limits->col_max = col_max;
+ if (mv_limits->row_min < row_min) mv_limits->row_min = row_min;
+ if (mv_limits->row_max > row_max) mv_limits->row_max = row_max;
+}
+#endif // CONFIG_TIP
+
int av1_init_search_range(int size) {
int sr = 0;
// Minimum search size no matter what the passed in value.
@@ -2453,8 +2465,7 @@
SubpelMvLimits subpel_mv_limits;
#if CONFIG_TIP
if (is_tip_ref_frame(mi->ref_frame[0])) {
- av1_set_tip_subpel_mv_range(&subpel_mv_limits, &x->e_mbd, bsize,
- &cpi->common.mi_params);
+ av1_set_tip_subpel_mv_search_range(&subpel_mv_limits, &x->mv_limits);
} else {
#endif // CONFIG_TIP
av1_set_subpel_mv_search_range(&subpel_mv_limits, &x->mv_limits, ref_mv);
diff --git a/av1/encoder/mcomp.h b/av1/encoder/mcomp.h
index 6be8e9b..4671d92 100644
--- a/av1/encoder/mcomp.h
+++ b/av1/encoder/mcomp.h
@@ -294,6 +294,10 @@
void av1_set_mv_search_range(FullMvLimits *mv_limits, const MV *mv);
+#if CONFIG_TIP
+void av1_set_tip_mv_search_range(FullMvLimits *mv_limits);
+#endif // CONFIG_TIP
+
int av1_init_search_range(int size);
unsigned int av1_int_pro_motion_estimation(const struct AV1_COMP *cpi,
@@ -434,6 +438,24 @@
subpel_limits->row_max = AOMMIN(MV_UPP - 1, maxr);
}
+#if CONFIG_TIP
+static INLINE void av1_set_tip_subpel_mv_search_range(
+ SubpelMvLimits *subpel_limits, const FullMvLimits *mv_limits) {
+ const int tmvp_mv = GET_MV_SUBPEL(TIP_MV_SEARCH_RANGE << TMVP_MI_SZ_LOG2);
+
+ subpel_limits->col_min = AOMMAX(GET_MV_SUBPEL(mv_limits->col_min), -tmvp_mv);
+ subpel_limits->col_max = AOMMIN(GET_MV_SUBPEL(mv_limits->col_max), tmvp_mv);
+ subpel_limits->row_min = AOMMAX(GET_MV_SUBPEL(mv_limits->row_min), -tmvp_mv);
+ subpel_limits->row_max = AOMMIN(GET_MV_SUBPEL(mv_limits->row_max), tmvp_mv);
+}
+#endif // CONFIG_TIP
+
+static INLINE int av1_is_subpelmv_in_range(const SubpelMvLimits *mv_limits,
+ MV mv) {
+ return (mv.col >= mv_limits->col_min) && (mv.col <= mv_limits->col_max) &&
+ (mv.row >= mv_limits->row_min) && (mv.row <= mv_limits->row_max);
+}
+
#if CONFIG_BVP_IMPROVEMENT
// Returns the cost of using the current mv during the motion search
int av1_get_mv_err_cost(const MV *mv, const MV_COST_PARAMS *mv_cost_params);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 79e3668..de24562 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -40,9 +40,6 @@
#include "av1/common/reconintra.h"
#include "av1/common/scan.h"
#include "av1/common/seg_common.h"
-#if CONFIG_TIP
-#include "av1/common/tip.h"
-#endif // CONFIG_TIP
#include "av1/common/txb_common.h"
#include "av1/common/warped_motion.h"
@@ -2125,9 +2122,6 @@
// This function update the non-new mv for the current prediction mode
static INLINE int build_cur_mv(int_mv *cur_mv, PREDICTION_MODE this_mode,
const AV1_COMMON *cm, const MACROBLOCK *x,
-#if CONFIG_TIP
- BLOCK_SIZE bsize,
-#endif // CONFIG_TIP
int skip_repeated_ref_mv) {
const MACROBLOCKD *xd = &x->e_mbd;
const MB_MODE_INFO *mbmi = xd->mi[0];
@@ -2149,16 +2143,7 @@
: x->mbmi_ext->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
.comp_mv;
} else {
-#if CONFIG_TIP
- if (is_tip_ref_frame(mbmi->ref_frame[0])) {
- ret &=
- tip_clamp_and_check_mv(cur_mv + i, this_mv, bsize, cm, &x->e_mbd);
- } else {
-#endif // CONFIG_TIP
- ret &= clamp_and_check_mv(cur_mv + i, this_mv, cm, x);
-#if CONFIG_TIP
- }
-#endif // CONFIG_TIP
+ ret &= clamp_and_check_mv(cur_mv + i, this_mv, cm, x);
}
}
return ret;
@@ -2341,11 +2326,7 @@
mode_info[ref_mv_idx].drl_cost = drl_cost;
int_mv cur_mv[2];
- if (!build_cur_mv(cur_mv, mbmi->mode, cm, x,
-#if CONFIG_TIP
- bsize,
-#endif // CONFIG_TIP
- 0)) {
+ if (!build_cur_mv(cur_mv, mbmi->mode, cm, x, 0)) {
return INT64_MAX;
}
assert(have_nearmv_in_inter_mode(mbmi->mode));
@@ -3195,11 +3176,7 @@
int skip_repeated_ref_mv =
is_comp_pred ? 0 : cpi->sf.inter_sf.skip_repeated_ref_mv;
// Generate the current mv according to the prediction mode
- if (!build_cur_mv(cur_mv, this_mode, cm, x,
-#if CONFIG_TIP
- bsize,
-#endif // CONFIG_TIP
- skip_repeated_ref_mv)) {
+ if (!build_cur_mv(cur_mv, this_mode, cm, x, skip_repeated_ref_mv)) {
continue;
}
@@ -4089,11 +4066,7 @@
assert(mbmi->mode == NEAR_NEARMV);
#endif
assert(mbmi->ref_mv_idx == 0);
- if (!build_cur_mv(mbmi->mv, this_mode, cm, x,
-#if CONFIG_TIP
- bsize,
-#endif // CONFIG_TIP
- 0)) {
+ if (!build_cur_mv(mbmi->mv, this_mode, cm, x, 0)) {
assert(av1_check_newmv_joint_nonzero(cm, x));
return;
}
@@ -4147,11 +4120,7 @@
for (int ref_mv_idx = 0; ref_mv_idx < ref_set; ref_mv_idx++) {
mbmi->ref_mv_idx = ref_mv_idx;
- if (!build_cur_mv(mbmi->mv, this_mode, cm, x,
-#if CONFIG_TIP
- bsize,
-#endif // CONFIG_TIP
- 0)) {
+ if (!build_cur_mv(mbmi->mv, this_mode, cm, x, 0)) {
assert(av1_check_newmv_joint_nonzero(cm, x));
continue;
}
@@ -4345,11 +4314,7 @@
assert(this_mode == NEAR_NEARMV);
assert(mbmi->mode == NEAR_NEARMV);
assert(mbmi->ref_mv_idx == 0);
- if (!build_cur_mv(mbmi->mv, this_mode, cm, x,
-#if CONFIG_TIP
- bsize,
-#endif // CONFIG_TIP
- 0)) {
+ if (!build_cur_mv(mbmi->mv, this_mode, cm, x, 0)) {
assert(av1_check_newmv_joint_nonzero(cm, x));
return;
}