entropy.h 16.1 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
Yaowu Xu's avatar
Yaowu Xu committed
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
Yaowu Xu's avatar
Yaowu Xu committed
4 5 6 7 8 9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10 11
 */

Yaowu Xu's avatar
Yaowu Xu committed
12 13
#ifndef AV1_COMMON_ENTROPY_H_
#define AV1_COMMON_ENTROPY_H_
Jingning Han's avatar
Jingning Han committed
14

15
#include "./aom_config.h"
Yaowu Xu's avatar
Yaowu Xu committed
16
#include "aom/aom_integer.h"
17
#include "aom_dsp/prob.h"
Jingning Han's avatar
Jingning Han committed
18

19
#include "av1/common/common.h"
20
#include "av1/common/common_data.h"
21
#include "av1/common/enums.h"
Jingning Han's avatar
Jingning Han committed
22 23 24 25 26

#ifdef __cplusplus
extern "C" {
#endif

clang-format's avatar
clang-format committed
27
#define DIFF_UPDATE_PROB 252
28
#define GROUP_DIFF_UPDATE_PROB 252
Jingning Han's avatar
Jingning Han committed
29

hui su's avatar
hui su committed
30
#if CONFIG_Q_ADAPT_PROBS
hui su's avatar
hui su committed
31
#define TOKEN_CDF_Q_CTXS 4
hui su's avatar
hui su committed
32 33
#endif  // CONFIG_Q_ADAPT_PROBS

Jingning Han's avatar
Jingning Han committed
34
// Coefficient token alphabet
clang-format's avatar
clang-format committed
35 36 37 38 39
#define ZERO_TOKEN 0        // 0     Extra Bits 0+0
#define ONE_TOKEN 1         // 1     Extra Bits 0+1
#define TWO_TOKEN 2         // 2     Extra Bits 0+1
#define THREE_TOKEN 3       // 3     Extra Bits 0+1
#define FOUR_TOKEN 4        // 4     Extra Bits 0+1
Jingning Han's avatar
Jingning Han committed
40 41 42 43 44 45
#define CATEGORY1_TOKEN 5   // 5-6   Extra Bits 1+1
#define CATEGORY2_TOKEN 6   // 7-10  Extra Bits 2+1
#define CATEGORY3_TOKEN 7   // 11-18 Extra Bits 3+1
#define CATEGORY4_TOKEN 8   // 19-34 Extra Bits 4+1
#define CATEGORY5_TOKEN 9   // 35-66 Extra Bits 5+1
#define CATEGORY6_TOKEN 10  // 67+   Extra Bits 14+1
clang-format's avatar
clang-format committed
46
#define EOB_TOKEN 11        // EOB   Extra Bits 0+0
47 48 49 50
#define NO_EOB 0            // Not an end-of-block
#define EARLY_EOB 1         // End of block before the last position
#define LAST_EOB 2          // End of block in the last position (implicit)
#define BLOCK_Z_TOKEN 255   // block zero
51 52
#define HEAD_TOKENS 5
#define TAIL_TOKENS 9
53 54 55 56
#define ONE_TOKEN_EOB 1
#define ONE_TOKEN_NEOB 2
#define TWO_TOKEN_PLUS_EOB 3
#define TWO_TOKEN_PLUS_NEOB 4
Jingning Han's avatar
Jingning Han committed
57 58 59 60
#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

61 62
#if CONFIG_LV_MAP
#define TXB_SKIP_CONTEXTS 13
63 64 65 66 67 68 69 70 71 72

#if CONFIG_CTX1D
#define EOB_COEF_CONTEXTS_2D 25
#define EOB_COEF_CONTEXTS_1D 25
#define EOB_COEF_CONTEXTS \
  (EOB_COEF_CONTEXTS_2D + EOB_COEF_CONTEXTS_1D + EOB_COEF_CONTEXTS_1D)
#else  // CONFIG_CTX1D
#define EOB_COEF_CONTEXTS 25
#endif  // CONFIG_CTX1D

73
#if CONFIG_EXT_TX
Angie Chiang's avatar
Angie Chiang committed
74 75
#define SIG_COEF_CONTEXTS_2D 16
#define SIG_COEF_CONTEXTS_1D 16
76 77
#define SIG_COEF_CONTEXTS \
  (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D + SIG_COEF_CONTEXTS_1D)
78
#else  // CONFIG_EXT_TX
Angie Chiang's avatar
Angie Chiang committed
79 80
#define SIG_COEF_CONTEXTS_2D 16
#define SIG_COEF_CONTEXTS 16
81
#endif  // CONFIG_EXT_TX
82 83 84 85 86 87 88 89
#define COEFF_BASE_CONTEXTS 42
#define DC_SIGN_CONTEXTS 3

#define BR_TMP_OFFSET 12
#define BR_REF_CAT 4
#define LEVEL_CONTEXTS (BR_TMP_OFFSET * BR_REF_CAT)

#define NUM_BASE_LEVELS 2
90 91
#define COEFF_BASE_RANGE (16 - NUM_BASE_LEVELS)
#define BASE_RANGE_SETS 3
92 93 94

#define COEFF_CONTEXT_BITS 6
#define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
95 96

#define BASE_CONTEXT_POSITION_NUM 12
97

98 99 100 101 102
#if CONFIG_CTX1D
#define EMPTY_LINE_CONTEXTS 5
#define HV_EOB_CONTEXTS 24
#endif  // CONFIG_CTX1D

103 104 105 106 107 108 109
typedef enum TX_CLASS {
  TX_CLASS_2D = 0,
  TX_CLASS_HORIZ = 1,
  TX_CLASS_VERT = 2,
  TX_CLASSES = 3,
} TX_CLASS;

110 111
#endif

Yaowu Xu's avatar
Yaowu Xu committed
112
DECLARE_ALIGNED(16, extern const uint8_t, av1_pt_energy_class[ENTROPY_TOKENS]);
Jingning Han's avatar
Jingning Han committed
113

clang-format's avatar
clang-format committed
114 115 116 117 118 119
#define CAT1_MIN_VAL 5
#define CAT2_MIN_VAL 7
#define CAT3_MIN_VAL 11
#define CAT4_MIN_VAL 19
#define CAT5_MIN_VAL 35
#define CAT6_MIN_VAL 67
Jingning Han's avatar
Jingning Han committed
120 121

// Extra bit probabilities.
Yaowu Xu's avatar
Yaowu Xu committed
122 123 124 125 126
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat1_prob[1]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat2_prob[2]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat3_prob[3]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat4_prob[4]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat5_prob[5]);
127
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob[18]);
128 129 130 131 132 133 134 135
#if CONFIG_NEW_MULTISYMBOL
extern const aom_cdf_prob *av1_cat1_cdf[];
extern const aom_cdf_prob *av1_cat2_cdf[];
extern const aom_cdf_prob *av1_cat3_cdf[];
extern const aom_cdf_prob *av1_cat4_cdf[];
extern const aom_cdf_prob *av1_cat5_cdf[];
extern const aom_cdf_prob *av1_cat6_cdf[];
#endif
Jingning Han's avatar
Jingning Han committed
136 137 138 139

