entropy.h 13.4 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

#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
Jingning Han's avatar
Jingning Han committed
70
#define EOB_COEF_CONTEXTS 22
71 72
#endif  // CONFIG_CTX1D

Dake He's avatar
Dake He committed
73
#define USE_CAUSAL_BASE_CTX 1
74

75
#define SIG_COEF_CONTEXTS_2D 26
Angie Chiang's avatar
Angie Chiang committed
76
#define SIG_COEF_CONTEXTS_1D 16
77
#if CONFIG_LV_MAP_MULTI
78
#define SIG_COEF_CONTEXTS_EOB 4
79 80 81
#define SIG_COEF_CONTEXTS \
  (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D + SIG_COEF_CONTEXTS_EOB)
#else
82 83 84
#if USE_CAUSAL_BASE_CTX
#define SIG_COEF_CONTEXTS (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D)
#else  // USE_CAUSAL_BASE_CTX
85 86
#define SIG_COEF_CONTEXTS \
  (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D + SIG_COEF_CONTEXTS_1D)
87
#endif  // USE_CAUSAL_BASE_CTX
88
#endif
89 90 91 92

#if USE_CAUSAL_BASE_CTX
#define COEFF_BASE_CONTEXTS (SIG_COEF_CONTEXTS)
#else
93
#define COEFF_BASE_CONTEXTS 25
94
#endif
95 96 97 98 99 100 101
#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
102 103 104 105 106

#if CONFIG_LV_MAP_MULTI
#define BR_CDF_SIZE (4)
#define COEFF_BASE_RANGE (4 * (BR_CDF_SIZE - 1))
#else
107 108
#define COEFF_BASE_RANGE (16 - NUM_BASE_LEVELS)
#define BASE_RANGE_SETS 3
109
#endif
110 111 112

#define COEFF_CONTEXT_BITS 6
#define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
113 114

#define BASE_CONTEXT_POSITION_NUM 12
115

116 117 118 119 120
#if CONFIG_CTX1D
#define EMPTY_LINE_CONTEXTS 5
#define HV_EOB_CONTEXTS 24
#endif  // CONFIG_CTX1D

121 122 123 124 125 126 127
typedef enum TX_CLASS {
  TX_CLASS_2D = 0,
  TX_CLASS_HORIZ = 1,
  TX_CLASS_VERT = 2,
  TX_CLASSES = 3,
} TX_CLASS;

128 129
#endif

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

clang-format's avatar
clang-format committed
132 133 134 135 136 137
#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
138 139

// Extra bit probabilities.
Yaowu Xu's avatar
Yaowu Xu committed
140 141 142 143 144
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]);
145
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob[18]);
146 147 148 149 150 151
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[];
Jingning Han's avatar
Jingning Han committed
152 153 154 155

#define EOB_MODEL_TOKEN 3

typedef struct {
156
  const aom_cdf_prob **cdf;
Jingning Han's avatar
Jingning Han committed
157 158 159
  int len;
  int base_val;
  const int16_t *cost;
Yaowu Xu's avatar
Yaowu Xu committed
160
} av1_extra_bit;
Jingning Han's avatar
Jingning Han committed
161 162

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

165 166 167 168 169 170 171
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
172 173
  int tx_offset = (int)(tx_size - TX_4X4);
  int bits = (int)bit_depth + 3 + tx_offset;
174 175
  // Round up
  bits = AOMMIN((int)sizeof(av1_cat6_prob), ((bits + 3) & ~3));
Alex Converse's avatar
Alex Converse committed
176
  assert(bits <= (int)sizeof(av1_cat6_prob));
177 178 179
  return bits;
}

clang-format's avatar
clang-format committed
180
#define DCT_MAX_VALUE 16384
181
#if CONFIG_HIGHBITDEPTH
clang-format's avatar
clang-format committed
182 183
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
184
#endif  // CONFIG_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209

