16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#ifndef VP9_COMMON_VP9_ENTROPY_H_
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define VP9_COMMON_VP9_ENTROPY_H_
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
14d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "vpx/vpx_integer.h"
15ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_blockd.h"
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_common.h"
18ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_scan.h"
19ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
20dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
21dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" {
22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
23dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
24ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#define DIFF_UPDATE_PROB 252
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// Coefficient token alphabet
27d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ZERO_TOKEN      0   // 0     Extra Bits 0+0
28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ONE_TOKEN       1   // 1     Extra Bits 0+1
29d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define TWO_TOKEN       2   // 2     Extra Bits 0+1
30d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define THREE_TOKEN     3   // 3     Extra Bits 0+1
31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define FOUR_TOKEN      4   // 4     Extra Bits 0+1
32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY1_TOKEN 5   // 5-6   Extra Bits 1+1
33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY2_TOKEN 6   // 7-10  Extra Bits 2+1
34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY3_TOKEN 7   // 11-18 Extra Bits 3+1
35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY4_TOKEN 8   // 19-34 Extra Bits 4+1
36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY5_TOKEN 9   // 35-66 Extra Bits 5+1
37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define CATEGORY6_TOKEN 10  // 67+   Extra Bits 14+1
38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define EOB_TOKEN       11  // EOB   Extra Bits 0+0
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ENTROPY_TOKENS 12
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ENTROPY_NODES 11
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
44411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_pt_energy_class[ENTROPY_TOKENS]);
45ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
46ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT1_MIN_VAL    5
47ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT2_MIN_VAL    7
48ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT3_MIN_VAL   11
49ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT4_MIN_VAL   19
50ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT5_MIN_VAL   35
51ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#define CAT6_MIN_VAL   67
52ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
53ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org// Extra bit probabilities.
54ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob[1]);
55ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob[2]);
56ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob[3]);
57ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob[4]);
58ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob[5]);
59ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob[14]);
60ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
6187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
6287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob_high10[1]);
6387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob_high10[2]);
6487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob_high10[3]);
6587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob_high10[4]);
6687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob_high10[5]);
6787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob_high10[16]);
6887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob_high12[1]);
6987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob_high12[2]);
7087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob_high12[3]);
7187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob_high12[4]);
7287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob_high12[5]);
7387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob_high12[18]);
7487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
7587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
76d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define EOB_MODEL_TOKEN 3
7710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgextern const vp9_tree_index vp9_coefmodel_tree[];
7810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgtypedef struct {
80d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const vp9_tree_index *tree;
816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  const vp9_prob *prob;
8210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int len;
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int base_val;
8410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org} vp9_extra_bit;
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
86ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org// indexed by token value
87d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgextern const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS];
8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgextern const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS];
9087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgextern const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS];
9187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
93d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#define DCT_MAX_VALUE           16384
9487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
9587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define DCT_MAX_VALUE_HIGH10    65536
9687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define DCT_MAX_VALUE_HIGH12   262144
9787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* Coefficients are predicted via a 3-dimensional probability table. */
1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1011958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org#define REF_TYPES 2  // intra=0, inter=1
1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1031958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org/* Middle dimension reflects the coefficient position within the transform. */
1041958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org#define COEF_BANDS 6
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1061958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org/* Inside dimension is measure of nearby complexity, that reflects the energy
1071958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   of nearby coefficients are nonzero.  For the first coefficient (DC, unless
1081958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   block type is 0), we look at the (already encoded) blocks above and to the
1091958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   left of the current block.  The context index is then the number (0,1,or 2)
1101958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   of these blocks having nonzero coefficients.
1111958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   After decoding a coefficient, the measure is determined by the size of the
1121958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   most recently decoded coefficient.
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   Note that the intuitive meaning of this measure changes as coefficients
1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   are decoded, e.g., prior to the first token, a zero means that my neighbors
1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   are empty while, after the first token, because of the use of end-of-block,
1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   a zero means we just decoded a zero and hence guarantees that a non-zero
1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   coefficient will appear later in this block.  However, this shift
1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   in meaning is perfectly OK because our context depends also on the
1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   coefficient band (and since zigzag positions 0, 1, and 2 are in
1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org   distinct bands). */
1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
122d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define COEFF_CONTEXTS 6
123d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS)
124d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
12510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// #define ENTROPY_STATS
12610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
127d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgtypedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
128d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                                    [ENTROPY_TOKENS];
129d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgtypedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
130d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                                    [ENTROPY_NODES][2];
1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define SUBEXP_PARAM                4   /* Subexponential code parameter */
1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define MODULUS_PARAM               13  /* Modulus parameter */
1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgstruct VP9Common;
136f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.orgvoid vp9_default_coef_probs(struct VP9Common *cm);
137f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.orgvoid vp9_adapt_coef_probs(struct VP9Common *cm);
1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
13953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.orgstatic INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) {
14010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int i;
14110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  for (i = 0; i < MAX_MB_PLANE; i++) {
14253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    struct macroblockd_plane *const pd = &xd->plane[i];
14353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
14453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) *
14553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                   num_4x4_blocks_wide_lookup[plane_bsize]);
14653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vpx_memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) *
14753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                   num_4x4_blocks_high_lookup[plane_bsize]);
14810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
149d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org}
150d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
15110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// This is the index in the scan order beyond which all coefficients for
15210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// 8x8 transform and above are in the top band.
153d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// This macro is currently unused but may be used by certain implementations
15410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#define MAXBAND_INDEX 21
1551958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
156411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_8x8plus[1024]);
157411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_4x4[16]);
1581958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
15976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
160d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  return tx_size == TX_4X4 ? vp9_coefband_trans_4x4
161d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                           : vp9_coefband_trans_8x8plus;
1621958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org}
16310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
16410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// 128 lists of probabilities are stored for the following ONE node probs:
16510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// 1, 3, 5, 7, ..., 253, 255
16610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org// In between probabilities are interpolated linearly
1671958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
168d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define COEFF_PROB_MODELS 256
1691958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
17010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#define UNCONSTRAINED_NODES         3
17110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
17210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#define PIVOT_NODE                  2   // which node is pivot
1731958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
174d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
175d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgextern const vp9_prob vp9_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES];
176d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
1771958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.orgtypedef vp9_prob vp9_coeff_probs_model[REF_TYPES][COEF_BANDS]
178d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                                      [COEFF_CONTEXTS][UNCONSTRAINED_NODES];
17910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
18010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgtypedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS]
181d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                                          [COEFF_CONTEXTS]
18210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                          [UNCONSTRAINED_NODES + 1];
18310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
18410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgvoid vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full);
18510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
18676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
18776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org                                      const ENTROPY_CONTEXT *l) {
188ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;
18910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
190ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  switch (tx_size) {
191ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case TX_4X4:
192ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      above_ec = a[0] != 0;
193ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      left_ec = l[0] != 0;
19447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org      break;
195ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case TX_8X8:
196d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      above_ec = !!*(const uint16_t *)a;
197d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      left_ec  = !!*(const uint16_t *)l;
19847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org      break;
199ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case TX_16X16:
200d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      above_ec = !!*(const uint32_t *)a;
201d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      left_ec  = !!*(const uint32_t *)l;
20247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org      break;
203ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case TX_32X32:
204d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      above_ec = !!*(const uint64_t *)a;
205d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      left_ec  = !!*(const uint64_t *)l;
20647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org      break;
20747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    default:
208d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org      assert(0 && "Invalid transform size.");
20941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      break;
21010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
2111958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
212ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  return combine_entropy_contexts(above_ec, left_ec);
21347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org}
21447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
21541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic INLINE const scan_order *get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size,
21676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org                                         PLANE_TYPE type, int block_idx) {
21787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const MODE_INFO *const mi = xd->mi[0].src_mi;
218d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
219411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org  if (is_inter_block(&mi->mbmi) || type != PLANE_TYPE_Y || xd->lossless) {
220d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    return &vp9_default_scan_orders[tx_size];
221d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  } else {
222693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    const PREDICTION_MODE mode = get_y_mode(mi, block_idx);
22393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    return &vp9_scan_orders[tx_size][intra_mode_to_tx_type_lookup[mode]];
224f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  }
225ee2f97e8e0aed42dc736a058a7e8b580eef36d8djohannkoenig@chromium.org}
2263c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org
227dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
228dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
229dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
230dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
231d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif  // VP9_COMMON_VP9_ENTROPY_H_
232