ref: 45971abd1df697201ba31023bc797793491ab9f6
parent: a80dd52b6ea410ff20835bd12220dd77934f011a
author: Yaowu Xu <[email protected]>
date: Thu Jan 29 05:22:48 EST 2015
Optimize coef update 1. move the check of search method of USE_TX_8X8 up one level to avoid operations of build_tree_distributions() 2. count tx used and avoid computaton for coef udpate when one size is not used at all. Change-Id: Ia3e54a2588aa531c41377a1bfaa64385d04a592c
--- a/vp9/common/vp9_entropymode.h
+++ b/vp9/common/vp9_entropymode.h
@@ -33,6 +33,7 @@
unsigned int p32x32[TX_SIZE_CONTEXTS][TX_SIZES];
unsigned int p16x16[TX_SIZE_CONTEXTS][TX_SIZES - 1];
unsigned int p8x8[TX_SIZE_CONTEXTS][TX_SIZES - 2];
+ unsigned int tx_totals[TX_SIZES];
};
typedef struct frame_contexts {
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -611,10 +611,6 @@
case ONE_LOOP_REDUCED: {
int updates = 0;
int noupdates_before_first = 0;
- if (tx_size >= TX_16X16 && cpi->sf.tx_size_search_method == USE_TX_8X8) {
- vp9_write_bit(bc, 0);
- return;
- }
for (i = 0; i < PLANE_TYPES; ++i) {
for (j = 0; j < REF_TYPES; ++j) {
for (k = 0; k < COEF_BANDS; ++k) {
@@ -678,10 +674,15 @@
for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) {
vp9_coeff_stats frame_branch_ct[PLANE_TYPES];
vp9_coeff_probs_model frame_coef_probs[PLANE_TYPES];
- build_tree_distribution(cpi, tx_size, frame_branch_ct,
- frame_coef_probs);
- update_coef_probs_common(w, cpi, tx_size, frame_branch_ct,
- frame_coef_probs);
+ if (cpi->td.counts->tx.tx_totals[tx_size] == 0 ||
+ (tx_size >= TX_16X16 && cpi->sf.tx_size_search_method == USE_TX_8X8)) {
+ vp9_write_bit(w, 0);
+ } else {
+ build_tree_distribution(cpi, tx_size, frame_branch_ct,
+ frame_coef_probs);
+ update_coef_probs_common(w, cpi, tx_size, frame_branch_ct,
+ frame_coef_probs);
+ }
}
}
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -3805,6 +3805,9 @@
}
}
+ vpx_memset(cpi->td.counts->tx.tx_totals, 0,
+ sizeof(cpi->td.counts->tx.tx_totals));
+
if (cpi->sf.frame_parameter_update) {
int i;
@@ -3891,7 +3894,6 @@
count16x16_lp += counts->tx.p32x32[i][TX_16X16];
count32x32 += counts->tx.p32x32[i][TX_32X32];
}
-
if (count4x4 == 0 && count16x16_lp == 0 && count16x16_16x16p == 0 &&
count32x32 == 0) {
cm->tx_mode = ALLOW_8X8;
@@ -4015,5 +4017,7 @@
if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows)
mi_8x8[mis * y + x].src_mi->mbmi.tx_size = tx_size;
}
+ ++td->counts->tx.tx_totals[mbmi->tx_size];
+ ++td->counts->tx.tx_totals[get_uv_tx_size(mbmi, &xd->plane[1])];
}
}