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