Simplify txfm rate-distortion optimization
This commit refactors the rate-distortion optimization scheme for
transform block coding. When both ext-tx and var-tx experiments
are turned on, the encoding time for bus_cif at 1000 kbps goes down
from 706377 ms to 666503 ms (5.6% speed-up). The coding statics
remain unchanged.
Change-Id: I20835db573725580aad79c16220f799ce01f2093
diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c
index f398c40..2f799ed 100644
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -1948,6 +1948,9 @@
int s0 = vp10_cost_bit(skip_prob, 0);
int s1 = vp10_cost_bit(skip_prob, 1);
TX_SIZE best_tx_size[64];
+ TX_SIZE best_tx = TX_SIZES;
+ uint8_t best_blk_skip[256];
+ const int n4 = 1 << (num_pels_log2_lookup[bsize] - 4);
int idx, idy;
*distortion = INT64_MAX;
@@ -2017,6 +2020,8 @@
*skippable = this_skip;
*sse = this_sse;
best_tx_type = mbmi->tx_type;
+ best_tx = mbmi->tx_size;
+ memcpy(best_blk_skip, x->blk_skip[0], sizeof(best_blk_skip[0]) * n4);
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];
@@ -2024,27 +2029,11 @@
}
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];
- }
- }
+ mbmi->tx_size = best_tx;
+ memcpy(x->blk_skip[0], best_blk_skip, sizeof(best_blk_skip[0]) * n4);
}
#endif