/* 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
210 211 212
#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
213

clang-format's avatar
clang-format committed
214 215
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
216

Yaowu Xu's avatar
Yaowu Xu committed
217
struct AV1Common;
218
struct frame_contexts;
Yaowu Xu's avatar
Yaowu Xu committed
219
void av1_default_coef_probs(struct AV1Common *cm);
220
#if CONFIG_LV_MAP
Yaowu Xu's avatar
Yaowu Xu committed
221
void av1_adapt_coef_probs(struct AV1Common *cm);
222
#endif  // CONFIG_LV_MAP
Jingning Han's avatar
Jingning Han committed
223 224 225 226 227 228

// 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

229 230
DECLARE_ALIGNED(16, extern const uint8_t,
                av1_coefband_trans_8x8plus[MAX_TX_SQUARE]);
Yaowu Xu's avatar
Yaowu Xu committed
231 232
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
233

clang-format's avatar
clang-format committed
234
DECLARE_ALIGNED(16, extern const uint16_t, band_count_table[TX_SIZES_ALL][8]);
235 236 237
DECLARE_ALIGNED(16, extern const uint16_t,
                band_cum_count_table[TX_SIZES_ALL][8]);

Jingning Han's avatar
Jingning Han committed
238
static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
239
  switch (tx_size) {
Yaowu Xu's avatar
Yaowu Xu committed
240
    case TX_4X4: return av1_coefband_trans_4x4;
241
    case TX_8X4:
Yaowu Xu's avatar
Yaowu Xu committed
242 243
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
    default: return av1_coefband_trans_8x8plus;
244
  }
Jingning Han's avatar
Jingning Han committed
245 246 247 248 249 250
}

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

251
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
252

clang-format's avatar
clang-format committed
253
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
254 255

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
256
#define TAIL_NODES (MODEL_NODES + 1)
Yaowu Xu's avatar
Yaowu Xu committed
257 258
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
259

260
typedef aom_cdf_prob coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
261
                                    [CDF_SIZE(ENTROPY_TOKENS)];
262 263
extern const aom_cdf_prob av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                                 [ENTROPY_TOKENS - 2];
264 265
extern const aom_cdf_prob av1_pareto8_tail_probs[COEFF_PROB_MODELS]
                                                [ENTROPY_TOKENS - 3];
266
struct frame_contexts;
267

268
void av1_coef_head_cdfs(struct frame_contexts *fc);
269 270
void av1_coef_pareto_cdfs(struct frame_contexts *fc);

Jingning Han's avatar
Jingning Han committed
271 272 273 274 275 276 277
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
278
static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
Jingning Han's avatar
Jingning Han committed
279 280 281
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

282
  switch (tx_size) {
Jingning Han's avatar
Jingning Han committed
283 284 285 286
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
287 288 289 290 291 292 293 294
    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;
295 296
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
297
      left_ec = !!*(const uint32_t *)l;
298 299 300
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
301
      left_ec = !!*(const uint16_t *)l;
302 303 304
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
305
      left_ec = !!*(const uint64_t *)l;
306 307 308
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
309
      left_ec = !!*(const uint32_t *)l;
310
      break;
Jingning Han's avatar
Jingning Han committed
311 312
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
313
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
314 315 316
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
317
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
318 319 320
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
321
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
322
      break;
323 324 325 326 327
#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;
328 329 330 331 332 333 334 335
    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;
336
#endif  // CONFIG_TX64X64
337
#if CONFIG_EXT_PARTITION_TYPES && CONFIG_RECT_TX_EXT
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
    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;
354
#endif  // CONFIG_EXT_PARTITION_TYPES && CONFIG_RECT_TX_EXT
clang-format's avatar
clang-format committed
355
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
356 357 358 359
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

360 361 362 363 364
#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
365
#if CONFIG_ADAPT_SCAN
366
#define ADAPT_SCAN_PROB_PRECISION 10
367 368 369 370
// 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
371 372
#endif

Yaowu Xu's avatar
Yaowu Xu committed
373 374 375 376
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) {
377 378 379
  return merge_probs(pre_prob, ct, count_sat, max_update_factor);
}

Yaowu Xu's avatar
Yaowu Xu committed
380 381
static INLINE aom_prob av1_mode_mv_merge_probs(aom_prob pre_prob,
                                               const unsigned int ct[2]) {
382 383 384
  return mode_mv_merge_probs(pre_prob, ct);
}

385 386
void av1_average_tile_coef_cdfs(struct frame_contexts *fc,
                                struct frame_contexts *ec_ctxs[],
387
                                aom_cdf_prob *cdf_ptrs[], int num_tiles);
388 389
void av1_average_tile_mv_cdfs(struct frame_contexts *fc,
                              struct frame_contexts *ec_ctxs[],
390
                              aom_cdf_prob *cdf_ptrs[], int num_tiles);
391 392
void av1_average_tile_intra_cdfs(struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
393
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
394 395 396
void av1_average_tile_inter_cdfs(struct AV1Common *cm,
                                 struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
397
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
398 399 400
void av1_average_tile_loopfilter_cdfs(struct frame_contexts *fc,
                                      struct frame_contexts *ec_ctxs[],
                                      aom_cdf_prob *cdf_ptrs[], int num_tiles);
Jingning Han's avatar
Jingning Han committed
401 402 403 404
#ifdef __cplusplus
}  // extern "C"
#endif

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