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