Line data Source code
1 : /*
2 : * Copyright(c) 2019 Intel Corporation
3 : * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 : */
5 :
6 : /*
7 : * Copyright (c) 2016, Alliance for Open Media. All rights reserved
8 : *
9 : * This source code is subject to the terms of the BSD 2 Clause License and
10 : * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
11 : * was not distributed with this source code in the LICENSE file, you can
12 : * obtain it at www.aomedia.org/license/software. If the Alliance for Open
13 : * Media Patent License 1.0 was not distributed with this source code in the
14 : * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
15 : */
16 :
17 : #ifndef EbCabacContextModel_h
18 : #define EbCabacContextModel_h
19 :
20 : #include "EbDefinitions.h"
21 : #include "EbSegmentationParams.h"
22 :
23 : #ifdef __cplusplus
24 : extern "C" {
25 : #endif
26 :
27 : #define TOTAL_NUMBER_OF_QP_VALUES 64 // qp range is 0 to 63
28 :
29 : #define TOTAL_NUMBER_OF_SLICE_TYPES 3 // I, P and B
30 : /**********************************************************************************************************************/
31 : /**********************************************************************************************************************/
32 : /**********************************************************************************************************************/
33 : /********************************************************************************************************************************/
34 : //prob.h
35 :
36 : // TODO(negge): Rename this AomProb once we remove vpxbool.
37 : typedef uint16_t AomCdfProb;
38 :
39 : #if PAL_SUP
40 : typedef struct {
41 : AomCdfProb *color_map_cdf;
42 : // TODO( use packed enum type if appropriate)
43 : uint8_t token;
44 : } TOKENEXTRA;
45 : typedef struct {
46 : TOKENEXTRA *start;
47 : TOKENEXTRA *stop;
48 : unsigned int count;
49 : } TOKENLIST;
50 : #endif
51 : #define CDF_SIZE(x) ((x) + 1)
52 : #define CDF_PROB_BITS 15
53 : #define CDF_PROB_TOP (1 << CDF_PROB_BITS)
54 : #define CDF_INIT_TOP 32768
55 : #define CDF_SHIFT (15 - CDF_PROB_BITS)
56 : /*The value stored in an iCDF is CDF_PROB_TOP minus the actual cumulative
57 : probability (an "inverse" CDF).
58 : This function converts from one representation to the other (and is its own
59 : inverse).*/
60 : #define AOM_ICDF(x) (CDF_PROB_TOP - (x))
61 :
62 : #define SEG_TEMPORAL_PRED_CTXS 3
63 : #define SPATIAL_PREDICTION_PROBS 3
64 : #define SEG_TREE_PROBS (MAX_SEGMENTS - 1)
65 :
66 : #if CDF_SHIFT == 0
67 :
68 : #define AOM_CDF2(a0) AOM_ICDF(a0), AOM_ICDF(CDF_PROB_TOP), 0
69 : #define AOM_CDF3(a0, a1) AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(CDF_PROB_TOP), 0
70 : #define AOM_CDF4(a0, a1, a2) \
71 : AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(CDF_PROB_TOP), 0
72 : #define AOM_CDF5(a0, a1, a2, a3) \
73 : AOM_ICDF(a0) \
74 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(CDF_PROB_TOP), 0
75 : #define AOM_CDF6(a0, a1, a2, a3, a4) \
76 : AOM_ICDF(a0) \
77 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
78 : AOM_ICDF(CDF_PROB_TOP), 0
79 : #define AOM_CDF7(a0, a1, a2, a3, a4, a5) \
80 : AOM_ICDF(a0) \
81 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
82 : AOM_ICDF(CDF_PROB_TOP), 0
83 : #define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \
84 : AOM_ICDF(a0) \
85 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
86 : AOM_ICDF(a6), AOM_ICDF(CDF_PROB_TOP), 0
87 : #define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \
88 : AOM_ICDF(a0) \
89 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
90 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(CDF_PROB_TOP), 0
91 : #define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
92 : AOM_ICDF(a0) \
93 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
94 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(CDF_PROB_TOP), 0
95 : #define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
96 : AOM_ICDF(a0) \
97 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
98 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \
99 : AOM_ICDF(CDF_PROB_TOP), 0
100 : #define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
101 : AOM_ICDF(a0) \
102 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
103 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
104 : AOM_ICDF(CDF_PROB_TOP), 0
105 : #define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
106 : AOM_ICDF(a0) \
107 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
108 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
109 : AOM_ICDF(a11), AOM_ICDF(CDF_PROB_TOP), 0
110 : #define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
111 : AOM_ICDF(a0) \
112 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
113 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
114 : AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(CDF_PROB_TOP), 0
115 : #define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
116 : AOM_ICDF(a0) \
117 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
118 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
119 : AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(CDF_PROB_TOP), 0
120 : #define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
121 : a14) \
122 : AOM_ICDF(a0) \
123 : , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
124 : AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
125 : AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(a14), \
126 : AOM_ICDF(CDF_PROB_TOP), 0
127 :
128 : #else
129 : #define AOM_CDF2(a0) \
130 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 2) + \
131 : ((CDF_INIT_TOP - 2) >> 1)) / \
132 : ((CDF_INIT_TOP - 2)) + \
133 : 1) \
134 : , AOM_ICDF(CDF_PROB_TOP), 0
135 : #define AOM_CDF3(a0, a1) \
136 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \
137 : ((CDF_INIT_TOP - 3) >> 1)) / \
138 : ((CDF_INIT_TOP - 3)) + \
139 : 1) \
140 : , \
141 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \
142 : ((CDF_INIT_TOP - 3) >> 1)) / \
143 : ((CDF_INIT_TOP - 3)) + \
144 : 2), \
145 : AOM_ICDF(CDF_PROB_TOP), 0
146 : #define AOM_CDF4(a0, a1, a2) \
147 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
148 : ((CDF_INIT_TOP - 4) >> 1)) / \
149 : ((CDF_INIT_TOP - 4)) + \
150 : 1) \
151 : , \
152 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
153 : ((CDF_INIT_TOP - 4) >> 1)) / \
154 : ((CDF_INIT_TOP - 4)) + \
155 : 2), \
156 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
157 : ((CDF_INIT_TOP - 4) >> 1)) / \
158 : ((CDF_INIT_TOP - 4)) + \
159 : 3), \
160 : AOM_ICDF(CDF_PROB_TOP), 0
161 : #define AOM_CDF5(a0, a1, a2, a3) \
162 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
163 : ((CDF_INIT_TOP - 5) >> 1)) / \
164 : ((CDF_INIT_TOP - 5)) + \
165 : 1) \
166 : , \
167 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
168 : ((CDF_INIT_TOP - 5) >> 1)) / \
169 : ((CDF_INIT_TOP - 5)) + \
170 : 2), \
171 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
172 : ((CDF_INIT_TOP - 5) >> 1)) / \
173 : ((CDF_INIT_TOP - 5)) + \
174 : 3), \
175 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
176 : ((CDF_INIT_TOP - 5) >> 1)) / \
177 : ((CDF_INIT_TOP - 5)) + \
178 : 4), \
179 : AOM_ICDF(CDF_PROB_TOP), 0
180 : #define AOM_CDF6(a0, a1, a2, a3, a4) \
181 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
182 : ((CDF_INIT_TOP - 6) >> 1)) / \
183 : ((CDF_INIT_TOP - 6)) + \
184 : 1) \
185 : , \
186 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
187 : ((CDF_INIT_TOP - 6) >> 1)) / \
188 : ((CDF_INIT_TOP - 6)) + \
189 : 2), \
190 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
191 : ((CDF_INIT_TOP - 6) >> 1)) / \
192 : ((CDF_INIT_TOP - 6)) + \
193 : 3), \
194 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
195 : ((CDF_INIT_TOP - 6) >> 1)) / \
196 : ((CDF_INIT_TOP - 6)) + \
197 : 4), \
198 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
199 : ((CDF_INIT_TOP - 6) >> 1)) / \
200 : ((CDF_INIT_TOP - 6)) + \
201 : 5), \
202 : AOM_ICDF(CDF_PROB_TOP), 0
203 : #define AOM_CDF7(a0, a1, a2, a3, a4, a5) \
204 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
205 : ((CDF_INIT_TOP - 7) >> 1)) / \
206 : ((CDF_INIT_TOP - 7)) + \
207 : 1) \
208 : , \
209 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
210 : ((CDF_INIT_TOP - 7) >> 1)) / \
211 : ((CDF_INIT_TOP - 7)) + \
212 : 2), \
213 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
214 : ((CDF_INIT_TOP - 7) >> 1)) / \
215 : ((CDF_INIT_TOP - 7)) + \
216 : 3), \
217 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
218 : ((CDF_INIT_TOP - 7) >> 1)) / \
219 : ((CDF_INIT_TOP - 7)) + \
220 : 4), \
221 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
222 : ((CDF_INIT_TOP - 7) >> 1)) / \
223 : ((CDF_INIT_TOP - 7)) + \
224 : 5), \
225 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
226 : ((CDF_INIT_TOP - 7) >> 1)) / \
227 : ((CDF_INIT_TOP - 7)) + \
228 : 6), \
229 : AOM_ICDF(CDF_PROB_TOP), 0
230 : #define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \
231 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
232 : ((CDF_INIT_TOP - 8) >> 1)) / \
233 : ((CDF_INIT_TOP - 8)) + \
234 : 1) \
235 : , \
236 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
237 : ((CDF_INIT_TOP - 8) >> 1)) / \
238 : ((CDF_INIT_TOP - 8)) + \
239 : 2), \
240 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
241 : ((CDF_INIT_TOP - 8) >> 1)) / \
242 : ((CDF_INIT_TOP - 8)) + \
243 : 3), \
244 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
245 : ((CDF_INIT_TOP - 8) >> 1)) / \
246 : ((CDF_INIT_TOP - 8)) + \
247 : 4), \
248 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
249 : ((CDF_INIT_TOP - 8) >> 1)) / \
250 : ((CDF_INIT_TOP - 8)) + \
251 : 5), \
252 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
253 : ((CDF_INIT_TOP - 8) >> 1)) / \
254 : ((CDF_INIT_TOP - 8)) + \
255 : 6), \
256 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
257 : ((CDF_INIT_TOP - 8) >> 1)) / \
258 : ((CDF_INIT_TOP - 8)) + \
259 : 7), \
260 : AOM_ICDF(CDF_PROB_TOP), 0
261 : #define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \
262 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
263 : ((CDF_INIT_TOP - 9) >> 1)) / \
264 : ((CDF_INIT_TOP - 9)) + \
265 : 1) \
266 : , \
267 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
268 : ((CDF_INIT_TOP - 9) >> 1)) / \
269 : ((CDF_INIT_TOP - 9)) + \
270 : 2), \
271 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
272 : ((CDF_INIT_TOP - 9) >> 1)) / \
273 : ((CDF_INIT_TOP - 9)) + \
274 : 3), \
275 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
276 : ((CDF_INIT_TOP - 9) >> 1)) / \
277 : ((CDF_INIT_TOP - 9)) + \
278 : 4), \
279 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
280 : ((CDF_INIT_TOP - 9) >> 1)) / \
281 : ((CDF_INIT_TOP - 9)) + \
282 : 5), \
283 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
284 : ((CDF_INIT_TOP - 9) >> 1)) / \
285 : ((CDF_INIT_TOP - 9)) + \
286 : 6), \
287 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
288 : ((CDF_INIT_TOP - 9) >> 1)) / \
289 : ((CDF_INIT_TOP - 9)) + \
290 : 7), \
291 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
292 : ((CDF_INIT_TOP - 9) >> 1)) / \
293 : ((CDF_INIT_TOP - 9)) + \
294 : 8), \
295 : AOM_ICDF(CDF_PROB_TOP), 0
296 : #define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
297 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
298 : ((CDF_INIT_TOP - 10) >> 1)) / \
299 : ((CDF_INIT_TOP - 10)) + \
300 : 1) \
301 : , \
302 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
303 : ((CDF_INIT_TOP - 10) >> 1)) / \
304 : ((CDF_INIT_TOP - 10)) + \
305 : 2), \
306 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
307 : ((CDF_INIT_TOP - 10) >> 1)) / \
308 : ((CDF_INIT_TOP - 10)) + \
309 : 3), \
310 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
311 : ((CDF_INIT_TOP - 10) >> 1)) / \
312 : ((CDF_INIT_TOP - 10)) + \
313 : 4), \
314 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
315 : ((CDF_INIT_TOP - 10) >> 1)) / \
316 : ((CDF_INIT_TOP - 10)) + \
317 : 5), \
318 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
319 : ((CDF_INIT_TOP - 10) >> 1)) / \
320 : ((CDF_INIT_TOP - 10)) + \
321 : 6), \
322 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
323 : ((CDF_INIT_TOP - 10) >> 1)) / \
324 : ((CDF_INIT_TOP - 10)) + \
325 : 7), \
326 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
327 : ((CDF_INIT_TOP - 10) >> 1)) / \
328 : ((CDF_INIT_TOP - 10)) + \
329 : 8), \
330 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
331 : ((CDF_INIT_TOP - 10) >> 1)) / \
332 : ((CDF_INIT_TOP - 10)) + \
333 : 9), \
334 : AOM_ICDF(CDF_PROB_TOP), 0
335 : #define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
336 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
337 : ((CDF_INIT_TOP - 11) >> 1)) / \
338 : ((CDF_INIT_TOP - 11)) + \
339 : 1) \
340 : , \
341 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
342 : ((CDF_INIT_TOP - 11) >> 1)) / \
343 : ((CDF_INIT_TOP - 11)) + \
344 : 2), \
345 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
346 : ((CDF_INIT_TOP - 11) >> 1)) / \
347 : ((CDF_INIT_TOP - 11)) + \
348 : 3), \
349 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
350 : ((CDF_INIT_TOP - 11) >> 1)) / \
351 : ((CDF_INIT_TOP - 11)) + \
352 : 4), \
353 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
354 : ((CDF_INIT_TOP - 11) >> 1)) / \
355 : ((CDF_INIT_TOP - 11)) + \
356 : 5), \
357 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
358 : ((CDF_INIT_TOP - 11) >> 1)) / \
359 : ((CDF_INIT_TOP - 11)) + \
360 : 6), \
361 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
362 : ((CDF_INIT_TOP - 11) >> 1)) / \
363 : ((CDF_INIT_TOP - 11)) + \
364 : 7), \
365 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
366 : ((CDF_INIT_TOP - 11) >> 1)) / \
367 : ((CDF_INIT_TOP - 11)) + \
368 : 8), \
369 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
370 : ((CDF_INIT_TOP - 11) >> 1)) / \
371 : ((CDF_INIT_TOP - 11)) + \
372 : 9), \
373 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
374 : ((CDF_INIT_TOP - 11) >> 1)) / \
375 : ((CDF_INIT_TOP - 11)) + \
376 : 10), \
377 : AOM_ICDF(CDF_PROB_TOP), 0
378 : #define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
379 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
380 : ((CDF_INIT_TOP - 12) >> 1)) / \
381 : ((CDF_INIT_TOP - 12)) + \
382 : 1) \
383 : , \
384 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
385 : ((CDF_INIT_TOP - 12) >> 1)) / \
386 : ((CDF_INIT_TOP - 12)) + \
387 : 2), \
388 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
389 : ((CDF_INIT_TOP - 12) >> 1)) / \
390 : ((CDF_INIT_TOP - 12)) + \
391 : 3), \
392 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
393 : ((CDF_INIT_TOP - 12) >> 1)) / \
394 : ((CDF_INIT_TOP - 12)) + \
395 : 4), \
396 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
397 : ((CDF_INIT_TOP - 12) >> 1)) / \
398 : ((CDF_INIT_TOP - 12)) + \
399 : 5), \
400 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
401 : ((CDF_INIT_TOP - 12) >> 1)) / \
402 : ((CDF_INIT_TOP - 12)) + \
403 : 6), \
404 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
405 : ((CDF_INIT_TOP - 12) >> 1)) / \
406 : ((CDF_INIT_TOP - 12)) + \
407 : 7), \
408 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
409 : ((CDF_INIT_TOP - 12) >> 1)) / \
410 : ((CDF_INIT_TOP - 12)) + \
411 : 8), \
412 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
413 : ((CDF_INIT_TOP - 12) >> 1)) / \
414 : ((CDF_INIT_TOP - 12)) + \
415 : 9), \
416 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
417 : ((CDF_INIT_TOP - 12) >> 1)) / \
418 : ((CDF_INIT_TOP - 12)) + \
419 : 10), \
420 : AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
421 : ((CDF_INIT_TOP - 12) >> 1)) / \
422 : ((CDF_INIT_TOP - 12)) + \
423 : 11), \
424 : AOM_ICDF(CDF_PROB_TOP), 0
425 : #define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
426 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
427 : ((CDF_INIT_TOP - 13) >> 1)) / \
428 : ((CDF_INIT_TOP - 13)) + \
429 : 1) \
430 : , \
431 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
432 : ((CDF_INIT_TOP - 13) >> 1)) / \
433 : ((CDF_INIT_TOP - 13)) + \
434 : 2), \
435 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
436 : ((CDF_INIT_TOP - 13) >> 1)) / \
437 : ((CDF_INIT_TOP - 13)) + \
438 : 3), \
439 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
440 : ((CDF_INIT_TOP - 13) >> 1)) / \
441 : ((CDF_INIT_TOP - 13)) + \
442 : 4), \
443 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
444 : ((CDF_INIT_TOP - 13) >> 1)) / \
445 : ((CDF_INIT_TOP - 13)) + \
446 : 5), \
447 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
448 : ((CDF_INIT_TOP - 13) >> 1)) / \
449 : ((CDF_INIT_TOP - 13)) + \
450 : 6), \
451 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
452 : ((CDF_INIT_TOP - 13) >> 1)) / \
453 : ((CDF_INIT_TOP - 13)) + \
454 : 7), \
455 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
456 : ((CDF_INIT_TOP - 13) >> 1)) / \
457 : ((CDF_INIT_TOP - 13)) + \
458 : 8), \
459 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
460 : ((CDF_INIT_TOP - 13) >> 1)) / \
461 : ((CDF_INIT_TOP - 13)) + \
462 : 9), \
463 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
464 : ((CDF_INIT_TOP - 13) >> 1)) / \
465 : ((CDF_INIT_TOP - 13)) + \
466 : 10), \
467 : AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
468 : ((CDF_INIT_TOP - 13) >> 1)) / \
469 : ((CDF_INIT_TOP - 13)) + \
470 : 11), \
471 : AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
472 : ((CDF_INIT_TOP - 13) >> 1)) / \
473 : ((CDF_INIT_TOP - 13)) + \
474 : 12), \
475 : AOM_ICDF(CDF_PROB_TOP), 0
476 : #define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
477 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
478 : ((CDF_INIT_TOP - 14) >> 1)) / \
479 : ((CDF_INIT_TOP - 14)) + \
480 : 1) \
481 : , \
482 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
483 : ((CDF_INIT_TOP - 14) >> 1)) / \
484 : ((CDF_INIT_TOP - 14)) + \
485 : 2), \
486 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
487 : ((CDF_INIT_TOP - 14) >> 1)) / \
488 : ((CDF_INIT_TOP - 14)) + \
489 : 3), \
490 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
491 : ((CDF_INIT_TOP - 14) >> 1)) / \
492 : ((CDF_INIT_TOP - 14)) + \
493 : 4), \
494 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
495 : ((CDF_INIT_TOP - 14) >> 1)) / \
496 : ((CDF_INIT_TOP - 14)) + \
497 : 5), \
498 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
499 : ((CDF_INIT_TOP - 14) >> 1)) / \
500 : ((CDF_INIT_TOP - 14)) + \
501 : 6), \
502 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
503 : ((CDF_INIT_TOP - 14) >> 1)) / \
504 : ((CDF_INIT_TOP - 14)) + \
505 : 7), \
506 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
507 : ((CDF_INIT_TOP - 14) >> 1)) / \
508 : ((CDF_INIT_TOP - 14)) + \
509 : 8), \
510 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
511 : ((CDF_INIT_TOP - 14) >> 1)) / \
512 : ((CDF_INIT_TOP - 14)) + \
513 : 9), \
514 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
515 : ((CDF_INIT_TOP - 14) >> 1)) / \
516 : ((CDF_INIT_TOP - 14)) + \
517 : 10), \
518 : AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
519 : ((CDF_INIT_TOP - 14) >> 1)) / \
520 : ((CDF_INIT_TOP - 14)) + \
521 : 11), \
522 : AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
523 : ((CDF_INIT_TOP - 14) >> 1)) / \
524 : ((CDF_INIT_TOP - 14)) + \
525 : 12), \
526 : AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
527 : ((CDF_INIT_TOP - 14) >> 1)) / \
528 : ((CDF_INIT_TOP - 14)) + \
529 : 13), \
530 : AOM_ICDF(CDF_PROB_TOP), 0
531 : #define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
532 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
533 : ((CDF_INIT_TOP - 15) >> 1)) / \
534 : ((CDF_INIT_TOP - 15)) + \
535 : 1) \
536 : , \
537 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
538 : ((CDF_INIT_TOP - 15) >> 1)) / \
539 : ((CDF_INIT_TOP - 15)) + \
540 : 2), \
541 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
542 : ((CDF_INIT_TOP - 15) >> 1)) / \
543 : ((CDF_INIT_TOP - 15)) + \
544 : 3), \
545 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
546 : ((CDF_INIT_TOP - 15) >> 1)) / \
547 : ((CDF_INIT_TOP - 15)) + \
548 : 4), \
549 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
550 : ((CDF_INIT_TOP - 15) >> 1)) / \
551 : ((CDF_INIT_TOP - 15)) + \
552 : 5), \
553 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
554 : ((CDF_INIT_TOP - 15) >> 1)) / \
555 : ((CDF_INIT_TOP - 15)) + \
556 : 6), \
557 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
558 : ((CDF_INIT_TOP - 15) >> 1)) / \
559 : ((CDF_INIT_TOP - 15)) + \
560 : 7), \
561 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
562 : ((CDF_INIT_TOP - 15) >> 1)) / \
563 : ((CDF_INIT_TOP - 15)) + \
564 : 8), \
565 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
566 : ((CDF_INIT_TOP - 15) >> 1)) / \
567 : ((CDF_INIT_TOP - 15)) + \
568 : 9), \
569 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
570 : ((CDF_INIT_TOP - 15) >> 1)) / \
571 : ((CDF_INIT_TOP - 15)) + \
572 : 10), \
573 : AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
574 : ((CDF_INIT_TOP - 15) >> 1)) / \
575 : ((CDF_INIT_TOP - 15)) + \
576 : 11), \
577 : AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
578 : ((CDF_INIT_TOP - 15) >> 1)) / \
579 : ((CDF_INIT_TOP - 15)) + \
580 : 12), \
581 : AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
582 : ((CDF_INIT_TOP - 15) >> 1)) / \
583 : ((CDF_INIT_TOP - 15)) + \
584 : 13), \
585 : AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
586 : ((CDF_INIT_TOP - 15) >> 1)) / \
587 : ((CDF_INIT_TOP - 15)) + \
588 : 14), \
589 : AOM_ICDF(CDF_PROB_TOP), 0
590 : #define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
591 : a14) \
592 : AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
593 : ((CDF_INIT_TOP - 16) >> 1)) / \
594 : ((CDF_INIT_TOP - 16)) + \
595 : 1) \
596 : , \
597 : AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
598 : ((CDF_INIT_TOP - 16) >> 1)) / \
599 : ((CDF_INIT_TOP - 16)) + \
600 : 2), \
601 : AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
602 : ((CDF_INIT_TOP - 16) >> 1)) / \
603 : ((CDF_INIT_TOP - 16)) + \
604 : 3), \
605 : AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
606 : ((CDF_INIT_TOP - 16) >> 1)) / \
607 : ((CDF_INIT_TOP - 16)) + \
608 : 4), \
609 : AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
610 : ((CDF_INIT_TOP - 16) >> 1)) / \
611 : ((CDF_INIT_TOP - 16)) + \
612 : 5), \
613 : AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
614 : ((CDF_INIT_TOP - 16) >> 1)) / \
615 : ((CDF_INIT_TOP - 16)) + \
616 : 6), \
617 : AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
618 : ((CDF_INIT_TOP - 16) >> 1)) / \
619 : ((CDF_INIT_TOP - 16)) + \
620 : 7), \
621 : AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
622 : ((CDF_INIT_TOP - 16) >> 1)) / \
623 : ((CDF_INIT_TOP - 16)) + \
624 : 8), \
625 : AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
626 : ((CDF_INIT_TOP - 16) >> 1)) / \
627 : ((CDF_INIT_TOP - 16)) + \
628 : 9), \
629 : AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
630 : ((CDF_INIT_TOP - 16) >> 1)) / \
631 : ((CDF_INIT_TOP - 16)) + \
632 : 10), \
633 : AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
634 : ((CDF_INIT_TOP - 16) >> 1)) / \
635 : ((CDF_INIT_TOP - 16)) + \
636 : 11), \
637 : AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
638 : ((CDF_INIT_TOP - 16) >> 1)) / \
639 : ((CDF_INIT_TOP - 16)) + \
640 : 12), \
641 : AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
642 : ((CDF_INIT_TOP - 16) >> 1)) / \
643 : ((CDF_INIT_TOP - 16)) + \
644 : 13), \
645 : AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
646 : ((CDF_INIT_TOP - 16) >> 1)) / \
647 : ((CDF_INIT_TOP - 16)) + \
648 : 14), \
649 : AOM_ICDF((((a14)-15) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
650 : ((CDF_INIT_TOP - 16) >> 1)) / \
651 : ((CDF_INIT_TOP - 16)) + \
652 : 15), \
653 : AOM_ICDF(CDF_PROB_TOP), 0
654 :
655 : #endif
656 :
657 13673000 : static INLINE uint8_t get_prob(uint32_t num, uint32_t den) {
658 : assert(den != 0);
659 : {
660 13673000 : const int32_t p = (int32_t)(((uint64_t)num * 256 + (den >> 1)) / den);
661 : // (p > 255) ? 255 : (p < 1) ? 1 : p;
662 13673000 : const int32_t clipped_prob = p | ((255 - p) >> 23) | (p == 0);
663 13673000 : return (uint8_t)clipped_prob;
664 : }
665 : }
666 :
667 1197702 : static INLINE void update_cdf(AomCdfProb *cdf, int32_t val, int32_t nsymbs) {
668 : int32_t rate;
669 : int32_t i/*,tmp*/;
670 : AomCdfProb tmp;
671 :
672 : static const int32_t nsymbs2speed[17] = { 0, 0, 1, 1, 2, 2, 2, 2, 2,
673 : 2, 2, 2, 2, 2, 2, 2, 2 };
674 : assert(nsymbs < 17);
675 1197702 : rate = 3 + (cdf[nsymbs] > 15) + (cdf[nsymbs] > 31) +
676 1197702 : nsymbs2speed[nsymbs]; // + get_msb(nsymbs);
677 1197702 : tmp = AOM_ICDF(0);
678 :
679 : // Single loop (faster)
680 4655129 : for (i = 0; i < nsymbs - 1; ++i) {
681 3457428 : tmp = (i == val) ? 0 : tmp;
682 3457428 : if (tmp < cdf[i])
683 2616935 : cdf[i] -= ((cdf[i] - tmp) >> rate);
684 : else
685 840494 : cdf[i] += ((tmp - cdf[i]) >> rate);
686 : }
687 1197702 : cdf[nsymbs] += (cdf[nsymbs] < 32);
688 1197702 : }
689 : /**********************************************************************************************************************/
690 : // entropy.h
691 : #define TOKEN_CDF_Q_CTXS 4
692 :
693 : #define TXB_SKIP_CONTEXTS 13
694 :
695 : #define EOB_COEF_CONTEXTS 22
696 :
697 : #define SIG_COEF_CONTEXTS_2D 26
698 : #define SIG_COEF_CONTEXTS_1D 16
699 : #define SIG_COEF_CONTEXTS_EOB 4
700 : #define SIG_COEF_CONTEXTS (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D)
701 :
702 : #define COEFF_BASE_CONTEXTS (SIG_COEF_CONTEXTS)
703 : #define DC_SIGN_CONTEXTS 3
704 :
705 : #define BR_TMP_OFFSET 12
706 : #define BR_REF_CAT 4
707 : #define LEVEL_CONTEXTS 21
708 :
709 : #define NUM_BASE_LEVELS 2
710 :
711 : #define BR_CDF_SIZE (4)
712 : #define COEFF_BASE_RANGE (4 * (BR_CDF_SIZE - 1))
713 :
714 : #define COEFF_CONTEXT_BITS 6
715 : #define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
716 : #define MAX_BASE_BR_RANGE (COEFF_BASE_RANGE + NUM_BASE_LEVELS + 1)
717 :
718 : #define BASE_CONTEXT_POSITION_NUM 12
719 :
720 : #define DCT_MAX_VALUE 16384
721 : #define DCT_MAX_VALUE_HIGH10 65536
722 : #define DCT_MAX_VALUE_HIGH12 262144
723 :
724 : /* Coefficients are predicted via a 3-dimensional probability table indexed on
725 : * REF_TYPES, COEF_BANDS and COEF_CONTEXTS. */
726 : #define REF_TYPES 2 // intra=0, inter=1
727 :
728 : struct AV1Common;
729 : struct FrameContexts;
730 : void eb_av1_reset_cdf_symbol_counters(struct FrameContexts *fc);
731 : void eb_av1_default_coef_probs(struct FrameContexts *fc, int32_t base_qindex);
732 : void init_mode_probs(struct FrameContexts *fc);
733 :
734 : struct FrameContexts;
735 :
736 : typedef char EntropyContext;
737 :
738 : static INLINE int32_t combine_entropy_contexts(EntropyContext a,
739 : EntropyContext b) {
740 : return (a != 0) + (b != 0);
741 : }
742 :
743 : static INLINE int32_t get_entropy_context(TxSize tx_size, const EntropyContext *a,
744 : const EntropyContext *l) {
745 : EntropyContext above_ec = 0, left_ec = 0;
746 :
747 : switch (tx_size) {
748 : case TX_4X4:
749 : above_ec = a[0] != 0;
750 : left_ec = l[0] != 0;
751 : break;
752 : case TX_4X8:
753 : above_ec = a[0] != 0;
754 : left_ec = !!*(const uint16_t *)l;
755 : break;
756 : case TX_8X4:
757 : above_ec = !!*(const uint16_t *)a;
758 : left_ec = l[0] != 0;
759 : break;
760 : case TX_8X16:
761 : above_ec = !!*(const uint16_t *)a;
762 : left_ec = !!*(const uint32_t *)l;
763 : break;
764 : case TX_16X8:
765 : above_ec = !!*(const uint32_t *)a;
766 : left_ec = !!*(const uint16_t *)l;
767 : break;
768 : case TX_16X32:
769 : above_ec = !!*(const uint32_t *)a;
770 : left_ec = !!*(const uint64_t *)l;
771 : break;
772 : case TX_32X16:
773 : above_ec = !!*(const uint64_t *)a;
774 : left_ec = !!*(const uint32_t *)l;
775 : break;
776 : case TX_8X8:
777 : above_ec = !!*(const uint16_t *)a;
778 : left_ec = !!*(const uint16_t *)l;
779 : break;
780 : case TX_16X16:
781 : above_ec = !!*(const uint32_t *)a;
782 : left_ec = !!*(const uint32_t *)l;
783 : break;
784 : case TX_32X32:
785 : above_ec = !!*(const uint64_t *)a;
786 : left_ec = !!*(const uint64_t *)l;
787 : break;
788 : case TX_64X64:
789 : above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
790 : left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
791 : break;
792 : case TX_32X64:
793 : above_ec = !!*(const uint64_t *)a;
794 : left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
795 : break;
796 : case TX_64X32:
797 : above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
798 : left_ec = !!*(const uint64_t *)l;
799 : break;
800 : case TX_4X16:
801 : above_ec = a[0] != 0;
802 : left_ec = !!*(const uint32_t *)l;
803 : break;
804 : case TX_16X4:
805 : above_ec = !!*(const uint32_t *)a;
806 : left_ec = l[0] != 0;
807 : break;
808 : case TX_8X32:
809 : above_ec = !!*(const uint16_t *)a;
810 : left_ec = !!*(const uint64_t *)l;
811 : break;
812 : case TX_32X8:
813 : above_ec = !!*(const uint64_t *)a;
814 : left_ec = !!*(const uint16_t *)l;
815 : break;
816 : case TX_16X64:
817 : above_ec = !!*(const uint32_t *)a;
818 : left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
819 : break;
820 : case TX_64X16:
821 : above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
822 : left_ec = !!*(const uint32_t *)l;
823 : break;
824 : default: assert(0 && "Invalid transform size."); break;
825 : }
826 : return combine_entropy_contexts(above_ec, left_ec);
827 : }
828 :
829 : //**********************************************************************************************************************//
830 : // txb_Common.h
831 : static const TxClass tx_type_to_class[TX_TYPES] = {
832 : TX_CLASS_2D, // DCT_DCT
833 : TX_CLASS_2D, // ADST_DCT
834 : TX_CLASS_2D, // DCT_ADST
835 : TX_CLASS_2D, // ADST_ADST
836 : TX_CLASS_2D, // FLIPADST_DCT
837 : TX_CLASS_2D, // DCT_FLIPADST
838 : TX_CLASS_2D, // FLIPADST_FLIPADST
839 : TX_CLASS_2D, // ADST_FLIPADST
840 : TX_CLASS_2D, // FLIPADST_ADST
841 : TX_CLASS_2D, // IDTX
842 : TX_CLASS_VERT, // V_DCT
843 : TX_CLASS_HORIZ, // H_DCT
844 : TX_CLASS_VERT, // V_ADST
845 : TX_CLASS_HORIZ, // H_ADST
846 : TX_CLASS_VERT, // V_FLIPADST
847 : TX_CLASS_HORIZ, // H_FLIPADST
848 : };
849 : /**********************************************************************************************************************/
850 : // entropymv.h
851 :
852 : #define MV_UPDATE_PROB 252
853 :
854 : /* Symbols for coding which components are zero jointly */
855 : #define MV_JOINTS 4
856 : typedef enum MvJointType
857 : {
858 : MV_JOINT_ZERO = 0, /* Zero vector */
859 : MV_JOINT_HNZVZ = 1, /* Vert zero, hor nonzero */
860 : MV_JOINT_HZVNZ = 2, /* Hor zero, vert nonzero */
861 : MV_JOINT_HNZVNZ = 3, /* Both components nonzero */
862 : } MvJointType;
863 :
864 16334 : static INLINE int32_t mv_joint_vertical(MvJointType type) {
865 16334 : return type == MV_JOINT_HZVNZ || type == MV_JOINT_HNZVNZ;
866 : }
867 :
868 16334 : static INLINE int32_t mv_joint_horizontal(MvJointType type) {
869 16334 : return type == MV_JOINT_HNZVZ || type == MV_JOINT_HNZVNZ;
870 : }
871 :
872 : /* Symbols for coding magnitude class of nonzero components */
873 : #define MV_CLASSES 11
874 : typedef enum MvClassType
875 : {
876 : MV_CLASS_0 = 0, /* (0, 2] integer pel */
877 : MV_CLASS_1 = 1, /* (2, 4] integer pel */
878 : MV_CLASS_2 = 2, /* (4, 8] integer pel */
879 : MV_CLASS_3 = 3, /* (8, 16] integer pel */
880 : MV_CLASS_4 = 4, /* (16, 32] integer pel */
881 : MV_CLASS_5 = 5, /* (32, 64] integer pel */
882 : MV_CLASS_6 = 6, /* (64, 128] integer pel */
883 : MV_CLASS_7 = 7, /* (128, 256] integer pel */
884 : MV_CLASS_8 = 8, /* (256, 512] integer pel */
885 : MV_CLASS_9 = 9, /* (512, 1024] integer pel */
886 : MV_CLASS_10 = 10, /* (1024,2048] integer pel */
887 : } MvClassType;
888 :
889 : #define CLASS0_BITS 1 /* bits at integer precision for class 0 */
890 : #define CLASS0_SIZE (1 << CLASS0_BITS)
891 : #define MV_OFFSET_BITS (MV_CLASSES + CLASS0_BITS - 2)
892 : #define MV_BITS_CONTEXTS 6
893 : #define MV_FP_SIZE 4
894 :
895 : #define MV_MAX_BITS (MV_CLASSES + CLASS0_BITS + 2)
896 : #define MV_MAX ((1 << MV_MAX_BITS) - 1)
897 : #define MV_VALS ((MV_MAX << 1) + 1)
898 :
899 : #define MV_IN_USE_BITS 14
900 : #define MV_UPP (1 << MV_IN_USE_BITS)
901 : #define MV_LOW (-(1 << MV_IN_USE_BITS))
902 :
903 : typedef struct NmvComponent
904 : {
905 : AomCdfProb classes_cdf[CDF_SIZE(MV_CLASSES)];
906 : AomCdfProb class0_fp_cdf[CLASS0_SIZE][CDF_SIZE(MV_FP_SIZE)];
907 : AomCdfProb fp_cdf[CDF_SIZE(MV_FP_SIZE)];
908 : AomCdfProb sign_cdf[CDF_SIZE(2)];
909 : AomCdfProb class0_hp_cdf[CDF_SIZE(2)];
910 : AomCdfProb hp_cdf[CDF_SIZE(2)];
911 : AomCdfProb class0_cdf[CDF_SIZE(CLASS0_SIZE)];
912 : AomCdfProb bits_cdf[MV_OFFSET_BITS][CDF_SIZE(2)];
913 : } NmvComponent;
914 :
915 : typedef struct NmvContext
916 : {
917 : AomCdfProb joints_cdf[CDF_SIZE(MV_JOINTS)];
918 : NmvComponent comps[2];
919 : } NmvContext;
920 :
921 : MvClassType av1_get_mv_class(int32_t z, int32_t *offset);
922 :
923 : typedef enum MvSubpelPrecision
924 : {
925 : MV_SUBPEL_NONE = -1,
926 : MV_SUBPEL_LOW_PRECISION = 0,
927 : MV_SUBPEL_HIGH_PRECISION,
928 : } MvSubpelPrecision;
929 : /**********************************************************************************************************************/
930 : // entropymode.h
931 : #define BlockSize_GROUPS 4
932 :
933 : #define TX_SIZE_CONTEXTS 3
934 :
935 : #define INTER_OFFSET(mode) ((mode)-NEARESTMV)
936 : #define INTER_COMPOUND_OFFSET(mode) (uint8_t)((mode)-NEAREST_NEARESTMV)
937 :
938 : // Number of possible contexts for a color index.
939 : // As can be seen from av1_get_palette_color_index_context(), the possible
940 : // contexts are (2,0,0), (2,2,1), (3,2,0), (4,1,0), (5,0,0). These are mapped to
941 : // a value from 0 to 4 using 'palette_color_index_context_lookup' table.
942 : #define PALETTE_COLOR_INDEX_CONTEXTS 5
943 :
944 : // Palette Y mode context for a block is determined by number of neighboring
945 : // blocks (top and/or left) using a palette for Y plane. So, possible Y mode'
946 : // context values are:
947 : // 0 if neither left nor top block uses palette for Y plane,
948 : // 1 if exactly one of left or top block uses palette for Y plane, and
949 : // 2 if both left and top blocks use palette for Y plane.
950 : #define PALETTE_Y_MODE_CONTEXTS 3
951 :
952 : // Palette UV mode context for a block is determined by whether this block uses
953 : // palette for the Y plane. So, possible values are:
954 : // 0 if this block doesn't use palette for Y plane.
955 : // 1 if this block uses palette for Y plane (i.e. Y palette size > 0).
956 : #define PALETTE_UV_MODE_CONTEXTS 2
957 :
958 : // Map the number of pixels in a block size to a context
959 : // 16(BLOCK_4X4) -> 0
960 : // 32(BLOCK_4X8, BLOCK_8X4) -> 1
961 : // 64(BLOCK_8X8, BLOCK_4x16, BLOCK_16X4) -> 2
962 : // ...
963 : // 4096(BLOCK_64X64) -> 8
964 : #define PALATTE_BSIZE_CTXS 7
965 :
966 : #define KF_MODE_CONTEXTS 5
967 :
968 : #define SEG_TEMPORAL_PRED_CTXS 3
969 : #define SPATIAL_PREDICTION_PROBS 3
970 :
971 : typedef struct {
972 : const int16_t *scan;
973 : const int16_t *iscan;
974 : const int16_t *neighbors;
975 : } ScanOrder;
976 :
977 : struct segmentation_probs {
978 : AomCdfProb tree_cdf[CDF_SIZE(MAX_SEGMENTS)];
979 : AomCdfProb pred_cdf[SEG_TEMPORAL_PRED_CTXS][CDF_SIZE(2)];
980 : AomCdfProb spatial_pred_seg_cdf[SPATIAL_PREDICTION_PROBS]
981 : [CDF_SIZE(MAX_SEGMENTS)];
982 : };
983 :
984 : typedef struct FrameContexts {
985 : AomCdfProb txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
986 : AomCdfProb eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
987 : [CDF_SIZE(2)];
988 : AomCdfProb dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
989 : AomCdfProb eob_flag_cdf16[PLANE_TYPES][2][CDF_SIZE(5)];
990 : AomCdfProb eob_flag_cdf32[PLANE_TYPES][2][CDF_SIZE(6)];
991 : AomCdfProb eob_flag_cdf64[PLANE_TYPES][2][CDF_SIZE(7)];
992 : AomCdfProb eob_flag_cdf128[PLANE_TYPES][2][CDF_SIZE(8)];
993 : AomCdfProb eob_flag_cdf256[PLANE_TYPES][2][CDF_SIZE(9)];
994 : AomCdfProb eob_flag_cdf512[PLANE_TYPES][2][CDF_SIZE(10)];
995 : AomCdfProb eob_flag_cdf1024[PLANE_TYPES][2][CDF_SIZE(11)];
996 : AomCdfProb coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]
997 : [CDF_SIZE(3)];
998 : AomCdfProb coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
999 : [CDF_SIZE(4)];
1000 : AomCdfProb coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
1001 : [CDF_SIZE(BR_CDF_SIZE)];
1002 :
1003 : AomCdfProb newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)];
1004 : AomCdfProb zeromv_cdf[GLOBALMV_MODE_CONTEXTS][CDF_SIZE(2)];
1005 : AomCdfProb refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)];
1006 : AomCdfProb drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
1007 :
1008 : AomCdfProb inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
1009 : [CDF_SIZE(INTER_COMPOUND_MODES)];
1010 : AomCdfProb compound_type_cdf[BlockSizeS_ALL][CDF_SIZE(MASKED_COMPOUND_TYPES)];
1011 : AomCdfProb wedge_idx_cdf[BlockSizeS_ALL][CDF_SIZE(16)];
1012 : AomCdfProb interintra_cdf[BlockSize_GROUPS][CDF_SIZE(2)];
1013 : AomCdfProb wedge_interintra_cdf[BlockSizeS_ALL][CDF_SIZE(2)];
1014 : AomCdfProb interintra_mode_cdf[BlockSize_GROUPS]
1015 : [CDF_SIZE(INTERINTRA_MODES)];
1016 : AomCdfProb motion_mode_cdf[BlockSizeS_ALL][CDF_SIZE(MOTION_MODES)];
1017 : AomCdfProb obmc_cdf[BlockSizeS_ALL][CDF_SIZE(2)];
1018 : AomCdfProb palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
1019 : AomCdfProb palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
1020 : AomCdfProb palette_y_color_index_cdf[PALETTE_SIZES]
1021 : [PALETTE_COLOR_INDEX_CONTEXTS]
1022 : [CDF_SIZE(PALETTE_COLORS)];
1023 : AomCdfProb palette_uv_color_index_cdf[PALETTE_SIZES]
1024 : [PALETTE_COLOR_INDEX_CONTEXTS]
1025 : [CDF_SIZE(PALETTE_COLORS)];
1026 : AomCdfProb palette_y_mode_cdf[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS]
1027 : [CDF_SIZE(2)];
1028 : AomCdfProb palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
1029 : AomCdfProb comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
1030 : AomCdfProb single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
1031 : AomCdfProb comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)];
1032 : AomCdfProb uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
1033 : [CDF_SIZE(2)];
1034 :
1035 : AomCdfProb comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)];
1036 : AomCdfProb comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)];
1037 : AomCdfProb txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)];
1038 : AomCdfProb compound_index_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
1039 : AomCdfProb comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
1040 : AomCdfProb skip_mode_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
1041 : AomCdfProb skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
1042 : AomCdfProb intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)];
1043 : NmvContext nmvc;
1044 : NmvContext ndvc;
1045 : AomCdfProb intrabc_cdf[CDF_SIZE(2)];
1046 : struct segmentation_probs seg;
1047 : AomCdfProb filter_intra_cdfs[BlockSizeS_ALL][CDF_SIZE(2)];
1048 : AomCdfProb filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)];
1049 : AomCdfProb switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
1050 : AomCdfProb wiener_restore_cdf[CDF_SIZE(2)];
1051 : AomCdfProb sgrproj_restore_cdf[CDF_SIZE(2)];
1052 : AomCdfProb y_mode_cdf[BlockSize_GROUPS][CDF_SIZE(INTRA_MODES)];
1053 : AomCdfProb uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES]
1054 : [CDF_SIZE(UV_INTRA_MODES)];
1055 : AomCdfProb partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)];
1056 :
1057 : AomCdfProb switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
1058 : [CDF_SIZE(SWITCHABLE_FILTERS)];
1059 : /* kf_y_cdf is discarded after use, so does not require persistent storage.
1060 : However, we keep it with the other CDFs in this struct since it needs to
1061 : be copied to each tile to support parallelism just like the others.
1062 : */
1063 : AomCdfProb kf_y_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
1064 : [CDF_SIZE(INTRA_MODES)];
1065 :
1066 : AomCdfProb angle_delta_cdf[DIRECTIONAL_MODES]
1067 : [CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)];
1068 :
1069 : AomCdfProb tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS]
1070 : [CDF_SIZE(MAX_TX_DEPTH + 1)];
1071 : AomCdfProb delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
1072 : AomCdfProb delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)];
1073 : AomCdfProb delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)];
1074 : AomCdfProb intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
1075 : [CDF_SIZE(TX_TYPES)];
1076 : AomCdfProb inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
1077 : [CDF_SIZE(TX_TYPES)];
1078 : AomCdfProb cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
1079 : AomCdfProb cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
1080 : int32_t initialized;
1081 : } FRAME_CONTEXT;
1082 :
1083 : extern const AomCdfProb default_kf_y_mode_cdf[KF_MODE_CONTEXTS]
1084 : [KF_MODE_CONTEXTS]
1085 : [CDF_SIZE(INTRA_MODES)];
1086 :
1087 : static const int32_t av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = {
1088 : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1089 : { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1090 : { 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1091 : { 1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0 },
1092 : { 3, 4, 5, 8, 6, 7, 9, 10, 11, 0, 1, 2, 0, 0, 0, 0 },
1093 : { 7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6 },
1094 : };
1095 :
1096 : static const int32_t av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES] = {
1097 : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1098 : { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1099 : { 9, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1100 : { 9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1101 : { 9, 10, 11, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0 },
1102 : { 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8 },
1103 : };
1104 :
1105 : void av1_set_default_ref_deltas(int8_t *ref_deltas);
1106 : void av1_set_default_mode_deltas(int8_t *mode_deltas);
1107 : void av1_setup_frame_contexts(struct AV1Common *cm);
1108 : void av1_setup_past_independence(struct AV1Common *cm);
1109 :
1110 0 : static INLINE int32_t av1_ceil_log2(int32_t n) {
1111 0 : if (n < 2) return 0;
1112 0 : int32_t i = 1, p = 2;
1113 0 : while (p < n) {
1114 0 : i++;
1115 0 : p = p << 1;
1116 : }
1117 0 : return i;
1118 : }
1119 :
1120 : /**********************************************************************************************************************/
1121 : // onyxc_int.h
1122 :
1123 : /**********************************************************************************************************************/
1124 : /**********************************************************************************************************************/
1125 : /**********************************************************************************************************************/
1126 :
1127 : #ifdef __cplusplus
1128 : }
1129 : #endif
1130 : #endif //EbCabacContextModel_h
|