11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann#include <math.h>
131b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h>
141b362b15af34006e6a11974088a46d42b903418eJohann#include <string.h>
151b362b15af34006e6a11974088a46d42b903418eJohann#include <assert.h>
161b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "tokenize.h"
181b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
191b362b15af34006e6a11974088a46d42b903418eJohann
201b362b15af34006e6a11974088a46d42b903418eJohann/* Global event counters used for accumulating statistics across several
211b362b15af34006e6a11974088a46d42b903418eJohann   compressions, then generating context.c = initial stats. */
221b362b15af34006e6a11974088a46d42b903418eJohann
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
241b362b15af34006e6a11974088a46d42b903418eJohann_int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
251b362b15af34006e6a11974088a46d42b903418eJohann#endif
261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ;
271b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_fix_contexts(MACROBLOCKD *x);
281b362b15af34006e6a11974088a46d42b903418eJohann
291b362b15af34006e6a11974088a46d42b903418eJohann#include "dct_value_tokens.h"
301b362b15af34006e6a11974088a46d42b903418eJohann#include "dct_value_cost.h"
311b362b15af34006e6a11974088a46d42b903418eJohann
321b362b15af34006e6a11974088a46d42b903418eJohannconst TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens +
331b362b15af34006e6a11974088a46d42b903418eJohann        DCT_MAX_VALUE;
341b362b15af34006e6a11974088a46d42b903418eJohannconst short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;
351b362b15af34006e6a11974088a46d42b903418eJohann
361b362b15af34006e6a11974088a46d42b903418eJohann#if 0
371b362b15af34006e6a11974088a46d42b903418eJohannint skip_true_count = 0;
381b362b15af34006e6a11974088a46d42b903418eJohannint skip_false_count = 0;
391b362b15af34006e6a11974088a46d42b903418eJohann#endif
401b362b15af34006e6a11974088a46d42b903418eJohann
411b362b15af34006e6a11974088a46d42b903418eJohann/* function used to generate dct_value_tokens and dct_value_cost tables */
421b362b15af34006e6a11974088a46d42b903418eJohann/*
431b362b15af34006e6a11974088a46d42b903418eJohannstatic void fill_value_tokens()
441b362b15af34006e6a11974088a46d42b903418eJohann{
451b362b15af34006e6a11974088a46d42b903418eJohann
461b362b15af34006e6a11974088a46d42b903418eJohann    TOKENVALUE *t = dct_value_tokens + DCT_MAX_VALUE;
471b362b15af34006e6a11974088a46d42b903418eJohann    const vp8_extra_bit_struct *e = vp8_extra_bits;
481b362b15af34006e6a11974088a46d42b903418eJohann
491b362b15af34006e6a11974088a46d42b903418eJohann    int i = -DCT_MAX_VALUE;
501b362b15af34006e6a11974088a46d42b903418eJohann    int sign = 1;
511b362b15af34006e6a11974088a46d42b903418eJohann
521b362b15af34006e6a11974088a46d42b903418eJohann    do
531b362b15af34006e6a11974088a46d42b903418eJohann    {
541b362b15af34006e6a11974088a46d42b903418eJohann        if (!i)
551b362b15af34006e6a11974088a46d42b903418eJohann            sign = 0;
561b362b15af34006e6a11974088a46d42b903418eJohann
571b362b15af34006e6a11974088a46d42b903418eJohann        {
581b362b15af34006e6a11974088a46d42b903418eJohann            const int a = sign ? -i : i;
591b362b15af34006e6a11974088a46d42b903418eJohann            int eb = sign;
601b362b15af34006e6a11974088a46d42b903418eJohann
611b362b15af34006e6a11974088a46d42b903418eJohann            if (a > 4)
621b362b15af34006e6a11974088a46d42b903418eJohann            {
631b362b15af34006e6a11974088a46d42b903418eJohann                int j = 4;
641b362b15af34006e6a11974088a46d42b903418eJohann
651b362b15af34006e6a11974088a46d42b903418eJohann                while (++j < 11  &&  e[j].base_val <= a) {}
661b362b15af34006e6a11974088a46d42b903418eJohann
671b362b15af34006e6a11974088a46d42b903418eJohann                t[i].Token = --j;
681b362b15af34006e6a11974088a46d42b903418eJohann                eb |= (a - e[j].base_val) << 1;
691b362b15af34006e6a11974088a46d42b903418eJohann            }
701b362b15af34006e6a11974088a46d42b903418eJohann            else
711b362b15af34006e6a11974088a46d42b903418eJohann                t[i].Token = a;
721b362b15af34006e6a11974088a46d42b903418eJohann
731b362b15af34006e6a11974088a46d42b903418eJohann            t[i].Extra = eb;
741b362b15af34006e6a11974088a46d42b903418eJohann        }
751b362b15af34006e6a11974088a46d42b903418eJohann
761b362b15af34006e6a11974088a46d42b903418eJohann        // initialize the cost for extra bits for all possible coefficient value.
771b362b15af34006e6a11974088a46d42b903418eJohann        {
781b362b15af34006e6a11974088a46d42b903418eJohann            int cost = 0;
791b362b15af34006e6a11974088a46d42b903418eJohann            const vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token;
801b362b15af34006e6a11974088a46d42b903418eJohann
811b362b15af34006e6a11974088a46d42b903418eJohann            if (p->base_val)
821b362b15af34006e6a11974088a46d42b903418eJohann            {
831b362b15af34006e6a11974088a46d42b903418eJohann                const int extra = t[i].Extra;
841b362b15af34006e6a11974088a46d42b903418eJohann                const int Length = p->Len;
851b362b15af34006e6a11974088a46d42b903418eJohann
861b362b15af34006e6a11974088a46d42b903418eJohann                if (Length)
871b362b15af34006e6a11974088a46d42b903418eJohann                    cost += vp8_treed_cost(p->tree, p->prob, extra >> 1, Length);
881b362b15af34006e6a11974088a46d42b903418eJohann
891b362b15af34006e6a11974088a46d42b903418eJohann                cost += vp8_cost_bit(vp8_prob_half, extra & 1); // sign
901b362b15af34006e6a11974088a46d42b903418eJohann                dct_value_cost[i + DCT_MAX_VALUE] = cost;
911b362b15af34006e6a11974088a46d42b903418eJohann            }
921b362b15af34006e6a11974088a46d42b903418eJohann
931b362b15af34006e6a11974088a46d42b903418eJohann        }
941b362b15af34006e6a11974088a46d42b903418eJohann
951b362b15af34006e6a11974088a46d42b903418eJohann    }
961b362b15af34006e6a11974088a46d42b903418eJohann    while (++i < DCT_MAX_VALUE);
971b362b15af34006e6a11974088a46d42b903418eJohann
981b362b15af34006e6a11974088a46d42b903418eJohann    vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
991b362b15af34006e6a11974088a46d42b903418eJohann    vp8_dct_value_cost_ptr   = dct_value_cost + DCT_MAX_VALUE;
1001b362b15af34006e6a11974088a46d42b903418eJohann}
1011b362b15af34006e6a11974088a46d42b903418eJohann*/
1021b362b15af34006e6a11974088a46d42b903418eJohann
1031b362b15af34006e6a11974088a46d42b903418eJohannstatic void tokenize2nd_order_b
1041b362b15af34006e6a11974088a46d42b903418eJohann(
1051b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x,
1061b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA **tp,
1071b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMP *cpi
1081b362b15af34006e6a11974088a46d42b903418eJohann)
1091b362b15af34006e6a11974088a46d42b903418eJohann{
1101b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
1111b362b15af34006e6a11974088a46d42b903418eJohann    int pt;             /* near block/prev token context index */
1121b362b15af34006e6a11974088a46d42b903418eJohann    int c;              /* start at DC */
1131b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA *t = *tp;/* store tokens starting here */
1141b362b15af34006e6a11974088a46d42b903418eJohann    const BLOCKD *b;
1151b362b15af34006e6a11974088a46d42b903418eJohann    const short *qcoeff_ptr;
1161b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * a;
1171b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * l;
1181b362b15af34006e6a11974088a46d42b903418eJohann    int band, rc, v, token;
1191b362b15af34006e6a11974088a46d42b903418eJohann    int eob;
1201b362b15af34006e6a11974088a46d42b903418eJohann
1211b362b15af34006e6a11974088a46d42b903418eJohann    b = xd->block + 24;
1221b362b15af34006e6a11974088a46d42b903418eJohann    qcoeff_ptr = b->qcoeff;
1231b362b15af34006e6a11974088a46d42b903418eJohann    a = (ENTROPY_CONTEXT *)xd->above_context + 8;
1241b362b15af34006e6a11974088a46d42b903418eJohann    l = (ENTROPY_CONTEXT *)xd->left_context + 8;
1251b362b15af34006e6a11974088a46d42b903418eJohann    eob = xd->eobs[24];
1261b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
1271b362b15af34006e6a11974088a46d42b903418eJohann
1281b362b15af34006e6a11974088a46d42b903418eJohann    if(!eob)
1291b362b15af34006e6a11974088a46d42b903418eJohann    {
1301b362b15af34006e6a11974088a46d42b903418eJohann        /* c = band for this case */
1311b362b15af34006e6a11974088a46d42b903418eJohann        t->Token = DCT_EOB_TOKEN;
1321b362b15af34006e6a11974088a46d42b903418eJohann        t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
1331b362b15af34006e6a11974088a46d42b903418eJohann        t->skip_eob_node = 0;
1341b362b15af34006e6a11974088a46d42b903418eJohann
1351b362b15af34006e6a11974088a46d42b903418eJohann        ++x->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
1361b362b15af34006e6a11974088a46d42b903418eJohann        t++;
1371b362b15af34006e6a11974088a46d42b903418eJohann        *tp = t;
1381b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = 0;
1391b362b15af34006e6a11974088a46d42b903418eJohann        return;
1401b362b15af34006e6a11974088a46d42b903418eJohann    }
1411b362b15af34006e6a11974088a46d42b903418eJohann
1421b362b15af34006e6a11974088a46d42b903418eJohann    v = qcoeff_ptr[0];
1431b362b15af34006e6a11974088a46d42b903418eJohann    t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
1441b362b15af34006e6a11974088a46d42b903418eJohann    token    = vp8_dct_value_tokens_ptr[v].Token;
1451b362b15af34006e6a11974088a46d42b903418eJohann    t->Token = token;
1461b362b15af34006e6a11974088a46d42b903418eJohann
1471b362b15af34006e6a11974088a46d42b903418eJohann    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
1481b362b15af34006e6a11974088a46d42b903418eJohann    t->skip_eob_node = 0;
1491b362b15af34006e6a11974088a46d42b903418eJohann    ++x->coef_counts       [1] [0] [pt] [token];
1501b362b15af34006e6a11974088a46d42b903418eJohann    pt = vp8_prev_token_class[token];
1511b362b15af34006e6a11974088a46d42b903418eJohann    t++;
1521b362b15af34006e6a11974088a46d42b903418eJohann    c = 1;
1531b362b15af34006e6a11974088a46d42b903418eJohann
1541b362b15af34006e6a11974088a46d42b903418eJohann    for (; c < eob; c++)
1551b362b15af34006e6a11974088a46d42b903418eJohann    {
1561b362b15af34006e6a11974088a46d42b903418eJohann        rc = vp8_default_zig_zag1d[c];
1571b362b15af34006e6a11974088a46d42b903418eJohann        band = vp8_coef_bands[c];
1581b362b15af34006e6a11974088a46d42b903418eJohann        v = qcoeff_ptr[rc];
1591b362b15af34006e6a11974088a46d42b903418eJohann
1601b362b15af34006e6a11974088a46d42b903418eJohann        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
1611b362b15af34006e6a11974088a46d42b903418eJohann        token    = vp8_dct_value_tokens_ptr[v].Token;
1621b362b15af34006e6a11974088a46d42b903418eJohann
1631b362b15af34006e6a11974088a46d42b903418eJohann        t->Token = token;
1641b362b15af34006e6a11974088a46d42b903418eJohann        t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
1651b362b15af34006e6a11974088a46d42b903418eJohann
1661b362b15af34006e6a11974088a46d42b903418eJohann        t->skip_eob_node = ((pt == 0));
1671b362b15af34006e6a11974088a46d42b903418eJohann
1681b362b15af34006e6a11974088a46d42b903418eJohann        ++x->coef_counts       [1] [band] [pt] [token];
1691b362b15af34006e6a11974088a46d42b903418eJohann
1701b362b15af34006e6a11974088a46d42b903418eJohann        pt = vp8_prev_token_class[token];
1711b362b15af34006e6a11974088a46d42b903418eJohann        t++;
1721b362b15af34006e6a11974088a46d42b903418eJohann    }
1731b362b15af34006e6a11974088a46d42b903418eJohann    if (c < 16)
1741b362b15af34006e6a11974088a46d42b903418eJohann    {
1751b362b15af34006e6a11974088a46d42b903418eJohann        band = vp8_coef_bands[c];
1761b362b15af34006e6a11974088a46d42b903418eJohann        t->Token = DCT_EOB_TOKEN;
1771b362b15af34006e6a11974088a46d42b903418eJohann        t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
1781b362b15af34006e6a11974088a46d42b903418eJohann
1791b362b15af34006e6a11974088a46d42b903418eJohann        t->skip_eob_node = 0;
1801b362b15af34006e6a11974088a46d42b903418eJohann
1811b362b15af34006e6a11974088a46d42b903418eJohann        ++x->coef_counts       [1] [band] [pt] [DCT_EOB_TOKEN];
1821b362b15af34006e6a11974088a46d42b903418eJohann
1831b362b15af34006e6a11974088a46d42b903418eJohann        t++;
1841b362b15af34006e6a11974088a46d42b903418eJohann    }
1851b362b15af34006e6a11974088a46d42b903418eJohann
1861b362b15af34006e6a11974088a46d42b903418eJohann    *tp = t;
1871b362b15af34006e6a11974088a46d42b903418eJohann    *a = *l = 1;
1881b362b15af34006e6a11974088a46d42b903418eJohann
1891b362b15af34006e6a11974088a46d42b903418eJohann}
1901b362b15af34006e6a11974088a46d42b903418eJohann
1911b362b15af34006e6a11974088a46d42b903418eJohannstatic void tokenize1st_order_b
1921b362b15af34006e6a11974088a46d42b903418eJohann(
1931b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x,
1941b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA **tp,
1951b362b15af34006e6a11974088a46d42b903418eJohann    int type,           /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
1961b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMP *cpi
1971b362b15af34006e6a11974088a46d42b903418eJohann)
1981b362b15af34006e6a11974088a46d42b903418eJohann{
1991b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
2001b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int block;
2011b362b15af34006e6a11974088a46d42b903418eJohann    const BLOCKD *b;
2021b362b15af34006e6a11974088a46d42b903418eJohann    int pt;             /* near block/prev token context index */
2031b362b15af34006e6a11974088a46d42b903418eJohann    int c;
2041b362b15af34006e6a11974088a46d42b903418eJohann    int token;
2051b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA *t = *tp;/* store tokens starting here */
2061b362b15af34006e6a11974088a46d42b903418eJohann    const short *qcoeff_ptr;
2071b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * a;
2081b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * l;
2091b362b15af34006e6a11974088a46d42b903418eJohann    int band, rc, v;
2101b362b15af34006e6a11974088a46d42b903418eJohann    int tmp1, tmp2;
2111b362b15af34006e6a11974088a46d42b903418eJohann
2121b362b15af34006e6a11974088a46d42b903418eJohann    b = xd->block;
2131b362b15af34006e6a11974088a46d42b903418eJohann    /* Luma */
2141b362b15af34006e6a11974088a46d42b903418eJohann    for (block = 0; block < 16; block++, b++)
2151b362b15af34006e6a11974088a46d42b903418eJohann    {
216a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        const int eob = *b->eob;
2171b362b15af34006e6a11974088a46d42b903418eJohann        tmp1 = vp8_block2above[block];
2181b362b15af34006e6a11974088a46d42b903418eJohann        tmp2 = vp8_block2left[block];
2191b362b15af34006e6a11974088a46d42b903418eJohann        qcoeff_ptr = b->qcoeff;
2201b362b15af34006e6a11974088a46d42b903418eJohann        a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
2211b362b15af34006e6a11974088a46d42b903418eJohann        l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
2221b362b15af34006e6a11974088a46d42b903418eJohann
2231b362b15af34006e6a11974088a46d42b903418eJohann        VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
2241b362b15af34006e6a11974088a46d42b903418eJohann
2251b362b15af34006e6a11974088a46d42b903418eJohann        c = type ? 0 : 1;
2261b362b15af34006e6a11974088a46d42b903418eJohann
227a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        if(c >= eob)
2281b362b15af34006e6a11974088a46d42b903418eJohann        {
2291b362b15af34006e6a11974088a46d42b903418eJohann            /* c = band for this case */
2301b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = DCT_EOB_TOKEN;
2311b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
2321b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = 0;
2331b362b15af34006e6a11974088a46d42b903418eJohann
2341b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [type] [c] [pt] [DCT_EOB_TOKEN];
2351b362b15af34006e6a11974088a46d42b903418eJohann            t++;
2361b362b15af34006e6a11974088a46d42b903418eJohann            *tp = t;
2371b362b15af34006e6a11974088a46d42b903418eJohann            *a = *l = 0;
2381b362b15af34006e6a11974088a46d42b903418eJohann            continue;
2391b362b15af34006e6a11974088a46d42b903418eJohann        }
2401b362b15af34006e6a11974088a46d42b903418eJohann
2411b362b15af34006e6a11974088a46d42b903418eJohann        v = qcoeff_ptr[c];
2421b362b15af34006e6a11974088a46d42b903418eJohann
2431b362b15af34006e6a11974088a46d42b903418eJohann        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
2441b362b15af34006e6a11974088a46d42b903418eJohann        token    = vp8_dct_value_tokens_ptr[v].Token;
2451b362b15af34006e6a11974088a46d42b903418eJohann        t->Token = token;
2461b362b15af34006e6a11974088a46d42b903418eJohann
2471b362b15af34006e6a11974088a46d42b903418eJohann        t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
2481b362b15af34006e6a11974088a46d42b903418eJohann        t->skip_eob_node = 0;
2491b362b15af34006e6a11974088a46d42b903418eJohann        ++x->coef_counts       [type] [c] [pt] [token];
2501b362b15af34006e6a11974088a46d42b903418eJohann        pt = vp8_prev_token_class[token];
2511b362b15af34006e6a11974088a46d42b903418eJohann        t++;
2521b362b15af34006e6a11974088a46d42b903418eJohann        c++;
2531b362b15af34006e6a11974088a46d42b903418eJohann
254a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        assert(eob <= 16);
255a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        for (; c < eob; c++)
2561b362b15af34006e6a11974088a46d42b903418eJohann        {
2571b362b15af34006e6a11974088a46d42b903418eJohann            rc = vp8_default_zig_zag1d[c];
2581b362b15af34006e6a11974088a46d42b903418eJohann            band = vp8_coef_bands[c];
2591b362b15af34006e6a11974088a46d42b903418eJohann            v = qcoeff_ptr[rc];
2601b362b15af34006e6a11974088a46d42b903418eJohann
2611b362b15af34006e6a11974088a46d42b903418eJohann            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
2621b362b15af34006e6a11974088a46d42b903418eJohann            token    = vp8_dct_value_tokens_ptr[v].Token;
2631b362b15af34006e6a11974088a46d42b903418eJohann
2641b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = token;
2651b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
2661b362b15af34006e6a11974088a46d42b903418eJohann
2671b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = (pt == 0);
2681b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [type] [band] [pt] [token];
2691b362b15af34006e6a11974088a46d42b903418eJohann
2701b362b15af34006e6a11974088a46d42b903418eJohann            pt = vp8_prev_token_class[token];
2711b362b15af34006e6a11974088a46d42b903418eJohann            t++;
2721b362b15af34006e6a11974088a46d42b903418eJohann        }
2731b362b15af34006e6a11974088a46d42b903418eJohann        if (c < 16)
2741b362b15af34006e6a11974088a46d42b903418eJohann        {
2751b362b15af34006e6a11974088a46d42b903418eJohann            band = vp8_coef_bands[c];
2761b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = DCT_EOB_TOKEN;
2771b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
2781b362b15af34006e6a11974088a46d42b903418eJohann
2791b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = 0;
2801b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
2811b362b15af34006e6a11974088a46d42b903418eJohann
2821b362b15af34006e6a11974088a46d42b903418eJohann            t++;
2831b362b15af34006e6a11974088a46d42b903418eJohann        }
2841b362b15af34006e6a11974088a46d42b903418eJohann        *tp = t;
2851b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = 1;
2861b362b15af34006e6a11974088a46d42b903418eJohann    }
2871b362b15af34006e6a11974088a46d42b903418eJohann
2881b362b15af34006e6a11974088a46d42b903418eJohann    /* Chroma */
2891b362b15af34006e6a11974088a46d42b903418eJohann    for (block = 16; block < 24; block++, b++)
2901b362b15af34006e6a11974088a46d42b903418eJohann    {
291a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        const int eob = *b->eob;
2921b362b15af34006e6a11974088a46d42b903418eJohann        tmp1 = vp8_block2above[block];
2931b362b15af34006e6a11974088a46d42b903418eJohann        tmp2 = vp8_block2left[block];
2941b362b15af34006e6a11974088a46d42b903418eJohann        qcoeff_ptr = b->qcoeff;
2951b362b15af34006e6a11974088a46d42b903418eJohann        a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
2961b362b15af34006e6a11974088a46d42b903418eJohann        l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
2971b362b15af34006e6a11974088a46d42b903418eJohann
2981b362b15af34006e6a11974088a46d42b903418eJohann        VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
2991b362b15af34006e6a11974088a46d42b903418eJohann
300a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        if(!eob)
3011b362b15af34006e6a11974088a46d42b903418eJohann        {
3021b362b15af34006e6a11974088a46d42b903418eJohann            /* c = band for this case */
3031b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = DCT_EOB_TOKEN;
3041b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
3051b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = 0;
3061b362b15af34006e6a11974088a46d42b903418eJohann
3071b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [2] [0] [pt] [DCT_EOB_TOKEN];
3081b362b15af34006e6a11974088a46d42b903418eJohann            t++;
3091b362b15af34006e6a11974088a46d42b903418eJohann            *tp = t;
3101b362b15af34006e6a11974088a46d42b903418eJohann            *a = *l = 0;
3111b362b15af34006e6a11974088a46d42b903418eJohann            continue;
3121b362b15af34006e6a11974088a46d42b903418eJohann        }
3131b362b15af34006e6a11974088a46d42b903418eJohann
3141b362b15af34006e6a11974088a46d42b903418eJohann        v = qcoeff_ptr[0];
3151b362b15af34006e6a11974088a46d42b903418eJohann
3161b362b15af34006e6a11974088a46d42b903418eJohann        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
3171b362b15af34006e6a11974088a46d42b903418eJohann        token    = vp8_dct_value_tokens_ptr[v].Token;
3181b362b15af34006e6a11974088a46d42b903418eJohann        t->Token = token;
3191b362b15af34006e6a11974088a46d42b903418eJohann
3201b362b15af34006e6a11974088a46d42b903418eJohann        t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
3211b362b15af34006e6a11974088a46d42b903418eJohann        t->skip_eob_node = 0;
3221b362b15af34006e6a11974088a46d42b903418eJohann        ++x->coef_counts       [2] [0] [pt] [token];
3231b362b15af34006e6a11974088a46d42b903418eJohann        pt = vp8_prev_token_class[token];
3241b362b15af34006e6a11974088a46d42b903418eJohann        t++;
3251b362b15af34006e6a11974088a46d42b903418eJohann        c = 1;
3261b362b15af34006e6a11974088a46d42b903418eJohann
327a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        assert(eob <= 16);
328a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian        for (; c < eob; c++)
3291b362b15af34006e6a11974088a46d42b903418eJohann        {
3301b362b15af34006e6a11974088a46d42b903418eJohann            rc = vp8_default_zig_zag1d[c];
3311b362b15af34006e6a11974088a46d42b903418eJohann            band = vp8_coef_bands[c];
3321b362b15af34006e6a11974088a46d42b903418eJohann            v = qcoeff_ptr[rc];
3331b362b15af34006e6a11974088a46d42b903418eJohann
3341b362b15af34006e6a11974088a46d42b903418eJohann            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
3351b362b15af34006e6a11974088a46d42b903418eJohann            token    = vp8_dct_value_tokens_ptr[v].Token;
3361b362b15af34006e6a11974088a46d42b903418eJohann
3371b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = token;
3381b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
3391b362b15af34006e6a11974088a46d42b903418eJohann
3401b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = (pt == 0);
3411b362b15af34006e6a11974088a46d42b903418eJohann
3421b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [2] [band] [pt] [token];
3431b362b15af34006e6a11974088a46d42b903418eJohann
3441b362b15af34006e6a11974088a46d42b903418eJohann            pt = vp8_prev_token_class[token];
3451b362b15af34006e6a11974088a46d42b903418eJohann            t++;
3461b362b15af34006e6a11974088a46d42b903418eJohann        }
3471b362b15af34006e6a11974088a46d42b903418eJohann        if (c < 16)
3481b362b15af34006e6a11974088a46d42b903418eJohann        {
3491b362b15af34006e6a11974088a46d42b903418eJohann            band = vp8_coef_bands[c];
3501b362b15af34006e6a11974088a46d42b903418eJohann            t->Token = DCT_EOB_TOKEN;
3511b362b15af34006e6a11974088a46d42b903418eJohann            t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
3521b362b15af34006e6a11974088a46d42b903418eJohann
3531b362b15af34006e6a11974088a46d42b903418eJohann            t->skip_eob_node = 0;
3541b362b15af34006e6a11974088a46d42b903418eJohann
3551b362b15af34006e6a11974088a46d42b903418eJohann            ++x->coef_counts       [2] [band] [pt] [DCT_EOB_TOKEN];
3561b362b15af34006e6a11974088a46d42b903418eJohann
3571b362b15af34006e6a11974088a46d42b903418eJohann            t++;
3581b362b15af34006e6a11974088a46d42b903418eJohann        }
3591b362b15af34006e6a11974088a46d42b903418eJohann        *tp = t;
3601b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = 1;
3611b362b15af34006e6a11974088a46d42b903418eJohann    }
3621b362b15af34006e6a11974088a46d42b903418eJohann}
3631b362b15af34006e6a11974088a46d42b903418eJohann
3641b362b15af34006e6a11974088a46d42b903418eJohann
3651b362b15af34006e6a11974088a46d42b903418eJohannstatic int mb_is_skippable(MACROBLOCKD *x, int has_y2_block)
3661b362b15af34006e6a11974088a46d42b903418eJohann{
3671b362b15af34006e6a11974088a46d42b903418eJohann    int skip = 1;
3681b362b15af34006e6a11974088a46d42b903418eJohann    int i = 0;
3691b362b15af34006e6a11974088a46d42b903418eJohann
3701b362b15af34006e6a11974088a46d42b903418eJohann    if (has_y2_block)
3711b362b15af34006e6a11974088a46d42b903418eJohann    {
3721b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i++)
3731b362b15af34006e6a11974088a46d42b903418eJohann            skip &= (x->eobs[i] < 2);
3741b362b15af34006e6a11974088a46d42b903418eJohann    }
3751b362b15af34006e6a11974088a46d42b903418eJohann
3761b362b15af34006e6a11974088a46d42b903418eJohann    for (; i < 24 + has_y2_block; i++)
3771b362b15af34006e6a11974088a46d42b903418eJohann        skip &= (!x->eobs[i]);
3781b362b15af34006e6a11974088a46d42b903418eJohann
3791b362b15af34006e6a11974088a46d42b903418eJohann    return skip;
3801b362b15af34006e6a11974088a46d42b903418eJohann}
3811b362b15af34006e6a11974088a46d42b903418eJohann
3821b362b15af34006e6a11974088a46d42b903418eJohann
3831b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
3841b362b15af34006e6a11974088a46d42b903418eJohann{
3851b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
3861b362b15af34006e6a11974088a46d42b903418eJohann    int plane_type;
3871b362b15af34006e6a11974088a46d42b903418eJohann    int has_y2_block;
3881b362b15af34006e6a11974088a46d42b903418eJohann
3891b362b15af34006e6a11974088a46d42b903418eJohann    has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED
3901b362b15af34006e6a11974088a46d42b903418eJohann                    && xd->mode_info_context->mbmi.mode != SPLITMV);
3911b362b15af34006e6a11974088a46d42b903418eJohann
3921b362b15af34006e6a11974088a46d42b903418eJohann    xd->mode_info_context->mbmi.mb_skip_coeff =
3931b362b15af34006e6a11974088a46d42b903418eJohann        mb_is_skippable(xd, has_y2_block);
3941b362b15af34006e6a11974088a46d42b903418eJohann    if (xd->mode_info_context->mbmi.mb_skip_coeff)
3951b362b15af34006e6a11974088a46d42b903418eJohann    {
3961b362b15af34006e6a11974088a46d42b903418eJohann        if (!cpi->common.mb_no_coeff_skip)
3971b362b15af34006e6a11974088a46d42b903418eJohann        {
3981b362b15af34006e6a11974088a46d42b903418eJohann            vp8_stuff_mb(cpi, x, t);
3991b362b15af34006e6a11974088a46d42b903418eJohann        }
4001b362b15af34006e6a11974088a46d42b903418eJohann        else
4011b362b15af34006e6a11974088a46d42b903418eJohann        {
4021b362b15af34006e6a11974088a46d42b903418eJohann            vp8_fix_contexts(xd);
4031b362b15af34006e6a11974088a46d42b903418eJohann            x->skip_true_count++;
4041b362b15af34006e6a11974088a46d42b903418eJohann        }
4051b362b15af34006e6a11974088a46d42b903418eJohann
4061b362b15af34006e6a11974088a46d42b903418eJohann        return;
4071b362b15af34006e6a11974088a46d42b903418eJohann    }
4081b362b15af34006e6a11974088a46d42b903418eJohann
4091b362b15af34006e6a11974088a46d42b903418eJohann    plane_type = 3;
4101b362b15af34006e6a11974088a46d42b903418eJohann    if(has_y2_block)
4111b362b15af34006e6a11974088a46d42b903418eJohann    {
4121b362b15af34006e6a11974088a46d42b903418eJohann        tokenize2nd_order_b(x, t, cpi);
4131b362b15af34006e6a11974088a46d42b903418eJohann        plane_type = 0;
4141b362b15af34006e6a11974088a46d42b903418eJohann    }
4151b362b15af34006e6a11974088a46d42b903418eJohann
4161b362b15af34006e6a11974088a46d42b903418eJohann    tokenize1st_order_b(x, t, plane_type, cpi);
4171b362b15af34006e6a11974088a46d42b903418eJohann}
4181b362b15af34006e6a11974088a46d42b903418eJohann
4191b362b15af34006e6a11974088a46d42b903418eJohann
420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
4211b362b15af34006e6a11974088a46d42b903418eJohann
4221b362b15af34006e6a11974088a46d42b903418eJohannvoid init_context_counters(void)
4231b362b15af34006e6a11974088a46d42b903418eJohann{
4241b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memset(context_counters, 0, sizeof(context_counters));
4251b362b15af34006e6a11974088a46d42b903418eJohann}
4261b362b15af34006e6a11974088a46d42b903418eJohann
4271b362b15af34006e6a11974088a46d42b903418eJohannvoid print_context_counters()
4281b362b15af34006e6a11974088a46d42b903418eJohann{
4291b362b15af34006e6a11974088a46d42b903418eJohann
4301b362b15af34006e6a11974088a46d42b903418eJohann    int type, band, pt, t;
4311b362b15af34006e6a11974088a46d42b903418eJohann
4321b362b15af34006e6a11974088a46d42b903418eJohann    FILE *const f = fopen("context.c", "w");
4331b362b15af34006e6a11974088a46d42b903418eJohann
4341b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "#include \"entropy.h\"\n");
4351b362b15af34006e6a11974088a46d42b903418eJohann
4361b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n");
4371b362b15af34006e6a11974088a46d42b903418eJohann
4381b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "int Contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];\n\n");
4391b362b15af34006e6a11974088a46d42b903418eJohann
4401b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {");
4411b362b15af34006e6a11974088a46d42b903418eJohann
4421b362b15af34006e6a11974088a46d42b903418eJohann# define Comma( X) (X? ",":"")
4431b362b15af34006e6a11974088a46d42b903418eJohann
4441b362b15af34006e6a11974088a46d42b903418eJohann    type = 0;
4451b362b15af34006e6a11974088a46d42b903418eJohann
4461b362b15af34006e6a11974088a46d42b903418eJohann    do
4471b362b15af34006e6a11974088a46d42b903418eJohann    {
4481b362b15af34006e6a11974088a46d42b903418eJohann        fprintf(f, "%s\n  { /* block Type %d */", Comma(type), type);
4491b362b15af34006e6a11974088a46d42b903418eJohann
4501b362b15af34006e6a11974088a46d42b903418eJohann        band = 0;
4511b362b15af34006e6a11974088a46d42b903418eJohann
4521b362b15af34006e6a11974088a46d42b903418eJohann        do
4531b362b15af34006e6a11974088a46d42b903418eJohann        {
4541b362b15af34006e6a11974088a46d42b903418eJohann            fprintf(f, "%s\n    { /* Coeff Band %d */", Comma(band), band);
4551b362b15af34006e6a11974088a46d42b903418eJohann
4561b362b15af34006e6a11974088a46d42b903418eJohann            pt = 0;
4571b362b15af34006e6a11974088a46d42b903418eJohann
4581b362b15af34006e6a11974088a46d42b903418eJohann            do
4591b362b15af34006e6a11974088a46d42b903418eJohann            {
4601b362b15af34006e6a11974088a46d42b903418eJohann                fprintf(f, "%s\n      {", Comma(pt));
4611b362b15af34006e6a11974088a46d42b903418eJohann
4621b362b15af34006e6a11974088a46d42b903418eJohann                t = 0;
4631b362b15af34006e6a11974088a46d42b903418eJohann
4641b362b15af34006e6a11974088a46d42b903418eJohann                do
4651b362b15af34006e6a11974088a46d42b903418eJohann                {
4661b362b15af34006e6a11974088a46d42b903418eJohann                    const _int64 x = context_counters [type] [band] [pt] [t];
4671b362b15af34006e6a11974088a46d42b903418eJohann                    const int y = (int) x;
4681b362b15af34006e6a11974088a46d42b903418eJohann
4691b362b15af34006e6a11974088a46d42b903418eJohann                    assert(x == (_int64) y);  /* no overflow handling yet */
4701b362b15af34006e6a11974088a46d42b903418eJohann                    fprintf(f, "%s %d", Comma(t), y);
4711b362b15af34006e6a11974088a46d42b903418eJohann
4721b362b15af34006e6a11974088a46d42b903418eJohann                }
4731b362b15af34006e6a11974088a46d42b903418eJohann                while (++t < MAX_ENTROPY_TOKENS);
4741b362b15af34006e6a11974088a46d42b903418eJohann
4751b362b15af34006e6a11974088a46d42b903418eJohann                fprintf(f, "}");
4761b362b15af34006e6a11974088a46d42b903418eJohann            }
4771b362b15af34006e6a11974088a46d42b903418eJohann            while (++pt < PREV_COEF_CONTEXTS);
4781b362b15af34006e6a11974088a46d42b903418eJohann
4791b362b15af34006e6a11974088a46d42b903418eJohann            fprintf(f, "\n    }");
4801b362b15af34006e6a11974088a46d42b903418eJohann
4811b362b15af34006e6a11974088a46d42b903418eJohann        }
4821b362b15af34006e6a11974088a46d42b903418eJohann        while (++band < COEF_BANDS);
4831b362b15af34006e6a11974088a46d42b903418eJohann
4841b362b15af34006e6a11974088a46d42b903418eJohann        fprintf(f, "\n  }");
4851b362b15af34006e6a11974088a46d42b903418eJohann    }
4861b362b15af34006e6a11974088a46d42b903418eJohann    while (++type < BLOCK_TYPES);
4871b362b15af34006e6a11974088a46d42b903418eJohann
4881b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "\n};\n");
4891b362b15af34006e6a11974088a46d42b903418eJohann    fclose(f);
4901b362b15af34006e6a11974088a46d42b903418eJohann}
4911b362b15af34006e6a11974088a46d42b903418eJohann#endif
4921b362b15af34006e6a11974088a46d42b903418eJohann
4931b362b15af34006e6a11974088a46d42b903418eJohann
4941b362b15af34006e6a11974088a46d42b903418eJohannstatic void stuff2nd_order_b
4951b362b15af34006e6a11974088a46d42b903418eJohann(
4961b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA **tp,
4971b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a,
4981b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l,
4991b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMP *cpi,
5001b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x
5011b362b15af34006e6a11974088a46d42b903418eJohann)
5021b362b15af34006e6a11974088a46d42b903418eJohann{
5031b362b15af34006e6a11974088a46d42b903418eJohann    int pt; /* near block/prev token context index */
5041b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA *t = *tp;        /* store tokens starting here */
5051b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
5061b362b15af34006e6a11974088a46d42b903418eJohann
5071b362b15af34006e6a11974088a46d42b903418eJohann    t->Token = DCT_EOB_TOKEN;
5081b362b15af34006e6a11974088a46d42b903418eJohann    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
5091b362b15af34006e6a11974088a46d42b903418eJohann    t->skip_eob_node = 0;
5101b362b15af34006e6a11974088a46d42b903418eJohann    ++x->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
5111b362b15af34006e6a11974088a46d42b903418eJohann    ++t;
5121b362b15af34006e6a11974088a46d42b903418eJohann
5131b362b15af34006e6a11974088a46d42b903418eJohann    *tp = t;
5141b362b15af34006e6a11974088a46d42b903418eJohann    pt = 0;
5151b362b15af34006e6a11974088a46d42b903418eJohann    *a = *l = pt;
5161b362b15af34006e6a11974088a46d42b903418eJohann}
5171b362b15af34006e6a11974088a46d42b903418eJohann
5181b362b15af34006e6a11974088a46d42b903418eJohannstatic void stuff1st_order_b
5191b362b15af34006e6a11974088a46d42b903418eJohann(
5201b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA **tp,
5211b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a,
5221b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l,
5231b362b15af34006e6a11974088a46d42b903418eJohann    int type,
5241b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMP *cpi,
5251b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x
5261b362b15af34006e6a11974088a46d42b903418eJohann)
5271b362b15af34006e6a11974088a46d42b903418eJohann{
5281b362b15af34006e6a11974088a46d42b903418eJohann    int pt; /* near block/prev token context index */
5291b362b15af34006e6a11974088a46d42b903418eJohann    int band;
5301b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA *t = *tp;        /* store tokens starting here */
5311b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
5321b362b15af34006e6a11974088a46d42b903418eJohann    band = type ? 0 : 1;
5331b362b15af34006e6a11974088a46d42b903418eJohann    t->Token = DCT_EOB_TOKEN;
5341b362b15af34006e6a11974088a46d42b903418eJohann    t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
5351b362b15af34006e6a11974088a46d42b903418eJohann    t->skip_eob_node = 0;
5361b362b15af34006e6a11974088a46d42b903418eJohann    ++x->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
5371b362b15af34006e6a11974088a46d42b903418eJohann    ++t;
5381b362b15af34006e6a11974088a46d42b903418eJohann    *tp = t;
5391b362b15af34006e6a11974088a46d42b903418eJohann    pt = 0; /* 0 <-> all coeff data is zero */
5401b362b15af34006e6a11974088a46d42b903418eJohann    *a = *l = pt;
5411b362b15af34006e6a11974088a46d42b903418eJohann}
5421b362b15af34006e6a11974088a46d42b903418eJohann
5431b362b15af34006e6a11974088a46d42b903418eJohannstatic
5441b362b15af34006e6a11974088a46d42b903418eJohannvoid stuff1st_order_buv
5451b362b15af34006e6a11974088a46d42b903418eJohann(
5461b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA **tp,
5471b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a,
5481b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l,
5491b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMP *cpi,
5501b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x
5511b362b15af34006e6a11974088a46d42b903418eJohann)
5521b362b15af34006e6a11974088a46d42b903418eJohann{
5531b362b15af34006e6a11974088a46d42b903418eJohann    int pt; /* near block/prev token context index */
5541b362b15af34006e6a11974088a46d42b903418eJohann    TOKENEXTRA *t = *tp;        /* store tokens starting here */
5551b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
5561b362b15af34006e6a11974088a46d42b903418eJohann
5571b362b15af34006e6a11974088a46d42b903418eJohann    t->Token = DCT_EOB_TOKEN;
5581b362b15af34006e6a11974088a46d42b903418eJohann    t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
5591b362b15af34006e6a11974088a46d42b903418eJohann    t->skip_eob_node = 0;
5601b362b15af34006e6a11974088a46d42b903418eJohann    ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN];
5611b362b15af34006e6a11974088a46d42b903418eJohann    ++t;
5621b362b15af34006e6a11974088a46d42b903418eJohann    *tp = t;
5631b362b15af34006e6a11974088a46d42b903418eJohann    pt = 0; /* 0 <-> all coeff data is zero */
5641b362b15af34006e6a11974088a46d42b903418eJohann    *a = *l = pt;
5651b362b15af34006e6a11974088a46d42b903418eJohann}
5661b362b15af34006e6a11974088a46d42b903418eJohann
5671b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
5681b362b15af34006e6a11974088a46d42b903418eJohann{
5691b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
5701b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context;
5711b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context;
5721b362b15af34006e6a11974088a46d42b903418eJohann    int plane_type;
5731b362b15af34006e6a11974088a46d42b903418eJohann    int b;
5741b362b15af34006e6a11974088a46d42b903418eJohann    plane_type = 3;
5751b362b15af34006e6a11974088a46d42b903418eJohann    if((xd->mode_info_context->mbmi.mode != B_PRED
5761b362b15af34006e6a11974088a46d42b903418eJohann                        && xd->mode_info_context->mbmi.mode != SPLITMV))
5771b362b15af34006e6a11974088a46d42b903418eJohann    {
5781b362b15af34006e6a11974088a46d42b903418eJohann        stuff2nd_order_b(t,
5791b362b15af34006e6a11974088a46d42b903418eJohann                     A + vp8_block2above[24], L + vp8_block2left[24], cpi, x);
5801b362b15af34006e6a11974088a46d42b903418eJohann        plane_type = 0;
5811b362b15af34006e6a11974088a46d42b903418eJohann    }
5821b362b15af34006e6a11974088a46d42b903418eJohann
5831b362b15af34006e6a11974088a46d42b903418eJohann    for (b = 0; b < 16; b++)
5841b362b15af34006e6a11974088a46d42b903418eJohann        stuff1st_order_b(t,
5851b362b15af34006e6a11974088a46d42b903418eJohann                         A + vp8_block2above[b],
5861b362b15af34006e6a11974088a46d42b903418eJohann                         L + vp8_block2left[b], plane_type, cpi, x);
5871b362b15af34006e6a11974088a46d42b903418eJohann
5881b362b15af34006e6a11974088a46d42b903418eJohann    for (b = 16; b < 24; b++)
5891b362b15af34006e6a11974088a46d42b903418eJohann        stuff1st_order_buv(t,
5901b362b15af34006e6a11974088a46d42b903418eJohann                           A + vp8_block2above[b],
5911b362b15af34006e6a11974088a46d42b903418eJohann                           L + vp8_block2left[b], cpi, x);
5921b362b15af34006e6a11974088a46d42b903418eJohann
5931b362b15af34006e6a11974088a46d42b903418eJohann}
5941b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_fix_contexts(MACROBLOCKD *x)
5951b362b15af34006e6a11974088a46d42b903418eJohann{
5961b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear entropy contexts for Y2 blocks */
5971b362b15af34006e6a11974088a46d42b903418eJohann    if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
5981b362b15af34006e6a11974088a46d42b903418eJohann    {
5991b362b15af34006e6a11974088a46d42b903418eJohann        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
6001b362b15af34006e6a11974088a46d42b903418eJohann        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
6011b362b15af34006e6a11974088a46d42b903418eJohann    }
6021b362b15af34006e6a11974088a46d42b903418eJohann    else
6031b362b15af34006e6a11974088a46d42b903418eJohann    {
6041b362b15af34006e6a11974088a46d42b903418eJohann        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
6051b362b15af34006e6a11974088a46d42b903418eJohann        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
6061b362b15af34006e6a11974088a46d42b903418eJohann    }
6071b362b15af34006e6a11974088a46d42b903418eJohann
6081b362b15af34006e6a11974088a46d42b903418eJohann}
609