entropy.h 12.2 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
20
#include "av1/common/common.h"
#include "av1/common/enums.h"
Jingning Han's avatar
Jingning Han committed
21
22
23
24
25

#ifdef __cplusplus
extern "C" {
#endif

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

hui su's avatar
hui su committed
29
30
31
32
33
34
#if CONFIG_ENTROPY
#define COEF_PROBS_BUFS 16
#define QCTX_BIN_BITS 2
#define QCTX_BINS (1 << QCTX_BIN_BITS)
#endif  // CONFIG_ENTROPY

Jingning Han's avatar
Jingning Han committed
35
// Coefficient token alphabet
clang-format's avatar
clang-format committed
36
37
38
39
40
#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
41
42
43
44
45
46
#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
47
#define EOB_TOKEN 11        // EOB   Extra Bits 0+0
Jingning Han's avatar
Jingning Han committed
48
49
50
51
52

#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

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

clang-format's avatar
clang-format committed
55
56
57
58
59
60
#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
61
62

// Extra bit probabilities.
Yaowu Xu's avatar
Yaowu Xu committed
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob[14]);

#if CONFIG_AOM_HIGHBITDEPTH
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat1_prob_high10[1]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat2_prob_high10[2]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat3_prob_high10[3]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat4_prob_high10[4]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat5_prob_high10[5]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob_high10[16]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat1_prob_high12[1]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat2_prob_high12[2]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat3_prob_high12[3]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat4_prob_high12[4]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat5_prob_high12[5]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_cat6_prob_high12[18]);
#endif  // CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
84
85
86
87

#define EOB_MODEL_TOKEN 3

typedef struct {
Yaowu Xu's avatar
Yaowu Xu committed
88
  const aom_prob *prob;
Jingning Han's avatar
Jingning Han committed
89
90
91
  int len;
  int base_val;
  const int16_t *cost;
Yaowu Xu's avatar
Yaowu Xu committed
92
} av1_extra_bit;
Jingning Han's avatar
Jingning Han committed
93
94

// indexed by token value
Yaowu Xu's avatar
Yaowu Xu committed
95
96
97
98
99
extern const av1_extra_bit av1_extra_bits[ENTROPY_TOKENS];
#if CONFIG_AOM_HIGHBITDEPTH
extern const av1_extra_bit av1_extra_bits_high10[ENTROPY_TOKENS];
extern const av1_extra_bit av1_extra_bits_high12[ENTROPY_TOKENS];
#endif  // CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
100

clang-format's avatar
clang-format committed
101
#define DCT_MAX_VALUE 16384
Yaowu Xu's avatar
Yaowu Xu committed
102
#if CONFIG_AOM_HIGHBITDEPTH
clang-format's avatar
clang-format committed
103
104
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
Yaowu Xu's avatar
Yaowu Xu committed
105
#endif  // CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