#define EOB_MODEL_TOKEN 3

typedef struct {
140 141 142
#if CONFIG_NEW_MULTISYMBOL
  const aom_cdf_prob **cdf;
#else
Yaowu Xu's avatar
Yaowu Xu committed
143
  const aom_prob *prob;
144
#endif
Jingning Han's avatar
Jingning Han committed
145 146 147
  int len;
  int base_val;
  const int16_t *cost;
Yaowu Xu's avatar
Yaowu Xu committed
148
} av1_extra_bit;
Jingning Han's avatar
Jingning Han committed
149 150

// indexed by token value
Yaowu Xu's avatar
Yaowu Xu committed
151
extern const av1_extra_bit av1_extra_bits[ENTROPY_TOKENS];
Jingning Han's avatar
Jingning Han committed
152

153 154 155 156 157 158 159
static INLINE int av1_get_cat6_extrabits_size(TX_SIZE tx_size,
                                              aom_bit_depth_t bit_depth) {
  tx_size = txsize_sqr_up_map[tx_size];
#if CONFIG_TX64X64
  // TODO(debargha): Does TX_64X64 require an additional extrabit?
  if (tx_size > TX_32X32) tx_size = TX_32X32;
#endif
160
#if CONFIG_CHROMA_2X2
161 162 163 164 165
  int tx_offset = (tx_size < TX_4X4) ? 0 : (int)(tx_size - TX_4X4);
#else
  int tx_offset = (int)(tx_size - TX_4X4);
#endif
  int bits = (int)bit_depth + 3 + tx_offset;
166 167 168 169
#if CONFIG_NEW_MULTISYMBOL
  // Round up
  bits = AOMMIN((int)sizeof(av1_cat6_prob), ((bits + 3) & ~3));
#endif
Alex Converse's avatar
Alex Converse committed
170
  assert(bits <= (int)sizeof(av1_cat6_prob));
171 172 173
  return bits;
}

