entropymode.h 18.3 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_ENTROPYMODE_H_
#define AV1_COMMON_ENTROPYMODE_H_
Jingning Han's avatar
Jingning Han committed
14

15
16
17
18
#include "av1/common/entropy.h"
#include "av1/common/entropymv.h"
#include "av1/common/filter.h"
#include "av1/common/seg_common.h"
Yaowu Xu's avatar
Yaowu Xu committed
19
#include "aom_dsp/aom_filter.h"
Jingning Han's avatar
Jingning Han committed
20
21
22
23
24
25
26
27
28

#ifdef __cplusplus
extern "C" {
#endif

#define BLOCK_SIZE_GROUPS 4

#define TX_SIZE_CONTEXTS 2

clang-format's avatar
clang-format committed
29
30
#define INTER_OFFSET(mode) ((mode)-NEARESTMV)
#define INTER_COMPOUND_OFFSET(mode) ((mode)-NEAREST_NEARESTMV)
Jingning Han's avatar
Jingning Han committed
31

32
33
34
35
36
37
38
39
40
41
42
43
// Number of possible contexts for a color index.
// As can be seen from av1_get_palette_color_index_context(), the possible
// contexts are (2,0,0), (2,2,1), (3,2,0), (4,1,0), (5,0,0). These are mapped to
// a value from 0 to 4 using 'palette_color_index_context_lookup' table.
#define PALETTE_COLOR_INDEX_CONTEXTS 5

// Palette Y mode context for a block is determined by number of neighboring
// blocks (top and/or left) using a palette for Y plane. So, possible Y mode'
// context values are:
// 0 if neither left nor top block uses palette for Y plane,
// 1 if exactly one of left or top block uses palette for Y plane, and
// 2 if both left and top blocks use palette for Y plane.
hui su's avatar
hui su committed
44
#define PALETTE_Y_MODE_CONTEXTS 3
45
46
47
48
49
50
51

// Palette UV mode context for a block is determined by whether this block uses
// palette for the Y plane. So, possible values are:
// 0 if this block doesn't use palette for Y plane.
// 1 if this block uses palette for Y plane (i.e. Y palette size > 0).
#define PALETTE_UV_MODE_CONTEXTS 2

52
53
54
55
56
57
58
59
// Map the number of pixels in a block size to a context
//   16(BLOCK_4X4)                          -> 0
//   32(BLOCK_4X8, BLOCK_8X4)               -> 1
//   64(BLOCK_8X8, BLOCK_4x16, BLOCK_16X4)  -> 2
//   ...
// 4096(BLOCK_64X64)                        -> 8
#define PALATTE_BSIZE_CTXS 9

60
61
62
63
#if CONFIG_KF_CTX
#define KF_MODE_CONTEXTS 5
#endif

64
65
66
67
68
// A define to configure whether 4:1 and 1:4 partitions are allowed for 128x128
// blocks. They seem not to be giving great results (and might be expensive to
// implement in hardware), so this is a toggle to conditionally disable them.
#define ALLOW_128X32_BLOCKS 0

Yaowu Xu's avatar
Yaowu Xu committed
69
struct AV1Common;
Jingning Han's avatar
Jingning Han committed
70

71
72
73
74
75
76
typedef struct {
  const int16_t *scan;
  const int16_t *iscan;
  const int16_t *neighbors;
} SCAN_ORDER;

Jingning Han's avatar
Jingning Han committed
77
typedef struct frame_contexts {
78
79
  coeff_cdf_model coef_tail_cdfs[TX_SIZES][PLANE_TYPES];
  coeff_cdf_model coef_head_cdfs[TX_SIZES][PLANE_TYPES];
80

81
82
#if CONFIG_LV_MAP
  aom_prob txb_skip[TX_SIZES][TXB_SKIP_CONTEXTS];
83
  aom_prob eob_extra[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS];
84
  aom_prob dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS];
Dake He's avatar
Dake He committed
85
86

#if !CONFIG_LV_MAP_MULTI
87
88
  aom_prob eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS];

Dake He's avatar
Dake He committed
89
  aom_prob nz_map[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS];
90
91
  aom_prob coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
                     [COEFF_BASE_CONTEXTS];
92
  aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS];
93
  aom_prob coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS];
94
95
#else
  aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS];
96
#endif
97
98

  aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
99
#if !CONFIG_LV_MAP_MULTI
100
101
102
103
  aom_cdf_prob nz_map_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
                         [CDF_SIZE(2)];
  aom_cdf_prob eob_flag_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
                           [CDF_SIZE(2)];
104
#endif
Angie Chiang's avatar
Angie Chiang committed
105
106
  aom_cdf_prob eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
                            [CDF_SIZE(2)];
