xref: /aosp_15_r20/external/libgav1/src/utils/constants.h (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop /*
2*09537850SAkhilesh Sanikop  * Copyright 2019 The libgav1 Authors
3*09537850SAkhilesh Sanikop  *
4*09537850SAkhilesh Sanikop  * Licensed under the Apache License, Version 2.0 (the "License");
5*09537850SAkhilesh Sanikop  * you may not use this file except in compliance with the License.
6*09537850SAkhilesh Sanikop  * You may obtain a copy of the License at
7*09537850SAkhilesh Sanikop  *
8*09537850SAkhilesh Sanikop  *      http://www.apache.org/licenses/LICENSE-2.0
9*09537850SAkhilesh Sanikop  *
10*09537850SAkhilesh Sanikop  * Unless required by applicable law or agreed to in writing, software
11*09537850SAkhilesh Sanikop  * distributed under the License is distributed on an "AS IS" BASIS,
12*09537850SAkhilesh Sanikop  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*09537850SAkhilesh Sanikop  * See the License for the specific language governing permissions and
14*09537850SAkhilesh Sanikop  * limitations under the License.
15*09537850SAkhilesh Sanikop  */
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #ifndef LIBGAV1_SRC_UTILS_CONSTANTS_H_
18*09537850SAkhilesh Sanikop #define LIBGAV1_SRC_UTILS_CONSTANTS_H_
19*09537850SAkhilesh Sanikop 
20*09537850SAkhilesh Sanikop #include <cstdint>
21*09537850SAkhilesh Sanikop #include <cstdlib>
22*09537850SAkhilesh Sanikop 
23*09537850SAkhilesh Sanikop #include "src/utils/bit_mask_set.h"
24*09537850SAkhilesh Sanikop 
25*09537850SAkhilesh Sanikop namespace libgav1 {
26*09537850SAkhilesh Sanikop 
27*09537850SAkhilesh Sanikop // Returns the number of elements between begin (inclusive) and end (inclusive).
EnumRangeLength(int begin,int end)28*09537850SAkhilesh Sanikop constexpr int EnumRangeLength(int begin, int end) { return end - begin + 1; }
29*09537850SAkhilesh Sanikop 
30*09537850SAkhilesh Sanikop enum {
31*09537850SAkhilesh Sanikop // Maximum number of threads that the library will ever create.
32*09537850SAkhilesh Sanikop #if defined(LIBGAV1_MAX_THREADS) && LIBGAV1_MAX_THREADS > 0
33*09537850SAkhilesh Sanikop   kMaxThreads = LIBGAV1_MAX_THREADS
34*09537850SAkhilesh Sanikop #else
35*09537850SAkhilesh Sanikop   kMaxThreads = 128
36*09537850SAkhilesh Sanikop #endif
37*09537850SAkhilesh Sanikop };  // anonymous enum
38*09537850SAkhilesh Sanikop 
39*09537850SAkhilesh Sanikop enum {
40*09537850SAkhilesh Sanikop   // Documentation variables.
41*09537850SAkhilesh Sanikop   kBitdepth8 = 8,
42*09537850SAkhilesh Sanikop   kBitdepth10 = 10,
43*09537850SAkhilesh Sanikop   kBitdepth12 = 12,
44*09537850SAkhilesh Sanikop   kInvalidMvValue = -32768,
45*09537850SAkhilesh Sanikop   kCdfMaxProbability = 32768,
46*09537850SAkhilesh Sanikop   kBlockWidthCount = 5,
47*09537850SAkhilesh Sanikop   kMaxSegments = 8,
48*09537850SAkhilesh Sanikop   kMinQuantizer = 0,
49*09537850SAkhilesh Sanikop   kMinLossyQuantizer = 1,
50*09537850SAkhilesh Sanikop   kMaxQuantizer = 255,
51*09537850SAkhilesh Sanikop   // Quantizer matrix is used only when level < 15.
52*09537850SAkhilesh Sanikop   kNumQuantizerLevelsForQuantizerMatrix = 15,
53*09537850SAkhilesh Sanikop   kFrameLfCount = 4,
54*09537850SAkhilesh Sanikop   kMaxLoopFilterValue = 63,
55*09537850SAkhilesh Sanikop   kNum4x4In64x64 = 256,
56*09537850SAkhilesh Sanikop   kMaxAngleDelta = 3,
57*09537850SAkhilesh Sanikop   kDirectionalIntraModes = 8,
58*09537850SAkhilesh Sanikop   kMaxSuperBlockSizeLog2 = 7,
59*09537850SAkhilesh Sanikop   kMinSuperBlockSizeLog2 = 6,
60*09537850SAkhilesh Sanikop   kGlobalMotionReadControl = 3,
61*09537850SAkhilesh Sanikop   kSuperResScaleNumerator = 8,
62*09537850SAkhilesh Sanikop   kBooleanSymbolCount = 2,
63*09537850SAkhilesh Sanikop   kRestorationTypeSymbolCount = 3,
64*09537850SAkhilesh Sanikop   kSgrProjParamsBits = 4,
65*09537850SAkhilesh Sanikop   kSgrProjPrecisionBits = 7,
66*09537850SAkhilesh Sanikop   // Precision of a division table (mtable)
67*09537850SAkhilesh Sanikop   kSgrProjScaleBits = 20,
68*09537850SAkhilesh Sanikop   kSgrProjReciprocalBits = 12,
69*09537850SAkhilesh Sanikop   // Core self-guided restoration precision bits.
70*09537850SAkhilesh Sanikop   kSgrProjSgrBits = 8,
71*09537850SAkhilesh Sanikop   // Precision bits of generated values higher than source before projection.
72*09537850SAkhilesh Sanikop   kSgrProjRestoreBits = 4,
73*09537850SAkhilesh Sanikop   // Padding on left and right side of a restoration block.
74*09537850SAkhilesh Sanikop   // 3 is enough, but padding to 4 is more efficient, and makes the temporary
75*09537850SAkhilesh Sanikop   // source buffer 8-pixel aligned.
76*09537850SAkhilesh Sanikop   kRestorationHorizontalBorder = 4,
77*09537850SAkhilesh Sanikop   // Padding on top and bottom side of a restoration block.
78*09537850SAkhilesh Sanikop   kRestorationVerticalBorder = 2,
79*09537850SAkhilesh Sanikop   kCdefBorder = 2,             // Padding on each side of a cdef block.
80*09537850SAkhilesh Sanikop   kConvolveBorderLeftTop = 3,  // Left/top padding of a convolve block.
81*09537850SAkhilesh Sanikop   // Right/bottom padding of a convolve block. This needs to be 4 at minimum,
82*09537850SAkhilesh Sanikop   // but was increased to simplify the SIMD loads in
83*09537850SAkhilesh Sanikop   // ConvolveCompoundScale2D_NEON() and ConvolveScale2D_NEON().
84*09537850SAkhilesh Sanikop   kConvolveBorderRight = 8,
85*09537850SAkhilesh Sanikop   kConvolveScaleBorderRight = 15,
86*09537850SAkhilesh Sanikop   kConvolveBorderBottom = 4,
87*09537850SAkhilesh Sanikop   kSubPixelTaps = 8,
88*09537850SAkhilesh Sanikop   kWienerFilterBits = 7,
89*09537850SAkhilesh Sanikop   kWienerFilterTaps = 7,
90*09537850SAkhilesh Sanikop   kMaxPaletteSize = 8,
91*09537850SAkhilesh Sanikop   kMinPaletteSize = 2,
92*09537850SAkhilesh Sanikop   kMaxPaletteSquare = 64,
93*09537850SAkhilesh Sanikop   kBorderPixels = 64,
94*09537850SAkhilesh Sanikop   // The final blending process for film grain needs room to overwrite and read
95*09537850SAkhilesh Sanikop   // with SIMD instructions. The maximum overwrite is 7 pixels, but the border
96*09537850SAkhilesh Sanikop   // is required to be a multiple of 32 by YuvBuffer::Realloc, so that
97*09537850SAkhilesh Sanikop   // subsampled chroma borders are 16-aligned.
98*09537850SAkhilesh Sanikop   kBorderPixelsFilmGrain = 32,
99*09537850SAkhilesh Sanikop   // These constants are the minimum left, right, top, and bottom border sizes
100*09537850SAkhilesh Sanikop   // in pixels as an extension of the frame boundary. The minimum border sizes
101*09537850SAkhilesh Sanikop   // are derived from the following requirements:
102*09537850SAkhilesh Sanikop   // - Warp_C() may read up to 13 pixels before or after a row.
103*09537850SAkhilesh Sanikop   // - Warp_NEON() may read up to 13 pixels before a row. It may read up to 14
104*09537850SAkhilesh Sanikop   //   pixels after a row, but the value of the last read pixel is not used.
105*09537850SAkhilesh Sanikop   // - Warp_C() and Warp_NEON() may read up to 13 pixels above the top row and
106*09537850SAkhilesh Sanikop   //   13 pixels below the bottom row.
107*09537850SAkhilesh Sanikop   kMinLeftBorderPixels = 13,
108*09537850SAkhilesh Sanikop   kMinRightBorderPixels = 13,
109*09537850SAkhilesh Sanikop   kMinTopBorderPixels = 13,
110*09537850SAkhilesh Sanikop   kMinBottomBorderPixels = 13,
111*09537850SAkhilesh Sanikop   kWarpedModelPrecisionBits = 16,
112*09537850SAkhilesh Sanikop   kMaxRefMvStackSize = 8,
113*09537850SAkhilesh Sanikop   kMaxLeastSquaresSamples = 8,
114*09537850SAkhilesh Sanikop   kMaxTemporalMvCandidates = 19,
115*09537850SAkhilesh Sanikop   // The SIMD implementations of motion vection projection functions always
116*09537850SAkhilesh Sanikop   // process 2 or 4 elements together, so we pad the corresponding buffers to
117*09537850SAkhilesh Sanikop   // size 20.
118*09537850SAkhilesh Sanikop   kMaxTemporalMvCandidatesWithPadding = 20,
119*09537850SAkhilesh Sanikop   kMaxSuperBlockSizeInPixels = 128,
120*09537850SAkhilesh Sanikop   kMaxScaledSuperBlockSizeInPixels = 128 * 2,
121*09537850SAkhilesh Sanikop   kMaxSuperBlockSizeSquareInPixels = 128 * 128,
122*09537850SAkhilesh Sanikop   kNum4x4InLoopFilterUnit = 16,
123*09537850SAkhilesh Sanikop   kNum4x4InLoopRestorationUnit = 16,
124*09537850SAkhilesh Sanikop   kProjectionMvClamp = (1 << 14) - 1,  // == 16383
125*09537850SAkhilesh Sanikop   kProjectionMvMaxHorizontalOffset = 8,
126*09537850SAkhilesh Sanikop   kCdefUnitSize = 64,
127*09537850SAkhilesh Sanikop   kCdefUnitSizeWithBorders = kCdefUnitSize + 2 * kCdefBorder,
128*09537850SAkhilesh Sanikop   kRestorationUnitOffset = 8,
129*09537850SAkhilesh Sanikop   // Loop restoration's processing unit size is fixed as 64x64.
130*09537850SAkhilesh Sanikop   kRestorationUnitHeight = 64,
131*09537850SAkhilesh Sanikop   kRestorationUnitWidth = 256,
132*09537850SAkhilesh Sanikop   kRestorationUnitHeightWithBorders =
133*09537850SAkhilesh Sanikop       kRestorationUnitHeight + 2 * kRestorationVerticalBorder,
134*09537850SAkhilesh Sanikop   kRestorationUnitWidthWithBorders =
135*09537850SAkhilesh Sanikop       kRestorationUnitWidth + 2 * kRestorationHorizontalBorder,
136*09537850SAkhilesh Sanikop   kSuperResFilterBits = 6,
137*09537850SAkhilesh Sanikop   kSuperResFilterShifts = 1 << kSuperResFilterBits,
138*09537850SAkhilesh Sanikop   kSuperResFilterTaps = 8,
139*09537850SAkhilesh Sanikop   kSuperResScaleBits = 14,
140*09537850SAkhilesh Sanikop   kSuperResExtraBits = kSuperResScaleBits - kSuperResFilterBits,
141*09537850SAkhilesh Sanikop   kSuperResScaleMask = (1 << 14) - 1,
142*09537850SAkhilesh Sanikop   kSuperResHorizontalBorder = 4,
143*09537850SAkhilesh Sanikop   kSuperResVerticalBorder = 1,
144*09537850SAkhilesh Sanikop   // The SIMD implementations of superres calculate up to 15 extra upscaled
145*09537850SAkhilesh Sanikop   // pixels which will over-read up to 15 downscaled pixels in the end of each
146*09537850SAkhilesh Sanikop   // row. Set the padding to 16 for alignment purposes.
147*09537850SAkhilesh Sanikop   kSuperResHorizontalPadding = 16,
148*09537850SAkhilesh Sanikop   // TODO(chengchen): consider merging these constants:
149*09537850SAkhilesh Sanikop   // kFilterBits, kWienerFilterBits, and kSgrProjPrecisionBits, which are all 7,
150*09537850SAkhilesh Sanikop   // They are designed to match AV1 convolution, which increases coeff
151*09537850SAkhilesh Sanikop   // values up to 7 bits. We could consider to combine them and use kFilterBits
152*09537850SAkhilesh Sanikop   // only.
153*09537850SAkhilesh Sanikop   kFilterBits = 7,
154*09537850SAkhilesh Sanikop   // Sub pixel is used in AV1 to represent a pixel location that is not at
155*09537850SAkhilesh Sanikop   // integer position. Sub pixel is in 1/16 (1 << kSubPixelBits) unit of
156*09537850SAkhilesh Sanikop   // integer pixel. Sub pixel values are interpolated using adjacent integer
157*09537850SAkhilesh Sanikop   // pixel values. The interpolation is a filtering process.
158*09537850SAkhilesh Sanikop   kSubPixelBits = 4,
159*09537850SAkhilesh Sanikop   kSubPixelMask = (1 << kSubPixelBits) - 1,
160*09537850SAkhilesh Sanikop   // Precision bits when computing inter prediction locations.
161*09537850SAkhilesh Sanikop   kScaleSubPixelBits = 10,
162*09537850SAkhilesh Sanikop   kWarpParamRoundingBits = 6,
163*09537850SAkhilesh Sanikop   // Number of fractional bits of lookup in divisor lookup table.
164*09537850SAkhilesh Sanikop   kDivisorLookupBits = 8,
165*09537850SAkhilesh Sanikop   // Number of fractional bits of entries in divisor lookup table.
166*09537850SAkhilesh Sanikop   kDivisorLookupPrecisionBits = 14,
167*09537850SAkhilesh Sanikop   // Number of phases used in warped filtering.
168*09537850SAkhilesh Sanikop   kWarpedPixelPrecisionShifts = 1 << 6,
169*09537850SAkhilesh Sanikop   kResidualPaddingVertical = 4,
170*09537850SAkhilesh Sanikop   kWedgeMaskMasterSize = 64,
171*09537850SAkhilesh Sanikop   kMaxFrameDistance = 31,
172*09537850SAkhilesh Sanikop   kReferenceFrameScalePrecision = 14,
173*09537850SAkhilesh Sanikop   kNumWienerCoefficients = 3,
174*09537850SAkhilesh Sanikop   kLoopFilterMaxModeDeltas = 2,
175*09537850SAkhilesh Sanikop   kMaxCdefStrengths = 8,
176*09537850SAkhilesh Sanikop   kCdefLargeValue = 0x4000,  // Used to indicate where CDEF is not available.
177*09537850SAkhilesh Sanikop   kMaxTileColumns = 64,
178*09537850SAkhilesh Sanikop   kMaxTileRows = 64,
179*09537850SAkhilesh Sanikop   kMaxOperatingPoints = 32,
180*09537850SAkhilesh Sanikop   // There can be a maximum of 4 spatial layers and 8 temporal layers.
181*09537850SAkhilesh Sanikop   kMaxLayers = 32,
182*09537850SAkhilesh Sanikop   // The cache line size should ideally be queried at run time. 64 is a common
183*09537850SAkhilesh Sanikop   // cache line size of x86 CPUs. Web searches showed the cache line size of ARM
184*09537850SAkhilesh Sanikop   // CPUs is 32 or 64 bytes. So aligning to 64-byte boundary will work for all
185*09537850SAkhilesh Sanikop   // CPUs that we care about, even though it is excessive for some ARM
186*09537850SAkhilesh Sanikop   // CPUs.
187*09537850SAkhilesh Sanikop   //
188*09537850SAkhilesh Sanikop   // On Linux, the cache line size can be looked up with the command:
189*09537850SAkhilesh Sanikop   //   getconf LEVEL1_DCACHE_LINESIZE
190*09537850SAkhilesh Sanikop   kCacheLineSize = 64,
191*09537850SAkhilesh Sanikop   // InterRound0, Section 7.11.3.2.
192*09537850SAkhilesh Sanikop   kInterRoundBitsHorizontal = 3,  // 8 & 10-bit.
193*09537850SAkhilesh Sanikop   kInterRoundBitsHorizontal12bpp = 5,
194*09537850SAkhilesh Sanikop   kInterRoundBitsCompoundVertical = 7,  // 8, 10 & 12-bit compound prediction.
195*09537850SAkhilesh Sanikop   kInterRoundBitsVertical = 11,         // 8 & 10-bit, single prediction.
196*09537850SAkhilesh Sanikop   kInterRoundBitsVertical12bpp = 9,
197*09537850SAkhilesh Sanikop   // Offset applied to 10bpp and 12bpp predictors to allow storing them in
198*09537850SAkhilesh Sanikop   // uint16_t. Removed before blending.
199*09537850SAkhilesh Sanikop   kCompoundOffset = (1 << 14) + (1 << 13),
200*09537850SAkhilesh Sanikop };  // anonymous enum
201*09537850SAkhilesh Sanikop 
202*09537850SAkhilesh Sanikop enum FrameType : uint8_t {
203*09537850SAkhilesh Sanikop   kFrameKey,
204*09537850SAkhilesh Sanikop   kFrameInter,
205*09537850SAkhilesh Sanikop   kFrameIntraOnly,
206*09537850SAkhilesh Sanikop   kFrameSwitch
207*09537850SAkhilesh Sanikop };
208*09537850SAkhilesh Sanikop 
209*09537850SAkhilesh Sanikop enum Plane : uint8_t { kPlaneY, kPlaneU, kPlaneV };
210*09537850SAkhilesh Sanikop enum : uint8_t { kMaxPlanesMonochrome = kPlaneY + 1, kMaxPlanes = kPlaneV + 1 };
211*09537850SAkhilesh Sanikop 
212*09537850SAkhilesh Sanikop // The plane types, called luma and chroma in the spec.
213*09537850SAkhilesh Sanikop enum PlaneType : uint8_t { kPlaneTypeY, kPlaneTypeUV, kNumPlaneTypes };
214*09537850SAkhilesh Sanikop 
215*09537850SAkhilesh Sanikop enum ReferenceFrameType : int8_t {
216*09537850SAkhilesh Sanikop   kReferenceFrameNone = -1,
217*09537850SAkhilesh Sanikop   kReferenceFrameIntra,
218*09537850SAkhilesh Sanikop   kReferenceFrameLast,
219*09537850SAkhilesh Sanikop   kReferenceFrameLast2,
220*09537850SAkhilesh Sanikop   kReferenceFrameLast3,
221*09537850SAkhilesh Sanikop   kReferenceFrameGolden,
222*09537850SAkhilesh Sanikop   kReferenceFrameBackward,
223*09537850SAkhilesh Sanikop   kReferenceFrameAlternate2,
224*09537850SAkhilesh Sanikop   kReferenceFrameAlternate,
225*09537850SAkhilesh Sanikop   kNumReferenceFrameTypes,
226*09537850SAkhilesh Sanikop   kNumInterReferenceFrameTypes =
227*09537850SAkhilesh Sanikop       EnumRangeLength(kReferenceFrameLast, kReferenceFrameAlternate),
228*09537850SAkhilesh Sanikop   kNumForwardReferenceTypes =
229*09537850SAkhilesh Sanikop       EnumRangeLength(kReferenceFrameLast, kReferenceFrameGolden),
230*09537850SAkhilesh Sanikop   kNumBackwardReferenceTypes =
231*09537850SAkhilesh Sanikop       EnumRangeLength(kReferenceFrameBackward, kReferenceFrameAlternate)
232*09537850SAkhilesh Sanikop };
233*09537850SAkhilesh Sanikop 
234*09537850SAkhilesh Sanikop enum {
235*09537850SAkhilesh Sanikop   // Unidirectional compound reference pairs that are signaled explicitly:
236*09537850SAkhilesh Sanikop   // {kReferenceFrameLast, kReferenceFrameLast2},
237*09537850SAkhilesh Sanikop   // {kReferenceFrameLast, kReferenceFrameLast3},
238*09537850SAkhilesh Sanikop   // {kReferenceFrameLast, kReferenceFrameGolden},
239*09537850SAkhilesh Sanikop   // {kReferenceFrameBackward, kReferenceFrameAlternate}
240*09537850SAkhilesh Sanikop   kExplicitUnidirectionalCompoundReferences = 4,
241*09537850SAkhilesh Sanikop   // Other unidirectional compound reference pairs:
242*09537850SAkhilesh Sanikop   // {kReferenceFrameLast2, kReferenceFrameLast3},
243*09537850SAkhilesh Sanikop   // {kReferenceFrameLast2, kReferenceFrameGolden},
244*09537850SAkhilesh Sanikop   // {kReferenceFrameLast3, kReferenceFrameGolden},
245*09537850SAkhilesh Sanikop   // {kReferenceFrameBackward, kReferenceFrameAlternate2},
246*09537850SAkhilesh Sanikop   // {kReferenceFrameAlternate2, kReferenceFrameAlternate}
247*09537850SAkhilesh Sanikop   kUnidirectionalCompoundReferences =
248*09537850SAkhilesh Sanikop       kExplicitUnidirectionalCompoundReferences + 5,
249*09537850SAkhilesh Sanikop };  // anonymous enum
250*09537850SAkhilesh Sanikop 
251*09537850SAkhilesh Sanikop enum BlockSize : uint8_t {
252*09537850SAkhilesh Sanikop   kBlock4x4,
253*09537850SAkhilesh Sanikop   kBlock4x8,
254*09537850SAkhilesh Sanikop   kBlock4x16,
255*09537850SAkhilesh Sanikop   kBlock8x4,
256*09537850SAkhilesh Sanikop   kBlock8x8,
257*09537850SAkhilesh Sanikop   kBlock8x16,
258*09537850SAkhilesh Sanikop   kBlock8x32,
259*09537850SAkhilesh Sanikop   kBlock16x4,
260*09537850SAkhilesh Sanikop   kBlock16x8,
261*09537850SAkhilesh Sanikop   kBlock16x16,
262*09537850SAkhilesh Sanikop   kBlock16x32,
263*09537850SAkhilesh Sanikop   kBlock16x64,
264*09537850SAkhilesh Sanikop   kBlock32x8,
265*09537850SAkhilesh Sanikop   kBlock32x16,
266*09537850SAkhilesh Sanikop   kBlock32x32,
267*09537850SAkhilesh Sanikop   kBlock32x64,
268*09537850SAkhilesh Sanikop   kBlock64x16,
269*09537850SAkhilesh Sanikop   kBlock64x32,
270*09537850SAkhilesh Sanikop   kBlock64x64,
271*09537850SAkhilesh Sanikop   kBlock64x128,
272*09537850SAkhilesh Sanikop   kBlock128x64,
273*09537850SAkhilesh Sanikop   kBlock128x128,
274*09537850SAkhilesh Sanikop   kMaxBlockSizes,
275*09537850SAkhilesh Sanikop   kBlockInvalid
276*09537850SAkhilesh Sanikop };
277*09537850SAkhilesh Sanikop 
278*09537850SAkhilesh Sanikop //  Partition types.  R: Recursive
279*09537850SAkhilesh Sanikop //
280*09537850SAkhilesh Sanikop //  None          Horizontal    Vertical      Split
281*09537850SAkhilesh Sanikop //  +-------+     +-------+     +---+---+     +---+---+
282*09537850SAkhilesh Sanikop //  |       |     |       |     |   |   |     | R | R |
283*09537850SAkhilesh Sanikop //  |       |     +-------+     |   |   |     +---+---+
284*09537850SAkhilesh Sanikop //  |       |     |       |     |   |   |     | R | R |
285*09537850SAkhilesh Sanikop //  +-------+     +-------+     +---+---+     +---+---+
286*09537850SAkhilesh Sanikop //
287*09537850SAkhilesh Sanikop //  Horizontal    Horizontal    Vertical      Vertical
288*09537850SAkhilesh Sanikop //  with top      with bottom   with left     with right
289*09537850SAkhilesh Sanikop //  split         split         split         split
290*09537850SAkhilesh Sanikop //  +---+---+     +-------+     +---+---+     +---+---+
291*09537850SAkhilesh Sanikop //  |   |   |     |       |     |   |   |     |   |   |
292*09537850SAkhilesh Sanikop //  +---+---+     +---+---+     +---+   |     |   +---+
293*09537850SAkhilesh Sanikop //  |       |     |   |   |     |   |   |     |   |   |
294*09537850SAkhilesh Sanikop //  +-------+     +---+---+     +---+---+     +---+---+
295*09537850SAkhilesh Sanikop //
296*09537850SAkhilesh Sanikop //  Horizontal4   Vertical4
297*09537850SAkhilesh Sanikop //  +-----+       +-+-+-+
298*09537850SAkhilesh Sanikop //  +-----+       | | | |
299*09537850SAkhilesh Sanikop //  +-----+       | | | |
300*09537850SAkhilesh Sanikop //  +-----+       +-+-+-+
301*09537850SAkhilesh Sanikop enum Partition : uint8_t {
302*09537850SAkhilesh Sanikop   kPartitionNone,
303*09537850SAkhilesh Sanikop   kPartitionHorizontal,
304*09537850SAkhilesh Sanikop   kPartitionVertical,
305*09537850SAkhilesh Sanikop   kPartitionSplit,
306*09537850SAkhilesh Sanikop   kPartitionHorizontalWithTopSplit,
307*09537850SAkhilesh Sanikop   kPartitionHorizontalWithBottomSplit,
308*09537850SAkhilesh Sanikop   kPartitionVerticalWithLeftSplit,
309*09537850SAkhilesh Sanikop   kPartitionVerticalWithRightSplit,
310*09537850SAkhilesh Sanikop   kPartitionHorizontal4,
311*09537850SAkhilesh Sanikop   kPartitionVertical4
312*09537850SAkhilesh Sanikop };
313*09537850SAkhilesh Sanikop enum : uint8_t { kMaxPartitionTypes = kPartitionVertical4 + 1 };
314*09537850SAkhilesh Sanikop 
315*09537850SAkhilesh Sanikop enum PredictionMode : uint8_t {
316*09537850SAkhilesh Sanikop   // Intra prediction modes.
317*09537850SAkhilesh Sanikop   kPredictionModeDc,
318*09537850SAkhilesh Sanikop   kPredictionModeVertical,
319*09537850SAkhilesh Sanikop   kPredictionModeHorizontal,
320*09537850SAkhilesh Sanikop   kPredictionModeD45,
321*09537850SAkhilesh Sanikop   kPredictionModeD135,
322*09537850SAkhilesh Sanikop   kPredictionModeD113,
323*09537850SAkhilesh Sanikop   kPredictionModeD157,
324*09537850SAkhilesh Sanikop   kPredictionModeD203,
325*09537850SAkhilesh Sanikop   kPredictionModeD67,
326*09537850SAkhilesh Sanikop   kPredictionModeSmooth,
327*09537850SAkhilesh Sanikop   kPredictionModeSmoothVertical,
328*09537850SAkhilesh Sanikop   kPredictionModeSmoothHorizontal,
329*09537850SAkhilesh Sanikop   kPredictionModePaeth,
330*09537850SAkhilesh Sanikop   kPredictionModeChromaFromLuma,
331*09537850SAkhilesh Sanikop   // Single inter prediction modes.
332*09537850SAkhilesh Sanikop   kPredictionModeNearestMv,
333*09537850SAkhilesh Sanikop   kPredictionModeNearMv,
334*09537850SAkhilesh Sanikop   kPredictionModeGlobalMv,
335*09537850SAkhilesh Sanikop   kPredictionModeNewMv,
336*09537850SAkhilesh Sanikop   // Compound inter prediction modes.
337*09537850SAkhilesh Sanikop   kPredictionModeNearestNearestMv,
338*09537850SAkhilesh Sanikop   kPredictionModeNearNearMv,
339*09537850SAkhilesh Sanikop   kPredictionModeNearestNewMv,
340*09537850SAkhilesh Sanikop   kPredictionModeNewNearestMv,
341*09537850SAkhilesh Sanikop   kPredictionModeNearNewMv,
342*09537850SAkhilesh Sanikop   kPredictionModeNewNearMv,
343*09537850SAkhilesh Sanikop   kPredictionModeGlobalGlobalMv,
344*09537850SAkhilesh Sanikop   kPredictionModeNewNewMv,
345*09537850SAkhilesh Sanikop   kNumPredictionModes,
346*09537850SAkhilesh Sanikop   kNumCompoundInterPredictionModes =
347*09537850SAkhilesh Sanikop       EnumRangeLength(kPredictionModeNearestNearestMv, kPredictionModeNewNewMv),
348*09537850SAkhilesh Sanikop   kIntraPredictionModesY =
349*09537850SAkhilesh Sanikop       EnumRangeLength(kPredictionModeDc, kPredictionModePaeth),
350*09537850SAkhilesh Sanikop   kIntraPredictionModesUV =
351*09537850SAkhilesh Sanikop       EnumRangeLength(kPredictionModeDc, kPredictionModeChromaFromLuma),
352*09537850SAkhilesh Sanikop   kPredictionModeInvalid = 255
353*09537850SAkhilesh Sanikop };
354*09537850SAkhilesh Sanikop 
355*09537850SAkhilesh Sanikop enum InterIntraMode : uint8_t {
356*09537850SAkhilesh Sanikop   kInterIntraModeDc,
357*09537850SAkhilesh Sanikop   kInterIntraModeVertical,
358*09537850SAkhilesh Sanikop   kInterIntraModeHorizontal,
359*09537850SAkhilesh Sanikop   kInterIntraModeSmooth,
360*09537850SAkhilesh Sanikop   kNumInterIntraModes
361*09537850SAkhilesh Sanikop };
362*09537850SAkhilesh Sanikop 
363*09537850SAkhilesh Sanikop enum MotionMode : uint8_t {
364*09537850SAkhilesh Sanikop   kMotionModeSimple,
365*09537850SAkhilesh Sanikop   kMotionModeObmc,  // Overlapped block motion compensation.
366*09537850SAkhilesh Sanikop   kMotionModeLocalWarp,
367*09537850SAkhilesh Sanikop   kNumMotionModes
368*09537850SAkhilesh Sanikop };
369*09537850SAkhilesh Sanikop 
370*09537850SAkhilesh Sanikop enum TxMode : uint8_t {
371*09537850SAkhilesh Sanikop   kTxModeOnly4x4,
372*09537850SAkhilesh Sanikop   kTxModeLargest,
373*09537850SAkhilesh Sanikop   kTxModeSelect,
374*09537850SAkhilesh Sanikop   kNumTxModes
375*09537850SAkhilesh Sanikop };
376*09537850SAkhilesh Sanikop 
377*09537850SAkhilesh Sanikop // These enums are named as kType1Type2 where Type1 is the transform type for
378*09537850SAkhilesh Sanikop // the rows and Type2 is the transform type for the columns.
379*09537850SAkhilesh Sanikop enum TransformType : uint8_t {
380*09537850SAkhilesh Sanikop   kTransformTypeDctDct,
381*09537850SAkhilesh Sanikop   kTransformTypeAdstDct,
382*09537850SAkhilesh Sanikop   kTransformTypeDctAdst,
383*09537850SAkhilesh Sanikop   kTransformTypeAdstAdst,
384*09537850SAkhilesh Sanikop   kTransformTypeFlipadstDct,
385*09537850SAkhilesh Sanikop   kTransformTypeDctFlipadst,
386*09537850SAkhilesh Sanikop   kTransformTypeFlipadstFlipadst,
387*09537850SAkhilesh Sanikop   kTransformTypeAdstFlipadst,
388*09537850SAkhilesh Sanikop   kTransformTypeFlipadstAdst,
389*09537850SAkhilesh Sanikop   kTransformTypeIdentityIdentity,
390*09537850SAkhilesh Sanikop   kTransformTypeIdentityDct,
391*09537850SAkhilesh Sanikop   kTransformTypeDctIdentity,
392*09537850SAkhilesh Sanikop   kTransformTypeIdentityAdst,
393*09537850SAkhilesh Sanikop   kTransformTypeAdstIdentity,
394*09537850SAkhilesh Sanikop   kTransformTypeIdentityFlipadst,
395*09537850SAkhilesh Sanikop   kTransformTypeFlipadstIdentity,
396*09537850SAkhilesh Sanikop   kNumTransformTypes
397*09537850SAkhilesh Sanikop };
398*09537850SAkhilesh Sanikop 
399*09537850SAkhilesh Sanikop constexpr BitMaskSet kTransformFlipColumnsMask(kTransformTypeFlipadstDct,
400*09537850SAkhilesh Sanikop                                                kTransformTypeFlipadstAdst,
401*09537850SAkhilesh Sanikop                                                kTransformTypeFlipadstIdentity,
402*09537850SAkhilesh Sanikop                                                kTransformTypeFlipadstFlipadst);
403*09537850SAkhilesh Sanikop constexpr BitMaskSet kTransformFlipRowsMask(kTransformTypeDctFlipadst,
404*09537850SAkhilesh Sanikop                                             kTransformTypeAdstFlipadst,
405*09537850SAkhilesh Sanikop                                             kTransformTypeIdentityFlipadst,
406*09537850SAkhilesh Sanikop                                             kTransformTypeFlipadstFlipadst);
407*09537850SAkhilesh Sanikop 
408*09537850SAkhilesh Sanikop enum TransformSize : uint8_t {
409*09537850SAkhilesh Sanikop   kTransformSize4x4,
410*09537850SAkhilesh Sanikop   kTransformSize4x8,
411*09537850SAkhilesh Sanikop   kTransformSize4x16,
412*09537850SAkhilesh Sanikop   kTransformSize8x4,
413*09537850SAkhilesh Sanikop   kTransformSize8x8,
414*09537850SAkhilesh Sanikop   kTransformSize8x16,
415*09537850SAkhilesh Sanikop   kTransformSize8x32,
416*09537850SAkhilesh Sanikop   kTransformSize16x4,
417*09537850SAkhilesh Sanikop   kTransformSize16x8,
418*09537850SAkhilesh Sanikop   kTransformSize16x16,
419*09537850SAkhilesh Sanikop   kTransformSize16x32,
420*09537850SAkhilesh Sanikop   kTransformSize16x64,
421*09537850SAkhilesh Sanikop   kTransformSize32x8,
422*09537850SAkhilesh Sanikop   kTransformSize32x16,
423*09537850SAkhilesh Sanikop   kTransformSize32x32,
424*09537850SAkhilesh Sanikop   kTransformSize32x64,
425*09537850SAkhilesh Sanikop   kTransformSize64x16,
426*09537850SAkhilesh Sanikop   kTransformSize64x32,
427*09537850SAkhilesh Sanikop   kTransformSize64x64,
428*09537850SAkhilesh Sanikop   kNumTransformSizes
429*09537850SAkhilesh Sanikop };
430*09537850SAkhilesh Sanikop 
431*09537850SAkhilesh Sanikop enum TransformSet : uint8_t {
432*09537850SAkhilesh Sanikop   // DCT Only (1).
433*09537850SAkhilesh Sanikop   kTransformSetDctOnly,
434*09537850SAkhilesh Sanikop   // 2D-DCT and 2D-ADST without flip (4) + Identity (1) + 1D Horizontal/Vertical
435*09537850SAkhilesh Sanikop   // DCT (2) = Total (7).
436*09537850SAkhilesh Sanikop   kTransformSetIntra1,
437*09537850SAkhilesh Sanikop   // 2D-DCT and 2D-ADST without flip (4) + Identity (1) = Total (5).
438*09537850SAkhilesh Sanikop   kTransformSetIntra2,
439*09537850SAkhilesh Sanikop   // All transforms = Total (16).
440*09537850SAkhilesh Sanikop   kTransformSetInter1,
441*09537850SAkhilesh Sanikop   // 2D-DCT and 2D-ADST with flip (9) + Identity (1) + 1D Horizontal/Vertical
442*09537850SAkhilesh Sanikop   // DCT (2) = Total (12).
443*09537850SAkhilesh Sanikop   kTransformSetInter2,
444*09537850SAkhilesh Sanikop   // DCT (1) + Identity (1) = Total (2).
445*09537850SAkhilesh Sanikop   kTransformSetInter3,
446*09537850SAkhilesh Sanikop   kNumTransformSets
447*09537850SAkhilesh Sanikop };
448*09537850SAkhilesh Sanikop 
449*09537850SAkhilesh Sanikop enum TransformClass : uint8_t {
450*09537850SAkhilesh Sanikop   kTransformClass2D,
451*09537850SAkhilesh Sanikop   kTransformClassHorizontal,
452*09537850SAkhilesh Sanikop   kTransformClassVertical,
453*09537850SAkhilesh Sanikop   kNumTransformClasses
454*09537850SAkhilesh Sanikop };
455*09537850SAkhilesh Sanikop 
456*09537850SAkhilesh Sanikop enum FilterIntraPredictor : uint8_t {
457*09537850SAkhilesh Sanikop   kFilterIntraPredictorDc,
458*09537850SAkhilesh Sanikop   kFilterIntraPredictorVertical,
459*09537850SAkhilesh Sanikop   kFilterIntraPredictorHorizontal,
460*09537850SAkhilesh Sanikop   kFilterIntraPredictorD157,
461*09537850SAkhilesh Sanikop   kFilterIntraPredictorPaeth,
462*09537850SAkhilesh Sanikop   kNumFilterIntraPredictors
463*09537850SAkhilesh Sanikop };
464*09537850SAkhilesh Sanikop 
465*09537850SAkhilesh Sanikop enum ObmcDirection : uint8_t {
466*09537850SAkhilesh Sanikop   kObmcDirectionVertical,
467*09537850SAkhilesh Sanikop   kObmcDirectionHorizontal,
468*09537850SAkhilesh Sanikop   kNumObmcDirections
469*09537850SAkhilesh Sanikop };
470*09537850SAkhilesh Sanikop 
471*09537850SAkhilesh Sanikop // In AV1 the name of the filter refers to the direction of filter application.
472*09537850SAkhilesh Sanikop // Horizontal refers to the column edge and vertical the row edge.
473*09537850SAkhilesh Sanikop enum LoopFilterType : uint8_t {
474*09537850SAkhilesh Sanikop   kLoopFilterTypeVertical,
475*09537850SAkhilesh Sanikop   kLoopFilterTypeHorizontal,
476*09537850SAkhilesh Sanikop   kNumLoopFilterTypes
477*09537850SAkhilesh Sanikop };
478*09537850SAkhilesh Sanikop 
479*09537850SAkhilesh Sanikop enum LoopFilterTransformSizeId : uint8_t {
480*09537850SAkhilesh Sanikop   kLoopFilterTransformSizeId4x4,
481*09537850SAkhilesh Sanikop   kLoopFilterTransformSizeId8x8,
482*09537850SAkhilesh Sanikop   kLoopFilterTransformSizeId16x16,
483*09537850SAkhilesh Sanikop   kNumLoopFilterTransformSizeIds
484*09537850SAkhilesh Sanikop };
485*09537850SAkhilesh Sanikop 
486*09537850SAkhilesh Sanikop enum LoopRestorationType : uint8_t {
487*09537850SAkhilesh Sanikop   kLoopRestorationTypeNone,
488*09537850SAkhilesh Sanikop   kLoopRestorationTypeSwitchable,
489*09537850SAkhilesh Sanikop   kLoopRestorationTypeWiener,
490*09537850SAkhilesh Sanikop   kLoopRestorationTypeSgrProj,  // self guided projection filter.
491*09537850SAkhilesh Sanikop   kNumLoopRestorationTypes
492*09537850SAkhilesh Sanikop };
493*09537850SAkhilesh Sanikop 
494*09537850SAkhilesh Sanikop enum CompoundReferenceType : uint8_t {
495*09537850SAkhilesh Sanikop   kCompoundReferenceUnidirectional,
496*09537850SAkhilesh Sanikop   kCompoundReferenceBidirectional,
497*09537850SAkhilesh Sanikop   kNumCompoundReferenceTypes
498*09537850SAkhilesh Sanikop };
499*09537850SAkhilesh Sanikop 
500*09537850SAkhilesh Sanikop enum CompoundPredictionType : uint8_t {
501*09537850SAkhilesh Sanikop   kCompoundPredictionTypeWedge,
502*09537850SAkhilesh Sanikop   kCompoundPredictionTypeDiffWeighted,
503*09537850SAkhilesh Sanikop   kCompoundPredictionTypeAverage,
504*09537850SAkhilesh Sanikop   kCompoundPredictionTypeIntra,
505*09537850SAkhilesh Sanikop   kCompoundPredictionTypeDistance,
506*09537850SAkhilesh Sanikop   kNumCompoundPredictionTypes,
507*09537850SAkhilesh Sanikop   // Number of compound prediction types that are explicitly signaled in the
508*09537850SAkhilesh Sanikop   // bitstream (in the compound_type syntax element).
509*09537850SAkhilesh Sanikop   kNumExplicitCompoundPredictionTypes = 2
510*09537850SAkhilesh Sanikop };
511*09537850SAkhilesh Sanikop 
512*09537850SAkhilesh Sanikop enum InterpolationFilter : uint8_t {
513*09537850SAkhilesh Sanikop   kInterpolationFilterEightTap,
514*09537850SAkhilesh Sanikop   kInterpolationFilterEightTapSmooth,
515*09537850SAkhilesh Sanikop   kInterpolationFilterEightTapSharp,
516*09537850SAkhilesh Sanikop   kInterpolationFilterBilinear,
517*09537850SAkhilesh Sanikop   kInterpolationFilterSwitchable,
518*09537850SAkhilesh Sanikop   kNumInterpolationFilters,
519*09537850SAkhilesh Sanikop   // Number of interpolation filters that can be explicitly signaled in the
520*09537850SAkhilesh Sanikop   // compressed headers (when the uncompressed headers allow switchable
521*09537850SAkhilesh Sanikop   // interpolation filters) of the bitstream.
522*09537850SAkhilesh Sanikop   kNumExplicitInterpolationFilters = EnumRangeLength(
523*09537850SAkhilesh Sanikop       kInterpolationFilterEightTap, kInterpolationFilterEightTapSharp)
524*09537850SAkhilesh Sanikop };
525*09537850SAkhilesh Sanikop 
526*09537850SAkhilesh Sanikop enum MvJointType : uint8_t {
527*09537850SAkhilesh Sanikop   kMvJointTypeZero,
528*09537850SAkhilesh Sanikop   kMvJointTypeHorizontalNonZeroVerticalZero,
529*09537850SAkhilesh Sanikop   kMvJointTypeHorizontalZeroVerticalNonZero,
530*09537850SAkhilesh Sanikop   kMvJointTypeNonZero,
531*09537850SAkhilesh Sanikop   kNumMvJointTypes
532*09537850SAkhilesh Sanikop };
533*09537850SAkhilesh Sanikop 
534*09537850SAkhilesh Sanikop enum ObuType : int8_t {
535*09537850SAkhilesh Sanikop   kObuInvalid = -1,
536*09537850SAkhilesh Sanikop   kObuSequenceHeader = 1,
537*09537850SAkhilesh Sanikop   kObuTemporalDelimiter = 2,
538*09537850SAkhilesh Sanikop   kObuFrameHeader = 3,
539*09537850SAkhilesh Sanikop   kObuTileGroup = 4,
540*09537850SAkhilesh Sanikop   kObuMetadata = 5,
541*09537850SAkhilesh Sanikop   kObuFrame = 6,
542*09537850SAkhilesh Sanikop   kObuRedundantFrameHeader = 7,
543*09537850SAkhilesh Sanikop   kObuTileList = 8,
544*09537850SAkhilesh Sanikop   kObuPadding = 15,
545*09537850SAkhilesh Sanikop };
546*09537850SAkhilesh Sanikop 
547*09537850SAkhilesh Sanikop constexpr BitMaskSet kPredictionModeSmoothMask(kPredictionModeSmooth,
548*09537850SAkhilesh Sanikop                                                kPredictionModeSmoothHorizontal,
549*09537850SAkhilesh Sanikop                                                kPredictionModeSmoothVertical);
550*09537850SAkhilesh Sanikop 
551*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
552*09537850SAkhilesh Sanikop // ToString()
553*09537850SAkhilesh Sanikop //
554*09537850SAkhilesh Sanikop // These functions are meant to be used only in debug logging and within tests.
555*09537850SAkhilesh Sanikop // They are defined inline to avoid including the strings in the release
556*09537850SAkhilesh Sanikop // library when logging is disabled; unreferenced functions will not be added to
557*09537850SAkhilesh Sanikop // any object file in that case.
558*09537850SAkhilesh Sanikop 
ToString(const BlockSize size)559*09537850SAkhilesh Sanikop inline const char* ToString(const BlockSize size) {
560*09537850SAkhilesh Sanikop   switch (size) {
561*09537850SAkhilesh Sanikop     case kBlock4x4:
562*09537850SAkhilesh Sanikop       return "kBlock4x4";
563*09537850SAkhilesh Sanikop     case kBlock4x8:
564*09537850SAkhilesh Sanikop       return "kBlock4x8";
565*09537850SAkhilesh Sanikop     case kBlock4x16:
566*09537850SAkhilesh Sanikop       return "kBlock4x16";
567*09537850SAkhilesh Sanikop     case kBlock8x4:
568*09537850SAkhilesh Sanikop       return "kBlock8x4";
569*09537850SAkhilesh Sanikop     case kBlock8x8:
570*09537850SAkhilesh Sanikop       return "kBlock8x8";
571*09537850SAkhilesh Sanikop     case kBlock8x16:
572*09537850SAkhilesh Sanikop       return "kBlock8x16";
573*09537850SAkhilesh Sanikop     case kBlock8x32:
574*09537850SAkhilesh Sanikop       return "kBlock8x32";
575*09537850SAkhilesh Sanikop     case kBlock16x4:
576*09537850SAkhilesh Sanikop       return "kBlock16x4";
577*09537850SAkhilesh Sanikop     case kBlock16x8:
578*09537850SAkhilesh Sanikop       return "kBlock16x8";
579*09537850SAkhilesh Sanikop     case kBlock16x16:
580*09537850SAkhilesh Sanikop       return "kBlock16x16";
581*09537850SAkhilesh Sanikop     case kBlock16x32:
582*09537850SAkhilesh Sanikop       return "kBlock16x32";
583*09537850SAkhilesh Sanikop     case kBlock16x64:
584*09537850SAkhilesh Sanikop       return "kBlock16x64";
585*09537850SAkhilesh Sanikop     case kBlock32x8:
586*09537850SAkhilesh Sanikop       return "kBlock32x8";
587*09537850SAkhilesh Sanikop     case kBlock32x16:
588*09537850SAkhilesh Sanikop       return "kBlock32x16";
589*09537850SAkhilesh Sanikop     case kBlock32x32:
590*09537850SAkhilesh Sanikop       return "kBlock32x32";
591*09537850SAkhilesh Sanikop     case kBlock32x64:
592*09537850SAkhilesh Sanikop       return "kBlock32x64";
593*09537850SAkhilesh Sanikop     case kBlock64x16:
594*09537850SAkhilesh Sanikop       return "kBlock64x16";
595*09537850SAkhilesh Sanikop     case kBlock64x32:
596*09537850SAkhilesh Sanikop       return "kBlock64x32";
597*09537850SAkhilesh Sanikop     case kBlock64x64:
598*09537850SAkhilesh Sanikop       return "kBlock64x64";
599*09537850SAkhilesh Sanikop     case kBlock64x128:
600*09537850SAkhilesh Sanikop       return "kBlock64x128";
601*09537850SAkhilesh Sanikop     case kBlock128x64:
602*09537850SAkhilesh Sanikop       return "kBlock128x64";
603*09537850SAkhilesh Sanikop     case kBlock128x128:
604*09537850SAkhilesh Sanikop       return "kBlock128x128";
605*09537850SAkhilesh Sanikop     case kMaxBlockSizes:
606*09537850SAkhilesh Sanikop       return "kMaxBlockSizes";
607*09537850SAkhilesh Sanikop     case kBlockInvalid:
608*09537850SAkhilesh Sanikop       return "kBlockInvalid";
609*09537850SAkhilesh Sanikop   }
610*09537850SAkhilesh Sanikop   abort();
611*09537850SAkhilesh Sanikop }
612*09537850SAkhilesh Sanikop 
ToString(const InterIntraMode mode)613*09537850SAkhilesh Sanikop inline const char* ToString(const InterIntraMode mode) {
614*09537850SAkhilesh Sanikop   switch (mode) {
615*09537850SAkhilesh Sanikop     case kInterIntraModeDc:
616*09537850SAkhilesh Sanikop       return "kInterIntraModeDc";
617*09537850SAkhilesh Sanikop     case kInterIntraModeVertical:
618*09537850SAkhilesh Sanikop       return "kInterIntraModeVertical";
619*09537850SAkhilesh Sanikop     case kInterIntraModeHorizontal:
620*09537850SAkhilesh Sanikop       return "kInterIntraModeHorizontal";
621*09537850SAkhilesh Sanikop     case kInterIntraModeSmooth:
622*09537850SAkhilesh Sanikop       return "kInterIntraModeSmooth";
623*09537850SAkhilesh Sanikop     case kNumInterIntraModes:
624*09537850SAkhilesh Sanikop       return "kNumInterIntraModes";
625*09537850SAkhilesh Sanikop   }
626*09537850SAkhilesh Sanikop   abort();
627*09537850SAkhilesh Sanikop }
628*09537850SAkhilesh Sanikop 
ToString(const ObmcDirection direction)629*09537850SAkhilesh Sanikop inline const char* ToString(const ObmcDirection direction) {
630*09537850SAkhilesh Sanikop   switch (direction) {
631*09537850SAkhilesh Sanikop     case kObmcDirectionVertical:
632*09537850SAkhilesh Sanikop       return "kObmcDirectionVertical";
633*09537850SAkhilesh Sanikop     case kObmcDirectionHorizontal:
634*09537850SAkhilesh Sanikop       return "kObmcDirectionHorizontal";
635*09537850SAkhilesh Sanikop     case kNumObmcDirections:
636*09537850SAkhilesh Sanikop       return "kNumObmcDirections";
637*09537850SAkhilesh Sanikop   }
638*09537850SAkhilesh Sanikop   abort();
639*09537850SAkhilesh Sanikop }
640*09537850SAkhilesh Sanikop 
ToString(const LoopRestorationType type)641*09537850SAkhilesh Sanikop inline const char* ToString(const LoopRestorationType type) {
642*09537850SAkhilesh Sanikop   switch (type) {
643*09537850SAkhilesh Sanikop     case kLoopRestorationTypeNone:
644*09537850SAkhilesh Sanikop       return "kLoopRestorationTypeNone";
645*09537850SAkhilesh Sanikop     case kLoopRestorationTypeSwitchable:
646*09537850SAkhilesh Sanikop       return "kLoopRestorationTypeSwitchable";
647*09537850SAkhilesh Sanikop     case kLoopRestorationTypeWiener:
648*09537850SAkhilesh Sanikop       return "kLoopRestorationTypeWiener";
649*09537850SAkhilesh Sanikop     case kLoopRestorationTypeSgrProj:
650*09537850SAkhilesh Sanikop       return "kLoopRestorationTypeSgrProj";
651*09537850SAkhilesh Sanikop     case kNumLoopRestorationTypes:
652*09537850SAkhilesh Sanikop       return "kNumLoopRestorationTypes";
653*09537850SAkhilesh Sanikop   }
654*09537850SAkhilesh Sanikop   abort();
655*09537850SAkhilesh Sanikop }
656*09537850SAkhilesh Sanikop 
ToString(const TransformSize size)657*09537850SAkhilesh Sanikop inline const char* ToString(const TransformSize size) {
658*09537850SAkhilesh Sanikop   switch (size) {
659*09537850SAkhilesh Sanikop     case kTransformSize4x4:
660*09537850SAkhilesh Sanikop       return "kTransformSize4x4";
661*09537850SAkhilesh Sanikop     case kTransformSize4x8:
662*09537850SAkhilesh Sanikop       return "kTransformSize4x8";
663*09537850SAkhilesh Sanikop     case kTransformSize4x16:
664*09537850SAkhilesh Sanikop       return "kTransformSize4x16";
665*09537850SAkhilesh Sanikop     case kTransformSize8x4:
666*09537850SAkhilesh Sanikop       return "kTransformSize8x4";
667*09537850SAkhilesh Sanikop     case kTransformSize8x8:
668*09537850SAkhilesh Sanikop       return "kTransformSize8x8";
669*09537850SAkhilesh Sanikop     case kTransformSize8x16:
670*09537850SAkhilesh Sanikop       return "kTransformSize8x16";
671*09537850SAkhilesh Sanikop     case kTransformSize8x32:
672*09537850SAkhilesh Sanikop       return "kTransformSize8x32";
673*09537850SAkhilesh Sanikop     case kTransformSize16x4:
674*09537850SAkhilesh Sanikop       return "kTransformSize16x4";
675*09537850SAkhilesh Sanikop     case kTransformSize16x8:
676*09537850SAkhilesh Sanikop       return "kTransformSize16x8";
677*09537850SAkhilesh Sanikop     case kTransformSize16x16:
678*09537850SAkhilesh Sanikop       return "kTransformSize16x16";
679*09537850SAkhilesh Sanikop     case kTransformSize16x32:
680*09537850SAkhilesh Sanikop       return "kTransformSize16x32";
681*09537850SAkhilesh Sanikop     case kTransformSize16x64:
682*09537850SAkhilesh Sanikop       return "kTransformSize16x64";
683*09537850SAkhilesh Sanikop     case kTransformSize32x8:
684*09537850SAkhilesh Sanikop       return "kTransformSize32x8";
685*09537850SAkhilesh Sanikop     case kTransformSize32x16:
686*09537850SAkhilesh Sanikop       return "kTransformSize32x16";
687*09537850SAkhilesh Sanikop     case kTransformSize32x32:
688*09537850SAkhilesh Sanikop       return "kTransformSize32x32";
689*09537850SAkhilesh Sanikop     case kTransformSize32x64:
690*09537850SAkhilesh Sanikop       return "kTransformSize32x64";
691*09537850SAkhilesh Sanikop     case kTransformSize64x16:
692*09537850SAkhilesh Sanikop       return "kTransformSize64x16";
693*09537850SAkhilesh Sanikop     case kTransformSize64x32:
694*09537850SAkhilesh Sanikop       return "kTransformSize64x32";
695*09537850SAkhilesh Sanikop     case kTransformSize64x64:
696*09537850SAkhilesh Sanikop       return "kTransformSize64x64";
697*09537850SAkhilesh Sanikop     case kNumTransformSizes:
698*09537850SAkhilesh Sanikop       return "kNumTransformSizes";
699*09537850SAkhilesh Sanikop   }
700*09537850SAkhilesh Sanikop   abort();
701*09537850SAkhilesh Sanikop }
702*09537850SAkhilesh Sanikop 
ToString(const TransformType type)703*09537850SAkhilesh Sanikop inline const char* ToString(const TransformType type) {
704*09537850SAkhilesh Sanikop   switch (type) {
705*09537850SAkhilesh Sanikop     case kTransformTypeDctDct:
706*09537850SAkhilesh Sanikop       return "kTransformTypeDctDct";
707*09537850SAkhilesh Sanikop     case kTransformTypeAdstDct:
708*09537850SAkhilesh Sanikop       return "kTransformTypeAdstDct";
709*09537850SAkhilesh Sanikop     case kTransformTypeDctAdst:
710*09537850SAkhilesh Sanikop       return "kTransformTypeDctAdst";
711*09537850SAkhilesh Sanikop     case kTransformTypeAdstAdst:
712*09537850SAkhilesh Sanikop       return "kTransformTypeAdstAdst";
713*09537850SAkhilesh Sanikop     case kTransformTypeFlipadstDct:
714*09537850SAkhilesh Sanikop       return "kTransformTypeFlipadstDct";
715*09537850SAkhilesh Sanikop     case kTransformTypeDctFlipadst:
716*09537850SAkhilesh Sanikop       return "kTransformTypeDctFlipadst";
717*09537850SAkhilesh Sanikop     case kTransformTypeFlipadstFlipadst:
718*09537850SAkhilesh Sanikop       return "kTransformTypeFlipadstFlipadst";
719*09537850SAkhilesh Sanikop     case kTransformTypeAdstFlipadst:
720*09537850SAkhilesh Sanikop       return "kTransformTypeAdstFlipadst";
721*09537850SAkhilesh Sanikop     case kTransformTypeFlipadstAdst:
722*09537850SAkhilesh Sanikop       return "kTransformTypeFlipadstAdst";
723*09537850SAkhilesh Sanikop     case kTransformTypeIdentityIdentity:
724*09537850SAkhilesh Sanikop       return "kTransformTypeIdentityIdentity";
725*09537850SAkhilesh Sanikop     case kTransformTypeIdentityDct:
726*09537850SAkhilesh Sanikop       return "kTransformTypeIdentityDct";
727*09537850SAkhilesh Sanikop     case kTransformTypeDctIdentity:
728*09537850SAkhilesh Sanikop       return "kTransformTypeDctIdentity";
729*09537850SAkhilesh Sanikop     case kTransformTypeIdentityAdst:
730*09537850SAkhilesh Sanikop       return "kTransformTypeIdentityAdst";
731*09537850SAkhilesh Sanikop     case kTransformTypeAdstIdentity:
732*09537850SAkhilesh Sanikop       return "kTransformTypeAdstIdentity";
733*09537850SAkhilesh Sanikop     case kTransformTypeIdentityFlipadst:
734*09537850SAkhilesh Sanikop       return "kTransformTypeIdentityFlipadst";
735*09537850SAkhilesh Sanikop     case kTransformTypeFlipadstIdentity:
736*09537850SAkhilesh Sanikop       return "kTransformTypeFlipadstIdentity";
737*09537850SAkhilesh Sanikop     // case to quiet compiler
738*09537850SAkhilesh Sanikop     case kNumTransformTypes:
739*09537850SAkhilesh Sanikop       return "kNumTransformTypes";
740*09537850SAkhilesh Sanikop   }
741*09537850SAkhilesh Sanikop   abort();
742*09537850SAkhilesh Sanikop }
743*09537850SAkhilesh Sanikop 
744*09537850SAkhilesh Sanikop //------------------------------------------------------------------------------
745*09537850SAkhilesh Sanikop 
746*09537850SAkhilesh Sanikop extern const uint8_t k4x4WidthLog2[kMaxBlockSizes];
747*09537850SAkhilesh Sanikop 
748*09537850SAkhilesh Sanikop extern const uint8_t k4x4HeightLog2[kMaxBlockSizes];
749*09537850SAkhilesh Sanikop 
750*09537850SAkhilesh Sanikop extern const uint8_t kNum4x4BlocksWide[kMaxBlockSizes];
751*09537850SAkhilesh Sanikop 
752*09537850SAkhilesh Sanikop extern const uint8_t kNum4x4BlocksHigh[kMaxBlockSizes];
753*09537850SAkhilesh Sanikop 
754*09537850SAkhilesh Sanikop extern const uint8_t kBlockWidthPixels[kMaxBlockSizes];
755*09537850SAkhilesh Sanikop 
756*09537850SAkhilesh Sanikop extern const uint8_t kBlockHeightPixels[kMaxBlockSizes];
757*09537850SAkhilesh Sanikop 
758*09537850SAkhilesh Sanikop extern const BlockSize kSubSize[kMaxPartitionTypes][kMaxBlockSizes];
759*09537850SAkhilesh Sanikop 
760*09537850SAkhilesh Sanikop extern const BlockSize kPlaneResidualSize[kMaxBlockSizes][2][2];
761*09537850SAkhilesh Sanikop 
762*09537850SAkhilesh Sanikop extern const int16_t kProjectionMvDivisionLookup[kMaxFrameDistance + 1];
763*09537850SAkhilesh Sanikop 
764*09537850SAkhilesh Sanikop extern const uint8_t kTransformWidth[kNumTransformSizes];
765*09537850SAkhilesh Sanikop 
766*09537850SAkhilesh Sanikop extern const uint8_t kTransformHeight[kNumTransformSizes];
767*09537850SAkhilesh Sanikop 
768*09537850SAkhilesh Sanikop extern const uint8_t kTransformWidth4x4[kNumTransformSizes];
769*09537850SAkhilesh Sanikop 
770*09537850SAkhilesh Sanikop extern const uint8_t kTransformHeight4x4[kNumTransformSizes];
771*09537850SAkhilesh Sanikop 
772*09537850SAkhilesh Sanikop extern const uint8_t kTransformWidthLog2[kNumTransformSizes];
773*09537850SAkhilesh Sanikop 
774*09537850SAkhilesh Sanikop extern const uint8_t kTransformHeightLog2[kNumTransformSizes];
775*09537850SAkhilesh Sanikop 
776*09537850SAkhilesh Sanikop extern const TransformSize kSplitTransformSize[kNumTransformSizes];
777*09537850SAkhilesh Sanikop 
778*09537850SAkhilesh Sanikop // Square transform of size min(w,h).
779*09537850SAkhilesh Sanikop extern const TransformSize kTransformSizeSquareMin[kNumTransformSizes];
780*09537850SAkhilesh Sanikop 
781*09537850SAkhilesh Sanikop // Square transform of size max(w,h).
782*09537850SAkhilesh Sanikop extern const TransformSize kTransformSizeSquareMax[kNumTransformSizes];
783*09537850SAkhilesh Sanikop 
784*09537850SAkhilesh Sanikop extern const uint8_t kNumTransformTypesInSet[kNumTransformSets];
785*09537850SAkhilesh Sanikop 
786*09537850SAkhilesh Sanikop extern const uint8_t kSgrProjParams[1 << kSgrProjParamsBits][4];
787*09537850SAkhilesh Sanikop 
788*09537850SAkhilesh Sanikop extern const int8_t kSgrProjMultiplierMin[2];
789*09537850SAkhilesh Sanikop 
790*09537850SAkhilesh Sanikop extern const int8_t kSgrProjMultiplierMax[2];
791*09537850SAkhilesh Sanikop 
792*09537850SAkhilesh Sanikop extern const int8_t kWienerTapsMin[3];
793*09537850SAkhilesh Sanikop 
794*09537850SAkhilesh Sanikop extern const int8_t kWienerTapsMax[3];
795*09537850SAkhilesh Sanikop 
796*09537850SAkhilesh Sanikop extern const uint8_t kUpscaleFilterUnsigned[kSuperResFilterShifts]
797*09537850SAkhilesh Sanikop                                            [kSuperResFilterTaps];
798*09537850SAkhilesh Sanikop 
799*09537850SAkhilesh Sanikop // An int8_t version of the kWarpedFilters array.
800*09537850SAkhilesh Sanikop // Note: The array could be removed with a performance penalty.
801*09537850SAkhilesh Sanikop extern const int8_t kWarpedFilters8[3 * kWarpedPixelPrecisionShifts + 1][8];
802*09537850SAkhilesh Sanikop 
803*09537850SAkhilesh Sanikop extern const int16_t kWarpedFilters[3 * kWarpedPixelPrecisionShifts + 1][8];
804*09537850SAkhilesh Sanikop 
805*09537850SAkhilesh Sanikop extern const int8_t kHalfSubPixelFilters[6][16][8];
806*09537850SAkhilesh Sanikop 
807*09537850SAkhilesh Sanikop extern const uint8_t kAbsHalfSubPixelFilters[6][16][8];
808*09537850SAkhilesh Sanikop 
809*09537850SAkhilesh Sanikop extern const int16_t kDirectionalIntraPredictorDerivative[44];
810*09537850SAkhilesh Sanikop 
811*09537850SAkhilesh Sanikop extern const uint8_t kDeblockFilterLevelIndex[kMaxPlanes][kNumLoopFilterTypes];
812*09537850SAkhilesh Sanikop 
813*09537850SAkhilesh Sanikop }  // namespace libgav1
814*09537850SAkhilesh Sanikop 
815*09537850SAkhilesh Sanikop #endif  // LIBGAV1_SRC_UTILS_CONSTANTS_H_
816