Merge "Update intra_ext_tx_cdf per frame." into nextgenv2
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index a696533..f234e3b 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1284,6 +1284,9 @@
};
/* clang-format on */
+int av1_ext_tx_ind[TX_TYPES];
+int av1_ext_tx_inv[TX_TYPES];
+
static const aom_prob
default_intra_ext_tx_prob[EXT_TX_SIZES][TX_TYPES][TX_TYPES - 1] = {
{ { 240, 85, 128 }, { 4, 1, 248 }, { 4, 1, 8 }, { 4, 248, 128 } },
@@ -1383,6 +1386,8 @@
#if CONFIG_DAALA_EC
av1_tree_to_cdf_1D(av1_switchable_interp_tree, fc->switchable_interp_prob,
fc->switchable_interp_cdf, SWITCHABLE_FILTER_CONTEXTS);
+ av1_tree_to_cdf_2D(av1_ext_tx_tree, fc->intra_ext_tx_prob,
+ fc->intra_ext_tx_cdf, EXT_TX_SIZES, TX_TYPES);
#endif
}
@@ -1578,10 +1583,15 @@
}
#else
for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
- for (j = 0; j < TX_TYPES; ++j)
+ for (j = 0; j < TX_TYPES; ++j) {
aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->intra_ext_tx_prob[i][j],
counts->intra_ext_tx[i][j],
fc->intra_ext_tx_prob[i][j]);
+#if CONFIG_DAALA_EC
+ av1_tree_to_cdf(av1_ext_tx_tree, fc->intra_ext_tx_prob[i][j],
+ fc->intra_ext_tx_cdf[i][j]);
+#endif
+ }
}
for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
aom_tree_merge_probs(av1_ext_tx_tree, pre_fc->inter_ext_tx_prob[i],
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 262a2a1..6ead4fa 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -134,6 +134,7 @@
#if CONFIG_DAALA_EC
uint16_t switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
[SWITCHABLE_FILTERS];
+ uint16_t intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
#endif
} FRAME_CONTEXT;
@@ -291,6 +292,10 @@
void av1_adapt_intra_frame_probs(struct AV1Common *cm);
void av1_adapt_inter_frame_probs(struct AV1Common *cm);
+#if CONFIG_DAALA_EC
+extern int av1_ext_tx_ind[TX_TYPES];
+extern int av1_ext_tx_inv[TX_TYPES];
+#endif
static INLINE int av1_ceil_log2(int n) {
int i = 1, p = 2;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 49954ce..e5c4bfa 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -3519,9 +3519,14 @@
int i, j, k;
if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
- for (j = 0; j < TX_TYPES; ++j)
+ for (j = 0; j < TX_TYPES; ++j) {
for (k = 0; k < TX_TYPES - 1; ++k)
av1_diff_update_prob(r, &fc->intra_ext_tx_prob[i][j][k]);
+#if CONFIG_DAALA_EC
+ av1_tree_to_cdf(av1_ext_tx_tree, fc->intra_ext_tx_prob[i][j],
+ fc->intra_ext_tx_cdf[i][j]);
+#endif
+ }
}
}
if (aom_read(r, GROUP_DIFF_UPDATE_PROB)) {
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index ef9596c..063b11e 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1774,9 +1774,14 @@
if (counts) ++counts->inter_ext_tx[mbmi->tx_size][mbmi->tx_type];
} else {
const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode];
+#if CONFIG_DAALA_EC
+ mbmi->tx_type = av1_ext_tx_inv[aom_read_tree_cdf(
+ r, cm->fc->intra_ext_tx_cdf[mbmi->tx_size][tx_type_nom], TX_TYPES)];
+#else
mbmi->tx_type = aom_read_tree(
r, av1_ext_tx_tree,
cm->fc->intra_ext_tx_prob[mbmi->tx_size][tx_type_nom]);
+#endif
if (counts)
++counts->intra_ext_tx[mbmi->tx_size][tx_type_nom][mbmi->tx_type];
}
diff --git a/av1/decoder/decoder.c b/av1/decoder/decoder.c
index 6882d82..61b9fc0 100644
--- a/av1/decoder/decoder.c
+++ b/av1/decoder/decoder.c
@@ -50,6 +50,8 @@
#if CONFIG_DAALA_EC
av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
SWITCHABLE_FILTERS, av1_switchable_interp_tree);
+ av1_indices_from_tree(av1_ext_tx_ind, av1_ext_tx_inv, TX_TYPES,
+ av1_ext_tx_tree);
#endif
}
}
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 22268a8..7cc159f 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -196,6 +196,11 @@
an in-order traversal of the av1_switchable_interp_tree structure. */
av1_indices_from_tree(av1_switchable_interp_ind, av1_switchable_interp_inv,
SWITCHABLE_FILTERS, av1_switchable_interp_tree);
+ /* This hack is necessary because the four TX_TYPES are not consecutive,
+ e.g., 0, 1, 2, 3, when doing an in-order traversal of the av1_ext_tx_tree
+ structure. */
+ av1_indices_from_tree(av1_ext_tx_ind, av1_ext_tx_inv, TX_TYPES,
+ av1_ext_tx_tree);
#endif
}
@@ -576,9 +581,14 @@
aom_write(w, do_update, GROUP_DIFF_UPDATE_PROB);
if (do_update) {
for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
- for (j = 0; j < TX_TYPES; ++j)
+ for (j = 0; j < TX_TYPES; ++j) {
prob_diff_update(av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[i][j],
cm->counts.intra_ext_tx[i][j], TX_TYPES, w);
+#if CONFIG_DAALA_EC
+ av1_tree_to_cdf(av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[i][j],
+ cm->fc->intra_ext_tx_cdf[i][j]);
+#endif
+ }
}
}
savings = 0;
@@ -1452,12 +1462,20 @@
cm->fc->inter_ext_tx_prob[mbmi->tx_size],
&ext_tx_encodings[mbmi->tx_type]);
} else {
+#if CONFIG_DAALA_EC
+ aom_write_tree_cdf(
+ w, av1_ext_tx_ind[mbmi->tx_type],
+ cm->fc->intra_ext_tx_cdf[mbmi->tx_size]
+ [intra_mode_to_tx_type_context[mbmi->mode]],
+ TX_TYPES);
+#else
av1_write_token(
w, av1_ext_tx_tree,
cm->fc
->intra_ext_tx_prob[mbmi->tx_size]
[intra_mode_to_tx_type_context[mbmi->mode]],
&ext_tx_encodings[mbmi->tx_type]);
+#endif
}
} else {
if (!mbmi->skip) {