107
  aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
108
#if CONFIG_LV_MAP_MULTI
109
110
111
112
113
114
115
  aom_cdf_prob eob_flag_cdf16[PLANE_TYPES][2][CDF_SIZE(5)];
  aom_cdf_prob eob_flag_cdf32[PLANE_TYPES][2][CDF_SIZE(6)];
  aom_cdf_prob eob_flag_cdf64[PLANE_TYPES][2][CDF_SIZE(7)];
  aom_cdf_prob eob_flag_cdf128[PLANE_TYPES][2][CDF_SIZE(8)];
  aom_cdf_prob eob_flag_cdf256[PLANE_TYPES][2][CDF_SIZE(9)];
  aom_cdf_prob eob_flag_cdf512[PLANE_TYPES][2][CDF_SIZE(10)];
  aom_cdf_prob eob_flag_cdf1024[PLANE_TYPES][2][CDF_SIZE(11)];
116
117
  aom_cdf_prob coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]
                                 [CDF_SIZE(3)];
118
119
120
121
122
  aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
                             [CDF_SIZE(4)];
  aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
                           [CDF_SIZE(BR_CDF_SIZE)];
#else
123
124
125
126
  aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
                             [COEFF_BASE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob coeff_lps_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
                            [CDF_SIZE(2)];
127
128
  aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS]
                           [LEVEL_CONTEXTS][CDF_SIZE(2)];
129
#endif
130
131
#endif

132
  aom_cdf_prob newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)];
Sarah Parker's avatar
Sarah Parker committed
133
  aom_cdf_prob zeromv_cdf[GLOBALMV_MODE_CONTEXTS][CDF_SIZE(2)];
134
135
  aom_cdf_prob refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
136

137
138
  aom_cdf_prob inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
                                      [CDF_SIZE(INTER_COMPOUND_MODES)];
139
140
141
#if CONFIG_JNT_COMP
  aom_cdf_prob compound_type_cdf[BLOCK_SIZES_ALL][CDF_SIZE(COMPOUND_TYPES - 1)];
#else
142
  aom_cdf_prob compound_type_cdf[BLOCK_SIZES_ALL][CDF_SIZE(COMPOUND_TYPES)];
143
#endif  // CONFIG_JNT_COMP
144
  aom_cdf_prob interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)];
145
  aom_cdf_prob wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
146
147
  aom_cdf_prob interintra_mode_cdf[BLOCK_SIZE_GROUPS]
                                  [CDF_SIZE(INTERINTRA_MODES)];
148
149
  aom_cdf_prob motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)];
  aom_cdf_prob obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
Hui Su's avatar
Hui Su committed
150
151
  aom_cdf_prob palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
  aom_cdf_prob palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
152
153
154
155
156
157
  aom_cdf_prob palette_y_color_index_cdf[PALETTE_SIZES]
                                        [PALETTE_COLOR_INDEX_CONTEXTS]
                                        [CDF_SIZE(PALETTE_COLORS)];
  aom_cdf_prob palette_uv_color_index_cdf[PALETTE_SIZES]
                                         [PALETTE_COLOR_INDEX_CONTEXTS]
                                         [CDF_SIZE(PALETTE_COLORS)];
Hui Su's avatar
Hui Su committed
158
  aom_cdf_prob palette_y_mode_cdf[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS]
159
160
                                 [CDF_SIZE(2)];
  aom_cdf_prob palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
161
  aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
162
  aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
Zoe Liu's avatar
Zoe Liu committed
163
164
165
#if CONFIG_EXT_COMP_REFS
  aom_prob comp_ref_type_prob[COMP_REF_TYPE_CONTEXTS];
  aom_prob uni_comp_ref_prob[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1];
166
167
168
  aom_cdf_prob comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
                               [CDF_SIZE(2)];
Zoe Liu's avatar
Zoe Liu committed
169
#endif  // CONFIG_EXT_COMP_REFS
Yaowu Xu's avatar
Yaowu Xu committed
170
171
  aom_prob comp_ref_prob[REF_CONTEXTS][FWD_REFS - 1];
  aom_prob comp_bwdref_prob[REF_CONTEXTS][BWD_REFS - 1];
172
173
  aom_cdf_prob comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)];
  aom_cdf_prob comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)];
174
  aom_cdf_prob txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)];
175
#if CONFIG_JNT_COMP
Cheng Chen's avatar
Cheng Chen committed
176
  aom_cdf_prob compound_index_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
177
  aom_cdf_prob comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
