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 "vp8/common/blockd.h"
131b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxd_int.h"
141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_ports/mem.h"
161b362b15af34006e6a11974088a46d42b903418eJohann#include "detokenize.h"
171b362b15af34006e6a11974088a46d42b903418eJohann
181b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_reset_mb_tokens_context(MACROBLOCKD *x)
191b362b15af34006e6a11974088a46d42b903418eJohann{
201b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a_ctx = ((ENTROPY_CONTEXT *)x->above_context);
211b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l_ctx = ((ENTROPY_CONTEXT *)x->left_context);
221b362b15af34006e6a11974088a46d42b903418eJohann
231b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memset(a_ctx, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
241b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memset(l_ctx, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
251b362b15af34006e6a11974088a46d42b903418eJohann
261b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear entropy contexts for Y2 blocks */
271b362b15af34006e6a11974088a46d42b903418eJohann    if (!x->mode_info_context->mbmi.is_4x4)
281b362b15af34006e6a11974088a46d42b903418eJohann    {
291b362b15af34006e6a11974088a46d42b903418eJohann        a_ctx[8] = l_ctx[8] = 0;
301b362b15af34006e6a11974088a46d42b903418eJohann    }
311b362b15af34006e6a11974088a46d42b903418eJohann}
321b362b15af34006e6a11974088a46d42b903418eJohann
331b362b15af34006e6a11974088a46d42b903418eJohann/*
341b362b15af34006e6a11974088a46d42b903418eJohann    ------------------------------------------------------------------------------
351b362b15af34006e6a11974088a46d42b903418eJohann    Residual decoding (Paragraph 13.2 / 13.3)
361b362b15af34006e6a11974088a46d42b903418eJohann*/
371b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kBands[16 + 1] = {
381b362b15af34006e6a11974088a46d42b903418eJohann  0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
391b362b15af34006e6a11974088a46d42b903418eJohann  0  /* extra entry as sentinel */
401b362b15af34006e6a11974088a46d42b903418eJohann};
411b362b15af34006e6a11974088a46d42b903418eJohann
421b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kCat3[] = { 173, 148, 140, 0 };
431b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kCat4[] = { 176, 155, 140, 135, 0 };
441b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 };
451b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kCat6[] =
461b362b15af34006e6a11974088a46d42b903418eJohann  { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 };
471b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t* const kCat3456[] = { kCat3, kCat4, kCat5, kCat6 };
481b362b15af34006e6a11974088a46d42b903418eJohannstatic const uint8_t kZigzag[16] = {
491b362b15af34006e6a11974088a46d42b903418eJohann  0, 1, 4, 8,  5, 2, 3, 6,  9, 12, 13, 10,  7, 11, 14, 15
501b362b15af34006e6a11974088a46d42b903418eJohann};
511b362b15af34006e6a11974088a46d42b903418eJohann
521b362b15af34006e6a11974088a46d42b903418eJohann#define VP8GetBit vp8dx_decode_bool
531b362b15af34006e6a11974088a46d42b903418eJohann#define NUM_PROBAS  11
541b362b15af34006e6a11974088a46d42b903418eJohann#define NUM_CTX  3
551b362b15af34006e6a11974088a46d42b903418eJohann
561b362b15af34006e6a11974088a46d42b903418eJohann/* for const-casting */
571b362b15af34006e6a11974088a46d42b903418eJohanntypedef const uint8_t (*ProbaArray)[NUM_CTX][NUM_PROBAS];
581b362b15af34006e6a11974088a46d42b903418eJohann
591b362b15af34006e6a11974088a46d42b903418eJohannstatic int GetSigned(BOOL_DECODER *br, int value_to_sign)
601b362b15af34006e6a11974088a46d42b903418eJohann{
611b362b15af34006e6a11974088a46d42b903418eJohann    int split = (br->range + 1) >> 1;
621b362b15af34006e6a11974088a46d42b903418eJohann    VP8_BD_VALUE bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8);
631b362b15af34006e6a11974088a46d42b903418eJohann    int v;
641b362b15af34006e6a11974088a46d42b903418eJohann
651b362b15af34006e6a11974088a46d42b903418eJohann    if(br->count < 0)
661b362b15af34006e6a11974088a46d42b903418eJohann        vp8dx_bool_decoder_fill(br);
671b362b15af34006e6a11974088a46d42b903418eJohann
681b362b15af34006e6a11974088a46d42b903418eJohann    if ( br->value < bigsplit )
691b362b15af34006e6a11974088a46d42b903418eJohann    {
701b362b15af34006e6a11974088a46d42b903418eJohann        br->range = split;
711b362b15af34006e6a11974088a46d42b903418eJohann        v= value_to_sign;
721b362b15af34006e6a11974088a46d42b903418eJohann    }
731b362b15af34006e6a11974088a46d42b903418eJohann    else
741b362b15af34006e6a11974088a46d42b903418eJohann    {
751b362b15af34006e6a11974088a46d42b903418eJohann        br->range = br->range-split;
761b362b15af34006e6a11974088a46d42b903418eJohann        br->value = br->value-bigsplit;
771b362b15af34006e6a11974088a46d42b903418eJohann        v = -value_to_sign;
781b362b15af34006e6a11974088a46d42b903418eJohann    }
791b362b15af34006e6a11974088a46d42b903418eJohann    br->range +=br->range;
801b362b15af34006e6a11974088a46d42b903418eJohann    br->value +=br->value;
811b362b15af34006e6a11974088a46d42b903418eJohann    br->count--;
821b362b15af34006e6a11974088a46d42b903418eJohann
831b362b15af34006e6a11974088a46d42b903418eJohann    return v;
841b362b15af34006e6a11974088a46d42b903418eJohann}
851b362b15af34006e6a11974088a46d42b903418eJohann/*
861b362b15af34006e6a11974088a46d42b903418eJohann   Returns the position of the last non-zero coeff plus one
871b362b15af34006e6a11974088a46d42b903418eJohann   (and 0 if there's no coeff at all)
881b362b15af34006e6a11974088a46d42b903418eJohann*/
891b362b15af34006e6a11974088a46d42b903418eJohannstatic int GetCoeffs(BOOL_DECODER *br, ProbaArray prob,
901b362b15af34006e6a11974088a46d42b903418eJohann                     int ctx, int n, int16_t* out)
911b362b15af34006e6a11974088a46d42b903418eJohann{
921b362b15af34006e6a11974088a46d42b903418eJohann    const uint8_t* p = prob[n][ctx];
931b362b15af34006e6a11974088a46d42b903418eJohann    if (!VP8GetBit(br, p[0]))
941b362b15af34006e6a11974088a46d42b903418eJohann    {   /* first EOB is more a 'CBP' bit. */
951b362b15af34006e6a11974088a46d42b903418eJohann        return 0;
961b362b15af34006e6a11974088a46d42b903418eJohann    }
971b362b15af34006e6a11974088a46d42b903418eJohann    while (1)
981b362b15af34006e6a11974088a46d42b903418eJohann    {
991b362b15af34006e6a11974088a46d42b903418eJohann        ++n;
1001b362b15af34006e6a11974088a46d42b903418eJohann        if (!VP8GetBit(br, p[1]))
1011b362b15af34006e6a11974088a46d42b903418eJohann        {
1021b362b15af34006e6a11974088a46d42b903418eJohann            p = prob[kBands[n]][0];
1031b362b15af34006e6a11974088a46d42b903418eJohann        }
1041b362b15af34006e6a11974088a46d42b903418eJohann        else
1051b362b15af34006e6a11974088a46d42b903418eJohann        {  /* non zero coeff */
1061b362b15af34006e6a11974088a46d42b903418eJohann            int v, j;
1071b362b15af34006e6a11974088a46d42b903418eJohann            if (!VP8GetBit(br, p[2]))
1081b362b15af34006e6a11974088a46d42b903418eJohann            {
1091b362b15af34006e6a11974088a46d42b903418eJohann                p = prob[kBands[n]][1];
1101b362b15af34006e6a11974088a46d42b903418eJohann                v = 1;
1111b362b15af34006e6a11974088a46d42b903418eJohann            }
1121b362b15af34006e6a11974088a46d42b903418eJohann            else
1131b362b15af34006e6a11974088a46d42b903418eJohann            {
1141b362b15af34006e6a11974088a46d42b903418eJohann                if (!VP8GetBit(br, p[3]))
1151b362b15af34006e6a11974088a46d42b903418eJohann                {
1161b362b15af34006e6a11974088a46d42b903418eJohann                    if (!VP8GetBit(br, p[4]))
1171b362b15af34006e6a11974088a46d42b903418eJohann                    {
1181b362b15af34006e6a11974088a46d42b903418eJohann                        v = 2;
1191b362b15af34006e6a11974088a46d42b903418eJohann                    }
1201b362b15af34006e6a11974088a46d42b903418eJohann                    else
1211b362b15af34006e6a11974088a46d42b903418eJohann                    {
1221b362b15af34006e6a11974088a46d42b903418eJohann                        v = 3 + VP8GetBit(br, p[5]);
1231b362b15af34006e6a11974088a46d42b903418eJohann                    }
1241b362b15af34006e6a11974088a46d42b903418eJohann                }
1251b362b15af34006e6a11974088a46d42b903418eJohann                else
1261b362b15af34006e6a11974088a46d42b903418eJohann                {
1271b362b15af34006e6a11974088a46d42b903418eJohann                    if (!VP8GetBit(br, p[6]))
1281b362b15af34006e6a11974088a46d42b903418eJohann                    {
1291b362b15af34006e6a11974088a46d42b903418eJohann                        if (!VP8GetBit(br, p[7]))
1301b362b15af34006e6a11974088a46d42b903418eJohann                        {
1311b362b15af34006e6a11974088a46d42b903418eJohann                            v = 5 + VP8GetBit(br, 159);
1321b362b15af34006e6a11974088a46d42b903418eJohann                        } else
1331b362b15af34006e6a11974088a46d42b903418eJohann                        {
1341b362b15af34006e6a11974088a46d42b903418eJohann                            v = 7 + 2 * VP8GetBit(br, 165);
1351b362b15af34006e6a11974088a46d42b903418eJohann                            v += VP8GetBit(br, 145);
1361b362b15af34006e6a11974088a46d42b903418eJohann                        }
1371b362b15af34006e6a11974088a46d42b903418eJohann                    }
1381b362b15af34006e6a11974088a46d42b903418eJohann                    else
1391b362b15af34006e6a11974088a46d42b903418eJohann                    {
1401b362b15af34006e6a11974088a46d42b903418eJohann                        const uint8_t* tab;
1411b362b15af34006e6a11974088a46d42b903418eJohann                        const int bit1 = VP8GetBit(br, p[8]);
1421b362b15af34006e6a11974088a46d42b903418eJohann                        const int bit0 = VP8GetBit(br, p[9 + bit1]);
1431b362b15af34006e6a11974088a46d42b903418eJohann                        const int cat = 2 * bit1 + bit0;
1441b362b15af34006e6a11974088a46d42b903418eJohann                        v = 0;
1451b362b15af34006e6a11974088a46d42b903418eJohann                        for (tab = kCat3456[cat]; *tab; ++tab)
1461b362b15af34006e6a11974088a46d42b903418eJohann                        {
1471b362b15af34006e6a11974088a46d42b903418eJohann                            v += v + VP8GetBit(br, *tab);
1481b362b15af34006e6a11974088a46d42b903418eJohann                        }
1491b362b15af34006e6a11974088a46d42b903418eJohann                        v += 3 + (8 << cat);
1501b362b15af34006e6a11974088a46d42b903418eJohann                    }
1511b362b15af34006e6a11974088a46d42b903418eJohann                }
1521b362b15af34006e6a11974088a46d42b903418eJohann                p = prob[kBands[n]][2];
1531b362b15af34006e6a11974088a46d42b903418eJohann            }
1541b362b15af34006e6a11974088a46d42b903418eJohann            j = kZigzag[n - 1];
1551b362b15af34006e6a11974088a46d42b903418eJohann
1561b362b15af34006e6a11974088a46d42b903418eJohann            out[j] = GetSigned(br, v);
1571b362b15af34006e6a11974088a46d42b903418eJohann
1581b362b15af34006e6a11974088a46d42b903418eJohann            if (n == 16 || !VP8GetBit(br, p[0]))
1591b362b15af34006e6a11974088a46d42b903418eJohann            {   /* EOB */
1601b362b15af34006e6a11974088a46d42b903418eJohann                return n;
1611b362b15af34006e6a11974088a46d42b903418eJohann            }
1621b362b15af34006e6a11974088a46d42b903418eJohann        }
1631b362b15af34006e6a11974088a46d42b903418eJohann        if (n == 16)
1641b362b15af34006e6a11974088a46d42b903418eJohann        {
1651b362b15af34006e6a11974088a46d42b903418eJohann            return 16;
1661b362b15af34006e6a11974088a46d42b903418eJohann        }
1671b362b15af34006e6a11974088a46d42b903418eJohann    }
1681b362b15af34006e6a11974088a46d42b903418eJohann}
1691b362b15af34006e6a11974088a46d42b903418eJohann
1701b362b15af34006e6a11974088a46d42b903418eJohannint vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
1711b362b15af34006e6a11974088a46d42b903418eJohann{
1721b362b15af34006e6a11974088a46d42b903418eJohann    BOOL_DECODER *bc = x->current_bc;
1731b362b15af34006e6a11974088a46d42b903418eJohann    const FRAME_CONTEXT * const fc = &dx->common.fc;
1741b362b15af34006e6a11974088a46d42b903418eJohann    char *eobs = x->eobs;
1751b362b15af34006e6a11974088a46d42b903418eJohann
1761b362b15af34006e6a11974088a46d42b903418eJohann    int i;
1771b362b15af34006e6a11974088a46d42b903418eJohann    int nonzeros;
1781b362b15af34006e6a11974088a46d42b903418eJohann    int eobtotal = 0;
1791b362b15af34006e6a11974088a46d42b903418eJohann
1801b362b15af34006e6a11974088a46d42b903418eJohann    short *qcoeff_ptr;
1811b362b15af34006e6a11974088a46d42b903418eJohann    ProbaArray coef_probs;
1821b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a_ctx = ((ENTROPY_CONTEXT *)x->above_context);
1831b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l_ctx = ((ENTROPY_CONTEXT *)x->left_context);
1841b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *a;
1851b362b15af34006e6a11974088a46d42b903418eJohann    ENTROPY_CONTEXT *l;
1861b362b15af34006e6a11974088a46d42b903418eJohann    int skip_dc = 0;
1871b362b15af34006e6a11974088a46d42b903418eJohann
1881b362b15af34006e6a11974088a46d42b903418eJohann    qcoeff_ptr = &x->qcoeff[0];
1891b362b15af34006e6a11974088a46d42b903418eJohann
1901b362b15af34006e6a11974088a46d42b903418eJohann    if (!x->mode_info_context->mbmi.is_4x4)
1911b362b15af34006e6a11974088a46d42b903418eJohann    {
1921b362b15af34006e6a11974088a46d42b903418eJohann        a = a_ctx + 8;
1931b362b15af34006e6a11974088a46d42b903418eJohann        l = l_ctx + 8;
1941b362b15af34006e6a11974088a46d42b903418eJohann
1951b362b15af34006e6a11974088a46d42b903418eJohann        coef_probs = fc->coef_probs [1];
1961b362b15af34006e6a11974088a46d42b903418eJohann
1971b362b15af34006e6a11974088a46d42b903418eJohann        nonzeros = GetCoeffs(bc, coef_probs, (*a + *l), 0, qcoeff_ptr + 24 * 16);
1981b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = (nonzeros > 0);
1991b362b15af34006e6a11974088a46d42b903418eJohann
2001b362b15af34006e6a11974088a46d42b903418eJohann        eobs[24] = nonzeros;
2011b362b15af34006e6a11974088a46d42b903418eJohann        eobtotal += nonzeros - 16;
2021b362b15af34006e6a11974088a46d42b903418eJohann
2031b362b15af34006e6a11974088a46d42b903418eJohann        coef_probs = fc->coef_probs [0];
2041b362b15af34006e6a11974088a46d42b903418eJohann        skip_dc = 1;
2051b362b15af34006e6a11974088a46d42b903418eJohann    }
2061b362b15af34006e6a11974088a46d42b903418eJohann    else
2071b362b15af34006e6a11974088a46d42b903418eJohann    {
2081b362b15af34006e6a11974088a46d42b903418eJohann        coef_probs = fc->coef_probs [3];
2091b362b15af34006e6a11974088a46d42b903418eJohann        skip_dc = 0;
2101b362b15af34006e6a11974088a46d42b903418eJohann    }
2111b362b15af34006e6a11974088a46d42b903418eJohann
2121b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 16; ++i)
2131b362b15af34006e6a11974088a46d42b903418eJohann    {
2141b362b15af34006e6a11974088a46d42b903418eJohann        a = a_ctx + (i&3);
2151b362b15af34006e6a11974088a46d42b903418eJohann        l = l_ctx + ((i&0xc)>>2);
2161b362b15af34006e6a11974088a46d42b903418eJohann
2171b362b15af34006e6a11974088a46d42b903418eJohann        nonzeros = GetCoeffs(bc, coef_probs, (*a + *l), skip_dc, qcoeff_ptr);
2181b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = (nonzeros > 0);
2191b362b15af34006e6a11974088a46d42b903418eJohann
2201b362b15af34006e6a11974088a46d42b903418eJohann        nonzeros += skip_dc;
2211b362b15af34006e6a11974088a46d42b903418eJohann        eobs[i] = nonzeros;
2221b362b15af34006e6a11974088a46d42b903418eJohann        eobtotal += nonzeros;
2231b362b15af34006e6a11974088a46d42b903418eJohann        qcoeff_ptr += 16;
2241b362b15af34006e6a11974088a46d42b903418eJohann    }
2251b362b15af34006e6a11974088a46d42b903418eJohann
2261b362b15af34006e6a11974088a46d42b903418eJohann    coef_probs = fc->coef_probs [2];
2271b362b15af34006e6a11974088a46d42b903418eJohann
2281b362b15af34006e6a11974088a46d42b903418eJohann    a_ctx += 4;
2291b362b15af34006e6a11974088a46d42b903418eJohann    l_ctx += 4;
2301b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 16; i < 24; ++i)
2311b362b15af34006e6a11974088a46d42b903418eJohann    {
2321b362b15af34006e6a11974088a46d42b903418eJohann        a = a_ctx + ((i > 19)<<1) + (i&1);
2331b362b15af34006e6a11974088a46d42b903418eJohann        l = l_ctx + ((i > 19)<<1) + ((i&3)>1);
2341b362b15af34006e6a11974088a46d42b903418eJohann
2351b362b15af34006e6a11974088a46d42b903418eJohann        nonzeros = GetCoeffs(bc, coef_probs, (*a + *l), 0, qcoeff_ptr);
2361b362b15af34006e6a11974088a46d42b903418eJohann        *a = *l = (nonzeros > 0);
2371b362b15af34006e6a11974088a46d42b903418eJohann
2381b362b15af34006e6a11974088a46d42b903418eJohann        eobs[i] = nonzeros;
2391b362b15af34006e6a11974088a46d42b903418eJohann        eobtotal += nonzeros;
2401b362b15af34006e6a11974088a46d42b903418eJohann        qcoeff_ptr += 16;
2411b362b15af34006e6a11974088a46d42b903418eJohann    }
2421b362b15af34006e6a11974088a46d42b903418eJohann
2431b362b15af34006e6a11974088a46d42b903418eJohann    return eobtotal;
2441b362b15af34006e6a11974088a46d42b903418eJohann}
2451b362b15af34006e6a11974088a46d42b903418eJohann
246