From: Jingning Han Date: Fri, 20 Nov 2015 17:35:41 +0000 (-0800) Subject: Refactor tokenization coding tree X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ec5ed258a9946282815ed77c4f792669fe53055;p=libvpx Refactor tokenization coding tree Expand the tokenization tree writing to support per transform block type coding in next CLs. Change-Id: I3560e658f89cc500eb49603f95dd2b4e99045f5b --- diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c index a80e5bd56..5fb58c570 100644 --- a/vp10/encoder/bitstream.c +++ b/vp10/encoder/bitstream.c @@ -325,7 +325,6 @@ static void pack_mb_tokens(vpx_writer *w, while (p < stop && p->token != EOSB_TOKEN) { const int t = p->token; const struct vp10_token *const a = &vp10_coef_encodings[t]; - int i = 0; int v = a->value; int n = a->len; #if CONFIG_VP9_HIGHBITDEPTH @@ -342,28 +341,24 @@ static void pack_mb_tokens(vpx_writer *w, #endif // CONFIG_VP9_HIGHBITDEPTH /* skip one or two nodes */ - if (p->skip_eob_node) { + if (p->skip_eob_node) n -= p->skip_eob_node; - i = 2 * p->skip_eob_node; - } + else + vpx_write(w, t != EOB_TOKEN, p->context_tree[0]); - // TODO(jbb): expanding this can lead to big gains. It allows - // much better branch prediction and would enable us to avoid numerous - // lookups and compares. - - // If we have a token that's in the constrained set, the coefficient tree - // is split into two treed writes. The first treed write takes care of the - // unconstrained nodes. The second treed write takes care of the - // constrained nodes. - if (t >= TWO_TOKEN && t < EOB_TOKEN) { - int len = UNCONSTRAINED_NODES - p->skip_eob_node; - int bits = v >> (n - len); - vp10_write_tree(w, vp10_coef_tree, p->context_tree, bits, len, i); - vp10_write_tree(w, vp10_coef_con_tree, - vp10_pareto8_full[p->context_tree[PIVOT_NODE] - 1], - v, n - len, 0); - } else { - vp10_write_tree(w, vp10_coef_tree, p->context_tree, v, n, i); + if (t != EOB_TOKEN) { + vpx_write(w, t != ZERO_TOKEN, p->context_tree[1]); + + if (t != ZERO_TOKEN) { + vpx_write(w, t != ONE_TOKEN, p->context_tree[2]); + + if (t != ONE_TOKEN) { + int len = UNCONSTRAINED_NODES - p->skip_eob_node; + vp10_write_tree(w, vp10_coef_con_tree, + vp10_pareto8_full[p->context_tree[PIVOT_NODE] - 1], + v, n - len, 0); + } + } } if (b->base_val) {