diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 1ae3a52e7bc128ff2e83563786a4ae82d71356b8..e36c52c73aea242de6828f09b0cb390954acd321 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c @@ -1632,6 +1632,10 @@ static void init_mode_probs(FRAME_CONTEXT *fc) { av1_tree_to_cdf_2D(av1_intra_mode_tree, av1_kf_y_mode_prob, av1_kf_y_mode_cdf, INTRA_MODES, INTRA_MODES); av1_tree_to_cdf(av1_segment_tree, fc->seg.tree_probs, fc->seg.tree_cdf); + for (int k = 0; k < MAX_TX_DEPTH; k++) { + av1_tree_to_cdf_1D(av1_tx_size_tree[k], fc->tx_size_probs[k], + fc->tx_size_cdf[k], TX_SIZE_CONTEXTS); + } #endif #if CONFIG_DELTA_Q av1_copy(fc->delta_q_prob, default_delta_q_probs); @@ -1684,6 +1688,12 @@ void av1_set_mode_cdfs(struct AV1Common *cm) { av1_tree_to_cdf(av1_ext_tx_tree, fc->inter_ext_tx_prob[i], fc->inter_ext_tx_cdf[i]); #endif + for (i = 0; i < MAX_TX_DEPTH; i++) { + for (j = 0; j < TX_SIZE_CONTEXTS; j++) { + av1_tree_to_cdf(av1_tx_size_tree[i], fc->tx_size_probs[i][j], + fc->tx_size_cdf[i][j]); + } + } } #endif diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index 8dfae5822741054b9c77fa82bb546056f4ed5856..64f3ddf5e3fd99f0475feacb4557ad6bbeb5c535 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h @@ -243,6 +243,8 @@ typedef struct frame_contexts { multiple copies for adaptation in tiles easier */ aom_cdf_prob kf_y_cdf[INTRA_MODES][INTRA_MODES] [INTRA_MODES + CONFIG_EC_ADAPT]; + aom_cdf_prob tx_size_cdf[MAX_TX_DEPTH][TX_SIZE_CONTEXTS] + [MAX_TX_DEPTH + 1 + CONFIG_EC_ADAPT]; #if !CONFIG_EXT_TX aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES] [TX_TYPES + CONFIG_EC_ADAPT]; diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index e7d386f5646e3035c00731fad9067ebcb0b90f51..a5b4cbc8ecf958c2517ab27221bdfaaab8386d3a 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c @@ -404,8 +404,13 @@ static TX_SIZE read_selected_tx_size(AV1_COMMON *cm, MACROBLOCKD *xd, FRAME_COUNTS *counts = xd->counts; const int ctx = get_tx_size_context(xd); const int depth = +#if CONFIG_EC_MULTISYMBOL + aom_read_symbol(r, cm->fc->tx_size_cdf[tx_size_cat][ctx], tx_size_cat + 2, + ACCT_STR); +#else aom_read_tree(r, av1_tx_size_tree[tx_size_cat], cm->fc->tx_size_probs[tx_size_cat][ctx], ACCT_STR); +#endif const TX_SIZE tx_size = depth_to_tx_size(depth); #if CONFIG_RECT_TX assert(!is_rect_tx(tx_size)); diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index bda7217bd7ff933637cfda25b312f72822d9908a..8331e8a0dbc0eb2e7e919c3a6af0f03b448e213a 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c @@ -80,6 +80,7 @@ static struct av1_token palette_size_encodings[PALETTE_MAX_SIZE - 1]; static struct av1_token palette_color_index_encodings[PALETTE_MAX_SIZE - 1] [PALETTE_MAX_SIZE]; #endif // CONFIG_PALETTE +#if !CONFIG_EC_MULTISYMBOL static const struct av1_token tx_size_encodings[MAX_TX_DEPTH][TX_SIZES] = { { { 0, 1 }, { 1, 1 } }, // Max tx_size is 8X8 { { 0, 1 }, { 2, 2 }, { 3, 2 } }, // Max tx_size is 16X16 @@ -88,6 +89,7 @@ static const struct av1_token tx_size_encodings[MAX_TX_DEPTH][TX_SIZES] = { { { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 } }, // Max tx_size 64X64 #endif // CONFIG_TX64X64 }; +#endif #if CONFIG_EXT_INTRA || CONFIG_FILTER_INTRA || CONFIG_PALETTE static INLINE void write_uniform(aom_writer *w, int n, int v) { @@ -456,9 +458,14 @@ static void write_selected_tx_size(const AV1_COMMON *cm, const MACROBLOCKD *xd, IMPLIES(is_rect_tx(tx_size), tx_size == max_txsize_rect_lookup[bsize])); #endif // CONFIG_EXT_TX && CONFIG_RECT_TX +#if CONFIG_EC_MULTISYMBOL + aom_write_symbol(w, depth, cm->fc->tx_size_cdf[tx_size_cat][tx_size_ctx], + tx_size_cat + 2); +#else av1_write_token(w, av1_tx_size_tree[tx_size_cat], cm->fc->tx_size_probs[tx_size_cat][tx_size_ctx], &tx_size_encodings[tx_size_cat][depth]); +#endif } }