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#include "entropy.h"
121b362b15af34006e6a11974088a46d42b903418eJohann#include "blockd.h"
131b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxc_int.h"
141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
151b362b15af34006e6a11974088a46d42b903418eJohann
161b362b15af34006e6a11974088a46d42b903418eJohann#include "coefupdateprobs.h"
171b362b15af34006e6a11974088a46d42b903418eJohann
181b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) =
191b362b15af34006e6a11974088a46d42b903418eJohann{
201b362b15af34006e6a11974088a46d42b903418eJohann    0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
211b362b15af34006e6a11974088a46d42b903418eJohann    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
221b362b15af34006e6a11974088a46d42b903418eJohann    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
231b362b15af34006e6a11974088a46d42b903418eJohann    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
241b362b15af34006e6a11974088a46d42b903418eJohann    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
251b362b15af34006e6a11974088a46d42b903418eJohann    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
261b362b15af34006e6a11974088a46d42b903418eJohann    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
271b362b15af34006e6a11974088a46d42b903418eJohann    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
281b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
291b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
301b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
321b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
331b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
341b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
351b362b15af34006e6a11974088a46d42b903418eJohann    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
361b362b15af34006e6a11974088a46d42b903418eJohann};
371b362b15af34006e6a11974088a46d42b903418eJohann
381b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const unsigned char, vp8_coef_bands[16]) =
391b362b15af34006e6a11974088a46d42b903418eJohann{ 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7};
401b362b15af34006e6a11974088a46d42b903418eJohann
411b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const unsigned char,
421b362b15af34006e6a11974088a46d42b903418eJohann                vp8_prev_token_class[MAX_ENTROPY_TOKENS]) =
431b362b15af34006e6a11974088a46d42b903418eJohann{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0};
441b362b15af34006e6a11974088a46d42b903418eJohann
451b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) =
461b362b15af34006e6a11974088a46d42b903418eJohann{
471b362b15af34006e6a11974088a46d42b903418eJohann    0,  1,  4,  8,
481b362b15af34006e6a11974088a46d42b903418eJohann    5,  2,  3,  6,
491b362b15af34006e6a11974088a46d42b903418eJohann    9, 12, 13, 10,
501b362b15af34006e6a11974088a46d42b903418eJohann    7, 11, 14, 15,
511b362b15af34006e6a11974088a46d42b903418eJohann};
521b362b15af34006e6a11974088a46d42b903418eJohann
531b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const short, vp8_default_inv_zig_zag[16]) =
541b362b15af34006e6a11974088a46d42b903418eJohann{
551b362b15af34006e6a11974088a46d42b903418eJohann    1,  2,  6,  7,
561b362b15af34006e6a11974088a46d42b903418eJohann    3,  5,  8, 13,
571b362b15af34006e6a11974088a46d42b903418eJohann    4,  9, 12, 14,
581b362b15af34006e6a11974088a46d42b903418eJohann   10, 11, 15, 16
591b362b15af34006e6a11974088a46d42b903418eJohann};
601b362b15af34006e6a11974088a46d42b903418eJohann
611b362b15af34006e6a11974088a46d42b903418eJohann/* vp8_default_zig_zag_mask generated with:
621b362b15af34006e6a11974088a46d42b903418eJohann
631b362b15af34006e6a11974088a46d42b903418eJohann    void vp8_init_scan_order_mask()
641b362b15af34006e6a11974088a46d42b903418eJohann    {
651b362b15af34006e6a11974088a46d42b903418eJohann        int i;
661b362b15af34006e6a11974088a46d42b903418eJohann
671b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i++)
681b362b15af34006e6a11974088a46d42b903418eJohann        {
691b362b15af34006e6a11974088a46d42b903418eJohann            vp8_default_zig_zag_mask[vp8_default_zig_zag1d[i]] = 1 << i;
701b362b15af34006e6a11974088a46d42b903418eJohann        }
711b362b15af34006e6a11974088a46d42b903418eJohann
721b362b15af34006e6a11974088a46d42b903418eJohann    }
731b362b15af34006e6a11974088a46d42b903418eJohann*/
741b362b15af34006e6a11974088a46d42b903418eJohannDECLARE_ALIGNED(16, const short, vp8_default_zig_zag_mask[16]) =
751b362b15af34006e6a11974088a46d42b903418eJohann{
761b362b15af34006e6a11974088a46d42b903418eJohann     1,    2,    32,     64,
771b362b15af34006e6a11974088a46d42b903418eJohann     4,   16,   128,   4096,
781b362b15af34006e6a11974088a46d42b903418eJohann     8,  256,  2048,   8192,
791b362b15af34006e6a11974088a46d42b903418eJohann   512, 1024, 16384, -32768
801b362b15af34006e6a11974088a46d42b903418eJohann};
811b362b15af34006e6a11974088a46d42b903418eJohann
821b362b15af34006e6a11974088a46d42b903418eJohannconst int vp8_mb_feature_data_bits[MB_LVL_MAX] = {7, 6};
831b362b15af34006e6a11974088a46d42b903418eJohann
841b362b15af34006e6a11974088a46d42b903418eJohann/* Array indices are identical to previously-existing CONTEXT_NODE indices */
851b362b15af34006e6a11974088a46d42b903418eJohann
861b362b15af34006e6a11974088a46d42b903418eJohannconst vp8_tree_index vp8_coef_tree[ 22] =     /* corresponding _CONTEXT_NODEs */
871b362b15af34006e6a11974088a46d42b903418eJohann{
881b362b15af34006e6a11974088a46d42b903418eJohann    -DCT_EOB_TOKEN, 2,                             /* 0 = EOB */
891b362b15af34006e6a11974088a46d42b903418eJohann    -ZERO_TOKEN, 4,                               /* 1 = ZERO */
901b362b15af34006e6a11974088a46d42b903418eJohann    -ONE_TOKEN, 6,                               /* 2 = ONE */
911b362b15af34006e6a11974088a46d42b903418eJohann    8, 12,                                      /* 3 = LOW_VAL */
921b362b15af34006e6a11974088a46d42b903418eJohann    -TWO_TOKEN, 10,                            /* 4 = TWO */
931b362b15af34006e6a11974088a46d42b903418eJohann    -THREE_TOKEN, -FOUR_TOKEN,                /* 5 = THREE */
941b362b15af34006e6a11974088a46d42b903418eJohann    14, 16,                                    /* 6 = HIGH_LOW */
951b362b15af34006e6a11974088a46d42b903418eJohann    -DCT_VAL_CATEGORY1, -DCT_VAL_CATEGORY2,   /* 7 = CAT_ONE */
961b362b15af34006e6a11974088a46d42b903418eJohann    18, 20,                                   /* 8 = CAT_THREEFOUR */
971b362b15af34006e6a11974088a46d42b903418eJohann    -DCT_VAL_CATEGORY3, -DCT_VAL_CATEGORY4,  /* 9 = CAT_THREE */
981b362b15af34006e6a11974088a46d42b903418eJohann    -DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6   /* 10 = CAT_FIVE */
991b362b15af34006e6a11974088a46d42b903418eJohann};
1001b362b15af34006e6a11974088a46d42b903418eJohann
1011b362b15af34006e6a11974088a46d42b903418eJohann/* vp8_coef_encodings generated with:
1021b362b15af34006e6a11974088a46d42b903418eJohann    vp8_tokens_from_tree(vp8_coef_encodings, vp8_coef_tree);
1031b362b15af34006e6a11974088a46d42b903418eJohann*/
1041b362b15af34006e6a11974088a46d42b903418eJohannvp8_token vp8_coef_encodings[MAX_ENTROPY_TOKENS] =
1051b362b15af34006e6a11974088a46d42b903418eJohann{
1061b362b15af34006e6a11974088a46d42b903418eJohann    {2, 2},
1071b362b15af34006e6a11974088a46d42b903418eJohann    {6, 3},
1081b362b15af34006e6a11974088a46d42b903418eJohann    {28, 5},
1091b362b15af34006e6a11974088a46d42b903418eJohann    {58, 6},
1101b362b15af34006e6a11974088a46d42b903418eJohann    {59, 6},
1111b362b15af34006e6a11974088a46d42b903418eJohann    {60, 6},
1121b362b15af34006e6a11974088a46d42b903418eJohann    {61, 6},
1131b362b15af34006e6a11974088a46d42b903418eJohann    {124, 7},
1141b362b15af34006e6a11974088a46d42b903418eJohann    {125, 7},
1151b362b15af34006e6a11974088a46d42b903418eJohann    {126, 7},
1161b362b15af34006e6a11974088a46d42b903418eJohann    {127, 7},
1171b362b15af34006e6a11974088a46d42b903418eJohann    {0, 1}
1181b362b15af34006e6a11974088a46d42b903418eJohann};
1191b362b15af34006e6a11974088a46d42b903418eJohann
1201b362b15af34006e6a11974088a46d42b903418eJohann/* Trees for extra bits.  Probabilities are constant and
1211b362b15af34006e6a11974088a46d42b903418eJohann   do not depend on previously encoded bits */
1221b362b15af34006e6a11974088a46d42b903418eJohann
1231b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat1[] = { 159};
1241b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat2[] = { 165, 145};
1251b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat3[] = { 173, 148, 140};
1261b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat4[] = { 176, 155, 140, 135};
1271b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat5[] = { 180, 157, 141, 134, 130};
1281b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_prob Pcat6[] =
1291b362b15af34006e6a11974088a46d42b903418eJohann{ 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129};
1301b362b15af34006e6a11974088a46d42b903418eJohann
1311b362b15af34006e6a11974088a46d42b903418eJohann
1321b362b15af34006e6a11974088a46d42b903418eJohann/* tree index tables generated with:
1331b362b15af34006e6a11974088a46d42b903418eJohann
1341b362b15af34006e6a11974088a46d42b903418eJohann    void init_bit_tree(vp8_tree_index *p, int n)
1351b362b15af34006e6a11974088a46d42b903418eJohann    {
1361b362b15af34006e6a11974088a46d42b903418eJohann        int i = 0;
1371b362b15af34006e6a11974088a46d42b903418eJohann
1381b362b15af34006e6a11974088a46d42b903418eJohann        while (++i < n)
1391b362b15af34006e6a11974088a46d42b903418eJohann        {
1401b362b15af34006e6a11974088a46d42b903418eJohann            p[0] = p[1] = i << 1;
1411b362b15af34006e6a11974088a46d42b903418eJohann            p += 2;
1421b362b15af34006e6a11974088a46d42b903418eJohann        }
1431b362b15af34006e6a11974088a46d42b903418eJohann
1441b362b15af34006e6a11974088a46d42b903418eJohann        p[0] = p[1] = 0;
1451b362b15af34006e6a11974088a46d42b903418eJohann    }
1461b362b15af34006e6a11974088a46d42b903418eJohann
1471b362b15af34006e6a11974088a46d42b903418eJohann    void init_bit_trees()
1481b362b15af34006e6a11974088a46d42b903418eJohann    {
1491b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat1, 1);
1501b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat2, 2);
1511b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat3, 3);
1521b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat4, 4);
1531b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat5, 5);
1541b362b15af34006e6a11974088a46d42b903418eJohann        init_bit_tree(cat6, 11);
1551b362b15af34006e6a11974088a46d42b903418eJohann    }
1561b362b15af34006e6a11974088a46d42b903418eJohann*/
1571b362b15af34006e6a11974088a46d42b903418eJohann
1581b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat1[2] = { 0, 0 };
1591b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat2[4] = { 2, 2, 0, 0 };
1601b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat3[6] = { 2, 2, 4, 4, 0, 0 };
1611b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat4[8] = { 2, 2, 4, 4, 6, 6, 0, 0 };
1621b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat5[10] = { 2, 2, 4, 4, 6, 6, 8, 8, 0, 0 };
1631b362b15af34006e6a11974088a46d42b903418eJohannstatic const vp8_tree_index cat6[22] = { 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12,
1641b362b15af34006e6a11974088a46d42b903418eJohann                                        14, 14, 16, 16, 18, 18, 20, 20, 0, 0 };
1651b362b15af34006e6a11974088a46d42b903418eJohann
1661b362b15af34006e6a11974088a46d42b903418eJohannconst vp8_extra_bit_struct vp8_extra_bits[12] =
1671b362b15af34006e6a11974088a46d42b903418eJohann{
1681b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 0},
1691b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 1},
1701b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 2},
1711b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 3},
1721b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 4},
1731b362b15af34006e6a11974088a46d42b903418eJohann    { cat1, Pcat1, 1, 5},
1741b362b15af34006e6a11974088a46d42b903418eJohann    { cat2, Pcat2, 2, 7},
1751b362b15af34006e6a11974088a46d42b903418eJohann    { cat3, Pcat3, 3, 11},
1761b362b15af34006e6a11974088a46d42b903418eJohann    { cat4, Pcat4, 4, 19},
1771b362b15af34006e6a11974088a46d42b903418eJohann    { cat5, Pcat5, 5, 35},
1781b362b15af34006e6a11974088a46d42b903418eJohann    { cat6, Pcat6, 11, 67},
1791b362b15af34006e6a11974088a46d42b903418eJohann    { 0, 0, 0, 0}
1801b362b15af34006e6a11974088a46d42b903418eJohann};
1811b362b15af34006e6a11974088a46d42b903418eJohann
1821b362b15af34006e6a11974088a46d42b903418eJohann#include "default_coef_probs.h"
1831b362b15af34006e6a11974088a46d42b903418eJohann
1841b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_default_coef_probs(VP8_COMMON *pc)
1851b362b15af34006e6a11974088a46d42b903418eJohann{
1861b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(pc->fc.coef_probs, default_coef_probs,
1871b362b15af34006e6a11974088a46d42b903418eJohann                   sizeof(default_coef_probs));
1881b362b15af34006e6a11974088a46d42b903418eJohann}
1891b362b15af34006e6a11974088a46d42b903418eJohann
190