clang-format's avatar
clang-format committed
174
#define DCT_MAX_VALUE 16384
175
#if CONFIG_HIGHBITDEPTH
clang-format's avatar
clang-format committed
176 177
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
178
#endif  // CONFIG_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

/* Coefficients are predicted via a 3-dimensional probability table. */

#define REF_TYPES 2  // intra=0, inter=1

/* Middle dimension reflects the coefficient position within the transform. */
#define COEF_BANDS 6

/* Inside dimension is measure of nearby complexity, that reflects the energy
   of nearby coefficients are nonzero.  For the first coefficient (DC, unless
   block type is 0), we look at the (already encoded) blocks above and to the
   left of the current block.  The context index is then the number (0,1,or 2)
   of these blocks having nonzero coefficients.
   After decoding a coefficient, the measure is determined by the size of the
   most recently decoded coefficient.
   Note that the intuitive meaning of this measure changes as coefficients
   are decoded, e.g., prior to the first token, a zero means that my neighbors
   are empty while, after the first token, because of the use of end-of-block,
   a zero means we just decoded a zero and hence guarantees that a non-zero
   coefficient will appear later in this block.  However, this shift
   in meaning is perfectly OK because our context depends also on the
   coefficient band (and since zigzag positions 0, 1, and 2 are in
   distinct bands). */

#define COEFF_CONTEXTS 6
204 205 206
#define COEFF_CONTEXTS0 3  // for band 0
#define BAND_COEFF_CONTEXTS(band) \
  ((band) == 0 ? COEFF_CONTEXTS0 : COEFF_CONTEXTS)
Jingning Han's avatar
Jingning Han committed
207

clang-format's avatar
clang-format committed
208 209
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
210

Yaowu Xu's avatar
Yaowu Xu committed
211
struct AV1Common;
212
struct frame_contexts;
Yaowu Xu's avatar
Yaowu Xu committed
213
void av1_default_coef_probs(struct AV1Common *cm);
214
#if CONFIG_LV_MAP
Yaowu Xu's avatar
Yaowu Xu committed
215
void av1_adapt_coef_probs(struct AV1Common *cm);
216
#endif  // CONFIG_LV_MAP
Jingning Han's avatar
Jingning Han committed
217 218 219 220 221 222

// This is the index in the scan order beyond which all coefficients for
// 8x8 transform and above are in the top band.
// This macro is currently unused but may be used by certain implementations
#define MAXBAND_INDEX 21

223 224
DECLARE_ALIGNED(16, extern const uint8_t,
                av1_coefband_trans_8x8plus[MAX_TX_SQUARE]);
Yaowu Xu's avatar
Yaowu Xu committed
225 226
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x8_8x4[32]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x4[16]);
Jingning Han's avatar
Jingning Han committed
227

clang-format's avatar
clang-format committed
228
DECLARE_ALIGNED(16, extern const uint16_t, band_count_table[TX_SIZES_ALL][8]);
229 230 231
DECLARE_ALIGNED(16, extern const uint16_t,
                band_cum_count_table[TX_SIZES_ALL][8]);

Jingning Han's avatar
Jingning Han committed
232
static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
233
  switch (tx_size) {
Yaowu Xu's avatar
Yaowu Xu committed
234
    case TX_4X4: return av1_coefband_trans_4x4;
235
    case TX_8X4:
Yaowu Xu's avatar
Yaowu Xu committed
236 237
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
    default: return av1_coefband_trans_8x8plus;
238
  }
