Change datatype of ref_mv_weight to uint16_t
Changed the datatype of ref_mv_weight from int to uint16_t
Observed memory footprint reduction with no impact on
encoder/decoder performance.
Stream Preset Encoder Decoder
BasketballDrill_832x480 1 ~8.6% 0%
parkrun_720p50 3 ~7.9% 0%
Change-Id: I870399530e3c28c400a30ae63312058f82dd73df
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 45bd9a7..f5c70fe 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -535,7 +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];
+ uint16_t 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/mvref_common.c b/av1/common/mvref_common.c
index a6bef20..c4ca859 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -74,8 +74,9 @@
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 *ref_mv_weight, int_mv *gm_mv_candidates,
- const WarpedMotionParams *gm_params, int col, int weight) {
+ CANDIDATE_MV *ref_mv_stack, uint16_t *ref_mv_weight,
+ int_mv *gm_mv_candidates, const WarpedMotionParams *gm_params, int col,
+ uint16_t weight) {
if (!is_inter_block(candidate)) return; // for intrabc
int index = 0, ref;
assert(weight % 2 == 0);
@@ -140,7 +141,7 @@
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, int *ref_mv_weight,
+ CANDIDATE_MV *ref_mv_stack, uint16_t *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) {
@@ -169,10 +170,10 @@
else if (abs(row_offset) > 1)
len = AOMMAX(len, n8_w_8);
- int weight = 2;
+ uint16_t weight = 2;
if (xd->n4_w >= n8_w_8 && xd->n4_w <= n4_w) {
- int inc = AOMMIN(-max_row_offset + row_offset + 1,
- mi_size_high[candidate_bsize]);
+ uint16_t inc = AOMMIN(-max_row_offset + row_offset + 1,
+ mi_size_high[candidate_bsize]);
// Obtain range used in weight calculation.
weight = AOMMAX(weight, inc);
// Update processed rows.
@@ -191,7 +192,7 @@
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, int *ref_mv_weight,
+ CANDIDATE_MV *ref_mv_stack, uint16_t *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) {
@@ -242,7 +243,7 @@
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,
- int *ref_mv_weight, uint8_t *ref_match_count,
+ uint16_t *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;
@@ -331,11 +332,11 @@
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],
+ uint16_t ref_mv_weights[][MAX_REF_MV_STACK_SIZE],
int16_t *mode_context) {
POSITION mi_pos;
int idx;
- const int weight_unit = 1; // mi_size_wide[BLOCK_8X8];
+ const uint16_t weight_unit = 1; // mi_size_wide[BLOCK_8X8];
mi_pos.row = (mi_row & 0x01) ? blk_row : blk_row + 1;
mi_pos.col = (mi_col & 0x01) ? blk_col : blk_col + 1;
@@ -356,7 +357,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]];
+ uint16_t *ref_mv_weight = ref_mv_weights[rf[0]];
if (prev_frame_mvs->mfmv0.as_int != INVALID_MV) {
int_mv this_refmv;
@@ -396,7 +397,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];
+ uint16_t *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;
@@ -466,7 +467,7 @@
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],
- int ref_mv_weight[][MAX_REF_MV_STACK_SIZE]) {
+ uint16_t 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];
@@ -497,7 +498,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],
+ uint16_t 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);
@@ -674,7 +675,7 @@
for (int idx = 1; idx < len; ++idx) {
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];
+ uint16_t 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];
@@ -691,7 +692,7 @@
for (int idx = nearest_refmv_count + 1; idx < len; ++idx) {
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];
+ uint16_t 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];
@@ -828,7 +829,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],
+ uint16_t 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/common/mvref_common.h b/av1/common/mvref_common.h
index ad67b22..4b535a5 100644
--- a/av1/common/mvref_common.h
+++ b/av1/common/mvref_common.h
@@ -189,7 +189,7 @@
return comp_ctx;
}
-static INLINE uint8_t av1_drl_ctx(const int *ref_mv_weight, int ref_idx) {
+static INLINE uint8_t av1_drl_ctx(const uint16_t *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;
@@ -250,7 +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],
+ uint16_t 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/encoder/block.h b/av1/encoder/block.h
index e8ca91c..f1148ee 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -77,7 +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];
+ uint16_t 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];