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];