blob: c02f56f126a799ca6dbba3a44b0c49e12e4cf1b8 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AV1_COMMON_ENUMS_H_
13#define AV1_COMMON_ENUMS_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
Yaowu Xuf883b422016-08-30 14:01:10 -070015#include "./aom_config.h"
Urvang Joshicb586f32016-09-20 11:36:33 -070016#include "aom/aom_codec.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070017#include "aom/aom_integer.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070018
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23#undef MAX_SB_SIZE
24
25// Max superblock size
Yaowu Xuc27fc142016-08-22 16:08:15 -070026#define MAX_SB_SIZE_LOG2 7
Yaowu Xuc27fc142016-08-22 16:08:15 -070027#define MAX_SB_SIZE (1 << MAX_SB_SIZE_LOG2)
28#define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE)
29
30// Min superblock size
31#define MIN_SB_SIZE_LOG2 6
32
33// Pixels per Mode Info (MI) unit
Jingning Han0d1be882016-12-05 12:56:31 -080034#define MI_SIZE_LOG2 2
Yaowu Xuc27fc142016-08-22 16:08:15 -070035#define MI_SIZE (1 << MI_SIZE_LOG2)
36
37// MI-units per max superblock (MI Block - MIB)
38#define MAX_MIB_SIZE_LOG2 (MAX_SB_SIZE_LOG2 - MI_SIZE_LOG2)
39#define MAX_MIB_SIZE (1 << MAX_MIB_SIZE_LOG2)
40
41// MI-units per min superblock
42#define MIN_MIB_SIZE_LOG2 (MIN_SB_SIZE_LOG2 - MI_SIZE_LOG2)
43
44// Mask to extract MI offset within max MIB
45#define MAX_MIB_MASK (MAX_MIB_SIZE - 1)
Yaowu Xuc27fc142016-08-22 16:08:15 -070046
47// Maximum number of tile rows and tile columns
Yaowu Xuc27fc142016-08-22 16:08:15 -070048#define MAX_TILE_ROWS 1024
49#define MAX_TILE_COLS 1024
Yaowu Xuc27fc142016-08-22 16:08:15 -070050
Jingning Han571189c2016-10-24 10:38:43 -070051#define MAX_VARTX_DEPTH 2
Jingning Han571189c2016-10-24 10:38:43 -070052
Cheng Chenf5bdeac2017-07-24 14:31:30 -070053#define MI_SIZE_64X64 (64 >> MI_SIZE_LOG2)
Steinar Midtskogen6c24b022017-09-15 09:46:39 +020054#define MI_SIZE_128X128 (128 >> MI_SIZE_LOG2)
Cheng Chenf5bdeac2017-07-24 14:31:30 -070055
Hui Su473cf892017-11-08 18:14:31 -080056#define MAX_PALETTE_SQUARE (64 * 64)
57// Maximum number of colors in a palette.
58#define PALETTE_MAX_SIZE 8
59// Minimum number of colors in a palette.
60#define PALETTE_MIN_SIZE 2
Hui Su473cf892017-11-08 18:14:31 -080061
Cheng Chend300f0e2017-12-01 10:46:23 -080062#define FRAME_OFFSET_BITS 5
63#define MAX_FRAME_DISTANCE ((1 << FRAME_OFFSET_BITS) - 1)
Cheng Chend300f0e2017-12-01 10:46:23 -080064
Zoe Liu27deb382018-03-27 15:13:56 -070065#define REF_FRAMES_LOG2 3
66#define REF_FRAMES (1 << REF_FRAMES_LOG2)
67
68// 4 scratch frames for the new frames to support a maximum of 4 cores decoding
69// in parallel, 3 for scaled references on the encoder.
70// TODO(hkuang): Add ondemand frame buffers instead of hardcoding the number
71// of framebuffers.
72// TODO(jkoleszar): These 3 extra references could probably come from the
73// normal reference pool.
74#define FRAME_BUFFERS (REF_FRAMES + 7)
75
Cheng Chena97394f2017-09-27 15:05:14 -070076// 4 frame filter levels: y plane vertical, y plane horizontal,
77// u plane, and v plane
78#define FRAME_LF_COUNT 4
Cheng Chen880166a2017-10-02 17:48:48 -070079#define DEFAULT_DELTA_LF_MULTI 0
Cheng Chena97394f2017-09-27 15:05:14 -070080
Cheng Chen7d089ae2018-03-15 19:11:03 -070081#define MAX_MODE_LF_DELTAS 2
82
Cheng Chend867c9a2017-10-09 19:03:56 -070083typedef enum COMPOUND_DIST_WEIGHT_MODE {
84 DIST,
85} COMPOUND_DIST_WEIGHT_MODE;
86
87#define COMPOUND_WEIGHT_MODE DIST
88#define DIST_PRECISION_BITS 4
89#define DIST_PRECISION (1 << DIST_PRECISION_BITS) // 16
Cheng Chend867c9a2017-10-09 19:03:56 -070090
Cheng Chen891f2dc2018-02-26 14:55:58 -080091#define FRAME_NUM_LIMIT (INT_MAX - MAX_FRAME_DISTANCE - 1)
92
Cheng Chen10047242018-02-27 12:07:34 -080093// TODO(chengchen): Temporal flag serve as experimental flag for WIP
94// bitmask construction.
95// Shall be removed when bitmask code is completely checkedin
Cheng Chenab43aae2018-03-07 18:37:52 -080096#define LOOP_FILTER_BITMASK 0
Cheng Chen10047242018-02-27 12:07:34 -080097
Debargha Mukherjee53396fb2018-03-30 12:19:38 -070098#define PROFILE_BITS 3
99// The following three profiles are currently defined.
Yaowu Xu8f5def22018-03-15 11:51:00 -0700100// Profile 0. 8-bit and 10-bit 4:2:0 and 4:0:0 only.
101// Profile 1. 8-bit and 10-bit 4:4:4
102// Profile 2. 8-bit and 10-bit 4:2:2
Debargha Mukherjee53396fb2018-03-30 12:19:38 -0700103// 12-bit 4:0:0, 4:2:2 and 4:4:4
104// Since we have three bits for the profiles, it can be extended later.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700105typedef enum BITSTREAM_PROFILE {
106 PROFILE_0,
107 PROFILE_1,
108 PROFILE_2,
Debargha Mukherjee53396fb2018-03-30 12:19:38 -0700109 MAX_PROFILES,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700110} BITSTREAM_PROFILE;
111
Debargha Mukherjee112c5822018-04-09 09:42:29 -0700112#define LEVEL_BITS 4
113#define OP_POINTS_MINUS1_BITS 5
114#define OP_POINTS_IDC_BITS 12
115
Urvang Joshicb586f32016-09-20 11:36:33 -0700116// Note: Some enums use the attribute 'packed' to use smallest possible integer
117// type, so that we can save memory when they are used in structs/arrays.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700118
Urvang Joshicb586f32016-09-20 11:36:33 -0700119typedef enum ATTRIBUTE_PACKED {
120 BLOCK_4X4,
121 BLOCK_4X8,
122 BLOCK_8X4,
123 BLOCK_8X8,
124 BLOCK_8X16,
125 BLOCK_16X8,
126 BLOCK_16X16,
127 BLOCK_16X32,
128 BLOCK_32X16,
129 BLOCK_32X32,
130 BLOCK_32X64,
131 BLOCK_64X32,
132 BLOCK_64X64,
Urvang Joshicb586f32016-09-20 11:36:33 -0700133 BLOCK_64X128,
134 BLOCK_128X64,
135 BLOCK_128X128,
Yue Chen56e226e2017-05-02 16:21:40 -0700136 BLOCK_4X16,
137 BLOCK_16X4,
138 BLOCK_8X32,
139 BLOCK_32X8,
Rupert Swarbrick72678572017-08-02 12:05:26 +0100140 BLOCK_16X64,
141 BLOCK_64X16,
Yue Chen56e226e2017-05-02 16:21:40 -0700142 BLOCK_SIZES_ALL,
143 BLOCK_SIZES = BLOCK_4X16,
144 BLOCK_INVALID = 255,
Urvang Joshicb586f32016-09-20 11:36:33 -0700145 BLOCK_LARGEST = (BLOCK_SIZES - 1)
146} BLOCK_SIZE;
147
Yaowu Xu812897d2017-10-20 09:36:18 -0700148typedef enum ATTRIBUTE_PACKED {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700149 PARTITION_NONE,
150 PARTITION_HORZ,
151 PARTITION_VERT,
152 PARTITION_SPLIT,
Rupert Swarbrick136d5c12017-09-07 13:56:48 +0100153 PARTITION_HORZ_A, // HORZ split and the top partition is split again
154 PARTITION_HORZ_B, // HORZ split and the bottom partition is split again
155 PARTITION_VERT_A, // VERT split and the left partition is split again
156 PARTITION_VERT_B, // VERT split and the right partition is split again
Rupert Swarbrick93c39e92017-07-12 11:11:02 +0100157 PARTITION_HORZ_4, // 4:1 horizontal partition
158 PARTITION_VERT_4, // 4:1 vertical partition
Yaowu Xuc27fc142016-08-22 16:08:15 -0700159 EXT_PARTITION_TYPES,
Urvang Joshicb586f32016-09-20 11:36:33 -0700160 PARTITION_TYPES = PARTITION_SPLIT + 1,
161 PARTITION_INVALID = 255
162} PARTITION_TYPE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700163
164typedef char PARTITION_CONTEXT;
165#define PARTITION_PLOFFSET 4 // number of probability models per block size
Debargha Mukherjee2ccf4b92018-02-27 17:30:46 -0800166#define PARTITION_BLOCK_SIZES 5
Yue Chen4e9f4812018-03-12 17:56:54 -0700167#define PARTITION_CONTEXTS (PARTITION_BLOCK_SIZES * PARTITION_PLOFFSET)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700168
169// block transform size
Yaowu Xu25f97712017-10-19 17:28:15 -0700170#if defined(_MSC_VER)
171typedef uint8_t TX_SIZE;
172enum ATTRIBUTE_PACKED {
173#else
Urvang Joshicb586f32016-09-20 11:36:33 -0700174typedef enum ATTRIBUTE_PACKED {
Yaowu Xu25f97712017-10-19 17:28:15 -0700175#endif
Yaowu Xud3d41592018-02-14 13:26:52 -0800176 TX_4X4, // 4x4 transform
177 TX_8X8, // 8x8 transform
178 TX_16X16, // 16x16 transform
179 TX_32X32, // 32x32 transform
180 TX_64X64, // 64x64 transform
181 TX_4X8, // 4x8 transform
182 TX_8X4, // 8x4 transform
183 TX_8X16, // 8x16 transform
184 TX_16X8, // 16x8 transform
185 TX_16X32, // 16x32 transform
186 TX_32X16, // 32x16 transform
187 TX_32X64, // 32x64 transform
188 TX_64X32, // 64x32 transform
189 TX_4X16, // 4x16 transform
190 TX_16X4, // 16x4 transform
191 TX_8X32, // 8x32 transform
192 TX_32X8, // 32x8 transform
Debargha Mukherjee3f921082017-12-01 21:45:57 -0800193 TX_16X64, // 16x64 transform
194 TX_64X16, // 64x16 transform
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700195 TX_SIZES_ALL, // Includes rectangular transforms
196 TX_SIZES = TX_4X8, // Does NOT include rectangular transforms
Frederic Barbierd621f9b2018-01-19 12:25:17 +0100197 TX_SIZES_LARGEST = TX_64X64,
Frederic Barbierd621f9b2018-01-19 12:25:17 +0100198 TX_INVALID = 255 // Invalid transform size
Yaowu Xu25f97712017-10-19 17:28:15 -0700199#if defined(_MSC_VER)
200};
201#else
Urvang Joshicb586f32016-09-20 11:36:33 -0700202} TX_SIZE;
Yaowu Xu25f97712017-10-19 17:28:15 -0700203#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -0700204
Timothy B. Terriberryfe0fb1d2017-05-18 12:15:16 -0700205#define TX_SIZE_LUMA_MIN (TX_4X4)
206/* We don't need to code a transform size unless the allowed size is at least
207 one more than the minimum. */
208#define TX_SIZE_CTX_MIN (TX_SIZE_LUMA_MIN + 1)
209
Debargha Mukherjee6147b1b2017-11-08 08:31:09 -0800210// Maximum tx_size categories
211#define MAX_TX_CATS (TX_SIZES - TX_SIZE_CTX_MIN)
212#define MAX_TX_DEPTH 2
Jingning Hanaae72a62016-10-25 15:35:29 -0700213
Yaowu Xud3d41592018-02-14 13:26:52 -0800214#define MAX_TX_SIZE_LOG2 (6)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700215#define MAX_TX_SIZE (1 << MAX_TX_SIZE_LOG2)
216#define MIN_TX_SIZE_LOG2 2
217#define MIN_TX_SIZE (1 << MIN_TX_SIZE_LOG2)
218#define MAX_TX_SQUARE (MAX_TX_SIZE * MAX_TX_SIZE)
219
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700220// Pad 4 extra columns to remove horizontal availability check.
Jingning Hand915e4e2017-11-16 21:10:38 -0800221#define TX_PAD_HOR_LOG2 2
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700222#define TX_PAD_HOR 4
Linfeng Zhang679d81e2017-10-31 15:27:42 -0700223// Pad 6 extra rows (2 on top and 4 on bottom) to remove vertical availability
224// check.
225#define TX_PAD_TOP 2
226#define TX_PAD_BOTTOM 4
227#define TX_PAD_VER (TX_PAD_TOP + TX_PAD_BOTTOM)
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700228// Pad 16 extra bytes to avoid reading overflow in SIMD optimization.
229#define TX_PAD_END 16
230#define TX_PAD_2D \
231 ((MAX_TX_SIZE + TX_PAD_HOR) * (MAX_TX_SIZE + TX_PAD_VER) + TX_PAD_END)
Linfeng Zhang679d81e2017-10-31 15:27:42 -0700232
Yaowu Xuc27fc142016-08-22 16:08:15 -0700233// Number of maxium size transform blocks in the maximum size superblock
234#define MAX_TX_BLOCKS_IN_MAX_SB_LOG2 ((MAX_SB_SIZE_LOG2 - MAX_TX_SIZE_LOG2) * 2)
235#define MAX_TX_BLOCKS_IN_MAX_SB (1 << MAX_TX_BLOCKS_IN_MAX_SB_LOG2)
236
Yaowu Xuc27fc142016-08-22 16:08:15 -0700237// frame transform mode
Yaowu Xu812897d2017-10-20 09:36:18 -0700238typedef enum ATTRIBUTE_PACKED {
Debargha Mukherjee923b73d2017-10-31 18:11:34 -0700239 ONLY_4X4, // use only 4x4 transform
240 TX_MODE_LARGEST, // transform size is the largest possible for pu size
241 TX_MODE_SELECT, // transform specified for each block
242 TX_MODES,
243} TX_MODE;
244
Yaowu Xuc27fc142016-08-22 16:08:15 -0700245// 1D tx types
Yaowu Xu812897d2017-10-20 09:36:18 -0700246typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700247 DCT_1D,
248 ADST_1D,
249 FLIPADST_1D,
250 IDTX_1D,
Sarah Parker53f93db2017-07-11 17:20:04 -0700251 // TODO(sarahparker) need to eventually put something here for the
252 // mrc experiment to make this work with the ext-tx pruning functions
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700253 TX_TYPES_1D,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700254} TX_TYPE_1D;
255
Urvang Joshif5f5c842017-10-19 16:17:54 -0700256typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700257 DCT_DCT, // DCT in both horizontal and vertical
258 ADST_DCT, // ADST in vertical, DCT in horizontal
259 DCT_ADST, // DCT in vertical, ADST in horizontal
260 ADST_ADST, // ADST in both directions
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700261 FLIPADST_DCT,
262 DCT_FLIPADST,
263 FLIPADST_FLIPADST,
264 ADST_FLIPADST,
265 FLIPADST_ADST,
266 IDTX,
267 V_DCT,
268 H_DCT,
269 V_ADST,
270 H_ADST,
271 V_FLIPADST,
272 H_FLIPADST,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700273 TX_TYPES,
274} TX_TYPE;
275
Ankur Saxena6e6b6972017-10-20 22:10:10 -0700276typedef enum {
277 REG_REG,
278 REG_SMOOTH,
279 REG_SHARP,
280 SMOOTH_REG,
281 SMOOTH_SMOOTH,
282 SMOOTH_SHARP,
283 SHARP_REG,
284 SHARP_SMOOTH,
285 SHARP_SHARP,
286} DUAL_FILTER_TYPE;
Ankur Saxena6e6b6972017-10-20 22:10:10 -0700287
Yaowu Xu812897d2017-10-20 09:36:18 -0700288typedef enum ATTRIBUTE_PACKED {
Hui Suddbcde22017-09-18 17:22:02 -0700289 // DCT only
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700290 EXT_TX_SET_DCTONLY,
Hui Suddbcde22017-09-18 17:22:02 -0700291 // DCT + Identity only
292 EXT_TX_SET_DCT_IDTX,
Hui Suddbcde22017-09-18 17:22:02 -0700293 // Discrete Trig transforms w/o flip (4) + Identity (1)
294 EXT_TX_SET_DTT4_IDTX,
295 // Discrete Trig transforms w/o flip (4) + Identity (1) + 1D Hor/vert DCT (2)
Sarah Parkercec7ba12017-11-03 16:46:09 -0700296 // for 16x16 only
297 EXT_TX_SET_DTT4_IDTX_1DDCT_16X16,
298 // Discrete Trig transforms w/o flip (4) + Identity (1) + 1D Hor/vert DCT (2)
Hui Suddbcde22017-09-18 17:22:02 -0700299 EXT_TX_SET_DTT4_IDTX_1DDCT,
Sarah Parker9d8222b2017-11-19 19:08:55 -0800300 // Discrete Trig transforms w/ flip (9) + Identity (1)
301 EXT_TX_SET_DTT9_IDTX,
Hui Suddbcde22017-09-18 17:22:02 -0700302 // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver DCT (2)
303 EXT_TX_SET_DTT9_IDTX_1DDCT,
304 // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver (6)
Sarah Parkercec7ba12017-11-03 16:46:09 -0700305 // for 16x16 only
306 EXT_TX_SET_ALL16_16X16,
307 // Discrete Trig transforms w/ flip (9) + Identity (1) + 1D Hor/Ver (6)
Hui Suddbcde22017-09-18 17:22:02 -0700308 EXT_TX_SET_ALL16,
309 EXT_TX_SET_TYPES
310} TxSetType;
311
Thomas Daviesbe44e512017-06-07 11:41:07 +0100312#define IS_2D_TRANSFORM(tx_type) (tx_type < IDTX)
Thomas Daviesbe44e512017-06-07 11:41:07 +0100313
Sebastien Alaiwan9f001f32017-11-28 16:32:33 +0100314#define EXT_TX_SIZES 4 // number of sizes that use extended transforms
Yaowu Xuc27fc142016-08-22 16:08:15 -0700315#define EXT_TX_SETS_INTER 4 // Sets of transform selections for INTER
316#define EXT_TX_SETS_INTRA 3 // Sets of transform selections for INTRA
Yaowu Xuc27fc142016-08-22 16:08:15 -0700317
Yaowu Xu812897d2017-10-20 09:36:18 -0700318typedef enum ATTRIBUTE_PACKED {
Yaowu Xuf883b422016-08-30 14:01:10 -0700319 AOM_LAST_FLAG = 1 << 0,
Yaowu Xuf883b422016-08-30 14:01:10 -0700320 AOM_LAST2_FLAG = 1 << 1,
321 AOM_LAST3_FLAG = 1 << 2,
322 AOM_GOLD_FLAG = 1 << 3,
323 AOM_BWD_FLAG = 1 << 4,
Zoe Liu97ad0582017-02-09 10:51:00 -0800324 AOM_ALT2_FLAG = 1 << 5,
325 AOM_ALT_FLAG = 1 << 6,
326 AOM_REFFRAME_ALL = (1 << 7) - 1
Yaowu Xuf883b422016-08-30 14:01:10 -0700327} AOM_REFFRAME;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700328
Yaowu Xu812897d2017-10-20 09:36:18 -0700329typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700330 UNIDIR_COMP_REFERENCE,
331 BIDIR_COMP_REFERENCE,
332 COMP_REFERENCE_TYPES,
Zoe Liuc082bbc2017-05-17 13:31:37 -0700333} COMP_REFERENCE_TYPE;
Zoe Liuc082bbc2017-05-17 13:31:37 -0700334
Yaowu Xu812897d2017-10-20 09:36:18 -0700335typedef enum ATTRIBUTE_PACKED {
336 PLANE_TYPE_Y,
337 PLANE_TYPE_UV,
338 PLANE_TYPES
339} PLANE_TYPE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700340
David Michael Barrf6eaa152017-07-19 19:42:28 +0900341#define CFL_ALPHABET_SIZE_LOG2 4
342#define CFL_ALPHABET_SIZE (1 << CFL_ALPHABET_SIZE_LOG2)
343#define CFL_MAGS_SIZE ((2 << CFL_ALPHABET_SIZE_LOG2) + 1)
344#define CFL_IDX_U(idx) (idx >> CFL_ALPHABET_SIZE_LOG2)
345#define CFL_IDX_V(idx) (idx & (CFL_ALPHABET_SIZE - 1))
Luc Trudeauf5334002017-04-25 12:21:26 -0400346
Yaowu Xu812897d2017-10-20 09:36:18 -0700347typedef enum ATTRIBUTE_PACKED {
348 CFL_PRED_U,
349 CFL_PRED_V,
350 CFL_PRED_PLANES
351} CFL_PRED_TYPE;
David Michael Barrf6eaa152017-07-19 19:42:28 +0900352
Yaowu Xu812897d2017-10-20 09:36:18 -0700353typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700354 CFL_SIGN_ZERO,
355 CFL_SIGN_NEG,
356 CFL_SIGN_POS,
David Michael Barrf6eaa152017-07-19 19:42:28 +0900357 CFL_SIGNS
358} CFL_SIGN_TYPE;
359
David Michael Barrcb3a8ef2018-01-06 15:48:49 +0900360typedef enum ATTRIBUTE_PACKED {
361 CFL_DISALLOWED,
362 CFL_ALLOWED,
363 CFL_ALLOWED_TYPES
364} CFL_ALLOWED_TYPE;
365
David Michael Barrf6eaa152017-07-19 19:42:28 +0900366// CFL_SIGN_ZERO,CFL_SIGN_ZERO is invalid
367#define CFL_JOINT_SIGNS (CFL_SIGNS * CFL_SIGNS - 1)
368// CFL_SIGN_U is equivalent to (js + 1) / 3 for js in 0 to 8
369#define CFL_SIGN_U(js) (((js + 1) * 11) >> 5)
370// CFL_SIGN_V is equivalent to (js + 1) % 3 for js in 0 to 8
371#define CFL_SIGN_V(js) ((js + 1) - CFL_SIGNS * CFL_SIGN_U(js))
372
373// There is no context when the alpha for a given plane is zero.
374// So there are 2 fewer contexts than joint signs.
375#define CFL_ALPHA_CONTEXTS (CFL_JOINT_SIGNS + 1 - CFL_SIGNS)
376#define CFL_CONTEXT_U(js) (js + 1 - CFL_SIGNS)
377// Also, the contexts are symmetric under swapping the planes.
378#define CFL_CONTEXT_V(js) \
379 (CFL_SIGN_V(js) * CFL_SIGNS + CFL_SIGN_U(js) - CFL_SIGNS)
Luc Trudeau75cf92f2017-04-25 23:22:12 -0400380
Yaowu Xu812897d2017-10-20 09:36:18 -0700381typedef enum ATTRIBUTE_PACKED {
Sarah Parker0cf4d9f2017-08-18 13:09:14 -0700382 PALETTE_MAP,
Sarah Parker0cf4d9f2017-08-18 13:09:14 -0700383 COLOR_MAP_TYPES,
384} COLOR_MAP_TYPE;
385
Yaowu Xu812897d2017-10-20 09:36:18 -0700386typedef enum ATTRIBUTE_PACKED {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700387 TWO_COLORS,
388 THREE_COLORS,
389 FOUR_COLORS,
390 FIVE_COLORS,
391 SIX_COLORS,
392 SEVEN_COLORS,
393 EIGHT_COLORS,
394 PALETTE_SIZES
395} PALETTE_SIZE;
396
Yaowu Xu812897d2017-10-20 09:36:18 -0700397typedef enum ATTRIBUTE_PACKED {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700398 PALETTE_COLOR_ONE,
399 PALETTE_COLOR_TWO,
400 PALETTE_COLOR_THREE,
401 PALETTE_COLOR_FOUR,
402 PALETTE_COLOR_FIVE,
403 PALETTE_COLOR_SIX,
404 PALETTE_COLOR_SEVEN,
405 PALETTE_COLOR_EIGHT,
406 PALETTE_COLORS
407} PALETTE_COLOR;
408
Hui Su439bcb52018-02-21 10:52:16 -0800409// Note: All directional predictors must be between V_PRED and D67_PRED (both
Urvang Joshi875a6672017-06-05 11:59:35 -0700410// inclusive).
Urvang Joshicb586f32016-09-20 11:36:33 -0700411typedef enum ATTRIBUTE_PACKED {
Urvang Joshib7301cd2017-11-09 15:08:56 -0800412 DC_PRED, // Average of above and left pixels
413 V_PRED, // Vertical
414 H_PRED, // Horizontal
Hui Su69ae7b82018-02-20 20:10:51 -0800415 D45_PRED, // Directional 45 degree
416 D135_PRED, // Directional 135 degree
417 D113_PRED, // Directional 113 degree
418 D157_PRED, // Directional 157 degree
419 D203_PRED, // Directional 203 degree
420 D67_PRED, // Directional 67 degree
Urvang Joshib7301cd2017-11-09 15:08:56 -0800421 SMOOTH_PRED, // Combination of horizontal and vertical interpolation
Urvang Joshie6ca8e82017-03-15 14:57:41 -0700422 SMOOTH_V_PRED, // Vertical interpolation
423 SMOOTH_H_PRED, // Horizontal interpolation
Urvang Joshi96d1c0a2017-10-10 13:15:32 -0700424 PAETH_PRED, // Predict from the direction of smallest gradient
Urvang Joshicb586f32016-09-20 11:36:33 -0700425 NEARESTMV,
426 NEARMV,
Sarah Parker2b9ec2e2017-10-30 17:34:08 -0700427 GLOBALMV,
Urvang Joshicb586f32016-09-20 11:36:33 -0700428 NEWMV,
Zoe Liu239f06b2017-04-20 13:10:55 -0700429 // Compound ref compound modes
Urvang Joshicb586f32016-09-20 11:36:33 -0700430 NEAREST_NEARESTMV,
Urvang Joshicb586f32016-09-20 11:36:33 -0700431 NEAR_NEARMV,
432 NEAREST_NEWMV,
433 NEW_NEARESTMV,
434 NEAR_NEWMV,
435 NEW_NEARMV,
Sarah Parker2b9ec2e2017-10-30 17:34:08 -0700436 GLOBAL_GLOBALMV,
Urvang Joshicb586f32016-09-20 11:36:33 -0700437 NEW_NEWMV,
Urvang Joshicb586f32016-09-20 11:36:33 -0700438 MB_MODE_COUNT,
Angie Chiang4c9b6022018-04-10 16:16:45 -0700439 SINGLE_INTER_MODE_START = NEARESTMV,
440 SINGLE_INTER_MODE_END = NEAREST_NEARESTMV,
Urvang Joshi96d1c0a2017-10-10 13:15:32 -0700441 INTRA_MODES = PAETH_PRED + 1, // PAETH_PRED has to be the last intra mode.
Luc Trudeaua5e499f2017-04-14 21:33:27 -0400442 INTRA_INVALID = MB_MODE_COUNT // For uv_mode in inter blocks
Urvang Joshicb586f32016-09-20 11:36:33 -0700443} PREDICTION_MODE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700444
Luc Trudeaud6d9eee2017-07-12 12:36:50 -0400445// TODO(ltrudeau) Do we really want to pack this?
446// TODO(ltrudeau) Do we match with PREDICTION_MODE?
447typedef enum ATTRIBUTE_PACKED {
Urvang Joshib7301cd2017-11-09 15:08:56 -0800448 UV_DC_PRED, // Average of above and left pixels
449 UV_V_PRED, // Vertical
450 UV_H_PRED, // Horizontal
Hui Su69ae7b82018-02-20 20:10:51 -0800451 UV_D45_PRED, // Directional 45 degree
452 UV_D135_PRED, // Directional 135 degree
453 UV_D113_PRED, // Directional 113 degree
454 UV_D157_PRED, // Directional 157 degree
455 UV_D203_PRED, // Directional 203 degree
456 UV_D67_PRED, // Directional 67 degree
Urvang Joshib7301cd2017-11-09 15:08:56 -0800457 UV_SMOOTH_PRED, // Combination of horizontal and vertical interpolation
Luc Trudeaud6d9eee2017-07-12 12:36:50 -0400458 UV_SMOOTH_V_PRED, // Vertical interpolation
459 UV_SMOOTH_H_PRED, // Horizontal interpolation
Urvang Joshi96d1c0a2017-10-10 13:15:32 -0700460 UV_PAETH_PRED, // Predict from the direction of smallest gradient
Luc Trudeau3ec16a32018-03-01 20:58:09 -0500461 UV_CFL_PRED, // Chroma-from-Luma
Luc Trudeaud6d9eee2017-07-12 12:36:50 -0400462 UV_INTRA_MODES,
463 UV_MODE_INVALID, // For uv_mode in inter blocks
464} UV_PREDICTION_MODE;
Luc Trudeaud6d9eee2017-07-12 12:36:50 -0400465
Yaowu Xu812897d2017-10-20 09:36:18 -0700466typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700467 SIMPLE_TRANSLATION,
Yue Chen80daf0c2017-11-02 17:14:18 -0700468 OBMC_CAUSAL, // 2-sided OBMC
Yaowu Xuc27fc142016-08-22 16:08:15 -0700469 WARPED_CAUSAL, // 2-sided WARPED
Yue Chencb60b182016-10-13 15:18:22 -0700470 MOTION_MODES
471} MOTION_MODE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700472
Yaowu Xu812897d2017-10-20 09:36:18 -0700473typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700474 II_DC_PRED,
Yue Chen4d26acb2017-05-01 12:28:34 -0700475 II_V_PRED,
476 II_H_PRED,
Yue Chen4d26acb2017-05-01 12:28:34 -0700477 II_SMOOTH_PRED,
Yue Chen4d26acb2017-05-01 12:28:34 -0700478 INTERINTRA_MODES
479} INTERINTRA_MODE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700480
Sarah Parker6fddd182016-11-10 20:57:20 -0800481typedef enum {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700482 COMPOUND_AVERAGE,
Sarah Parker6fddd182016-11-10 20:57:20 -0800483 COMPOUND_WEDGE,
Sarah Parker5b4df2b2018-04-02 14:48:25 -0700484 COMPOUND_DIFFWTD,
Sarah Parker6fddd182016-11-10 20:57:20 -0800485 COMPOUND_TYPES,
486} COMPOUND_TYPE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700487
Yaowu Xu812897d2017-10-20 09:36:18 -0700488typedef enum ATTRIBUTE_PACKED {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700489 FILTER_DC_PRED,
490 FILTER_V_PRED,
491 FILTER_H_PRED,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700492 FILTER_D153_PRED,
Urvang Joshi96d1c0a2017-10-10 13:15:32 -0700493 FILTER_PAETH_PRED,
hui su5db97432016-10-14 16:10:14 -0700494 FILTER_INTRA_MODES,
495} FILTER_INTRA_MODE;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700496
hui su9cc10652017-04-27 17:22:07 -0700497#define DIRECTIONAL_MODES 8
Joe Young3ca43bf2017-10-06 15:12:46 -0700498#define MAX_ANGLE_DELTA 3
499#define ANGLE_STEP 3
Yaowu Xuc27fc142016-08-22 16:08:15 -0700500
Yaowu Xuc27fc142016-08-22 16:08:15 -0700501#define INTER_MODES (1 + NEWMV - NEARESTMV)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700502
Yaowu Xuc27fc142016-08-22 16:08:15 -0700503#define INTER_COMPOUND_MODES (1 + NEW_NEWMV - NEAREST_NEARESTMV)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700504
505#define SKIP_CONTEXTS 3
Zoe Liuf704a1c2017-10-02 16:55:59 -0700506#define SKIP_MODE_CONTEXTS 3
Yaowu Xuc27fc142016-08-22 16:08:15 -0700507
Cheng Chenc87b3402017-11-03 16:02:41 -0700508#define COMP_INDEX_CONTEXTS 6
Jingning Han0c3eb5a2018-03-26 15:29:12 -0700509#define COMP_GROUP_IDX_CONTEXTS 6
Cheng Chen0a7f2f52017-10-10 15:16:09 -0700510
Yaowu Xuc27fc142016-08-22 16:08:15 -0700511#define NMV_CONTEXTS 3
512
Jingning Han17f4f732018-03-23 10:43:59 -0700513#define NEWMV_MODE_CONTEXTS 6
Sarah Parker2b9ec2e2017-10-30 17:34:08 -0700514#define GLOBALMV_MODE_CONTEXTS 2
Jingning Hanb18cfd32018-03-23 11:07:28 -0700515#define REFMV_MODE_CONTEXTS 6
Jingning Han233c7622018-02-16 11:42:59 -0800516#define DRL_MODE_CONTEXTS 3
Yaowu Xuc27fc142016-08-22 16:08:15 -0700517
Sarah Parker2b9ec2e2017-10-30 17:34:08 -0700518#define GLOBALMV_OFFSET 3
Yaowu Xuc27fc142016-08-22 16:08:15 -0700519#define REFMV_OFFSET 4
520
Sarah Parker2b9ec2e2017-10-30 17:34:08 -0700521#define NEWMV_CTX_MASK ((1 << GLOBALMV_OFFSET) - 1)
522#define GLOBALMV_CTX_MASK ((1 << (REFMV_OFFSET - GLOBALMV_OFFSET)) - 1)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700523#define REFMV_CTX_MASK ((1 << (8 - REFMV_OFFSET)) - 1)
524
Jingning Han7ae50fd2018-02-05 16:33:40 -0800525#define COMP_NEWMV_CTXS 5
Jingning Hanb48e0472018-03-23 14:19:46 -0700526#define INTER_MODE_CONTEXTS 8
Jingning Han7ae50fd2018-02-05 16:33:40 -0800527
Thomas Daviesf6936102016-09-05 16:51:31 +0100528#define DELTA_Q_SMALL 3
Thomas Davies665cd702017-03-02 10:20:30 +0000529#define DELTA_Q_PROBS (DELTA_Q_SMALL)
Thomas Daviesf6936102016-09-05 16:51:31 +0100530#define DEFAULT_DELTA_Q_RES 4
Fangwen Fu231fe422017-04-24 17:52:29 -0700531#define DELTA_LF_SMALL 3
532#define DELTA_LF_PROBS (DELTA_LF_SMALL)
533#define DEFAULT_DELTA_LF_RES 2
Yaowu Xuc27fc142016-08-22 16:08:15 -0700534
535/* Segment Feature Masks */
536#define MAX_MV_REF_CANDIDATES 2
537
Urvang Joshi5a69cd22017-10-23 10:40:21 -0700538#define MAX_REF_MV_STACK_SIZE 8
Yaowu Xuc27fc142016-08-22 16:08:15 -0700539#define REF_CAT_LEVEL 640
Yaowu Xuc27fc142016-08-22 16:08:15 -0700540
541#define INTRA_INTER_CONTEXTS 4
542#define COMP_INTER_CONTEXTS 5
Zoe Liu3b353472018-02-12 13:58:22 -0800543#define REF_CONTEXTS 3
Zoe Liuc082bbc2017-05-17 13:31:37 -0700544
Zoe Liuc082bbc2017-05-17 13:31:37 -0700545#define COMP_REF_TYPE_CONTEXTS 5
Zoe Liufcf5fa22017-06-26 16:00:38 -0700546#define UNI_COMP_REF_CONTEXTS 3
Zoe Liuc082bbc2017-05-17 13:31:37 -0700547
Jingning Han85b780d2018-03-23 15:29:22 -0700548#define TXFM_PARTITION_CONTEXTS ((TX_SIZES - TX_8X8) * 6 - 3)
Jingning Han8b9478a2016-11-01 15:43:23 -0700549typedef uint8_t TXFM_CONTEXT;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700550
Emil Keyder01770b32017-01-20 18:03:11 -0500551#define NONE_FRAME -1
Yaowu Xuc27fc142016-08-22 16:08:15 -0700552#define INTRA_FRAME 0
553#define LAST_FRAME 1
Yaowu Xuc27fc142016-08-22 16:08:15 -0700554#define LAST2_FRAME 2
555#define LAST3_FRAME 3
556#define GOLDEN_FRAME 4
557#define BWDREF_FRAME 5
Zoe Liu97ad0582017-02-09 10:51:00 -0800558#define ALTREF2_FRAME 6
559#define ALTREF_FRAME 7
Yaowu Xuc27fc142016-08-22 16:08:15 -0700560#define LAST_REF_FRAMES (LAST3_FRAME - LAST_FRAME + 1)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700561
562#define INTER_REFS_PER_FRAME (ALTREF_FRAME - LAST_FRAME + 1)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700563
564#define FWD_REFS (GOLDEN_FRAME - LAST_FRAME + 1)
565#define FWD_RF_OFFSET(ref) (ref - LAST_FRAME)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700566#define BWD_REFS (ALTREF_FRAME - BWDREF_FRAME + 1)
567#define BWD_RF_OFFSET(ref) (ref - BWDREF_FRAME)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700568
569#define SINGLE_REFS (FWD_REFS + BWD_REFS)
Zoe Liu057f97b2018-01-24 13:45:25 -0800570
Yaowu Xu812897d2017-10-20 09:36:18 -0700571typedef enum ATTRIBUTE_PACKED {
Zoe Liu057f97b2018-01-24 13:45:25 -0800572 LAST_LAST2_FRAMES, // { LAST_FRAME, LAST2_FRAME }
573 LAST_LAST3_FRAMES, // { LAST_FRAME, LAST3_FRAME }
574 LAST_GOLDEN_FRAMES, // { LAST_FRAME, GOLDEN_FRAME }
575 BWDREF_ALTREF_FRAMES, // { BWDREF_FRAME, ALTREF_FRAME }
576 LAST2_LAST3_FRAMES, // { LAST2_FRAME, LAST3_FRAME }
577 LAST2_GOLDEN_FRAMES, // { LAST2_FRAME, GOLDEN_FRAME }
578 LAST3_GOLDEN_FRAMES, // { LAST3_FRAME, GOLDEN_FRAME }
579 BWDREF_ALTREF2_FRAMES, // { BWDREF_FRAME, ALTREF2_FRAME }
580 ALTREF2_ALTREF_FRAMES, // { ALTREF2_FRAME, ALTREF_FRAME }
581 TOTAL_UNIDIR_COMP_REFS,
Zoe Liu057f97b2018-01-24 13:45:25 -0800582 // NOTE: UNIDIR_COMP_REFS is the number of uni-directional reference pairs
583 // that are explicitly signaled.
584 UNIDIR_COMP_REFS = BWDREF_ALTREF_FRAMES + 1,
Zoe Liuc082bbc2017-05-17 13:31:37 -0700585} UNIDIR_COMP_REF;
Zoe Liu057f97b2018-01-24 13:45:25 -0800586
587#define TOTAL_COMP_REFS (FWD_REFS * BWD_REFS + TOTAL_UNIDIR_COMP_REFS)
588
Zoe Liuc082bbc2017-05-17 13:31:37 -0700589#define COMP_REFS (FWD_REFS * BWD_REFS + UNIDIR_COMP_REFS)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700590
Zoe Liu057f97b2018-01-24 13:45:25 -0800591// NOTE: A limited number of unidirectional reference pairs can be signalled for
592// compound prediction. The use of skip mode, on the other hand, makes it
593// possible to have a reference pair not listed for explicit signaling.
Zoe Liu27deb382018-03-27 15:13:56 -0700594#define MODE_CTX_REF_FRAMES (REF_FRAMES + TOTAL_COMP_REFS)
Yaowu Xuc27fc142016-08-22 16:08:15 -0700595
Yaowu Xu812897d2017-10-20 09:36:18 -0700596typedef enum ATTRIBUTE_PACKED {
Urvang Joshid0bf7d02017-10-02 17:41:24 -0700597 RESTORE_NONE,
598 RESTORE_WIENER,
599 RESTORE_SGRPROJ,
Debargha Mukherjeeb3c43bc2017-02-01 13:09:03 -0800600 RESTORE_SWITCHABLE,
Debargha Mukherjee5cd2ab92016-09-08 15:15:17 -0700601 RESTORE_SWITCHABLE_TYPES = RESTORE_SWITCHABLE,
Debargha Mukherjeea3d4fe52017-05-19 16:22:54 -0700602 RESTORE_TYPES = 4,
Debargha Mukherjee5cd2ab92016-09-08 15:15:17 -0700603} RestorationType;
Fergus Simpsond91c8c92017-04-07 12:12:00 -0700604
Fergus Simpsone7508412017-03-14 18:14:09 -0700605#define SUPERRES_SCALE_BITS 3
Urvang Joshi83010182017-10-27 12:36:02 -0700606#define SUPERRES_SCALE_DENOMINATOR_MIN (SCALE_NUMERATOR + 1)
Fergus Simpsond91c8c92017-04-07 12:12:00 -0700607
Yaowu Xuc27fc142016-08-22 16:08:15 -0700608#ifdef __cplusplus
609} // extern "C"
610#endif
611
Yaowu Xuf883b422016-08-30 14:01:10 -0700612#endif // AV1_COMMON_ENUMS_H_