178
#endif  // CONFIG_JNT_COMP
Zoe Liu's avatar
Zoe Liu committed
179
180
181
#if CONFIG_EXT_SKIP
  aom_cdf_prob skip_mode_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
#endif  // CONFIG_EXT_SKIP
182
  aom_cdf_prob skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
183
  aom_cdf_prob intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)];
184
  nmv_context nmvc[NMV_CONTEXTS];
Alex Converse's avatar
Alex Converse committed
185
186
#if CONFIG_INTRABC
  nmv_context ndvc;
Hui Su's avatar
Hui Su committed
187
  aom_cdf_prob intrabc_cdf[CDF_SIZE(2)];
188
#endif
hui su's avatar
hui su committed
189
  int initialized;
190
  struct segmentation_probs seg;
191
#if CONFIG_FILTER_INTRA
192
  aom_cdf_prob filter_intra_cdfs[TX_SIZES_ALL][CDF_SIZE(2)];
193
  aom_cdf_prob filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)];
194
#endif  // CONFIG_FILTER_INTRA
195
#if CONFIG_LOOP_RESTORATION
196
197
198
  aom_cdf_prob switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
  aom_cdf_prob wiener_restore_cdf[CDF_SIZE(2)];
  aom_cdf_prob sgrproj_restore_cdf[CDF_SIZE(2)];
199
#endif  // CONFIG_LOOP_RESTORATION
200
  aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)];
Luc Trudeau's avatar
Luc Trudeau committed
201
  aom_cdf_prob uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)];
202
203
204
#if CONFIG_EXT_PARTITION_TYPES
  aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)];
#else
205
  aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(PARTITION_TYPES)];
206
#endif
207
  aom_cdf_prob switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
208
                                    [CDF_SIZE(SWITCHABLE_FILTERS)];
209
210
211
212
213
214
215
216
/* kf_y_cdf is discarded after use, so does not require persistent storage.
   However, we keep it with the other CDFs in this struct since it needs to
   be copied to each tile to support parallelism just like the others.
*/
#if CONFIG_KF_CTX
  aom_cdf_prob kf_y_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                       [CDF_SIZE(INTRA_MODES)];
#else
217
  aom_cdf_prob kf_y_cdf[INTRA_MODES][INTRA_MODES][CDF_SIZE(INTRA_MODES)];
218
#endif
Joe Young's avatar
Joe Young committed
219
220
221
222
223
224

#if CONFIG_EXT_INTRA_MOD
  aom_cdf_prob angle_delta_cdf[DIRECTIONAL_MODES]
                              [CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)];
#endif  // CONFIG_EXT_INTRA_MOD

225
  aom_cdf_prob tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS]
226
                          [CDF_SIZE(MAX_TX_DEPTH + 1)];
Thomas Davies's avatar
Thomas Davies committed
227
  aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
Fangwen Fu's avatar
Fangwen Fu committed
228
#if CONFIG_EXT_DELTA_Q
229
#if CONFIG_LOOPFILTER_LEVEL
230
  aom_cdf_prob delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)];
231
#endif  // CONFIG_LOOPFILTER_LEVEL
232
  aom_cdf_prob delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)];
Fangwen Fu's avatar
Fangwen Fu committed
233
#endif
234
235
236
237
  aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
                               [CDF_SIZE(TX_TYPES)];
  aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
                               [CDF_SIZE(TX_TYPES)];
Luc Trudeau's avatar
Luc Trudeau committed
238
#if CONFIG_CFL
239
240
  aom_cdf_prob cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
  aom_cdf_prob cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
Luc Trudeau's avatar
Luc Trudeau committed
241
#endif
Jingning Han's avatar
Jingning Han committed
242
243
244
} FRAME_CONTEXT;

typedef struct FRAME_COUNTS {
245
246
// Note: This structure should only contain 'unsigned int' fields, or
// aggregates built solely from 'unsigned int' fields/elements
247
#if CONFIG_ENTROPY_STATS
248
249
250
#if CONFIG_KF_CTX
  unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES];
#else
251
  unsigned int kf_y_mode[INTRA_MODES][INTRA_MODES][INTRA_MODES];
252
#endif
Joe Young's avatar
Joe Young committed
253
  unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
Jingning Han's avatar
Jingning Han committed
254
  unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES];
Luc Trudeau's avatar
Luc Trudeau committed
255
  unsigned int uv_mode[INTRA_MODES][UV_INTRA_MODES];
256
#endif  // CONFIG_ENTROPY_STATS
257
258
259
#if CONFIG_EXT_PARTITION_TYPES
  unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
#else
Jingning Han's avatar
Jingning Han committed
260
  unsigned int partition[PARTITION_CONTEXTS][PARTITION_TYPES];
