1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved 3 * 4 * 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. 10 */ 11 12 #ifndef AOM_AOM_DSP_PROB_H_ 13 #define AOM_AOM_DSP_PROB_H_ 14 15 #include <assert.h> 16 #include <stdio.h> 17 18 #include "config/aom_config.h" 19 20 #include "aom_dsp/aom_dsp_common.h" 21 #include "aom_dsp/entcode.h" 22 #include "aom_ports/bitops.h" 23 #include "aom_ports/mem.h" 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 // TODO(negge): Rename this aom_prob once we remove vpxbool. 30 typedef uint16_t aom_cdf_prob; 31 32 #define CDF_SIZE(x) ((x) + 1) 33 #define CDF_PROB_BITS 15 34 #define CDF_PROB_TOP (1 << CDF_PROB_BITS) 35 #define CDF_INIT_TOP 32768 36 #define CDF_SHIFT (15 - CDF_PROB_BITS) 37 /*The value stored in an iCDF is CDF_PROB_TOP minus the actual cumulative 38 probability (an "inverse" CDF). 39 This function converts from one representation to the other (and is its own 40 inverse).*/ 41 #define AOM_ICDF(x) (CDF_PROB_TOP - (x)) 42 43 #if CDF_SHIFT == 0 44 45 #define AOM_CDF2(a0) AOM_ICDF(a0), AOM_ICDF(CDF_PROB_TOP), 0 46 #define AOM_CDF3(a0, a1) AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(CDF_PROB_TOP), 0 47 #define AOM_CDF4(a0, a1, a2) \ 48 AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(CDF_PROB_TOP), 0 49 #define AOM_CDF5(a0, a1, a2, a3) \ 50 AOM_ICDF(a0) \ 51 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(CDF_PROB_TOP), 0 52 #define AOM_CDF6(a0, a1, a2, a3, a4) \ 53 AOM_ICDF(a0) \ 54 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \ 55 AOM_ICDF(CDF_PROB_TOP), 0 56 #define AOM_CDF7(a0, a1, a2, a3, a4, a5) \ 57 AOM_ICDF(a0) \ 58 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 59 AOM_ICDF(CDF_PROB_TOP), 0 60 #define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \ 61 AOM_ICDF(a0) \ 62 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 63 AOM_ICDF(a6), AOM_ICDF(CDF_PROB_TOP), 0 64 #define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \ 65 AOM_ICDF(a0) \ 66 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 67 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(CDF_PROB_TOP), 0 68 #define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \ 69 AOM_ICDF(a0) \ 70 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 71 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(CDF_PROB_TOP), 0 72 #define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ 73 AOM_ICDF(a0) \ 74 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 75 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \ 76 AOM_ICDF(CDF_PROB_TOP), 0 77 #define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ 78 AOM_ICDF(a0) \ 79 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 80 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \ 81 AOM_ICDF(CDF_PROB_TOP), 0 82 #define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ 83 AOM_ICDF(a0) \ 84 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 85 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \ 86 AOM_ICDF(a11), AOM_ICDF(CDF_PROB_TOP), 0 87 #define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \ 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(a8), AOM_ICDF(a9), AOM_ICDF(a10), \ 91 AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(CDF_PROB_TOP), 0 92 #define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \ 93 AOM_ICDF(a0) \ 94 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 95 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \ 96 AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(CDF_PROB_TOP), 0 97 #define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \ 98 a14) \ 99 AOM_ICDF(a0) \ 100 , AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \ 101 AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), \ 102 AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(a14), \ 103 AOM_ICDF(CDF_PROB_TOP), 0 104 105 #else 106 #define AOM_CDF2(a0) \ 107 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 2) + \ 108 ((CDF_INIT_TOP - 2) >> 1)) / \ 109 ((CDF_INIT_TOP - 2)) + \ 110 1) \ 111 , AOM_ICDF(CDF_PROB_TOP), 0 112 #define AOM_CDF3(a0, a1) \ 113 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \ 114 ((CDF_INIT_TOP - 3) >> 1)) / \ 115 ((CDF_INIT_TOP - 3)) + \ 116 1) \ 117 , \ 118 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 3) + \ 119 ((CDF_INIT_TOP - 3) >> 1)) / \ 120 ((CDF_INIT_TOP - 3)) + \ 121 2), \ 122 AOM_ICDF(CDF_PROB_TOP), 0 123 #define AOM_CDF4(a0, a1, a2) \ 124 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 4) + \ 125 ((CDF_INIT_TOP - 4) >> 1)) / \ 126 ((CDF_INIT_TOP - 4)) + \ 127 1) \ 128 , \ 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 , \ 144 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \ 145 ((CDF_INIT_TOP - 5) >> 1)) / \ 146 ((CDF_INIT_TOP - 5)) + \ 147 2), \ 148 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \ 149 ((CDF_INIT_TOP - 5) >> 1)) / \ 150 ((CDF_INIT_TOP - 5)) + \ 151 3), \ 152 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 5) + \ 153 ((CDF_INIT_TOP - 5) >> 1)) / \ 154 ((CDF_INIT_TOP - 5)) + \ 155 4), \ 156 AOM_ICDF(CDF_PROB_TOP), 0 157 #define AOM_CDF6(a0, a1, a2, a3, a4) \ 158 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \ 159 ((CDF_INIT_TOP - 6) >> 1)) / \ 160 ((CDF_INIT_TOP - 6)) + \ 161 1) \ 162 , \ 163 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \ 164 ((CDF_INIT_TOP - 6) >> 1)) / \ 165 ((CDF_INIT_TOP - 6)) + \ 166 2), \ 167 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \ 168 ((CDF_INIT_TOP - 6) >> 1)) / \ 169 ((CDF_INIT_TOP - 6)) + \ 170 3), \ 171 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \ 172 ((CDF_INIT_TOP - 6) >> 1)) / \ 173 ((CDF_INIT_TOP - 6)) + \ 174 4), \ 175 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 6) + \ 176 ((CDF_INIT_TOP - 6) >> 1)) / \ 177 ((CDF_INIT_TOP - 6)) + \ 178 5), \ 179 AOM_ICDF(CDF_PROB_TOP), 0 180 #define AOM_CDF7(a0, a1, a2, a3, a4, a5) \ 181 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 182 ((CDF_INIT_TOP - 7) >> 1)) / \ 183 ((CDF_INIT_TOP - 7)) + \ 184 1) \ 185 , \ 186 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 187 ((CDF_INIT_TOP - 7) >> 1)) / \ 188 ((CDF_INIT_TOP - 7)) + \ 189 2), \ 190 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 191 ((CDF_INIT_TOP - 7) >> 1)) / \ 192 ((CDF_INIT_TOP - 7)) + \ 193 3), \ 194 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 195 ((CDF_INIT_TOP - 7) >> 1)) / \ 196 ((CDF_INIT_TOP - 7)) + \ 197 4), \ 198 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 199 ((CDF_INIT_TOP - 7) >> 1)) / \ 200 ((CDF_INIT_TOP - 7)) + \ 201 5), \ 202 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 7) + \ 203 ((CDF_INIT_TOP - 7) >> 1)) / \ 204 ((CDF_INIT_TOP - 7)) + \ 205 6), \ 206 AOM_ICDF(CDF_PROB_TOP), 0 207 #define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \ 208 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 209 ((CDF_INIT_TOP - 8) >> 1)) / \ 210 ((CDF_INIT_TOP - 8)) + \ 211 1) \ 212 , \ 213 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 214 ((CDF_INIT_TOP - 8) >> 1)) / \ 215 ((CDF_INIT_TOP - 8)) + \ 216 2), \ 217 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 218 ((CDF_INIT_TOP - 8) >> 1)) / \ 219 ((CDF_INIT_TOP - 8)) + \ 220 3), \ 221 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 222 ((CDF_INIT_TOP - 8) >> 1)) / \ 223 ((CDF_INIT_TOP - 8)) + \ 224 4), \ 225 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 226 ((CDF_INIT_TOP - 8) >> 1)) / \ 227 ((CDF_INIT_TOP - 8)) + \ 228 5), \ 229 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 230 ((CDF_INIT_TOP - 8) >> 1)) / \ 231 ((CDF_INIT_TOP - 8)) + \ 232 6), \ 233 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 8) + \ 234 ((CDF_INIT_TOP - 8) >> 1)) / \ 235 ((CDF_INIT_TOP - 8)) + \ 236 7), \ 237 AOM_ICDF(CDF_PROB_TOP), 0 238 #define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \ 239 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 240 ((CDF_INIT_TOP - 9) >> 1)) / \ 241 ((CDF_INIT_TOP - 9)) + \ 242 1) \ 243 , \ 244 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 245 ((CDF_INIT_TOP - 9) >> 1)) / \ 246 ((CDF_INIT_TOP - 9)) + \ 247 2), \ 248 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 249 ((CDF_INIT_TOP - 9) >> 1)) / \ 250 ((CDF_INIT_TOP - 9)) + \ 251 3), \ 252 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 253 ((CDF_INIT_TOP - 9) >> 1)) / \ 254 ((CDF_INIT_TOP - 9)) + \ 255 4), \ 256 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 257 ((CDF_INIT_TOP - 9) >> 1)) / \ 258 ((CDF_INIT_TOP - 9)) + \ 259 5), \ 260 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 261 ((CDF_INIT_TOP - 9) >> 1)) / \ 262 ((CDF_INIT_TOP - 9)) + \ 263 6), \ 264 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 265 ((CDF_INIT_TOP - 9) >> 1)) / \ 266 ((CDF_INIT_TOP - 9)) + \ 267 7), \ 268 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 9) + \ 269 ((CDF_INIT_TOP - 9) >> 1)) / \ 270 ((CDF_INIT_TOP - 9)) + \ 271 8), \ 272 AOM_ICDF(CDF_PROB_TOP), 0 273 #define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \ 274 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 275 ((CDF_INIT_TOP - 10) >> 1)) / \ 276 ((CDF_INIT_TOP - 10)) + \ 277 1) \ 278 , \ 279 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 280 ((CDF_INIT_TOP - 10) >> 1)) / \ 281 ((CDF_INIT_TOP - 10)) + \ 282 2), \ 283 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 284 ((CDF_INIT_TOP - 10) >> 1)) / \ 285 ((CDF_INIT_TOP - 10)) + \ 286 3), \ 287 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 288 ((CDF_INIT_TOP - 10) >> 1)) / \ 289 ((CDF_INIT_TOP - 10)) + \ 290 4), \ 291 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 292 ((CDF_INIT_TOP - 10) >> 1)) / \ 293 ((CDF_INIT_TOP - 10)) + \ 294 5), \ 295 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 296 ((CDF_INIT_TOP - 10) >> 1)) / \ 297 ((CDF_INIT_TOP - 10)) + \ 298 6), \ 299 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 300 ((CDF_INIT_TOP - 10) >> 1)) / \ 301 ((CDF_INIT_TOP - 10)) + \ 302 7), \ 303 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 304 ((CDF_INIT_TOP - 10) >> 1)) / \ 305 ((CDF_INIT_TOP - 10)) + \ 306 8), \ 307 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 10) + \ 308 ((CDF_INIT_TOP - 10) >> 1)) / \ 309 ((CDF_INIT_TOP - 10)) + \ 310 9), \ 311 AOM_ICDF(CDF_PROB_TOP), 0 312 #define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ 313 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 314 ((CDF_INIT_TOP - 11) >> 1)) / \ 315 ((CDF_INIT_TOP - 11)) + \ 316 1) \ 317 , \ 318 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 319 ((CDF_INIT_TOP - 11) >> 1)) / \ 320 ((CDF_INIT_TOP - 11)) + \ 321 2), \ 322 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 323 ((CDF_INIT_TOP - 11) >> 1)) / \ 324 ((CDF_INIT_TOP - 11)) + \ 325 3), \ 326 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 327 ((CDF_INIT_TOP - 11) >> 1)) / \ 328 ((CDF_INIT_TOP - 11)) + \ 329 4), \ 330 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 331 ((CDF_INIT_TOP - 11) >> 1)) / \ 332 ((CDF_INIT_TOP - 11)) + \ 333 5), \ 334 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 335 ((CDF_INIT_TOP - 11) >> 1)) / \ 336 ((CDF_INIT_TOP - 11)) + \ 337 6), \ 338 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 339 ((CDF_INIT_TOP - 11) >> 1)) / \ 340 ((CDF_INIT_TOP - 11)) + \ 341 7), \ 342 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 343 ((CDF_INIT_TOP - 11) >> 1)) / \ 344 ((CDF_INIT_TOP - 11)) + \ 345 8), \ 346 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 347 ((CDF_INIT_TOP - 11) >> 1)) / \ 348 ((CDF_INIT_TOP - 11)) + \ 349 9), \ 350 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 11) + \ 351 ((CDF_INIT_TOP - 11) >> 1)) / \ 352 ((CDF_INIT_TOP - 11)) + \ 353 10), \ 354 AOM_ICDF(CDF_PROB_TOP), 0 355 #define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ 356 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 357 ((CDF_INIT_TOP - 12) >> 1)) / \ 358 ((CDF_INIT_TOP - 12)) + \ 359 1) \ 360 , \ 361 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 362 ((CDF_INIT_TOP - 12) >> 1)) / \ 363 ((CDF_INIT_TOP - 12)) + \ 364 2), \ 365 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 366 ((CDF_INIT_TOP - 12) >> 1)) / \ 367 ((CDF_INIT_TOP - 12)) + \ 368 3), \ 369 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 370 ((CDF_INIT_TOP - 12) >> 1)) / \ 371 ((CDF_INIT_TOP - 12)) + \ 372 4), \ 373 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 374 ((CDF_INIT_TOP - 12) >> 1)) / \ 375 ((CDF_INIT_TOP - 12)) + \ 376 5), \ 377 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 378 ((CDF_INIT_TOP - 12) >> 1)) / \ 379 ((CDF_INIT_TOP - 12)) + \ 380 6), \ 381 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 382 ((CDF_INIT_TOP - 12) >> 1)) / \ 383 ((CDF_INIT_TOP - 12)) + \ 384 7), \ 385 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 386 ((CDF_INIT_TOP - 12) >> 1)) / \ 387 ((CDF_INIT_TOP - 12)) + \ 388 8), \ 389 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 390 ((CDF_INIT_TOP - 12) >> 1)) / \ 391 ((CDF_INIT_TOP - 12)) + \ 392 9), \ 393 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 394 ((CDF_INIT_TOP - 12) >> 1)) / \ 395 ((CDF_INIT_TOP - 12)) + \ 396 10), \ 397 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 12) + \ 398 ((CDF_INIT_TOP - 12) >> 1)) / \ 399 ((CDF_INIT_TOP - 12)) + \ 400 11), \ 401 AOM_ICDF(CDF_PROB_TOP), 0 402 #define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ 403 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 404 ((CDF_INIT_TOP - 13) >> 1)) / \ 405 ((CDF_INIT_TOP - 13)) + \ 406 1) \ 407 , \ 408 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 409 ((CDF_INIT_TOP - 13) >> 1)) / \ 410 ((CDF_INIT_TOP - 13)) + \ 411 2), \ 412 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 413 ((CDF_INIT_TOP - 13) >> 1)) / \ 414 ((CDF_INIT_TOP - 13)) + \ 415 3), \ 416 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 417 ((CDF_INIT_TOP - 13) >> 1)) / \ 418 ((CDF_INIT_TOP - 13)) + \ 419 4), \ 420 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 421 ((CDF_INIT_TOP - 13) >> 1)) / \ 422 ((CDF_INIT_TOP - 13)) + \ 423 5), \ 424 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 425 ((CDF_INIT_TOP - 13) >> 1)) / \ 426 ((CDF_INIT_TOP - 13)) + \ 427 6), \ 428 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 429 ((CDF_INIT_TOP - 13) >> 1)) / \ 430 ((CDF_INIT_TOP - 13)) + \ 431 7), \ 432 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 433 ((CDF_INIT_TOP - 13) >> 1)) / \ 434 ((CDF_INIT_TOP - 13)) + \ 435 8), \ 436 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 437 ((CDF_INIT_TOP - 13) >> 1)) / \ 438 ((CDF_INIT_TOP - 13)) + \ 439 9), \ 440 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 441 ((CDF_INIT_TOP - 13) >> 1)) / \ 442 ((CDF_INIT_TOP - 13)) + \ 443 10), \ 444 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 445 ((CDF_INIT_TOP - 13) >> 1)) / \ 446 ((CDF_INIT_TOP - 13)) + \ 447 11), \ 448 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 13) + \ 449 ((CDF_INIT_TOP - 13) >> 1)) / \ 450 ((CDF_INIT_TOP - 13)) + \ 451 12), \ 452 AOM_ICDF(CDF_PROB_TOP), 0 453 #define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \ 454 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 455 ((CDF_INIT_TOP - 14) >> 1)) / \ 456 ((CDF_INIT_TOP - 14)) + \ 457 1) \ 458 , \ 459 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 460 ((CDF_INIT_TOP - 14) >> 1)) / \ 461 ((CDF_INIT_TOP - 14)) + \ 462 2), \ 463 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 464 ((CDF_INIT_TOP - 14) >> 1)) / \ 465 ((CDF_INIT_TOP - 14)) + \ 466 3), \ 467 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 468 ((CDF_INIT_TOP - 14) >> 1)) / \ 469 ((CDF_INIT_TOP - 14)) + \ 470 4), \ 471 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 472 ((CDF_INIT_TOP - 14) >> 1)) / \ 473 ((CDF_INIT_TOP - 14)) + \ 474 5), \ 475 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 476 ((CDF_INIT_TOP - 14) >> 1)) / \ 477 ((CDF_INIT_TOP - 14)) + \ 478 6), \ 479 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 480 ((CDF_INIT_TOP - 14) >> 1)) / \ 481 ((CDF_INIT_TOP - 14)) + \ 482 7), \ 483 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 484 ((CDF_INIT_TOP - 14) >> 1)) / \ 485 ((CDF_INIT_TOP - 14)) + \ 486 8), \ 487 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 488 ((CDF_INIT_TOP - 14) >> 1)) / \ 489 ((CDF_INIT_TOP - 14)) + \ 490 9), \ 491 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 492 ((CDF_INIT_TOP - 14) >> 1)) / \ 493 ((CDF_INIT_TOP - 14)) + \ 494 10), \ 495 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 496 ((CDF_INIT_TOP - 14) >> 1)) / \ 497 ((CDF_INIT_TOP - 14)) + \ 498 11), \ 499 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 500 ((CDF_INIT_TOP - 14) >> 1)) / \ 501 ((CDF_INIT_TOP - 14)) + \ 502 12), \ 503 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 14) + \ 504 ((CDF_INIT_TOP - 14) >> 1)) / \ 505 ((CDF_INIT_TOP - 14)) + \ 506 13), \ 507 AOM_ICDF(CDF_PROB_TOP), 0 508 #define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \ 509 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 510 ((CDF_INIT_TOP - 15) >> 1)) / \ 511 ((CDF_INIT_TOP - 15)) + \ 512 1) \ 513 , \ 514 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 515 ((CDF_INIT_TOP - 15) >> 1)) / \ 516 ((CDF_INIT_TOP - 15)) + \ 517 2), \ 518 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 519 ((CDF_INIT_TOP - 15) >> 1)) / \ 520 ((CDF_INIT_TOP - 15)) + \ 521 3), \ 522 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 523 ((CDF_INIT_TOP - 15) >> 1)) / \ 524 ((CDF_INIT_TOP - 15)) + \ 525 4), \ 526 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 527 ((CDF_INIT_TOP - 15) >> 1)) / \ 528 ((CDF_INIT_TOP - 15)) + \ 529 5), \ 530 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 531 ((CDF_INIT_TOP - 15) >> 1)) / \ 532 ((CDF_INIT_TOP - 15)) + \ 533 6), \ 534 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 535 ((CDF_INIT_TOP - 15) >> 1)) / \ 536 ((CDF_INIT_TOP - 15)) + \ 537 7), \ 538 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 539 ((CDF_INIT_TOP - 15) >> 1)) / \ 540 ((CDF_INIT_TOP - 15)) + \ 541 8), \ 542 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 543 ((CDF_INIT_TOP - 15) >> 1)) / \ 544 ((CDF_INIT_TOP - 15)) + \ 545 9), \ 546 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 547 ((CDF_INIT_TOP - 15) >> 1)) / \ 548 ((CDF_INIT_TOP - 15)) + \ 549 10), \ 550 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 551 ((CDF_INIT_TOP - 15) >> 1)) / \ 552 ((CDF_INIT_TOP - 15)) + \ 553 11), \ 554 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 555 ((CDF_INIT_TOP - 15) >> 1)) / \ 556 ((CDF_INIT_TOP - 15)) + \ 557 12), \ 558 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 559 ((CDF_INIT_TOP - 15) >> 1)) / \ 560 ((CDF_INIT_TOP - 15)) + \ 561 13), \ 562 AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 15) + \ 563 ((CDF_INIT_TOP - 15) >> 1)) / \ 564 ((CDF_INIT_TOP - 15)) + \ 565 14), \ 566 AOM_ICDF(CDF_PROB_TOP), 0 567 #define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \ 568 a14) \ 569 AOM_ICDF((((a0)-1) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 570 ((CDF_INIT_TOP - 16) >> 1)) / \ 571 ((CDF_INIT_TOP - 16)) + \ 572 1) \ 573 , \ 574 AOM_ICDF((((a1)-2) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 575 ((CDF_INIT_TOP - 16) >> 1)) / \ 576 ((CDF_INIT_TOP - 16)) + \ 577 2), \ 578 AOM_ICDF((((a2)-3) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 579 ((CDF_INIT_TOP - 16) >> 1)) / \ 580 ((CDF_INIT_TOP - 16)) + \ 581 3), \ 582 AOM_ICDF((((a3)-4) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 583 ((CDF_INIT_TOP - 16) >> 1)) / \ 584 ((CDF_INIT_TOP - 16)) + \ 585 4), \ 586 AOM_ICDF((((a4)-5) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 587 ((CDF_INIT_TOP - 16) >> 1)) / \ 588 ((CDF_INIT_TOP - 16)) + \ 589 5), \ 590 AOM_ICDF((((a5)-6) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 591 ((CDF_INIT_TOP - 16) >> 1)) / \ 592 ((CDF_INIT_TOP - 16)) + \ 593 6), \ 594 AOM_ICDF((((a6)-7) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 595 ((CDF_INIT_TOP - 16) >> 1)) / \ 596 ((CDF_INIT_TOP - 16)) + \ 597 7), \ 598 AOM_ICDF((((a7)-8) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 599 ((CDF_INIT_TOP - 16) >> 1)) / \ 600 ((CDF_INIT_TOP - 16)) + \ 601 8), \ 602 AOM_ICDF((((a8)-9) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 603 ((CDF_INIT_TOP - 16) >> 1)) / \ 604 ((CDF_INIT_TOP - 16)) + \ 605 9), \ 606 AOM_ICDF((((a9)-10) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 607 ((CDF_INIT_TOP - 16) >> 1)) / \ 608 ((CDF_INIT_TOP - 16)) + \ 609 10), \ 610 AOM_ICDF((((a10)-11) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 611 ((CDF_INIT_TOP - 16) >> 1)) / \ 612 ((CDF_INIT_TOP - 16)) + \ 613 11), \ 614 AOM_ICDF((((a11)-12) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 615 ((CDF_INIT_TOP - 16) >> 1)) / \ 616 ((CDF_INIT_TOP - 16)) + \ 617 12), \ 618 AOM_ICDF((((a12)-13) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 619 ((CDF_INIT_TOP - 16) >> 1)) / \ 620 ((CDF_INIT_TOP - 16)) + \ 621 13), \ 622 AOM_ICDF((((a13)-14) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 623 ((CDF_INIT_TOP - 16) >> 1)) / \ 624 ((CDF_INIT_TOP - 16)) + \ 625 14), \ 626 AOM_ICDF((((a14)-15) * ((CDF_INIT_TOP >> CDF_SHIFT) - 16) + \ 627 ((CDF_INIT_TOP - 16) >> 1)) / \ 628 ((CDF_INIT_TOP - 16)) + \ 629 15), \ 630 AOM_ICDF(CDF_PROB_TOP), 0 631 632 #endif 633 634 static INLINE uint8_t get_prob(unsigned int num, unsigned int den) { 635 assert(den != 0); 636 { 637 const int p = (int)(((uint64_t)num * 256 + (den >> 1)) / den); 638 // (p > 255) ? 255 : (p < 1) ? 1 : p; 639 const int clipped_prob = p | ((255 - p) >> 23) | (p == 0); 640 return (uint8_t)clipped_prob; 641 } 642 } 643 644 static INLINE void update_cdf(aom_cdf_prob *cdf, int8_t val, int nsymbs) { 645 int rate; 646 int i, tmp; 647 648 static const int nsymbs2speed[17] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 649 2, 2, 2, 2, 2, 2, 2, 2 }; 650 assert(nsymbs < 17); 651 rate = 3 + (cdf[nsymbs] > 15) + (cdf[nsymbs] > 31) + 652 nsymbs2speed[nsymbs]; // + get_msb(nsymbs); 653 tmp = AOM_ICDF(0); 654 655 // Single loop (faster) 656 for (i = 0; i < nsymbs - 1; ++i) { 657 tmp = (i == val) ? 0 : tmp; 658 if (tmp < cdf[i]) { 659 cdf[i] -= ((cdf[i] - tmp) >> rate); 660 } else { 661 cdf[i] += ((tmp - cdf[i]) >> rate); 662 } 663 } 664 cdf[nsymbs] += (cdf[nsymbs] < 32); 665 } 666 667 #ifdef __cplusplus 668 } // extern "C" 669 #endif 670 671 #endif // AOM_AOM_DSP_PROB_H_ 672