Line data Source code
1 : /*
2 : * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef VP9_COMMON_VP9_ENTROPY_H_
12 : #define VP9_COMMON_VP9_ENTROPY_H_
13 :
14 : #include "vpx/vpx_integer.h"
15 : #include "vpx_dsp/prob.h"
16 :
17 : #include "vp9/common/vp9_common.h"
18 : #include "vp9/common/vp9_enums.h"
19 :
20 : #ifdef __cplusplus
21 : extern "C" {
22 : #endif
23 :
24 : #define DIFF_UPDATE_PROB 252
25 :
26 : // Coefficient token alphabet
27 : #define ZERO_TOKEN 0 // 0 Extra Bits 0+0
28 : #define ONE_TOKEN 1 // 1 Extra Bits 0+1
29 : #define TWO_TOKEN 2 // 2 Extra Bits 0+1
30 : #define THREE_TOKEN 3 // 3 Extra Bits 0+1
31 : #define FOUR_TOKEN 4 // 4 Extra Bits 0+1
32 : #define CATEGORY1_TOKEN 5 // 5-6 Extra Bits 1+1
33 : #define CATEGORY2_TOKEN 6 // 7-10 Extra Bits 2+1
34 : #define CATEGORY3_TOKEN 7 // 11-18 Extra Bits 3+1
35 : #define CATEGORY4_TOKEN 8 // 19-34 Extra Bits 4+1
36 : #define CATEGORY5_TOKEN 9 // 35-66 Extra Bits 5+1
37 : #define CATEGORY6_TOKEN 10 // 67+ Extra Bits 14+1
38 : #define EOB_TOKEN 11 // EOB Extra Bits 0+0
39 :
40 : #define ENTROPY_TOKENS 12
41 :
42 : #define ENTROPY_NODES 11
43 :
44 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_pt_energy_class[ENTROPY_TOKENS]);
45 :
46 : #define CAT1_MIN_VAL 5
47 : #define CAT2_MIN_VAL 7
48 : #define CAT3_MIN_VAL 11
49 : #define CAT4_MIN_VAL 19
50 : #define CAT5_MIN_VAL 35
51 : #define CAT6_MIN_VAL 67
52 :
53 : // Extra bit probabilities.
54 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob[1]);
55 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob[2]);
56 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob[3]);
57 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob[4]);
58 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob[5]);
59 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob[14]);
60 :
61 : #if CONFIG_VP9_HIGHBITDEPTH
62 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob_high10[1]);
63 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob_high10[2]);
64 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob_high10[3]);
65 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob_high10[4]);
66 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob_high10[5]);
67 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob_high10[16]);
68 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat1_prob_high12[1]);
69 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat2_prob_high12[2]);
70 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat3_prob_high12[3]);
71 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat4_prob_high12[4]);
72 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat5_prob_high12[5]);
73 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_cat6_prob_high12[18]);
74 : #endif // CONFIG_VP9_HIGHBITDEPTH
75 :
76 : #define EOB_MODEL_TOKEN 3
77 :
78 : #define DCT_MAX_VALUE 16384
79 : #if CONFIG_VP9_HIGHBITDEPTH
80 : #define DCT_MAX_VALUE_HIGH10 65536
81 : #define DCT_MAX_VALUE_HIGH12 262144
82 : #endif // CONFIG_VP9_HIGHBITDEPTH
83 :
84 : /* Coefficients are predicted via a 3-dimensional probability table. */
85 :
86 : #define REF_TYPES 2 // intra=0, inter=1
87 :
88 : /* Middle dimension reflects the coefficient position within the transform. */
89 : #define COEF_BANDS 6
90 :
91 : /* Inside dimension is measure of nearby complexity, that reflects the energy
92 : of nearby coefficients are nonzero. For the first coefficient (DC, unless
93 : block type is 0), we look at the (already encoded) blocks above and to the
94 : left of the current block. The context index is then the number (0,1,or 2)
95 : of these blocks having nonzero coefficients.
96 : After decoding a coefficient, the measure is determined by the size of the
97 : most recently decoded coefficient.
98 : Note that the intuitive meaning of this measure changes as coefficients
99 : are decoded, e.g., prior to the first token, a zero means that my neighbors
100 : are empty while, after the first token, because of the use of end-of-block,
101 : a zero means we just decoded a zero and hence guarantees that a non-zero
102 : coefficient will appear later in this block. However, this shift
103 : in meaning is perfectly OK because our context depends also on the
104 : coefficient band (and since zigzag positions 0, 1, and 2 are in
105 : distinct bands). */
106 :
107 : #define COEFF_CONTEXTS 6
108 : #define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS)
109 :
110 : // #define ENTROPY_STATS
111 :
112 : typedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
113 : [ENTROPY_TOKENS];
114 : typedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
115 : [ENTROPY_NODES][2];
116 :
117 : #define SUBEXP_PARAM 4 /* Subexponential code parameter */
118 : #define MODULUS_PARAM 13 /* Modulus parameter */
119 :
120 : struct VP9Common;
121 : void vp9_default_coef_probs(struct VP9Common *cm);
122 : void vp9_adapt_coef_probs(struct VP9Common *cm);
123 :
124 : // This is the index in the scan order beyond which all coefficients for
125 : // 8x8 transform and above are in the top band.
126 : // This macro is currently unused but may be used by certain implementations
127 : #define MAXBAND_INDEX 21
128 :
129 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_8x8plus[1024]);
130 : DECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_4x4[16]);
131 :
132 0 : static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
133 : return tx_size == TX_4X4 ? vp9_coefband_trans_4x4
134 0 : : vp9_coefband_trans_8x8plus;
135 : }
136 :
137 : // 128 lists of probabilities are stored for the following ONE node probs:
138 : // 1, 3, 5, 7, ..., 253, 255
139 : // In between probabilities are interpolated linearly
140 :
141 : #define COEFF_PROB_MODELS 255
142 :
143 : #define UNCONSTRAINED_NODES 3
144 :
145 : #define PIVOT_NODE 2 // which node is pivot
146 :
147 : #define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
148 : extern const vpx_tree_index vp9_coef_con_tree[TREE_SIZE(ENTROPY_TOKENS)];
149 : extern const vpx_prob vp9_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES];
150 :
151 : typedef vpx_prob vp9_coeff_probs_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
152 : [UNCONSTRAINED_NODES];
153 :
154 : typedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS]
155 : [COEFF_CONTEXTS]
156 : [UNCONSTRAINED_NODES + 1];
157 :
158 : void vp9_model_to_full_probs(const vpx_prob *model, vpx_prob *full);
159 :
160 : typedef char ENTROPY_CONTEXT;
161 :
162 0 : static INLINE int combine_entropy_contexts(ENTROPY_CONTEXT a,
163 : ENTROPY_CONTEXT b) {
164 0 : return (a != 0) + (b != 0);
165 : }
166 :
167 0 : static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
168 : const ENTROPY_CONTEXT *l) {
169 0 : ENTROPY_CONTEXT above_ec = 0, left_ec = 0;
170 :
171 0 : switch (tx_size) {
172 : case TX_4X4:
173 0 : above_ec = a[0] != 0;
174 0 : left_ec = l[0] != 0;
175 0 : break;
176 : case TX_8X8:
177 0 : above_ec = !!*(const uint16_t *)a;
178 0 : left_ec = !!*(const uint16_t *)l;
179 0 : break;
180 : case TX_16X16:
181 0 : above_ec = !!*(const uint32_t *)a;
182 0 : left_ec = !!*(const uint32_t *)l;
183 0 : break;
184 : case TX_32X32:
185 0 : above_ec = !!*(const uint64_t *)a;
186 0 : left_ec = !!*(const uint64_t *)l;
187 0 : break;
188 0 : default: assert(0 && "Invalid transform size."); break;
189 : }
190 :
191 0 : return combine_entropy_contexts(above_ec, left_ec);
192 : }
193 :
194 : #ifdef __cplusplus
195 : } // extern "C"
196 : #endif
197 :
198 : #endif // VP9_COMMON_VP9_ENTROPY_H_
|