Jingning Han's avatar
Jingning Han committed
239 240 241 242 243 244
}

// 128 lists of probabilities are stored for the following ONE node probs:
// 1, 3, 5, 7, ..., 253, 255
// In between probabilities are interpolated linearly

245
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
246

clang-format's avatar
clang-format committed
247
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
248 249

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
250
#define TAIL_NODES (MODEL_NODES + 1)
Yaowu Xu's avatar
Yaowu Xu committed
251 252
extern const aom_tree_index av1_coef_con_tree[TREE_SIZE(ENTROPY_TOKENS)];
extern const aom_prob av1_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES];
Jingning Han's avatar
Jingning Han committed
253

254
typedef aom_cdf_prob coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
255
                                    [CDF_SIZE(ENTROPY_TOKENS)];
256 257
extern const aom_cdf_prob av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                                 [ENTROPY_TOKENS - 2];
258 259
extern const aom_cdf_prob av1_pareto8_tail_probs[COEFF_PROB_MODELS]
                                                [ENTROPY_TOKENS - 3];
260
struct frame_contexts;
261

262
void av1_coef_head_cdfs(struct frame_contexts *fc);
263 264
void av1_coef_pareto_cdfs(struct frame_contexts *fc);

Jingning Han's avatar
Jingning Han committed
265 266 267 268 269 270 271
typedef char ENTROPY_CONTEXT;

static INLINE int combine_entropy_contexts(ENTROPY_CONTEXT a,
                                           ENTROPY_CONTEXT b) {
  return (a != 0) + (b != 0);
}

clang-format's avatar
clang-format committed
272
static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
Jingning Han's avatar
Jingning Han committed
273 274 275
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

276
#if CONFIG_CHROMA_2X2
277
  switch (tx_size) {
278 279 280 281
    case TX_2X2:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
    case TX_4X4:
      above_ec = !!*(const uint16_t *)a;
      left_ec = !!*(const uint16_t *)l;
      break;
    case TX_4X8:
      above_ec = !!*(const uint16_t *)a;
      left_ec = !!*(const uint32_t *)l;
      break;
    case TX_8X4:
      above_ec = !!*(const uint32_t *)a;
      left_ec = !!*(const uint16_t *)l;
      break;
    case TX_8X8:
      above_ec = !!*(const uint32_t *)a;
      left_ec = !!*(const uint32_t *)l;
      break;
    case TX_8X16:
      above_ec = !!*(const uint32_t *)a;
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_16X8:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!*(const uint32_t *)l;
      break;
    case TX_16X16:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_16X32:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
    case TX_32X16:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_32X32:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
322 323 324 325 326 327 328
#if CONFIG_TX64X64
    case TX_64X64:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8) |
                    *(const uint64_t *)(a + 16) | *(const uint64_t *)(a + 24));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8) |
                   *(const uint64_t *)(l + 16) | *(const uint64_t *)(l + 24));
      break;
329 330 331 332 333 334 335 336 337 338
    case TX_32X64:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8) |
                   *(const uint64_t *)(l + 16) | *(const uint64_t *)(l + 24));
      break;
    case TX_64X32:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8) |
                    *(const uint64_t *)(a + 16) | *(const uint64_t *)(a + 24));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
339
#endif  // CONFIG_TX64X64
Yue Chen's avatar
Yue Chen committed
340
#if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX)
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
    case TX_4X16:
      above_ec = !!*(const uint16_t *)a;
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_16X4:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!*(const uint16_t *)l;
      break;
    case TX_8X32:
      above_ec = !!*(const uint32_t *)a;
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
    case TX_32X8:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!*(const uint32_t *)l;
      break;
Yue Chen's avatar
Yue Chen committed
357
#endif
358 359 360
    default: assert(0 && "Invalid transform size."); break;
  }
  return combine_entropy_contexts(above_ec, left_ec);
