entropy.h 13.5 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
32
#define QCTX_BIN_BITS 2
#define QCTX_BINS (1 << QCTX_BIN_BITS)
hui su's avatar
hui su committed
33
34
35
36
37
#endif  // CONFIG_Q_ADAPT_PROBS

#if CONFIG_SUBFRAME_PROB_UPDATE
#define COEF_PROBS_BUFS 16
#endif  // CONFIG_SUBFRAME_PROB_UPDATE
hui su's avatar
hui su committed
38

Jingning Han's avatar
Jingning Han committed
39
// Coefficient token alphabet
clang-format's avatar
clang-format committed
40
41
42
43
44
#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
45
46
47
48
49
50
#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
51
#define EOB_TOKEN 11        // EOB   Extra Bits 0+0
52
#if CONFIG_NEW_TOKENSET
53
54
55
#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)
56
#define BLOCK_Z_TOKEN 255  // block zero
57
58
#define HEAD_TOKENS 5
#define TAIL_TOKENS 9
59
60
61
62
63
#define ONE_TOKEN_EOB 1
#define ONE_TOKEN_NEOB 2
#define TWO_TOKEN_PLUS_EOB 3
#define TWO_TOKEN_PLUS_NEOB 4
#endif
Jingning Han's avatar
Jingning Han committed
64
65
66
67
#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#if CONFIG_LV_MAP
#define TXB_SKIP_CONTEXTS 13
#define SIG_COEF_CONTEXTS 20
#define EOB_COEF_CONTEXTS 25
#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
#define COEFF_BASE_RANGE (15 - NUM_BASE_LEVELS)

#define COEFF_CONTEXT_BITS 6
#define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
#endif

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

clang-format's avatar
clang-format committed
88
89
90
91
92
93
#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
94
95

// Extra bit probabilities.
Yaowu Xu's avatar
Yaowu Xu committed
96
97
98
99
100
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]);
101
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob[18]);
Jingning Han's avatar
Jingning Han committed
102
103
104
105

#define EOB_MODEL_TOKEN 3

typedef struct {
Yaowu Xu's avatar
Yaowu Xu committed
106
  const aom_prob *prob;
Jingning Han's avatar
Jingning Han committed
107
108
109
  int len;
  int base_val;
  const int16_t *cost;
Yaowu Xu's avatar
Yaowu Xu committed
110
} av1_extra_bit;
Jingning Han's avatar
Jingning Han committed
111
112

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

115
116
117
118
119
120
121
122
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
  int bits = (int)bit_depth + 3 + (int)tx_size;
Alex Converse's avatar
Alex Converse committed
123
  assert(bits <= (int)sizeof(av1_cat6_prob));
124
125
126
  return bits;
}

clang-format's avatar
clang-format committed
127
#define DCT_MAX_VALUE 16384
Yaowu Xu's avatar
Yaowu Xu committed
128
#if CONFIG_AOM_HIGHBITDEPTH
clang-format's avatar
clang-format committed
129
130
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
Yaowu Xu's avatar
Yaowu Xu committed
131
#endif  // CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

