diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c index 67045f4b9a1f5b463dcfff3d2279551e12d91177..016a3eb3d535ff3d918628d74fb6bd862e55900a 100644 --- a/av1/common/mvref_common.c +++ b/av1/common/mvref_common.c @@ -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); } -INLINE void get_block_position(AV1_COMMON *cm, int *mi_r, int *mi_c, - int blk_row, int blk_col, MV mv, int sign_bias) { +INLINE int get_block_position(AV1_COMMON *cm, int *mi_r, int *mi_c, int blk_row, + int blk_col, MV mv, int sign_bias) { int row = (sign_bias == 1) ? 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)) : blk_col + (mv.col >> (3 + MI_SIZE_LOG2)); - row = AOMMIN(row, cm->mi_rows); - row = AOMMAX(row, 0); - col = AOMMIN(col, cm->mi_cols); - col = AOMMAX(col, 0); + if (row < 0 || row >= cm->mi_rows || col < 0 || col >= cm->mi_cols) return 0; *mi_r = row; *mi_c = col; + + return 1; } INLINE uint32_t mv_sign_reverse(int_mv ref) { @@ -1355,27 +1354,30 @@ void av1_setup_motion_field(AV1_COMMON *cm) { get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst, ref_frame_offset); - get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, 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 = - this_mv.as_int; + int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, + this_mv.as_mv, 1); + + if (pos_valid) { + 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 - 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)][0].as_int = - this_mv.as_int; + 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)][0].as_int = + this_mv.as_int; - 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)][0].as_int = - this_mv.as_int; + 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)][0].as_int = + this_mv.as_int; #endif - 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)][0].as_int = - this_mv.as_int; + 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)] + [0].as_int = this_mv.as_int; + } } for (int idx = 0; idx < 2; ++idx) { @@ -1389,21 +1391,23 @@ void av1_setup_motion_field(AV1_COMMON *cm) { get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst, ref_frame_offset); - get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, - 0); + int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, + this_mv.as_mv, 0); - int mi_offset = mi_r * cm->mi_stride + mi_c; - get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt, - ref_frame_offset); - tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(ALTREF_FRAME)][0].as_int = - this_mv.as_int; + if (pos_valid) { + int mi_offset = mi_r * cm->mi_stride + mi_c; + get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt, + ref_frame_offset); + tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(ALTREF_FRAME)] + [0].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)][0].as_int = - this_mv.as_int; + 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)] + [0].as_int = this_mv.as_int; #endif + } } } } @@ -1467,49 +1471,51 @@ void av1_setup_motion_field(AV1_COMMON *cm) { get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt, ref_frame_offset); - get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, - 0); + int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, + this_mv.as_mv, 0); - int mi_offset = mi_r * cm->mi_stride + mi_c; - tpl_mvs_base[mi_offset] - .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 (pos_valid) { + int mi_offset = mi_r * cm->mi_stride + mi_c; + tpl_mvs_base[mi_offset] + .mfmv[FWD_RF_OFFSET(ALTREF_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_lst2, + get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst, ref_frame_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; - } - if (ref_frame[0] >= LAST3_FRAME) { - get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3, +#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(LAST3_FRAME)][ref_stamp] - .as_int = this_mv.as_int; - } + .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_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 - 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; + 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; + } } } } @@ -1569,43 +1575,46 @@ void av1_setup_motion_field(AV1_COMMON *cm) { get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_bwd, ref_frame_offset); - get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, this_mv.as_mv, - 0); - int mi_offset = mi_r * cm->mi_stride + mi_c; + int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, + this_mv.as_mv, 0); - tpl_mvs_base[mi_offset] - .mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp] - .as_int = mv_sign_reverse(this_mv); + if (pos_valid) { + int mi_offset = mi_r * cm->mi_stride + mi_c; - // 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] - .mfmv[FWD_RF_OFFSET(LAST2_FRAME)][ref_stamp] - .as_int = this_mv.as_int; - } + .mfmv[FWD_RF_OFFSET(BWDREF_FRAME)][ref_stamp] + .as_int = mv_sign_reverse(this_mv); - if (ref_frame[0] >= LAST3_FRAME) { - get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_lst3, + // 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(LAST3_FRAME)][ref_stamp] + .mfmv[FWD_RF_OFFSET(LAST_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; + 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; + } + + 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; + } } } }