[NORMATIVE] Limit valid frame distance for mfmv projection Set the maximum frame distance to be 32. If a reference motion vector needs to span across two frames at distance more than 32, drop the use of this reference motion vector. BUG=aomedia:1394 This also clears ubsan warnings in unit tests. Change-Id: I98b72b5fd2a885661542bbc5f8da1886d77f889f
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c index cb9ee7f..7432168 100644 --- a/av1/common/mvref_common.c +++ b/av1/common/mvref_common.c
@@ -30,6 +30,9 @@ // TODO(jingning): Consider the use of lookup table for (num / den) // altogether. static void get_mv_projection(MV *output, MV ref, int num, int den) { + den = AOMMIN(den, MAX_FRAME_DISTANCE); + num = num > 0 ? AOMMIN(num, MAX_FRAME_DISTANCE) + : AOMMAX(num, -MAX_FRAME_DISTANCE); output->row = (int16_t)(ROUND_POWER_OF_TWO_SIGNED(ref.row * num * div_mult[den], 14)); output->col = @@ -1651,9 +1654,16 @@ int mi_r, mi_c; const int ref_frame_offset = ref_offset[mv_ref->ref_frame[dir & 0x01]]; - get_mv_projection(&this_mv.as_mv, fwd_mv, ref_to_cur, ref_frame_offset); - int pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, - this_mv.as_mv, dir >> 1); + int pos_valid = abs(ref_frame_offset) < MAX_FRAME_DISTANCE && + abs(ref_to_cur) < MAX_FRAME_DISTANCE; + + if (pos_valid) { + get_mv_projection(&this_mv.as_mv, fwd_mv, ref_to_cur, + ref_frame_offset); + pos_valid = get_block_position(cm, &mi_r, &mi_c, blk_row, blk_col, + this_mv.as_mv, dir >> 1); + } + if (pos_valid) { int mi_offset = mi_r * (cm->mi_stride >> 1) + mi_c;