Seperate weight from candidate_mv structure
Seperating 'weight' from candidate_mv structure. This patch
will facilitate in changing the datatype of weight from int to
uint16_t.
Change-Id: I9c4af0c76e34221bdfea69fa08ec9a2bfe965c67
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 9395c36..45bd9a7 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -535,6 +535,7 @@
uint8_t ref_mv_count[MODE_CTX_REF_FRAMES];
CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
+ int weight[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
uint8_t is_sec_rect;
// Counts of each reference frame in the above and left neighboring blocks.
diff --git a/av1/common/mv.h b/av1/common/mv.h
index d097f9e..fe821ee 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -277,7 +277,6 @@
typedef struct candidate_mv {
int_mv this_mv;
int_mv comp_mv;
- int weight;
} CANDIDATE_MV;
static INLINE int is_zero_mv(const MV *mv) {
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index e38891f..a6bef20 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -74,7 +74,7 @@
static void add_ref_mv_candidate(
const MB_MODE_INFO *const candidate, const MV_REFERENCE_FRAME rf[2],
uint8_t *refmv_count, uint8_t *ref_match_count, uint8_t *newmv_count,
- CANDIDATE_MV *ref_mv_stack, int_mv *gm_mv_candidates,
+ CANDIDATE_MV *ref_mv_stack, int *ref_mv_weight, int_mv *gm_mv_candidates,
const WarpedMotionParams *gm_params, int col, int weight) {
if (!is_inter_block(candidate)) return; // for intrabc
int index = 0, ref;
@@ -93,12 +93,12 @@
for (index = 0; index < *refmv_count; ++index)
if (ref_mv_stack[index].this_mv.as_int == this_refmv.as_int) break;
- if (index < *refmv_count) ref_mv_stack[index].weight += weight;
+ if (index < *refmv_count) ref_mv_weight[index] += weight;
// Add a new item to the list.
if (index == *refmv_count && *refmv_count < MAX_REF_MV_STACK_SIZE) {
ref_mv_stack[index].this_mv = this_refmv;
- ref_mv_stack[index].weight = weight;
+ ref_mv_weight[index] = weight;
++(*refmv_count);
}
if (have_newmv_in_inter_mode(candidate->mode)) ++*newmv_count;
@@ -122,13 +122,13 @@
(ref_mv_stack[index].comp_mv.as_int == this_refmv[1].as_int))
break;
- if (index < *refmv_count) ref_mv_stack[index].weight += weight;
+ if (index < *refmv_count) ref_mv_weight[index] += weight;
// Add a new item to the list.
if (index == *refmv_count && *refmv_count < MAX_REF_MV_STACK_SIZE) {
ref_mv_stack[index].this_mv = this_refmv[0];
ref_mv_stack[index].comp_mv = this_refmv[1];
- ref_mv_stack[index].weight = weight;
+ ref_mv_weight[index] = weight;
++(*refmv_count);
}
if (have_newmv_in_inter_mode(candidate->mode)) ++*newmv_count;
@@ -140,10 +140,10 @@
static void scan_row_mbmi(const AV1_COMMON *cm, const MACROBLOCKD *xd,
int mi_row, int mi_col,
const MV_REFERENCE_FRAME rf[2], int row_offset,
- CANDIDATE_MV *ref_mv_stack, uint8_t *refmv_count,
- uint8_t *ref_match_count, uint8_t *newmv_count,
- int_mv *gm_mv_candidates, int max_row_offset,
- int *processed_rows) {
+ CANDIDATE_MV *ref_mv_stack, int *ref_mv_weight,
+ uint8_t *refmv_count, uint8_t *ref_match_count,
+ uint8_t *newmv_count, int_mv *gm_mv_candidates,
+ int max_row_offset, int *processed_rows) {
int end_mi = AOMMIN(xd->n4_w, cm->mi_cols - mi_col);
end_mi = AOMMIN(end_mi, mi_size_wide[BLOCK_64X64]);
const int n8_w_8 = mi_size_wide[BLOCK_8X8];
@@ -180,8 +180,9 @@
}
add_ref_mv_candidate(candidate, rf, refmv_count, ref_match_count,
- newmv_count, ref_mv_stack, gm_mv_candidates,
- cm->global_motion, col_offset + i, len * weight);
+ newmv_count, ref_mv_stack, ref_mv_weight,
+ gm_mv_candidates, cm->global_motion, col_offset + i,
+ len * weight);
i += len;
}
@@ -190,10 +191,10 @@
static void scan_col_mbmi(const AV1_COMMON *cm, const MACROBLOCKD *xd,
int mi_row, int mi_col,
const MV_REFERENCE_FRAME rf[2], int col_offset,
- CANDIDATE_MV *ref_mv_stack, uint8_t *refmv_count,
- uint8_t *ref_match_count, uint8_t *newmv_count,
- int_mv *gm_mv_candidates, int max_col_offset,
- int *processed_cols) {
+ CANDIDATE_MV *ref_mv_stack, int *ref_mv_weight,
+ uint8_t *refmv_count, uint8_t *ref_match_count,
+ uint8_t *newmv_count, int_mv *gm_mv_candidates,
+ int max_col_offset, int *processed_cols) {
int end_mi = AOMMIN(xd->n4_h, cm->mi_rows - mi_row);
end_mi = AOMMIN(end_mi, mi_size_high[BLOCK_64X64]);
const int n8_h_8 = mi_size_high[BLOCK_8X8];
@@ -229,8 +230,9 @@
}
add_ref_mv_candidate(candidate, rf, refmv_count, ref_match_count,
- newmv_count, ref_mv_stack, gm_mv_candidates,
- cm->global_motion, col_offset, len * weight);
+ newmv_count, ref_mv_stack, ref_mv_weight,
+ gm_mv_candidates, cm->global_motion, col_offset,
+ len * weight);
i += len;
}
@@ -240,8 +242,8 @@
const int mi_row, const int mi_col,
const MV_REFERENCE_FRAME rf[2], int row_offset,
int col_offset, CANDIDATE_MV *ref_mv_stack,
- uint8_t *ref_match_count, uint8_t *newmv_count,
- int_mv *gm_mv_candidates,
+ int *ref_mv_weight, uint8_t *ref_match_count,
+ uint8_t *newmv_count, int_mv *gm_mv_candidates,
uint8_t refmv_count[MODE_CTX_REF_FRAMES]) {
const TileInfo *const tile = &xd->tile;
POSITION mi_pos;
@@ -255,8 +257,9 @@
const int len = mi_size_wide[BLOCK_8X8];
add_ref_mv_candidate(candidate, rf, refmv_count, ref_match_count,
- newmv_count, ref_mv_stack, gm_mv_candidates,
- cm->global_motion, mi_pos.col, 2 * len);
+ newmv_count, ref_mv_stack, ref_mv_weight,
+ gm_mv_candidates, cm->global_motion, mi_pos.col,
+ 2 * len);
} // Analyze a single 8x8 block motion information.
}
@@ -328,6 +331,7 @@
int blk_row, int blk_col, int_mv *gm_mv_candidates,
uint8_t refmv_count[MODE_CTX_REF_FRAMES],
CANDIDATE_MV ref_mv_stacks[][MAX_REF_MV_STACK_SIZE],
+ int ref_mv_weights[][MAX_REF_MV_STACK_SIZE],
int16_t *mode_context) {
POSITION mi_pos;
int idx;
@@ -352,7 +356,7 @@
int cur_offset_0 = get_relative_dist(&cm->seq_params.order_hint_info,
cur_frame_index, frame0_index);
CANDIDATE_MV *ref_mv_stack = ref_mv_stacks[rf[0]];
-
+ int *ref_mv_weight = ref_mv_weights[rf[0]];
if (prev_frame_mvs->mfmv0.as_int != INVALID_MV) {
int_mv this_refmv;
@@ -369,12 +373,12 @@
for (idx = 0; idx < refmv_count[rf[0]]; ++idx)
if (this_refmv.as_int == ref_mv_stack[idx].this_mv.as_int) break;
- if (idx < refmv_count[rf[0]]) ref_mv_stack[idx].weight += 2 * weight_unit;
+ if (idx < refmv_count[rf[0]]) ref_mv_weight[idx] += 2 * weight_unit;
if (idx == refmv_count[rf[0]] &&
refmv_count[rf[0]] < MAX_REF_MV_STACK_SIZE) {
ref_mv_stack[idx].this_mv.as_int = this_refmv.as_int;
- ref_mv_stack[idx].weight = 2 * weight_unit;
+ ref_mv_weight[idx] = 2 * weight_unit;
++(refmv_count[rf[0]]);
}
return 1;
@@ -392,7 +396,7 @@
int cur_offset_1 = get_relative_dist(&cm->seq_params.order_hint_info,
cur_frame_index, frame1_index);
CANDIDATE_MV *ref_mv_stack = ref_mv_stacks[ref_frame];
-
+ int *ref_mv_weight = ref_mv_weights[ref_frame];
if (prev_frame_mvs->mfmv0.as_int != INVALID_MV) {
int_mv this_refmv;
int_mv comp_refmv;
@@ -418,14 +422,13 @@
comp_refmv.as_int == ref_mv_stack[idx].comp_mv.as_int)
break;
- if (idx < refmv_count[ref_frame])
- ref_mv_stack[idx].weight += 2 * weight_unit;
+ if (idx < refmv_count[ref_frame]) ref_mv_weight[idx] += 2 * weight_unit;
if (idx == refmv_count[ref_frame] &&
refmv_count[ref_frame] < MAX_REF_MV_STACK_SIZE) {
ref_mv_stack[idx].this_mv.as_int = this_refmv.as_int;
ref_mv_stack[idx].comp_mv.as_int = comp_refmv.as_int;
- ref_mv_stack[idx].weight = 2 * weight_unit;
+ ref_mv_weight[idx] = 2 * weight_unit;
++(refmv_count[ref_frame]);
}
return 1;
@@ -462,7 +465,8 @@
static void process_single_ref_mv_candidate(
const MB_MODE_INFO *const candidate, const AV1_COMMON *const cm,
MV_REFERENCE_FRAME ref_frame, uint8_t refmv_count[MODE_CTX_REF_FRAMES],
- CANDIDATE_MV ref_mv_stack[][MAX_REF_MV_STACK_SIZE]) {
+ CANDIDATE_MV ref_mv_stack[][MAX_REF_MV_STACK_SIZE],
+ int ref_mv_weight[][MAX_REF_MV_STACK_SIZE]) {
for (int rf_idx = 0; rf_idx < 2; ++rf_idx) {
if (candidate->ref_frame[rf_idx] > INTRA_FRAME) {
int_mv this_mv = candidate->mv[rf_idx];
@@ -482,7 +486,7 @@
// TODO(jingning): Set an arbitrary small number here. The weight
// doesn't matter as long as it is properly initialized.
- ref_mv_stack[ref_frame][stack_idx].weight = 2;
+ ref_mv_weight[ref_frame][stack_idx] = 2;
++refmv_count[ref_frame];
}
}
@@ -493,6 +497,7 @@
const AV1_COMMON *cm, const MACROBLOCKD *xd, MV_REFERENCE_FRAME ref_frame,
uint8_t refmv_count[MODE_CTX_REF_FRAMES],
CANDIDATE_MV ref_mv_stack[][MAX_REF_MV_STACK_SIZE],
+ int ref_mv_weight[][MAX_REF_MV_STACK_SIZE],
int_mv mv_ref_list[][MAX_MV_REF_CANDIDATES], int_mv *gm_mv_candidates,
int mi_row, int mi_col, int16_t *mode_context) {
const int bs = AOMMAX(xd->n4_w, xd->n4_h);
@@ -536,25 +541,28 @@
// Scan the first above row mode info. row_offset = -1;
if (abs(max_row_offset) >= 1)
scan_row_mbmi(cm, xd, mi_row, mi_col, rf, -1, ref_mv_stack[ref_frame],
- &refmv_count[ref_frame], &row_match_count, &newmv_count,
- gm_mv_candidates, max_row_offset, &processed_rows);
+ ref_mv_weight[ref_frame], &refmv_count[ref_frame],
+ &row_match_count, &newmv_count, gm_mv_candidates,
+ max_row_offset, &processed_rows);
// Scan the first left column mode info. col_offset = -1;
if (abs(max_col_offset) >= 1)
scan_col_mbmi(cm, xd, mi_row, mi_col, rf, -1, ref_mv_stack[ref_frame],
- &refmv_count[ref_frame], &col_match_count, &newmv_count,
- gm_mv_candidates, max_col_offset, &processed_cols);
+ ref_mv_weight[ref_frame], &refmv_count[ref_frame],
+ &col_match_count, &newmv_count, gm_mv_candidates,
+ max_col_offset, &processed_cols);
// Check top-right boundary
if (has_tr)
scan_blk_mbmi(cm, xd, mi_row, mi_col, rf, -1, xd->n4_w,
- ref_mv_stack[ref_frame], &row_match_count, &newmv_count,
- gm_mv_candidates, &refmv_count[ref_frame]);
+ ref_mv_stack[ref_frame], ref_mv_weight[ref_frame],
+ &row_match_count, &newmv_count, gm_mv_candidates,
+ &refmv_count[ref_frame]);
const uint8_t nearest_match = (row_match_count > 0) + (col_match_count > 0);
const uint8_t nearest_refmv_count = refmv_count[ref_frame];
// TODO(yunqing): for comp_search, do it for all 3 cases.
for (int idx = 0; idx < nearest_refmv_count; ++idx)
- ref_mv_stack[ref_frame][idx].weight += REF_CAT_LEVEL;
+ ref_mv_weight[ref_frame][idx] += REF_CAT_LEVEL;
if (cm->allow_ref_frame_mvs) {
int is_available = 0;
@@ -584,7 +592,7 @@
for (int blk_col = 0; blk_col < blk_col_end; blk_col += step_w) {
int ret = add_tpl_ref_mv(cm, xd, mi_row, mi_col, ref_frame, blk_row,
blk_col, gm_mv_candidates, refmv_count,
- ref_mv_stack, mode_context);
+ ref_mv_stack, ref_mv_weight, mode_context);
if (blk_row == 0 && blk_col == 0) is_available = ret;
}
}
@@ -597,7 +605,8 @@
if (!check_sb_border(mi_row, mi_col, blk_row, blk_col)) continue;
add_tpl_ref_mv(cm, xd, mi_row, mi_col, ref_frame, blk_row, blk_col,
- gm_mv_candidates, refmv_count, ref_mv_stack, mode_context);
+ gm_mv_candidates, refmv_count, ref_mv_stack, ref_mv_weight,
+ mode_context);
}
}
@@ -605,8 +614,8 @@
// Scan the second outer area.
scan_blk_mbmi(cm, xd, mi_row, mi_col, rf, -1, -1, ref_mv_stack[ref_frame],
- &row_match_count, &dummy_newmv_count, gm_mv_candidates,
- &refmv_count[ref_frame]);
+ ref_mv_weight[ref_frame], &row_match_count, &dummy_newmv_count,
+ gm_mv_candidates, &refmv_count[ref_frame]);
for (int idx = 2; idx <= MVREF_ROW_COLS; ++idx) {
const int row_offset = -(idx << 1) + 1 + row_adj;
@@ -615,16 +624,18 @@
if (abs(row_offset) <= abs(max_row_offset) &&
abs(row_offset) > processed_rows)
scan_row_mbmi(cm, xd, mi_row, mi_col, rf, row_offset,
- ref_mv_stack[ref_frame], &refmv_count[ref_frame],
- &row_match_count, &dummy_newmv_count, gm_mv_candidates,
- max_row_offset, &processed_rows);
+ ref_mv_stack[ref_frame], ref_mv_weight[ref_frame],
+ &refmv_count[ref_frame], &row_match_count,
+ &dummy_newmv_count, gm_mv_candidates, max_row_offset,
+ &processed_rows);
if (abs(col_offset) <= abs(max_col_offset) &&
abs(col_offset) > processed_cols)
scan_col_mbmi(cm, xd, mi_row, mi_col, rf, col_offset,
- ref_mv_stack[ref_frame], &refmv_count[ref_frame],
- &col_match_count, &dummy_newmv_count, gm_mv_candidates,
- max_col_offset, &processed_cols);
+ ref_mv_stack[ref_frame], ref_mv_weight[ref_frame],
+ &refmv_count[ref_frame], &col_match_count,
+ &dummy_newmv_count, gm_mv_candidates, max_col_offset,
+ &processed_cols);
}
const uint8_t ref_match_count = (row_match_count > 0) + (col_match_count > 0);
@@ -661,11 +672,13 @@
while (len > 0) {
int nr_len = 0;
for (int idx = 1; idx < len; ++idx) {
- if (ref_mv_stack[ref_frame][idx - 1].weight <
- ref_mv_stack[ref_frame][idx].weight) {
+ if (ref_mv_weight[ref_frame][idx - 1] < ref_mv_weight[ref_frame][idx]) {
CANDIDATE_MV tmp_mv = ref_mv_stack[ref_frame][idx - 1];
+ int tmp_ref_mv_weight = ref_mv_weight[ref_frame][idx - 1];
ref_mv_stack[ref_frame][idx - 1] = ref_mv_stack[ref_frame][idx];
ref_mv_stack[ref_frame][idx] = tmp_mv;
+ ref_mv_weight[ref_frame][idx - 1] = ref_mv_weight[ref_frame][idx];
+ ref_mv_weight[ref_frame][idx] = tmp_ref_mv_weight;
nr_len = idx;
}
}
@@ -676,11 +689,13 @@
while (len > nearest_refmv_count) {
int nr_len = nearest_refmv_count;
for (int idx = nearest_refmv_count + 1; idx < len; ++idx) {
- if (ref_mv_stack[ref_frame][idx - 1].weight <
- ref_mv_stack[ref_frame][idx].weight) {
+ if (ref_mv_weight[ref_frame][idx - 1] < ref_mv_weight[ref_frame][idx]) {
CANDIDATE_MV tmp_mv = ref_mv_stack[ref_frame][idx - 1];
+ int tmp_ref_mv_weight = ref_mv_weight[ref_frame][idx - 1];
ref_mv_stack[ref_frame][idx - 1] = ref_mv_stack[ref_frame][idx];
ref_mv_stack[ref_frame][idx] = tmp_mv;
+ ref_mv_weight[ref_frame][idx - 1] = ref_mv_weight[ref_frame][idx];
+ ref_mv_weight[ref_frame][idx] = tmp_ref_mv_weight;
nr_len = idx;
}
}
@@ -745,7 +760,7 @@
ref_mv_stack[ref_frame][refmv_count[ref_frame]].comp_mv =
comp_list[0][1];
}
- ref_mv_stack[ref_frame][refmv_count[ref_frame]].weight = 2;
+ ref_mv_weight[ref_frame][refmv_count[ref_frame]] = 2;
++refmv_count[ref_frame];
} else {
for (int idx = 0; idx < MAX_MV_REF_CANDIDATES; ++idx) {
@@ -753,7 +768,7 @@
comp_list[idx][0];
ref_mv_stack[ref_frame][refmv_count[ref_frame]].comp_mv =
comp_list[idx][1];
- ref_mv_stack[ref_frame][refmv_count[ref_frame]].weight = 2;
+ ref_mv_weight[ref_frame][refmv_count[ref_frame]] = 2;
++refmv_count[ref_frame];
}
}
@@ -779,7 +794,7 @@
refmv_count[ref_frame] < MAX_MV_REF_CANDIDATES;) {
const MB_MODE_INFO *const candidate = xd->mi[-xd->mi_stride + idx];
process_single_ref_mv_candidate(candidate, cm, ref_frame, refmv_count,
- ref_mv_stack);
+ ref_mv_stack, ref_mv_weight);
idx += mi_size_wide[candidate->sb_type];
}
@@ -787,7 +802,7 @@
refmv_count[ref_frame] < MAX_MV_REF_CANDIDATES;) {
const MB_MODE_INFO *const candidate = xd->mi[idx * xd->mi_stride - 1];
process_single_ref_mv_candidate(candidate, cm, ref_frame, refmv_count,
- ref_mv_stack);
+ ref_mv_stack, ref_mv_weight);
idx += mi_size_high[candidate->sb_type];
}
@@ -813,6 +828,7 @@
MB_MODE_INFO *mi, MV_REFERENCE_FRAME ref_frame,
uint8_t ref_mv_count[MODE_CTX_REF_FRAMES],
CANDIDATE_MV ref_mv_stack[][MAX_REF_MV_STACK_SIZE],
+ int ref_mv_weight[][MAX_REF_MV_STACK_SIZE],
int_mv mv_ref_list[][MAX_MV_REF_CANDIDATES],
int_mv *global_mvs, int mi_row, int mi_col,
int16_t *mode_context) {
@@ -848,8 +864,9 @@
zeromv[0].as_int = zeromv[1].as_int = 0;
}
- setup_ref_mv_list(cm, xd, ref_frame, ref_mv_count, ref_mv_stack, mv_ref_list,
- zeromv, mi_row, mi_col, mode_context);
+ setup_ref_mv_list(cm, xd, ref_frame, ref_mv_count, ref_mv_stack,
+ ref_mv_weight, mv_ref_list, zeromv, mi_row, mi_col,
+ mode_context);
}
void av1_find_best_ref_mvs(int allow_hp, int_mv *mvlist, int_mv *nearest_mv,
diff --git a/av1/common/mvref_common.h b/av1/common/mvref_common.h
index 0aa9d38..ad67b22 100644
--- a/av1/common/mvref_common.h
+++ b/av1/common/mvref_common.h
@@ -189,18 +189,17 @@
return comp_ctx;
}
-static INLINE uint8_t av1_drl_ctx(const CANDIDATE_MV *ref_mv_stack,
- int ref_idx) {
- if (ref_mv_stack[ref_idx].weight >= REF_CAT_LEVEL &&
- ref_mv_stack[ref_idx + 1].weight >= REF_CAT_LEVEL)
+static INLINE uint8_t av1_drl_ctx(const int *ref_mv_weight, int ref_idx) {
+ if (ref_mv_weight[ref_idx] >= REF_CAT_LEVEL &&
+ ref_mv_weight[ref_idx + 1] >= REF_CAT_LEVEL)
return 0;
- if (ref_mv_stack[ref_idx].weight >= REF_CAT_LEVEL &&
- ref_mv_stack[ref_idx + 1].weight < REF_CAT_LEVEL)
+ if (ref_mv_weight[ref_idx] >= REF_CAT_LEVEL &&
+ ref_mv_weight[ref_idx + 1] < REF_CAT_LEVEL)
return 1;
- if (ref_mv_stack[ref_idx].weight < REF_CAT_LEVEL &&
- ref_mv_stack[ref_idx + 1].weight < REF_CAT_LEVEL)
+ if (ref_mv_weight[ref_idx] < REF_CAT_LEVEL &&
+ ref_mv_weight[ref_idx + 1] < REF_CAT_LEVEL)
return 2;
return 0;
@@ -251,6 +250,7 @@
MB_MODE_INFO *mi, MV_REFERENCE_FRAME ref_frame,
uint8_t ref_mv_count[MODE_CTX_REF_FRAMES],
CANDIDATE_MV ref_mv_stack[][MAX_REF_MV_STACK_SIZE],
+ int ref_mv_weight[][MAX_REF_MV_STACK_SIZE],
int_mv mv_ref_list[][MAX_MV_REF_CANDIDATES],
int_mv *global_mvs, int mi_row, int mi_col,
int16_t *mode_context);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 2791f3a..311ee76 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -183,7 +183,7 @@
if (mbmi->mode == NEWMV || mbmi->mode == NEW_NEWMV) {
for (int idx = 0; idx < 2; ++idx) {
if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(xd->weight[ref_frame_type], idx);
int drl_idx = aom_read_symbol(r, ec_ctx->drl_cdf[drl_ctx], 2, ACCT_STR);
mbmi->ref_mv_idx = idx + drl_idx;
if (!drl_idx) return;
@@ -196,7 +196,7 @@
// mode is factored in.
for (int idx = 1; idx < 3; ++idx) {
if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(xd->weight[ref_frame_type], idx);
int drl_idx = aom_read_symbol(r, ec_ctx->drl_cdf[drl_ctx], 2, ACCT_STR);
mbmi->ref_mv_idx = idx + drl_idx - 1;
if (!drl_idx) return;
@@ -680,8 +680,8 @@
int_mv ref_mvs[INTRA_FRAME + 1][MAX_MV_REF_CANDIDATES];
av1_find_mv_refs(cm, xd, mbmi, INTRA_FRAME, xd->ref_mv_count,
- xd->ref_mv_stack, ref_mvs, /*global_mvs=*/NULL, mi_row,
- mi_col, inter_mode_ctx);
+ xd->ref_mv_stack, xd->weight, ref_mvs, /*global_mvs=*/NULL,
+ mi_row, mi_col, inter_mode_ctx);
int_mv nearestmv, nearmv;
@@ -1271,7 +1271,7 @@
MV_REFERENCE_FRAME ref_frame = av1_ref_frame_type(mbmi->ref_frame);
av1_find_mv_refs(cm, xd, mbmi, ref_frame, xd->ref_mv_count, xd->ref_mv_stack,
- ref_mvs, /*global_mvs=*/NULL, mi_row, mi_col,
+ xd->weight, ref_mvs, /*global_mvs=*/NULL, mi_row, mi_col,
inter_mode_ctx);
int mode_ctx = av1_mode_context_analyzer(inter_mode_ctx, mbmi->ref_frame);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 354f9eb..1db2822 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -106,8 +106,7 @@
int idx;
for (idx = 0; idx < 2; ++idx) {
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
aom_write_symbol(w, mbmi->ref_mv_idx != idx, ec_ctx->drl_cdf[drl_ctx],
2);
@@ -122,8 +121,7 @@
// TODO(jingning): Temporary solution to compensate the NEARESTMV offset.
for (idx = 1; idx < 3; ++idx) {
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
aom_write_symbol(w, mbmi->ref_mv_idx != (idx - 1),
ec_ctx->drl_cdf[drl_ctx], 2);
if (mbmi->ref_mv_idx == (idx - 1)) return;
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 96b0991d..e8ca91c 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -77,6 +77,7 @@
// TODO(angiebird): Reduce the buffer size according to sb_type
CB_COEFF_BUFFER *cb_coef_buff;
CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
+ int weight[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
int_mv global_mvs[REF_FRAMES];
int cb_offset;
int16_t mode_context[MODE_CTX_REF_FRAMES];
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index fc341d0..b1306ce 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -1361,7 +1361,7 @@
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
#if CONFIG_ENTROPY_STATS
uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
++counts->drl_mode[drl_ctx][mbmi->ref_mv_idx != idx];
#endif
@@ -1378,7 +1378,7 @@
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
#if CONFIG_ENTROPY_STATS
uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
++counts->drl_mode[drl_ctx][mbmi->ref_mv_idx != idx - 1];
#endif
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 2576815..443fee6 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -449,8 +449,9 @@
av1_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, sf, sf,
num_planes);
av1_find_mv_refs(cm, xd, mbmi, ref_frame, mbmi_ext->ref_mv_count,
- mbmi_ext->ref_mv_stack, NULL, mbmi_ext->global_mvs, mi_row,
- mi_col, mbmi_ext->mode_context);
+ mbmi_ext->ref_mv_stack, mbmi_ext->weight, NULL,
+ mbmi_ext->global_mvs, mi_row, mi_col,
+ mbmi_ext->mode_context);
av1_find_best_ref_mvs_from_stack(cm->allow_high_precision_mv, mbmi_ext,
ref_frame, &frame_mv[NEARESTMV][ref_frame],
&frame_mv[NEARMV][ref_frame], 0);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index bf79787..5a6556e 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -7041,8 +7041,9 @@
// Gets an initial list of candidate vectors from neighbours and orders them
av1_find_mv_refs(cm, xd, mbmi, ref_frame, mbmi_ext->ref_mv_count,
- mbmi_ext->ref_mv_stack, NULL, mbmi_ext->global_mvs, mi_row,
- mi_col, mbmi_ext->mode_context);
+ mbmi_ext->ref_mv_stack, mbmi_ext->weight, NULL,
+ mbmi_ext->global_mvs, mi_row, mi_col,
+ mbmi_ext->mode_context);
// Further refinement that is encode side only to test the top few candidates
// in full and choose the best as the center point for subsequent searches.
@@ -9840,8 +9841,7 @@
if (mbmi->mode == NEWMV || mbmi->mode == NEW_NEWMV) {
for (int idx = 0; idx < 2; ++idx) {
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
cost += drl_mode_cost0[drl_ctx][mbmi->ref_mv_idx != idx];
if (mbmi->ref_mv_idx == idx) return cost;
}
@@ -9852,8 +9852,7 @@
if (have_nearmv_in_inter_mode(mbmi->mode)) {
for (int idx = 1; idx < 3; ++idx) {
if (mbmi_ext->ref_mv_count[ref_frame_type] > idx + 1) {
- uint8_t drl_ctx =
- av1_drl_ctx(mbmi_ext->ref_mv_stack[ref_frame_type], idx);
+ uint8_t drl_ctx = av1_drl_ctx(mbmi_ext->weight[ref_frame_type], idx);
cost += drl_mode_cost0[drl_ctx][mbmi->ref_mv_idx != (idx - 1)];
if (mbmi->ref_mv_idx == (idx - 1)) return cost;
}
@@ -10263,8 +10262,8 @@
mbmi->ref_frame[0] == LAST3_FRAME ||
mbmi->ref_frame[1] == LAST2_FRAME ||
mbmi->ref_frame[1] == LAST3_FRAME) {
- if (mbmi_ext->ref_mv_stack[ref_frame_type][ref_mv_idx + has_nearmv]
- .weight < REF_CAT_LEVEL) {
+ if (mbmi_ext->weight[ref_frame_type][ref_mv_idx + has_nearmv] <
+ REF_CAT_LEVEL) {
continue;
}
}
@@ -10657,8 +10656,9 @@
MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
MV_REFERENCE_FRAME ref_frame = INTRA_FRAME;
av1_find_mv_refs(cm, xd, mbmi, ref_frame, mbmi_ext->ref_mv_count,
- mbmi_ext->ref_mv_stack, NULL, mbmi_ext->global_mvs, mi_row,
- mi_col, mbmi_ext->mode_context);
+ mbmi_ext->ref_mv_stack, mbmi_ext->weight, NULL,
+ mbmi_ext->global_mvs, mi_row, mi_col,
+ mbmi_ext->mode_context);
int_mv nearestmv, nearmv;
av1_find_best_ref_mvs_from_stack(0, mbmi_ext, ref_frame, &nearestmv, &nearmv,
@@ -10973,8 +10973,9 @@
}
MB_MODE_INFO_EXT *mbmi_ext = x->mbmi_ext;
av1_find_mv_refs(cm, xd, mbmi, ref_frame_type, mbmi_ext->ref_mv_count,
- mbmi_ext->ref_mv_stack, NULL, mbmi_ext->global_mvs, mi_row,
- mi_col, mbmi_ext->mode_context);
+ mbmi_ext->ref_mv_stack, mbmi_ext->weight, NULL,
+ mbmi_ext->global_mvs, mi_row, mi_col,
+ mbmi_ext->mode_context);
}
assert(this_mode == NEAREST_NEARESTMV);
@@ -11446,8 +11447,9 @@
}
}
av1_find_mv_refs(cm, xd, mbmi, ref_frame, mbmi_ext->ref_mv_count,
- mbmi_ext->ref_mv_stack, NULL, mbmi_ext->global_mvs, mi_row,
- mi_col, mbmi_ext->mode_context);
+ mbmi_ext->ref_mv_stack, mbmi_ext->weight, NULL,
+ mbmi_ext->global_mvs, mi_row, mi_col,
+ mbmi_ext->mode_context);
}
av1_count_overlappable_neighbors(cm, xd, mi_row, mi_col);