Fix DAALA_EC when EC_MULTISYMBOL disabled.
When DAALA_EC is enabled, calls to aom_read_tree() and aom_write_tree()
would automatically convert the aom_tree_index and aom_prob into a CDF
and call the aom_read_cdf() or aom_write_cdf(), which causes an
error if DAALA_EC is enabled without EC_MULTISYMBOL.
This patch moves the conversion functions from daalaboolreader.h and
daalaboolwriter.h into bitreader.h and bitwriter.h respectively, and
only calls the conversion functions if EC_MULTISYMBOL is enabled.
This allows DAALA_EC to be enabled without EC_MULTISYMBOL and is a
bitstream change when both ANS and EC_MULTISYMBOL are enabled as calls
to read and write trees will automatically be converted into calls that
read and write cdfs.
Change-Id: Id2f9aa9b5113292998cadfe69e4ba547324643ac
diff --git a/aom_dsp/bitreader.h b/aom_dsp/bitreader.h
index 621a5d3..c7546c6 100644
--- a/aom_dsp/bitreader.h
+++ b/aom_dsp/bitreader.h
@@ -200,20 +200,6 @@
return -i;
}
-static INLINE int aom_read_tree_(aom_reader *r, const aom_tree_index *tree,
- const aom_prob *probs ACCT_STR_PARAM) {
- int ret;
-#if CONFIG_DAALA_EC
- ret = daala_read_tree_bits(r, tree, probs);
-#else
- ret = aom_read_tree_bits(r, tree, probs, NULL);
-#endif
-#if CONFIG_ACCOUNTING
- if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
-#endif
- return ret;
-}
-
#if CONFIG_EC_MULTISYMBOL
static INLINE int aom_read_cdf_(aom_reader *r, const aom_cdf_prob *cdf,
int nsymbs ACCT_STR_PARAM) {
@@ -261,8 +247,41 @@
return ret;
}
#endif
+
+static INLINE int aom_read_tree_as_cdf(aom_reader *r,
+ const aom_tree_index *tree,
+ const aom_prob *probs) {
+ aom_tree_index i = 0;
+ do {
+ aom_cdf_prob cdf[16];
+ aom_tree_index index[16];
+ int path[16];
+ int dist[16];
+ int nsymbs;
+ int symb;
+ nsymbs = tree_to_cdf(tree, probs, i, cdf, index, path, dist);
+ symb = aom_read_cdf(r, cdf, nsymbs, NULL);
+ OD_ASSERT(symb >= 0 && symb < nsymbs);
+ i = index[symb];
+ } while (i > 0);
+ return -i;
+}
#endif // CONFIG_EC_MULTISYMBOL
+static INLINE int aom_read_tree_(aom_reader *r, const aom_tree_index *tree,
+ const aom_prob *probs ACCT_STR_PARAM) {
+ int ret;
+#if CONFIG_EC_MULTISYMBOL
+ ret = aom_read_tree_as_cdf(r, tree, probs);
+#else
+ ret = aom_read_tree_bits(r, tree, probs, NULL);
+#endif
+#if CONFIG_ACCOUNTING
+ if (ACCT_STR_NAME) aom_process_accounting(r, ACCT_STR_NAME);
+#endif
+ return ret;
+}
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/aom_dsp/bitwriter.h b/aom_dsp/bitwriter.h
index 25ef479..50b4511 100644
--- a/aom_dsp/bitwriter.h
+++ b/aom_dsp/bitwriter.h
@@ -159,29 +159,6 @@
} while (len);
}
-static INLINE void aom_write_tree(aom_writer *w, const aom_tree_index *tree,
- const aom_prob *probs, int bits, int len,
- aom_tree_index i) {
-#if CONFIG_DAALA_EC
- daala_write_tree_bits(w, tree, probs, bits, len, i);
-#else
- aom_write_tree_bits(w, tree, probs, bits, len, i);
-#endif
-}
-
-static INLINE void aom_write_tree_record(aom_writer *w,
- const aom_tree_index *tree,
- const aom_prob *probs, int bits,
- int len, aom_tree_index i,
- TOKEN_STATS *token_stats) {
-#if CONFIG_DAALA_EC
- (void)token_stats;
- daala_write_tree_bits(w, tree, probs, bits, len, i);
-#else
- aom_write_tree_bits_record(w, tree, probs, bits, len, i, token_stats);
-#endif
-}
-
#if CONFIG_EC_MULTISYMBOL
static INLINE void aom_write_cdf(aom_writer *w, int symb,
const aom_cdf_prob *cdf, int nsymbs) {
@@ -218,8 +195,71 @@
#endif
}
#endif
+
+static INLINE void aom_write_tree_as_cdf(aom_writer *w,
+ const aom_tree_index *tree,
+ const aom_prob *probs, int bits,
+ int len, aom_tree_index i) {
+ aom_tree_index root;
+ root = i;
+ do {
+ aom_cdf_prob cdf[16];
+ aom_tree_index index[16];
+ int path[16];
+ int dist[16];
+ int nsymbs;
+ int symb;
+ int j;
+ /* Compute the CDF of the binary tree using the given probabilities. */
+ nsymbs = tree_to_cdf(tree, probs, root, cdf, index, path, dist);
+ /* Find the symbol to code. */
+ symb = -1;
+ for (j = 0; j < nsymbs; j++) {
+ /* If this symbol codes a leaf node, */
+ if (index[j] <= 0) {
+ if (len == dist[j] && path[j] == bits) {
+ symb = j;
+ break;
+ }
+ } else {
+ if (len > dist[j] && path[j] == bits >> (len - dist[j])) {
+ symb = j;
+ break;
+ }
+ }
+ }
+ OD_ASSERT(symb != -1);
+ aom_write_cdf(w, symb, cdf, nsymbs);
+ bits &= (1 << (len - dist[symb])) - 1;
+ len -= dist[symb];
+ } while (len);
+}
+
#endif // CONFIG_EC_MULTISYMBOL
+static INLINE void aom_write_tree(aom_writer *w, const aom_tree_index *tree,
+ const aom_prob *probs, int bits, int len,
+ aom_tree_index i) {
+#if CONFIG_EC_MULTISYMBOL
+ aom_write_tree_as_cdf(w, tree, probs, bits, len, i);
+#else
+ aom_write_tree_bits(w, tree, probs, bits, len, i);
+#endif
+}
+
+static INLINE void aom_write_tree_record(aom_writer *w,
+ const aom_tree_index *tree,
+ const aom_prob *probs, int bits,
+ int len, aom_tree_index i,
+ TOKEN_STATS *token_stats) {
+#if CONFIG_EC_MULTISYMBOL
+ (void)token_stats;
+ aom_write_tree_as_cdf(w, tree, probs, bits, len, i);
+#else
+ aom_write_tree_bits_record(w, tree, probs, bits, len, i, token_stats);
+#endif
+}
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/aom_dsp/daalaboolreader.h b/aom_dsp/daalaboolreader.h
index 7b54430..c8271cd 100644
--- a/aom_dsp/daalaboolreader.h
+++ b/aom_dsp/daalaboolreader.h
@@ -152,25 +152,6 @@
return symb;
}
-static INLINE int daala_read_tree_bits(daala_reader *r,
- const aom_tree_index *tree,
- const aom_prob *probs) {
- aom_tree_index i = 0;
- do {
- aom_cdf_prob cdf[16];
- aom_tree_index index[16];
- int path[16];
- int dist[16];
- int nsymbs;
- int symb;
- nsymbs = tree_to_cdf(tree, probs, i, cdf, index, path, dist);
- symb = daala_read_symbol(r, cdf, nsymbs);
- OD_ASSERT(symb >= 0 && symb < nsymbs);
- i = index[symb];
- } while (i > 0);
- return -i;
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/aom_dsp/daalaboolwriter.h b/aom_dsp/daalaboolwriter.h
index 7bf5b6e..2f4cab1 100644
--- a/aom_dsp/daalaboolwriter.h
+++ b/aom_dsp/daalaboolwriter.h
@@ -76,45 +76,6 @@
od_ec_encode_cdf_q15(&w->ec, symb, cdf, nsymbs);
}
-static INLINE void daala_write_tree_bits(daala_writer *w,
- const aom_tree_index *tree,
- const aom_prob *probs, int bits,
- int len, aom_tree_index i) {
- aom_tree_index root;
- root = i;
- do {
- aom_cdf_prob cdf[16];
- aom_tree_index index[16];
- int path[16];
- int dist[16];
- int nsymbs;
- int symb;
- int j;
- /* Compute the CDF of the binary tree using the given probabilities. */
- nsymbs = tree_to_cdf(tree, probs, root, cdf, index, path, dist);
- /* Find the symbol to code. */
- symb = -1;
- for (j = 0; j < nsymbs; j++) {
- /* If this symbol codes a leaf node, */
- if (index[j] <= 0) {
- if (len == dist[j] && path[j] == bits) {
- symb = j;
- break;
- }
- } else {
- if (len > dist[j] && path[j] == bits >> (len - dist[j])) {
- symb = j;
- break;
- }
- }
- }
- OD_ASSERT(symb != -1);
- daala_write_symbol(w, symb, cdf, nsymbs);
- bits &= (1 << (len - dist[symb])) - 1;
- len -= dist[symb];
- } while (len);
-}
-
#ifdef __cplusplus
} // extern "C"
#endif