/* 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
131
132
133
#if CONFIG_EC_MULTISYMBOL
#define BLOCKZ_CONTEXTS 3
#endif
134
135
136
#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
137
138
139

// #define ENTROPY_STATS

clang-format's avatar
clang-format committed
140
141
142
143
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
144

clang-format's avatar
clang-format committed
145
146
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
147

Yaowu Xu's avatar
Yaowu Xu committed
148
149
150
struct AV1Common;
void av1_default_coef_probs(struct AV1Common *cm);
void av1_adapt_coef_probs(struct AV1Common *cm);
hui su's avatar
hui su committed
151
#if CONFIG_ENTROPY
Yaowu Xu's avatar
Yaowu Xu committed
152
void av1_partial_adapt_probs(struct AV1Common *cm, int mi_row, int mi_col);
hui su's avatar
hui su committed
153
#endif  // CONFIG_ENTROPY
Jingning Han's avatar
Jingning Han committed
154
155
156
157
158
159

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

160
161
DECLARE_ALIGNED(16, extern const uint8_t,
                av1_coefband_trans_8x8plus[MAX_TX_SQUARE]);
Yaowu Xu's avatar
Yaowu Xu committed
162
163
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
164

clang-format's avatar
clang-format committed
165
DECLARE_ALIGNED(16, extern const uint16_t, band_count_table[TX_SIZES_ALL][8]);
166
167
168
DECLARE_ALIGNED(16, extern const uint16_t,
                band_cum_count_table[TX_SIZES_ALL][8]);

Jingning Han's avatar
Jingning Han committed
169
static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
170
  switch (tx_size) {
Yaowu Xu's avatar
Yaowu Xu committed
171
    case TX_4X4: return av1_coefband_trans_4x4;
172
    case TX_8X4:
Yaowu Xu's avatar
Yaowu Xu committed
173
174
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
    default: return av1_coefband_trans_8x8plus;
175
  }
Jingning Han's avatar
Jingning Han committed
176
177
178
179
180
181
}

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

182
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
183

clang-format's avatar
clang-format committed
184
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
185

clang-format's avatar
clang-format committed
186
#define PIVOT_NODE 2  // which node is pivot
Jingning Han's avatar
Jingning Han committed
187
188

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
189
#define TAIL_NODES (MODEL_NODES + 1)
Yaowu Xu's avatar
Yaowu Xu committed
190
191
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
192

Yaowu Xu's avatar
Yaowu Xu committed
193
194
typedef aom_prob av1_coeff_probs_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                      [UNCONSTRAINED_NODES];
Jingning Han's avatar
Jingning Han committed
195

clang-format's avatar
clang-format committed
196
197
198
typedef unsigned int av1_coeff_count_model[REF_TYPES][COEF_BANDS]
                                          [COEFF_CONTEXTS]
                                          [UNCONSTRAINED_NODES + 1];
Jingning Han's avatar
Jingning Han committed
199

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

202
#if CONFIG_EC_MULTISYMBOL
203
204
typedef aom_cdf_prob coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                    [ENTROPY_TOKENS];
205
206
typedef aom_prob av1_blockz_probs_model[REF_TYPES][BLOCKZ_CONTEXTS];
typedef unsigned int av1_blockz_count_model[REF_TYPES][BLOCKZ_CONTEXTS][2];
207
208
extern const aom_cdf_prob av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                                 [ENTROPY_TOKENS - 2];
209
210
extern const aom_cdf_prob av1_pareto8_tail_cdfs[COEFF_PROB_MODELS]
                                               [ENTROPY_TOKENS - 3];
211
212
struct frame_contexts;
void av1_coef_pareto_cdfs(struct frame_contexts *fc);
213
#endif  // CONFIG_EC_MULTISYMBOL
214

Jingning Han's avatar
Jingning Han committed
215
216
217
218
219
220
221
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
222
static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
Jingning Han's avatar
Jingning Han committed
223
224
225
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

226
#if CONFIG_CB4X4
227
  switch (tx_size) {
228
229
230
231
    case TX_2X2:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
    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);
275
#endif
276
277

  switch (tx_size) {
Jingning Han's avatar
Jingning Han committed
278
279
280
281
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
282
283
284
285
286
287
288
289
    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;
290
291
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
292
      left_ec = !!*(const uint32_t *)l;
293
294
295
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
296
      left_ec = !!*(const uint16_t *)l;
297
298
299
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
300
      left_ec = !!*(const uint64_t *)l;
301
302
303
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
304
      left_ec = !!*(const uint32_t *)l;
305
      break;
Jingning Han's avatar
Jingning Han committed
306
307
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
308
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
309
310
311
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
312
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
313
314
315
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
316
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
317
      break;
318
319
320
321
322
323
#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
324
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
325
326
327
328
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

329
330
331
332
333
#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
334
335
336
337
#if CONFIG_ADAPT_SCAN
#define ADAPT_SCAN_UPDATE_RATE_16 (1 << 13)
#endif

Yaowu Xu's avatar
Yaowu Xu committed
338
339
340
341
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) {
342
343
344
  return merge_probs(pre_prob, ct, count_sat, max_update_factor);
}

Yaowu Xu's avatar
Yaowu Xu committed
345
346
static INLINE aom_prob av1_mode_mv_merge_probs(aom_prob pre_prob,
                                               const unsigned int ct[2]) {
347
348
349
  return mode_mv_merge_probs(pre_prob, ct);
}

Jingning Han's avatar
Jingning Han committed
350
351
352
353
#ifdef __cplusplus
}  // extern "C"
#endif

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