261
#endif
clang-format's avatar
clang-format committed
262
263
  unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS]
                                [SWITCHABLE_FILTERS];
264
265
266
267

#if CONFIG_LV_MAP
  unsigned int txb_skip[TX_SIZES][TXB_SKIP_CONTEXTS][2];
  unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2];
268
  unsigned int eob_extra[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2];
269
  unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2];
Dake He's avatar
Dake He committed
270
271
272

#if !CONFIG_LV_MAP_MULTI
  unsigned int nz_map[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][2];
273
274
  unsigned int coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
                         [COEFF_BASE_CONTEXTS][2];
275
276
  unsigned int coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS]
                       [2];
277
278
  unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][2];
#else
279
280
281
282
283
284
285
286
  unsigned int eob_multi16[PLANE_TYPES][2][5];
  unsigned int eob_multi32[PLANE_TYPES][2][6];
  unsigned int eob_multi64[PLANE_TYPES][2][7];
  unsigned int eob_multi128[PLANE_TYPES][2][8];
  unsigned int eob_multi256[PLANE_TYPES][2][9];
  unsigned int eob_multi512[PLANE_TYPES][2][10];
  unsigned int eob_multi1024[PLANE_TYPES][2][11];

287
288
  unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS]
                        [2];
Dake He's avatar
Dake He committed
289
290
  unsigned int coeff_lps_multi[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
                              [BR_CDF_SIZE];
Dake He's avatar
Dake He committed
291
292
293
294
  unsigned int coeff_base_multi[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
                               [NUM_BASE_LEVELS + 2];
  unsigned int coeff_base_eob_multi[TX_SIZES][PLANE_TYPES]
                                   [SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1];
295
#endif
296
297
#endif  // CONFIG_LV_MAP

298
#if CONFIG_SYMBOLRATE
299
  unsigned int superblock_num;
300
  unsigned int coeff_num[COEFF_LEVELS];  // 0: zero coeff 1: non-zero coeff
301
302
303
  unsigned int symbol_num[2];  // 0: entropy symbol 1: non-entropy symbol
#endif

304
  unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2];
Sarah Parker's avatar
Sarah Parker committed
305
  unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2];
306
  unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2];
307
  unsigned int drl_mode[DRL_MODE_CONTEXTS][2];
308

309
  unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
310
  unsigned int interintra[BLOCK_SIZE_GROUPS][2];
311
  unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
312
  unsigned int wedge_interintra[BLOCK_SIZES_ALL][2];
313
314
315
#if CONFIG_JNT_COMP
  unsigned int compound_interinter[BLOCK_SIZES_ALL][COMPOUND_TYPES - 1];
#else
316
  unsigned int compound_interinter[BLOCK_SIZES_ALL][COMPOUND_TYPES];
317
#endif  // CONFIG_JNT_COMP
318
319
  unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES];
  unsigned int obmc[BLOCK_SIZES_ALL][2];
Jingning Han's avatar
Jingning Han committed
320
  unsigned int intra_inter[INTRA_INTER_CONTEXTS][2];
321
#if CONFIG_ENTROPY_STATS
Jingning Han's avatar
Jingning Han committed
322
  unsigned int comp_inter[COMP_INTER_CONTEXTS][2];
323
#endif  // CONFIG_ENTROPY_STATS
Zoe Liu's avatar
Zoe Liu committed
324
325
326
327
#if CONFIG_EXT_COMP_REFS
  unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2];
  unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2];
#endif  // CONFIG_EXT_COMP_REFS
328
#if CONFIG_ENTROPY_STATS
clang-format's avatar
clang-format committed
329
  unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2];
330
#endif  // CONFIG_ENTROPY_STATS
clang-format's avatar
clang-format committed
331
332
  unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2];
  unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2];
333
  unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2];
Zoe Liu's avatar
Zoe Liu committed
334
335
336
#if CONFIG_EXT_SKIP
  unsigned int skip_mode[SKIP_MODE_CONTEXTS][2];
#endif  // CONFIG_EXT_SKIP
Jingning Han's avatar
Jingning Han committed
337
  unsigned int skip[SKIP_CONTEXTS][2];
338
339
#if CONFIG_JNT_COMP
  unsigned int compound_index[COMP_INDEX_CONTEXTS][2];
340
  unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2];
341
#endif  // CONFIG_JNT_COMP
342
  unsigned int delta_q[DELTA_Q_PROBS][2];
Fangwen Fu's avatar
Fangwen Fu committed
343
#if CONFIG_EXT_DELTA_Q
344
#if CONFIG_LOOPFILTER_LEVEL
345
  unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2];
