1 /*
2  * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3  *
4  * This source code is subject to the terms of the BSD 2 Clause License and
5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6  * was not distributed with this source code in the LICENSE file, you can
7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8  * Media Patent License 1.0 was not distributed with this source code in the
9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10  */
11 
12 #ifndef AV1_COMMON_ENUMS_H_
13 #define AV1_COMMON_ENUMS_H_
14 
15 #include "./aom_config.h"
16 #include "aom/aom_codec.h"
17 #include "aom/aom_integer.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #undef MAX_SB_SIZE
24 
25 #if CONFIG_NCOBMC_ADAPT_WEIGHT
26 #define TWO_MODE
27 #endif
28 
29 #if CONFIG_NCOBMC || CONFIG_NCOBMC_ADAPT_WEIGHT
30 #define NC_MODE_INFO 1
31 #else
32 #define NC_MODE_INFO 0
33 #endif
34 
35 // Max superblock size
36 #if CONFIG_EXT_PARTITION
37 #define MAX_SB_SIZE_LOG2 7
38 #else
39 #define MAX_SB_SIZE_LOG2 6
40 #endif  // CONFIG_EXT_PARTITION
41 #define MAX_SB_SIZE (1 << MAX_SB_SIZE_LOG2)
42 #define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE)
43 
44 // Min superblock size
45 #define MIN_SB_SIZE_LOG2 6
46 
47 // Pixels per Mode Info (MI) unit
48 #if CONFIG_CB4X4
49 #define MI_SIZE_LOG2 2
50 #else
51 #define MI_SIZE_LOG2 3
52 #endif
53 #define MI_SIZE (1 << MI_SIZE_LOG2)
54 
55 // MI-units per max superblock (MI Block - MIB)
56 #define MAX_MIB_SIZE_LOG2 (MAX_SB_SIZE_LOG2 - MI_SIZE_LOG2)
57 #define MAX_MIB_SIZE (1 << MAX_MIB_SIZE_LOG2)
58 
59 // MI-units per min superblock
60 #define MIN_MIB_SIZE_LOG2 (MIN_SB_SIZE_LOG2 - MI_SIZE_LOG2)
61 
62 // Mask to extract MI offset within max MIB
63 #define MAX_MIB_MASK (MAX_MIB_SIZE - 1)
64 
65 // Maximum number of tile rows and tile columns
66 #if CONFIG_EXT_TILE
67 #define MAX_TILE_ROWS 1024
68 #define MAX_TILE_COLS 1024
69 #else
70 #if CONFIG_MAX_TILE
71 #define MAX_TILE_ROWS 64
72 #define MAX_TILE_COLS 64
73 #else
74 #define MAX_TILE_ROWS 4
75 #define MAX_TILE_COLS 64
76 #endif
77 #endif  // CONFIG_EXT_TILE
78 
79 #if CONFIG_VAR_TX
80 #define MAX_VARTX_DEPTH 2
81 #define SQR_VARTX_DEPTH_INIT 0
82 #define RECT_VARTX_DEPTH_INIT 0
83 #endif
84 
85 #define MI_SIZE_64X64 (64 >> MI_SIZE_LOG2)
86 
87 #if CONFIG_LOOPFILTER_LEVEL
88 // 4 frame filter levels: y plane vertical, y plane horizontal,
89 // u plane, and v plane
90 #define FRAME_LF_COUNT 4
91 #define DEFAULT_DELTA_LF_MULTI 0
92 #endif  // CONFIG_LOOPFILTER_LEVEL
93 
94 #if CONFIG_LPF_SB
95 #define LPF_DELTA_BITS 3
96 #define LPF_STEP 2
97 #define DELTA_RANGE (1 << LPF_DELTA_BITS)
98 #define MAX_LPF_OFFSET (LPF_STEP * ((1 << LPF_DELTA_BITS) - 1))
99 
100 #define LPF_REUSE_CONTEXT 2
101 #define LPF_DELTA_CONTEXT DELTA_RANGE
102 #define LPF_SIGN_CONTEXT 2
103 
104 // Half of maximum loop filter length (15-tap)
105 #define FILT_BOUNDARY_OFFSET 8
106 #define FILT_BOUNDARY_MI_OFFSET (FILT_BOUNDARY_OFFSET >> MI_SIZE_LOG2)
107 #endif  // CONFIG_LPF_SB
108 
109 // Bitstream profiles indicated by 2-3 bits in the uncompressed header.
110 // 00: Profile 0.  8-bit 4:2:0 only.
111 // 10: Profile 1.  8-bit 4:4:4, 4:2:2, and 4:4:0.
112 // 01: Profile 2.  10-bit and 12-bit color only, with 4:2:0 sampling.
113 // 110: Profile 3. 10-bit and 12-bit color only, with 4:2:2/4:4:4/4:4:0
114 //                 sampling.
115 // 111: Undefined profile.
116 typedef enum BITSTREAM_PROFILE {
117   PROFILE_0,
118   PROFILE_1,
119   PROFILE_2,
120   PROFILE_3,
121   MAX_PROFILES
122 } BITSTREAM_PROFILE;
123 
124 // Note: Some enums use the attribute 'packed' to use smallest possible integer
125 // type, so that we can save memory when they are used in structs/arrays.
126 
127 typedef enum ATTRIBUTE_PACKED {
128 #if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
129   BLOCK_2X2,
130   BLOCK_2X4,
131   BLOCK_4X2,
132 #endif
133   BLOCK_4X4,
134   BLOCK_4X8,
135   BLOCK_8X4,
136   BLOCK_8X8,
137   BLOCK_8X16,
138   BLOCK_16X8,
139   BLOCK_16X16,
140   BLOCK_16X32,
141   BLOCK_32X16,
142   BLOCK_32X32,
143   BLOCK_32X64,
144   BLOCK_64X32,
145   BLOCK_64X64,
146 #if CONFIG_EXT_PARTITION
147   BLOCK_64X128,
148   BLOCK_128X64,
149   BLOCK_128X128,
150 #endif  // CONFIG_EXT_PARTITION
151   BLOCK_4X16,
152   BLOCK_16X4,
153   BLOCK_8X32,
154   BLOCK_32X8,
155   BLOCK_16X64,
156   BLOCK_64X16,
157 #if CONFIG_EXT_PARTITION
158   BLOCK_32X128,
159   BLOCK_128X32,
160 #endif  // CONFIG_EXT_PARTITION
161   BLOCK_SIZES_ALL,
162   BLOCK_SIZES = BLOCK_4X16,
163   BLOCK_INVALID = 255,
164   BLOCK_LARGEST = (BLOCK_SIZES - 1)
165 } BLOCK_SIZE;
166 
167 typedef enum {
168   PARTITION_NONE,
169   PARTITION_HORZ,
170   PARTITION_VERT,
171   PARTITION_SPLIT,
172 #if CONFIG_EXT_PARTITION_TYPES
173   PARTITION_HORZ_A,  // HORZ split and the top partition is split again
174   PARTITION_HORZ_B,  // HORZ split and the bottom partition is split again
175   PARTITION_VERT_A,  // VERT split and the left partition is split again
176   PARTITION_VERT_B,  // VERT split and the right partition is split again
177   PARTITION_HORZ_4,  // 4:1 horizontal partition
178   PARTITION_VERT_4,  // 4:1 vertical partition
179   EXT_PARTITION_TYPES,
180 #endif  // CONFIG_EXT_PARTITION_TYPES
181   PARTITION_TYPES = PARTITION_SPLIT + 1,
182   PARTITION_INVALID = 255
183 } PARTITION_TYPE;
184 
185 typedef char PARTITION_CONTEXT;
186 #define PARTITION_PLOFFSET 4  // number of probability models per block size
187 #define PARTITION_BLOCK_SIZES (4 + CONFIG_EXT_PARTITION)
188 #define PARTITION_CONTEXTS_PRIMARY (PARTITION_BLOCK_SIZES * PARTITION_PLOFFSET)
189 #if CONFIG_UNPOISON_PARTITION_CTX
190 #define INVALID_PARTITION_CTX (-1)
191 #define PARTITION_CONTEXTS \
192   (PARTITION_CONTEXTS_PRIMARY + 2 * PARTITION_BLOCK_SIZES)
193 #else
194 #define PARTITION_CONTEXTS PARTITION_CONTEXTS_PRIMARY
195 #endif
196 
197 // block transform size
198 typedef enum ATTRIBUTE_PACKED {
199 #if CONFIG_CHROMA_2X2
200   TX_2X2,  // 2x2 transform
201 #endif
202   TX_4X4,    // 4x4 transform
203   TX_8X8,    // 8x8 transform
204   TX_16X16,  // 16x16 transform
205   TX_32X32,  // 32x32 transform
206 #if CONFIG_TX64X64
207   TX_64X64,  // 64x64 transform
208 #endif       // CONFIG_TX64X64
209   TX_4X8,    // 4x8 transform
210   TX_8X4,    // 8x4 transform
211   TX_8X16,   // 8x16 transform
212   TX_16X8,   // 16x8 transform
213   TX_16X32,  // 16x32 transform
214   TX_32X16,  // 32x16 transform
215 #if CONFIG_TX64X64
216   TX_32X64,           // 32x64 transform
217   TX_64X32,           // 64x32 transform
218 #endif                // CONFIG_TX64X64
219   TX_4X16,            // 4x16 transform
220   TX_16X4,            // 16x4 transform
221   TX_8X32,            // 8x32 transform
222   TX_32X8,            // 32x8 transform
223   TX_SIZES_ALL,       // Includes rectangular transforms
224   TX_SIZES = TX_4X8,  // Does NOT include rectangular transforms
225   TX_INVALID = 255    // Invalid transform size
226 } TX_SIZE;
227 
228 #define TX_SIZE_LUMA_MIN (TX_4X4)
229 /* We don't need to code a transform size unless the allowed size is at least
230    one more than the minimum. */
231 #define TX_SIZE_CTX_MIN (TX_SIZE_LUMA_MIN + 1)
232 
233 #define MAX_TX_DEPTH (TX_SIZES - TX_SIZE_CTX_MIN)
234 
235 #if CONFIG_CTX1D
236 #define MAX_HVTX_SIZE (1 << 5)
237 #endif  // CONFIG_CTX1D
238 
239 #define MAX_TX_SIZE_LOG2 (5 + CONFIG_TX64X64)
240 #define MAX_TX_SIZE (1 << MAX_TX_SIZE_LOG2)
241 #define MIN_TX_SIZE_LOG2 2
242 #define MIN_TX_SIZE (1 << MIN_TX_SIZE_LOG2)
243 #define MAX_TX_SQUARE (MAX_TX_SIZE * MAX_TX_SIZE)
244 
245 // Number of maxium size transform blocks in the maximum size superblock
246 #define MAX_TX_BLOCKS_IN_MAX_SB_LOG2 ((MAX_SB_SIZE_LOG2 - MAX_TX_SIZE_LOG2) * 2)
247 #define MAX_TX_BLOCKS_IN_MAX_SB (1 << MAX_TX_BLOCKS_IN_MAX_SB_LOG2)
248 
249 #if CONFIG_NCOBMC_ADAPT_WEIGHT
250 typedef enum ATTRIBUTE_PACKED {
251   NCOBMC_MODE_0,
252   NCOBMC_MODE_1,
253   NCOBMC_MODE_2,
254   NCOBMC_MODE_3,
255   NCOBMC_MODE_4,
256   NCOBMC_MODE_5,
257   NCOBMC_MODE_6,
258   NCOBMC_MODE_7,
259   ALL_NCOBMC_MODES,
260 #ifdef TWO_MODE
261   MAX_NCOBMC_MODES = NCOBMC_MODE_1 + 1,
262 #else
263   MAX_NCOBMC_MODES = ALL_NCOBMC_MODES,
264 #endif
265   NO_OVERLAP = MAX_NCOBMC_MODES + 1
266 } NCOBMC_MODE;
267 
268 typedef enum {
269   ADAPT_OVERLAP_BLOCK_8X8,
270   ADAPT_OVERLAP_BLOCK_16X16,
271   ADAPT_OVERLAP_BLOCK_32X32,
272   ADAPT_OVERLAP_BLOCK_64X64,
273   ADAPT_OVERLAP_BLOCKS,
274   ADAPT_OVERLAP_BLOCK_INVALID = 255
275 } ADAPT_OVERLAP_BLOCK;
276 #endif  // CONFIG_NCOBMC_ADAPT_WEIGHT
277 
278 // frame transform mode
279 typedef enum {
280   ONLY_4X4,     // only 4x4 transform used
281   ALLOW_8X8,    // allow block transform size up to 8x8
282   ALLOW_16X16,  // allow block transform size up to 16x16
283   ALLOW_32X32,  // allow block transform size up to 32x32
284 #if CONFIG_TX64X64
285   ALLOW_64X64,  // allow block transform size up to 64x64
286 #endif
287   TX_MODE_SELECT,  // transform specified for each block
288   TX_MODES,
289 } TX_MODE;
290 
291 // 1D tx types
292 typedef enum {
293   DCT_1D,
294   ADST_1D,
295   FLIPADST_1D,
296   IDTX_1D,
297   // TODO(sarahparker) need to eventually put something here for the
298   // mrc experiment to make this work with the ext-tx pruning functions
299   TX_TYPES_1D,
300 } TX_TYPE_1D;
301 
302 typedef enum {
303   DCT_DCT,    // DCT  in both horizontal and vertical
304   ADST_DCT,   // ADST in vertical, DCT in horizontal
305   DCT_ADST,   // DCT  in vertical, ADST in horizontal
306   ADST_ADST,  // ADST in both directions
307 #if CONFIG_EXT_TX
308   FLIPADST_DCT,
309   DCT_FLIPADST,
310   FLIPADST_FLIPADST,
311   ADST_FLIPADST,
312   FLIPADST_ADST,
313   IDTX,
314   V_DCT,
315   H_DCT,
316   V_ADST,
317   H_ADST,
318   V_FLIPADST,
319   H_FLIPADST,
320 #endif  // CONFIG_EXT_TX
321 #if CONFIG_MRC_TX
322   MRC_DCT,  // DCT in both directions with mrc based bitmask
323 #endif      // CONFIG_MRC_TX
324   TX_TYPES,
325 } TX_TYPE;
326 
327 #if CONFIG_EXT_TX
328 typedef enum {
329   // DCT only
330   EXT_TX_SET_DCTONLY,
331   // DCT + Identity only
332   EXT_TX_SET_DCT_IDTX,
333 #if CONFIG_MRC_TX
334   // DCT + MRC_DCT
335   EXT_TX_SET_MRC_DCT,
336   // DCT + MRC_DCT + IDTX
337   EXT_TX_SET_MRC_DCT_IDTX,
338 #endif  // CONFIG_MRC_TX
339   // Discrete Trig transforms w/o flip (4) + Identity (1)
340   EXT_TX_SET_DTT4_IDTX,
341   // Discrete Trig transforms w/o flip (4) + Identity (1) + 1D Hor/vert DCT (2)
342   EXT_TX_SET_DTT4_IDTX_1DDCT,
343   // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver DCT (2)
344   EXT_TX_SET_DTT9_IDTX_1DDCT,
345   // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver (6)
346   EXT_TX_SET_ALL16,
347   EXT_TX_SET_TYPES
348 } TxSetType;
349 
350 #define IS_2D_TRANSFORM(tx_type) (tx_type < IDTX)
351 #else
352 #define IS_2D_TRANSFORM(tx_type) 1
353 #endif
354 
355 typedef enum {
356   TILE_LEFT_BOUNDARY = 1,
357   TILE_RIGHT_BOUNDARY = 2,
358   TILE_ABOVE_BOUNDARY = 4,
359   TILE_BOTTOM_BOUNDARY = 8,
360   FRAME_LEFT_BOUNDARY = 16,
361   FRAME_RIGHT_BOUNDARY = 32,
362   FRAME_ABOVE_BOUNDARY = 64,
363   FRAME_BOTTOM_BOUNDARY = 128,
364 } BOUNDARY_TYPE;
365 
366 #if CONFIG_EXT_TX
367 #if CONFIG_CHROMA_2X2
368 #define EXT_TX_SIZES 5  // number of sizes that use extended transforms
369 #else
370 #define EXT_TX_SIZES 4  // number of sizes that use extended transforms
371 #endif                  // CONFIG_CHROMA_2X2
372 #if CONFIG_MRC_TX
373 #define EXT_TX_SETS_INTER 5  // Sets of transform selections for INTER
374 #define EXT_TX_SETS_INTRA 4  // Sets of transform selections for INTRA
375 #else                        // CONFIG_MRC_TX
376 #define EXT_TX_SETS_INTER 4  // Sets of transform selections for INTER
377 #define EXT_TX_SETS_INTRA 3  // Sets of transform selections for INTRA
378 #endif                       // CONFIG_MRC_TX
379 #else
380 #if CONFIG_CHROMA_2X2
381 #define EXT_TX_SIZES 4  // number of sizes that use extended transforms
382 #else
383 #define EXT_TX_SIZES 3  // number of sizes that use extended transforms
384 #endif
385 #endif  // CONFIG_EXT_TX
386 
387 typedef enum {
388   AOM_LAST_FLAG = 1 << 0,
389 #if CONFIG_EXT_REFS
390   AOM_LAST2_FLAG = 1 << 1,
391   AOM_LAST3_FLAG = 1 << 2,
392   AOM_GOLD_FLAG = 1 << 3,
393   AOM_BWD_FLAG = 1 << 4,
394   AOM_ALT2_FLAG = 1 << 5,
395   AOM_ALT_FLAG = 1 << 6,
396   AOM_REFFRAME_ALL = (1 << 7) - 1
397 #else   // !CONFIG_EXT_REFS
398   AOM_GOLD_FLAG = 1 << 1,
399   AOM_ALT_FLAG = 1 << 2,
400   AOM_REFFRAME_ALL = (1 << 3) - 1
401 #endif  // CONFIG_EXT_REFS
402 } AOM_REFFRAME;
403 
404 #if CONFIG_EXT_COMP_REFS
405 #define USE_UNI_COMP_REFS 1
406 
407 typedef enum {
408   UNIDIR_COMP_REFERENCE,
409   BIDIR_COMP_REFERENCE,
410   COMP_REFERENCE_TYPES,
411 } COMP_REFERENCE_TYPE;
412 #else  // !CONFIG_EXT_COMP_REFS
413 #define USE_UNI_COMP_REFS 0
414 #endif  // CONFIG_EXT_COMP_REFS
415 
416 typedef enum { PLANE_TYPE_Y, PLANE_TYPE_UV, PLANE_TYPES } PLANE_TYPE;
417 
418 #if CONFIG_CFL
419 #define CFL_ALPHABET_SIZE_LOG2 4
420 #define CFL_ALPHABET_SIZE (1 << CFL_ALPHABET_SIZE_LOG2)
421 #define CFL_MAGS_SIZE ((2 << CFL_ALPHABET_SIZE_LOG2) + 1)
422 #define CFL_IDX_U(idx) (idx >> CFL_ALPHABET_SIZE_LOG2)
423 #define CFL_IDX_V(idx) (idx & (CFL_ALPHABET_SIZE - 1))
424 
425 typedef enum { CFL_PRED_U, CFL_PRED_V, CFL_PRED_PLANES } CFL_PRED_TYPE;
426 
427 typedef enum {
428   CFL_SIGN_ZERO,
429   CFL_SIGN_NEG,
430   CFL_SIGN_POS,
431   CFL_SIGNS
432 } CFL_SIGN_TYPE;
433 
434 // CFL_SIGN_ZERO,CFL_SIGN_ZERO is invalid
435 #define CFL_JOINT_SIGNS (CFL_SIGNS * CFL_SIGNS - 1)
436 // CFL_SIGN_U is equivalent to (js + 1) / 3 for js in 0 to 8
437 #define CFL_SIGN_U(js) (((js + 1) * 11) >> 5)
438 // CFL_SIGN_V is equivalent to (js + 1) % 3 for js in 0 to 8
439 #define CFL_SIGN_V(js) ((js + 1) - CFL_SIGNS * CFL_SIGN_U(js))
440 
441 // There is no context when the alpha for a given plane is zero.
442 // So there are 2 fewer contexts than joint signs.
443 #define CFL_ALPHA_CONTEXTS (CFL_JOINT_SIGNS + 1 - CFL_SIGNS)
444 #define CFL_CONTEXT_U(js) (js + 1 - CFL_SIGNS)
445 // Also, the contexts are symmetric under swapping the planes.
446 #define CFL_CONTEXT_V(js) \
447   (CFL_SIGN_V(js) * CFL_SIGNS + CFL_SIGN_U(js) - CFL_SIGNS)
448 #endif
449 
450 typedef enum {
451   PALETTE_MAP,
452 #if CONFIG_MRC_TX
453   MRC_MAP,
454 #endif  // CONFIG_MRC_TX
455   COLOR_MAP_TYPES,
456 } COLOR_MAP_TYPE;
457 
458 typedef enum {
459   TWO_COLORS,
460   THREE_COLORS,
461   FOUR_COLORS,
462   FIVE_COLORS,
463   SIX_COLORS,
464   SEVEN_COLORS,
465   EIGHT_COLORS,
466   PALETTE_SIZES
467 } PALETTE_SIZE;
468 
469 typedef enum {
470   PALETTE_COLOR_ONE,
471   PALETTE_COLOR_TWO,
472   PALETTE_COLOR_THREE,
473   PALETTE_COLOR_FOUR,
474   PALETTE_COLOR_FIVE,
475   PALETTE_COLOR_SIX,
476   PALETTE_COLOR_SEVEN,
477   PALETTE_COLOR_EIGHT,
478   PALETTE_COLORS
479 } PALETTE_COLOR;
480 
481 // Note: All directional predictors must be between V_PRED and D63_PRED (both
482 // inclusive).
483 typedef enum ATTRIBUTE_PACKED {
484   DC_PRED,      // Average of above and left pixels
485   V_PRED,       // Vertical
486   H_PRED,       // Horizontal
487   D45_PRED,     // Directional 45  deg = round(arctan(1/1) * 180/pi)
488   D135_PRED,    // Directional 135 deg = 180 - 45
489   D117_PRED,    // Directional 117 deg = 180 - 63
490   D153_PRED,    // Directional 153 deg = 180 - 27
491   D207_PRED,    // Directional 207 deg = 180 + 27
492   D63_PRED,     // Directional 63  deg = round(arctan(2/1) * 180/pi)
493   SMOOTH_PRED,  // Combination of horizontal and vertical interpolation
494 #if CONFIG_SMOOTH_HV
495   SMOOTH_V_PRED,  // Vertical interpolation
496   SMOOTH_H_PRED,  // Horizontal interpolation
497 #endif            // CONFIG_SMOOTH_HV
498   TM_PRED,        // True-motion
499   NEARESTMV,
500   NEARMV,
501   ZEROMV,
502   NEWMV,
503 #if CONFIG_COMPOUND_SINGLEREF
504   // Single ref compound modes
505   SR_NEAREST_NEARMV,
506   // SR_NEAREST_NEWMV,
507   SR_NEAR_NEWMV,
508   SR_ZERO_NEWMV,
509   SR_NEW_NEWMV,
510 #endif  // CONFIG_COMPOUND_SINGLEREF
511   // Compound ref compound modes
512   NEAREST_NEARESTMV,
513   NEAR_NEARMV,
514   NEAREST_NEWMV,
515   NEW_NEARESTMV,
516   NEAR_NEWMV,
517   NEW_NEARMV,
518   ZERO_ZEROMV,
519   NEW_NEWMV,
520   MB_MODE_COUNT,
521   INTRA_MODES = TM_PRED + 1,     // TM_PRED has to be the last intra mode.
522   INTRA_INVALID = MB_MODE_COUNT  // For uv_mode in inter blocks
523 } PREDICTION_MODE;
524 
525 #if CONFIG_CFL
526 // TODO(ltrudeau) Do we really want to pack this?
527 // TODO(ltrudeau) Do we match with PREDICTION_MODE?
528 typedef enum ATTRIBUTE_PACKED {
529   UV_DC_PRED,      // Average of above and left pixels
530   UV_V_PRED,       // Vertical
531   UV_H_PRED,       // Horizontal
532   UV_D45_PRED,     // Directional 45  deg = round(arctan(1/1) * 180/pi)
533   UV_D135_PRED,    // Directional 135 deg = 180 - 45
534   UV_D117_PRED,    // Directional 117 deg = 180 - 63
535   UV_D153_PRED,    // Directional 153 deg = 180 - 27
536   UV_D207_PRED,    // Directional 207 deg = 180 + 27
537   UV_D63_PRED,     // Directional 63  deg = round(arctan(2/1) * 180/pi)
538   UV_SMOOTH_PRED,  // Combination of horizontal and vertical interpolation
539 #if CONFIG_SMOOTH_HV
540   UV_SMOOTH_V_PRED,  // Vertical interpolation
541   UV_SMOOTH_H_PRED,  // Horizontal interpolation
542 #endif               // CONFIG_SMOOTH_HV
543   UV_TM_PRED,        // True-motion
544   UV_CFL_PRED,       // Chroma-from-Luma
545   UV_INTRA_MODES,
546   UV_MODE_INVALID,  // For uv_mode in inter blocks
547 } UV_PREDICTION_MODE;
548 #else
549 #define UV_INTRA_MODES (INTRA_MODES)
550 #define UV_PREDICTION_MODE PREDICTION_MODE
551 #define UV_DC_PRED (DC_PRED)
552 #define UV_MODE_INVALID (INTRA_INVALID)
553 #endif  // CONFIG_CFL
554 
555 typedef enum {
556   SIMPLE_TRANSLATION,
557 #if CONFIG_MOTION_VAR
558   OBMC_CAUSAL,  // 2-sided OBMC
559 #if CONFIG_NCOBMC_ADAPT_WEIGHT
560   NCOBMC_ADAPT_WEIGHT,
561 #endif  // CONFIG_NCOBMC_ADAPT_WEIGHT
562 #endif  // CONFIG_MOTION_VAR
563 #if CONFIG_WARPED_MOTION
564   WARPED_CAUSAL,  // 2-sided WARPED
565 #endif            // CONFIG_WARPED_MOTION
566   MOTION_MODES
567 #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_WARPED_MOTION
568   ,
569   OBMC_FAMILY_MODES = NCOBMC_ADAPT_WEIGHT + 1
570 #endif
571 } MOTION_MODE;
572 
573 #if CONFIG_INTERINTRA
574 typedef enum {
575   II_DC_PRED,
576   II_V_PRED,
577   II_H_PRED,
578   II_SMOOTH_PRED,
579   INTERINTRA_MODES
580 } INTERINTRA_MODE;
581 #endif
582 
583 typedef enum {
584   COMPOUND_AVERAGE,
585 #if CONFIG_WEDGE
586   COMPOUND_WEDGE,
587 #endif  // CONFIG_WEDGE
588 #if CONFIG_COMPOUND_SEGMENT
589   COMPOUND_SEG,
590 #endif  // CONFIG_COMPOUND_SEGMENT
591   COMPOUND_TYPES,
592 } COMPOUND_TYPE;
593 
594 // TODO(huisu): Consider adding FILTER_SMOOTH_PRED to "FILTER_INTRA_MODE".
595 #if CONFIG_FILTER_INTRA
596 typedef enum {
597   FILTER_DC_PRED,
598   FILTER_V_PRED,
599   FILTER_H_PRED,
600   FILTER_D45_PRED,
601   FILTER_D135_PRED,
602   FILTER_D117_PRED,
603   FILTER_D153_PRED,
604   FILTER_D207_PRED,
605   FILTER_D63_PRED,
606   FILTER_TM_PRED,
607   FILTER_INTRA_MODES,
608 } FILTER_INTRA_MODE;
609 #endif  // CONFIG_FILTER_INTRA
610 
611 #if CONFIG_EXT_INTRA
612 #define DIRECTIONAL_MODES 8
613 #endif  // CONFIG_EXT_INTRA
614 
615 #define INTER_MODES (1 + NEWMV - NEARESTMV)
616 
617 #if CONFIG_COMPOUND_SINGLEREF
618 #define INTER_SINGLEREF_COMP_MODES (1 + SR_NEW_NEWMV - SR_NEAREST_NEARMV)
619 #endif  // CONFIG_COMPOUND_SINGLEREF
620 
621 #define INTER_COMPOUND_MODES (1 + NEW_NEWMV - NEAREST_NEARESTMV)
622 
623 #define SKIP_CONTEXTS 3
624 
625 #define NMV_CONTEXTS 3
626 
627 #define NEWMV_MODE_CONTEXTS 7
628 #define ZEROMV_MODE_CONTEXTS 2
629 #define REFMV_MODE_CONTEXTS 9
630 #define DRL_MODE_CONTEXTS 5
631 
632 #define ZEROMV_OFFSET 3
633 #define REFMV_OFFSET 4
634 
635 #define NEWMV_CTX_MASK ((1 << ZEROMV_OFFSET) - 1)
636 #define ZEROMV_CTX_MASK ((1 << (REFMV_OFFSET - ZEROMV_OFFSET)) - 1)
637 #define REFMV_CTX_MASK ((1 << (8 - REFMV_OFFSET)) - 1)
638 
639 #define ALL_ZERO_FLAG_OFFSET 8
640 #define SKIP_NEARESTMV_OFFSET 9
641 #define SKIP_NEARMV_OFFSET 10
642 #define SKIP_NEARESTMV_SUB8X8_OFFSET 11
643 
644 #define INTER_MODE_CONTEXTS 7
645 #define DELTA_Q_SMALL 3
646 #define DELTA_Q_PROBS (DELTA_Q_SMALL)
647 #define DEFAULT_DELTA_Q_RES 4
648 #if CONFIG_EXT_DELTA_Q
649 #define DELTA_LF_SMALL 3
650 #define DELTA_LF_PROBS (DELTA_LF_SMALL)
651 #define DEFAULT_DELTA_LF_RES 2
652 #endif
653 
654 /* Segment Feature Masks */
655 #define MAX_MV_REF_CANDIDATES 2
656 
657 #define MAX_REF_MV_STACK_SIZE 16
658 #if CONFIG_EXT_PARTITION
659 #define REF_CAT_LEVEL 640
660 #else
661 #define REF_CAT_LEVEL 255
662 #endif  // CONFIG_EXT_PARTITION
663 
664 #define INTRA_INTER_CONTEXTS 4
665 #define COMP_INTER_CONTEXTS 5
666 #define REF_CONTEXTS 5
667 
668 #if CONFIG_EXT_COMP_REFS
669 #define COMP_REF_TYPE_CONTEXTS 5
670 #define UNI_COMP_REF_CONTEXTS 3
671 #endif  // CONFIG_EXT_COMP_REFS
672 
673 #if CONFIG_COMPOUND_SINGLEREF
674 #define COMP_INTER_MODE_CONTEXTS 4
675 #endif  // CONFIG_COMPOUND_SINGLEREF
676 
677 #if CONFIG_VAR_TX
678 #define TXFM_PARTITION_CONTEXTS ((TX_SIZES - TX_8X8) * 6 - 2)
679 typedef uint8_t TXFM_CONTEXT;
680 #endif
681 
682 #define NONE_FRAME -1
683 #define INTRA_FRAME 0
684 #define LAST_FRAME 1
685 
686 #if CONFIG_EXT_REFS
687 #define LAST2_FRAME 2
688 #define LAST3_FRAME 3
689 #define GOLDEN_FRAME 4
690 #define BWDREF_FRAME 5
691 #define ALTREF2_FRAME 6
692 #define ALTREF_FRAME 7
693 #define LAST_REF_FRAMES (LAST3_FRAME - LAST_FRAME + 1)
694 #else  // !CONFIG_EXT_REFS
695 #define GOLDEN_FRAME 2
696 #define ALTREF_FRAME 3
697 #endif  // CONFIG_EXT_REFS
698 
699 #define INTER_REFS_PER_FRAME (ALTREF_FRAME - LAST_FRAME + 1)
700 #define TOTAL_REFS_PER_FRAME (ALTREF_FRAME - INTRA_FRAME + 1)
701 
702 #define FWD_REFS (GOLDEN_FRAME - LAST_FRAME + 1)
703 #define FWD_RF_OFFSET(ref) (ref - LAST_FRAME)
704 #if CONFIG_EXT_REFS
705 #define BWD_REFS (ALTREF_FRAME - BWDREF_FRAME + 1)
706 #define BWD_RF_OFFSET(ref) (ref - BWDREF_FRAME)
707 #else
708 #define BWD_REFS 1
709 #define BWD_RF_OFFSET(ref) (ref - ALTREF_FRAME)
710 #endif  // CONFIG_EXT_REFS
711 
712 #define SINGLE_REFS (FWD_REFS + BWD_REFS)
713 #if CONFIG_EXT_COMP_REFS
714 typedef enum {
715   LAST_LAST2_FRAMES,     // { LAST_FRAME, LAST2_FRAME }
716   LAST_LAST3_FRAMES,     // { LAST_FRAME, LAST3_FRAME }
717   LAST_GOLDEN_FRAMES,    // { LAST_FRAME, GOLDEN_FRAME }
718   BWDREF_ALTREF_FRAMES,  // { BWDREF_FRAME, ALTREF_FRAME }
719   UNIDIR_COMP_REFS
720 } UNIDIR_COMP_REF;
721 #define COMP_REFS (FWD_REFS * BWD_REFS + UNIDIR_COMP_REFS)
722 #else  // !CONFIG_EXT_COMP_REFS
723 #define COMP_REFS (FWD_REFS * BWD_REFS)
724 #endif  // CONFIG_EXT_COMP_REFS
725 
726 #define MODE_CTX_REF_FRAMES (TOTAL_REFS_PER_FRAME + COMP_REFS)
727 
728 #if CONFIG_SUPERTX
729 #define PARTITION_SUPERTX_CONTEXTS 2
730 #define MAX_SUPERTX_BLOCK_SIZE BLOCK_32X32
731 #endif  // CONFIG_SUPERTX
732 
733 #if CONFIG_LOOP_RESTORATION
734 typedef enum {
735   RESTORE_NONE,
736   RESTORE_WIENER,
737   RESTORE_SGRPROJ,
738   RESTORE_SWITCHABLE,
739   RESTORE_SWITCHABLE_TYPES = RESTORE_SWITCHABLE,
740   RESTORE_TYPES,
741 } RestorationType;
742 #endif  // CONFIG_LOOP_RESTORATION
743 
744 #if CONFIG_FRAME_SUPERRES
745 #define SUPERRES_SCALE_BITS 3
746 #define SUPERRES_SCALE_DENOMINATOR_MIN 8
747 #endif  // CONFIG_FRAME_SUPERRES
748 
749 #if CONFIG_LPF_DIRECT
750 typedef enum {
751   VERT_HORZ,
752   DEGREE_30,
753   DEGREE_45,
754   DEGREE_60,
755   DEGREE_120,
756   DEGREE_135,
757   DEGREE_150,
758   FILTER_DEGREES,
759 } FILTER_DEGREE;
760 #endif  // CONFIG_LPF_DIRECT
761 
762 #if CONFIG_OBU
763 // R19
764 typedef enum {
765   OBU_SEQUENCE_HEADER = 1,
766   OBU_TD = 2,
767   OBU_FRAME_HEADER = 3,
768   OBU_TILE_GROUP = 4,
769   OBU_METADATA = 5,
770   OBU_PADDING = 15,
771 } OBU_TYPE;
772 #endif
773 
774 #if CONFIG_LGT_FROM_PRED
775 #define LGT_SIZES 2
776 // Note: at least one of LGT_FROM_PRED_INTRA and LGT_FROM_PRED_INTER must be 1
777 #define LGT_FROM_PRED_INTRA 1
778 #define LGT_FROM_PRED_INTER 1
779 // LGT_SL_INTRA: LGTs with a mode-dependent first self-loop and a break point
780 #define LGT_SL_INTRA 0
781 #endif  // CONFIG_LGT_FROM_PRED
782 
783 #ifdef __cplusplus
784 }  // extern "C"
785 #endif
786 
787 #endif  // AV1_COMMON_ENUMS_H_
788