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

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

Alex Converse's avatar
Alex Converse committed
18
#if CONFIG_ANS
Alex Converse's avatar
Alex Converse committed
19
#include "aom_dsp/ans.h"
Alex Converse's avatar
Alex Converse committed
20
#endif  // CONFIG_ANS
21
22
#include "av1/common/common.h"
#include "av1/common/enums.h"
Jingning Han's avatar
Jingning Han committed
23
24
25
26
27

#ifdef __cplusplus
extern "C" {
#endif

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

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

#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

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

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

// Extra bit probabilities.
Yaowu Xu's avatar
Yaowu Xu committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
86
87
88
89

#define EOB_MODEL_TOKEN 3

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

// indexed by token value
Yaowu Xu's avatar
Yaowu Xu committed
98
99
100
101
102
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
103

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

/* 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
#define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS)

// #define ENTROPY_STATS

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

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

Yaowu Xu's avatar
Yaowu Xu committed
146
147
148
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
149
#if CONFIG_ENTROPY
Yaowu Xu's avatar
Yaowu Xu committed
150
void av1_partial_adapt_probs(struct AV1Common *cm, int mi_row, int mi_col);
hui su's avatar
hui su committed
151
#endif  // CONFIG_ENTROPY
Jingning Han's avatar
Jingning Han committed
152
153
154
155
156
157

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

Yaowu Xu's avatar
Yaowu Xu committed
158
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_8x8plus[1024]);
159
#if CONFIG_EXT_TX
Yaowu Xu's avatar
Yaowu Xu committed
160
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x8_8x4[32]);
161
#endif  // CONFIG_EXT_TX
Yaowu Xu's avatar
Yaowu Xu committed
162
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x4[16]);
Jingning Han's avatar
Jingning Han committed
163

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

Jingning Han's avatar
Jingning Han committed
168
static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
169
  switch (tx_size) {
Yaowu Xu's avatar
Yaowu Xu committed
170
    case TX_4X4: return av1_coefband_trans_4x4;
171
#if CONFIG_EXT_TX
Yaowu Xu's avatar
Yaowu Xu committed
172
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
173
#endif  // CONFIG_EXT_TX
Yaowu Xu's avatar
Yaowu Xu committed
174
    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)
Yaowu Xu's avatar
Yaowu Xu committed
189
190
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];
Alex Converse's avatar
Alex Converse committed
191
#if CONFIG_ANS
clang-format's avatar
clang-format committed
192
193
extern const AnsP10 av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                           [ENTROPY_TOKENS - 2];
Alex Converse's avatar
Alex Converse committed
194

195
typedef rans_lut coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS];
Alex Converse's avatar
Alex Converse committed
196
#endif  // CONFIG_ANS
Jingning Han's avatar
Jingning Han committed
197

Yaowu Xu's avatar
Yaowu Xu committed
198
199
typedef aom_prob av1_coeff_probs_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                      [UNCONSTRAINED_NODES];
Jingning Han's avatar
Jingning Han committed
200

clang-format's avatar
clang-format committed
201
202
203
typedef unsigned int av1_coeff_count_model[REF_TYPES][COEF_BANDS]
                                          [COEFF_CONTEXTS]
                                          [UNCONSTRAINED_NODES + 1];
Jingning Han's avatar
Jingning Han committed
204

Yaowu Xu's avatar
Yaowu Xu committed
205
void av1_model_to_full_probs(const aom_prob *model, aom_prob *full);
Jingning Han's avatar
Jingning Han committed
206
207
208
209
210
211
212
213

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

  switch (tx_size) {
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
223
224
225
226
227
228
229
230
231
#if CONFIG_EXT_TX
    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;
232
233
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
234
      left_ec = !!*(const uint32_t *)l;
235
236
237
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
238
      left_ec = !!*(const uint16_t *)l;
239
240
241
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
242
      left_ec = !!*(const uint64_t *)l;
243
244
245
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
246
      left_ec = !!*(const uint32_t *)l;
247
      break;
248
#endif  // CONFIG_EXT_TX
Jingning Han's avatar
Jingning Han committed
249
250
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
251
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
252
253
254
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
255
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
256
257
258
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
259
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
260
      break;
clang-format's avatar
clang-format committed
261
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
262
263
264
265
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

266
267
#if CONFIG_ANS
struct frame_contexts;
Yaowu Xu's avatar
Yaowu Xu committed
268
void av1_coef_pareto_cdfs(struct frame_contexts *fc);
269
#endif  // CONFIG_ANS
270
271

#if CONFIG_ENTROPY
clang-format's avatar
clang-format committed
272
273
274
#define COEF_COUNT_SAT_BITS 5
#define COEF_MAX_UPDATE_FACTOR_BITS 7
#define COEF_COUNT_SAT_AFTER_KEY_BITS 5
275
#define COEF_MAX_UPDATE_FACTOR_AFTER_KEY_BITS 7
clang-format's avatar
clang-format committed
276
277
#define MODE_MV_COUNT_SAT_BITS 5
#define MODE_MV_MAX_UPDATE_FACTOR_BITS 7
278
279
280
281
282
283
284
285
286
287

#else

#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

#endif  // CONFIG_ENTROPY

Yaowu Xu's avatar
Yaowu Xu committed
288
289
290
291
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) {
292
#if CONFIG_ENTROPY
Yaowu Xu's avatar
Yaowu Xu committed
293
  const aom_prob prob = get_binary_prob(ct[0], ct[1]);
294
  const unsigned int count =
Yaowu Xu's avatar
Yaowu Xu committed
295
      AOMMIN(ct[0] + ct[1], (unsigned int)(1 << count_sat));
clang-format's avatar
clang-format committed
296
  const unsigned int factor = count << (max_update_factor - count_sat);
297
298
299
300
301
302
  return weighted_prob(pre_prob, prob, factor);
#else
  return merge_probs(pre_prob, ct, count_sat, max_update_factor);
#endif  // CONFIG_ENTROPY
}

Yaowu Xu's avatar
Yaowu Xu committed
303
304
static INLINE aom_prob av1_mode_mv_merge_probs(aom_prob pre_prob,
                                               const unsigned int ct[2]) {
305
#if CONFIG_ENTROPY
Yaowu Xu's avatar
Yaowu Xu committed
306
307
  return av1_merge_probs(pre_prob, ct, MODE_MV_COUNT_SAT_BITS,
                         MODE_MV_MAX_UPDATE_FACTOR_BITS);
308
309
310
311
312
#else
  return mode_mv_merge_probs(pre_prob, ct);
#endif  // CONFIG_ENTROPY
}

Jingning Han's avatar
Jingning Han committed
313
314
315
316
#ifdef __cplusplus
}  // extern "C"
#endif

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