/* 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
157
158
159
#if CONFIG_EC_MULTISYMBOL
#define BLOCKZ_CONTEXTS 3
#endif
160
161
162
#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
163
164
165

// #define ENTROPY_STATS

clang-format's avatar
clang-format committed
166
167
168
169
typedef unsigned int av1_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                    [ENTROPY_TOKENS];
typedef unsigned int av1_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                    [ENTROPY_NODES][2];
Jingning Han's avatar
Jingning Han committed
170

clang-format's avatar
clang-format committed
171
172
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
173

Yaowu Xu's avatar
Yaowu Xu committed
174
struct AV1Common;
175
struct frame_contexts;
Yaowu Xu's avatar
Yaowu Xu committed
176
177
void av1_default_coef_probs(struct AV1Common *cm);
void av1_adapt_coef_probs(struct AV1Common *cm);
178
179
180
#if CONFIG_EC_ADAPT
void av1_adapt_coef_cdfs(struct AV1Common *cm, struct frame_contexts *pre_fc);
#endif
hui su's avatar
hui su committed
181
#if CONFIG_SUBFRAME_PROB_UPDATE
Yaowu Xu's avatar
Yaowu Xu committed
182
void av1_partial_adapt_probs(struct AV1Common *cm, int mi_row, int mi_col);
hui su's avatar
hui su committed
183
#endif  // CONFIG_SUBFRAME_PROB_UPDATE
Jingning Han's avatar
Jingning Han committed
184
185
186
187
188
189

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

190
191
DECLARE_ALIGNED(16, extern const uint8_t,
                av1_coefband_trans_8x8plus[MAX_TX_SQUARE]);
Yaowu Xu's avatar
Yaowu Xu committed
192
193
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
194

clang-format's avatar
clang-format committed
195
DECLARE_ALIGNED(16, extern const uint16_t, band_count_table[TX_SIZES_ALL][8]);
196
197
198
DECLARE_ALIGNED(16, extern const uint16_t,
                band_cum_count_table[TX_SIZES_ALL][8]);

Jingning Han's avatar
Jingning Han committed
199
static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
200
  switch (tx_size) {
Yaowu Xu's avatar
Yaowu Xu committed
201
    case TX_4X4: return av1_coefband_trans_4x4;
202
    case TX_8X4:
Yaowu Xu's avatar
Yaowu Xu committed
203
204
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
    default: return av1_coefband_trans_8x8plus;
205
  }
Jingning Han's avatar
Jingning Han committed
206
207
208
209
210
211
}

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

212
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
213

clang-format's avatar
clang-format committed
214
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
215

clang-format's avatar
clang-format committed
216
#define PIVOT_NODE 2  // which node is pivot
Jingning Han's avatar
Jingning Han committed
217
218

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
219
#define TAIL_NODES (MODEL_NODES + 1)
Yaowu Xu's avatar
Yaowu Xu committed
220
221
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
222

Yaowu Xu's avatar
Yaowu Xu committed
223
224
typedef aom_prob av1_coeff_probs_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                      [UNCONSTRAINED_NODES];
Jingning Han's avatar
Jingning Han committed
225

clang-format's avatar
clang-format committed
226
227
228
typedef unsigned int av1_coeff_count_model[REF_TYPES][COEF_BANDS]
                                          [COEFF_CONTEXTS]
                                          [UNCONSTRAINED_NODES + 1];
Jingning Han's avatar
Jingning Han committed
229

Yaowu Xu's avatar
Yaowu Xu committed
230
void av1_model_to_full_probs(const aom_prob *model, aom_prob *full);
Jingning Han's avatar
Jingning Han committed
231

232
#if CONFIG_EC_MULTISYMBOL
233
typedef aom_cdf_prob coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
234
                                    [CDF_SIZE(ENTROPY_TOKENS)];
235
236
typedef aom_prob av1_blockz_probs_model[REF_TYPES][BLOCKZ_CONTEXTS];
typedef unsigned int av1_blockz_count_model[REF_TYPES][BLOCKZ_CONTEXTS][2];
237
238
extern const aom_cdf_prob av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                                 [ENTROPY_TOKENS - 2];
239
240
extern const aom_cdf_prob av1_pareto8_tail_probs[COEFF_PROB_MODELS]
                                                [ENTROPY_TOKENS - 3];
241
struct frame_contexts;
242
243
244
#if CONFIG_NEW_TOKENSET
void av1_coef_head_cdfs(struct frame_contexts *fc);
#endif
245
void av1_coef_pareto_cdfs(struct frame_contexts *fc);
246
#endif  // CONFIG_EC_MULTISYMBOL
247

Jingning Han's avatar
Jingning Han committed
248
249
250
251
252
253
254
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
255
static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
Jingning Han's avatar
Jingning Han committed
256
257
258
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

259
#if CONFIG_CB4X4
260
  switch (tx_size) {
261
262
263
264
    case TX_2X2:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
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
    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;
    default: assert(0 && "Invalid transform size."); break;
  }
  return combine_entropy_contexts(above_ec, left_ec);
308
#endif
309
310

  switch (tx_size) {
Jingning Han's avatar
Jingning Han committed
311
312
313
314
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
315
316
317
318
319
320
321
322
    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;
323
324
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
325
      left_ec = !!*(const uint32_t *)l;
326
327
328
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
329
      left_ec = !!*(const uint16_t *)l;
330
331
332
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
333
      left_ec = !!*(const uint64_t *)l;
334
335
336
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
337
      left_ec = !!*(const uint32_t *)l;
338
      break;
Jingning Han's avatar
Jingning Han committed
339
340
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
341
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
342
343
344
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
345
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
346
347
348
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
349
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
350
      break;
351
352
353
354
355
356
#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;
#endif  // CONFIG_TX64X64
clang-format's avatar
clang-format committed
357
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
358
359
360
361
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

362
363
364
365
366
#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
367
368
369
370
#if CONFIG_ADAPT_SCAN
#define ADAPT_SCAN_UPDATE_RATE_16 (1 << 13)
#endif

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

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

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

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