• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/utils/constants.h"
16 
17 #include <cstdint>
18 
19 namespace libgav1 {
20 
21 const uint8_t k4x4WidthLog2[kMaxBlockSizes] = {0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
22                                                2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5};
23 
24 const uint8_t k4x4HeightLog2[kMaxBlockSizes] = {
25     0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4, 5, 4, 5};
26 
27 const uint8_t kNum4x4BlocksWide[kMaxBlockSizes] = {
28     1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 32, 32};
29 
30 const uint8_t kNum4x4BlocksHigh[kMaxBlockSizes] = {
31     1, 2, 4, 1, 2, 4, 8, 1, 2, 4, 8, 16, 2, 4, 8, 16, 4, 8, 16, 32, 16, 32};
32 
33 const uint8_t kBlockWidthPixels[kMaxBlockSizes] = {
34     4,  4,  4,  8,  8,  8,  8,  16, 16, 16,  16,
35     16, 32, 32, 32, 32, 64, 64, 64, 64, 128, 128};
36 
37 const uint8_t kBlockHeightPixels[kMaxBlockSizes] = {
38     4,  8, 16, 4,  8,  16, 32, 4,  8,   16, 32,
39     64, 8, 16, 32, 64, 16, 32, 64, 128, 64, 128};
40 
41 // 9.3 -- Partition_Subsize[]
42 const BlockSize kSubSize[kMaxPartitionTypes][kMaxBlockSizes] = {
43     // kPartitionNone
44     {kBlock4x4,     kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x8,
45      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x16,
46      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x32,
47      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x64,   kBlockInvalid,
48      kBlockInvalid, kBlock128x128},
49     // kPartitionHorizontal
50     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4,
51      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8,
52      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16,
53      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32,   kBlockInvalid,
54      kBlockInvalid, kBlock128x64},
55     // kPartitionVertical
56     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8,
57      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16,
58      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32,
59      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64,   kBlockInvalid,
60      kBlockInvalid, kBlock64x128},
61     // kPartitionSplit
62     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x4,
63      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x8,
64      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x16,
65      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x32,   kBlockInvalid,
66      kBlockInvalid, kBlock64x64},
67     // kPartitionHorizontalWithTopSplit
68     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4,
69      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8,
70      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16,
71      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32,   kBlockInvalid,
72      kBlockInvalid, kBlock128x64},
73     // kPartitionHorizontalWithBottomSplit
74     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4,
75      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8,
76      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16,
77      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32,   kBlockInvalid,
78      kBlockInvalid, kBlock128x64},
79     // kPartitionVerticalWithLeftSplit
80     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8,
81      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16,
82      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32,
83      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64,   kBlockInvalid,
84      kBlockInvalid, kBlock64x128},
85     // kPartitionVerticalWithRightSplit
86     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8,
87      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16,
88      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32,
89      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64,   kBlockInvalid,
90      kBlockInvalid, kBlock64x128},
91     // kPartitionHorizontal4
92     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid,
93      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x4,
94      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x8,
95      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x16,   kBlockInvalid,
96      kBlockInvalid, kBlockInvalid},
97     // kPartitionVertical4
98     {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid,
99      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x16,
100      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x32,
101      kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x64,   kBlockInvalid,
102      kBlockInvalid, kBlockInvalid}};
103 
104 // 5.11.38 (implemented as a simple look up. first dimension is block size,
105 // second and third are subsampling_x and subsampling_y).
106 const BlockSize kPlaneResidualSize[kMaxBlockSizes][2][2] = {
107     {{kBlock4x4, kBlock4x4}, {kBlock4x4, kBlock4x4}},
108     {{kBlock4x8, kBlock4x4}, {kBlockInvalid, kBlock4x4}},
109     {{kBlock4x16, kBlock4x8}, {kBlockInvalid, kBlock4x8}},
110     {{kBlock8x4, kBlockInvalid}, {kBlock4x4, kBlock4x4}},
111     {{kBlock8x8, kBlock8x4}, {kBlock4x8, kBlock4x4}},
112     {{kBlock8x16, kBlock8x8}, {kBlockInvalid, kBlock4x8}},
113     {{kBlock8x32, kBlock8x16}, {kBlockInvalid, kBlock4x16}},
114     {{kBlock16x4, kBlockInvalid}, {kBlock8x4, kBlock8x4}},
115     {{kBlock16x8, kBlockInvalid}, {kBlock8x8, kBlock8x4}},
116     {{kBlock16x16, kBlock16x8}, {kBlock8x16, kBlock8x8}},
117     {{kBlock16x32, kBlock16x16}, {kBlockInvalid, kBlock8x16}},
118     {{kBlock16x64, kBlock16x32}, {kBlockInvalid, kBlock8x32}},
119     {{kBlock32x8, kBlockInvalid}, {kBlock16x8, kBlock16x4}},
120     {{kBlock32x16, kBlockInvalid}, {kBlock16x16, kBlock16x8}},
121     {{kBlock32x32, kBlock32x16}, {kBlock16x32, kBlock16x16}},
122     {{kBlock32x64, kBlock32x32}, {kBlockInvalid, kBlock16x32}},
123     {{kBlock64x16, kBlockInvalid}, {kBlock32x16, kBlock32x8}},
124     {{kBlock64x32, kBlockInvalid}, {kBlock32x32, kBlock32x16}},
125     {{kBlock64x64, kBlock64x32}, {kBlock32x64, kBlock32x32}},
126     {{kBlock64x128, kBlock64x64}, {kBlockInvalid, kBlock32x64}},
127     {{kBlock128x64, kBlockInvalid}, {kBlock64x64, kBlock64x32}},
128     {{kBlock128x128, kBlock128x64}, {kBlock64x128, kBlock64x64}}};
129 
130 const int16_t kProjectionMvDivisionLookup[kMaxFrameDistance + 1] = {
131     0,    16384, 8192, 5461, 4096, 3276, 2730, 2340, 2048, 1820, 1638,
132     1489, 1365,  1260, 1170, 1092, 1024, 963,  910,  862,  819,  780,
133     744,  712,   682,  655,  630,  606,  585,  564,  546,  528};
134 
135 const uint8_t kTransformWidth[kNumTransformSizes] = {
136     4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 32, 32, 32, 32, 64, 64, 64};
137 
138 const uint8_t kTransformHeight[kNumTransformSizes] = {
139     4, 8, 16, 4, 8, 16, 32, 4, 8, 16, 32, 64, 8, 16, 32, 64, 16, 32, 64};
140 
141 const uint8_t kTransformWidth4x4[kNumTransformSizes] = {
142     1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 8, 16, 16, 16};
143 
144 const uint8_t kTransformHeight4x4[kNumTransformSizes] = {
145     1, 2, 4, 1, 2, 4, 8, 1, 2, 4, 8, 16, 2, 4, 8, 16, 4, 8, 16};
146 
147 const uint8_t kTransformWidthLog2[kNumTransformSizes] = {
148     2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6};
149 
150 const uint8_t kTransformHeightLog2[kNumTransformSizes] = {
151     2, 3, 4, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 4, 5, 6};
152 
153 // 9.3 -- Split_Tx_Size[]
154 const TransformSize kSplitTransformSize[kNumTransformSizes] = {
155     kTransformSize4x4,   kTransformSize4x4,   kTransformSize4x8,
156     kTransformSize4x4,   kTransformSize4x4,   kTransformSize8x8,
157     kTransformSize8x16,  kTransformSize8x4,   kTransformSize8x8,
158     kTransformSize8x8,   kTransformSize16x16, kTransformSize16x32,
159     kTransformSize16x8,  kTransformSize16x16, kTransformSize16x16,
160     kTransformSize32x32, kTransformSize32x16, kTransformSize32x32,
161     kTransformSize32x32};
162 
163 // Square transform of size min(w,h).
164 const TransformSize kTransformSizeSquareMin[kNumTransformSizes] = {
165     kTransformSize4x4,   kTransformSize4x4,   kTransformSize4x4,
166     kTransformSize4x4,   kTransformSize8x8,   kTransformSize8x8,
167     kTransformSize8x8,   kTransformSize4x4,   kTransformSize8x8,
168     kTransformSize16x16, kTransformSize16x16, kTransformSize16x16,
169     kTransformSize8x8,   kTransformSize16x16, kTransformSize32x32,
170     kTransformSize32x32, kTransformSize16x16, kTransformSize32x32,
171     kTransformSize64x64};
172 
173 // Square transform of size max(w,h).
174 const TransformSize kTransformSizeSquareMax[kNumTransformSizes] = {
175     kTransformSize4x4,   kTransformSize8x8,   kTransformSize16x16,
176     kTransformSize8x8,   kTransformSize8x8,   kTransformSize16x16,
177     kTransformSize32x32, kTransformSize16x16, kTransformSize16x16,
178     kTransformSize16x16, kTransformSize32x32, kTransformSize64x64,
179     kTransformSize32x32, kTransformSize32x32, kTransformSize32x32,
180     kTransformSize64x64, kTransformSize64x64, kTransformSize64x64,
181     kTransformSize64x64};
182 
183 const uint8_t kNumTransformTypesInSet[kNumTransformSets] = {1, 7, 5, 16, 12, 2};
184 
185 const uint8_t kSgrProjParams[1 << kSgrProjParamsBits][4] = {
186     {2, 12, 1, 4},  {2, 15, 1, 6},  {2, 18, 1, 8},  {2, 21, 1, 9},
187     {2, 24, 1, 10}, {2, 29, 1, 11}, {2, 36, 1, 12}, {2, 45, 1, 13},
188     {2, 56, 1, 14}, {2, 68, 1, 15}, {0, 0, 1, 5},   {0, 0, 1, 8},
189     {0, 0, 1, 11},  {0, 0, 1, 14},  {2, 30, 0, 0},  {2, 75, 0, 0}};
190 
191 const int8_t kSgrProjMultiplierMin[2] = {-96, -32};
192 
193 const int8_t kSgrProjMultiplierMax[2] = {31, 95};
194 
195 const int8_t kWienerTapsMin[3] = {-5, -23, -17};
196 
197 const int8_t kWienerTapsMax[3] = {10, 8, 46};
198 
199 // This was modified from Upscale_Filter as defined in AV1 Section 7.16, in
200 // order to support 16-bit packed NEON operations.
201 // The sign of each tap is: - + - + + - + -
202 alignas(16) const uint8_t
203     kUpscaleFilterUnsigned[kSuperResFilterShifts][kSuperResFilterTaps] = {
204         {0, 0, 0, 128, 0, 0, 0, 0},    {0, 0, 1, 128, 2, 1, 0, 0},
205         {0, 1, 3, 127, 4, 2, 1, 0},    {0, 1, 4, 127, 6, 3, 1, 0},
206         {0, 2, 6, 126, 8, 3, 1, 0},    {0, 2, 7, 125, 11, 4, 1, 0},
207         {1, 2, 8, 125, 13, 5, 2, 0},   {1, 3, 9, 124, 15, 6, 2, 0},
208         {1, 3, 10, 123, 18, 6, 2, 1},  {1, 3, 11, 122, 20, 7, 3, 1},
209         {1, 4, 12, 121, 22, 8, 3, 1},  {1, 4, 13, 120, 25, 9, 3, 1},
210         {1, 4, 14, 118, 28, 9, 3, 1},  {1, 4, 15, 117, 30, 10, 4, 1},
211         {1, 5, 16, 116, 32, 11, 4, 1}, {1, 5, 16, 114, 35, 12, 4, 1},
212         {1, 5, 17, 112, 38, 12, 4, 1}, {1, 5, 18, 111, 40, 13, 5, 1},
213         {1, 5, 18, 109, 43, 14, 5, 1}, {1, 6, 19, 107, 45, 14, 5, 1},
214         {1, 6, 19, 105, 48, 15, 5, 1}, {1, 6, 19, 103, 51, 16, 5, 1},
215         {1, 6, 20, 101, 53, 16, 6, 1}, {1, 6, 20, 99, 56, 17, 6, 1},
216         {1, 6, 20, 97, 58, 17, 6, 1},  {1, 6, 20, 95, 61, 18, 6, 1},
217         {2, 7, 20, 93, 64, 18, 6, 2},  {2, 7, 20, 91, 66, 19, 6, 1},
218         {2, 7, 20, 88, 69, 19, 6, 1},  {2, 7, 20, 86, 71, 19, 6, 1},
219         {2, 7, 20, 84, 74, 20, 7, 2},  {2, 7, 20, 81, 76, 20, 7, 1},
220         {2, 7, 20, 79, 79, 20, 7, 2},  {1, 7, 20, 76, 81, 20, 7, 2},
221         {2, 7, 20, 74, 84, 20, 7, 2},  {1, 6, 19, 71, 86, 20, 7, 2},
222         {1, 6, 19, 69, 88, 20, 7, 2},  {1, 6, 19, 66, 91, 20, 7, 2},
223         {2, 6, 18, 64, 93, 20, 7, 2},  {1, 6, 18, 61, 95, 20, 6, 1},
224         {1, 6, 17, 58, 97, 20, 6, 1},  {1, 6, 17, 56, 99, 20, 6, 1},
225         {1, 6, 16, 53, 101, 20, 6, 1}, {1, 5, 16, 51, 103, 19, 6, 1},
226         {1, 5, 15, 48, 105, 19, 6, 1}, {1, 5, 14, 45, 107, 19, 6, 1},
227         {1, 5, 14, 43, 109, 18, 5, 1}, {1, 5, 13, 40, 111, 18, 5, 1},
228         {1, 4, 12, 38, 112, 17, 5, 1}, {1, 4, 12, 35, 114, 16, 5, 1},
229         {1, 4, 11, 32, 116, 16, 5, 1}, {1, 4, 10, 30, 117, 15, 4, 1},
230         {1, 3, 9, 28, 118, 14, 4, 1},  {1, 3, 9, 25, 120, 13, 4, 1},
231         {1, 3, 8, 22, 121, 12, 4, 1},  {1, 3, 7, 20, 122, 11, 3, 1},
232         {1, 2, 6, 18, 123, 10, 3, 1},  {0, 2, 6, 15, 124, 9, 3, 1},
233         {0, 2, 5, 13, 125, 8, 2, 1},   {0, 1, 4, 11, 125, 7, 2, 0},
234         {0, 1, 3, 8, 126, 6, 2, 0},    {0, 1, 3, 6, 127, 4, 1, 0},
235         {0, 1, 2, 4, 127, 3, 1, 0},    {0, 0, 1, 2, 128, 1, 0, 0},
236 };
237 
238 alignas(8) const int8_t
239     kWarpedFilters8[3 * kWarpedPixelPrecisionShifts + 1][8] = {
240         // [-1, 0).
241         {0, 0, 127, 1, 0, 0, 0, 0},
242         {0, -1, 127, 2, 0, 0, 0, 0},
243         {1, -3, 127, 4, -1, 0, 0, 0},
244         {1, -4, 126, 6, -2, 1, 0, 0},
245         {1, -5, 126, 8, -3, 1, 0, 0},
246         {1, -6, 125, 11, -4, 1, 0, 0},
247         {1, -7, 124, 13, -4, 1, 0, 0},
248         {2, -8, 123, 15, -5, 1, 0, 0},
249         {2, -9, 122, 18, -6, 1, 0, 0},
250         {2, -10, 121, 20, -6, 1, 0, 0},
251         {2, -11, 120, 22, -7, 2, 0, 0},
252         {2, -12, 119, 25, -8, 2, 0, 0},
253         {3, -13, 117, 27, -8, 2, 0, 0},
254         {3, -13, 116, 29, -9, 2, 0, 0},
255         {3, -14, 114, 32, -10, 3, 0, 0},
256         {3, -15, 113, 35, -10, 2, 0, 0},
257         {3, -15, 111, 37, -11, 3, 0, 0},
258         {3, -16, 109, 40, -11, 3, 0, 0},
259         {3, -16, 108, 42, -12, 3, 0, 0},
260         {4, -17, 106, 45, -13, 3, 0, 0},
261         {4, -17, 104, 47, -13, 3, 0, 0},
262         {4, -17, 102, 50, -14, 3, 0, 0},
263         {4, -17, 100, 52, -14, 3, 0, 0},
264         {4, -18, 98, 55, -15, 4, 0, 0},
265         {4, -18, 96, 58, -15, 3, 0, 0},
266         {4, -18, 94, 60, -16, 4, 0, 0},
267         {4, -18, 91, 63, -16, 4, 0, 0},
268         {4, -18, 89, 65, -16, 4, 0, 0},
269         {4, -18, 87, 68, -17, 4, 0, 0},
270         {4, -18, 85, 70, -17, 4, 0, 0},
271         {4, -18, 82, 73, -17, 4, 0, 0},
272         {4, -18, 80, 75, -17, 4, 0, 0},
273         {4, -18, 78, 78, -18, 4, 0, 0},
274         {4, -17, 75, 80, -18, 4, 0, 0},
275         {4, -17, 73, 82, -18, 4, 0, 0},
276         {4, -17, 70, 85, -18, 4, 0, 0},
277         {4, -17, 68, 87, -18, 4, 0, 0},
278         {4, -16, 65, 89, -18, 4, 0, 0},
279         {4, -16, 63, 91, -18, 4, 0, 0},
280         {4, -16, 60, 94, -18, 4, 0, 0},
281         {3, -15, 58, 96, -18, 4, 0, 0},
282         {4, -15, 55, 98, -18, 4, 0, 0},
283         {3, -14, 52, 100, -17, 4, 0, 0},
284         {3, -14, 50, 102, -17, 4, 0, 0},
285         {3, -13, 47, 104, -17, 4, 0, 0},
286         {3, -13, 45, 106, -17, 4, 0, 0},
287         {3, -12, 42, 108, -16, 3, 0, 0},
288         {3, -11, 40, 109, -16, 3, 0, 0},
289         {3, -11, 37, 111, -15, 3, 0, 0},
290         {2, -10, 35, 113, -15, 3, 0, 0},
291         {3, -10, 32, 114, -14, 3, 0, 0},
292         {2, -9, 29, 116, -13, 3, 0, 0},
293         {2, -8, 27, 117, -13, 3, 0, 0},
294         {2, -8, 25, 119, -12, 2, 0, 0},
295         {2, -7, 22, 120, -11, 2, 0, 0},
296         {1, -6, 20, 121, -10, 2, 0, 0},
297         {1, -6, 18, 122, -9, 2, 0, 0},
298         {1, -5, 15, 123, -8, 2, 0, 0},
299         {1, -4, 13, 124, -7, 1, 0, 0},
300         {1, -4, 11, 125, -6, 1, 0, 0},
301         {1, -3, 8, 126, -5, 1, 0, 0},
302         {1, -2, 6, 126, -4, 1, 0, 0},
303         {0, -1, 4, 127, -3, 1, 0, 0},
304         {0, 0, 2, 127, -1, 0, 0, 0},
305         // [0, 1).
306         {0, 0, 0, 127, 1, 0, 0, 0},
307         {0, 0, -1, 127, 2, 0, 0, 0},
308         {0, 1, -3, 127, 4, -2, 1, 0},
309         {0, 1, -5, 127, 6, -2, 1, 0},
310         {0, 2, -6, 126, 8, -3, 1, 0},
311         {-1, 2, -7, 126, 11, -4, 2, -1},
312         {-1, 3, -8, 125, 13, -5, 2, -1},
313         {-1, 3, -10, 124, 16, -6, 3, -1},
314         {-1, 4, -11, 123, 18, -7, 3, -1},
315         {-1, 4, -12, 122, 20, -7, 3, -1},
316         {-1, 4, -13, 121, 23, -8, 3, -1},
317         {-2, 5, -14, 120, 25, -9, 4, -1},
318         {-1, 5, -15, 119, 27, -10, 4, -1},
319         {-1, 5, -16, 118, 30, -11, 4, -1},
320         {-2, 6, -17, 116, 33, -12, 5, -1},
321         {-2, 6, -17, 114, 35, -12, 5, -1},
322         {-2, 6, -18, 113, 38, -13, 5, -1},
323         {-2, 7, -19, 111, 41, -14, 6, -2},
324         {-2, 7, -19, 110, 43, -15, 6, -2},
325         {-2, 7, -20, 108, 46, -15, 6, -2},
326         {-2, 7, -20, 106, 49, -16, 6, -2},
327         {-2, 7, -21, 104, 51, -16, 7, -2},
328         {-2, 7, -21, 102, 54, -17, 7, -2},
329         {-2, 8, -21, 100, 56, -18, 7, -2},
330         {-2, 8, -22, 98, 59, -18, 7, -2},
331         {-2, 8, -22, 96, 62, -19, 7, -2},
332         {-2, 8, -22, 94, 64, -19, 7, -2},
333         {-2, 8, -22, 91, 67, -20, 8, -2},
334         {-2, 8, -22, 89, 69, -20, 8, -2},
335         {-2, 8, -22, 87, 72, -21, 8, -2},
336         {-2, 8, -21, 84, 74, -21, 8, -2},
337         {-2, 8, -22, 82, 77, -21, 8, -2},
338         {-2, 8, -21, 79, 79, -21, 8, -2},
339         {-2, 8, -21, 77, 82, -22, 8, -2},
340         {-2, 8, -21, 74, 84, -21, 8, -2},
341         {-2, 8, -21, 72, 87, -22, 8, -2},
342         {-2, 8, -20, 69, 89, -22, 8, -2},
343         {-2, 8, -20, 67, 91, -22, 8, -2},
344         {-2, 7, -19, 64, 94, -22, 8, -2},
345         {-2, 7, -19, 62, 96, -22, 8, -2},
346         {-2, 7, -18, 59, 98, -22, 8, -2},
347         {-2, 7, -18, 56, 100, -21, 8, -2},
348         {-2, 7, -17, 54, 102, -21, 7, -2},
349         {-2, 7, -16, 51, 104, -21, 7, -2},
350         {-2, 6, -16, 49, 106, -20, 7, -2},
351         {-2, 6, -15, 46, 108, -20, 7, -2},
352         {-2, 6, -15, 43, 110, -19, 7, -2},
353         {-2, 6, -14, 41, 111, -19, 7, -2},
354         {-1, 5, -13, 38, 113, -18, 6, -2},
355         {-1, 5, -12, 35, 114, -17, 6, -2},
356         {-1, 5, -12, 33, 116, -17, 6, -2},
357         {-1, 4, -11, 30, 118, -16, 5, -1},
358         {-1, 4, -10, 27, 119, -15, 5, -1},
359         {-1, 4, -9, 25, 120, -14, 5, -2},
360         {-1, 3, -8, 23, 121, -13, 4, -1},
361         {-1, 3, -7, 20, 122, -12, 4, -1},
362         {-1, 3, -7, 18, 123, -11, 4, -1},
363         {-1, 3, -6, 16, 124, -10, 3, -1},
364         {-1, 2, -5, 13, 125, -8, 3, -1},
365         {-1, 2, -4, 11, 126, -7, 2, -1},
366         {0, 1, -3, 8, 126, -6, 2, 0},
367         {0, 1, -2, 6, 127, -5, 1, 0},
368         {0, 1, -2, 4, 127, -3, 1, 0},
369         {0, 0, 0, 2, 127, -1, 0, 0},
370         // [1, 2).
371         {0, 0, 0, 1, 127, 0, 0, 0},
372         {0, 0, 0, -1, 127, 2, 0, 0},
373         {0, 0, 1, -3, 127, 4, -1, 0},
374         {0, 0, 1, -4, 126, 6, -2, 1},
375         {0, 0, 1, -5, 126, 8, -3, 1},
376         {0, 0, 1, -6, 125, 11, -4, 1},
377         {0, 0, 1, -7, 124, 13, -4, 1},
378         {0, 0, 2, -8, 123, 15, -5, 1},
379         {0, 0, 2, -9, 122, 18, -6, 1},
380         {0, 0, 2, -10, 121, 20, -6, 1},
381         {0, 0, 2, -11, 120, 22, -7, 2},
382         {0, 0, 2, -12, 119, 25, -8, 2},
383         {0, 0, 3, -13, 117, 27, -8, 2},
384         {0, 0, 3, -13, 116, 29, -9, 2},
385         {0, 0, 3, -14, 114, 32, -10, 3},
386         {0, 0, 3, -15, 113, 35, -10, 2},
387         {0, 0, 3, -15, 111, 37, -11, 3},
388         {0, 0, 3, -16, 109, 40, -11, 3},
389         {0, 0, 3, -16, 108, 42, -12, 3},
390         {0, 0, 4, -17, 106, 45, -13, 3},
391         {0, 0, 4, -17, 104, 47, -13, 3},
392         {0, 0, 4, -17, 102, 50, -14, 3},
393         {0, 0, 4, -17, 100, 52, -14, 3},
394         {0, 0, 4, -18, 98, 55, -15, 4},
395         {0, 0, 4, -18, 96, 58, -15, 3},
396         {0, 0, 4, -18, 94, 60, -16, 4},
397         {0, 0, 4, -18, 91, 63, -16, 4},
398         {0, 0, 4, -18, 89, 65, -16, 4},
399         {0, 0, 4, -18, 87, 68, -17, 4},
400         {0, 0, 4, -18, 85, 70, -17, 4},
401         {0, 0, 4, -18, 82, 73, -17, 4},
402         {0, 0, 4, -18, 80, 75, -17, 4},
403         {0, 0, 4, -18, 78, 78, -18, 4},
404         {0, 0, 4, -17, 75, 80, -18, 4},
405         {0, 0, 4, -17, 73, 82, -18, 4},
406         {0, 0, 4, -17, 70, 85, -18, 4},
407         {0, 0, 4, -17, 68, 87, -18, 4},
408         {0, 0, 4, -16, 65, 89, -18, 4},
409         {0, 0, 4, -16, 63, 91, -18, 4},
410         {0, 0, 4, -16, 60, 94, -18, 4},
411         {0, 0, 3, -15, 58, 96, -18, 4},
412         {0, 0, 4, -15, 55, 98, -18, 4},
413         {0, 0, 3, -14, 52, 100, -17, 4},
414         {0, 0, 3, -14, 50, 102, -17, 4},
415         {0, 0, 3, -13, 47, 104, -17, 4},
416         {0, 0, 3, -13, 45, 106, -17, 4},
417         {0, 0, 3, -12, 42, 108, -16, 3},
418         {0, 0, 3, -11, 40, 109, -16, 3},
419         {0, 0, 3, -11, 37, 111, -15, 3},
420         {0, 0, 2, -10, 35, 113, -15, 3},
421         {0, 0, 3, -10, 32, 114, -14, 3},
422         {0, 0, 2, -9, 29, 116, -13, 3},
423         {0, 0, 2, -8, 27, 117, -13, 3},
424         {0, 0, 2, -8, 25, 119, -12, 2},
425         {0, 0, 2, -7, 22, 120, -11, 2},
426         {0, 0, 1, -6, 20, 121, -10, 2},
427         {0, 0, 1, -6, 18, 122, -9, 2},
428         {0, 0, 1, -5, 15, 123, -8, 2},
429         {0, 0, 1, -4, 13, 124, -7, 1},
430         {0, 0, 1, -4, 11, 125, -6, 1},
431         {0, 0, 1, -3, 8, 126, -5, 1},
432         {0, 0, 1, -2, 6, 126, -4, 1},
433         {0, 0, 0, -1, 4, 127, -3, 1},
434         {0, 0, 0, 0, 2, 127, -1, 0},
435         // dummy, replicate row index 191.
436         {0, 0, 0, 0, 2, 127, -1, 0}};
437 
438 alignas(16) const int16_t
439     kWarpedFilters[3 * kWarpedPixelPrecisionShifts + 1][8] = {
440         // [-1, 0).
441         {0, 0, 127, 1, 0, 0, 0, 0},
442         {0, -1, 127, 2, 0, 0, 0, 0},
443         {1, -3, 127, 4, -1, 0, 0, 0},
444         {1, -4, 126, 6, -2, 1, 0, 0},
445         {1, -5, 126, 8, -3, 1, 0, 0},
446         {1, -6, 125, 11, -4, 1, 0, 0},
447         {1, -7, 124, 13, -4, 1, 0, 0},
448         {2, -8, 123, 15, -5, 1, 0, 0},
449         {2, -9, 122, 18, -6, 1, 0, 0},
450         {2, -10, 121, 20, -6, 1, 0, 0},
451         {2, -11, 120, 22, -7, 2, 0, 0},
452         {2, -12, 119, 25, -8, 2, 0, 0},
453         {3, -13, 117, 27, -8, 2, 0, 0},
454         {3, -13, 116, 29, -9, 2, 0, 0},
455         {3, -14, 114, 32, -10, 3, 0, 0},
456         {3, -15, 113, 35, -10, 2, 0, 0},
457         {3, -15, 111, 37, -11, 3, 0, 0},
458         {3, -16, 109, 40, -11, 3, 0, 0},
459         {3, -16, 108, 42, -12, 3, 0, 0},
460         {4, -17, 106, 45, -13, 3, 0, 0},
461         {4, -17, 104, 47, -13, 3, 0, 0},
462         {4, -17, 102, 50, -14, 3, 0, 0},
463         {4, -17, 100, 52, -14, 3, 0, 0},
464         {4, -18, 98, 55, -15, 4, 0, 0},
465         {4, -18, 96, 58, -15, 3, 0, 0},
466         {4, -18, 94, 60, -16, 4, 0, 0},
467         {4, -18, 91, 63, -16, 4, 0, 0},
468         {4, -18, 89, 65, -16, 4, 0, 0},
469         {4, -18, 87, 68, -17, 4, 0, 0},
470         {4, -18, 85, 70, -17, 4, 0, 0},
471         {4, -18, 82, 73, -17, 4, 0, 0},
472         {4, -18, 80, 75, -17, 4, 0, 0},
473         {4, -18, 78, 78, -18, 4, 0, 0},
474         {4, -17, 75, 80, -18, 4, 0, 0},
475         {4, -17, 73, 82, -18, 4, 0, 0},
476         {4, -17, 70, 85, -18, 4, 0, 0},
477         {4, -17, 68, 87, -18, 4, 0, 0},
478         {4, -16, 65, 89, -18, 4, 0, 0},
479         {4, -16, 63, 91, -18, 4, 0, 0},
480         {4, -16, 60, 94, -18, 4, 0, 0},
481         {3, -15, 58, 96, -18, 4, 0, 0},
482         {4, -15, 55, 98, -18, 4, 0, 0},
483         {3, -14, 52, 100, -17, 4, 0, 0},
484         {3, -14, 50, 102, -17, 4, 0, 0},
485         {3, -13, 47, 104, -17, 4, 0, 0},
486         {3, -13, 45, 106, -17, 4, 0, 0},
487         {3, -12, 42, 108, -16, 3, 0, 0},
488         {3, -11, 40, 109, -16, 3, 0, 0},
489         {3, -11, 37, 111, -15, 3, 0, 0},
490         {2, -10, 35, 113, -15, 3, 0, 0},
491         {3, -10, 32, 114, -14, 3, 0, 0},
492         {2, -9, 29, 116, -13, 3, 0, 0},
493         {2, -8, 27, 117, -13, 3, 0, 0},
494         {2, -8, 25, 119, -12, 2, 0, 0},
495         {2, -7, 22, 120, -11, 2, 0, 0},
496         {1, -6, 20, 121, -10, 2, 0, 0},
497         {1, -6, 18, 122, -9, 2, 0, 0},
498         {1, -5, 15, 123, -8, 2, 0, 0},
499         {1, -4, 13, 124, -7, 1, 0, 0},
500         {1, -4, 11, 125, -6, 1, 0, 0},
501         {1, -3, 8, 126, -5, 1, 0, 0},
502         {1, -2, 6, 126, -4, 1, 0, 0},
503         {0, -1, 4, 127, -3, 1, 0, 0},
504         {0, 0, 2, 127, -1, 0, 0, 0},
505         // [0, 1).
506         {0, 0, 0, 127, 1, 0, 0, 0},
507         {0, 0, -1, 127, 2, 0, 0, 0},
508         {0, 1, -3, 127, 4, -2, 1, 0},
509         {0, 1, -5, 127, 6, -2, 1, 0},
510         {0, 2, -6, 126, 8, -3, 1, 0},
511         {-1, 2, -7, 126, 11, -4, 2, -1},
512         {-1, 3, -8, 125, 13, -5, 2, -1},
513         {-1, 3, -10, 124, 16, -6, 3, -1},
514         {-1, 4, -11, 123, 18, -7, 3, -1},
515         {-1, 4, -12, 122, 20, -7, 3, -1},
516         {-1, 4, -13, 121, 23, -8, 3, -1},
517         {-2, 5, -14, 120, 25, -9, 4, -1},
518         {-1, 5, -15, 119, 27, -10, 4, -1},
519         {-1, 5, -16, 118, 30, -11, 4, -1},
520         {-2, 6, -17, 116, 33, -12, 5, -1},
521         {-2, 6, -17, 114, 35, -12, 5, -1},
522         {-2, 6, -18, 113, 38, -13, 5, -1},
523         {-2, 7, -19, 111, 41, -14, 6, -2},
524         {-2, 7, -19, 110, 43, -15, 6, -2},
525         {-2, 7, -20, 108, 46, -15, 6, -2},
526         {-2, 7, -20, 106, 49, -16, 6, -2},
527         {-2, 7, -21, 104, 51, -16, 7, -2},
528         {-2, 7, -21, 102, 54, -17, 7, -2},
529         {-2, 8, -21, 100, 56, -18, 7, -2},
530         {-2, 8, -22, 98, 59, -18, 7, -2},
531         {-2, 8, -22, 96, 62, -19, 7, -2},
532         {-2, 8, -22, 94, 64, -19, 7, -2},
533         {-2, 8, -22, 91, 67, -20, 8, -2},
534         {-2, 8, -22, 89, 69, -20, 8, -2},
535         {-2, 8, -22, 87, 72, -21, 8, -2},
536         {-2, 8, -21, 84, 74, -21, 8, -2},
537         {-2, 8, -22, 82, 77, -21, 8, -2},
538         {-2, 8, -21, 79, 79, -21, 8, -2},
539         {-2, 8, -21, 77, 82, -22, 8, -2},
540         {-2, 8, -21, 74, 84, -21, 8, -2},
541         {-2, 8, -21, 72, 87, -22, 8, -2},
542         {-2, 8, -20, 69, 89, -22, 8, -2},
543         {-2, 8, -20, 67, 91, -22, 8, -2},
544         {-2, 7, -19, 64, 94, -22, 8, -2},
545         {-2, 7, -19, 62, 96, -22, 8, -2},
546         {-2, 7, -18, 59, 98, -22, 8, -2},
547         {-2, 7, -18, 56, 100, -21, 8, -2},
548         {-2, 7, -17, 54, 102, -21, 7, -2},
549         {-2, 7, -16, 51, 104, -21, 7, -2},
550         {-2, 6, -16, 49, 106, -20, 7, -2},
551         {-2, 6, -15, 46, 108, -20, 7, -2},
552         {-2, 6, -15, 43, 110, -19, 7, -2},
553         {-2, 6, -14, 41, 111, -19, 7, -2},
554         {-1, 5, -13, 38, 113, -18, 6, -2},
555         {-1, 5, -12, 35, 114, -17, 6, -2},
556         {-1, 5, -12, 33, 116, -17, 6, -2},
557         {-1, 4, -11, 30, 118, -16, 5, -1},
558         {-1, 4, -10, 27, 119, -15, 5, -1},
559         {-1, 4, -9, 25, 120, -14, 5, -2},
560         {-1, 3, -8, 23, 121, -13, 4, -1},
561         {-1, 3, -7, 20, 122, -12, 4, -1},
562         {-1, 3, -7, 18, 123, -11, 4, -1},
563         {-1, 3, -6, 16, 124, -10, 3, -1},
564         {-1, 2, -5, 13, 125, -8, 3, -1},
565         {-1, 2, -4, 11, 126, -7, 2, -1},
566         {0, 1, -3, 8, 126, -6, 2, 0},
567         {0, 1, -2, 6, 127, -5, 1, 0},
568         {0, 1, -2, 4, 127, -3, 1, 0},
569         {0, 0, 0, 2, 127, -1, 0, 0},
570         // [1, 2).
571         {0, 0, 0, 1, 127, 0, 0, 0},
572         {0, 0, 0, -1, 127, 2, 0, 0},
573         {0, 0, 1, -3, 127, 4, -1, 0},
574         {0, 0, 1, -4, 126, 6, -2, 1},
575         {0, 0, 1, -5, 126, 8, -3, 1},
576         {0, 0, 1, -6, 125, 11, -4, 1},
577         {0, 0, 1, -7, 124, 13, -4, 1},
578         {0, 0, 2, -8, 123, 15, -5, 1},
579         {0, 0, 2, -9, 122, 18, -6, 1},
580         {0, 0, 2, -10, 121, 20, -6, 1},
581         {0, 0, 2, -11, 120, 22, -7, 2},
582         {0, 0, 2, -12, 119, 25, -8, 2},
583         {0, 0, 3, -13, 117, 27, -8, 2},
584         {0, 0, 3, -13, 116, 29, -9, 2},
585         {0, 0, 3, -14, 114, 32, -10, 3},
586         {0, 0, 3, -15, 113, 35, -10, 2},
587         {0, 0, 3, -15, 111, 37, -11, 3},
588         {0, 0, 3, -16, 109, 40, -11, 3},
589         {0, 0, 3, -16, 108, 42, -12, 3},
590         {0, 0, 4, -17, 106, 45, -13, 3},
591         {0, 0, 4, -17, 104, 47, -13, 3},
592         {0, 0, 4, -17, 102, 50, -14, 3},
593         {0, 0, 4, -17, 100, 52, -14, 3},
594         {0, 0, 4, -18, 98, 55, -15, 4},
595         {0, 0, 4, -18, 96, 58, -15, 3},
596         {0, 0, 4, -18, 94, 60, -16, 4},
597         {0, 0, 4, -18, 91, 63, -16, 4},
598         {0, 0, 4, -18, 89, 65, -16, 4},
599         {0, 0, 4, -18, 87, 68, -17, 4},
600         {0, 0, 4, -18, 85, 70, -17, 4},
601         {0, 0, 4, -18, 82, 73, -17, 4},
602         {0, 0, 4, -18, 80, 75, -17, 4},
603         {0, 0, 4, -18, 78, 78, -18, 4},
604         {0, 0, 4, -17, 75, 80, -18, 4},
605         {0, 0, 4, -17, 73, 82, -18, 4},
606         {0, 0, 4, -17, 70, 85, -18, 4},
607         {0, 0, 4, -17, 68, 87, -18, 4},
608         {0, 0, 4, -16, 65, 89, -18, 4},
609         {0, 0, 4, -16, 63, 91, -18, 4},
610         {0, 0, 4, -16, 60, 94, -18, 4},
611         {0, 0, 3, -15, 58, 96, -18, 4},
612         {0, 0, 4, -15, 55, 98, -18, 4},
613         {0, 0, 3, -14, 52, 100, -17, 4},
614         {0, 0, 3, -14, 50, 102, -17, 4},
615         {0, 0, 3, -13, 47, 104, -17, 4},
616         {0, 0, 3, -13, 45, 106, -17, 4},
617         {0, 0, 3, -12, 42, 108, -16, 3},
618         {0, 0, 3, -11, 40, 109, -16, 3},
619         {0, 0, 3, -11, 37, 111, -15, 3},
620         {0, 0, 2, -10, 35, 113, -15, 3},
621         {0, 0, 3, -10, 32, 114, -14, 3},
622         {0, 0, 2, -9, 29, 116, -13, 3},
623         {0, 0, 2, -8, 27, 117, -13, 3},
624         {0, 0, 2, -8, 25, 119, -12, 2},
625         {0, 0, 2, -7, 22, 120, -11, 2},
626         {0, 0, 1, -6, 20, 121, -10, 2},
627         {0, 0, 1, -6, 18, 122, -9, 2},
628         {0, 0, 1, -5, 15, 123, -8, 2},
629         {0, 0, 1, -4, 13, 124, -7, 1},
630         {0, 0, 1, -4, 11, 125, -6, 1},
631         {0, 0, 1, -3, 8, 126, -5, 1},
632         {0, 0, 1, -2, 6, 126, -4, 1},
633         {0, 0, 0, -1, 4, 127, -3, 1},
634         {0, 0, 0, 0, 2, 127, -1, 0},
635         // dummy, replicate row index 191.
636         {0, 0, 0, 0, 2, 127, -1, 0}};
637 
638 // Every value in |kSubPixelFilters| is even. Divide by 2 to simplify
639 // calculations by reducing the range by 1 bit.
640 alignas(8) const int8_t kHalfSubPixelFilters[6][16][8] = {
641     {{0, 0, 0, 64, 0, 0, 0, 0},
642      {0, 1, -3, 63, 4, -1, 0, 0},
643      {0, 1, -5, 61, 9, -2, 0, 0},
644      {0, 1, -6, 58, 14, -4, 1, 0},
645      {0, 1, -7, 55, 19, -5, 1, 0},
646      {0, 1, -7, 51, 24, -6, 1, 0},
647      {0, 1, -8, 47, 29, -6, 1, 0},
648      {0, 1, -7, 42, 33, -6, 1, 0},
649      {0, 1, -7, 38, 38, -7, 1, 0},
650      {0, 1, -6, 33, 42, -7, 1, 0},
651      {0, 1, -6, 29, 47, -8, 1, 0},
652      {0, 1, -6, 24, 51, -7, 1, 0},
653      {0, 1, -5, 19, 55, -7, 1, 0},
654      {0, 1, -4, 14, 58, -6, 1, 0},
655      {0, 0, -2, 9, 61, -5, 1, 0},
656      {0, 0, -1, 4, 63, -3, 1, 0}},
657     {{0, 0, 0, 64, 0, 0, 0, 0},
658      {0, 1, 14, 31, 17, 1, 0, 0},
659      {0, 0, 13, 31, 18, 2, 0, 0},
660      {0, 0, 11, 31, 20, 2, 0, 0},
661      {0, 0, 10, 30, 21, 3, 0, 0},
662      {0, 0, 9, 29, 22, 4, 0, 0},
663      {0, 0, 8, 28, 23, 5, 0, 0},
664      {0, -1, 8, 27, 24, 6, 0, 0},
665      {0, -1, 7, 26, 26, 7, -1, 0},
666      {0, 0, 6, 24, 27, 8, -1, 0},
667      {0, 0, 5, 23, 28, 8, 0, 0},
668      {0, 0, 4, 22, 29, 9, 0, 0},
669      {0, 0, 3, 21, 30, 10, 0, 0},
670      {0, 0, 2, 20, 31, 11, 0, 0},
671      {0, 0, 2, 18, 31, 13, 0, 0},
672      {0, 0, 1, 17, 31, 14, 1, 0}},
673     {{0, 0, 0, 64, 0, 0, 0, 0},
674      {-1, 1, -3, 63, 4, -1, 1, 0},
675      {-1, 3, -6, 62, 8, -3, 2, -1},
676      {-1, 4, -9, 60, 13, -5, 3, -1},
677      {-2, 5, -11, 58, 19, -7, 3, -1},
678      {-2, 5, -11, 54, 24, -9, 4, -1},
679      {-2, 5, -12, 50, 30, -10, 4, -1},
680      {-2, 5, -12, 45, 35, -11, 5, -1},
681      {-2, 6, -12, 40, 40, -12, 6, -2},
682      {-1, 5, -11, 35, 45, -12, 5, -2},
683      {-1, 4, -10, 30, 50, -12, 5, -2},
684      {-1, 4, -9, 24, 54, -11, 5, -2},
685      {-1, 3, -7, 19, 58, -11, 5, -2},
686      {-1, 3, -5, 13, 60, -9, 4, -1},
687      {-1, 2, -3, 8, 62, -6, 3, -1},
688      {0, 1, -1, 4, 63, -3, 1, -1}},
689     {{0, 0, 0, 64, 0, 0, 0, 0},
690      {0, 0, 0, 60, 4, 0, 0, 0},
691      {0, 0, 0, 56, 8, 0, 0, 0},
692      {0, 0, 0, 52, 12, 0, 0, 0},
693      {0, 0, 0, 48, 16, 0, 0, 0},
694      {0, 0, 0, 44, 20, 0, 0, 0},
695      {0, 0, 0, 40, 24, 0, 0, 0},
696      {0, 0, 0, 36, 28, 0, 0, 0},
697      {0, 0, 0, 32, 32, 0, 0, 0},
698      {0, 0, 0, 28, 36, 0, 0, 0},
699      {0, 0, 0, 24, 40, 0, 0, 0},
700      {0, 0, 0, 20, 44, 0, 0, 0},
701      {0, 0, 0, 16, 48, 0, 0, 0},
702      {0, 0, 0, 12, 52, 0, 0, 0},
703      {0, 0, 0, 8, 56, 0, 0, 0},
704      {0, 0, 0, 4, 60, 0, 0, 0}},
705     {{0, 0, 0, 64, 0, 0, 0, 0},
706      {0, 0, -2, 63, 4, -1, 0, 0},
707      {0, 0, -4, 61, 9, -2, 0, 0},
708      {0, 0, -5, 58, 14, -3, 0, 0},
709      {0, 0, -6, 55, 19, -4, 0, 0},
710      {0, 0, -6, 51, 24, -5, 0, 0},
711      {0, 0, -7, 47, 29, -5, 0, 0},
712      {0, 0, -6, 42, 33, -5, 0, 0},
713      {0, 0, -6, 38, 38, -6, 0, 0},
714      {0, 0, -5, 33, 42, -6, 0, 0},
715      {0, 0, -5, 29, 47, -7, 0, 0},
716      {0, 0, -5, 24, 51, -6, 0, 0},
717      {0, 0, -4, 19, 55, -6, 0, 0},
718      {0, 0, -3, 14, 58, -5, 0, 0},
719      {0, 0, -2, 9, 61, -4, 0, 0},
720      {0, 0, -1, 4, 63, -2, 0, 0}},
721     {{0, 0, 0, 64, 0, 0, 0, 0},
722      {0, 0, 15, 31, 17, 1, 0, 0},
723      {0, 0, 13, 31, 18, 2, 0, 0},
724      {0, 0, 11, 31, 20, 2, 0, 0},
725      {0, 0, 10, 30, 21, 3, 0, 0},
726      {0, 0, 9, 29, 22, 4, 0, 0},
727      {0, 0, 8, 28, 23, 5, 0, 0},
728      {0, 0, 7, 27, 24, 6, 0, 0},
729      {0, 0, 6, 26, 26, 6, 0, 0},
730      {0, 0, 6, 24, 27, 7, 0, 0},
731      {0, 0, 5, 23, 28, 8, 0, 0},
732      {0, 0, 4, 22, 29, 9, 0, 0},
733      {0, 0, 3, 21, 30, 10, 0, 0},
734      {0, 0, 2, 20, 31, 11, 0, 0},
735      {0, 0, 2, 18, 31, 13, 0, 0},
736      {0, 0, 1, 17, 31, 15, 0, 0}}};
737 
738 // Absolute values of |kHalfSubPixelFilters|. Used in situations where we know
739 // the pattern of the signs and account for it in other ways.
740 const uint8_t kAbsHalfSubPixelFilters[6][16][8] = {
741     {{0, 0, 0, 64, 0, 0, 0, 0},
742      {0, 1, 3, 63, 4, 1, 0, 0},
743      {0, 1, 5, 61, 9, 2, 0, 0},
744      {0, 1, 6, 58, 14, 4, 1, 0},
745      {0, 1, 7, 55, 19, 5, 1, 0},
746      {0, 1, 7, 51, 24, 6, 1, 0},
747      {0, 1, 8, 47, 29, 6, 1, 0},
748      {0, 1, 7, 42, 33, 6, 1, 0},
749      {0, 1, 7, 38, 38, 7, 1, 0},
750      {0, 1, 6, 33, 42, 7, 1, 0},
751      {0, 1, 6, 29, 47, 8, 1, 0},
752      {0, 1, 6, 24, 51, 7, 1, 0},
753      {0, 1, 5, 19, 55, 7, 1, 0},
754      {0, 1, 4, 14, 58, 6, 1, 0},
755      {0, 0, 2, 9, 61, 5, 1, 0},
756      {0, 0, 1, 4, 63, 3, 1, 0}},
757     {{0, 0, 0, 64, 0, 0, 0, 0},
758      {0, 1, 14, 31, 17, 1, 0, 0},
759      {0, 0, 13, 31, 18, 2, 0, 0},
760      {0, 0, 11, 31, 20, 2, 0, 0},
761      {0, 0, 10, 30, 21, 3, 0, 0},
762      {0, 0, 9, 29, 22, 4, 0, 0},
763      {0, 0, 8, 28, 23, 5, 0, 0},
764      {0, 1, 8, 27, 24, 6, 0, 0},
765      {0, 1, 7, 26, 26, 7, 1, 0},
766      {0, 0, 6, 24, 27, 8, 1, 0},
767      {0, 0, 5, 23, 28, 8, 0, 0},
768      {0, 0, 4, 22, 29, 9, 0, 0},
769      {0, 0, 3, 21, 30, 10, 0, 0},
770      {0, 0, 2, 20, 31, 11, 0, 0},
771      {0, 0, 2, 18, 31, 13, 0, 0},
772      {0, 0, 1, 17, 31, 14, 1, 0}},
773     {{0, 0, 0, 64, 0, 0, 0, 0},
774      {1, 1, 3, 63, 4, 1, 1, 0},
775      {1, 3, 6, 62, 8, 3, 2, 1},
776      {1, 4, 9, 60, 13, 5, 3, 1},
777      {2, 5, 11, 58, 19, 7, 3, 1},
778      {2, 5, 11, 54, 24, 9, 4, 1},
779      {2, 5, 12, 50, 30, 10, 4, 1},
780      {2, 5, 12, 45, 35, 11, 5, 1},
781      {2, 6, 12, 40, 40, 12, 6, 2},
782      {1, 5, 11, 35, 45, 12, 5, 2},
783      {1, 4, 10, 30, 50, 12, 5, 2},
784      {1, 4, 9, 24, 54, 11, 5, 2},
785      {1, 3, 7, 19, 58, 11, 5, 2},
786      {1, 3, 5, 13, 60, 9, 4, 1},
787      {1, 2, 3, 8, 62, 6, 3, 1},
788      {0, 1, 1, 4, 63, 3, 1, 1}},
789     {{0, 0, 0, 64, 0, 0, 0, 0},
790      {0, 0, 0, 60, 4, 0, 0, 0},
791      {0, 0, 0, 56, 8, 0, 0, 0},
792      {0, 0, 0, 52, 12, 0, 0, 0},
793      {0, 0, 0, 48, 16, 0, 0, 0},
794      {0, 0, 0, 44, 20, 0, 0, 0},
795      {0, 0, 0, 40, 24, 0, 0, 0},
796      {0, 0, 0, 36, 28, 0, 0, 0},
797      {0, 0, 0, 32, 32, 0, 0, 0},
798      {0, 0, 0, 28, 36, 0, 0, 0},
799      {0, 0, 0, 24, 40, 0, 0, 0},
800      {0, 0, 0, 20, 44, 0, 0, 0},
801      {0, 0, 0, 16, 48, 0, 0, 0},
802      {0, 0, 0, 12, 52, 0, 0, 0},
803      {0, 0, 0, 8, 56, 0, 0, 0},
804      {0, 0, 0, 4, 60, 0, 0, 0}},
805     {{0, 0, 0, 64, 0, 0, 0, 0},
806      {0, 0, 2, 63, 4, 1, 0, 0},
807      {0, 0, 4, 61, 9, 2, 0, 0},
808      {0, 0, 5, 58, 14, 3, 0, 0},
809      {0, 0, 6, 55, 19, 4, 0, 0},
810      {0, 0, 6, 51, 24, 5, 0, 0},
811      {0, 0, 7, 47, 29, 5, 0, 0},
812      {0, 0, 6, 42, 33, 5, 0, 0},
813      {0, 0, 6, 38, 38, 6, 0, 0},
814      {0, 0, 5, 33, 42, 6, 0, 0},
815      {0, 0, 5, 29, 47, 7, 0, 0},
816      {0, 0, 5, 24, 51, 6, 0, 0},
817      {0, 0, 4, 19, 55, 6, 0, 0},
818      {0, 0, 3, 14, 58, 5, 0, 0},
819      {0, 0, 2, 9, 61, 4, 0, 0},
820      {0, 0, 1, 4, 63, 2, 0, 0}},
821     {{0, 0, 0, 64, 0, 0, 0, 0},
822      {0, 0, 15, 31, 17, 1, 0, 0},
823      {0, 0, 13, 31, 18, 2, 0, 0},
824      {0, 0, 11, 31, 20, 2, 0, 0},
825      {0, 0, 10, 30, 21, 3, 0, 0},
826      {0, 0, 9, 29, 22, 4, 0, 0},
827      {0, 0, 8, 28, 23, 5, 0, 0},
828      {0, 0, 7, 27, 24, 6, 0, 0},
829      {0, 0, 6, 26, 26, 6, 0, 0},
830      {0, 0, 6, 24, 27, 7, 0, 0},
831      {0, 0, 5, 23, 28, 8, 0, 0},
832      {0, 0, 4, 22, 29, 9, 0, 0},
833      {0, 0, 3, 21, 30, 10, 0, 0},
834      {0, 0, 2, 20, 31, 11, 0, 0},
835      {0, 0, 2, 18, 31, 13, 0, 0},
836      {0, 0, 1, 17, 31, 15, 0, 0}}};
837 
838 // 9.3 -- Dr_Intra_Derivative[]
839 // This is a more compact version of the table from the spec. angle / 2 - 1 is
840 // used as the lookup. Note angle / 3 - 1 would work too, but the calculation
841 // becomes more costly.
842 const int16_t kDirectionalIntraPredictorDerivative[44] = {
843     //              Approx angle
844     1023, 0,     // 3, ...
845     547,         // 6, ...
846     372,  0, 0,  // 9, ...
847     273,         // 14, ...
848     215,  0,     // 17, ...
849     178,         // 20, ...
850     151,  0,     // 23, ... (113 & 203 are base angles)
851     132,         // 26, ...
852     116,  0,     // 29, ...
853     102,  0,     // 32, ...
854     90,          // 36, ...
855     80,   0,     // 39, ...
856     71,          // 42, ...
857     64,   0,     // 45, ... (45 & 135 are base angles)
858     57,          // 48, ...
859     51,   0,     // 51, ...
860     45,   0,     // 54, ...
861     40,          // 58, ...
862     35,   0,     // 61, ...
863     31,          // 64, ...
864     27,   0,     // 67, ... (67 & 157 are base angles)
865     23,          // 70, ...
866     19,   0,     // 73, ...
867     15,   0,     // 76, ...
868     11,   0,     // 81, ...
869     7,           // 84, ...
870     3,           // 87, ...
871 };
872 
873 const uint8_t kDeblockFilterLevelIndex[kMaxPlanes][kNumLoopFilterTypes] = {
874     {0, 1}, {2, 2}, {3, 3}};
875 
876 const uint16_t kBlockWeight[kMaxBlockSizes] = {
877     1,  2,  4,  2,  4,   8,  16,  4,   8,   16,  32,
878     64, 16, 32, 64, 128, 64, 128, 256, 512, 512, 1024};
879 
880 }  // namespace libgav1
881