361
#endif  // CONFIG_CHROMA_2X2
362 363

  switch (tx_size) {
Jingning Han's avatar
Jingning Han committed
364 365 366 367
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
368 369 370 371 372 373 374 375
    case TX_4X8:
      above_ec = a[0] != 0;
      left_ec = !!*(const uint16_t *)l;
      break;
    case TX_8X4:
      above_ec = !!*(const uint16_t *)a;
      left_ec = l[0] != 0;
      break;
376 377
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
378
      left_ec = !!*(const uint32_t *)l;
379 380 381
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
382
      left_ec = !!*(const uint16_t *)l;
383 384 385
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
386
      left_ec = !!*(const uint64_t *)l;
387 388 389
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
390
      left_ec = !!*(const uint32_t *)l;
391
      break;
Jingning Han's avatar
Jingning Han committed
392 393
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
394
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
395 396 397
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
398
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
399 400 401
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
402
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
403
      break;
404 405 406 407 408
#if CONFIG_TX64X64
    case TX_64X64:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
409 410 411 412 413 414 415 416
    case TX_32X64:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
    case TX_64X32:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!*(const uint64_t *)l;
      break;
417
#endif  // CONFIG_TX64X64
Yue Chen's avatar
Yue Chen committed
418
#if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX)
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
    case TX_4X16:
      above_ec = a[0] != 0;
      left_ec = !!*(const uint32_t *)l;
      break;
    case TX_16X4:
      above_ec = !!*(const uint32_t *)a;
      left_ec = l[0] != 0;
      break;
    case TX_8X32:
      above_ec = !!*(const uint16_t *)a;
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_32X8:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!*(const uint16_t *)l;
      break;
Yue Chen's avatar
Yue Chen committed
435
#endif
clang-format's avatar
clang-format committed
436
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
437 438 439 440
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

441 442 443 444 445
#define COEF_COUNT_SAT 24
#define COEF_MAX_UPDATE_FACTOR 112
#define COEF_COUNT_SAT_AFTER_KEY 24
#define COEF_MAX_UPDATE_FACTOR_AFTER_KEY 128

Angie Chiang's avatar
Angie Chiang committed
446
#if CONFIG_ADAPT_SCAN
447
#define ADAPT_SCAN_PROB_PRECISION 10
448 449 450 451
// 1/8 update rate
#define ADAPT_SCAN_UPDATE_LOG_RATE 3
#define ADAPT_SCAN_UPDATE_RATE \
  (1 << (ADAPT_SCAN_PROB_PRECISION - ADAPT_SCAN_UPDATE_LOG_RATE))
Angie Chiang's avatar
Angie Chiang committed
452 453
#endif

Yaowu Xu's avatar
Yaowu Xu committed
454 455 456 457
static INLINE aom_prob av1_merge_probs(aom_prob pre_prob,
                                       const unsigned int ct[2],
                                       unsigned int count_sat,
                                       unsigned int max_update_factor) {
458 459 460
  return merge_probs(pre_prob, ct, count_sat, max_update_factor);
}

Yaowu Xu's avatar
Yaowu Xu committed
461 462
static INLINE aom_prob av1_mode_mv_merge_probs(aom_prob pre_prob,
                                               const unsigned int ct[2]) {
463 464 465
  return mode_mv_merge_probs(pre_prob, ct);
}

466 467
void av1_average_tile_coef_cdfs(struct frame_contexts *fc,
                                struct frame_contexts *ec_ctxs[],
468
                                aom_cdf_prob *cdf_ptrs[], int num_tiles);
469 470
void av1_average_tile_mv_cdfs(struct frame_contexts *fc,
                              struct frame_contexts *ec_ctxs[],
471
                              aom_cdf_prob *cdf_ptrs[], int num_tiles);
472 473
void av1_average_tile_intra_cdfs(struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
474
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
475 476 477
void av1_average_tile_inter_cdfs(struct AV1Common *cm,
                                 struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
478
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
479 480 481
#if CONFIG_PVQ
void av1_default_pvq_probs(struct AV1Common *cm);
void av1_average_tile_pvq_cdfs(struct frame_contexts *fc,
482
                               struct frame_contexts *ec_ctxs[], int num_tiles);
483
#endif  // CONFIG_PVQ
Jingning Han's avatar
Jingning Han committed
484 485 486 487
#ifdef __cplusplus
}  // extern "C"
#endif

Yaowu Xu's avatar
Yaowu Xu committed
488
#endif  // AV1_COMMON_ENTROPY_H_