blob: cf8cabb18b82961a49102e4f552864152070cd21 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu9c01aa12016-09-01 14:32:49 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu9c01aa12016-09-01 14:32:49 -07004 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AOM_DSP_PROB_H_
13#define AOM_DSP_PROB_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
James Zern751f26a2016-09-28 17:39:05 -070015#include <assert.h>
Dake Heb79f1b62017-11-19 12:10:59 -080016#include <stdio.h>
James Zern751f26a2016-09-28 17:39:05 -070017
Yaowu Xuf883b422016-08-30 14:01:10 -070018#include "./aom_config.h"
19#include "./aom_dsp_common.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070020
Thomas9ac55082016-09-23 18:04:17 +010021#include "aom_ports/bitops.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070022#include "aom_ports/mem.h"
23
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070024#include "aom_dsp/entcode.h"
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070025
Yaowu Xuc27fc142016-08-22 16:08:15 -070026#ifdef __cplusplus
27extern "C" {
28#endif
29
Alex Conversea1ac9722016-10-12 15:59:58 -070030// TODO(negge): Rename this aom_prob once we remove vpxbool.
31typedef uint16_t aom_cdf_prob;
32
Thomas Daviesf3eb8402017-02-20 18:20:20 +000033#define CDF_SIZE(x) ((x) + 1)
Thomas Daviesf3eb8402017-02-20 18:20:20 +000034
Alex Converse2ce4bd42017-02-01 12:00:31 -080035#define CDF_PROB_BITS 15
36#define CDF_PROB_TOP (1 << CDF_PROB_BITS)
Thomas Daede837262b2017-11-06 20:07:01 -080037#define CDF_INIT_TOP 32768
38#define CDF_SHIFT (15 - CDF_PROB_BITS)
39/*The value stored in an iCDF is CDF_PROB_TOP minus the actual cumulative
40 probability (an "inverse" CDF).
41 This function converts from one representation to the other (and is its own
42 inverse).*/
43#define AOM_ICDF(x) (CDF_PROB_TOP - (x))
Alex Converse2ce4bd42017-02-01 12:00:31 -080044
Thomas Daede837262b2017-11-06 20:07:01 -080045#if CDF_SHIFT == 0
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070046
Thomas Daedee82e5772017-11-06 17:27:10 -080047#define AOM_CDF2(a0) AOM_ICDF(a0), AOM_ICDF(CDF_PROB_TOP), 0
48#define AOM_CDF3(a0, a1) AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(CDF_PROB_TOP), 0
49#define AOM_CDF4(a0, a1, a2) \
50 AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(CDF_PROB_TOP), 0
51#define AOM_CDF5(a0, a1, a2, a3) \
52 AOM_ICDF(a0) \
53 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(CDF_PROB_TOP), 0
54#define AOM_CDF6(a0, a1, a2, a3, a4) \
55 AOM_ICDF(a0) \
56 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
57 AOM_ICDF(CDF_PROB_TOP), 0
58#define AOM_CDF7(a0, a1, a2, a3, a4, a5) \
59 AOM_ICDF(a0) \
60 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
61 AOM_ICDF(CDF_PROB_TOP), 0
62#define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \
63 AOM_ICDF(a0) \
64 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
65 AOM_ICDF(a6), AOM_ICDF(CDF_PROB_TOP), 0
66#define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \
67 AOM_ICDF(a0) \
68 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
69 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(CDF_PROB_TOP), 0
70#define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
71 AOM_ICDF(a0) \
72 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
73 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(CDF_PROB_TOP), 0
74#define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
75 AOM_ICDF(a0) \
76 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
77 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \
78 AOM_ICDF(CDF_PROB_TOP), 0
79#define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
80 AOM_ICDF(a0) \
81 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
82 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
83 AOM_ICDF(CDF_PROB_TOP), 0
84#define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
85 AOM_ICDF(a0) \
86 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
87 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
88 AOM_ICDF(a11), AOM_ICDF(CDF_PROB_TOP), 0
89#define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
90 AOM_ICDF(a0) \
91 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
92 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
93 AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(CDF_PROB_TOP), 0
94#define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
95 AOM_ICDF(a0) \
96 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
97 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \
98 AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(CDF_PROB_TOP), 0
99#define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
100 a14) \
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(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(a14), \
105 AOM_ICDF(CDF_PROB_TOP), 0
106
Thomas Daede837262b2017-11-06 20:07:01 -0800107#else
108#define AOM_CDF2(a0) \
109 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 2) + \
110 ((CDF_INIT_TOP - 2) >> 1)) / \
111 ((CDF_INIT_TOP - 2)) + \
112 1) \
113 , AOM_ICDF(CDF_PROB_TOP), 0
114#define AOM_CDF3(a0, a1) \
115 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \
116 ((CDF_INIT_TOP - 3) >> 1)) / \
117 ((CDF_INIT_TOP - 3)) + \
118 1) \
119 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \
120 ((CDF_INIT_TOP - 3) >> 1)) / \
121 ((CDF_INIT_TOP - 3)) + \
122 2), \
123 AOM_ICDF(CDF_PROB_TOP), 0
124#define AOM_CDF4(a0, a1, a2) \
125 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
126 ((CDF_INIT_TOP - 4) >> 1)) / \
127 ((CDF_INIT_TOP - 4)) + \
128 1) \
129 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
130 ((CDF_INIT_TOP - 4) >> 1)) / \
131 ((CDF_INIT_TOP - 4)) + \
132 2), \
133 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \
134 ((CDF_INIT_TOP - 4) >> 1)) / \
135 ((CDF_INIT_TOP - 4)) + \
136 3), \
137 AOM_ICDF(CDF_PROB_TOP), 0
138#define AOM_CDF5(a0, a1, a2, a3) \
139 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
140 ((CDF_INIT_TOP - 5) >> 1)) / \
141 ((CDF_INIT_TOP - 5)) + \
142 1) \
143 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
144 ((CDF_INIT_TOP - 5) >> 1)) / \
145 ((CDF_INIT_TOP - 5)) + \
146 2), \
147 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
148 ((CDF_INIT_TOP - 5) >> 1)) / \
149 ((CDF_INIT_TOP - 5)) + \
150 3), \
151 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \
152 ((CDF_INIT_TOP - 5) >> 1)) / \
153 ((CDF_INIT_TOP - 5)) + \
154 4), \
155 AOM_ICDF(CDF_PROB_TOP), 0
156#define AOM_CDF6(a0, a1, a2, a3, a4) \
157 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
158 ((CDF_INIT_TOP - 6) >> 1)) / \
159 ((CDF_INIT_TOP - 6)) + \
160 1) \
161 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
162 ((CDF_INIT_TOP - 6) >> 1)) / \
163 ((CDF_INIT_TOP - 6)) + \
164 2), \
165 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
166 ((CDF_INIT_TOP - 6) >> 1)) / \
167 ((CDF_INIT_TOP - 6)) + \
168 3), \
169 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
170 ((CDF_INIT_TOP - 6) >> 1)) / \
171 ((CDF_INIT_TOP - 6)) + \
172 4), \
173 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \
174 ((CDF_INIT_TOP - 6) >> 1)) / \
175 ((CDF_INIT_TOP - 6)) + \
176 5), \
177 AOM_ICDF(CDF_PROB_TOP), 0
178#define AOM_CDF7(a0, a1, a2, a3, a4, a5) \
179 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
180 ((CDF_INIT_TOP - 7) >> 1)) / \
181 ((CDF_INIT_TOP - 7)) + \
182 1) \
183 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
184 ((CDF_INIT_TOP - 7) >> 1)) / \
185 ((CDF_INIT_TOP - 7)) + \
186 2), \
187 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
188 ((CDF_INIT_TOP - 7) >> 1)) / \
189 ((CDF_INIT_TOP - 7)) + \
190 3), \
191 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
192 ((CDF_INIT_TOP - 7) >> 1)) / \
193 ((CDF_INIT_TOP - 7)) + \
194 4), \
195 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
196 ((CDF_INIT_TOP - 7) >> 1)) / \
197 ((CDF_INIT_TOP - 7)) + \
198 5), \
199 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \
200 ((CDF_INIT_TOP - 7) >> 1)) / \
201 ((CDF_INIT_TOP - 7)) + \
202 6), \
203 AOM_ICDF(CDF_PROB_TOP), 0
204#define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \
205 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
206 ((CDF_INIT_TOP - 8) >> 1)) / \
207 ((CDF_INIT_TOP - 8)) + \
208 1) \
209 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
210 ((CDF_INIT_TOP - 8) >> 1)) / \
211 ((CDF_INIT_TOP - 8)) + \
212 2), \
213 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
214 ((CDF_INIT_TOP - 8) >> 1)) / \
215 ((CDF_INIT_TOP - 8)) + \
216 3), \
217 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
218 ((CDF_INIT_TOP - 8) >> 1)) / \
219 ((CDF_INIT_TOP - 8)) + \
220 4), \
221 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
222 ((CDF_INIT_TOP - 8) >> 1)) / \
223 ((CDF_INIT_TOP - 8)) + \
224 5), \
225 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
226 ((CDF_INIT_TOP - 8) >> 1)) / \
227 ((CDF_INIT_TOP - 8)) + \
228 6), \
229 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \
230 ((CDF_INIT_TOP - 8) >> 1)) / \
231 ((CDF_INIT_TOP - 8)) + \
232 7), \
233 AOM_ICDF(CDF_PROB_TOP), 0
234#define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \
235 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
236 ((CDF_INIT_TOP - 9) >> 1)) / \
237 ((CDF_INIT_TOP - 9)) + \
238 1) \
239 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
240 ((CDF_INIT_TOP - 9) >> 1)) / \
241 ((CDF_INIT_TOP - 9)) + \
242 2), \
243 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
244 ((CDF_INIT_TOP - 9) >> 1)) / \
245 ((CDF_INIT_TOP - 9)) + \
246 3), \
247 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
248 ((CDF_INIT_TOP - 9) >> 1)) / \
249 ((CDF_INIT_TOP - 9)) + \
250 4), \
251 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
252 ((CDF_INIT_TOP - 9) >> 1)) / \
253 ((CDF_INIT_TOP - 9)) + \
254 5), \
255 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
256 ((CDF_INIT_TOP - 9) >> 1)) / \
257 ((CDF_INIT_TOP - 9)) + \
258 6), \
259 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
260 ((CDF_INIT_TOP - 9) >> 1)) / \
261 ((CDF_INIT_TOP - 9)) + \
262 7), \
263 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \
264 ((CDF_INIT_TOP - 9) >> 1)) / \
265 ((CDF_INIT_TOP - 9)) + \
266 8), \
267 AOM_ICDF(CDF_PROB_TOP), 0
268#define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
269 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
270 ((CDF_INIT_TOP - 10) >> 1)) / \
271 ((CDF_INIT_TOP - 10)) + \
272 1) \
273 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
274 ((CDF_INIT_TOP - 10) >> 1)) / \
275 ((CDF_INIT_TOP - 10)) + \
276 2), \
277 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
278 ((CDF_INIT_TOP - 10) >> 1)) / \
279 ((CDF_INIT_TOP - 10)) + \
280 3), \
281 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
282 ((CDF_INIT_TOP - 10) >> 1)) / \
283 ((CDF_INIT_TOP - 10)) + \
284 4), \
285 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
286 ((CDF_INIT_TOP - 10) >> 1)) / \
287 ((CDF_INIT_TOP - 10)) + \
288 5), \
289 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
290 ((CDF_INIT_TOP - 10) >> 1)) / \
291 ((CDF_INIT_TOP - 10)) + \
292 6), \
293 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
294 ((CDF_INIT_TOP - 10) >> 1)) / \
295 ((CDF_INIT_TOP - 10)) + \
296 7), \
297 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
298 ((CDF_INIT_TOP - 10) >> 1)) / \
299 ((CDF_INIT_TOP - 10)) + \
300 8), \
301 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \
302 ((CDF_INIT_TOP - 10) >> 1)) / \
303 ((CDF_INIT_TOP - 10)) + \
304 9), \
305 AOM_ICDF(CDF_PROB_TOP), 0
306#define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
307 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
308 ((CDF_INIT_TOP - 11) >> 1)) / \
309 ((CDF_INIT_TOP - 11)) + \
310 1) \
311 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
312 ((CDF_INIT_TOP - 11) >> 1)) / \
313 ((CDF_INIT_TOP - 11)) + \
314 2), \
315 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
316 ((CDF_INIT_TOP - 11) >> 1)) / \
317 ((CDF_INIT_TOP - 11)) + \
318 3), \
319 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
320 ((CDF_INIT_TOP - 11) >> 1)) / \
321 ((CDF_INIT_TOP - 11)) + \
322 4), \
323 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
324 ((CDF_INIT_TOP - 11) >> 1)) / \
325 ((CDF_INIT_TOP - 11)) + \
326 5), \
327 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
328 ((CDF_INIT_TOP - 11) >> 1)) / \
329 ((CDF_INIT_TOP - 11)) + \
330 6), \
331 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
332 ((CDF_INIT_TOP - 11) >> 1)) / \
333 ((CDF_INIT_TOP - 11)) + \
334 7), \
335 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
336 ((CDF_INIT_TOP - 11) >> 1)) / \
337 ((CDF_INIT_TOP - 11)) + \
338 8), \
339 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
340 ((CDF_INIT_TOP - 11) >> 1)) / \
341 ((CDF_INIT_TOP - 11)) + \
342 9), \
343 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \
344 ((CDF_INIT_TOP - 11) >> 1)) / \
345 ((CDF_INIT_TOP - 11)) + \
346 10), \
347 AOM_ICDF(CDF_PROB_TOP), 0
348#define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
349 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
350 ((CDF_INIT_TOP - 12) >> 1)) / \
351 ((CDF_INIT_TOP - 12)) + \
352 1) \
353 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
354 ((CDF_INIT_TOP - 12) >> 1)) / \
355 ((CDF_INIT_TOP - 12)) + \
356 2), \
357 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
358 ((CDF_INIT_TOP - 12) >> 1)) / \
359 ((CDF_INIT_TOP - 12)) + \
360 3), \
361 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
362 ((CDF_INIT_TOP - 12) >> 1)) / \
363 ((CDF_INIT_TOP - 12)) + \
364 4), \
365 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
366 ((CDF_INIT_TOP - 12) >> 1)) / \
367 ((CDF_INIT_TOP - 12)) + \
368 5), \
369 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
370 ((CDF_INIT_TOP - 12) >> 1)) / \
371 ((CDF_INIT_TOP - 12)) + \
372 6), \
373 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
374 ((CDF_INIT_TOP - 12) >> 1)) / \
375 ((CDF_INIT_TOP - 12)) + \
376 7), \
377 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
378 ((CDF_INIT_TOP - 12) >> 1)) / \
379 ((CDF_INIT_TOP - 12)) + \
380 8), \
381 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
382 ((CDF_INIT_TOP - 12) >> 1)) / \
383 ((CDF_INIT_TOP - 12)) + \
384 9), \
385 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
386 ((CDF_INIT_TOP - 12) >> 1)) / \
387 ((CDF_INIT_TOP - 12)) + \
388 10), \
389 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \
390 ((CDF_INIT_TOP - 12) >> 1)) / \
391 ((CDF_INIT_TOP - 12)) + \
392 11), \
393 AOM_ICDF(CDF_PROB_TOP), 0
394#define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
395 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
396 ((CDF_INIT_TOP - 13) >> 1)) / \
397 ((CDF_INIT_TOP - 13)) + \
398 1) \
399 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
400 ((CDF_INIT_TOP - 13) >> 1)) / \
401 ((CDF_INIT_TOP - 13)) + \
402 2), \
403 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
404 ((CDF_INIT_TOP - 13) >> 1)) / \
405 ((CDF_INIT_TOP - 13)) + \
406 3), \
407 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
408 ((CDF_INIT_TOP - 13) >> 1)) / \
409 ((CDF_INIT_TOP - 13)) + \
410 4), \
411 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
412 ((CDF_INIT_TOP - 13) >> 1)) / \
413 ((CDF_INIT_TOP - 13)) + \
414 5), \
415 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
416 ((CDF_INIT_TOP - 13) >> 1)) / \
417 ((CDF_INIT_TOP - 13)) + \
418 6), \
419 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
420 ((CDF_INIT_TOP - 13) >> 1)) / \
421 ((CDF_INIT_TOP - 13)) + \
422 7), \
423 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
424 ((CDF_INIT_TOP - 13) >> 1)) / \
425 ((CDF_INIT_TOP - 13)) + \
426 8), \
427 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
428 ((CDF_INIT_TOP - 13) >> 1)) / \
429 ((CDF_INIT_TOP - 13)) + \
430 9), \
431 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
432 ((CDF_INIT_TOP - 13) >> 1)) / \
433 ((CDF_INIT_TOP - 13)) + \
434 10), \
435 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
436 ((CDF_INIT_TOP - 13) >> 1)) / \
437 ((CDF_INIT_TOP - 13)) + \
438 11), \
439 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \
440 ((CDF_INIT_TOP - 13) >> 1)) / \
441 ((CDF_INIT_TOP - 13)) + \
442 12), \
443 AOM_ICDF(CDF_PROB_TOP), 0
444#define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
445 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
446 ((CDF_INIT_TOP - 14) >> 1)) / \
447 ((CDF_INIT_TOP - 14)) + \
448 1) \
449 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
450 ((CDF_INIT_TOP - 14) >> 1)) / \
451 ((CDF_INIT_TOP - 14)) + \
452 2), \
453 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
454 ((CDF_INIT_TOP - 14) >> 1)) / \
455 ((CDF_INIT_TOP - 14)) + \
456 3), \
457 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
458 ((CDF_INIT_TOP - 14) >> 1)) / \
459 ((CDF_INIT_TOP - 14)) + \
460 4), \
461 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
462 ((CDF_INIT_TOP - 14) >> 1)) / \
463 ((CDF_INIT_TOP - 14)) + \
464 5), \
465 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
466 ((CDF_INIT_TOP - 14) >> 1)) / \
467 ((CDF_INIT_TOP - 14)) + \
468 6), \
469 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
470 ((CDF_INIT_TOP - 14) >> 1)) / \
471 ((CDF_INIT_TOP - 14)) + \
472 7), \
473 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
474 ((CDF_INIT_TOP - 14) >> 1)) / \
475 ((CDF_INIT_TOP - 14)) + \
476 8), \
477 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
478 ((CDF_INIT_TOP - 14) >> 1)) / \
479 ((CDF_INIT_TOP - 14)) + \
480 9), \
481 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
482 ((CDF_INIT_TOP - 14) >> 1)) / \
483 ((CDF_INIT_TOP - 14)) + \
484 10), \
485 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
486 ((CDF_INIT_TOP - 14) >> 1)) / \
487 ((CDF_INIT_TOP - 14)) + \
488 11), \
489 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
490 ((CDF_INIT_TOP - 14) >> 1)) / \
491 ((CDF_INIT_TOP - 14)) + \
492 12), \
493 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \
494 ((CDF_INIT_TOP - 14) >> 1)) / \
495 ((CDF_INIT_TOP - 14)) + \
496 13), \
497 AOM_ICDF(CDF_PROB_TOP), 0
498#define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
499 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
500 ((CDF_INIT_TOP - 15) >> 1)) / \
501 ((CDF_INIT_TOP - 15)) + \
502 1) \
503 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
504 ((CDF_INIT_TOP - 15) >> 1)) / \
505 ((CDF_INIT_TOP - 15)) + \
506 2), \
507 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
508 ((CDF_INIT_TOP - 15) >> 1)) / \
509 ((CDF_INIT_TOP - 15)) + \
510 3), \
511 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
512 ((CDF_INIT_TOP - 15) >> 1)) / \
513 ((CDF_INIT_TOP - 15)) + \
514 4), \
515 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
516 ((CDF_INIT_TOP - 15) >> 1)) / \
517 ((CDF_INIT_TOP - 15)) + \
518 5), \
519 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
520 ((CDF_INIT_TOP - 15) >> 1)) / \
521 ((CDF_INIT_TOP - 15)) + \
522 6), \
523 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
524 ((CDF_INIT_TOP - 15) >> 1)) / \
525 ((CDF_INIT_TOP - 15)) + \
526 7), \
527 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
528 ((CDF_INIT_TOP - 15) >> 1)) / \
529 ((CDF_INIT_TOP - 15)) + \
530 8), \
531 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
532 ((CDF_INIT_TOP - 15) >> 1)) / \
533 ((CDF_INIT_TOP - 15)) + \
534 9), \
535 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
536 ((CDF_INIT_TOP - 15) >> 1)) / \
537 ((CDF_INIT_TOP - 15)) + \
538 10), \
539 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
540 ((CDF_INIT_TOP - 15) >> 1)) / \
541 ((CDF_INIT_TOP - 15)) + \
542 11), \
543 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
544 ((CDF_INIT_TOP - 15) >> 1)) / \
545 ((CDF_INIT_TOP - 15)) + \
546 12), \
547 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
548 ((CDF_INIT_TOP - 15) >> 1)) / \
549 ((CDF_INIT_TOP - 15)) + \
550 13), \
551 AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \
552 ((CDF_INIT_TOP - 15) >> 1)) / \
553 ((CDF_INIT_TOP - 15)) + \
554 14), \
555 AOM_ICDF(CDF_PROB_TOP), 0
556#define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
557 a14) \
558 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
559 ((CDF_INIT_TOP - 16) >> 1)) / \
560 ((CDF_INIT_TOP - 16)) + \
561 1) \
562 , AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
563 ((CDF_INIT_TOP - 16) >> 1)) / \
564 ((CDF_INIT_TOP - 16)) + \
565 2), \
566 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
567 ((CDF_INIT_TOP - 16) >> 1)) / \
568 ((CDF_INIT_TOP - 16)) + \
569 3), \
570 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
571 ((CDF_INIT_TOP - 16) >> 1)) / \
572 ((CDF_INIT_TOP - 16)) + \
573 4), \
574 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
575 ((CDF_INIT_TOP - 16) >> 1)) / \
576 ((CDF_INIT_TOP - 16)) + \
577 5), \
578 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
579 ((CDF_INIT_TOP - 16) >> 1)) / \
580 ((CDF_INIT_TOP - 16)) + \
581 6), \
582 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
583 ((CDF_INIT_TOP - 16) >> 1)) / \
584 ((CDF_INIT_TOP - 16)) + \
585 7), \
586 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
587 ((CDF_INIT_TOP - 16) >> 1)) / \
588 ((CDF_INIT_TOP - 16)) + \
589 8), \
590 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
591 ((CDF_INIT_TOP - 16) >> 1)) / \
592 ((CDF_INIT_TOP - 16)) + \
593 9), \
594 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
595 ((CDF_INIT_TOP - 16) >> 1)) / \
596 ((CDF_INIT_TOP - 16)) + \
597 10), \
598 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
599 ((CDF_INIT_TOP - 16) >> 1)) / \
600 ((CDF_INIT_TOP - 16)) + \
601 11), \
602 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
603 ((CDF_INIT_TOP - 16) >> 1)) / \
604 ((CDF_INIT_TOP - 16)) + \
605 12), \
606 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
607 ((CDF_INIT_TOP - 16) >> 1)) / \
608 ((CDF_INIT_TOP - 16)) + \
609 13), \
610 AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
611 ((CDF_INIT_TOP - 16) >> 1)) / \
612 ((CDF_INIT_TOP - 16)) + \
613 14), \
614 AOM_ICDF((((a14)-15) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \
615 ((CDF_INIT_TOP - 16) >> 1)) / \
616 ((CDF_INIT_TOP - 16)) + \
617 15), \
618 AOM_ICDF(CDF_PROB_TOP), 0
619
620#endif
621
Yaowu Xuc27fc142016-08-22 16:08:15 -0700622#define MAX_PROB 255
623
Jingning Han87b01b52017-08-31 12:07:20 -0700624#define BR_NODE 1
625
Hui Su9fdf2e22018-01-22 14:48:06 -0800626static INLINE uint8_t get_prob(unsigned int num, unsigned int den) {
James Zern751f26a2016-09-28 17:39:05 -0700627 assert(den != 0);
James Zern56310192016-09-27 19:43:03 -0700628 {
James Zern5f8361a2017-02-24 15:36:52 -0800629 const int p = (int)(((uint64_t)num * 256 + (den >> 1)) / den);
James Zern56310192016-09-27 19:43:03 -0700630 // (p > 255) ? 255 : (p < 1) ? 1 : p;
631 const int clipped_prob = p | ((255 - p) >> 23) | (p == 0);
Hui Su9fdf2e22018-01-22 14:48:06 -0800632 return (uint8_t)clipped_prob;
James Zern56310192016-09-27 19:43:03 -0700633 }
Yaowu Xuc27fc142016-08-22 16:08:15 -0700634}
635
Thomas9ac55082016-09-23 18:04:17 +0100636static INLINE void update_cdf(aom_cdf_prob *cdf, int val, int nsymbs) {
Jingning Han9480e7b2017-12-20 16:45:01 -0800637 int rate;
Thomas Davies5dad9a82017-03-20 09:53:16 +0000638 const int rate2 = 5;
Thomas Daviesef97ec02016-12-09 14:42:02 +0000639 int i, tmp;
640 int diff;
Dake Heb79f1b62017-11-19 12:10:59 -0800641
Thomas Daviesef97ec02016-12-09 14:42:02 +0000642#if 1
Dake He56416352017-12-26 15:43:34 -0800643 // static const int nsymbs2speed[17] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
644 // 3, 3, 3, 3, 4 };
645 // static const int nsymbs2speed[17] = { 0, 0, 1, 1, 2, 2, 2, 2, 2,
646 // 2, 2, 2, 3, 3, 3, 3, 3 };
647 static const int nsymbs2speed[17] = { 0, 0, 1, 1, 2, 2, 2, 2, 2,
648 2, 2, 2, 2, 2, 2, 2, 2 };
649 assert(nsymbs < 17);
650 rate = 3 + (cdf[nsymbs] > 15) + (cdf[nsymbs] > 31) +
651 nsymbs2speed[nsymbs]; // + get_msb(nsymbs);
Dake Heb79f1b62017-11-19 12:10:59 -0800652 tmp = AOM_ICDF(0);
653 (void)rate2;
654 (void)diff;
655
656 // Single loop (faster)
657 for (i = 0; i < nsymbs - 1; ++i) {
658 tmp = (i == val) ? 0 : tmp;
659#if 1
660 if (tmp < cdf[i]) {
661 cdf[i] -= ((cdf[i] - tmp) >> rate);
662 } else {
663 cdf[i] += ((tmp - cdf[i]) >> rate);
664 }
665#else
666 cdf[i] += ((tmp - cdf[i]) >> rate);
667#endif
668 }
669
670#else
Thomas Daviesf6c04ac2016-10-12 17:54:29 +0100671 for (i = 0; i < nsymbs; ++i) {
Thomas Daviesef97ec02016-12-09 14:42:02 +0000672 tmp = (i + 1) << rate2;
Thomas Daviesf6c04ac2016-10-12 17:54:29 +0100673 cdf[i] -= ((cdf[i] - tmp) >> rate);
Thomas9ac55082016-09-23 18:04:17 +0100674 }
Alex Converse2ce4bd42017-02-01 12:00:31 -0800675 diff = CDF_PROB_TOP - cdf[nsymbs - 1];
Thomas9ac55082016-09-23 18:04:17 +0100676
Thomas Daviesf6c04ac2016-10-12 17:54:29 +0100677 for (i = val; i < nsymbs; ++i) {
678 cdf[i] += diff;
679 }
Thomas Daviesef97ec02016-12-09 14:42:02 +0000680#endif
Thomas Davies028b57f2017-02-22 16:42:11 +0000681 cdf[nsymbs] += (cdf[nsymbs] < 32);
Thomas9ac55082016-09-23 18:04:17 +0100682}
Thomas9ac55082016-09-23 18:04:17 +0100683
Jingning Han94cea4a2017-09-30 14:13:23 -0700684#if CONFIG_LV_MAP
685static INLINE void update_bin(aom_cdf_prob *cdf, int val, int nsymbs) {
686 update_cdf(cdf, val, nsymbs);
687}
688#endif
689
Yaowu Xuc27fc142016-08-22 16:08:15 -0700690#ifdef __cplusplus
691} // extern "C"
692#endif
693
Yaowu Xuf883b422016-08-30 14:01:10 -0700694#endif // AOM_DSP_PROB_H_