ref: 0145b5ee67cefc3f9e53829528ad0724dc0eae11
parent: 6aca1d2d944bf0ac5810efd00e384847bd42eaee
parent: 5c0a118d86819bbfe7ee46e48d5c7cbd50bd6515
author: Hui Su <huisu@google.com>
date: Wed Apr 25 12:25:58 EDT 2018
Merge "Calculate transform size cost once per frame"
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -645,6 +645,8 @@
int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES];
+ // Indices are: max_tx_size-1, tx_size_ctx, tx_size
+ int tx_size_cost[TX_SIZES - 1][TX_SIZE_CONTEXTS][TX_SIZES];
int multi_arf_allowed;
int multi_arf_enabled;
--- a/vp9/encoder/vp9_rd.c
+++ b/vp9/encoder/vp9_rd.c
@@ -69,10 +69,12 @@
const FRAME_CONTEXT *const fc = cpi->common.fc;
int i, j;
- for (i = 0; i < INTRA_MODES; ++i)
- for (j = 0; j < INTRA_MODES; ++j)
+ for (i = 0; i < INTRA_MODES; ++i) {
+ for (j = 0; j < INTRA_MODES; ++j) {
vp9_cost_tokens(cpi->y_mode_costs[i][j], vp9_kf_y_mode_prob[i][j],
vp9_intra_mode_tree);
+ }
+ }
vp9_cost_tokens(cpi->mbmode_cost, fc->y_mode_prob[1], vp9_intra_mode_tree);
for (i = 0; i < INTRA_MODES; ++i) {
@@ -82,9 +84,28 @@
fc->uv_mode_prob[i], vp9_intra_mode_tree);
}
- for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
+ for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) {
vp9_cost_tokens(cpi->switchable_interp_costs[i],
fc->switchable_interp_prob[i], vp9_switchable_interp_tree);
+ }
+
+ for (i = TX_8X8; i < TX_SIZES; ++i) {
+ for (j = 0; j < TX_SIZE_CONTEXTS; ++j) {
+ const vpx_prob *tx_probs = get_tx_probs(i, j, &fc->tx_probs);
+ int k;
+ for (k = 0; k <= i; ++k) {
+ int cost = 0;
+ int m;
+ for (m = 0; m <= k - (k == i); ++m) {
+ if (m == k)
+ cost += vp9_cost_zero(tx_probs[m]);
+ else
+ cost += vp9_cost_one(tx_probs[m]);
+ }
+ cpi->tx_size_cost[i - 1][j][k] = cost;
+ }
+ }
+ }
}
static void fill_token_costs(vp9_coeff_cost *c,
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -845,14 +845,12 @@
{ INT64_MAX, INT64_MAX },
{ INT64_MAX, INT64_MAX },
{ INT64_MAX, INT64_MAX } };
- int n, m;
+ int n;
int s0, s1;
int64_t best_rd = INT64_MAX;
TX_SIZE best_tx = max_tx_size;
int start_tx, end_tx;
-
- const vpx_prob *tx_probs =
- get_tx_probs(max_tx_size, get_tx_size_context(xd), &cm->fc->tx_probs);
+ const int tx_size_ctx = get_tx_size_context(xd);
assert(skip_prob > 0);
s0 = vp9_cost_bit(skip_prob, 0);
s1 = vp9_cost_bit(skip_prob, 1);
@@ -868,13 +866,7 @@
}
for (n = start_tx; n >= end_tx; n--) {
- int r_tx_size = 0;
- for (m = 0; m <= n - (n == (int)max_tx_size); m++) {
- if (m == n)
- r_tx_size += vp9_cost_zero(tx_probs[m]);
- else
- r_tx_size += vp9_cost_one(tx_probs[m]);
- }
+ const int r_tx_size = cpi->tx_size_cost[max_tx_size - 1][tx_size_ctx][n];
txfm_rd_in_plane(cpi, x, &r[n][0], &d[n], &s[n], &sse[n], ref_best_rd, 0,
bs, n, cpi->sf.use_fast_coef_costing);
r[n][1] = r[n][0];