From 696ee004a5d9608c55d789a9c83e45f586cce440 Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Tue, 3 Nov 2015 08:56:47 -0800 Subject: [PATCH] Re-work rate-distortion optimization scheme for transform coding This commit re-works the rate-distortion optimization scheme for transform coding. It improves the overall compression performance. For derf set, the ext-tx experiment provides 2.27% coding gains, and the new scheme that integrates multiple transform type selection and recursive transform block partitioning provides a total of 3.24% coding gains. Change-Id: Ia1887c4c44b73dfb915d091d96660a99f09d5cc3 --- vp10/encoder/rdopt.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c index dc15f99d9..f398c4057 100644 --- a/vp10/encoder/rdopt.c +++ b/vp10/encoder/rdopt.c @@ -1947,19 +1947,22 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x, vpx_prob skip_prob = vp10_get_skip_prob(cm, xd); int s0 = vp10_cost_bit(skip_prob, 0); int s1 = vp10_cost_bit(skip_prob, 1); + TX_SIZE best_tx_size[64]; + int idx, idy; *distortion = INT64_MAX; *rate = INT_MAX; *skippable = 0; *sse = INT64_MAX; + ext_tx_set = get_ext_tx_set(max_tx_size, bsize, is_inter); + for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { int this_rate = 0; int this_skip = 1; int64_t this_dist = 0; int64_t this_sse = 0; - ext_tx_set = get_ext_tx_set(max_tx_size, bsize, is_inter); if (is_inter) { if (!ext_tx_used_inter[ext_tx_set][tx_type]) continue; @@ -1986,10 +1989,10 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x, if (is_inter) { if (ext_tx_set > 0) this_rate += cpi->inter_tx_type_costs[ext_tx_set] - [mbmi->tx_size][mbmi->tx_type]; + [max_tx_size][mbmi->tx_type]; } else { if (ext_tx_set > 0) - this_rate += cpi->intra_tx_type_costs[ext_tx_set][mbmi->tx_size] + this_rate += cpi->intra_tx_type_costs[ext_tx_set][max_tx_size] [mbmi->mode][mbmi->tx_type]; } } @@ -2014,12 +2017,34 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x, *skippable = this_skip; *sse = this_sse; best_tx_type = mbmi->tx_type; + for (idy = 0; idy < xd->n8_h; ++idy) + for (idx = 0; idx < xd->n8_w; ++idx) + best_tx_size[idy * 8 + idx] = mbmi->inter_tx_size[idy * 8 + idx]; } } mbmi->tx_type = best_tx_type; + + for (idy = 0; idy < xd->n8_h; ++idy) + for (idx = 0; idx < xd->n8_w; ++idx) + mbmi->inter_tx_size[idy * 8 + idx] = best_tx_size[idy * 8 + idx]; + inter_block_yrd(cpi, x, rate, distortion, skippable, sse, bsize, ref_best_rd); + + if (get_ext_tx_types(max_tx_size, bsize, is_inter) > 1 && + !xd->lossless[xd->mi[0]->mbmi.segment_id] && + *rate != INT_MAX) { + if (is_inter) { + if (ext_tx_set > 0) + *rate += cpi->inter_tx_type_costs[ext_tx_set] + [max_tx_size][mbmi->tx_type]; + } else { + if (ext_tx_set > 0) + *rate += cpi->intra_tx_type_costs[ext_tx_set][max_tx_size] + [mbmi->mode][mbmi->tx_type]; + } + } } #endif -- 2.40.0