enums.h 20.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_ENUMS_H_
#define AV1_COMMON_ENUMS_H_
Jingning Han's avatar
Jingning Han committed
14

Yaowu Xu's avatar
Yaowu Xu committed
15
#include "./aom_config.h"
16
#include "aom/aom_codec.h"
Yaowu Xu's avatar
Yaowu Xu committed
17
#include "aom/aom_integer.h"
Jingning Han's avatar
Jingning Han committed
18
19
20
21
22

#ifdef __cplusplus
extern "C" {
#endif

23
24
#undef MAX_SB_SIZE

25
26
#if CONFIG_NCOBMC_ADAPT_WEIGHT
#define TWO_MODE
27
28
29
30
31
#endif

#if CONFIG_NCOBMC || CONFIG_NCOBMC_ADAPT_WEIGHT
#define NC_MODE_INFO 1
#else
32
#define NC_MODE_INFO 0
33
34
#endif

Geza Lore's avatar
Geza Lore committed
35
// Max superblock size
36
#if CONFIG_EXT_PARTITION
clang-format's avatar
clang-format committed
37
#define MAX_SB_SIZE_LOG2 7
38
#else
clang-format's avatar
clang-format committed
39
#define MAX_SB_SIZE_LOG2 6
40
#endif  // CONFIG_EXT_PARTITION
clang-format's avatar
clang-format committed
41
#define MAX_SB_SIZE (1 << MAX_SB_SIZE_LOG2)
42
#define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE)
Jingning Han's avatar
Jingning Han committed
43

Geza Lore's avatar
Geza Lore committed
44
45
46
// Min superblock size
#define MIN_SB_SIZE_LOG2 6

47
// Pixels per Mode Info (MI) unit
48
#define MI_SIZE_LOG2 2
clang-format's avatar
clang-format committed
49
#define MI_SIZE (1 << MI_SIZE_LOG2)
50

51
52
// MI-units per max superblock (MI Block - MIB)
#define MAX_MIB_SIZE_LOG2 (MAX_SB_SIZE_LOG2 - MI_SIZE_LOG2)
clang-format's avatar
clang-format committed
53
#define MAX_MIB_SIZE (1 << MAX_MIB_SIZE_LOG2)
Jingning Han's avatar
Jingning Han committed
54

Geza Lore's avatar
Geza Lore committed
55
56
57
// MI-units per min superblock
#define MIN_MIB_SIZE_LOG2 (MIN_SB_SIZE_LOG2 - MI_SIZE_LOG2)

58
// Mask to extract MI offset within max MIB
clang-format's avatar
clang-format committed
59
#define MAX_MIB_MASK (MAX_MIB_SIZE - 1)
Jingning Han's avatar
Jingning Han committed
60

61
// Maximum number of tile rows and tile columns
62
#if CONFIG_EXT_TILE
clang-format's avatar
clang-format committed
63
64
#define MAX_TILE_ROWS 1024
#define MAX_TILE_COLS 1024
65
#else
66
67
68
69
#if CONFIG_MAX_TILE
#define MAX_TILE_ROWS 64
#define MAX_TILE_COLS 64
#else
clang-format's avatar
clang-format committed
70
71
#define MAX_TILE_ROWS 4
#define MAX_TILE_COLS 64
72
#endif
73
74
#endif  // CONFIG_EXT_TILE

Jingning Han's avatar
Jingning Han committed
75
#define MAX_VARTX_DEPTH 2
76
77
#define SQR_VARTX_DEPTH_INIT 0
#define RECT_VARTX_DEPTH_INIT 0
Jingning Han's avatar
Jingning Han committed
78

Cheng Chen's avatar
Cheng Chen committed
79
80
#define MI_SIZE_64X64 (64 >> MI_SIZE_LOG2)

81
82
83
84
#if CONFIG_LOOPFILTER_LEVEL
// 4 frame filter levels: y plane vertical, y plane horizontal,
// u plane, and v plane
#define FRAME_LF_COUNT 4
85
#define DEFAULT_DELTA_LF_MULTI 0
86
87
#endif  // CONFIG_LOOPFILTER_LEVEL

88
89
#if CONFIG_LPF_SB
#define LPF_DELTA_BITS 3
90
#define LPF_STEP 2
91
#define DELTA_RANGE (1 << LPF_DELTA_BITS)
92
#define MAX_LPF_OFFSET (LPF_STEP * ((1 << LPF_DELTA_BITS) - 1))
93

94
95
96
97
#define LPF_REUSE_CONTEXT 2
#define LPF_DELTA_CONTEXT DELTA_RANGE
#define LPF_SIGN_CONTEXT 2

98
99
100
// Half of maximum loop filter length (15-tap)
#define FILT_BOUNDARY_OFFSET 8
#define FILT_BOUNDARY_MI_OFFSET (FILT_BOUNDARY_OFFSET >> MI_SIZE_LOG2)
101
102
103

#define FAKE_FILTER_LEVEL 10
#define USE_LOOP_FILTER_SUPERBLOCK 1
104
105
#endif  // CONFIG_LPF_SB

106
107
108
109
110
111
112
113
114
115
#if CONFIG_JNT_COMP
typedef enum COMPOUND_DIST_WEIGHT_MODE {
  DIST,
} COMPOUND_DIST_WEIGHT_MODE;

#define COMPOUND_WEIGHT_MODE DIST
#define DIST_PRECISION_BITS 4
#define DIST_PRECISION (1 << DIST_PRECISION_BITS)  // 16
#endif                                             // CONFIG_JNT_COMP

Jingning Han's avatar
Jingning Han committed
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Bitstream profiles indicated by 2-3 bits in the uncompressed header.
// 00: Profile 0.  8-bit 4:2:0 only.
// 10: Profile 1.  8-bit 4:4:4, 4:2:2, and 4:4:0.
// 01: Profile 2.  10-bit and 12-bit color only, with 4:2:0 sampling.
// 110: Profile 3. 10-bit and 12-bit color only, with 4:2:2/4:4:4/4:4:0
//                 sampling.
// 111: Undefined profile.
typedef enum BITSTREAM_PROFILE {
  PROFILE_0,
  PROFILE_1,
  PROFILE_2,
  PROFILE_3,
  MAX_PROFILES
} BITSTREAM_PROFILE;

131
132
133
134
// Note: Some enums use the attribute 'packed' to use smallest possible integer
// type, so that we can save memory when they are used in structs/arrays.

typedef enum ATTRIBUTE_PACKED {
Jingning Han's avatar
Jingning Han committed
135
136
137
  BLOCK_2X2,
  BLOCK_2X4,
  BLOCK_4X2,
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  BLOCK_4X4,
  BLOCK_4X8,
  BLOCK_8X4,
  BLOCK_8X8,
  BLOCK_8X16,
  BLOCK_16X8,
  BLOCK_16X16,
  BLOCK_16X32,
  BLOCK_32X16,
  BLOCK_32X32,
  BLOCK_32X64,
  BLOCK_64X32,
  BLOCK_64X64,
#if CONFIG_EXT_PARTITION
  BLOCK_64X128,
  BLOCK_128X64,
  BLOCK_128X128,
#endif  // CONFIG_EXT_PARTITION
156
157
158
159
  BLOCK_4X16,
  BLOCK_16X4,
  BLOCK_8X32,
  BLOCK_32X8,
160
161
  BLOCK_16X64,
  BLOCK_64X16,
162
163
164
165
#if CONFIG_EXT_PARTITION
  BLOCK_32X128,
  BLOCK_128X32,
#endif  // CONFIG_EXT_PARTITION
166
167
168
  BLOCK_SIZES_ALL,
  BLOCK_SIZES = BLOCK_4X16,
  BLOCK_INVALID = 255,
169
170
171
  BLOCK_LARGEST = (BLOCK_SIZES - 1)
} BLOCK_SIZE;

Yaowu Xu's avatar
Yaowu Xu committed
172
typedef enum ATTRIBUTE_PACKED {
173
174
175
176
  PARTITION_NONE,
  PARTITION_HORZ,
  PARTITION_VERT,
  PARTITION_SPLIT,
177
#if CONFIG_EXT_PARTITION_TYPES
178
179
180
181
  PARTITION_HORZ_A,  // HORZ split and the top partition is split again
  PARTITION_HORZ_B,  // HORZ split and the bottom partition is split again
  PARTITION_VERT_A,  // VERT split and the left partition is split again
  PARTITION_VERT_B,  // VERT split and the right partition is split again
182
183
  PARTITION_HORZ_4,  // 4:1 horizontal partition
  PARTITION_VERT_4,  // 4:1 vertical partition
184
  EXT_PARTITION_TYPES,
185
#endif  // CONFIG_EXT_PARTITION_TYPES
186
  PARTITION_TYPES = PARTITION_SPLIT + 1,
187
  PARTITION_INVALID = 255
Jingning Han's avatar
Jingning Han committed
188
189
190
} PARTITION_TYPE;

typedef char PARTITION_CONTEXT;
clang-format's avatar
clang-format committed
191
#define PARTITION_PLOFFSET 4  // number of probability models per block size
192
193
194
#define PARTITION_BLOCK_SIZES (4 + CONFIG_EXT_PARTITION)
#define PARTITION_CONTEXTS_PRIMARY (PARTITION_BLOCK_SIZES * PARTITION_PLOFFSET)
#if CONFIG_UNPOISON_PARTITION_CTX
195
#define INVALID_PARTITION_CTX (-1)
196
197
#define PARTITION_CONTEXTS \
  (PARTITION_CONTEXTS_PRIMARY + 2 * PARTITION_BLOCK_SIZES)
198
#else
199
200
#define PARTITION_CONTEXTS PARTITION_CONTEXTS_PRIMARY
#endif
Jingning Han's avatar
Jingning Han committed
201
202

// block transform size
Yaowu Xu's avatar
Yaowu Xu committed
203
204
205
206
#if defined(_MSC_VER)
typedef uint8_t TX_SIZE;
enum ATTRIBUTE_PACKED {
#else
207
typedef enum ATTRIBUTE_PACKED {
Yaowu Xu's avatar
Yaowu Xu committed
208
#endif
209
210
211
212
213
  TX_4X4,    // 4x4 transform
  TX_8X8,    // 8x8 transform
  TX_16X16,  // 16x16 transform
  TX_32X32,  // 32x32 transform
#if CONFIG_TX64X64
214
215
216
217
218
219
220
221
222
223
224
  TX_64X64,  // 64x64 transform
#endif       // CONFIG_TX64X64
  TX_4X8,    // 4x8 transform
  TX_8X4,    // 8x4 transform
  TX_8X16,   // 8x16 transform
  TX_16X8,   // 16x8 transform
  TX_16X32,  // 16x32 transform
  TX_32X16,  // 32x16 transform
#if CONFIG_TX64X64
  TX_32X64,           // 32x64 transform
  TX_64X32,           // 64x32 transform
225
#endif                // CONFIG_TX64X64
226
227
228
229
  TX_4X16,            // 4x16 transform
  TX_16X4,            // 16x4 transform
  TX_8X32,            // 8x32 transform
  TX_32X8,            // 32x8 transform
230
231
232
  TX_SIZES_ALL,       // Includes rectangular transforms
  TX_SIZES = TX_4X8,  // Does NOT include rectangular transforms
  TX_INVALID = 255    // Invalid transform size
Yaowu Xu's avatar
Yaowu Xu committed
233
234
235
#if defined(_MSC_VER)
};
#else
236
} TX_SIZE;
Yaowu Xu's avatar
Yaowu Xu committed
237
#endif
238

239
240
241
242
243
244
#define TX_SIZE_LUMA_MIN (TX_4X4)
/* We don't need to code a transform size unless the allowed size is at least
   one more than the minimum. */
#define TX_SIZE_CTX_MIN (TX_SIZE_LUMA_MIN + 1)

#define MAX_TX_DEPTH (TX_SIZES - TX_SIZE_CTX_MIN)
Jingning Han's avatar
Jingning Han committed
245

246
247
248
249
#if CONFIG_CTX1D
#define MAX_HVTX_SIZE (1 << 5)
#endif  // CONFIG_CTX1D

250
#define MAX_TX_SIZE_LOG2 (5 + CONFIG_TX64X64)
clang-format's avatar
clang-format committed
251
252
253
254
#define MAX_TX_SIZE (1 << MAX_TX_SIZE_LOG2)
#define MIN_TX_SIZE_LOG2 2
#define MIN_TX_SIZE (1 << MIN_TX_SIZE_LOG2)
#define MAX_TX_SQUARE (MAX_TX_SIZE * MAX_TX_SIZE)
255
256

// Number of maxium size transform blocks in the maximum size superblock
clang-format's avatar
clang-format committed
257
#define MAX_TX_BLOCKS_IN_MAX_SB_LOG2 ((MAX_SB_SIZE_LOG2 - MAX_TX_SIZE_LOG2) * 2)
258
259
#define MAX_TX_BLOCKS_IN_MAX_SB (1 << MAX_TX_BLOCKS_IN_MAX_SB_LOG2)

260
#if CONFIG_NCOBMC_ADAPT_WEIGHT
261
typedef enum ATTRIBUTE_PACKED {
262
  NCOBMC_MODE_0,
263
264
265
266
267
268
269
  NCOBMC_MODE_1,
  NCOBMC_MODE_2,
  NCOBMC_MODE_3,
  NCOBMC_MODE_4,
  NCOBMC_MODE_5,
  NCOBMC_MODE_6,
  NCOBMC_MODE_7,
270
271
272
273
274
  ALL_NCOBMC_MODES,
#ifdef TWO_MODE
  MAX_NCOBMC_MODES = NCOBMC_MODE_1 + 1,
#else
  MAX_NCOBMC_MODES = ALL_NCOBMC_MODES,
275
#endif
276
277
278
  NO_OVERLAP = MAX_NCOBMC_MODES + 1
} NCOBMC_MODE;

Yaowu Xu's avatar
Yaowu Xu committed
279
typedef enum ATTRIBUTE_PACKED {
280
281
282
283
284
285
286
287
  ADAPT_OVERLAP_BLOCK_8X8,
  ADAPT_OVERLAP_BLOCK_16X16,
  ADAPT_OVERLAP_BLOCK_32X32,
  ADAPT_OVERLAP_BLOCK_64X64,
  ADAPT_OVERLAP_BLOCKS,
  ADAPT_OVERLAP_BLOCK_INVALID = 255
} ADAPT_OVERLAP_BLOCK;
#endif  // CONFIG_NCOBMC_ADAPT_WEIGHT
288

Jingning Han's avatar
Jingning Han committed
289
// frame transform mode
Yaowu Xu's avatar
Yaowu Xu committed
290
typedef enum ATTRIBUTE_PACKED {
291
292
293
294
  ONLY_4X4,     // only 4x4 transform used
  ALLOW_8X8,    // allow block transform size up to 8x8
  ALLOW_16X16,  // allow block transform size up to 16x16
  ALLOW_32X32,  // allow block transform size up to 32x32
295
#if CONFIG_TX64X64
296
  ALLOW_64X64,  // allow block transform size up to 64x64
297
298
299
#endif
  TX_MODE_SELECT,  // transform specified for each block
  TX_MODES,
Jingning Han's avatar
Jingning Han committed
300
301
} TX_MODE;

302
// 1D tx types
Yaowu Xu's avatar
Yaowu Xu committed
303
typedef enum ATTRIBUTE_PACKED {
304
305
306
307
  DCT_1D,
  ADST_1D,
  FLIPADST_1D,
  IDTX_1D,
Sarah Parker's avatar
Sarah Parker committed
308
309
  // TODO(sarahparker) need to eventually put something here for the
  // mrc experiment to make this work with the ext-tx pruning functions
310
  TX_TYPES_1D,
311
312
} TX_TYPE_1D;

313
typedef enum ATTRIBUTE_PACKED {
314
315
316
317
  DCT_DCT,    // DCT  in both horizontal and vertical
  ADST_DCT,   // ADST in vertical, DCT in horizontal
  DCT_ADST,   // DCT  in vertical, ADST in horizontal
  ADST_ADST,  // ADST in both directions
318
#if CONFIG_EXT_TX
319
320
321
322
323
324
325
326
327
328
329
330
  FLIPADST_DCT,
  DCT_FLIPADST,
  FLIPADST_FLIPADST,
  ADST_FLIPADST,
  FLIPADST_ADST,
  IDTX,
  V_DCT,
  H_DCT,
  V_ADST,
  H_ADST,
  V_FLIPADST,
  H_FLIPADST,
331
#endif  // CONFIG_EXT_TX
Sarah Parker's avatar
Sarah Parker committed
332
333
334
#if CONFIG_MRC_TX
  MRC_DCT,  // DCT in both directions with mrc based bitmask
#endif      // CONFIG_MRC_TX
335
  TX_TYPES,
Jingning Han's avatar
Jingning Han committed
336
337
} TX_TYPE;

338
339
340
341
342
343
344
345
346
347
348
349
350
351
#if CONFIG_DUAL_FILTER
typedef enum {
  REG_REG,
  REG_SMOOTH,
  REG_SHARP,
  SMOOTH_REG,
  SMOOTH_SMOOTH,
  SMOOTH_SHARP,
  SHARP_REG,
  SHARP_SMOOTH,
  SHARP_SHARP,
} DUAL_FILTER_TYPE;
#endif

352
#if CONFIG_EXT_TX
Yaowu Xu's avatar
Yaowu Xu committed
353
typedef enum ATTRIBUTE_PACKED {
Hui Su's avatar
Hui Su committed
354
  // DCT only
355
  EXT_TX_SET_DCTONLY,
Hui Su's avatar
Hui Su committed
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  // DCT + Identity only
  EXT_TX_SET_DCT_IDTX,
#if CONFIG_MRC_TX
  // DCT + MRC_DCT
  EXT_TX_SET_MRC_DCT,
  // DCT + MRC_DCT + IDTX
  EXT_TX_SET_MRC_DCT_IDTX,
#endif  // CONFIG_MRC_TX
  // Discrete Trig transforms w/o flip (4) + Identity (1)
  EXT_TX_SET_DTT4_IDTX,
  // Discrete Trig transforms w/o flip (4) + Identity (1) + 1D Hor/vert DCT (2)
  EXT_TX_SET_DTT4_IDTX_1DDCT,
  // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver DCT (2)
  EXT_TX_SET_DTT9_IDTX_1DDCT,
  // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver (6)
  EXT_TX_SET_ALL16,
  EXT_TX_SET_TYPES
} TxSetType;

375
376
377
378
379
#define IS_2D_TRANSFORM(tx_type) (tx_type < IDTX)
#else
#define IS_2D_TRANSFORM(tx_type) 1
#endif

Yaowu Xu's avatar
Yaowu Xu committed
380
typedef enum ATTRIBUTE_PACKED {
381
382
383
384
  TILE_LEFT_BOUNDARY = 1,
  TILE_RIGHT_BOUNDARY = 2,
  TILE_ABOVE_BOUNDARY = 4,
  TILE_BOTTOM_BOUNDARY = 8,
385
386
387
388
389
  FRAME_LEFT_BOUNDARY = 16,
  FRAME_RIGHT_BOUNDARY = 32,
  FRAME_ABOVE_BOUNDARY = 64,
  FRAME_BOTTOM_BOUNDARY = 128,
} BOUNDARY_TYPE;
390

391
#if CONFIG_EXT_TX
Sarah Parker's avatar
Sarah Parker committed
392
393
394
395
396
#define EXT_TX_SIZES 4  // number of sizes that use extended transforms
#if CONFIG_MRC_TX
#define EXT_TX_SETS_INTER 5  // Sets of transform selections for INTER
#define EXT_TX_SETS_INTRA 4  // Sets of transform selections for INTRA
#else                        // CONFIG_MRC_TX
clang-format's avatar
clang-format committed
397
398
#define EXT_TX_SETS_INTER 4  // Sets of transform selections for INTER
#define EXT_TX_SETS_INTRA 3  // Sets of transform selections for INTRA
Sarah Parker's avatar
Sarah Parker committed
399
#endif                       // CONFIG_MRC_TX
400
#else
clang-format's avatar
clang-format committed
401
#define EXT_TX_SIZES 3  // number of sizes that use extended transforms
402
#endif                  // CONFIG_EXT_TX
403

Yaowu Xu's avatar
Yaowu Xu committed
404
typedef enum ATTRIBUTE_PACKED {
Yaowu Xu's avatar
Yaowu Xu committed
405
406
407
408
409
  AOM_LAST_FLAG = 1 << 0,
  AOM_LAST2_FLAG = 1 << 1,
  AOM_LAST3_FLAG = 1 << 2,
  AOM_GOLD_FLAG = 1 << 3,
  AOM_BWD_FLAG = 1 << 4,
410
411
412
  AOM_ALT2_FLAG = 1 << 5,
  AOM_ALT_FLAG = 1 << 6,
  AOM_REFFRAME_ALL = (1 << 7) - 1
Yaowu Xu's avatar
Yaowu Xu committed
413
} AOM_REFFRAME;
Jingning Han's avatar
Jingning Han committed
414

Zoe Liu's avatar
Zoe Liu committed
415
416
417
#if CONFIG_EXT_COMP_REFS
#define USE_UNI_COMP_REFS 1

Yaowu Xu's avatar
Yaowu Xu committed
418
typedef enum ATTRIBUTE_PACKED {
419
420
421
  UNIDIR_COMP_REFERENCE,
  BIDIR_COMP_REFERENCE,
  COMP_REFERENCE_TYPES,
Zoe Liu's avatar
Zoe Liu committed
422
423
424
425
426
} COMP_REFERENCE_TYPE;
#else  // !CONFIG_EXT_COMP_REFS
#define USE_UNI_COMP_REFS 0
#endif  // CONFIG_EXT_COMP_REFS

Yaowu Xu's avatar
Yaowu Xu committed
427
428
429
430
431
typedef enum ATTRIBUTE_PACKED {
  PLANE_TYPE_Y,
  PLANE_TYPE_UV,
  PLANE_TYPES
} PLANE_TYPE;
Jingning Han's avatar
Jingning Han committed
432

433
#if CONFIG_CFL
434
435
436
437
438
#define CFL_ALPHABET_SIZE_LOG2 4
#define CFL_ALPHABET_SIZE (1 << CFL_ALPHABET_SIZE_LOG2)
#define CFL_MAGS_SIZE ((2 << CFL_ALPHABET_SIZE_LOG2) + 1)
#define CFL_IDX_U(idx) (idx >> CFL_ALPHABET_SIZE_LOG2)
#define CFL_IDX_V(idx) (idx & (CFL_ALPHABET_SIZE - 1))
Luc Trudeau's avatar
Luc Trudeau committed
439

Yaowu Xu's avatar
Yaowu Xu committed
440
441
442
443
444
typedef enum ATTRIBUTE_PACKED {
  CFL_PRED_U,
  CFL_PRED_V,
  CFL_PRED_PLANES
} CFL_PRED_TYPE;
445

Yaowu Xu's avatar
Yaowu Xu committed
446
typedef enum ATTRIBUTE_PACKED {
447
448
449
  CFL_SIGN_ZERO,
  CFL_SIGN_NEG,
  CFL_SIGN_POS,
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
  CFL_SIGNS
} CFL_SIGN_TYPE;

// CFL_SIGN_ZERO,CFL_SIGN_ZERO is invalid
#define CFL_JOINT_SIGNS (CFL_SIGNS * CFL_SIGNS - 1)
// CFL_SIGN_U is equivalent to (js + 1) / 3 for js in 0 to 8
#define CFL_SIGN_U(js) (((js + 1) * 11) >> 5)
// CFL_SIGN_V is equivalent to (js + 1) % 3 for js in 0 to 8
#define CFL_SIGN_V(js) ((js + 1) - CFL_SIGNS * CFL_SIGN_U(js))

// There is no context when the alpha for a given plane is zero.
// So there are 2 fewer contexts than joint signs.
#define CFL_ALPHA_CONTEXTS (CFL_JOINT_SIGNS + 1 - CFL_SIGNS)
#define CFL_CONTEXT_U(js) (js + 1 - CFL_SIGNS)
// Also, the contexts are symmetric under swapping the planes.
#define CFL_CONTEXT_V(js) \
  (CFL_SIGN_V(js) * CFL_SIGNS + CFL_SIGN_U(js) - CFL_SIGNS)
467
468
#endif

Yaowu Xu's avatar
Yaowu Xu committed
469
typedef enum ATTRIBUTE_PACKED {
470
471
472
473
474
475
476
  PALETTE_MAP,
#if CONFIG_MRC_TX
  MRC_MAP,
#endif  // CONFIG_MRC_TX
  COLOR_MAP_TYPES,
} COLOR_MAP_TYPE;

Yaowu Xu's avatar
Yaowu Xu committed
477
typedef enum ATTRIBUTE_PACKED {
hui su's avatar
hui su committed
478
479
480
481
482
483
484
485
486
487
  TWO_COLORS,
  THREE_COLORS,
  FOUR_COLORS,
  FIVE_COLORS,
  SIX_COLORS,
  SEVEN_COLORS,
  EIGHT_COLORS,
  PALETTE_SIZES
} PALETTE_SIZE;

Yaowu Xu's avatar
Yaowu Xu committed
488
typedef enum ATTRIBUTE_PACKED {
hui su's avatar
hui su committed
489
490
491
492
493
494
495
496
497
498
499
  PALETTE_COLOR_ONE,
  PALETTE_COLOR_TWO,
  PALETTE_COLOR_THREE,
  PALETTE_COLOR_FOUR,
  PALETTE_COLOR_FIVE,
  PALETTE_COLOR_SIX,
  PALETTE_COLOR_SEVEN,
  PALETTE_COLOR_EIGHT,
  PALETTE_COLORS
} PALETTE_COLOR;

500
501
// Note: All directional predictors must be between V_PRED and D63_PRED (both
// inclusive).
502
typedef enum ATTRIBUTE_PACKED {
Urvang Joshi's avatar
Urvang Joshi committed
503
504
505
506
507
508
509
510
511
  DC_PRED,      // Average of above and left pixels
  V_PRED,       // Vertical
  H_PRED,       // Horizontal
  D45_PRED,     // Directional 45  deg = round(arctan(1/1) * 180/pi)
  D135_PRED,    // Directional 135 deg = 180 - 45
  D117_PRED,    // Directional 117 deg = 180 - 63
  D153_PRED,    // Directional 153 deg = 180 - 27
  D207_PRED,    // Directional 207 deg = 180 + 27
  D63_PRED,     // Directional 63  deg = round(arctan(2/1) * 180/pi)
512
  SMOOTH_PRED,  // Combination of horizontal and vertical interpolation
Urvang Joshi's avatar
Urvang Joshi committed
513
514
515
516
#if CONFIG_SMOOTH_HV
  SMOOTH_V_PRED,  // Vertical interpolation
  SMOOTH_H_PRED,  // Horizontal interpolation
#endif            // CONFIG_SMOOTH_HV
Urvang Joshi's avatar
Urvang Joshi committed
517
  PAETH_PRED,     // Predict from the direction of smallest gradient
518
519
520
521
  NEARESTMV,
  NEARMV,
  ZEROMV,
  NEWMV,
522
523
524
#if CONFIG_COMPOUND_SINGLEREF
  // Single ref compound modes
  SR_NEAREST_NEARMV,
525
  // SR_NEAREST_NEWMV,
526
527
528
529
530
  SR_NEAR_NEWMV,
  SR_ZERO_NEWMV,
  SR_NEW_NEWMV,
#endif  // CONFIG_COMPOUND_SINGLEREF
  // Compound ref compound modes
531
532
533
534
535
536
537
538
539
  NEAREST_NEARESTMV,
  NEAR_NEARMV,
  NEAREST_NEWMV,
  NEW_NEARESTMV,
  NEAR_NEWMV,
  NEW_NEARMV,
  ZERO_ZEROMV,
  NEW_NEWMV,
  MB_MODE_COUNT,
Urvang Joshi's avatar
Urvang Joshi committed
540
  INTRA_MODES = PAETH_PRED + 1,  // PAETH_PRED has to be the last intra mode.
541
  INTRA_INVALID = MB_MODE_COUNT  // For uv_mode in inter blocks
542
} PREDICTION_MODE;
Jingning Han's avatar
Jingning Han committed
543

Luc Trudeau's avatar
Luc Trudeau committed
544
545
546
547
#if CONFIG_CFL
// TODO(ltrudeau) Do we really want to pack this?
// TODO(ltrudeau) Do we match with PREDICTION_MODE?
typedef enum ATTRIBUTE_PACKED {
Urvang Joshi's avatar
Urvang Joshi committed
548
549
550
551
552
553
554
555
556
  UV_DC_PRED,      // Average of above and left pixels
  UV_V_PRED,       // Vertical
  UV_H_PRED,       // Horizontal
  UV_D45_PRED,     // Directional 45  deg = round(arctan(1/1) * 180/pi)
  UV_D135_PRED,    // Directional 135 deg = 180 - 45
  UV_D117_PRED,    // Directional 117 deg = 180 - 63
  UV_D153_PRED,    // Directional 153 deg = 180 - 27
  UV_D207_PRED,    // Directional 207 deg = 180 + 27
  UV_D63_PRED,     // Directional 63  deg = round(arctan(2/1) * 180/pi)
Luc Trudeau's avatar
Luc Trudeau committed
557
558
559
560
561
  UV_SMOOTH_PRED,  // Combination of horizontal and vertical interpolation
#if CONFIG_SMOOTH_HV
  UV_SMOOTH_V_PRED,  // Vertical interpolation
  UV_SMOOTH_H_PRED,  // Horizontal interpolation
#endif               // CONFIG_SMOOTH_HV
Urvang Joshi's avatar
Urvang Joshi committed
562
  UV_PAETH_PRED,     // Predict from the direction of smallest gradient
563
  UV_CFL_PRED,       // Chroma-from-Luma
Luc Trudeau's avatar
Luc Trudeau committed
564
565
566
567
568
569
570
571
572
573
  UV_INTRA_MODES,
  UV_MODE_INVALID,  // For uv_mode in inter blocks
} UV_PREDICTION_MODE;
#else
#define UV_INTRA_MODES (INTRA_MODES)
#define UV_PREDICTION_MODE PREDICTION_MODE
#define UV_DC_PRED (DC_PRED)
#define UV_MODE_INVALID (INTRA_INVALID)
#endif  // CONFIG_CFL

Yaowu Xu's avatar
Yaowu Xu committed
574
typedef enum ATTRIBUTE_PACKED {
575
  SIMPLE_TRANSLATION,
Yue Chen's avatar
Yue Chen committed
576
#if CONFIG_MOTION_VAR
clang-format's avatar
clang-format committed
577
  OBMC_CAUSAL,  // 2-sided OBMC
Wei-Ting Lin's avatar
Wei-Ting Lin committed
578
579
580
581
#if CONFIG_NCOBMC_ADAPT_WEIGHT
  NCOBMC_ADAPT_WEIGHT,
#endif  // CONFIG_NCOBMC_ADAPT_WEIGHT
#endif  // CONFIG_MOTION_VAR
582
583
#if CONFIG_WARPED_MOTION
  WARPED_CAUSAL,  // 2-sided WARPED
clang-format's avatar
clang-format committed
584
#endif            // CONFIG_WARPED_MOTION
Yue Chen's avatar
Yue Chen committed
585
  MOTION_MODES
586
587
588
589
#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_WARPED_MOTION
  ,
  OBMC_FAMILY_MODES = NCOBMC_ADAPT_WEIGHT + 1
#endif
Yue Chen's avatar
Yue Chen committed
590
} MOTION_MODE;
591

592
#if CONFIG_INTERINTRA
Yaowu Xu's avatar
Yaowu Xu committed
593
typedef enum ATTRIBUTE_PACKED {
594
  II_DC_PRED,
595
596
597
598
599
600
  II_V_PRED,
  II_H_PRED,
  II_SMOOTH_PRED,
  INTERINTRA_MODES
} INTERINTRA_MODE;
#endif
601

602
typedef enum {
603
  COMPOUND_AVERAGE,
604
#if CONFIG_WEDGE
605
  COMPOUND_WEDGE,
606
#endif  // CONFIG_WEDGE
607
608
609
#if CONFIG_COMPOUND_SEGMENT
  COMPOUND_SEG,
#endif  // CONFIG_COMPOUND_SEGMENT
610
611
  COMPOUND_TYPES,
} COMPOUND_TYPE;
612

613
// TODO(huisu): Consider adding FILTER_SMOOTH_PRED to "FILTER_INTRA_MODE".
614
#if CONFIG_FILTER_INTRA
Yaowu Xu's avatar
Yaowu Xu committed
615
typedef enum ATTRIBUTE_PACKED {
616
617
618
619
620
  FILTER_DC_PRED,
  FILTER_V_PRED,
  FILTER_H_PRED,
  FILTER_D117_PRED,
  FILTER_D153_PRED,
Urvang Joshi's avatar
Urvang Joshi committed
621
  FILTER_PAETH_PRED,
622
623
624
  FILTER_INTRA_MODES,
} FILTER_INTRA_MODE;
#endif  // CONFIG_FILTER_INTRA
625
626
627
#if CONFIG_SYMBOLRATE
#define COEFF_LEVELS 18
#endif
628

629
#if CONFIG_EXT_INTRA
630
#define DIRECTIONAL_MODES 8
631
632
#endif  // CONFIG_EXT_INTRA

Jingning Han's avatar
Jingning Han committed
633
634
#define INTER_MODES (1 + NEWMV - NEARESTMV)

635
636
637
638
#if CONFIG_COMPOUND_SINGLEREF
#define INTER_SINGLEREF_COMP_MODES (1 + SR_NEW_NEWMV - SR_NEAREST_NEARMV)
#endif  // CONFIG_COMPOUND_SINGLEREF

639
640
#define INTER_COMPOUND_MODES (1 + NEW_NEWMV - NEAREST_NEARESTMV)

Jingning Han's avatar
Jingning Han committed
641
#define SKIP_CONTEXTS 3
642

643
#define NMV_CONTEXTS 3
644

clang-format's avatar
clang-format committed
645
#define NEWMV_MODE_CONTEXTS 7
646
#define ZEROMV_MODE_CONTEXTS 2
clang-format's avatar
clang-format committed
647
648
#define REFMV_MODE_CONTEXTS 9
#define DRL_MODE_CONTEXTS 5
649
650

#define ZEROMV_OFFSET 3
clang-format's avatar
clang-format committed
651
#define REFMV_OFFSET 4
652
653
654

#define NEWMV_CTX_MASK ((1 << ZEROMV_OFFSET) - 1)
#define ZEROMV_CTX_MASK ((1 << (REFMV_OFFSET - ZEROMV_OFFSET)) - 1)
655
656
#define REFMV_CTX_MASK ((1 << (8 - REFMV_OFFSET)) - 1)

clang-format's avatar
clang-format committed
657
658
659
#define ALL_ZERO_FLAG_OFFSET 8
#define SKIP_NEARESTMV_OFFSET 9
#define SKIP_NEARMV_OFFSET 10
660
#define SKIP_NEARESTMV_SUB8X8_OFFSET 11
661

Jingning Han's avatar
Jingning Han committed
662
#define INTER_MODE_CONTEXTS 7
663
#define DELTA_Q_SMALL 3
664
#define DELTA_Q_PROBS (DELTA_Q_SMALL)
665
#define DEFAULT_DELTA_Q_RES 4
Fangwen Fu's avatar
Fangwen Fu committed
666
667
668
669
670
#if CONFIG_EXT_DELTA_Q
#define DELTA_LF_SMALL 3
#define DELTA_LF_PROBS (DELTA_LF_SMALL)
#define DEFAULT_DELTA_LF_RES 2
#endif
Jingning Han's avatar
Jingning Han committed
671
672
673

/* Segment Feature Masks */
#define MAX_MV_REF_CANDIDATES 2
674

675
#define MAX_REF_MV_STACK_SIZE 16
676
677
678
#if CONFIG_EXT_PARTITION
#define REF_CAT_LEVEL 640
#else
679
#define REF_CAT_LEVEL 255
680
#endif  // CONFIG_EXT_PARTITION
Jingning Han's avatar
Jingning Han committed
681
682
683
684

#define INTRA_INTER_CONTEXTS 4
#define COMP_INTER_CONTEXTS 5
#define REF_CONTEXTS 5
Zoe Liu's avatar
Zoe Liu committed
685
686
687

#if CONFIG_EXT_COMP_REFS
#define COMP_REF_TYPE_CONTEXTS 5
688
#define UNI_COMP_REF_CONTEXTS 3
Zoe Liu's avatar
Zoe Liu committed
689
690
#endif  // CONFIG_EXT_COMP_REFS

691
#if CONFIG_COMPOUND_SINGLEREF
692
#define COMP_INTER_MODE_CONTEXTS 4
693
#endif  // CONFIG_COMPOUND_SINGLEREF
Jingning Han's avatar
Jingning Han committed
694

695
#define TXFM_PARTITION_CONTEXTS ((TX_SIZES - TX_8X8) * 6 - 2)
696
typedef uint8_t TXFM_CONTEXT;
697

Emil Keyder's avatar
Emil Keyder committed
698
#define NONE_FRAME -1
clang-format's avatar
clang-format committed
699
700
#define INTRA_FRAME 0
#define LAST_FRAME 1
701

clang-format's avatar
clang-format committed
702
703
704
705
#define LAST2_FRAME 2
#define LAST3_FRAME 3
#define GOLDEN_FRAME 4
#define BWDREF_FRAME 5
706
707
#define ALTREF2_FRAME 6
#define ALTREF_FRAME 7
708
#define LAST_REF_FRAMES (LAST3_FRAME - LAST_FRAME + 1)
709

710
711
712
#define INTER_REFS_PER_FRAME (ALTREF_FRAME - LAST_FRAME + 1)
#define TOTAL_REFS_PER_FRAME (ALTREF_FRAME - INTRA_FRAME + 1)

713
714
715
716
717
718
#define FWD_REFS (GOLDEN_FRAME - LAST_FRAME + 1)
#define FWD_RF_OFFSET(ref) (ref - LAST_FRAME)
#define BWD_REFS (ALTREF_FRAME - BWDREF_FRAME + 1)
#define BWD_RF_OFFSET(ref) (ref - BWDREF_FRAME)

#define SINGLE_REFS (FWD_REFS + BWD_REFS)
Zoe Liu's avatar
Zoe Liu committed
719
#if CONFIG_EXT_COMP_REFS
Yaowu Xu's avatar
Yaowu Xu committed
720
typedef enum ATTRIBUTE_PACKED {
Zoe Liu's avatar
Zoe Liu committed
721
  LAST_LAST2_FRAMES,     // { LAST_FRAME, LAST2_FRAME }
722
  LAST_LAST3_FRAMES,     // { LAST_FRAME, LAST3_FRAME }
Zoe Liu's avatar
Zoe Liu committed
723
724
725
726
727
728
  LAST_GOLDEN_FRAMES,    // { LAST_FRAME, GOLDEN_FRAME }
  BWDREF_ALTREF_FRAMES,  // { BWDREF_FRAME, ALTREF_FRAME }
  UNIDIR_COMP_REFS
} UNIDIR_COMP_REF;
#define COMP_REFS (FWD_REFS * BWD_REFS + UNIDIR_COMP_REFS)
#else  // !CONFIG_EXT_COMP_REFS
clang-format's avatar
clang-format committed
729
#define COMP_REFS (FWD_REFS * BWD_REFS)
Zoe Liu's avatar
Zoe Liu committed
730
#endif  // CONFIG_EXT_COMP_REFS
731

732
#define MODE_CTX_REF_FRAMES (TOTAL_REFS_PER_FRAME + COMP_REFS)
733

734
#if CONFIG_LOOP_RESTORATION
Yaowu Xu's avatar
Yaowu Xu committed
735
typedef enum ATTRIBUTE_PACKED {
736
737
738
  RESTORE_NONE,
  RESTORE_WIENER,
  RESTORE_SGRPROJ,
739
  RESTORE_SWITCHABLE,
740
  RESTORE_SWITCHABLE_TYPES = RESTORE_SWITCHABLE,
741
  RESTORE_TYPES = 4,
742
} RestorationType;
743
744
#endif  // CONFIG_LOOP_RESTORATION

745
#if CONFIG_FRAME_SUPERRES
746
#define SUPERRES_SCALE_BITS 3
747
#define SUPERRES_SCALE_DENOMINATOR_MIN 8
748
#endif  // CONFIG_FRAME_SUPERRES
749

Cheng Chen's avatar
Cheng Chen committed
750
751
752
753
754
755
756
757
758
759
760
761
762
#if CONFIG_LPF_DIRECT
typedef enum {
  VERT_HORZ,
  DEGREE_30,
  DEGREE_45,
  DEGREE_60,
  DEGREE_120,
  DEGREE_135,
  DEGREE_150,
  FILTER_DEGREES,
} FILTER_DEGREE;
#endif  // CONFIG_LPF_DIRECT

763
764
#if CONFIG_OBU
// R19
Yaowu Xu's avatar
Yaowu Xu committed
765
typedef enum ATTRIBUTE_PACKED {
766
767
768
769
770
771
772
773
774
  OBU_SEQUENCE_HEADER = 1,
  OBU_TD = 2,
  OBU_FRAME_HEADER = 3,
  OBU_TILE_GROUP = 4,
  OBU_METADATA = 5,
  OBU_PADDING = 15,
} OBU_TYPE;
#endif

775
776
777
778
779
780
781
782
783
#if CONFIG_LGT_FROM_PRED
#define LGT_SIZES 2
// Note: at least one of LGT_FROM_PRED_INTRA and LGT_FROM_PRED_INTER must be 1
#define LGT_FROM_PRED_INTRA 1
#define LGT_FROM_PRED_INTER 1
// LGT_SL_INTRA: LGTs with a mode-dependent first self-loop and a break point
#define LGT_SL_INTRA 0
#endif  // CONFIG_LGT_FROM_PRED

Jingning Han's avatar
Jingning Han committed
784
785
786
787
#ifdef __cplusplus
}  // extern "C"
#endif

Yaowu Xu's avatar
Yaowu Xu committed
788
#endif  // AV1_COMMON_ENUMS_H_