Skip to content
Snippets Groups Projects
Commit e84eec54 authored by Jingning Han's avatar Jingning Han Committed by Yaowu Xu
Browse files

Rule out motion vector projection for out of frame blocks

If the motion trajectory goes outside the valid frame range, skip
the linear motion vector projection.

Change-Id: I92f5db1b2a65c97965fb83ebdae0adbf42bf1bec
parent 3ac2093f
No related branches found
No related tags found
2 merge requests!6Rav1e 11 yushin 1,!3Rav1e 10 yushin
...@@ -1218,20 +1218,19 @@ INLINE void get_mv_projection(MV *output, MV ref, int num, int den) { ...@@ -1218,20 +1218,19 @@ INLINE void get_mv_projection(MV *output, MV ref, int num, int den) {
output->col = (int16_t)(ref.col * (double)num / den); output->col = (int16_t)(ref.col * (double)num / den);
} }
INLINE void get_block_position(AV1_COMMON *cm, int *mi_r, int *mi_c, INLINE int get_block_position(AV1_COMMON *cm, int *mi_r, int *mi_c, int blk_row,
int blk_row, int blk_col, MV mv, int sign_bias) { int blk_col, MV mv, int sign_bias) {
int row = (sign_bias == 1) ? blk_row - (mv.row >> (3 + MI_SIZE_LOG2)) int row = (sign_bias == 1) ? blk_row - (mv.row >> (3 + MI_SIZE_LOG2))
: blk_row + (mv.row >> (3 + MI_SIZE_LOG2)); : blk_row + (mv.row >> (3 + MI_SIZE_LOG2));
int col = (sign_bias == 1) ? blk_col - (mv.col >> (3 + MI_SIZE_LOG2)) int col = (sign_bias == 1) ? blk_col - (mv.col >> (3 + MI_SIZE_LOG2))
: blk_col + (mv.col >> (3 + MI_SIZE_LOG2)); : blk_col + (mv.col >> (3 + MI_SIZE_LOG2));
row = AOMMIN(row, cm->mi_rows); if (row < 0 || row >= cm->mi_rows || col < 0 || col >= cm->mi_cols) return 0;
row = AOMMAX(row, 0);
col = AOMMIN(col, cm->mi_cols);
col = AOMMAX(col, 0);
*mi_r = row; *mi_r = row;
*mi_c = col; *mi_c = col;
return 1;
} }
INLINE uint32_t mv_sign_reverse(int_mv ref) { INLINE uint32_t mv_sign_reverse(int_mv ref) {
...@@ -1355,27 +1354,30 @@ void av1_setup_motion_field(AV1_COMMON *cm) { ...@@ -1355,27 +1354,30 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
ref_frame_offset); ref_frame_offset);
get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col,
1); this_mv.as_mv, 1);
int mi_offset = mi_r * cm->mi_stride + mi_c;
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST_FRAME)][0].as_int = if (pos_valid) {
this_mv.as_int; int mi_offset = mi_r * cm->mi_stride + mi_c;
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST_FRAME)][0].as_int =
this_mv.as_int;
#if CONFIG_EXT_REFS #if CONFIG_EXT_REFS
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST2_FRAME)][0].as_int = tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST2_FRAME)][0].as_int =
this_mv.as_int; this_mv.as_int;
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST3_FRAME)][0].as_int = tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(LAST3_FRAME)][0].as_int =
this_mv.as_int; this_mv.as_int;
#endif #endif
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)][0].as_int = tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)]
this_mv.as_int; [0].as_int = this_mv.as_int;
}
} }
for (int idx = 0; idx < 2; ++idx) { for (int idx = 0; idx < 2; ++idx) {
...@@ -1389,21 +1391,23 @@ void av1_setup_motion_field(AV1_COMMON *cm) { ...@@ -1389,21 +1391,23 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
ref_frame_offset); ref_frame_offset);
get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col,
0); this_mv.as_mv, 0);
int mi_offset = mi_r * cm->mi_stride + mi_c; if (pos_valid) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt, int mi_offset = mi_r * cm->mi_stride + mi_c;
ref_frame_offset); get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt,
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(ALTREF_FRAME)][0].as_int = ref_frame_offset);
this_mv.as_int; tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(ALTREF_FRAME)]
[0].as_int = this_mv.as_int;
#if CONFIG_EXT_REFS #if CONFIG_EXT_REFS
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][0].as_int = tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(BWDREF_FRAME)]
this_mv.as_int; [0].as_int = this_mv.as_int;
#endif #endif
}
} }
} }
} }
...@@ -1467,49 +1471,51 @@ void av1_setup_motion_field(AV1_COMMON *cm) { ...@@ -1467,49 +1471,51 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt,
ref_frame_offset); ref_frame_offset);
get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col,
0); this_mv.as_mv, 0);
int mi_offset = mi_r * cm->mi_stride + mi_c; if (pos_valid) {
tpl_mvs_base[mi_offset] int mi_offset = mi_r * cm->mi_stride + mi_c;
.mfmv[FWD_RF_OFFSET(ALTREF_FRAME)][ref_stamp] tpl_mvs_base[mi_offset]
.as_int = mv_sign_reverse(this_mv); .mfmv[FWD_RF_OFFSET(ALTREF_FRAME)][ref_stamp]
.as_int = mv_sign_reverse(this_mv);
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
#if CONFIG_EXT_REFS
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp]
.as_int = mv_sign_reverse(this_mv);
if (ref_frame[0] >= LAST2_FRAME) { get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST2_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(LAST_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = this_mv.as_int;
}
if (ref_frame[0] >= LAST3_FRAME) { #if CONFIG_EXT_REFS
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST3_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = mv_sign_reverse(this_mv);
}
if (ref_frame[0] >= LAST2_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST2_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
}
if (ref_frame[0] >= LAST3_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST3_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
}
#endif #endif
if (ref_frame[0] >= GOLDEN_FRAME) { if (ref_frame[0] >= GOLDEN_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = this_mv.as_int;
}
} }
} }
} }
...@@ -1569,43 +1575,46 @@ void av1_setup_motion_field(AV1_COMMON *cm) { ...@@ -1569,43 +1575,46 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd,
ref_frame_offset); ref_frame_offset);
get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col,
0); this_mv.as_mv, 0);
int mi_offset = mi_r * cm->mi_stride + mi_c;
tpl_mvs_base[mi_offset] if (pos_valid) {
.mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp] int mi_offset = mi_r * cm->mi_stride + mi_c;
.as_int = mv_sign_reverse(this_mv);
// Project the motion vector onto last reference frame
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
if (ref_frame[0] >= LAST2_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2,
ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST2_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = mv_sign_reverse(this_mv);
}
if (ref_frame[0] >= LAST3_FRAME) { // Project the motion vector onto last reference frame
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST3_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(LAST_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = this_mv.as_int;
}
if (ref_frame[0] >= GOLDEN_FRAME) { if (ref_frame[0] >= LAST2_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld, get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst2,
ref_frame_offset); ref_frame_offset);
tpl_mvs_base[mi_offset] tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)][ref_stamp] .mfmv[FWD_RF_OFFSET(LAST2_FRAME)][ref_stamp]
.as_int = this_mv.as_int; .as_int = this_mv.as_int;
}
if (ref_frame[0] >= LAST3_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(LAST3_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
}
if (ref_frame[0] >= GOLDEN_FRAME) {
get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_gld,
ref_frame_offset);
tpl_mvs_base[mi_offset]
.mfmv[FWD_RF_OFFSET(GOLDEN_FRAME)][ref_stamp]
.as_int = this_mv.as_int;
}
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment