Add helper functions to modify RD_STATS Those functions includes init_rd_stats() invalid_rd_stats() merge_rd_stats() This CL help simplify the code. Change-Id: Id1704d883bd21a039b0478a940994ca14184ae1c
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 2e4c5f2..3382b51 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -3067,12 +3067,11 @@ txfm_partition_context(tx_above + (blk_col >> 1), tx_left + (blk_row >> 1), mbmi->sb_type, tx_size); - int64_t sum_dist = 0, sum_bsse = 0; int64_t sum_rd = INT64_MAX; - int sum_rate = 0; - int all_skip = 1; int tmp_eob = 0; int zero_blk_rate; + RD_STATS sum_rd_stats; + init_rd_stats(&sum_rd_stats); #if CONFIG_EXT_TX assert(tx_size < TX_SIZES); @@ -3085,10 +3084,7 @@ coeff_ctx = get_entropy_context(tx_size, pta, ptl); - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + init_rd_stats(rd_stats); if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; @@ -3129,7 +3125,8 @@ int this_cost_valid = 1; int64_t tmp_rd = 0; - sum_rate = av1_cost_bit(cpi->common.fc->txfm_partition_prob[ctx], 1); + sum_rd_stats.rate = + av1_cost_bit(cpi->common.fc->txfm_partition_prob[ctx], 1); #if CONFIG_EXT_TX assert(tx_size < TX_SIZES); #endif // CONFIG_EXT_TX @@ -3143,12 +3140,10 @@ depth + 1, plane_bsize, ta, tl, tx_above, tx_left, &this_rd_stats, ref_best_rd - tmp_rd, &this_cost_valid); - sum_rate += this_rd_stats.rate; - sum_dist += this_rd_stats.dist; - sum_bsse += this_rd_stats.sse; - all_skip &= this_rd_stats.skip; + merge_rd_stats(&sum_rd_stats, &this_rd_stats); - tmp_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); + tmp_rd = + RDCOST(x->rdmult, x->rddiv, sum_rd_stats.rate, sum_rd_stats.dist); if (this_rd < tmp_rd) break; block += sub_step; } @@ -3169,10 +3164,7 @@ if (this_rd == INT64_MAX) *is_cost_valid = 0; x->blk_skip[plane][blk_row * bw + blk_col] = rd_stats->skip; } else { - rd_stats->rate = sum_rate; - rd_stats->dist = sum_dist; - rd_stats->sse = sum_bsse; - rd_stats->skip = all_skip; + *rd_stats = sum_rd_stats; if (sum_rd == INT64_MAX) *is_cost_valid = 0; } } @@ -3186,10 +3178,7 @@ if (ref_best_rd < 0) is_cost_valid = 0; - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + init_rd_stats(rd_stats); if (is_cost_valid) { const struct macroblockd_plane *const pd = &xd->plane[0]; @@ -3208,10 +3197,7 @@ TXFM_CONTEXT tx_left[MAX_MIB_SIZE]; RD_STATS pn_rd_stats; - pn_rd_stats.rate = 0; - pn_rd_stats.skip = 1; - pn_rd_stats.dist = 0; - pn_rd_stats.sse = 0; + init_rd_stats(&pn_rd_stats); av1_get_entropy_contexts(bsize, TX_4X4, pd, ctxa, ctxl); memcpy(tx_above, xd->above_txfm_context, @@ -3225,10 +3211,7 @@ mi_height != mi_width, plane_bsize, ctxa, ctxl, tx_above, tx_left, &pn_rd_stats, ref_best_rd - this_rd, &is_cost_valid); - rd_stats->rate += pn_rd_stats.rate; - rd_stats->dist += pn_rd_stats.dist; - rd_stats->sse += pn_rd_stats.sse; - rd_stats->skip &= pn_rd_stats.skip; + merge_rd_stats(rd_stats, &pn_rd_stats); this_rd += AOMMIN( RDCOST(x->rdmult, x->rddiv, pn_rd_stats.rate, pn_rd_stats.dist), RDCOST(x->rdmult, x->rddiv, 0, pn_rd_stats.sse)); @@ -3243,10 +3226,7 @@ if (!is_cost_valid) { // reset cost value - rd_stats->rate = INT_MAX; - rd_stats->dist = INT64_MAX; - rd_stats->sse = INT64_MAX; - rd_stats->skip = 0; + invalid_rd_stats(rd_stats); } } @@ -3385,17 +3365,11 @@ prune = prune_tx_types(cpi, bsize, x, xd, 0); #endif - rd_stats->dist = INT64_MAX; - rd_stats->rate = INT_MAX; - rd_stats->skip = 0; - rd_stats->sse = INT64_MAX; + invalid_rd_stats(rd_stats); for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { RD_STATS this_rd_stats; - this_rd_stats.rate = 0; - this_rd_stats.skip = 1; - this_rd_stats.dist = 0; - this_rd_stats.sse = 0; + init_rd_stats(&this_rd_stats); #if CONFIG_EXT_TX if (is_inter) { if (!ext_tx_used_inter[ext_tx_set][tx_type]) continue; @@ -3512,10 +3486,7 @@ if (ref_best_rd < 0) is_cost_valid = 0; - rd_stats->rate = 0; - rd_stats->dist = 0; - rd_stats->sse = 0; - rd_stats->skip = 1; + init_rd_stats(rd_stats); #if CONFIG_EXT_TX && CONFIG_RECT_TX if (is_rect_tx(mbmi->tx_size)) { @@ -3544,10 +3515,7 @@ ENTROPY_CONTEXT ta[2 * MAX_MIB_SIZE]; ENTROPY_CONTEXT tl[2 * MAX_MIB_SIZE]; RD_STATS pn_rd_stats; - pn_rd_stats.rate = 0; - pn_rd_stats.skip = 1; - pn_rd_stats.dist = 0; - pn_rd_stats.sse = 0; + init_rd_stats(&pn_rd_stats); av1_get_entropy_contexts(bsize, TX_4X4, pd, ta, tl); @@ -3581,10 +3549,7 @@ if (!is_cost_valid) { // reset cost value - rd_stats->rate = INT_MAX; - rd_stats->dist = INT64_MAX; - rd_stats->sse = INT64_MAX; - rd_stats->skip = 0; + invalid_rd_stats(rd_stats); } return is_cost_valid;
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h index 8c65770..cecb46b 100644 --- a/av1/encoder/rdopt.h +++ b/av1/encoder/rdopt.h
@@ -34,6 +34,28 @@ int64_t sse; int skip; } RD_STATS; + +static INLINE void init_rd_stats(RD_STATS *rd_stats) { + rd_stats->rate = 0; + rd_stats->dist = 0; + rd_stats->sse = 0; + rd_stats->skip = 1; +} + +static INLINE void invalid_rd_stats(RD_STATS *rd_stats) { + rd_stats->rate = INT_MAX; + rd_stats->dist = INT64_MAX; + rd_stats->sse = INT64_MAX; + rd_stats->skip = 0; +} + +static INLINE void merge_rd_stats(RD_STATS *rd_stats_dst, + const RD_STATS *rd_stats_src) { + rd_stats_dst->rate += rd_stats_src->rate; + rd_stats_dst->dist += rd_stats_src->dist; + rd_stats_dst->sse += rd_stats_src->sse; + rd_stats_dst->skip &= rd_stats_src->skip; +} #endif int av1_cost_coeffs(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,