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