346
#endif  // CONFIG_LOOPFILTER_LEVEL
347
  unsigned int delta_lf[DELTA_LF_PROBS][2];
Fangwen Fu's avatar
Fangwen Fu committed
348
#endif
Hui Su's avatar
Hui Su committed
349
#if CONFIG_ENTROPY_STATS
350
  unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
clang-format's avatar
clang-format committed
351
352
  unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
                           [TX_TYPES];
Hui Su's avatar
Hui Su committed
353
#endif  // CONFIG_ENTROPY_STATS
354
#if CONFIG_FILTER_INTRA
355
  unsigned int filter_intra_mode[FILTER_INTRA_MODES];
356
  unsigned int filter_intra_tx[TX_SIZES_ALL][2];
357
#endif  // CONFIG_FILTER_INTRA
Jingning Han's avatar
Jingning Han committed
358
359
} FRAME_COUNTS;

360
361
362
363
364
#if CONFIG_KF_CTX
extern const aom_cdf_prob default_kf_y_mode_cdf[KF_MODE_CONTEXTS]
                                               [KF_MODE_CONTEXTS]
                                               [CDF_SIZE(INTRA_MODES)];
#else
Debargha Mukherjee's avatar
Debargha Mukherjee committed
365
366
extern const aom_cdf_prob default_kf_y_mode_cdf[INTRA_MODES][INTRA_MODES]
                                               [CDF_SIZE(INTRA_MODES)];
367
#endif
368

369
370
371
372
373
374
375
376
377
378
379
380
381
// Decides what set to assign to 16x16 transforms.
// Set 0:
//        Inter: All 16 txfms
//        Intra: Discrete Trig transforms w/0 flip (4) + Identity (1) +
//               1D Hor/vert DCT (2)
// Set 1:
//        Inter: Discrete Trig transforms w/ flip (9) + Identity (1) +
//               1D Hor/Ver DCT (2)
//        Intra: Discrete Trig transforms w/0 flip (4) + Identity (1)
// Set 2:
//        Inter: Discrete Trig transforms w/ flip (9) + Identity (1)
//        Intra: Discrete Trig transforms w/0 flip (4) + Identity (1)
#define EXT_TX_16X16_SET 1
Hui Su's avatar
Hui Su committed
382
383
384
385
386
387
388
389
390
391
392
393
394
static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = {
  {
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0,
  },
395
396
397
  {
      1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0,
  },
398
399
400
  {
      1, 2, 3, 6, 4, 5, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0,
  },
Hui Su's avatar
Hui Su committed
401
402
403
404
405
406
  {
      3, 4, 5, 8, 6, 7, 9, 10, 11, 0, 1, 2, 0, 0, 0, 0,
  },
  {
      7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6,
  },
407
408
409
  {
      7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6,
  },
Hui Su's avatar
Hui Su committed
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
};

static const int av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES] = {
  {
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      9, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
  {
      9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
425
426
427
  {
      9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  },
428
429
430
  {
      9, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0, 0, 0,
  },
Hui Su's avatar
Hui Su committed
431
432
433
434
435
436
  {
      9, 10, 11, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0,
  },
  {
      9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8,
  },
437
438
439
  {
      9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8,
  },
Hui Su's avatar
Hui Su committed
440
};
441

Hui Su's avatar
Hui Su committed
442
void av1_setup_frame_contexts(struct AV1Common *cm);
Yaowu Xu's avatar
Yaowu Xu committed
443
444
void av1_setup_past_independence(struct AV1Common *cm);
void av1_adapt_inter_frame_probs(struct AV1Common *cm);
Jingning Han's avatar
Jingning Han committed
445

Yaowu Xu's avatar
Yaowu Xu committed
446
static INLINE int av1_ceil_log2(int n) {
hui su's avatar
hui su committed
447
448
449
450
451
452
453
454
  int i = 1, p = 2;
  while (p < n) {
    i++;
    p = p << 1;
  }
  return i;
}

455
456
// Returns the context for palette color index at row 'r' and column 'c',
// along with the 'color_order' of neighbors and the 'color_idx'.
457
// The 'color_map' is a 2D array with the given 'stride'.
458
459
460
int av1_get_palette_color_index_context(const uint8_t *color_map, int stride,
                                        int r, int c, int palette_size,
                                        uint8_t *color_order, int *color_idx);
hui su's avatar
hui su committed
461

Jingning Han's avatar
Jingning Han committed
462
463
464
465
#ifdef __cplusplus
}  // extern "C"
#endif

Yaowu Xu's avatar
Yaowu Xu committed
466
#endif  // AV1_COMMON_ENTROPYMODE_H_