Refactor the motion field projection process
Make the motion field projection process independent of the
reference frame type syntax.
Change-Id: Ie5d024d76ddb990fe623c83b3f4b4b6fadc72d2c
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index ee1ac1e..7c8c5c6 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -1498,98 +1498,48 @@
return 1;
}
-static uint32_t mv_sign_reverse(int_mv ref) {
- int_mv this_mv;
- this_mv.as_mv.row = -ref.as_mv.row;
- this_mv.as_mv.col = -ref.as_mv.col;
-
- return this_mv.as_int;
-}
-
static void motion_field_projection(AV1_COMMON *cm,
- MV_REFERENCE_FRAME ref_frame,
- int ref_stamp) {
+ MV_REFERENCE_FRAME ref_frame, int ref_stamp,
+ int dir) {
TPL_MV_REF *tpl_mvs_base = cm->tpl_mvs;
+ int cur_rf_index[TOTAL_REFS_PER_FRAME] = { 0 };
+ int ref_rf_idx[TOTAL_REFS_PER_FRAME] = { 0 };
+ int cur_offset[TOTAL_REFS_PER_FRAME] = { 0 };
+ int ref_offset[TOTAL_REFS_PER_FRAME] = { 0 };
- int cur_frame_index = cm->cur_frame->cur_frame_offset;
- int lst_frame_index = 0, alt_frame_index = 0, gld_frame_index = 0;
- int lst2_frame_index = 0, lst3_frame_index = 0;
- int bwd_frame_index = 0, alt2_frame_index = 0;
-
- int alt_buf_idx = cm->frame_refs[FWD_RF_OFFSET(ALTREF_FRAME)].idx;
- int lst_buf_idx = cm->frame_refs[FWD_RF_OFFSET(LAST_FRAME)].idx;
- int gld_buf_idx = cm->frame_refs[FWD_RF_OFFSET(GOLDEN_FRAME)].idx;
- int lst2_buf_idx = cm->frame_refs[FWD_RF_OFFSET(LAST2_FRAME)].idx;
- int lst3_buf_idx = cm->frame_refs[FWD_RF_OFFSET(LAST3_FRAME)].idx;
- int bwd_buf_idx = cm->frame_refs[FWD_RF_OFFSET(BWDREF_FRAME)].idx;
- int alt2_buf_idx = cm->frame_refs[FWD_RF_OFFSET(ALTREF2_FRAME)].idx;
+ (void)dir;
int ref_frame_idx = cm->frame_refs[FWD_RF_OFFSET(ref_frame)].idx;
-
if (ref_frame_idx < 0) return;
-
int ref_frame_index =
cm->buffer_pool->frame_bufs[ref_frame_idx].cur_frame_offset;
+ int cur_frame_index = cm->cur_frame->cur_frame_offset;
+ int ref_to_cur = ref_frame_index - cur_frame_index;
- if (alt_buf_idx >= 0)
- alt_frame_index = cm->buffer_pool->frame_bufs[alt_buf_idx].cur_frame_offset;
+ ref_rf_idx[LAST_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].lst_frame_offset;
+ ref_rf_idx[GOLDEN_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].gld_frame_offset;
+ ref_rf_idx[LAST2_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].lst2_frame_offset;
+ ref_rf_idx[LAST3_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].lst3_frame_offset;
+ ref_rf_idx[BWDREF_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].bwd_frame_offset;
+ ref_rf_idx[ALTREF2_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].alt2_frame_offset;
+ ref_rf_idx[ALTREF_FRAME] =
+ cm->buffer_pool->frame_bufs[ref_frame_idx].alt_frame_offset;
- if (lst_buf_idx >= 0)
- lst_frame_index = cm->buffer_pool->frame_bufs[lst_buf_idx].cur_frame_offset;
-
- if (gld_buf_idx >= 0)
- gld_frame_index = cm->buffer_pool->frame_bufs[gld_buf_idx].cur_frame_offset;
-
- if (lst2_buf_idx >= 0)
- lst2_frame_index =
- cm->buffer_pool->frame_bufs[lst2_buf_idx].cur_frame_offset;
-
- if (lst3_buf_idx >= 0)
- lst3_frame_index =
- cm->buffer_pool->frame_bufs[lst3_buf_idx].cur_frame_offset;
-
- if (bwd_buf_idx >= 0)
- bwd_frame_index = cm->buffer_pool->frame_bufs[bwd_buf_idx].cur_frame_offset;
-
- if (alt2_buf_idx >= 0)
- alt2_frame_index =
- cm->buffer_pool->frame_bufs[alt2_buf_idx].cur_frame_offset;
+ for (MV_REFERENCE_FRAME rf = LAST_FRAME; rf <= INTER_REFS_PER_FRAME; ++rf) {
+ int buf_idx = cm->frame_refs[FWD_RF_OFFSET(rf)].idx;
+ if (buf_idx >= 0)
+ cur_rf_index[rf] = cm->buffer_pool->frame_bufs[buf_idx].cur_frame_offset;
+ cur_offset[rf] = cur_frame_index - cur_rf_index[rf];
+ ref_offset[rf] = ref_frame_index - ref_rf_idx[rf];
+ }
MV_REF *mv_ref_base = cm->buffer_pool->frame_bufs[ref_frame_idx].mvs;
- const int lst_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].lst_frame_offset;
- const int gld_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].gld_frame_offset;
- const int lst2_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].lst2_frame_offset;
- const int lst3_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].lst3_frame_offset;
- const int bwd_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].bwd_frame_offset;
- const int alt2_frame_idx =
- cm->buffer_pool->frame_bufs[ref_frame_idx].alt2_frame_offset;
-
- int cur_to_ref = ref_frame_index - cur_frame_index;
-
- int lst_offset = AOMMAX(1, ref_frame_index - lst_frame_idx);
- int gld_offset = AOMMAX(1, ref_frame_index - gld_frame_idx);
- int cur_to_alt = alt_frame_index - cur_frame_index;
- int cur_to_lst = cur_frame_index - lst_frame_index;
- int cur_to_gld = cur_frame_index - gld_frame_index;
- int bwd_offset = AOMMAX(1, ref_frame_index - bwd_frame_idx);
- int alt2_offset = AOMMAX(1, ref_frame_index - alt2_frame_idx);
- int lst2_offset = AOMMAX(1, ref_frame_index - lst2_frame_idx);
- int lst3_offset = AOMMAX(1, ref_frame_index - lst3_frame_idx);
- int cur_to_lst2 = cur_frame_index - lst2_frame_index;
- int cur_to_lst3 = cur_frame_index - lst3_frame_index;
- int cur_to_bwd = bwd_frame_index - cur_frame_index;
- int cur_to_alt2 = alt2_frame_index - cur_frame_index;
- // clang-format off
- const int ref_frame_offset_buffer[TOTAL_REFS_PER_FRAME] = {
- 0, lst_offset, lst2_offset, lst3_offset, gld_offset,
- bwd_offset, alt2_offset, 0,
- };
- // clang-format on
const int mvs_rows = (cm->mi_rows + 1) >> 1;
const int mvs_cols = (cm->mi_cols + 1) >> 1;
@@ -1597,62 +1547,25 @@
for (int blk_col = 0; blk_col < mvs_cols; ++blk_col) {
MV_REF *mv_ref = &mv_ref_base[blk_row * mvs_cols + blk_col];
MV fwd_mv = mv_ref->mv[0].as_mv;
- MV_REFERENCE_FRAME rf[2] = { mv_ref->ref_frame[0], mv_ref->ref_frame[1] };
- const int ref_frame_offset = ref_frame_offset_buffer[rf[0]];
+ const int ref_frame_offset = ref_offset[mv_ref->ref_frame[0]];
- if (rf[0] <= GOLDEN_FRAME && rf[0] > INTRA_FRAME) {
+ if (mv_ref->ref_frame[0] > INTRA_FRAME) {
int_mv this_mv;
int mi_r, mi_c;
- get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_ref, ref_frame_offset);
+ 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, 0);
-
if (pos_valid) {
int mi_offset = mi_r * (cm->mi_stride >> 1) + 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)][ref_stamp]
- .as_int = mv_sign_reverse(this_mv);
-
- get_mv_projection(&this_mv.as_mv, fwd_mv, cur_to_alt2,
- ref_frame_offset);
- tpl_mvs_base[mi_offset]
- .mfmv[FWD_RF_OFFSET(ALTREF2_FRAME)][ref_stamp]
- .as_int = mv_sign_reverse(this_mv);
-
- 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);
-
- 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;
-
- 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;
-
- 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;
-
- 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;
+ for (MV_REFERENCE_FRAME rf = ALTREF_FRAME; rf >= LAST_FRAME; --rf) {
+ get_mv_projection(&this_mv.as_mv, fwd_mv, cur_offset[rf],
+ ref_frame_offset);
+ tpl_mvs_base[mi_offset].mfmv[FWD_RF_OFFSET(rf)][ref_stamp].as_int =
+ this_mv.as_int;
+ }
}
}
}
@@ -1707,7 +1620,7 @@
cm->buffer_pool->frame_bufs[alt2_buf_idx].cur_frame_offset;
memset(cm->ref_frame_side, 0, sizeof(cm->ref_frame_side));
- for (int ref_frame = LAST_FRAME; ref_frame < INTER_REFS_PER_FRAME;
+ for (int ref_frame = LAST_FRAME; ref_frame <= INTER_REFS_PER_FRAME;
++ref_frame) {
int buf_idx = cm->frame_refs[ref_frame - LAST_FRAME].idx;
int frame_index = -1;
@@ -1855,17 +1768,17 @@
}
if (bwd_frame_index > cur_frame_index) {
- motion_field_projection(cm, BWDREF_FRAME, ref_stamp);
+ motion_field_projection(cm, BWDREF_FRAME, ref_stamp, 0);
--ref_stamp;
}
if (alt2_frame_index > cur_frame_index) {
- motion_field_projection(cm, ALTREF2_FRAME, ref_stamp);
+ motion_field_projection(cm, ALTREF2_FRAME, ref_stamp, 0);
--ref_stamp;
}
if (alt_frame_index > cur_frame_index && ref_stamp >= 0)
- motion_field_projection(cm, ALTREF_FRAME, ref_stamp);
+ motion_field_projection(cm, ALTREF_FRAME, ref_stamp, 0);
}
#endif // CONFIG_MFMV