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 namespace libgav1 { 18 19 const uint8_t k4x4WidthLog2[kMaxBlockSizes] = {0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 20 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; 21 22 const uint8_t k4x4HeightLog2[kMaxBlockSizes] = { 23 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4, 5, 4, 5}; 24 25 const uint8_t kNum4x4BlocksWide[kMaxBlockSizes] = { 26 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 32, 32}; 27 28 const uint8_t kNum4x4BlocksHigh[kMaxBlockSizes] = { 29 1, 2, 4, 1, 2, 4, 8, 1, 2, 4, 8, 16, 2, 4, 8, 16, 4, 8, 16, 32, 16, 32}; 30 31 const uint8_t kBlockWidthPixels[kMaxBlockSizes] = { 32 4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 33 16, 32, 32, 32, 32, 64, 64, 64, 64, 128, 128}; 34 35 const uint8_t kBlockHeightPixels[kMaxBlockSizes] = { 36 4, 8, 16, 4, 8, 16, 32, 4, 8, 16, 32, 37 64, 8, 16, 32, 64, 16, 32, 64, 128, 64, 128}; 38 39 // 9.3 -- Partition_Subsize[] 40 const BlockSize kSubSize[kMaxPartitionTypes][kMaxBlockSizes] = { 41 // kPartitionNone 42 {kBlock4x4, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x8, 43 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x16, 44 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x32, 45 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x64, kBlockInvalid, 46 kBlockInvalid, kBlock128x128}, 47 // kPartitionHorizontal 48 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4, 49 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8, 50 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16, 51 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32, kBlockInvalid, 52 kBlockInvalid, kBlock128x64}, 53 // kPartitionVertical 54 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8, 55 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16, 56 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32, 57 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64, kBlockInvalid, 58 kBlockInvalid, kBlock64x128}, 59 // kPartitionSplit 60 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x4, 61 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x8, 62 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x16, 63 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x32, kBlockInvalid, 64 kBlockInvalid, kBlock64x64}, 65 // kPartitionHorizontalWithTopSplit 66 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4, 67 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8, 68 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16, 69 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32, kBlockInvalid, 70 kBlockInvalid, kBlock128x64}, 71 // kPartitionHorizontalWithBottomSplit 72 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x4, 73 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x8, 74 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x16, 75 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x32, kBlockInvalid, 76 kBlockInvalid, kBlock128x64}, 77 // kPartitionVerticalWithLeftSplit 78 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8, 79 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16, 80 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32, 81 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64, kBlockInvalid, 82 kBlockInvalid, kBlock64x128}, 83 // kPartitionVerticalWithRightSplit 84 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x8, 85 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x16, 86 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x32, 87 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x64, kBlockInvalid, 88 kBlockInvalid, kBlock64x128}, 89 // kPartitionHorizontal4 90 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, 91 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x4, 92 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock32x8, 93 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock64x16, kBlockInvalid, 94 kBlockInvalid, kBlockInvalid}, 95 // kPartitionVertical4 96 {kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, 97 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock4x16, 98 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock8x32, 99 kBlockInvalid, kBlockInvalid, kBlockInvalid, kBlock16x64, kBlockInvalid, 100 kBlockInvalid, kBlockInvalid}}; 101 102 // 5.11.38 (implemented as a simple look up. first dimension is block size, 103 // second and third are subsampling_x and subsampling_y). 104 const BlockSize kPlaneResidualSize[kMaxBlockSizes][2][2] = { 105 {{kBlock4x4, kBlock4x4}, {kBlock4x4, kBlock4x4}}, 106 {{kBlock4x8, kBlock4x4}, {kBlockInvalid, kBlock4x4}}, 107 {{kBlock4x16, kBlock4x8}, {kBlockInvalid, kBlock4x8}}, 108 {{kBlock8x4, kBlockInvalid}, {kBlock4x4, kBlock4x4}}, 109 {{kBlock8x8, kBlock8x4}, {kBlock4x8, kBlock4x4}}, 110 {{kBlock8x16, kBlock8x8}, {kBlockInvalid, kBlock4x8}}, 111 {{kBlock8x32, kBlock8x16}, {kBlockInvalid, kBlock4x16}}, 112 {{kBlock16x4, kBlockInvalid}, {kBlock8x4, kBlock8x4}}, 113 {{kBlock16x8, kBlockInvalid}, {kBlock8x8, kBlock8x4}}, 114 {{kBlock16x16, kBlock16x8}, {kBlock8x16, kBlock8x8}}, 115 {{kBlock16x32, kBlock16x16}, {kBlockInvalid, kBlock8x16}}, 116 {{kBlock16x64, kBlock16x32}, {kBlockInvalid, kBlock8x32}}, 117 {{kBlock32x8, kBlockInvalid}, {kBlock16x8, kBlock16x4}}, 118 {{kBlock32x16, kBlockInvalid}, {kBlock16x16, kBlock16x8}}, 119 {{kBlock32x32, kBlock32x16}, {kBlock16x32, kBlock16x16}}, 120 {{kBlock32x64, kBlock32x32}, {kBlockInvalid, kBlock16x32}}, 121 {{kBlock64x16, kBlockInvalid}, {kBlock32x16, kBlock32x8}}, 122 {{kBlock64x32, kBlockInvalid}, {kBlock32x32, kBlock32x16}}, 123 {{kBlock64x64, kBlock64x32}, {kBlock32x64, kBlock32x32}}, 124 {{kBlock64x128, kBlock64x64}, {kBlockInvalid, kBlock32x64}}, 125 {{kBlock128x64, kBlockInvalid}, {kBlock64x64, kBlock64x32}}, 126 {{kBlock128x128, kBlock128x64}, {kBlock64x128, kBlock64x64}}}; 127 128 const int16_t kProjectionMvDivisionLookup[kMaxFrameDistance + 1] = { 129 0, 16384, 8192, 5461, 4096, 3276, 2730, 2340, 2048, 1820, 1638, 130 1489, 1365, 1260, 1170, 1092, 1024, 963, 910, 862, 819, 780, 131 744, 712, 682, 655, 630, 606, 585, 564, 546, 528}; 132 133 const uint8_t kTransformWidth[kNumTransformSizes] = { 134 4, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 32, 32, 32, 32, 64, 64, 64}; 135 136 const uint8_t kTransformHeight[kNumTransformSizes] = { 137 4, 8, 16, 4, 8, 16, 32, 4, 8, 16, 32, 64, 8, 16, 32, 64, 16, 32, 64}; 138 139 const uint8_t kTransformWidth4x4[kNumTransformSizes] = { 140 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 8, 16, 16, 16}; 141 142 const uint8_t kTransformHeight4x4[kNumTransformSizes] = { 143 1, 2, 4, 1, 2, 4, 8, 1, 2, 4, 8, 16, 2, 4, 8, 16, 4, 8, 16}; 144 145 const uint8_t kTransformWidthLog2[kNumTransformSizes] = { 146 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6}; 147 148 const uint8_t kTransformHeightLog2[kNumTransformSizes] = { 149 2, 3, 4, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 4, 5, 6}; 150 151 // 9.3 -- Split_Tx_Size[] 152 const TransformSize kSplitTransformSize[kNumTransformSizes] = { 153 kTransformSize4x4, kTransformSize4x4, kTransformSize4x8, 154 kTransformSize4x4, kTransformSize4x4, kTransformSize8x8, 155 kTransformSize8x16, kTransformSize8x4, kTransformSize8x8, 156 kTransformSize8x8, kTransformSize16x16, kTransformSize16x32, 157 kTransformSize16x8, kTransformSize16x16, kTransformSize16x16, 158 kTransformSize32x32, kTransformSize32x16, kTransformSize32x32, 159 kTransformSize32x32}; 160 161 // Square transform of size min(w,h). 162 const TransformSize kTransformSizeSquareMin[kNumTransformSizes] = { 163 kTransformSize4x4, kTransformSize4x4, kTransformSize4x4, 164 kTransformSize4x4, kTransformSize8x8, kTransformSize8x8, 165 kTransformSize8x8, kTransformSize4x4, kTransformSize8x8, 166 kTransformSize16x16, kTransformSize16x16, kTransformSize16x16, 167 kTransformSize8x8, kTransformSize16x16, kTransformSize32x32, 168 kTransformSize32x32, kTransformSize16x16, kTransformSize32x32, 169 kTransformSize64x64}; 170 171 // Square transform of size max(w,h). 172 const TransformSize kTransformSizeSquareMax[kNumTransformSizes] = { 173 kTransformSize4x4, kTransformSize8x8, kTransformSize16x16, 174 kTransformSize8x8, kTransformSize8x8, kTransformSize16x16, 175 kTransformSize32x32, kTransformSize16x16, kTransformSize16x16, 176 kTransformSize16x16, kTransformSize32x32, kTransformSize64x64, 177 kTransformSize32x32, kTransformSize32x32, kTransformSize32x32, 178 kTransformSize64x64, kTransformSize64x64, kTransformSize64x64, 179 kTransformSize64x64}; 180 181 const uint8_t kNumTransformTypesInSet[kNumTransformSets] = {1, 7, 5, 16, 12, 2}; 182 183 const uint8_t kSgrProjParams[1 << kSgrProjParamsBits][4] = { 184 {2, 12, 1, 4}, {2, 15, 1, 6}, {2, 18, 1, 8}, {2, 21, 1, 9}, 185 {2, 24, 1, 10}, {2, 29, 1, 11}, {2, 36, 1, 12}, {2, 45, 1, 13}, 186 {2, 56, 1, 14}, {2, 68, 1, 15}, {0, 0, 1, 5}, {0, 0, 1, 8}, 187 {0, 0, 1, 11}, {0, 0, 1, 14}, {2, 30, 0, 0}, {2, 75, 0, 0}}; 188 189 const int8_t kSgrProjMultiplierMin[2] = {-96, -32}; 190 191 const int8_t kSgrProjMultiplierMax[2] = {31, 95}; 192 193 const int8_t kWienerTapsMin[3] = {-5, -23, -17}; 194 195 const int8_t kWienerTapsMax[3] = {10, 8, 46}; 196 197 // This was modified from Upscale_Filter as defined in AV1 Section 7.16, in 198 // order to support 16-bit packed NEON operations. 199 // The sign of each tap is: - + - + + - + - 200 alignas(16) const uint8_t 201 kUpscaleFilterUnsigned[kSuperResFilterShifts][kSuperResFilterTaps] = { 202 {0, 0, 0, 128, 0, 0, 0, 0}, {0, 0, 1, 128, 2, 1, 0, 0}, 203 {0, 1, 3, 127, 4, 2, 1, 0}, {0, 1, 4, 127, 6, 3, 1, 0}, 204 {0, 2, 6, 126, 8, 3, 1, 0}, {0, 2, 7, 125, 11, 4, 1, 0}, 205 {1, 2, 8, 125, 13, 5, 2, 0}, {1, 3, 9, 124, 15, 6, 2, 0}, 206 {1, 3, 10, 123, 18, 6, 2, 1}, {1, 3, 11, 122, 20, 7, 3, 1}, 207 {1, 4, 12, 121, 22, 8, 3, 1}, {1, 4, 13, 120, 25, 9, 3, 1}, 208 {1, 4, 14, 118, 28, 9, 3, 1}, {1, 4, 15, 117, 30, 10, 4, 1}, 209 {1, 5, 16, 116, 32, 11, 4, 1}, {1, 5, 16, 114, 35, 12, 4, 1}, 210 {1, 5, 17, 112, 38, 12, 4, 1}, {1, 5, 18, 111, 40, 13, 5, 1}, 211 {1, 5, 18, 109, 43, 14, 5, 1}, {1, 6, 19, 107, 45, 14, 5, 1}, 212 {1, 6, 19, 105, 48, 15, 5, 1}, {1, 6, 19, 103, 51, 16, 5, 1}, 213 {1, 6, 20, 101, 53, 16, 6, 1}, {1, 6, 20, 99, 56, 17, 6, 1}, 214 {1, 6, 20, 97, 58, 17, 6, 1}, {1, 6, 20, 95, 61, 18, 6, 1}, 215 {2, 7, 20, 93, 64, 18, 6, 2}, {2, 7, 20, 91, 66, 19, 6, 1}, 216 {2, 7, 20, 88, 69, 19, 6, 1}, {2, 7, 20, 86, 71, 19, 6, 1}, 217 {2, 7, 20, 84, 74, 20, 7, 2}, {2, 7, 20, 81, 76, 20, 7, 1}, 218 {2, 7, 20, 79, 79, 20, 7, 2}, {1, 7, 20, 76, 81, 20, 7, 2}, 219 {2, 7, 20, 74, 84, 20, 7, 2}, {1, 6, 19, 71, 86, 20, 7, 2}, 220 {1, 6, 19, 69, 88, 20, 7, 2}, {1, 6, 19, 66, 91, 20, 7, 2}, 221 {2, 6, 18, 64, 93, 20, 7, 2}, {1, 6, 18, 61, 95, 20, 6, 1}, 222 {1, 6, 17, 58, 97, 20, 6, 1}, {1, 6, 17, 56, 99, 20, 6, 1}, 223 {1, 6, 16, 53, 101, 20, 6, 1}, {1, 5, 16, 51, 103, 19, 6, 1}, 224 {1, 5, 15, 48, 105, 19, 6, 1}, {1, 5, 14, 45, 107, 19, 6, 1}, 225 {1, 5, 14, 43, 109, 18, 5, 1}, {1, 5, 13, 40, 111, 18, 5, 1}, 226 {1, 4, 12, 38, 112, 17, 5, 1}, {1, 4, 12, 35, 114, 16, 5, 1}, 227 {1, 4, 11, 32, 116, 16, 5, 1}, {1, 4, 10, 30, 117, 15, 4, 1}, 228 {1, 3, 9, 28, 118, 14, 4, 1}, {1, 3, 9, 25, 120, 13, 4, 1}, 229 {1, 3, 8, 22, 121, 12, 4, 1}, {1, 3, 7, 20, 122, 11, 3, 1}, 230 {1, 2, 6, 18, 123, 10, 3, 1}, {0, 2, 6, 15, 124, 9, 3, 1}, 231 {0, 2, 5, 13, 125, 8, 2, 1}, {0, 1, 4, 11, 125, 7, 2, 0}, 232 {0, 1, 3, 8, 126, 6, 2, 0}, {0, 1, 3, 6, 127, 4, 1, 0}, 233 {0, 1, 2, 4, 127, 3, 1, 0}, {0, 0, 1, 2, 128, 1, 0, 0}, 234 }; 235 236 alignas(8) const int8_t 237 kWarpedFilters8[3 * kWarpedPixelPrecisionShifts + 1][8] = { 238 // [-1, 0). 239 {0, 0, 127, 1, 0, 0, 0, 0}, 240 {0, -1, 127, 2, 0, 0, 0, 0}, 241 {1, -3, 127, 4, -1, 0, 0, 0}, 242 {1, -4, 126, 6, -2, 1, 0, 0}, 243 {1, -5, 126, 8, -3, 1, 0, 0}, 244 {1, -6, 125, 11, -4, 1, 0, 0}, 245 {1, -7, 124, 13, -4, 1, 0, 0}, 246 {2, -8, 123, 15, -5, 1, 0, 0}, 247 {2, -9, 122, 18, -6, 1, 0, 0}, 248 {2, -10, 121, 20, -6, 1, 0, 0}, 249 {2, -11, 120, 22, -7, 2, 0, 0}, 250 {2, -12, 119, 25, -8, 2, 0, 0}, 251 {3, -13, 117, 27, -8, 2, 0, 0}, 252 {3, -13, 116, 29, -9, 2, 0, 0}, 253 {3, -14, 114, 32, -10, 3, 0, 0}, 254 {3, -15, 113, 35, -10, 2, 0, 0}, 255 {3, -15, 111, 37, -11, 3, 0, 0}, 256 {3, -16, 109, 40, -11, 3, 0, 0}, 257 {3, -16, 108, 42, -12, 3, 0, 0}, 258 {4, -17, 106, 45, -13, 3, 0, 0}, 259 {4, -17, 104, 47, -13, 3, 0, 0}, 260 {4, -17, 102, 50, -14, 3, 0, 0}, 261 {4, -17, 100, 52, -14, 3, 0, 0}, 262 {4, -18, 98, 55, -15, 4, 0, 0}, 263 {4, -18, 96, 58, -15, 3, 0, 0}, 264 {4, -18, 94, 60, -16, 4, 0, 0}, 265 {4, -18, 91, 63, -16, 4, 0, 0}, 266 {4, -18, 89, 65, -16, 4, 0, 0}, 267 {4, -18, 87, 68, -17, 4, 0, 0}, 268 {4, -18, 85, 70, -17, 4, 0, 0}, 269 {4, -18, 82, 73, -17, 4, 0, 0}, 270 {4, -18, 80, 75, -17, 4, 0, 0}, 271 {4, -18, 78, 78, -18, 4, 0, 0}, 272 {4, -17, 75, 80, -18, 4, 0, 0}, 273 {4, -17, 73, 82, -18, 4, 0, 0}, 274 {4, -17, 70, 85, -18, 4, 0, 0}, 275 {4, -17, 68, 87, -18, 4, 0, 0}, 276 {4, -16, 65, 89, -18, 4, 0, 0}, 277 {4, -16, 63, 91, -18, 4, 0, 0}, 278 {4, -16, 60, 94, -18, 4, 0, 0}, 279 {3, -15, 58, 96, -18, 4, 0, 0}, 280 {4, -15, 55, 98, -18, 4, 0, 0}, 281 {3, -14, 52, 100, -17, 4, 0, 0}, 282 {3, -14, 50, 102, -17, 4, 0, 0}, 283 {3, -13, 47, 104, -17, 4, 0, 0}, 284 {3, -13, 45, 106, -17, 4, 0, 0}, 285 {3, -12, 42, 108, -16, 3, 0, 0}, 286 {3, -11, 40, 109, -16, 3, 0, 0}, 287 {3, -11, 37, 111, -15, 3, 0, 0}, 288 {2, -10, 35, 113, -15, 3, 0, 0}, 289 {3, -10, 32, 114, -14, 3, 0, 0}, 290 {2, -9, 29, 116, -13, 3, 0, 0}, 291 {2, -8, 27, 117, -13, 3, 0, 0}, 292 {2, -8, 25, 119, -12, 2, 0, 0}, 293 {2, -7, 22, 120, -11, 2, 0, 0}, 294 {1, -6, 20, 121, -10, 2, 0, 0}, 295 {1, -6, 18, 122, -9, 2, 0, 0}, 296 {1, -5, 15, 123, -8, 2, 0, 0}, 297 {1, -4, 13, 124, -7, 1, 0, 0}, 298 {1, -4, 11, 125, -6, 1, 0, 0}, 299 {1, -3, 8, 126, -5, 1, 0, 0}, 300 {1, -2, 6, 126, -4, 1, 0, 0}, 301 {0, -1, 4, 127, -3, 1, 0, 0}, 302 {0, 0, 2, 127, -1, 0, 0, 0}, 303 // [0, 1). 304 {0, 0, 0, 127, 1, 0, 0, 0}, 305 {0, 0, -1, 127, 2, 0, 0, 0}, 306 {0, 1, -3, 127, 4, -2, 1, 0}, 307 {0, 1, -5, 127, 6, -2, 1, 0}, 308 {0, 2, -6, 126, 8, -3, 1, 0}, 309 {-1, 2, -7, 126, 11, -4, 2, -1}, 310 {-1, 3, -8, 125, 13, -5, 2, -1}, 311 {-1, 3, -10, 124, 16, -6, 3, -1}, 312 {-1, 4, -11, 123, 18, -7, 3, -1}, 313 {-1, 4, -12, 122, 20, -7, 3, -1}, 314 {-1, 4, -13, 121, 23, -8, 3, -1}, 315 {-2, 5, -14, 120, 25, -9, 4, -1}, 316 {-1, 5, -15, 119, 27, -10, 4, -1}, 317 {-1, 5, -16, 118, 30, -11, 4, -1}, 318 {-2, 6, -17, 116, 33, -12, 5, -1}, 319 {-2, 6, -17, 114, 35, -12, 5, -1}, 320 {-2, 6, -18, 113, 38, -13, 5, -1}, 321 {-2, 7, -19, 111, 41, -14, 6, -2}, 322 {-2, 7, -19, 110, 43, -15, 6, -2}, 323 {-2, 7, -20, 108, 46, -15, 6, -2}, 324 {-2, 7, -20, 106, 49, -16, 6, -2}, 325 {-2, 7, -21, 104, 51, -16, 7, -2}, 326 {-2, 7, -21, 102, 54, -17, 7, -2}, 327 {-2, 8, -21, 100, 56, -18, 7, -2}, 328 {-2, 8, -22, 98, 59, -18, 7, -2}, 329 {-2, 8, -22, 96, 62, -19, 7, -2}, 330 {-2, 8, -22, 94, 64, -19, 7, -2}, 331 {-2, 8, -22, 91, 67, -20, 8, -2}, 332 {-2, 8, -22, 89, 69, -20, 8, -2}, 333 {-2, 8, -22, 87, 72, -21, 8, -2}, 334 {-2, 8, -21, 84, 74, -21, 8, -2}, 335 {-2, 8, -22, 82, 77, -21, 8, -2}, 336 {-2, 8, -21, 79, 79, -21, 8, -2}, 337 {-2, 8, -21, 77, 82, -22, 8, -2}, 338 {-2, 8, -21, 74, 84, -21, 8, -2}, 339 {-2, 8, -21, 72, 87, -22, 8, -2}, 340 {-2, 8, -20, 69, 89, -22, 8, -2}, 341 {-2, 8, -20, 67, 91, -22, 8, -2}, 342 {-2, 7, -19, 64, 94, -22, 8, -2}, 343 {-2, 7, -19, 62, 96, -22, 8, -2}, 344 {-2, 7, -18, 59, 98, -22, 8, -2}, 345 {-2, 7, -18, 56, 100, -21, 8, -2}, 346 {-2, 7, -17, 54, 102, -21, 7, -2}, 347 {-2, 7, -16, 51, 104, -21, 7, -2}, 348 {-2, 6, -16, 49, 106, -20, 7, -2}, 349 {-2, 6, -15, 46, 108, -20, 7, -2}, 350 {-2, 6, -15, 43, 110, -19, 7, -2}, 351 {-2, 6, -14, 41, 111, -19, 7, -2}, 352 {-1, 5, -13, 38, 113, -18, 6, -2}, 353 {-1, 5, -12, 35, 114, -17, 6, -2}, 354 {-1, 5, -12, 33, 116, -17, 6, -2}, 355 {-1, 4, -11, 30, 118, -16, 5, -1}, 356 {-1, 4, -10, 27, 119, -15, 5, -1}, 357 {-1, 4, -9, 25, 120, -14, 5, -2}, 358 {-1, 3, -8, 23, 121, -13, 4, -1}, 359 {-1, 3, -7, 20, 122, -12, 4, -1}, 360 {-1, 3, -7, 18, 123, -11, 4, -1}, 361 {-1, 3, -6, 16, 124, -10, 3, -1}, 362 {-1, 2, -5, 13, 125, -8, 3, -1}, 363 {-1, 2, -4, 11, 126, -7, 2, -1}, 364 {0, 1, -3, 8, 126, -6, 2, 0}, 365 {0, 1, -2, 6, 127, -5, 1, 0}, 366 {0, 1, -2, 4, 127, -3, 1, 0}, 367 {0, 0, 0, 2, 127, -1, 0, 0}, 368 // [1, 2). 369 {0, 0, 0, 1, 127, 0, 0, 0}, 370 {0, 0, 0, -1, 127, 2, 0, 0}, 371 {0, 0, 1, -3, 127, 4, -1, 0}, 372 {0, 0, 1, -4, 126, 6, -2, 1}, 373 {0, 0, 1, -5, 126, 8, -3, 1}, 374 {0, 0, 1, -6, 125, 11, -4, 1}, 375 {0, 0, 1, -7, 124, 13, -4, 1}, 376 {0, 0, 2, -8, 123, 15, -5, 1}, 377 {0, 0, 2, -9, 122, 18, -6, 1}, 378 {0, 0, 2, -10, 121, 20, -6, 1}, 379 {0, 0, 2, -11, 120, 22, -7, 2}, 380 {0, 0, 2, -12, 119, 25, -8, 2}, 381 {0, 0, 3, -13, 117, 27, -8, 2}, 382 {0, 0, 3, -13, 116, 29, -9, 2}, 383 {0, 0, 3, -14, 114, 32, -10, 3}, 384 {0, 0, 3, -15, 113, 35, -10, 2}, 385 {0, 0, 3, -15, 111, 37, -11, 3}, 386 {0, 0, 3, -16, 109, 40, -11, 3}, 387 {0, 0, 3, -16, 108, 42, -12, 3}, 388 {0, 0, 4, -17, 106, 45, -13, 3}, 389 {0, 0, 4, -17, 104, 47, -13, 3}, 390 {0, 0, 4, -17, 102, 50, -14, 3}, 391 {0, 0, 4, -17, 100, 52, -14, 3}, 392 {0, 0, 4, -18, 98, 55, -15, 4}, 393 {0, 0, 4, -18, 96, 58, -15, 3}, 394 {0, 0, 4, -18, 94, 60, -16, 4}, 395 {0, 0, 4, -18, 91, 63, -16, 4}, 396 {0, 0, 4, -18, 89, 65, -16, 4}, 397 {0, 0, 4, -18, 87, 68, -17, 4}, 398 {0, 0, 4, -18, 85, 70, -17, 4}, 399 {0, 0, 4, -18, 82, 73, -17, 4}, 400 {0, 0, 4, -18, 80, 75, -17, 4}, 401 {0, 0, 4, -18, 78, 78, -18, 4}, 402 {0, 0, 4, -17, 75, 80, -18, 4}, 403 {0, 0, 4, -17, 73, 82, -18, 4}, 404 {0, 0, 4, -17, 70, 85, -18, 4}, 405 {0, 0, 4, -17, 68, 87, -18, 4}, 406 {0, 0, 4, -16, 65, 89, -18, 4}, 407 {0, 0, 4, -16, 63, 91, -18, 4}, 408 {0, 0, 4, -16, 60, 94, -18, 4}, 409 {0, 0, 3, -15, 58, 96, -18, 4}, 410 {0, 0, 4, -15, 55, 98, -18, 4}, 411 {0, 0, 3, -14, 52, 100, -17, 4}, 412 {0, 0, 3, -14, 50, 102, -17, 4}, 413 {0, 0, 3, -13, 47, 104, -17, 4}, 414 {0, 0, 3, -13, 45, 106, -17, 4}, 415 {0, 0, 3, -12, 42, 108, -16, 3}, 416 {0, 0, 3, -11, 40, 109, -16, 3}, 417 {0, 0, 3, -11, 37, 111, -15, 3}, 418 {0, 0, 2, -10, 35, 113, -15, 3}, 419 {0, 0, 3, -10, 32, 114, -14, 3}, 420 {0, 0, 2, -9, 29, 116, -13, 3}, 421 {0, 0, 2, -8, 27, 117, -13, 3}, 422 {0, 0, 2, -8, 25, 119, -12, 2}, 423 {0, 0, 2, -7, 22, 120, -11, 2}, 424 {0, 0, 1, -6, 20, 121, -10, 2}, 425 {0, 0, 1, -6, 18, 122, -9, 2}, 426 {0, 0, 1, -5, 15, 123, -8, 2}, 427 {0, 0, 1, -4, 13, 124, -7, 1}, 428 {0, 0, 1, -4, 11, 125, -6, 1}, 429 {0, 0, 1, -3, 8, 126, -5, 1}, 430 {0, 0, 1, -2, 6, 126, -4, 1}, 431 {0, 0, 0, -1, 4, 127, -3, 1}, 432 {0, 0, 0, 0, 2, 127, -1, 0}, 433 // dummy, replicate row index 191. 434 {0, 0, 0, 0, 2, 127, -1, 0}}; 435 436 alignas(16) const int16_t 437 kWarpedFilters[3 * kWarpedPixelPrecisionShifts + 1][8] = { 438 // [-1, 0). 439 {0, 0, 127, 1, 0, 0, 0, 0}, 440 {0, -1, 127, 2, 0, 0, 0, 0}, 441 {1, -3, 127, 4, -1, 0, 0, 0}, 442 {1, -4, 126, 6, -2, 1, 0, 0}, 443 {1, -5, 126, 8, -3, 1, 0, 0}, 444 {1, -6, 125, 11, -4, 1, 0, 0}, 445 {1, -7, 124, 13, -4, 1, 0, 0}, 446 {2, -8, 123, 15, -5, 1, 0, 0}, 447 {2, -9, 122, 18, -6, 1, 0, 0}, 448 {2, -10, 121, 20, -6, 1, 0, 0}, 449 {2, -11, 120, 22, -7, 2, 0, 0}, 450 {2, -12, 119, 25, -8, 2, 0, 0}, 451 {3, -13, 117, 27, -8, 2, 0, 0}, 452 {3, -13, 116, 29, -9, 2, 0, 0}, 453 {3, -14, 114, 32, -10, 3, 0, 0}, 454 {3, -15, 113, 35, -10, 2, 0, 0}, 455 {3, -15, 111, 37, -11, 3, 0, 0}, 456 {3, -16, 109, 40, -11, 3, 0, 0}, 457 {3, -16, 108, 42, -12, 3, 0, 0}, 458 {4, -17, 106, 45, -13, 3, 0, 0}, 459 {4, -17, 104, 47, -13, 3, 0, 0}, 460 {4, -17, 102, 50, -14, 3, 0, 0}, 461 {4, -17, 100, 52, -14, 3, 0, 0}, 462 {4, -18, 98, 55, -15, 4, 0, 0}, 463 {4, -18, 96, 58, -15, 3, 0, 0}, 464 {4, -18, 94, 60, -16, 4, 0, 0}, 465 {4, -18, 91, 63, -16, 4, 0, 0}, 466 {4, -18, 89, 65, -16, 4, 0, 0}, 467 {4, -18, 87, 68, -17, 4, 0, 0}, 468 {4, -18, 85, 70, -17, 4, 0, 0}, 469 {4, -18, 82, 73, -17, 4, 0, 0}, 470 {4, -18, 80, 75, -17, 4, 0, 0}, 471 {4, -18, 78, 78, -18, 4, 0, 0}, 472 {4, -17, 75, 80, -18, 4, 0, 0}, 473 {4, -17, 73, 82, -18, 4, 0, 0}, 474 {4, -17, 70, 85, -18, 4, 0, 0}, 475 {4, -17, 68, 87, -18, 4, 0, 0}, 476 {4, -16, 65, 89, -18, 4, 0, 0}, 477 {4, -16, 63, 91, -18, 4, 0, 0}, 478 {4, -16, 60, 94, -18, 4, 0, 0}, 479 {3, -15, 58, 96, -18, 4, 0, 0}, 480 {4, -15, 55, 98, -18, 4, 0, 0}, 481 {3, -14, 52, 100, -17, 4, 0, 0}, 482 {3, -14, 50, 102, -17, 4, 0, 0}, 483 {3, -13, 47, 104, -17, 4, 0, 0}, 484 {3, -13, 45, 106, -17, 4, 0, 0}, 485 {3, -12, 42, 108, -16, 3, 0, 0}, 486 {3, -11, 40, 109, -16, 3, 0, 0}, 487 {3, -11, 37, 111, -15, 3, 0, 0}, 488 {2, -10, 35, 113, -15, 3, 0, 0}, 489 {3, -10, 32, 114, -14, 3, 0, 0}, 490 {2, -9, 29, 116, -13, 3, 0, 0}, 491 {2, -8, 27, 117, -13, 3, 0, 0}, 492 {2, -8, 25, 119, -12, 2, 0, 0}, 493 {2, -7, 22, 120, -11, 2, 0, 0}, 494 {1, -6, 20, 121, -10, 2, 0, 0}, 495 {1, -6, 18, 122, -9, 2, 0, 0}, 496 {1, -5, 15, 123, -8, 2, 0, 0}, 497 {1, -4, 13, 124, -7, 1, 0, 0}, 498 {1, -4, 11, 125, -6, 1, 0, 0}, 499 {1, -3, 8, 126, -5, 1, 0, 0}, 500 {1, -2, 6, 126, -4, 1, 0, 0}, 501 {0, -1, 4, 127, -3, 1, 0, 0}, 502 {0, 0, 2, 127, -1, 0, 0, 0}, 503 // [0, 1). 504 {0, 0, 0, 127, 1, 0, 0, 0}, 505 {0, 0, -1, 127, 2, 0, 0, 0}, 506 {0, 1, -3, 127, 4, -2, 1, 0}, 507 {0, 1, -5, 127, 6, -2, 1, 0}, 508 {0, 2, -6, 126, 8, -3, 1, 0}, 509 {-1, 2, -7, 126, 11, -4, 2, -1}, 510 {-1, 3, -8, 125, 13, -5, 2, -1}, 511 {-1, 3, -10, 124, 16, -6, 3, -1}, 512 {-1, 4, -11, 123, 18, -7, 3, -1}, 513 {-1, 4, -12, 122, 20, -7, 3, -1}, 514 {-1, 4, -13, 121, 23, -8, 3, -1}, 515 {-2, 5, -14, 120, 25, -9, 4, -1}, 516 {-1, 5, -15, 119, 27, -10, 4, -1}, 517 {-1, 5, -16, 118, 30, -11, 4, -1}, 518 {-2, 6, -17, 116, 33, -12, 5, -1}, 519 {-2, 6, -17, 114, 35, -12, 5, -1}, 520 {-2, 6, -18, 113, 38, -13, 5, -1}, 521 {-2, 7, -19, 111, 41, -14, 6, -2}, 522 {-2, 7, -19, 110, 43, -15, 6, -2}, 523 {-2, 7, -20, 108, 46, -15, 6, -2}, 524 {-2, 7, -20, 106, 49, -16, 6, -2}, 525 {-2, 7, -21, 104, 51, -16, 7, -2}, 526 {-2, 7, -21, 102, 54, -17, 7, -2}, 527 {-2, 8, -21, 100, 56, -18, 7, -2}, 528 {-2, 8, -22, 98, 59, -18, 7, -2}, 529 {-2, 8, -22, 96, 62, -19, 7, -2}, 530 {-2, 8, -22, 94, 64, -19, 7, -2}, 531 {-2, 8, -22, 91, 67, -20, 8, -2}, 532 {-2, 8, -22, 89, 69, -20, 8, -2}, 533 {-2, 8, -22, 87, 72, -21, 8, -2}, 534 {-2, 8, -21, 84, 74, -21, 8, -2}, 535 {-2, 8, -22, 82, 77, -21, 8, -2}, 536 {-2, 8, -21, 79, 79, -21, 8, -2}, 537 {-2, 8, -21, 77, 82, -22, 8, -2}, 538 {-2, 8, -21, 74, 84, -21, 8, -2}, 539 {-2, 8, -21, 72, 87, -22, 8, -2}, 540 {-2, 8, -20, 69, 89, -22, 8, -2}, 541 {-2, 8, -20, 67, 91, -22, 8, -2}, 542 {-2, 7, -19, 64, 94, -22, 8, -2}, 543 {-2, 7, -19, 62, 96, -22, 8, -2}, 544 {-2, 7, -18, 59, 98, -22, 8, -2}, 545 {-2, 7, -18, 56, 100, -21, 8, -2}, 546 {-2, 7, -17, 54, 102, -21, 7, -2}, 547 {-2, 7, -16, 51, 104, -21, 7, -2}, 548 {-2, 6, -16, 49, 106, -20, 7, -2}, 549 {-2, 6, -15, 46, 108, -20, 7, -2}, 550 {-2, 6, -15, 43, 110, -19, 7, -2}, 551 {-2, 6, -14, 41, 111, -19, 7, -2}, 552 {-1, 5, -13, 38, 113, -18, 6, -2}, 553 {-1, 5, -12, 35, 114, -17, 6, -2}, 554 {-1, 5, -12, 33, 116, -17, 6, -2}, 555 {-1, 4, -11, 30, 118, -16, 5, -1}, 556 {-1, 4, -10, 27, 119, -15, 5, -1}, 557 {-1, 4, -9, 25, 120, -14, 5, -2}, 558 {-1, 3, -8, 23, 121, -13, 4, -1}, 559 {-1, 3, -7, 20, 122, -12, 4, -1}, 560 {-1, 3, -7, 18, 123, -11, 4, -1}, 561 {-1, 3, -6, 16, 124, -10, 3, -1}, 562 {-1, 2, -5, 13, 125, -8, 3, -1}, 563 {-1, 2, -4, 11, 126, -7, 2, -1}, 564 {0, 1, -3, 8, 126, -6, 2, 0}, 565 {0, 1, -2, 6, 127, -5, 1, 0}, 566 {0, 1, -2, 4, 127, -3, 1, 0}, 567 {0, 0, 0, 2, 127, -1, 0, 0}, 568 // [1, 2). 569 {0, 0, 0, 1, 127, 0, 0, 0}, 570 {0, 0, 0, -1, 127, 2, 0, 0}, 571 {0, 0, 1, -3, 127, 4, -1, 0}, 572 {0, 0, 1, -4, 126, 6, -2, 1}, 573 {0, 0, 1, -5, 126, 8, -3, 1}, 574 {0, 0, 1, -6, 125, 11, -4, 1}, 575 {0, 0, 1, -7, 124, 13, -4, 1}, 576 {0, 0, 2, -8, 123, 15, -5, 1}, 577 {0, 0, 2, -9, 122, 18, -6, 1}, 578 {0, 0, 2, -10, 121, 20, -6, 1}, 579 {0, 0, 2, -11, 120, 22, -7, 2}, 580 {0, 0, 2, -12, 119, 25, -8, 2}, 581 {0, 0, 3, -13, 117, 27, -8, 2}, 582 {0, 0, 3, -13, 116, 29, -9, 2}, 583 {0, 0, 3, -14, 114, 32, -10, 3}, 584 {0, 0, 3, -15, 113, 35, -10, 2}, 585 {0, 0, 3, -15, 111, 37, -11, 3}, 586 {0, 0, 3, -16, 109, 40, -11, 3}, 587 {0, 0, 3, -16, 108, 42, -12, 3}, 588 {0, 0, 4, -17, 106, 45, -13, 3}, 589 {0, 0, 4, -17, 104, 47, -13, 3}, 590 {0, 0, 4, -17, 102, 50, -14, 3}, 591 {0, 0, 4, -17, 100, 52, -14, 3}, 592 {0, 0, 4, -18, 98, 55, -15, 4}, 593 {0, 0, 4, -18, 96, 58, -15, 3}, 594 {0, 0, 4, -18, 94, 60, -16, 4}, 595 {0, 0, 4, -18, 91, 63, -16, 4}, 596 {0, 0, 4, -18, 89, 65, -16, 4}, 597 {0, 0, 4, -18, 87, 68, -17, 4}, 598 {0, 0, 4, -18, 85, 70, -17, 4}, 599 {0, 0, 4, -18, 82, 73, -17, 4}, 600 {0, 0, 4, -18, 80, 75, -17, 4}, 601 {0, 0, 4, -18, 78, 78, -18, 4}, 602 {0, 0, 4, -17, 75, 80, -18, 4}, 603 {0, 0, 4, -17, 73, 82, -18, 4}, 604 {0, 0, 4, -17, 70, 85, -18, 4}, 605 {0, 0, 4, -17, 68, 87, -18, 4}, 606 {0, 0, 4, -16, 65, 89, -18, 4}, 607 {0, 0, 4, -16, 63, 91, -18, 4}, 608 {0, 0, 4, -16, 60, 94, -18, 4}, 609 {0, 0, 3, -15, 58, 96, -18, 4}, 610 {0, 0, 4, -15, 55, 98, -18, 4}, 611 {0, 0, 3, -14, 52, 100, -17, 4}, 612 {0, 0, 3, -14, 50, 102, -17, 4}, 613 {0, 0, 3, -13, 47, 104, -17, 4}, 614 {0, 0, 3, -13, 45, 106, -17, 4}, 615 {0, 0, 3, -12, 42, 108, -16, 3}, 616 {0, 0, 3, -11, 40, 109, -16, 3}, 617 {0, 0, 3, -11, 37, 111, -15, 3}, 618 {0, 0, 2, -10, 35, 113, -15, 3}, 619 {0, 0, 3, -10, 32, 114, -14, 3}, 620 {0, 0, 2, -9, 29, 116, -13, 3}, 621 {0, 0, 2, -8, 27, 117, -13, 3}, 622 {0, 0, 2, -8, 25, 119, -12, 2}, 623 {0, 0, 2, -7, 22, 120, -11, 2}, 624 {0, 0, 1, -6, 20, 121, -10, 2}, 625 {0, 0, 1, -6, 18, 122, -9, 2}, 626 {0, 0, 1, -5, 15, 123, -8, 2}, 627 {0, 0, 1, -4, 13, 124, -7, 1}, 628 {0, 0, 1, -4, 11, 125, -6, 1}, 629 {0, 0, 1, -3, 8, 126, -5, 1}, 630 {0, 0, 1, -2, 6, 126, -4, 1}, 631 {0, 0, 0, -1, 4, 127, -3, 1}, 632 {0, 0, 0, 0, 2, 127, -1, 0}, 633 // dummy, replicate row index 191. 634 {0, 0, 0, 0, 2, 127, -1, 0}}; 635 636 // Every value in |kSubPixelFilters| is even. Divide by 2 to simplify 637 // calculations by reducing the range by 1 bit. 638 alignas(8) const int8_t kHalfSubPixelFilters[6][16][8] = { 639 {{0, 0, 0, 64, 0, 0, 0, 0}, 640 {0, 1, -3, 63, 4, -1, 0, 0}, 641 {0, 1, -5, 61, 9, -2, 0, 0}, 642 {0, 1, -6, 58, 14, -4, 1, 0}, 643 {0, 1, -7, 55, 19, -5, 1, 0}, 644 {0, 1, -7, 51, 24, -6, 1, 0}, 645 {0, 1, -8, 47, 29, -6, 1, 0}, 646 {0, 1, -7, 42, 33, -6, 1, 0}, 647 {0, 1, -7, 38, 38, -7, 1, 0}, 648 {0, 1, -6, 33, 42, -7, 1, 0}, 649 {0, 1, -6, 29, 47, -8, 1, 0}, 650 {0, 1, -6, 24, 51, -7, 1, 0}, 651 {0, 1, -5, 19, 55, -7, 1, 0}, 652 {0, 1, -4, 14, 58, -6, 1, 0}, 653 {0, 0, -2, 9, 61, -5, 1, 0}, 654 {0, 0, -1, 4, 63, -3, 1, 0}}, 655 {{0, 0, 0, 64, 0, 0, 0, 0}, 656 {0, 1, 14, 31, 17, 1, 0, 0}, 657 {0, 0, 13, 31, 18, 2, 0, 0}, 658 {0, 0, 11, 31, 20, 2, 0, 0}, 659 {0, 0, 10, 30, 21, 3, 0, 0}, 660 {0, 0, 9, 29, 22, 4, 0, 0}, 661 {0, 0, 8, 28, 23, 5, 0, 0}, 662 {0, -1, 8, 27, 24, 6, 0, 0}, 663 {0, -1, 7, 26, 26, 7, -1, 0}, 664 {0, 0, 6, 24, 27, 8, -1, 0}, 665 {0, 0, 5, 23, 28, 8, 0, 0}, 666 {0, 0, 4, 22, 29, 9, 0, 0}, 667 {0, 0, 3, 21, 30, 10, 0, 0}, 668 {0, 0, 2, 20, 31, 11, 0, 0}, 669 {0, 0, 2, 18, 31, 13, 0, 0}, 670 {0, 0, 1, 17, 31, 14, 1, 0}}, 671 {{0, 0, 0, 64, 0, 0, 0, 0}, 672 {-1, 1, -3, 63, 4, -1, 1, 0}, 673 {-1, 3, -6, 62, 8, -3, 2, -1}, 674 {-1, 4, -9, 60, 13, -5, 3, -1}, 675 {-2, 5, -11, 58, 19, -7, 3, -1}, 676 {-2, 5, -11, 54, 24, -9, 4, -1}, 677 {-2, 5, -12, 50, 30, -10, 4, -1}, 678 {-2, 5, -12, 45, 35, -11, 5, -1}, 679 {-2, 6, -12, 40, 40, -12, 6, -2}, 680 {-1, 5, -11, 35, 45, -12, 5, -2}, 681 {-1, 4, -10, 30, 50, -12, 5, -2}, 682 {-1, 4, -9, 24, 54, -11, 5, -2}, 683 {-1, 3, -7, 19, 58, -11, 5, -2}, 684 {-1, 3, -5, 13, 60, -9, 4, -1}, 685 {-1, 2, -3, 8, 62, -6, 3, -1}, 686 {0, 1, -1, 4, 63, -3, 1, -1}}, 687 {{0, 0, 0, 64, 0, 0, 0, 0}, 688 {0, 0, 0, 60, 4, 0, 0, 0}, 689 {0, 0, 0, 56, 8, 0, 0, 0}, 690 {0, 0, 0, 52, 12, 0, 0, 0}, 691 {0, 0, 0, 48, 16, 0, 0, 0}, 692 {0, 0, 0, 44, 20, 0, 0, 0}, 693 {0, 0, 0, 40, 24, 0, 0, 0}, 694 {0, 0, 0, 36, 28, 0, 0, 0}, 695 {0, 0, 0, 32, 32, 0, 0, 0}, 696 {0, 0, 0, 28, 36, 0, 0, 0}, 697 {0, 0, 0, 24, 40, 0, 0, 0}, 698 {0, 0, 0, 20, 44, 0, 0, 0}, 699 {0, 0, 0, 16, 48, 0, 0, 0}, 700 {0, 0, 0, 12, 52, 0, 0, 0}, 701 {0, 0, 0, 8, 56, 0, 0, 0}, 702 {0, 0, 0, 4, 60, 0, 0, 0}}, 703 {{0, 0, 0, 64, 0, 0, 0, 0}, 704 {0, 0, -2, 63, 4, -1, 0, 0}, 705 {0, 0, -4, 61, 9, -2, 0, 0}, 706 {0, 0, -5, 58, 14, -3, 0, 0}, 707 {0, 0, -6, 55, 19, -4, 0, 0}, 708 {0, 0, -6, 51, 24, -5, 0, 0}, 709 {0, 0, -7, 47, 29, -5, 0, 0}, 710 {0, 0, -6, 42, 33, -5, 0, 0}, 711 {0, 0, -6, 38, 38, -6, 0, 0}, 712 {0, 0, -5, 33, 42, -6, 0, 0}, 713 {0, 0, -5, 29, 47, -7, 0, 0}, 714 {0, 0, -5, 24, 51, -6, 0, 0}, 715 {0, 0, -4, 19, 55, -6, 0, 0}, 716 {0, 0, -3, 14, 58, -5, 0, 0}, 717 {0, 0, -2, 9, 61, -4, 0, 0}, 718 {0, 0, -1, 4, 63, -2, 0, 0}}, 719 {{0, 0, 0, 64, 0, 0, 0, 0}, 720 {0, 0, 15, 31, 17, 1, 0, 0}, 721 {0, 0, 13, 31, 18, 2, 0, 0}, 722 {0, 0, 11, 31, 20, 2, 0, 0}, 723 {0, 0, 10, 30, 21, 3, 0, 0}, 724 {0, 0, 9, 29, 22, 4, 0, 0}, 725 {0, 0, 8, 28, 23, 5, 0, 0}, 726 {0, 0, 7, 27, 24, 6, 0, 0}, 727 {0, 0, 6, 26, 26, 6, 0, 0}, 728 {0, 0, 6, 24, 27, 7, 0, 0}, 729 {0, 0, 5, 23, 28, 8, 0, 0}, 730 {0, 0, 4, 22, 29, 9, 0, 0}, 731 {0, 0, 3, 21, 30, 10, 0, 0}, 732 {0, 0, 2, 20, 31, 11, 0, 0}, 733 {0, 0, 2, 18, 31, 13, 0, 0}, 734 {0, 0, 1, 17, 31, 15, 0, 0}}}; 735 736 // Absolute values of |kHalfSubPixelFilters|. Used in situations where we know 737 // the pattern of the signs and account for it in other ways. 738 const uint8_t kAbsHalfSubPixelFilters[6][16][8] = { 739 {{0, 0, 0, 64, 0, 0, 0, 0}, 740 {0, 1, 3, 63, 4, 1, 0, 0}, 741 {0, 1, 5, 61, 9, 2, 0, 0}, 742 {0, 1, 6, 58, 14, 4, 1, 0}, 743 {0, 1, 7, 55, 19, 5, 1, 0}, 744 {0, 1, 7, 51, 24, 6, 1, 0}, 745 {0, 1, 8, 47, 29, 6, 1, 0}, 746 {0, 1, 7, 42, 33, 6, 1, 0}, 747 {0, 1, 7, 38, 38, 7, 1, 0}, 748 {0, 1, 6, 33, 42, 7, 1, 0}, 749 {0, 1, 6, 29, 47, 8, 1, 0}, 750 {0, 1, 6, 24, 51, 7, 1, 0}, 751 {0, 1, 5, 19, 55, 7, 1, 0}, 752 {0, 1, 4, 14, 58, 6, 1, 0}, 753 {0, 0, 2, 9, 61, 5, 1, 0}, 754 {0, 0, 1, 4, 63, 3, 1, 0}}, 755 {{0, 0, 0, 64, 0, 0, 0, 0}, 756 {0, 1, 14, 31, 17, 1, 0, 0}, 757 {0, 0, 13, 31, 18, 2, 0, 0}, 758 {0, 0, 11, 31, 20, 2, 0, 0}, 759 {0, 0, 10, 30, 21, 3, 0, 0}, 760 {0, 0, 9, 29, 22, 4, 0, 0}, 761 {0, 0, 8, 28, 23, 5, 0, 0}, 762 {0, 1, 8, 27, 24, 6, 0, 0}, 763 {0, 1, 7, 26, 26, 7, 1, 0}, 764 {0, 0, 6, 24, 27, 8, 1, 0}, 765 {0, 0, 5, 23, 28, 8, 0, 0}, 766 {0, 0, 4, 22, 29, 9, 0, 0}, 767 {0, 0, 3, 21, 30, 10, 0, 0}, 768 {0, 0, 2, 20, 31, 11, 0, 0}, 769 {0, 0, 2, 18, 31, 13, 0, 0}, 770 {0, 0, 1, 17, 31, 14, 1, 0}}, 771 {{0, 0, 0, 64, 0, 0, 0, 0}, 772 {1, 1, 3, 63, 4, 1, 1, 0}, 773 {1, 3, 6, 62, 8, 3, 2, 1}, 774 {1, 4, 9, 60, 13, 5, 3, 1}, 775 {2, 5, 11, 58, 19, 7, 3, 1}, 776 {2, 5, 11, 54, 24, 9, 4, 1}, 777 {2, 5, 12, 50, 30, 10, 4, 1}, 778 {2, 5, 12, 45, 35, 11, 5, 1}, 779 {2, 6, 12, 40, 40, 12, 6, 2}, 780 {1, 5, 11, 35, 45, 12, 5, 2}, 781 {1, 4, 10, 30, 50, 12, 5, 2}, 782 {1, 4, 9, 24, 54, 11, 5, 2}, 783 {1, 3, 7, 19, 58, 11, 5, 2}, 784 {1, 3, 5, 13, 60, 9, 4, 1}, 785 {1, 2, 3, 8, 62, 6, 3, 1}, 786 {0, 1, 1, 4, 63, 3, 1, 1}}, 787 {{0, 0, 0, 64, 0, 0, 0, 0}, 788 {0, 0, 0, 60, 4, 0, 0, 0}, 789 {0, 0, 0, 56, 8, 0, 0, 0}, 790 {0, 0, 0, 52, 12, 0, 0, 0}, 791 {0, 0, 0, 48, 16, 0, 0, 0}, 792 {0, 0, 0, 44, 20, 0, 0, 0}, 793 {0, 0, 0, 40, 24, 0, 0, 0}, 794 {0, 0, 0, 36, 28, 0, 0, 0}, 795 {0, 0, 0, 32, 32, 0, 0, 0}, 796 {0, 0, 0, 28, 36, 0, 0, 0}, 797 {0, 0, 0, 24, 40, 0, 0, 0}, 798 {0, 0, 0, 20, 44, 0, 0, 0}, 799 {0, 0, 0, 16, 48, 0, 0, 0}, 800 {0, 0, 0, 12, 52, 0, 0, 0}, 801 {0, 0, 0, 8, 56, 0, 0, 0}, 802 {0, 0, 0, 4, 60, 0, 0, 0}}, 803 {{0, 0, 0, 64, 0, 0, 0, 0}, 804 {0, 0, 2, 63, 4, 1, 0, 0}, 805 {0, 0, 4, 61, 9, 2, 0, 0}, 806 {0, 0, 5, 58, 14, 3, 0, 0}, 807 {0, 0, 6, 55, 19, 4, 0, 0}, 808 {0, 0, 6, 51, 24, 5, 0, 0}, 809 {0, 0, 7, 47, 29, 5, 0, 0}, 810 {0, 0, 6, 42, 33, 5, 0, 0}, 811 {0, 0, 6, 38, 38, 6, 0, 0}, 812 {0, 0, 5, 33, 42, 6, 0, 0}, 813 {0, 0, 5, 29, 47, 7, 0, 0}, 814 {0, 0, 5, 24, 51, 6, 0, 0}, 815 {0, 0, 4, 19, 55, 6, 0, 0}, 816 {0, 0, 3, 14, 58, 5, 0, 0}, 817 {0, 0, 2, 9, 61, 4, 0, 0}, 818 {0, 0, 1, 4, 63, 2, 0, 0}}, 819 {{0, 0, 0, 64, 0, 0, 0, 0}, 820 {0, 0, 15, 31, 17, 1, 0, 0}, 821 {0, 0, 13, 31, 18, 2, 0, 0}, 822 {0, 0, 11, 31, 20, 2, 0, 0}, 823 {0, 0, 10, 30, 21, 3, 0, 0}, 824 {0, 0, 9, 29, 22, 4, 0, 0}, 825 {0, 0, 8, 28, 23, 5, 0, 0}, 826 {0, 0, 7, 27, 24, 6, 0, 0}, 827 {0, 0, 6, 26, 26, 6, 0, 0}, 828 {0, 0, 6, 24, 27, 7, 0, 0}, 829 {0, 0, 5, 23, 28, 8, 0, 0}, 830 {0, 0, 4, 22, 29, 9, 0, 0}, 831 {0, 0, 3, 21, 30, 10, 0, 0}, 832 {0, 0, 2, 20, 31, 11, 0, 0}, 833 {0, 0, 2, 18, 31, 13, 0, 0}, 834 {0, 0, 1, 17, 31, 15, 0, 0}}}; 835 836 // 9.3 -- Dr_Intra_Derivative[] 837 // This is a more compact version of the table from the spec. angle / 2 - 1 is 838 // used as the lookup. Note angle / 3 - 1 would work too, but the calculation 839 // becomes more costly. 840 const int16_t kDirectionalIntraPredictorDerivative[44] = { 841 // Approx angle 842 1023, 0, // 3, ... 843 547, // 6, ... 844 372, 0, 0, // 9, ... 845 273, // 14, ... 846 215, 0, // 17, ... 847 178, // 20, ... 848 151, 0, // 23, ... (113 & 203 are base angles) 849 132, // 26, ... 850 116, 0, // 29, ... 851 102, 0, // 32, ... 852 90, // 36, ... 853 80, 0, // 39, ... 854 71, // 42, ... 855 64, 0, // 45, ... (45 & 135 are base angles) 856 57, // 48, ... 857 51, 0, // 51, ... 858 45, 0, // 54, ... 859 40, // 58, ... 860 35, 0, // 61, ... 861 31, // 64, ... 862 27, 0, // 67, ... (67 & 157 are base angles) 863 23, // 70, ... 864 19, 0, // 73, ... 865 15, 0, // 76, ... 866 11, 0, // 81, ... 867 7, // 84, ... 868 3, // 87, ... 869 }; 870 871 const uint8_t kDeblockFilterLevelIndex[kMaxPlanes][kNumLoopFilterTypes] = { 872 {0, 1}, {2, 2}, {3, 3}}; 873 874 const int8_t kMaskIdLookup[4][kMaxBlockSizes] = { 875 // transform size 4x4. 876 {0, 1, 13, 2, 3, 4, 15, 14, 5, 6, 7, 877 17, 16, 8, 9, 10, 18, 11, 12, -1, -1, -1}, 878 // transform size 8x8. 879 {-1, -1, -1, -1, 19, 20, 29, -1, 21, 22, 23, 880 31, 30, 24, 25, 26, 32, 27, 28, -1, -1, -1}, 881 // transform size 16x16. 882 {-1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 34, 883 40, -1, 35, 36, 37, 41, 38, 39, -1, -1, -1}, 884 // transform size 32x32. 885 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 886 -1, -1, -1, 42, 43, -1, 44, 45, -1, -1, -1}, 887 }; 888 889 const int8_t kVerticalBorderMaskIdLookup[kMaxBlockSizes] = { 890 0, 47, 61, 49, 19, 51, 63, 62, 53, 33, 55, 891 65, 64, 57, 42, 59, 66, 60, 46, -1, -1, -1}; 892 893 const uint64_t kTopMaskLookup[67][4] = { 894 // transform size 4X4 895 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 896 0x0000000000000000ULL}, // block size 4X4, transform size 4X4 897 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 898 0x0000000000000000ULL}, // block size 4X8, transform size 4X4 899 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 900 0x0000000000000000ULL}, // block size 8X4, transform size 4X4 901 {0x0000000000030003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 902 0x0000000000000000ULL}, // block size 8X8, transform size 4X4 903 {0x0003000300030003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 904 0x0000000000000000ULL}, // block size 8X16, transform size 4X4 905 {0x00000000000f000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 906 0x0000000000000000ULL}, // block size 16X8, transform size 4X4 907 {0x000f000f000f000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 908 0x0000000000000000ULL}, // block size 16X16, transform size 4X4 909 {0x000f000f000f000fULL, 0x000f000f000f000fULL, 0x0000000000000000ULL, 910 0x0000000000000000ULL}, // block size 16X32, transform size 4X4 911 {0x00ff00ff00ff00ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 912 0x0000000000000000ULL}, // block size 32X16, transform size 4X4 913 {0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 0x0000000000000000ULL, 914 0x0000000000000000ULL}, // block size 32X32, transform size 4X4 915 {0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 916 0x00ff00ff00ff00ffULL}, // block size 32X64, transform size 4X4 917 {0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x0000000000000000ULL, 918 0x0000000000000000ULL}, // block size 64X32, transform size 4X4 919 {0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 920 0xffffffffffffffffULL}, // block size 64X64, transform size 4x4 921 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 922 0x0000000000000000ULL}, // block size 4X16, transform size 4X4 923 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 924 0x0000000000000000ULL}, // block size 16X4, transform size 4X4 925 {0x0003000300030003ULL, 0x0003000300030003ULL, 0x0000000000000000ULL, 926 0x0000000000000000ULL}, // block size 8X32, transform size 4X4 927 {0x0000000000ff00ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 928 0x0000000000000000ULL}, // block size 32X8, transform size 4X4 929 {0x000f000f000f000fULL, 0x000f000f000f000fULL, 0x000f000f000f000fULL, 930 0x000f000f000f000fULL}, // block size 16X64, transform size 4X4 931 {0xffffffffffffffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 932 0x0000000000000000ULL}, // block size 64X16, transform size 4X4 933 // transform size 8X8 934 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 935 0x0000000000000000ULL}, // block size 8X8, transform size 8X8 936 {0x0000000300000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 937 0x0000000000000000ULL}, // block size 8X16, transform size 8X8 938 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 939 0x0000000000000000ULL}, // block size 16X8, transform size 8X8 940 {0x0000000f0000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 941 0x0000000000000000ULL}, // block size 16X16, transform size 8X8 942 {0x0000000f0000000fULL, 0x0000000f0000000fULL, 0x0000000000000000ULL, 943 0x0000000000000000ULL}, // block size 16X32, transform size 8X8 944 {0x000000ff000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 945 0x0000000000000000ULL}, // block size 32X16, transform size 8X8 946 {0x000000ff000000ffULL, 0x000000ff000000ffULL, 0x0000000000000000ULL, 947 0x0000000000000000ULL}, // block size 32X32, transform size 8X8 948 {0x000000ff000000ffULL, 0x000000ff000000ffULL, 0x000000ff000000ffULL, 949 0x000000ff000000ffULL}, // block size 32X64, transform size 8X8 950 {0x0000ffff0000ffffULL, 0x0000ffff0000ffffULL, 0x0000000000000000ULL, 951 0x0000000000000000ULL}, // block size 64X32, transform size 8X8 952 {0x0000ffff0000ffffULL, 0x0000ffff0000ffffULL, 0x0000ffff0000ffffULL, 953 0x0000ffff0000ffffULL}, // block size 64X64, transform size 8X8 954 {0x0000000300000003ULL, 0x0000000300000003ULL, 0x0000000000000000ULL, 955 0x0000000000000000ULL}, // block size 8X32, transform size 8X8 956 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 957 0x0000000000000000ULL}, // block size 32X8, transform size 8X8 958 {0x0000000f0000000fULL, 0x0000000f0000000fULL, 0x0000000f0000000fULL, 959 0x0000000f0000000fULL}, // block size 16X64, transform size 8X8 960 {0x0000ffff0000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 961 0x0000000000000000ULL}, // block size 64X16, transform size 8X8 962 // transform size 16X16 963 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 964 0x0000000000000000ULL}, // block size 16X16, transform size 16X16 965 {0x000000000000000fULL, 0x000000000000000fULL, 0x0000000000000000ULL, 966 0x0000000000000000ULL}, // block size 16X32, transform size 16X16 967 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 968 0x0000000000000000ULL}, // block size 32X16, transform size 16X16 969 {0x00000000000000ffULL, 0x00000000000000ffULL, 0x0000000000000000ULL, 970 0x0000000000000000ULL}, // block size 32X32, transform size 16X16 971 {0x00000000000000ffULL, 0x00000000000000ffULL, 0x00000000000000ffULL, 972 0x00000000000000ffULL}, // block size 32X64, transform size 16X16 973 {0x000000000000ffffULL, 0x000000000000ffffULL, 0x0000000000000000ULL, 974 0x0000000000000000ULL}, // block size 64X32, transform size 16X16 975 {0x000000000000ffffULL, 0x000000000000ffffULL, 0x000000000000ffffULL, 976 0x000000000000ffffULL}, // block size 64X64, transform size 16X16 977 {0x000000000000000fULL, 0x000000000000000fULL, 0x000000000000000fULL, 978 0x000000000000000fULL}, // block size 16X64, transform size 16X16 979 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 980 0x0000000000000000ULL}, // block size 64X16, transform size 16X16 981 // transform size 32X32 982 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 983 0x0000000000000000ULL}, // block size 32X32, transform size 32X32 984 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x00000000000000ffULL, 985 0x0000000000000000ULL}, // block size 32X64, transform size 32X32 986 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 987 0x0000000000000000ULL}, // block size 64X32, transform size 32X32 988 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x000000000000ffffULL, 989 0x0000000000000000ULL}, // block size 64X64, transform size 32X32 990 // transform size 64X64 991 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 992 0x0000000000000000ULL}, // block size 64X64, transform size 64X64 993 // 2:1, 1:2 transform sizes. 994 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 995 0x0000000000000000ULL}, // block size 4X8, transform size 4X8 996 {0x0000000100000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 997 0x0000000000000000ULL}, // block size 4X16, transform size 4X8 998 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 999 0x0000000000000000ULL}, // block size 8X4, transform size 8X4 1000 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1001 0x0000000000000000ULL}, // block size 16X4, transform size 8X4 1002 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1003 0x0000000000000000ULL}, // block size 8X16, transform size 8X16 1004 {0x0000000000000003ULL, 0x0000000000000003ULL, 0x0000000000000000ULL, 1005 0x0000000000000000ULL}, // block size 8X32, transform size 8X16 1006 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1007 0x0000000000000000ULL}, // block size 16X8, transform size 16X8 1008 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1009 0x0000000000000000ULL}, // block size 32X8, transform size 16X8 1010 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1011 0x0000000000000000ULL}, // block size 16X32, transform size 16X32 1012 {0x000000000000000fULL, 0x0000000000000000ULL, 0x000000000000000fULL, 1013 0x0000000000000000ULL}, // block size 16X64, transform size 16X32 1014 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1015 0x0000000000000000ULL}, // block size 32X16, transform size 32X16 1016 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1017 0x0000000000000000ULL}, // block size 64X16, transform size 32X16 1018 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1019 0x0000000000000000ULL}, // block size 32X64, transform size 32X64 1020 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1021 0x0000000000000000ULL}, // block size 64X32, transform size 64X32 1022 // 4:1, 1:4 transform sizes. 1023 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1024 0x0000000000000000ULL}, // block size 4X16, transform size 4X16 1025 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1026 0x0000000000000000ULL}, // block size 16X4, transform size 16X4 1027 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1028 0x0000000000000000ULL}, // block size 8X32, transform size 8X32 1029 {0x00000000000000ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1030 0x0000000000000000ULL}, // block size 32X8, transform size 32X8 1031 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1032 0x0000000000000000ULL}, // block size 16X64, transform size 16X64 1033 {0x000000000000ffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1034 0x0000000000000000ULL}, // block size 64X16, transform size 64X16 1035 }; 1036 1037 const uint64_t kLeftMaskLookup[67][4] = { 1038 // transform size 4X4 1039 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1040 0x0000000000000000ULL}, // block size 4X4, transform size 4X4 1041 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1042 0x0000000000000000ULL}, // block size 4X8, transform size 4X4 1043 {0x0000000000000003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1044 0x0000000000000000ULL}, // block size 8X4, transform size 4X4 1045 {0x0000000000030003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1046 0x0000000000000000ULL}, // block size 8X8, transform size 4X4 1047 {0x0003000300030003ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1048 0x0000000000000000ULL}, // block size 8X16, transform size 4X4 1049 {0x00000000000f000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1050 0x0000000000000000ULL}, // block size 16X8, transform size 4X4 1051 {0x000f000f000f000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1052 0x0000000000000000ULL}, // block size 16X16, transform size 4X4 1053 {0x000f000f000f000fULL, 0x000f000f000f000fULL, 0x0000000000000000ULL, 1054 0x0000000000000000ULL}, // block size 16X32, transform size 4X4 1055 {0x00ff00ff00ff00ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1056 0x0000000000000000ULL}, // block size 32X16, transform size 4X4 1057 {0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 0x0000000000000000ULL, 1058 0x0000000000000000ULL}, // block size 32X32, transform size 4X4 1059 {0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 0x00ff00ff00ff00ffULL, 1060 0x00ff00ff00ff00ffULL}, // block size 32X64, transform size 4X4 1061 {0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x0000000000000000ULL, 1062 0x0000000000000000ULL}, // block size 64X32, transform size 4X4 1063 {0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 1064 0xffffffffffffffffULL}, // block size 64X64, transform size 4X4 1065 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1066 0x0000000000000000ULL}, // block size 4X16, transform size 4X4 1067 {0x000000000000000fULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1068 0x0000000000000000ULL}, // block size 16X4, transform size 4X4 1069 {0x0003000300030003ULL, 0x0003000300030003ULL, 0x0000000000000000ULL, 1070 0x0000000000000000ULL}, // block size 8X32, transform size 4X4 1071 {0x0000000000ff00ffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1072 0x0000000000000000ULL}, // block size 32X8, transform size 4X4 1073 {0x000f000f000f000fULL, 0x000f000f000f000fULL, 0x000f000f000f000fULL, 1074 0x000f000f000f000fULL}, // block size 16X64, transform size 4X4 1075 {0xffffffffffffffffULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1076 0x0000000000000000ULL}, // block size 64X16, transform size 4X4 1077 // transform size 8X8 1078 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1079 0x0000000000000000ULL}, // block size 8X8, transform size 8X8 1080 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1081 0x0000000000000000ULL}, // block size 8X16, transform size 8X8 1082 {0x0000000000050005ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1083 0x0000000000000000ULL}, // block size 16X8, transform size 8X8 1084 {0x0005000500050005ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1085 0x0000000000000000ULL}, // block size 16X16, transform size 8X8 1086 {0x0005000500050005ULL, 0x0005000500050005ULL, 0x0000000000000000ULL, 1087 0x0000000000000000ULL}, // block size 16X32, transform size 8X8 1088 {0x0055005500550055ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1089 0x0000000000000000ULL}, // block size 32X16, transform size 8X8 1090 {0x0055005500550055ULL, 0x0055005500550055ULL, 0x0000000000000000ULL, 1091 0x0000000000000000ULL}, // block size 32X32, transform size 8X8 1092 {0x0055005500550055ULL, 0x0055005500550055ULL, 0x0055005500550055ULL, 1093 0x0055005500550055ULL}, // block size 32X64, transform size 8X8 1094 {0x5555555555555555ULL, 0x5555555555555555ULL, 0x0000000000000000ULL, 1095 0x0000000000000000ULL}, // block size 64X32, transform size 8X8 1096 {0x5555555555555555ULL, 0x5555555555555555ULL, 0x5555555555555555ULL, 1097 0x5555555555555555ULL}, // block size 64X64, transform size 8X8 1098 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1099 0x0000000000000000ULL}, // block size 8X32, transform size 8X8 1100 {0x0000000000550055ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1101 0x0000000000000000ULL}, // block size 32X8, transform size 8X8 1102 {0x0005000500050005ULL, 0x0005000500050005ULL, 0x0005000500050005ULL, 1103 0x0005000500050005ULL}, // block size 16X64, transform size 8X8 1104 {0x5555555555555555ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1105 0x0000000000000000ULL}, // block size 64X16, transform size 8X8 1106 // transform size 16X16 1107 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1108 0x0000000000000000ULL}, // block size 16X16, transform size 16X16 1109 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1110 0x0000000000000000ULL}, // block size 16X32, transform size 16X16 1111 {0x0011001100110011ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1112 0x0000000000000000ULL}, // block size 32X16, transform size 16X16 1113 {0x0011001100110011ULL, 0x0011001100110011ULL, 0x0000000000000000ULL, 1114 0x0000000000000000ULL}, // block size 32X32, transform size 16X16 1115 {0x0011001100110011ULL, 0x0011001100110011ULL, 0x0011001100110011ULL, 1116 0x0011001100110011ULL}, // block size 32X64, transform size 16X16 1117 {0x1111111111111111ULL, 0x1111111111111111ULL, 0x0000000000000000ULL, 1118 0x0000000000000000ULL}, // block size 64X32, transform size 16X16 1119 {0x1111111111111111ULL, 0x1111111111111111ULL, 0x1111111111111111ULL, 1120 0x1111111111111111ULL}, // block size 64X64, transform size 16X16 1121 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 1122 0x0001000100010001ULL}, // block size 16X64, transform size 16X16 1123 {0x1111111111111111ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1124 0x0000000000000000ULL}, // block size 64X16, transform size 16X16 1125 // transform size 32X32 1126 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1127 0x0000000000000000ULL}, // block size 32X32, transform size 32X32 1128 {0x0101010101010101ULL, 0x0101010101010101ULL, 0x0101010101010101ULL, 1129 0x0101010101010101ULL}, // block size 32X64, transform size 32X32 1130 {0x0101010101010101ULL, 0x0101010101010101ULL, 0x0000000000000000ULL, 1131 0x0000000000000000ULL}, // block size 64X32, transform size 32X32 1132 {0x0101010101010101ULL, 0x0101010101010101ULL, 0x0101010101010101ULL, 1133 0x0101010101010101ULL}, // block size 64X64, transform size 32X32 1134 // transform size 64X64 1135 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 1136 0x0001000100010001ULL}, // block size 64X64, transform size 64X64 1137 // 2:1, 1:2 transform sizes. 1138 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1139 0x0000000000000000ULL}, // block size 4X8, transform size 4X8 1140 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1141 0x0000000000000000ULL}, // block size 4X16, transform size 4X8 1142 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1143 0x0000000000000000ULL}, // block size 8X4, transform size 8X4 1144 {0x0000000000000005ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1145 0x0000000000000000ULL}, // block size 16X4, transform size 8X4 1146 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1147 0x0000000000000000ULL}, // block size 8X16, transform size 8X16 1148 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1149 0x0000000000000000ULL}, // block size 8X32, transform size 8X16 1150 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1151 0x0000000000000000ULL}, // block size 16X8, transform size 16X8 1152 {0x0000000000110011ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1153 0x0000000000000000ULL}, // block size 32X8, transform size 16X8 1154 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1155 0x0000000000000000ULL}, // block size 16X32, transform size 16X32 1156 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 1157 0x0001000100010001ULL}, // block size 16X64, transform size 16X32 1158 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1159 0x0000000000000000ULL}, // block size 32X16, transform size 32X16 1160 {0x0101010101010101ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1161 0x0000000000000000ULL}, // block size 64X16, transform size 32X16 1162 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 1163 0x0001000100010001ULL}, // block size 32X64, transform size 32X64 1164 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1165 0x0000000000000000ULL}, // block size 64X32, transform size 64X32 1166 // 4:1, 1:4 transform sizes. 1167 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1168 0x0000000000000000ULL}, // block size 4X16, transform size 4X16 1169 {0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1170 0x0000000000000000ULL}, // block size 16X4, transform size 16X4 1171 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0000000000000000ULL, 1172 0x0000000000000000ULL}, // block size 8X32, transform size 8X32 1173 {0x0000000000010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1174 0x0000000000000000ULL}, // block size 32X8, transform size 32X8 1175 {0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 1176 0x0001000100010001ULL}, // block size 16X64, transform size 16X64 1177 {0x0001000100010001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 1178 0x0000000000000000ULL}, // block size 64X16, transform size 64X16 1179 }; 1180 1181 } // namespace libgav1 1182