1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_ENTROPY_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_ENTROPY_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_integer.h"
155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_common.h"
185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_scan.h"
195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define DIFF_UPDATE_PROB 252
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Coefficient token alphabet
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ZERO_TOKEN      0   // 0     Extra Bits 0+0
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ONE_TOKEN       1   // 1     Extra Bits 0+1
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define TWO_TOKEN       2   // 2     Extra Bits 0+1
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define THREE_TOKEN     3   // 3     Extra Bits 0+1
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define FOUR_TOKEN      4   // 4     Extra Bits 0+1
32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY1_TOKEN 5   // 5-6   Extra Bits 1+1
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY2_TOKEN 6   // 7-10  Extra Bits 2+1
34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY3_TOKEN 7   // 11-18 Extra Bits 3+1
35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY4_TOKEN 8   // 19-34 Extra Bits 4+1
36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY5_TOKEN 9   // 35-66 Extra Bits 5+1
37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY6_TOKEN 10  // 67+   Extra Bits 14+1
38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define EOB_TOKEN       11  // EOB   Extra Bits 0+0
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ENTROPY_TOKENS 12
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ENTROPY_NODES 11
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_pt_energy_class[ENTROPY_TOKENS]);
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define EOB_MODEL_TOKEN 3
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangextern const vp9_tree_index vp9_coefmodel_tree[];
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct {
509b35249446b07f40ac5fcc3205f2c048616efacchkuang  const vp9_tree_index *tree;
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const vp9_prob *prob;
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int len;
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int base_val;
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} vp9_extra_bit;
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// indexed by token value
57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS];
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define DCT_MAX_VALUE           16384
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Coefficients are predicted via a 3-dimensional probability table. */
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define REF_TYPES 2  // intra=0, inter=1
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Middle dimension reflects the coefficient position within the transform. */
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define COEF_BANDS 6
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Inside dimension is measure of nearby complexity, that reflects the energy
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   of nearby coefficients are nonzero.  For the first coefficient (DC, unless
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   block type is 0), we look at the (already encoded) blocks above and to the
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   left of the current block.  The context index is then the number (0,1,or 2)
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   of these blocks having nonzero coefficients.
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   After decoding a coefficient, the measure is determined by the size of the
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   most recently decoded coefficient.
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   Note that the intuitive meaning of this measure changes as coefficients
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   are decoded, e.g., prior to the first token, a zero means that my neighbors
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   are empty while, after the first token, because of the use of end-of-block,
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   a zero means we just decoded a zero and hence guarantees that a non-zero
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   coefficient will appear later in this block.  However, this shift
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   in meaning is perfectly OK because our context depends also on the
81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   coefficient band (and since zigzag positions 0, 1, and 2 are in
82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   distinct bands). */
83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define COEFF_CONTEXTS 6
85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS)
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #define ENTROPY_STATS
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                    [ENTROPY_TOKENS];
91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                    [ENTROPY_NODES][2];
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define SUBEXP_PARAM                4   /* Subexponential code parameter */
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MODULUS_PARAM               13  /* Modulus parameter */
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct VP9Common;
981184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_default_coef_probs(struct VP9Common *cm);
991184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_adapt_coef_probs(struct VP9Common *cm);
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1011184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) {
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int i;
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  for (i = 0; i < MAX_MB_PLANE; i++) {
1041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    struct macroblockd_plane *const pd = &xd->plane[i];
1051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
1061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vpx_memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) *
1071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                   num_4x4_blocks_wide_lookup[plane_bsize]);
1081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vpx_memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) *
1091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                   num_4x4_blocks_high_lookup[plane_bsize]);
110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// This is the index in the scan order beyond which all coefficients for
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 8x8 transform and above are in the top band.
1159b35249446b07f40ac5fcc3205f2c048616efacchkuang// This macro is currently unused but may be used by certain implementations
116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAXBAND_INDEX 21
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_8x8plus[1024]);
119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_4x4[16]);
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
1229b35249446b07f40ac5fcc3205f2c048616efacchkuang  return tx_size == TX_4X4 ? vp9_coefband_trans_4x4
1239b35249446b07f40ac5fcc3205f2c048616efacchkuang                           : vp9_coefband_trans_8x8plus;
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 128 lists of probabilities are stored for the following ONE node probs:
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 1, 3, 5, 7, ..., 253, 255
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// In between probabilities are interpolated linearly
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define COEFF_PROB_MODELS 256
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define UNCONSTRAINED_NODES         3
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define PIVOT_NODE                  2   // which node is pivot
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern const vp9_prob vp9_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES];
138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef vp9_prob vp9_coeff_probs_model[REF_TYPES][COEF_BANDS]
140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      [COEFF_CONTEXTS][UNCONSTRAINED_NODES];
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS]
143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                          [COEFF_CONTEXTS]
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                          [UNCONSTRAINED_NODES + 1];
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full);
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                      const ENTROPY_CONTEXT *l) {
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (tx_size) {
1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TX_4X4:
1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      above_ec = a[0] != 0;
1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      left_ec = l[0] != 0;
15691037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TX_8X8:
1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      above_ec = !!*(const uint16_t *)a;
1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      left_ec  = !!*(const uint16_t *)l;
16091037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TX_16X16:
1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      above_ec = !!*(const uint32_t *)a;
1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      left_ec  = !!*(const uint32_t *)l;
16491037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TX_32X32:
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      above_ec = !!*(const uint64_t *)a;
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      left_ec  = !!*(const uint64_t *)l;
16891037db265ecdd914a26e056cf69207b4f50924ehkuang      break;
16991037db265ecdd914a26e056cf69207b4f50924ehkuang    default:
170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      assert(0 && "Invalid transform size.");
171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return combine_entropy_contexts(above_ec, left_ec);
17491037db265ecdd914a26e056cf69207b4f50924ehkuang}
17591037db265ecdd914a26e056cf69207b4f50924ehkuang
176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const INLINE scan_order *get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size,
177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                                         PLANE_TYPE type, int block_idx) {
1786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const MODE_INFO *const mi = xd->mi[0];
179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (is_inter_block(&mi->mbmi) || type != PLANE_TYPE_Y || xd->lossless) {
181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return &vp9_default_scan_orders[tx_size];
182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    const MB_PREDICTION_MODE mode = get_y_mode(mi, block_idx);
184a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    return &vp9_scan_orders[tx_size][intra_mode_to_tx_type_lookup[mode]];
1851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  }
1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang}
1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
188b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_COMMON_VP9_ENTROPY_H_
193