Luts.cs
1 using Ryujinx.Common.Memory; 2 using Ryujinx.Graphics.Nvdec.Vp9.Types; 3 using System; 4 5 namespace Ryujinx.Graphics.Nvdec.Vp9 6 { 7 internal static class Luts 8 { 9 public static ReadOnlySpan<byte> SizeGroupLookup => new byte[] { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 }; 10 11 public static readonly BlockSize[][] SubsizeLookup = { 12 new[] 13 { // PARTITION_NONE 14 BlockSize.Block4x4, BlockSize.Block4x8, BlockSize.Block8x4, BlockSize.Block8x8, BlockSize.Block8x16, BlockSize.Block16x8, 15 BlockSize.Block16x16, BlockSize.Block16x32, BlockSize.Block32x16, BlockSize.Block32x32, BlockSize.Block32x64, 16 BlockSize.Block64x32, BlockSize.Block64x64, 17 }, 18 new[] 19 { // PARTITION_HORZ 20 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block8x4, BlockSize.BlockInvalid, 21 BlockSize.BlockInvalid, BlockSize.Block16x8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x16, 22 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block64x32, 23 }, 24 new[] 25 { // PARTITION_VERT 26 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4x8, BlockSize.BlockInvalid, 27 BlockSize.BlockInvalid, BlockSize.Block8x16, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16x32, 28 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x64, 29 }, 30 new[] 31 { // PARTITION_SPLIT 32 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4x4, BlockSize.BlockInvalid, 33 BlockSize.BlockInvalid, BlockSize.Block8x8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16x16, 34 BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x32, 35 }, 36 }; 37 38 public static readonly TxSize[] MaxTxSizeLookup = { 39 TxSize.Tx4x4, TxSize.Tx4x4, TxSize.Tx4x4, TxSize.Tx8x8, TxSize.Tx8x8, TxSize.Tx8x8, TxSize.Tx16x16, 40 TxSize.Tx16x16, TxSize.Tx16x16, TxSize.Tx32x32, TxSize.Tx32x32, TxSize.Tx32x32, TxSize.Tx32x32, 41 }; 42 43 public static readonly TxSize[] TxModeToBiggestTxSize = { 44 TxSize.Tx4x4, // ONLY_4X4 45 TxSize.Tx8x8, // ALLOW_8X8 46 TxSize.Tx16x16, // ALLOW_16X16 47 TxSize.Tx32x32, // ALLOW_32X32 48 TxSize.Tx32x32, // TX_MODE_SELECT 49 }; 50 51 public static readonly BlockSize[][][] SsSizeLookup = { 52 // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1 53 // ss_y == 0 ss_y == 1 ss_y == 0 ss_y == 1 54 new[] { new[] { BlockSize.Block4x4, BlockSize.BlockInvalid }, new[] { BlockSize.BlockInvalid, BlockSize.BlockInvalid } }, 55 new[] { new[] { BlockSize.Block4x8, BlockSize.Block4x4 }, new[] { BlockSize.BlockInvalid, BlockSize.BlockInvalid } }, 56 new[] { new[] { BlockSize.Block8x4, BlockSize.BlockInvalid }, new[] { BlockSize.Block4x4, BlockSize.BlockInvalid } }, 57 new[] { new[] { BlockSize.Block8x8, BlockSize.Block8x4 }, new[] { BlockSize.Block4x8, BlockSize.Block4x4 } }, 58 new[] { new[] { BlockSize.Block8x16, BlockSize.Block8x8 }, new[] { BlockSize.BlockInvalid, BlockSize.Block4x8 } }, 59 new[] { new[] { BlockSize.Block16x8, BlockSize.BlockInvalid }, new[] { BlockSize.Block8x8, BlockSize.Block8x4 } }, 60 new[] { new[] { BlockSize.Block16x16, BlockSize.Block16x8 }, new[] { BlockSize.Block8x16, BlockSize.Block8x8 } }, 61 new[] { new[] { BlockSize.Block16x32, BlockSize.Block16x16 }, new[] { BlockSize.BlockInvalid, BlockSize.Block8x16 } }, 62 new[] { new[] { BlockSize.Block32x16, BlockSize.BlockInvalid }, new[] { BlockSize.Block16x16, BlockSize.Block16x8 } }, 63 new[] { new[] { BlockSize.Block32x32, BlockSize.Block32x16 }, new[] { BlockSize.Block16x32, BlockSize.Block16x16 } }, 64 new[] { new[] { BlockSize.Block32x64, BlockSize.Block32x32 }, new[] { BlockSize.BlockInvalid, BlockSize.Block16x32 } }, 65 new[] { new[] { BlockSize.Block64x32, BlockSize.BlockInvalid }, new[] { BlockSize.Block32x32, BlockSize.Block32x16 } }, 66 new[] { new[] { BlockSize.Block64x64, BlockSize.Block64x32 }, new[] { BlockSize.Block32x64, BlockSize.Block32x32 } }, 67 }; 68 69 public static readonly TxSize[][][][] UvTxsizeLookup = { 70 // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1 71 // ss_y == 0 ss_y == 1 ss_y == 0 ss_y == 1 72 new[] 73 { 74 // BLOCK_4X4 75 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 76 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 77 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 78 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 79 }, 80 new[] 81 { 82 // BLOCK_4X8 83 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 84 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 85 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 86 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 87 }, 88 new[] 89 { 90 // BLOCK_8X4 91 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 92 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 93 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 94 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 95 }, 96 new[] 97 { 98 // BLOCK_8X8 99 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 100 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 101 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 102 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 103 }, 104 new[] 105 { 106 // BLOCK_8X16 107 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 108 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 109 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 110 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 111 }, 112 new[] 113 { 114 // BLOCK_16X8 115 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 116 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx4x4 } }, 117 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 118 new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 119 }, 120 new[] 121 { 122 // BLOCK_16X16 123 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 124 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 125 new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 126 new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 127 }, 128 new[] 129 { 130 // BLOCK_16X32 131 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 132 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 133 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 134 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 135 }, 136 new[] 137 { 138 // BLOCK_32X16 139 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 140 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 141 new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx16x16, TxSize.Tx8x8 } }, 142 new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx16x16, TxSize.Tx8x8 } }, 143 }, 144 new[] 145 { 146 // BLOCK_32X32 147 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 148 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 149 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 150 new[] { new[] { TxSize.Tx32x32, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 151 }, 152 new[] 153 { 154 // BLOCK_32X64 155 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 156 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 157 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 158 new[] { new[] { TxSize.Tx32x32, TxSize.Tx32x32 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 159 }, 160 new[] 161 { 162 // BLOCK_64X32 163 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 164 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 165 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 166 new[] { new[] { TxSize.Tx32x32, TxSize.Tx16x16 }, new[] { TxSize.Tx32x32, TxSize.Tx16x16 } }, 167 }, 168 new[] 169 { 170 // BLOCK_64X64 171 new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, 172 new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, 173 new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, 174 new[] { new[] { TxSize.Tx32x32, TxSize.Tx32x32 }, new[] { TxSize.Tx32x32, TxSize.Tx32x32 } }, 175 }, 176 }; 177 178 public struct PartitionContextPair 179 { 180 public sbyte Above; 181 public sbyte Left; 182 183 public PartitionContextPair(sbyte above, sbyte left) 184 { 185 Above = above; 186 Left = left; 187 } 188 } 189 190 // Generates 4 bit field in which each bit set to 1 represents 191 // a blocksize partition 1111 means we split 64x64, 32x32, 16x16 192 // and 8x8. 1000 means we just split the 64x64 to 32x32 193 public static readonly PartitionContextPair[] PartitionContextLookup = { 194 new(15, 15), // 4X4 - {0b1111, 0b1111} 195 new(15, 14), // 4X8 - {0b1111, 0b1110} 196 new(14, 15), // 8X4 - {0b1110, 0b1111} 197 new(14, 14), // 8X8 - {0b1110, 0b1110} 198 new(14, 12), // 8X16 - {0b1110, 0b1100} 199 new(12, 14), // 16X8 - {0b1100, 0b1110} 200 new(12, 12), // 16X16 - {0b1100, 0b1100} 201 new(12, 8), // 16X32 - {0b1100, 0b1000} 202 new(8, 12), // 32X16 - {0b1000, 0b1100} 203 new(8, 8), // 32X32 - {0b1000, 0b1000} 204 new(8, 0), // 32X64 - {0b1000, 0b0000} 205 new(0, 8), // 64X32 - {0b0000, 0b1000} 206 new(0, 0), // 64X64 - {0b0000, 0b0000} 207 }; 208 209 // Filter 210 211 private static readonly Array8<short>[] _bilinearFilters = { 212 NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(0, 0, 0, 120, 8, 0, 0, 0), 213 NewArray8Short(0, 0, 0, 112, 16, 0, 0, 0), NewArray8Short(0, 0, 0, 104, 24, 0, 0, 0), 214 NewArray8Short(0, 0, 0, 96, 32, 0, 0, 0), NewArray8Short(0, 0, 0, 88, 40, 0, 0, 0), 215 NewArray8Short(0, 0, 0, 80, 48, 0, 0, 0), NewArray8Short(0, 0, 0, 72, 56, 0, 0, 0), 216 NewArray8Short(0, 0, 0, 64, 64, 0, 0, 0), NewArray8Short(0, 0, 0, 56, 72, 0, 0, 0), 217 NewArray8Short(0, 0, 0, 48, 80, 0, 0, 0), NewArray8Short(0, 0, 0, 40, 88, 0, 0, 0), 218 NewArray8Short(0, 0, 0, 32, 96, 0, 0, 0), NewArray8Short(0, 0, 0, 24, 104, 0, 0, 0), 219 NewArray8Short(0, 0, 0, 16, 112, 0, 0, 0), NewArray8Short(0, 0, 0, 8, 120, 0, 0, 0), 220 }; 221 222 // Lagrangian interpolation filter 223 private static readonly Array8<short>[] _subPelFilters8 = { 224 NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(0, 1, -5, 126, 8, -3, 1, 0), 225 NewArray8Short(-1, 3, -10, 122, 18, -6, 2, 0), NewArray8Short(-1, 4, -13, 118, 27, -9, 3, -1), 226 NewArray8Short(-1, 4, -16, 112, 37, -11, 4, -1), NewArray8Short(-1, 5, -18, 105, 48, -14, 4, -1), 227 NewArray8Short(-1, 5, -19, 97, 58, -16, 5, -1), NewArray8Short(-1, 6, -19, 88, 68, -18, 5, -1), 228 NewArray8Short(-1, 6, -19, 78, 78, -19, 6, -1), NewArray8Short(-1, 5, -18, 68, 88, -19, 6, -1), 229 NewArray8Short(-1, 5, -16, 58, 97, -19, 5, -1), NewArray8Short(-1, 4, -14, 48, 105, -18, 5, -1), 230 NewArray8Short(-1, 4, -11, 37, 112, -16, 4, -1), NewArray8Short(-1, 3, -9, 27, 118, -13, 4, -1), 231 NewArray8Short(0, 2, -6, 18, 122, -10, 3, -1), NewArray8Short(0, 1, -3, 8, 126, -5, 1, 0), 232 }; 233 234 // DCT based filter 235 private static readonly Array8<short>[] _subPelFilters8S = { 236 NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(-1, 3, -7, 127, 8, -3, 1, 0), 237 NewArray8Short(-2, 5, -13, 125, 17, -6, 3, -1), NewArray8Short(-3, 7, -17, 121, 27, -10, 5, -2), 238 NewArray8Short(-4, 9, -20, 115, 37, -13, 6, -2), NewArray8Short(-4, 10, -23, 108, 48, -16, 8, -3), 239 NewArray8Short(-4, 10, -24, 100, 59, -19, 9, -3), NewArray8Short(-4, 11, -24, 90, 70, -21, 10, -4), 240 NewArray8Short(-4, 11, -23, 80, 80, -23, 11, -4), NewArray8Short(-4, 10, -21, 70, 90, -24, 11, -4), 241 NewArray8Short(-3, 9, -19, 59, 100, -24, 10, -4), NewArray8Short(-3, 8, -16, 48, 108, -23, 10, -4), 242 NewArray8Short(-2, 6, -13, 37, 115, -20, 9, -4), NewArray8Short(-2, 5, -10, 27, 121, -17, 7, -3), 243 NewArray8Short(-1, 3, -6, 17, 125, -13, 5, -2), NewArray8Short(0, 1, -3, 8, 127, -7, 3, -1), 244 }; 245 246 // freqmultiplier = 0.5 247 private static readonly Array8<short>[] _subPelFilters8Lp = { 248 NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(-3, -1, 32, 64, 38, 1, -3, 0), 249 NewArray8Short(-2, -2, 29, 63, 41, 2, -3, 0), NewArray8Short(-2, -2, 26, 63, 43, 4, -4, 0), 250 NewArray8Short(-2, -3, 24, 62, 46, 5, -4, 0), NewArray8Short(-2, -3, 21, 60, 49, 7, -4, 0), 251 NewArray8Short(-1, -4, 18, 59, 51, 9, -4, 0), NewArray8Short(-1, -4, 16, 57, 53, 12, -4, -1), 252 NewArray8Short(-1, -4, 14, 55, 55, 14, -4, -1), NewArray8Short(-1, -4, 12, 53, 57, 16, -4, -1), 253 NewArray8Short(0, -4, 9, 51, 59, 18, -4, -1), NewArray8Short(0, -4, 7, 49, 60, 21, -3, -2), 254 NewArray8Short(0, -4, 5, 46, 62, 24, -3, -2), NewArray8Short(0, -4, 4, 43, 63, 26, -2, -2), 255 NewArray8Short(0, -3, 2, 41, 63, 29, -2, -2), NewArray8Short(0, -3, 1, 38, 64, 32, -1, -3), 256 }; 257 258 private static Array8<short> NewArray8Short(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7) 259 { 260 Array8<short> output = new(); 261 262 output[0] = e0; 263 output[1] = e1; 264 output[2] = e2; 265 output[3] = e3; 266 output[4] = e4; 267 output[5] = e5; 268 output[6] = e6; 269 output[7] = e7; 270 271 return output; 272 } 273 274 public static readonly Array8<short>[][] Vp9FilterKernels = { 275 _subPelFilters8, _subPelFilters8Lp, _subPelFilters8S, _bilinearFilters, 276 }; 277 278 // Scan 279 280 private static readonly short[] _defaultScan4X4 = { 281 0, 4, 1, 5, 8, 2, 12, 9, 3, 6, 13, 10, 7, 14, 11, 15, 282 }; 283 284 private static readonly short[] _colScan4X4 = { 285 0, 4, 8, 1, 12, 5, 9, 2, 13, 6, 10, 3, 7, 14, 11, 15, 286 }; 287 288 private static readonly short[] _rowScan4X4 = { 289 0, 1, 4, 2, 5, 3, 6, 8, 9, 7, 12, 10, 13, 11, 14, 15, 290 }; 291 292 private static readonly short[] _defaultScan8X8 = { 293 0, 8, 1, 16, 9, 2, 17, 24, 10, 3, 18, 25, 32, 11, 4, 26, 294 33, 19, 40, 12, 34, 27, 5, 41, 20, 48, 13, 35, 42, 28, 21, 6, 295 49, 56, 36, 43, 29, 7, 14, 50, 57, 44, 22, 37, 15, 51, 58, 30, 296 45, 23, 52, 59, 38, 31, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63, 297 }; 298 299 private static readonly short[] _colScan8X8 = { 300 0, 8, 16, 1, 24, 9, 32, 17, 2, 40, 25, 10, 33, 18, 48, 3, 301 26, 41, 11, 56, 19, 34, 4, 49, 27, 42, 12, 35, 20, 57, 50, 28, 302 5, 43, 13, 36, 58, 51, 21, 44, 6, 29, 59, 37, 14, 52, 22, 7, 303 45, 60, 30, 15, 38, 53, 23, 46, 31, 61, 39, 54, 47, 62, 55, 63, 304 }; 305 306 private static readonly short[] _rowScan8X8 = { 307 0, 1, 2, 8, 9, 3, 16, 10, 4, 17, 11, 24, 5, 18, 25, 12, 308 19, 26, 32, 6, 13, 20, 33, 27, 7, 34, 40, 21, 28, 41, 14, 35, 309 48, 42, 29, 36, 49, 22, 43, 15, 56, 37, 50, 44, 30, 57, 23, 51, 310 58, 45, 38, 52, 31, 59, 53, 46, 60, 39, 61, 47, 54, 55, 62, 63, 311 }; 312 313 private static readonly short[] _defaultScan16X16 = { 314 0, 16, 1, 32, 17, 2, 48, 33, 18, 3, 64, 34, 49, 19, 65, 315 80, 50, 4, 35, 66, 20, 81, 96, 51, 5, 36, 82, 97, 67, 112, 316 21, 52, 98, 37, 83, 113, 6, 68, 128, 53, 22, 99, 114, 84, 7, 317 129, 38, 69, 100, 115, 144, 130, 85, 54, 23, 8, 145, 39, 70, 116, 318 101, 131, 160, 146, 55, 86, 24, 71, 132, 117, 161, 40, 9, 102, 147, 319 176, 162, 87, 56, 25, 133, 118, 177, 148, 72, 103, 41, 163, 10, 192, 320 178, 88, 57, 134, 149, 119, 26, 164, 73, 104, 193, 42, 179, 208, 11, 321 135, 89, 165, 120, 150, 58, 194, 180, 27, 74, 209, 105, 151, 136, 43, 322 90, 224, 166, 195, 181, 121, 210, 59, 12, 152, 106, 167, 196, 75, 137, 323 225, 211, 240, 182, 122, 91, 28, 197, 13, 226, 168, 183, 153, 44, 212, 324 138, 107, 241, 60, 29, 123, 198, 184, 227, 169, 242, 76, 213, 154, 45, 325 92, 14, 199, 139, 61, 228, 214, 170, 185, 243, 108, 77, 155, 30, 15, 326 200, 229, 124, 215, 244, 93, 46, 186, 171, 201, 109, 140, 230, 62, 216, 327 245, 31, 125, 78, 156, 231, 47, 187, 202, 217, 94, 246, 141, 63, 232, 328 172, 110, 247, 157, 79, 218, 203, 126, 233, 188, 248, 95, 173, 142, 219, 329 111, 249, 234, 158, 127, 189, 204, 250, 235, 143, 174, 220, 205, 159, 251, 330 190, 221, 175, 236, 237, 191, 206, 252, 222, 253, 207, 238, 223, 254, 239, 331 255, 332 }; 333 334 private static readonly short[] _colScan16X16 = { 335 0, 16, 32, 48, 1, 64, 17, 80, 33, 96, 49, 2, 65, 112, 18, 336 81, 34, 128, 50, 97, 3, 66, 144, 19, 113, 35, 82, 160, 98, 51, 337 129, 4, 67, 176, 20, 114, 145, 83, 36, 99, 130, 52, 192, 5, 161, 338 68, 115, 21, 146, 84, 208, 177, 37, 131, 100, 53, 162, 224, 69, 6, 339 116, 193, 147, 85, 22, 240, 132, 38, 178, 101, 163, 54, 209, 117, 70, 340 7, 148, 194, 86, 179, 225, 23, 133, 39, 164, 8, 102, 210, 241, 55, 341 195, 118, 149, 71, 180, 24, 87, 226, 134, 165, 211, 40, 103, 56, 72, 342 150, 196, 242, 119, 9, 181, 227, 88, 166, 25, 135, 41, 104, 212, 57, 343 151, 197, 120, 73, 243, 182, 136, 167, 213, 89, 10, 228, 105, 152, 198, 344 26, 42, 121, 183, 244, 168, 58, 137, 229, 74, 214, 90, 153, 199, 184, 345 11, 106, 245, 27, 122, 230, 169, 43, 215, 59, 200, 138, 185, 246, 75, 346 12, 91, 154, 216, 231, 107, 28, 44, 201, 123, 170, 60, 247, 232, 76, 347 139, 13, 92, 217, 186, 248, 155, 108, 29, 124, 45, 202, 233, 171, 61, 348 14, 77, 140, 15, 249, 93, 30, 187, 156, 218, 46, 109, 125, 62, 172, 349 78, 203, 31, 141, 234, 94, 47, 188, 63, 157, 110, 250, 219, 79, 126, 350 204, 173, 142, 95, 189, 111, 235, 158, 220, 251, 127, 174, 143, 205, 236, 351 159, 190, 221, 252, 175, 206, 237, 191, 253, 222, 238, 207, 254, 223, 239, 352 255, 353 }; 354 355 private static readonly short[] _rowScan16X16 = { 356 0, 1, 2, 16, 3, 17, 4, 18, 32, 5, 33, 19, 6, 34, 48, 357 20, 49, 7, 35, 21, 50, 64, 8, 36, 65, 22, 51, 37, 80, 9, 358 66, 52, 23, 38, 81, 67, 10, 53, 24, 82, 68, 96, 39, 11, 54, 359 83, 97, 69, 25, 98, 84, 40, 112, 55, 12, 70, 99, 113, 85, 26, 360 41, 56, 114, 100, 13, 71, 128, 86, 27, 115, 101, 129, 42, 57, 72, 361 116, 14, 87, 130, 102, 144, 73, 131, 117, 28, 58, 15, 88, 43, 145, 362 103, 132, 146, 118, 74, 160, 89, 133, 104, 29, 59, 147, 119, 44, 161, 363 148, 90, 105, 134, 162, 120, 176, 75, 135, 149, 30, 60, 163, 177, 45, 364 121, 91, 106, 164, 178, 150, 192, 136, 165, 179, 31, 151, 193, 76, 122, 365 61, 137, 194, 107, 152, 180, 208, 46, 166, 167, 195, 92, 181, 138, 209, 366 123, 153, 224, 196, 77, 168, 210, 182, 240, 108, 197, 62, 154, 225, 183, 367 169, 211, 47, 139, 93, 184, 226, 212, 241, 198, 170, 124, 155, 199, 78, 368 213, 185, 109, 227, 200, 63, 228, 242, 140, 214, 171, 186, 156, 229, 243, 369 125, 94, 201, 244, 215, 216, 230, 141, 187, 202, 79, 172, 110, 157, 245, 370 217, 231, 95, 246, 232, 126, 203, 247, 233, 173, 218, 142, 111, 158, 188, 371 248, 127, 234, 219, 249, 189, 204, 143, 174, 159, 250, 235, 205, 220, 175, 372 190, 251, 221, 191, 206, 236, 207, 237, 252, 222, 253, 223, 238, 239, 254, 373 255, 374 }; 375 376 private static readonly short[] _defaultScan32X32 = { 377 0, 32, 1, 64, 33, 2, 96, 65, 34, 128, 3, 97, 66, 378 160, 129, 35, 98, 4, 67, 130, 161, 192, 36, 99, 224, 5, 379 162, 193, 68, 131, 37, 100, 225, 194, 256, 163, 69, 132, 6, 380 226, 257, 288, 195, 101, 164, 38, 258, 7, 227, 289, 133, 320, 381 70, 196, 165, 290, 259, 228, 39, 321, 102, 352, 8, 197, 71, 382 134, 322, 291, 260, 353, 384, 229, 166, 103, 40, 354, 323, 292, 383 135, 385, 198, 261, 72, 9, 416, 167, 386, 355, 230, 324, 104, 384 293, 41, 417, 199, 136, 262, 387, 448, 325, 356, 10, 73, 418, 385 231, 168, 449, 294, 388, 105, 419, 263, 42, 200, 357, 450, 137, 386 480, 74, 326, 232, 11, 389, 169, 295, 420, 106, 451, 481, 358, 387 264, 327, 201, 43, 138, 512, 482, 390, 296, 233, 170, 421, 75, 388 452, 359, 12, 513, 265, 483, 328, 107, 202, 514, 544, 422, 391, 389 453, 139, 44, 234, 484, 297, 360, 171, 76, 515, 545, 266, 329, 390 454, 13, 423, 203, 108, 546, 485, 576, 298, 235, 140, 361, 330, 391 172, 547, 45, 455, 267, 577, 486, 77, 204, 362, 608, 14, 299, 392 578, 109, 236, 487, 609, 331, 141, 579, 46, 15, 173, 610, 363, 393 78, 205, 16, 110, 237, 611, 142, 47, 174, 79, 206, 17, 111, 394 238, 48, 143, 80, 175, 112, 207, 49, 18, 239, 81, 113, 19, 395 50, 82, 114, 51, 83, 115, 640, 516, 392, 268, 144, 20, 672, 396 641, 548, 517, 424, 393, 300, 269, 176, 145, 52, 21, 704, 673, 397 642, 580, 549, 518, 456, 425, 394, 332, 301, 270, 208, 177, 146, 398 84, 53, 22, 736, 705, 674, 643, 612, 581, 550, 519, 488, 457, 399 426, 395, 364, 333, 302, 271, 240, 209, 178, 147, 116, 85, 54, 400 23, 737, 706, 675, 613, 582, 551, 489, 458, 427, 365, 334, 303, 401 241, 210, 179, 117, 86, 55, 738, 707, 614, 583, 490, 459, 366, 402 335, 242, 211, 118, 87, 739, 615, 491, 367, 243, 119, 768, 644, 403 520, 396, 272, 148, 24, 800, 769, 676, 645, 552, 521, 428, 397, 404 304, 273, 180, 149, 56, 25, 832, 801, 770, 708, 677, 646, 584, 405 553, 522, 460, 429, 398, 336, 305, 274, 212, 181, 150, 88, 57, 406 26, 864, 833, 802, 771, 740, 709, 678, 647, 616, 585, 554, 523, 407 492, 461, 430, 399, 368, 337, 306, 275, 244, 213, 182, 151, 120, 408 89, 58, 27, 865, 834, 803, 741, 710, 679, 617, 586, 555, 493, 409 462, 431, 369, 338, 307, 245, 214, 183, 121, 90, 59, 866, 835, 410 742, 711, 618, 587, 494, 463, 370, 339, 246, 215, 122, 91, 867, 411 743, 619, 495, 371, 247, 123, 896, 772, 648, 524, 400, 276, 152, 412 28, 928, 897, 804, 773, 680, 649, 556, 525, 432, 401, 308, 277, 413 184, 153, 60, 29, 960, 929, 898, 836, 805, 774, 712, 681, 650, 414 588, 557, 526, 464, 433, 402, 340, 309, 278, 216, 185, 154, 92, 415 61, 30, 992, 961, 930, 899, 868, 837, 806, 775, 744, 713, 682, 416 651, 620, 589, 558, 527, 496, 465, 434, 403, 372, 341, 310, 279, 417 248, 217, 186, 155, 124, 93, 62, 31, 993, 962, 931, 869, 838, 418 807, 745, 714, 683, 621, 590, 559, 497, 466, 435, 373, 342, 311, 419 249, 218, 187, 125, 94, 63, 994, 963, 870, 839, 746, 715, 622, 420 591, 498, 467, 374, 343, 250, 219, 126, 95, 995, 871, 747, 623, 421 499, 375, 251, 127, 900, 776, 652, 528, 404, 280, 156, 932, 901, 422 808, 777, 684, 653, 560, 529, 436, 405, 312, 281, 188, 157, 964, 423 933, 902, 840, 809, 778, 716, 685, 654, 592, 561, 530, 468, 437, 424 406, 344, 313, 282, 220, 189, 158, 996, 965, 934, 903, 872, 841, 425 810, 779, 748, 717, 686, 655, 624, 593, 562, 531, 500, 469, 438, 426 407, 376, 345, 314, 283, 252, 221, 190, 159, 997, 966, 935, 873, 427 842, 811, 749, 718, 687, 625, 594, 563, 501, 470, 439, 377, 346, 428 315, 253, 222, 191, 998, 967, 874, 843, 750, 719, 626, 595, 502, 429 471, 378, 347, 254, 223, 999, 875, 751, 627, 503, 379, 255, 904, 430 780, 656, 532, 408, 284, 936, 905, 812, 781, 688, 657, 564, 533, 431 440, 409, 316, 285, 968, 937, 906, 844, 813, 782, 720, 689, 658, 432 596, 565, 534, 472, 441, 410, 348, 317, 286, 1000, 969, 938, 907, 433 876, 845, 814, 783, 752, 721, 690, 659, 628, 597, 566, 535, 504, 434 473, 442, 411, 380, 349, 318, 287, 1001, 970, 939, 877, 846, 815, 435 753, 722, 691, 629, 598, 567, 505, 474, 443, 381, 350, 319, 1002, 436 971, 878, 847, 754, 723, 630, 599, 506, 475, 382, 351, 1003, 879, 437 755, 631, 507, 383, 908, 784, 660, 536, 412, 940, 909, 816, 785, 438 692, 661, 568, 537, 444, 413, 972, 941, 910, 848, 817, 786, 724, 439 693, 662, 600, 569, 538, 476, 445, 414, 1004, 973, 942, 911, 880, 440 849, 818, 787, 756, 725, 694, 663, 632, 601, 570, 539, 508, 477, 441 446, 415, 1005, 974, 943, 881, 850, 819, 757, 726, 695, 633, 602, 442 571, 509, 478, 447, 1006, 975, 882, 851, 758, 727, 634, 603, 510, 443 479, 1007, 883, 759, 635, 511, 912, 788, 664, 540, 944, 913, 820, 444 789, 696, 665, 572, 541, 976, 945, 914, 852, 821, 790, 728, 697, 445 666, 604, 573, 542, 1008, 977, 946, 915, 884, 853, 822, 791, 760, 446 729, 698, 667, 636, 605, 574, 543, 1009, 978, 947, 885, 854, 823, 447 761, 730, 699, 637, 606, 575, 1010, 979, 886, 855, 762, 731, 638, 448 607, 1011, 887, 763, 639, 916, 792, 668, 948, 917, 824, 793, 700, 449 669, 980, 949, 918, 856, 825, 794, 732, 701, 670, 1012, 981, 950, 450 919, 888, 857, 826, 795, 764, 733, 702, 671, 1013, 982, 951, 889, 451 858, 827, 765, 734, 703, 1014, 983, 890, 859, 766, 735, 1015, 891, 452 767, 920, 796, 952, 921, 828, 797, 984, 953, 922, 860, 829, 798, 453 1016, 985, 954, 923, 892, 861, 830, 799, 1017, 986, 955, 893, 862, 454 831, 1018, 987, 894, 863, 1019, 895, 924, 956, 925, 988, 957, 926, 455 1020, 989, 958, 927, 1021, 990, 959, 1022, 991, 1023, 456 }; 457 458 // Neighborhood 2-tuples for various scans and blocksizes, 459 // in {top, left} order for each position in corresponding scan order. 460 private static readonly short[] _defaultScan4X4Neighbors = { 461 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 1, 1, 8, 8, 5, 8, 2, 462 2, 2, 5, 9, 12, 6, 9, 3, 6, 10, 13, 7, 10, 11, 14, 0, 0, 463 }; 464 465 private static readonly short[] _colScan4X4Neighbors = { 466 0, 0, 0, 0, 4, 4, 0, 0, 8, 8, 1, 1, 5, 5, 1, 1, 9, 467 9, 2, 2, 6, 6, 2, 2, 3, 3, 10, 10, 7, 7, 11, 11, 0, 0, 468 }; 469 470 private static readonly short[] _rowScan4X4Neighbors = { 471 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 2, 2, 5, 5, 4, 4, 8, 472 8, 6, 6, 8, 8, 9, 9, 12, 12, 10, 10, 13, 13, 14, 14, 0, 0, 473 }; 474 475 private static readonly short[] _colScan8X8Neighbors = { 476 0, 0, 0, 0, 8, 8, 0, 0, 16, 16, 1, 1, 24, 24, 9, 9, 1, 1, 32, 477 32, 17, 17, 2, 2, 25, 25, 10, 10, 40, 40, 2, 2, 18, 18, 33, 33, 3, 3, 478 48, 48, 11, 11, 26, 26, 3, 3, 41, 41, 19, 19, 34, 34, 4, 4, 27, 27, 12, 479 12, 49, 49, 42, 42, 20, 20, 4, 4, 35, 35, 5, 5, 28, 28, 50, 50, 43, 43, 480 13, 13, 36, 36, 5, 5, 21, 21, 51, 51, 29, 29, 6, 6, 44, 44, 14, 14, 6, 481 6, 37, 37, 52, 52, 22, 22, 7, 7, 30, 30, 45, 45, 15, 15, 38, 38, 23, 23, 482 53, 53, 31, 31, 46, 46, 39, 39, 54, 54, 47, 47, 55, 55, 0, 0, 483 }; 484 485 private static readonly short[] _rowScan8X8Neighbors = { 486 0, 0, 0, 0, 1, 1, 0, 0, 8, 8, 2, 2, 8, 8, 9, 9, 3, 3, 16, 487 16, 10, 10, 16, 16, 4, 4, 17, 17, 24, 24, 11, 11, 18, 18, 25, 25, 24, 24, 488 5, 5, 12, 12, 19, 19, 32, 32, 26, 26, 6, 6, 33, 33, 32, 32, 20, 20, 27, 489 27, 40, 40, 13, 13, 34, 34, 40, 40, 41, 41, 28, 28, 35, 35, 48, 48, 21, 21, 490 42, 42, 14, 14, 48, 48, 36, 36, 49, 49, 43, 43, 29, 29, 56, 56, 22, 22, 50, 491 50, 57, 57, 44, 44, 37, 37, 51, 51, 30, 30, 58, 58, 52, 52, 45, 45, 59, 59, 492 38, 38, 60, 60, 46, 46, 53, 53, 54, 54, 61, 61, 62, 62, 0, 0, 493 }; 494 495 private static readonly short[] _defaultScan8X8Neighbors = { 496 0, 0, 0, 0, 0, 0, 8, 8, 1, 8, 1, 1, 9, 16, 16, 16, 2, 9, 2, 497 2, 10, 17, 17, 24, 24, 24, 3, 10, 3, 3, 18, 25, 25, 32, 11, 18, 32, 32, 498 4, 11, 26, 33, 19, 26, 4, 4, 33, 40, 12, 19, 40, 40, 5, 12, 27, 34, 34, 499 41, 20, 27, 13, 20, 5, 5, 41, 48, 48, 48, 28, 35, 35, 42, 21, 28, 6, 6, 500 6, 13, 42, 49, 49, 56, 36, 43, 14, 21, 29, 36, 7, 14, 43, 50, 50, 57, 22, 501 29, 37, 44, 15, 22, 44, 51, 51, 58, 30, 37, 23, 30, 52, 59, 45, 52, 38, 45, 502 31, 38, 53, 60, 46, 53, 39, 46, 54, 61, 47, 54, 55, 62, 0, 0, 503 }; 504 505 private static readonly short[] _colScan16X16Neighbors = { 506 0, 0, 0, 0, 16, 16, 32, 32, 0, 0, 48, 48, 1, 1, 64, 507 64, 17, 17, 80, 80, 33, 33, 1, 1, 49, 49, 96, 96, 2, 2, 508 65, 65, 18, 18, 112, 112, 34, 34, 81, 81, 2, 2, 50, 50, 128, 509 128, 3, 3, 97, 97, 19, 19, 66, 66, 144, 144, 82, 82, 35, 35, 510 113, 113, 3, 3, 51, 51, 160, 160, 4, 4, 98, 98, 129, 129, 67, 511 67, 20, 20, 83, 83, 114, 114, 36, 36, 176, 176, 4, 4, 145, 145, 512 52, 52, 99, 99, 5, 5, 130, 130, 68, 68, 192, 192, 161, 161, 21, 513 21, 115, 115, 84, 84, 37, 37, 146, 146, 208, 208, 53, 53, 5, 5, 514 100, 100, 177, 177, 131, 131, 69, 69, 6, 6, 224, 224, 116, 116, 22, 515 22, 162, 162, 85, 85, 147, 147, 38, 38, 193, 193, 101, 101, 54, 54, 516 6, 6, 132, 132, 178, 178, 70, 70, 163, 163, 209, 209, 7, 7, 117, 517 117, 23, 23, 148, 148, 7, 7, 86, 86, 194, 194, 225, 225, 39, 39, 518 179, 179, 102, 102, 133, 133, 55, 55, 164, 164, 8, 8, 71, 71, 210, 519 210, 118, 118, 149, 149, 195, 195, 24, 24, 87, 87, 40, 40, 56, 56, 520 134, 134, 180, 180, 226, 226, 103, 103, 8, 8, 165, 165, 211, 211, 72, 521 72, 150, 150, 9, 9, 119, 119, 25, 25, 88, 88, 196, 196, 41, 41, 522 135, 135, 181, 181, 104, 104, 57, 57, 227, 227, 166, 166, 120, 120, 151, 523 151, 197, 197, 73, 73, 9, 9, 212, 212, 89, 89, 136, 136, 182, 182, 524 10, 10, 26, 26, 105, 105, 167, 167, 228, 228, 152, 152, 42, 42, 121, 525 121, 213, 213, 58, 58, 198, 198, 74, 74, 137, 137, 183, 183, 168, 168, 526 10, 10, 90, 90, 229, 229, 11, 11, 106, 106, 214, 214, 153, 153, 27, 527 27, 199, 199, 43, 43, 184, 184, 122, 122, 169, 169, 230, 230, 59, 59, 528 11, 11, 75, 75, 138, 138, 200, 200, 215, 215, 91, 91, 12, 12, 28, 529 28, 185, 185, 107, 107, 154, 154, 44, 44, 231, 231, 216, 216, 60, 60, 530 123, 123, 12, 12, 76, 76, 201, 201, 170, 170, 232, 232, 139, 139, 92, 531 92, 13, 13, 108, 108, 29, 29, 186, 186, 217, 217, 155, 155, 45, 45, 532 13, 13, 61, 61, 124, 124, 14, 14, 233, 233, 77, 77, 14, 14, 171, 533 171, 140, 140, 202, 202, 30, 30, 93, 93, 109, 109, 46, 46, 156, 156, 534 62, 62, 187, 187, 15, 15, 125, 125, 218, 218, 78, 78, 31, 31, 172, 535 172, 47, 47, 141, 141, 94, 94, 234, 234, 203, 203, 63, 63, 110, 110, 536 188, 188, 157, 157, 126, 126, 79, 79, 173, 173, 95, 95, 219, 219, 142, 537 142, 204, 204, 235, 235, 111, 111, 158, 158, 127, 127, 189, 189, 220, 220, 538 143, 143, 174, 174, 205, 205, 236, 236, 159, 159, 190, 190, 221, 221, 175, 539 175, 237, 237, 206, 206, 222, 222, 191, 191, 238, 238, 207, 207, 223, 223, 540 239, 239, 0, 0, 541 }; 542 543 private static readonly short[] _rowScan16X16Neighbors = { 544 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 16, 16, 3, 3, 17, 545 17, 16, 16, 4, 4, 32, 32, 18, 18, 5, 5, 33, 33, 32, 32, 546 19, 19, 48, 48, 6, 6, 34, 34, 20, 20, 49, 49, 48, 48, 7, 547 7, 35, 35, 64, 64, 21, 21, 50, 50, 36, 36, 64, 64, 8, 8, 548 65, 65, 51, 51, 22, 22, 37, 37, 80, 80, 66, 66, 9, 9, 52, 549 52, 23, 23, 81, 81, 67, 67, 80, 80, 38, 38, 10, 10, 53, 53, 550 82, 82, 96, 96, 68, 68, 24, 24, 97, 97, 83, 83, 39, 39, 96, 551 96, 54, 54, 11, 11, 69, 69, 98, 98, 112, 112, 84, 84, 25, 25, 552 40, 40, 55, 55, 113, 113, 99, 99, 12, 12, 70, 70, 112, 112, 85, 553 85, 26, 26, 114, 114, 100, 100, 128, 128, 41, 41, 56, 56, 71, 71, 554 115, 115, 13, 13, 86, 86, 129, 129, 101, 101, 128, 128, 72, 72, 130, 555 130, 116, 116, 27, 27, 57, 57, 14, 14, 87, 87, 42, 42, 144, 144, 556 102, 102, 131, 131, 145, 145, 117, 117, 73, 73, 144, 144, 88, 88, 132, 557 132, 103, 103, 28, 28, 58, 58, 146, 146, 118, 118, 43, 43, 160, 160, 558 147, 147, 89, 89, 104, 104, 133, 133, 161, 161, 119, 119, 160, 160, 74, 559 74, 134, 134, 148, 148, 29, 29, 59, 59, 162, 162, 176, 176, 44, 44, 560 120, 120, 90, 90, 105, 105, 163, 163, 177, 177, 149, 149, 176, 176, 135, 561 135, 164, 164, 178, 178, 30, 30, 150, 150, 192, 192, 75, 75, 121, 121, 562 60, 60, 136, 136, 193, 193, 106, 106, 151, 151, 179, 179, 192, 192, 45, 563 45, 165, 165, 166, 166, 194, 194, 91, 91, 180, 180, 137, 137, 208, 208, 564 122, 122, 152, 152, 208, 208, 195, 195, 76, 76, 167, 167, 209, 209, 181, 565 181, 224, 224, 107, 107, 196, 196, 61, 61, 153, 153, 224, 224, 182, 182, 566 168, 168, 210, 210, 46, 46, 138, 138, 92, 92, 183, 183, 225, 225, 211, 567 211, 240, 240, 197, 197, 169, 169, 123, 123, 154, 154, 198, 198, 77, 77, 568 212, 212, 184, 184, 108, 108, 226, 226, 199, 199, 62, 62, 227, 227, 241, 569 241, 139, 139, 213, 213, 170, 170, 185, 185, 155, 155, 228, 228, 242, 242, 570 124, 124, 93, 93, 200, 200, 243, 243, 214, 214, 215, 215, 229, 229, 140, 571 140, 186, 186, 201, 201, 78, 78, 171, 171, 109, 109, 156, 156, 244, 244, 572 216, 216, 230, 230, 94, 94, 245, 245, 231, 231, 125, 125, 202, 202, 246, 573 246, 232, 232, 172, 172, 217, 217, 141, 141, 110, 110, 157, 157, 187, 187, 574 247, 247, 126, 126, 233, 233, 218, 218, 248, 248, 188, 188, 203, 203, 142, 575 142, 173, 173, 158, 158, 249, 249, 234, 234, 204, 204, 219, 219, 174, 174, 576 189, 189, 250, 250, 220, 220, 190, 190, 205, 205, 235, 235, 206, 206, 236, 577 236, 251, 251, 221, 221, 252, 252, 222, 222, 237, 237, 238, 238, 253, 253, 578 254, 254, 0, 0, 579 }; 580 581 private static readonly short[] _defaultScan16X16Neighbors = { 582 0, 0, 0, 0, 0, 0, 16, 16, 1, 16, 1, 1, 32, 32, 17, 583 32, 2, 17, 2, 2, 48, 48, 18, 33, 33, 48, 3, 18, 49, 64, 584 64, 64, 34, 49, 3, 3, 19, 34, 50, 65, 4, 19, 65, 80, 80, 585 80, 35, 50, 4, 4, 20, 35, 66, 81, 81, 96, 51, 66, 96, 96, 586 5, 20, 36, 51, 82, 97, 21, 36, 67, 82, 97, 112, 5, 5, 52, 587 67, 112, 112, 37, 52, 6, 21, 83, 98, 98, 113, 68, 83, 6, 6, 588 113, 128, 22, 37, 53, 68, 84, 99, 99, 114, 128, 128, 114, 129, 69, 589 84, 38, 53, 7, 22, 7, 7, 129, 144, 23, 38, 54, 69, 100, 115, 590 85, 100, 115, 130, 144, 144, 130, 145, 39, 54, 70, 85, 8, 23, 55, 591 70, 116, 131, 101, 116, 145, 160, 24, 39, 8, 8, 86, 101, 131, 146, 592 160, 160, 146, 161, 71, 86, 40, 55, 9, 24, 117, 132, 102, 117, 161, 593 176, 132, 147, 56, 71, 87, 102, 25, 40, 147, 162, 9, 9, 176, 176, 594 162, 177, 72, 87, 41, 56, 118, 133, 133, 148, 103, 118, 10, 25, 148, 595 163, 57, 72, 88, 103, 177, 192, 26, 41, 163, 178, 192, 192, 10, 10, 596 119, 134, 73, 88, 149, 164, 104, 119, 134, 149, 42, 57, 178, 193, 164, 597 179, 11, 26, 58, 73, 193, 208, 89, 104, 135, 150, 120, 135, 27, 42, 598 74, 89, 208, 208, 150, 165, 179, 194, 165, 180, 105, 120, 194, 209, 43, 599 58, 11, 11, 136, 151, 90, 105, 151, 166, 180, 195, 59, 74, 121, 136, 600 209, 224, 195, 210, 224, 224, 166, 181, 106, 121, 75, 90, 12, 27, 181, 601 196, 12, 12, 210, 225, 152, 167, 167, 182, 137, 152, 28, 43, 196, 211, 602 122, 137, 91, 106, 225, 240, 44, 59, 13, 28, 107, 122, 182, 197, 168, 603 183, 211, 226, 153, 168, 226, 241, 60, 75, 197, 212, 138, 153, 29, 44, 604 76, 91, 13, 13, 183, 198, 123, 138, 45, 60, 212, 227, 198, 213, 154, 605 169, 169, 184, 227, 242, 92, 107, 61, 76, 139, 154, 14, 29, 14, 14, 606 184, 199, 213, 228, 108, 123, 199, 214, 228, 243, 77, 92, 30, 45, 170, 607 185, 155, 170, 185, 200, 93, 108, 124, 139, 214, 229, 46, 61, 200, 215, 608 229, 244, 15, 30, 109, 124, 62, 77, 140, 155, 215, 230, 31, 46, 171, 609 186, 186, 201, 201, 216, 78, 93, 230, 245, 125, 140, 47, 62, 216, 231, 610 156, 171, 94, 109, 231, 246, 141, 156, 63, 78, 202, 217, 187, 202, 110, 611 125, 217, 232, 172, 187, 232, 247, 79, 94, 157, 172, 126, 141, 203, 218, 612 95, 110, 233, 248, 218, 233, 142, 157, 111, 126, 173, 188, 188, 203, 234, 613 249, 219, 234, 127, 142, 158, 173, 204, 219, 189, 204, 143, 158, 235, 250, 614 174, 189, 205, 220, 159, 174, 220, 235, 221, 236, 175, 190, 190, 205, 236, 615 251, 206, 221, 237, 252, 191, 206, 222, 237, 207, 222, 238, 253, 223, 238, 616 239, 254, 0, 0, 617 }; 618 619 private static readonly short[] _defaultScan32X32Neighbors = { 620 0, 0, 0, 0, 0, 0, 32, 32, 1, 32, 1, 1, 64, 64, 621 33, 64, 2, 33, 96, 96, 2, 2, 65, 96, 34, 65, 128, 128, 622 97, 128, 3, 34, 66, 97, 3, 3, 35, 66, 98, 129, 129, 160, 623 160, 160, 4, 35, 67, 98, 192, 192, 4, 4, 130, 161, 161, 192, 624 36, 67, 99, 130, 5, 36, 68, 99, 193, 224, 162, 193, 224, 224, 625 131, 162, 37, 68, 100, 131, 5, 5, 194, 225, 225, 256, 256, 256, 626 163, 194, 69, 100, 132, 163, 6, 37, 226, 257, 6, 6, 195, 226, 627 257, 288, 101, 132, 288, 288, 38, 69, 164, 195, 133, 164, 258, 289, 628 227, 258, 196, 227, 7, 38, 289, 320, 70, 101, 320, 320, 7, 7, 629 165, 196, 39, 70, 102, 133, 290, 321, 259, 290, 228, 259, 321, 352, 630 352, 352, 197, 228, 134, 165, 71, 102, 8, 39, 322, 353, 291, 322, 631 260, 291, 103, 134, 353, 384, 166, 197, 229, 260, 40, 71, 8, 8, 632 384, 384, 135, 166, 354, 385, 323, 354, 198, 229, 292, 323, 72, 103, 633 261, 292, 9, 40, 385, 416, 167, 198, 104, 135, 230, 261, 355, 386, 634 416, 416, 293, 324, 324, 355, 9, 9, 41, 72, 386, 417, 199, 230, 635 136, 167, 417, 448, 262, 293, 356, 387, 73, 104, 387, 418, 231, 262, 636 10, 41, 168, 199, 325, 356, 418, 449, 105, 136, 448, 448, 42, 73, 637 294, 325, 200, 231, 10, 10, 357, 388, 137, 168, 263, 294, 388, 419, 638 74, 105, 419, 450, 449, 480, 326, 357, 232, 263, 295, 326, 169, 200, 639 11, 42, 106, 137, 480, 480, 450, 481, 358, 389, 264, 295, 201, 232, 640 138, 169, 389, 420, 43, 74, 420, 451, 327, 358, 11, 11, 481, 512, 641 233, 264, 451, 482, 296, 327, 75, 106, 170, 201, 482, 513, 512, 512, 642 390, 421, 359, 390, 421, 452, 107, 138, 12, 43, 202, 233, 452, 483, 643 265, 296, 328, 359, 139, 170, 44, 75, 483, 514, 513, 544, 234, 265, 644 297, 328, 422, 453, 12, 12, 391, 422, 171, 202, 76, 107, 514, 545, 645 453, 484, 544, 544, 266, 297, 203, 234, 108, 139, 329, 360, 298, 329, 646 140, 171, 515, 546, 13, 44, 423, 454, 235, 266, 545, 576, 454, 485, 647 45, 76, 172, 203, 330, 361, 576, 576, 13, 13, 267, 298, 546, 577, 648 77, 108, 204, 235, 455, 486, 577, 608, 299, 330, 109, 140, 547, 578, 649 14, 45, 14, 14, 141, 172, 578, 609, 331, 362, 46, 77, 173, 204, 650 15, 15, 78, 109, 205, 236, 579, 610, 110, 141, 15, 46, 142, 173, 651 47, 78, 174, 205, 16, 16, 79, 110, 206, 237, 16, 47, 111, 142, 652 48, 79, 143, 174, 80, 111, 175, 206, 17, 48, 17, 17, 207, 238, 653 49, 80, 81, 112, 18, 18, 18, 49, 50, 81, 82, 113, 19, 50, 654 51, 82, 83, 114, 608, 608, 484, 515, 360, 391, 236, 267, 112, 143, 655 19, 19, 640, 640, 609, 640, 516, 547, 485, 516, 392, 423, 361, 392, 656 268, 299, 237, 268, 144, 175, 113, 144, 20, 51, 20, 20, 672, 672, 657 641, 672, 610, 641, 548, 579, 517, 548, 486, 517, 424, 455, 393, 424, 658 362, 393, 300, 331, 269, 300, 238, 269, 176, 207, 145, 176, 114, 145, 659 52, 83, 21, 52, 21, 21, 704, 704, 673, 704, 642, 673, 611, 642, 660 580, 611, 549, 580, 518, 549, 487, 518, 456, 487, 425, 456, 394, 425, 661 363, 394, 332, 363, 301, 332, 270, 301, 239, 270, 208, 239, 177, 208, 662 146, 177, 115, 146, 84, 115, 53, 84, 22, 53, 22, 22, 705, 736, 663 674, 705, 643, 674, 581, 612, 550, 581, 519, 550, 457, 488, 426, 457, 664 395, 426, 333, 364, 302, 333, 271, 302, 209, 240, 178, 209, 147, 178, 665 85, 116, 54, 85, 23, 54, 706, 737, 675, 706, 582, 613, 551, 582, 666 458, 489, 427, 458, 334, 365, 303, 334, 210, 241, 179, 210, 86, 117, 667 55, 86, 707, 738, 583, 614, 459, 490, 335, 366, 211, 242, 87, 118, 668 736, 736, 612, 643, 488, 519, 364, 395, 240, 271, 116, 147, 23, 23, 669 768, 768, 737, 768, 644, 675, 613, 644, 520, 551, 489, 520, 396, 427, 670 365, 396, 272, 303, 241, 272, 148, 179, 117, 148, 24, 55, 24, 24, 671 800, 800, 769, 800, 738, 769, 676, 707, 645, 676, 614, 645, 552, 583, 672 521, 552, 490, 521, 428, 459, 397, 428, 366, 397, 304, 335, 273, 304, 673 242, 273, 180, 211, 149, 180, 118, 149, 56, 87, 25, 56, 25, 25, 674 832, 832, 801, 832, 770, 801, 739, 770, 708, 739, 677, 708, 646, 677, 675 615, 646, 584, 615, 553, 584, 522, 553, 491, 522, 460, 491, 429, 460, 676 398, 429, 367, 398, 336, 367, 305, 336, 274, 305, 243, 274, 212, 243, 677 181, 212, 150, 181, 119, 150, 88, 119, 57, 88, 26, 57, 26, 26, 678 833, 864, 802, 833, 771, 802, 709, 740, 678, 709, 647, 678, 585, 616, 679 554, 585, 523, 554, 461, 492, 430, 461, 399, 430, 337, 368, 306, 337, 680 275, 306, 213, 244, 182, 213, 151, 182, 89, 120, 58, 89, 27, 58, 681 834, 865, 803, 834, 710, 741, 679, 710, 586, 617, 555, 586, 462, 493, 682 431, 462, 338, 369, 307, 338, 214, 245, 183, 214, 90, 121, 59, 90, 683 835, 866, 711, 742, 587, 618, 463, 494, 339, 370, 215, 246, 91, 122, 684 864, 864, 740, 771, 616, 647, 492, 523, 368, 399, 244, 275, 120, 151, 685 27, 27, 896, 896, 865, 896, 772, 803, 741, 772, 648, 679, 617, 648, 686 524, 555, 493, 524, 400, 431, 369, 400, 276, 307, 245, 276, 152, 183, 687 121, 152, 28, 59, 28, 28, 928, 928, 897, 928, 866, 897, 804, 835, 688 773, 804, 742, 773, 680, 711, 649, 680, 618, 649, 556, 587, 525, 556, 689 494, 525, 432, 463, 401, 432, 370, 401, 308, 339, 277, 308, 246, 277, 690 184, 215, 153, 184, 122, 153, 60, 91, 29, 60, 29, 29, 960, 960, 691 929, 960, 898, 929, 867, 898, 836, 867, 805, 836, 774, 805, 743, 774, 692 712, 743, 681, 712, 650, 681, 619, 650, 588, 619, 557, 588, 526, 557, 693 495, 526, 464, 495, 433, 464, 402, 433, 371, 402, 340, 371, 309, 340, 694 278, 309, 247, 278, 216, 247, 185, 216, 154, 185, 123, 154, 92, 123, 695 61, 92, 30, 61, 30, 30, 961, 992, 930, 961, 899, 930, 837, 868, 696 806, 837, 775, 806, 713, 744, 682, 713, 651, 682, 589, 620, 558, 589, 697 527, 558, 465, 496, 434, 465, 403, 434, 341, 372, 310, 341, 279, 310, 698 217, 248, 186, 217, 155, 186, 93, 124, 62, 93, 31, 62, 962, 993, 699 931, 962, 838, 869, 807, 838, 714, 745, 683, 714, 590, 621, 559, 590, 700 466, 497, 435, 466, 342, 373, 311, 342, 218, 249, 187, 218, 94, 125, 701 63, 94, 963, 994, 839, 870, 715, 746, 591, 622, 467, 498, 343, 374, 702 219, 250, 95, 126, 868, 899, 744, 775, 620, 651, 496, 527, 372, 403, 703 248, 279, 124, 155, 900, 931, 869, 900, 776, 807, 745, 776, 652, 683, 704 621, 652, 528, 559, 497, 528, 404, 435, 373, 404, 280, 311, 249, 280, 705 156, 187, 125, 156, 932, 963, 901, 932, 870, 901, 808, 839, 777, 808, 706 746, 777, 684, 715, 653, 684, 622, 653, 560, 591, 529, 560, 498, 529, 707 436, 467, 405, 436, 374, 405, 312, 343, 281, 312, 250, 281, 188, 219, 708 157, 188, 126, 157, 964, 995, 933, 964, 902, 933, 871, 902, 840, 871, 709 809, 840, 778, 809, 747, 778, 716, 747, 685, 716, 654, 685, 623, 654, 710 592, 623, 561, 592, 530, 561, 499, 530, 468, 499, 437, 468, 406, 437, 711 375, 406, 344, 375, 313, 344, 282, 313, 251, 282, 220, 251, 189, 220, 712 158, 189, 127, 158, 965, 996, 934, 965, 903, 934, 841, 872, 810, 841, 713 779, 810, 717, 748, 686, 717, 655, 686, 593, 624, 562, 593, 531, 562, 714 469, 500, 438, 469, 407, 438, 345, 376, 314, 345, 283, 314, 221, 252, 715 190, 221, 159, 190, 966, 997, 935, 966, 842, 873, 811, 842, 718, 749, 716 687, 718, 594, 625, 563, 594, 470, 501, 439, 470, 346, 377, 315, 346, 717 222, 253, 191, 222, 967, 998, 843, 874, 719, 750, 595, 626, 471, 502, 718 347, 378, 223, 254, 872, 903, 748, 779, 624, 655, 500, 531, 376, 407, 719 252, 283, 904, 935, 873, 904, 780, 811, 749, 780, 656, 687, 625, 656, 720 532, 563, 501, 532, 408, 439, 377, 408, 284, 315, 253, 284, 936, 967, 721 905, 936, 874, 905, 812, 843, 781, 812, 750, 781, 688, 719, 657, 688, 722 626, 657, 564, 595, 533, 564, 502, 533, 440, 471, 409, 440, 378, 409, 723 316, 347, 285, 316, 254, 285, 968, 999, 937, 968, 906, 937, 875, 906, 724 844, 875, 813, 844, 782, 813, 751, 782, 720, 751, 689, 720, 658, 689, 725 627, 658, 596, 627, 565, 596, 534, 565, 503, 534, 472, 503, 441, 472, 726 410, 441, 379, 410, 348, 379, 317, 348, 286, 317, 255, 286, 969, 1000, 727 938, 969, 907, 938, 845, 876, 814, 845, 783, 814, 721, 752, 690, 721, 728 659, 690, 597, 628, 566, 597, 535, 566, 473, 504, 442, 473, 411, 442, 729 349, 380, 318, 349, 287, 318, 970, 1001, 939, 970, 846, 877, 815, 846, 730 722, 753, 691, 722, 598, 629, 567, 598, 474, 505, 443, 474, 350, 381, 731 319, 350, 971, 1002, 847, 878, 723, 754, 599, 630, 475, 506, 351, 382, 732 876, 907, 752, 783, 628, 659, 504, 535, 380, 411, 908, 939, 877, 908, 733 784, 815, 753, 784, 660, 691, 629, 660, 536, 567, 505, 536, 412, 443, 734 381, 412, 940, 971, 909, 940, 878, 909, 816, 847, 785, 816, 754, 785, 735 692, 723, 661, 692, 630, 661, 568, 599, 537, 568, 506, 537, 444, 475, 736 413, 444, 382, 413, 972, 1003, 941, 972, 910, 941, 879, 910, 848, 879, 737 817, 848, 786, 817, 755, 786, 724, 755, 693, 724, 662, 693, 631, 662, 738 600, 631, 569, 600, 538, 569, 507, 538, 476, 507, 445, 476, 414, 445, 739 383, 414, 973, 1004, 942, 973, 911, 942, 849, 880, 818, 849, 787, 818, 740 725, 756, 694, 725, 663, 694, 601, 632, 570, 601, 539, 570, 477, 508, 741 446, 477, 415, 446, 974, 1005, 943, 974, 850, 881, 819, 850, 726, 757, 742 695, 726, 602, 633, 571, 602, 478, 509, 447, 478, 975, 1006, 851, 882, 743 727, 758, 603, 634, 479, 510, 880, 911, 756, 787, 632, 663, 508, 539, 744 912, 943, 881, 912, 788, 819, 757, 788, 664, 695, 633, 664, 540, 571, 745 509, 540, 944, 975, 913, 944, 882, 913, 820, 851, 789, 820, 758, 789, 746 696, 727, 665, 696, 634, 665, 572, 603, 541, 572, 510, 541, 976, 1007, 747 945, 976, 914, 945, 883, 914, 852, 883, 821, 852, 790, 821, 759, 790, 748 728, 759, 697, 728, 666, 697, 635, 666, 604, 635, 573, 604, 542, 573, 749 511, 542, 977, 1008, 946, 977, 915, 946, 853, 884, 822, 853, 791, 822, 750 729, 760, 698, 729, 667, 698, 605, 636, 574, 605, 543, 574, 978, 1009, 751 947, 978, 854, 885, 823, 854, 730, 761, 699, 730, 606, 637, 575, 606, 752 979, 1010, 855, 886, 731, 762, 607, 638, 884, 915, 760, 791, 636, 667, 753 916, 947, 885, 916, 792, 823, 761, 792, 668, 699, 637, 668, 948, 979, 754 917, 948, 886, 917, 824, 855, 793, 824, 762, 793, 700, 731, 669, 700, 755 638, 669, 980, 1011, 949, 980, 918, 949, 887, 918, 856, 887, 825, 856, 756 794, 825, 763, 794, 732, 763, 701, 732, 670, 701, 639, 670, 981, 1012, 757 950, 981, 919, 950, 857, 888, 826, 857, 795, 826, 733, 764, 702, 733, 758 671, 702, 982, 1013, 951, 982, 858, 889, 827, 858, 734, 765, 703, 734, 759 983, 1014, 859, 890, 735, 766, 888, 919, 764, 795, 920, 951, 889, 920, 760 796, 827, 765, 796, 952, 983, 921, 952, 890, 921, 828, 859, 797, 828, 761 766, 797, 984, 1015, 953, 984, 922, 953, 891, 922, 860, 891, 829, 860, 762 798, 829, 767, 798, 985, 1016, 954, 985, 923, 954, 861, 892, 830, 861, 763 799, 830, 986, 1017, 955, 986, 862, 893, 831, 862, 987, 1018, 863, 894, 764 892, 923, 924, 955, 893, 924, 956, 987, 925, 956, 894, 925, 988, 1019, 765 957, 988, 926, 957, 895, 926, 989, 1020, 958, 989, 927, 958, 990, 1021, 766 959, 990, 991, 1022, 0, 0, 767 }; 768 769 private static readonly short[] _vp9DefaultIscan4X4 = { 770 0, 2, 5, 8, 1, 3, 9, 12, 4, 7, 11, 14, 6, 10, 13, 15, 771 }; 772 773 private static readonly short[] _vp9ColIscan4X4 = { 774 0, 3, 7, 11, 1, 5, 9, 12, 2, 6, 10, 14, 4, 8, 13, 15, 775 }; 776 777 private static readonly short[] _vp9RowIscan4X4 = { 778 0, 1, 3, 5, 2, 4, 6, 9, 7, 8, 11, 13, 10, 12, 14, 15, 779 }; 780 781 private static readonly short[] _vp9ColIscan8X8 = { 782 0, 3, 8, 15, 22, 32, 40, 47, 1, 5, 11, 18, 26, 34, 44, 51, 783 2, 7, 13, 20, 28, 38, 46, 54, 4, 10, 16, 24, 31, 41, 50, 56, 784 6, 12, 21, 27, 35, 43, 52, 58, 9, 17, 25, 33, 39, 48, 55, 60, 785 14, 23, 30, 37, 45, 53, 59, 62, 19, 29, 36, 42, 49, 57, 61, 63, 786 }; 787 788 private static readonly short[] _vp9RowIscan8X8 = { 789 0, 1, 2, 5, 8, 12, 19, 24, 3, 4, 7, 10, 15, 20, 30, 39, 790 6, 9, 13, 16, 21, 27, 37, 46, 11, 14, 17, 23, 28, 34, 44, 52, 791 18, 22, 25, 31, 35, 41, 50, 57, 26, 29, 33, 38, 43, 49, 55, 59, 792 32, 36, 42, 47, 51, 54, 60, 61, 40, 45, 48, 53, 56, 58, 62, 63, 793 }; 794 795 private static readonly short[] _vp9DefaultIscan8X8 = { 796 0, 2, 5, 9, 14, 22, 31, 37, 1, 4, 8, 13, 19, 26, 38, 44, 797 3, 6, 10, 17, 24, 30, 42, 49, 7, 11, 15, 21, 29, 36, 47, 53, 798 12, 16, 20, 27, 34, 43, 52, 57, 18, 23, 28, 35, 41, 48, 56, 60, 799 25, 32, 39, 45, 50, 55, 59, 62, 33, 40, 46, 51, 54, 58, 61, 63, 800 }; 801 802 private static readonly short[] _vp9ColIscan16X16 = { 803 0, 4, 11, 20, 31, 43, 59, 75, 85, 109, 130, 150, 165, 181, 195, 198, 804 1, 6, 14, 23, 34, 47, 64, 81, 95, 114, 135, 153, 171, 188, 201, 212, 805 2, 8, 16, 25, 38, 52, 67, 83, 101, 116, 136, 157, 172, 190, 205, 216, 806 3, 10, 18, 29, 41, 55, 71, 89, 103, 119, 141, 159, 176, 194, 208, 218, 807 5, 12, 21, 32, 45, 58, 74, 93, 104, 123, 144, 164, 179, 196, 210, 223, 808 7, 15, 26, 37, 49, 63, 78, 96, 112, 129, 146, 166, 182, 200, 215, 228, 809 9, 19, 28, 39, 54, 69, 86, 102, 117, 132, 151, 170, 187, 206, 220, 230, 810 13, 24, 35, 46, 60, 73, 91, 108, 122, 137, 154, 174, 189, 207, 224, 235, 811 17, 30, 40, 53, 66, 82, 98, 115, 126, 142, 161, 180, 197, 213, 227, 237, 812 22, 36, 48, 62, 76, 92, 105, 120, 133, 147, 167, 186, 203, 219, 232, 240, 813 27, 44, 56, 70, 84, 99, 113, 127, 140, 156, 175, 193, 209, 226, 236, 244, 814 33, 51, 68, 79, 94, 110, 125, 138, 149, 162, 184, 202, 217, 229, 241, 247, 815 42, 61, 77, 90, 106, 121, 134, 148, 160, 173, 191, 211, 225, 238, 245, 251, 816 50, 72, 87, 100, 118, 128, 145, 158, 168, 183, 204, 222, 233, 242, 249, 253, 817 57, 80, 97, 111, 131, 143, 155, 169, 178, 192, 214, 231, 239, 246, 250, 254, 818 65, 88, 107, 124, 139, 152, 163, 177, 185, 199, 221, 234, 243, 248, 252, 255, 819 }; 820 821 private static readonly short[] _vp9RowIscan16X16 = { 822 0, 1, 2, 4, 6, 9, 12, 17, 22, 29, 36, 43, 54, 64, 76, 823 86, 3, 5, 7, 11, 15, 19, 25, 32, 38, 48, 59, 68, 84, 99, 824 115, 130, 8, 10, 13, 18, 23, 27, 33, 42, 51, 60, 72, 88, 103, 825 119, 142, 167, 14, 16, 20, 26, 31, 37, 44, 53, 61, 73, 85, 100, 826 116, 135, 161, 185, 21, 24, 30, 35, 40, 47, 55, 65, 74, 81, 94, 827 112, 133, 154, 179, 205, 28, 34, 39, 45, 50, 58, 67, 77, 87, 96, 828 106, 121, 146, 169, 196, 212, 41, 46, 49, 56, 63, 70, 79, 90, 98, 829 107, 122, 138, 159, 182, 207, 222, 52, 57, 62, 69, 75, 83, 93, 102, 830 110, 120, 134, 150, 176, 195, 215, 226, 66, 71, 78, 82, 91, 97, 108, 831 113, 127, 136, 148, 168, 188, 202, 221, 232, 80, 89, 92, 101, 105, 114, 832 125, 131, 139, 151, 162, 177, 192, 208, 223, 234, 95, 104, 109, 117, 123, 833 128, 143, 144, 155, 165, 175, 190, 206, 219, 233, 239, 111, 118, 124, 129, 834 140, 147, 157, 164, 170, 181, 191, 203, 224, 230, 240, 243, 126, 132, 137, 835 145, 153, 160, 174, 178, 184, 197, 204, 216, 231, 237, 244, 246, 141, 149, 836 156, 166, 172, 180, 189, 199, 200, 210, 220, 228, 238, 242, 249, 251, 152, 837 163, 171, 183, 186, 193, 201, 211, 214, 218, 227, 236, 245, 247, 252, 253, 838 158, 173, 187, 194, 198, 209, 213, 217, 225, 229, 235, 241, 248, 250, 254, 839 255, 840 }; 841 842 private static readonly short[] _vp9DefaultIscan16X16 = { 843 0, 2, 5, 9, 17, 24, 36, 44, 55, 72, 88, 104, 128, 143, 166, 844 179, 1, 4, 8, 13, 20, 30, 40, 54, 66, 79, 96, 113, 141, 154, 845 178, 196, 3, 7, 11, 18, 25, 33, 46, 57, 71, 86, 101, 119, 148, 846 164, 186, 201, 6, 12, 16, 23, 31, 39, 53, 64, 78, 92, 110, 127, 847 153, 169, 193, 208, 10, 14, 19, 28, 37, 47, 58, 67, 84, 98, 114, 848 133, 161, 176, 198, 214, 15, 21, 26, 34, 43, 52, 65, 77, 91, 106, 849 120, 140, 165, 185, 205, 221, 22, 27, 32, 41, 48, 60, 73, 85, 99, 850 116, 130, 151, 175, 190, 211, 225, 29, 35, 42, 49, 59, 69, 81, 95, 851 108, 125, 139, 155, 182, 197, 217, 229, 38, 45, 51, 61, 68, 80, 93, 852 105, 118, 134, 150, 168, 191, 207, 223, 234, 50, 56, 63, 74, 83, 94, 853 109, 117, 129, 147, 163, 177, 199, 213, 228, 238, 62, 70, 76, 87, 97, 854 107, 122, 131, 145, 159, 172, 188, 210, 222, 235, 242, 75, 82, 90, 102, 855 112, 124, 138, 146, 157, 173, 187, 202, 219, 230, 240, 245, 89, 100, 111, 856 123, 132, 142, 156, 167, 180, 189, 203, 216, 231, 237, 246, 250, 103, 115, 857 126, 136, 149, 162, 171, 183, 194, 204, 215, 224, 236, 241, 248, 252, 121, 858 135, 144, 158, 170, 181, 192, 200, 209, 218, 227, 233, 243, 244, 251, 254, 859 137, 152, 160, 174, 184, 195, 206, 212, 220, 226, 232, 239, 247, 249, 253, 860 255, 861 }; 862 863 private static readonly short[] _vp9DefaultIscan32X32 = { 864 0, 2, 5, 10, 17, 25, 38, 47, 62, 83, 101, 121, 145, 865 170, 193, 204, 210, 219, 229, 233, 245, 257, 275, 299, 342, 356, 866 377, 405, 455, 471, 495, 527, 1, 4, 8, 15, 22, 30, 45, 867 58, 74, 92, 112, 133, 158, 184, 203, 215, 222, 228, 234, 237, 868 256, 274, 298, 317, 355, 376, 404, 426, 470, 494, 526, 551, 3, 869 7, 12, 18, 28, 36, 52, 64, 82, 102, 118, 142, 164, 189, 870 208, 217, 224, 231, 235, 238, 273, 297, 316, 329, 375, 403, 425, 871 440, 493, 525, 550, 567, 6, 11, 16, 23, 31, 43, 60, 73, 872 90, 109, 126, 150, 173, 196, 211, 220, 226, 232, 236, 239, 296, 873 315, 328, 335, 402, 424, 439, 447, 524, 549, 566, 575, 9, 14, 874 19, 29, 37, 50, 65, 78, 95, 116, 134, 157, 179, 201, 214, 875 223, 244, 255, 272, 295, 341, 354, 374, 401, 454, 469, 492, 523, 876 582, 596, 617, 645, 13, 20, 26, 35, 44, 54, 72, 85, 105, 877 123, 140, 163, 182, 205, 216, 225, 254, 271, 294, 314, 353, 373, 878 400, 423, 468, 491, 522, 548, 595, 616, 644, 666, 21, 27, 33, 879 42, 53, 63, 80, 94, 113, 132, 151, 172, 190, 209, 218, 227, 880 270, 293, 313, 327, 372, 399, 422, 438, 490, 521, 547, 565, 615, 881 643, 665, 680, 24, 32, 39, 48, 57, 71, 88, 104, 120, 139, 882 159, 178, 197, 212, 221, 230, 292, 312, 326, 334, 398, 421, 437, 883 446, 520, 546, 564, 574, 642, 664, 679, 687, 34, 40, 46, 56, 884 68, 81, 96, 111, 130, 147, 167, 186, 243, 253, 269, 291, 340, 885 352, 371, 397, 453, 467, 489, 519, 581, 594, 614, 641, 693, 705, 886 723, 747, 41, 49, 55, 67, 77, 91, 107, 124, 138, 161, 177, 887 194, 252, 268, 290, 311, 351, 370, 396, 420, 466, 488, 518, 545, 888 593, 613, 640, 663, 704, 722, 746, 765, 51, 59, 66, 76, 89, 889 99, 119, 131, 149, 168, 181, 200, 267, 289, 310, 325, 369, 395, 890 419, 436, 487, 517, 544, 563, 612, 639, 662, 678, 721, 745, 764, 891 777, 61, 69, 75, 87, 100, 114, 129, 144, 162, 180, 191, 207, 892 288, 309, 324, 333, 394, 418, 435, 445, 516, 543, 562, 573, 638, 893 661, 677, 686, 744, 763, 776, 783, 70, 79, 86, 97, 108, 122, 894 137, 155, 242, 251, 266, 287, 339, 350, 368, 393, 452, 465, 486, 895 515, 580, 592, 611, 637, 692, 703, 720, 743, 788, 798, 813, 833, 896 84, 93, 103, 110, 125, 141, 154, 171, 250, 265, 286, 308, 349, 897 367, 392, 417, 464, 485, 514, 542, 591, 610, 636, 660, 702, 719, 898 742, 762, 797, 812, 832, 848, 98, 106, 115, 127, 143, 156, 169, 899 185, 264, 285, 307, 323, 366, 391, 416, 434, 484, 513, 541, 561, 900 609, 635, 659, 676, 718, 741, 761, 775, 811, 831, 847, 858, 117, 901 128, 136, 148, 160, 175, 188, 198, 284, 306, 322, 332, 390, 415, 902 433, 444, 512, 540, 560, 572, 634, 658, 675, 685, 740, 760, 774, 903 782, 830, 846, 857, 863, 135, 146, 152, 165, 241, 249, 263, 283, 904 338, 348, 365, 389, 451, 463, 483, 511, 579, 590, 608, 633, 691, 905 701, 717, 739, 787, 796, 810, 829, 867, 875, 887, 903, 153, 166, 906 174, 183, 248, 262, 282, 305, 347, 364, 388, 414, 462, 482, 510, 907 539, 589, 607, 632, 657, 700, 716, 738, 759, 795, 809, 828, 845, 908 874, 886, 902, 915, 176, 187, 195, 202, 261, 281, 304, 321, 363, 909 387, 413, 432, 481, 509, 538, 559, 606, 631, 656, 674, 715, 737, 910 758, 773, 808, 827, 844, 856, 885, 901, 914, 923, 192, 199, 206, 911 213, 280, 303, 320, 331, 386, 412, 431, 443, 508, 537, 558, 571, 912 630, 655, 673, 684, 736, 757, 772, 781, 826, 843, 855, 862, 900, 913 913, 922, 927, 240, 247, 260, 279, 337, 346, 362, 385, 450, 461, 914 480, 507, 578, 588, 605, 629, 690, 699, 714, 735, 786, 794, 807, 915 825, 866, 873, 884, 899, 930, 936, 945, 957, 246, 259, 278, 302, 916 345, 361, 384, 411, 460, 479, 506, 536, 587, 604, 628, 654, 698, 917 713, 734, 756, 793, 806, 824, 842, 872, 883, 898, 912, 935, 944, 918 956, 966, 258, 277, 301, 319, 360, 383, 410, 430, 478, 505, 535, 919 557, 603, 627, 653, 672, 712, 733, 755, 771, 805, 823, 841, 854, 920 882, 897, 911, 921, 943, 955, 965, 972, 276, 300, 318, 330, 382, 921 409, 429, 442, 504, 534, 556, 570, 626, 652, 671, 683, 732, 754, 922 770, 780, 822, 840, 853, 861, 896, 910, 920, 926, 954, 964, 971, 923 975, 336, 344, 359, 381, 449, 459, 477, 503, 577, 586, 602, 625, 924 689, 697, 711, 731, 785, 792, 804, 821, 865, 871, 881, 895, 929, 925 934, 942, 953, 977, 981, 987, 995, 343, 358, 380, 408, 458, 476, 926 502, 533, 585, 601, 624, 651, 696, 710, 730, 753, 791, 803, 820, 927 839, 870, 880, 894, 909, 933, 941, 952, 963, 980, 986, 994, 1001, 928 357, 379, 407, 428, 475, 501, 532, 555, 600, 623, 650, 670, 709, 929 729, 752, 769, 802, 819, 838, 852, 879, 893, 908, 919, 940, 951, 930 962, 970, 985, 993, 1000, 1005, 378, 406, 427, 441, 500, 531, 554, 931 569, 622, 649, 669, 682, 728, 751, 768, 779, 818, 837, 851, 860, 932 892, 907, 918, 925, 950, 961, 969, 974, 992, 999, 1004, 1007, 448, 933 457, 474, 499, 576, 584, 599, 621, 688, 695, 708, 727, 784, 790, 934 801, 817, 864, 869, 878, 891, 928, 932, 939, 949, 976, 979, 984, 935 991, 1008, 1010, 1013, 1017, 456, 473, 498, 530, 583, 598, 620, 648, 936 694, 707, 726, 750, 789, 800, 816, 836, 868, 877, 890, 906, 931, 937 938, 948, 960, 978, 983, 990, 998, 1009, 1012, 1016, 1020, 472, 497, 938 529, 553, 597, 619, 647, 668, 706, 725, 749, 767, 799, 815, 835, 939 850, 876, 889, 905, 917, 937, 947, 959, 968, 982, 989, 997, 1003, 940 1011, 1015, 1019, 1022, 496, 528, 552, 568, 618, 646, 667, 681, 724, 941 748, 766, 778, 814, 834, 849, 859, 888, 904, 916, 924, 946, 958, 942 967, 973, 988, 996, 1002, 1006, 1014, 1018, 1021, 1023, 943 }; 944 945 public class ScanOrder 946 { 947 public short[] Scan { get; } 948 public short[] IScan { get; } 949 public short[] Neighbors { get; } 950 951 public ScanOrder(short[] scan, short[] iScan, short[] neighbors) 952 { 953 Scan = scan; 954 IScan = iScan; 955 Neighbors = neighbors; 956 } 957 } 958 959 public static readonly ScanOrder[] Vp9DefaultScanOrders = { 960 new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), 961 new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), 962 new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), 963 new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), 964 }; 965 966 public static readonly ScanOrder[][] Vp9ScanOrders = { 967 new ScanOrder[] 968 { // TX_4X4 969 new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), 970 new(_rowScan4X4, _vp9RowIscan4X4, _rowScan4X4Neighbors), 971 new(_colScan4X4, _vp9ColIscan4X4, _colScan4X4Neighbors), 972 new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), 973 }, 974 new ScanOrder[] 975 { // TX_8X8 976 new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), 977 new(_rowScan8X8, _vp9RowIscan8X8, _rowScan8X8Neighbors), 978 new(_colScan8X8, _vp9ColIscan8X8, _colScan8X8Neighbors), 979 new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), 980 }, 981 new ScanOrder[] 982 { // TX_16X16 983 new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), 984 new(_rowScan16X16, _vp9RowIscan16X16, _rowScan16X16Neighbors), 985 new(_colScan16X16, _vp9ColIscan16X16, _colScan16X16Neighbors), 986 new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), 987 }, 988 new ScanOrder[] 989 { // TX_32X32 990 new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), 991 new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), 992 new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), 993 new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), 994 }, 995 }; 996 997 // Entropy MV 998 999 public static readonly sbyte[] Vp9MvJointTree = { 1000 -(sbyte)MvJointType.MvJointZero, 2, -(sbyte)MvJointType.MvJointHnzvz, 4, -(sbyte)MvJointType.MvJointHzvnz, -(sbyte)MvJointType.MvJointHnzvnz, 1001 }; 1002 1003 public static readonly sbyte[] Vp9MvClassTree = { 1004 -(sbyte)MvClassType.MvClass0, 1005 2, 1006 -(sbyte)MvClassType.MvClass1, 1007 4, 1008 6, 1009 8, 1010 -(sbyte)MvClassType.MvClass2, 1011 -(sbyte)MvClassType.MvClass3, 1012 10, 1013 12, 1014 -(sbyte)MvClassType.MvClass4, 1015 -(sbyte)MvClassType.MvClass5, 1016 -(sbyte)MvClassType.MvClass6, 1017 14, 1018 16, 1019 18, 1020 -(sbyte)MvClassType.MvClass7, 1021 -(sbyte)MvClassType.MvClass8, 1022 -(sbyte)MvClassType.MvClass9, 1023 -(sbyte)MvClassType.MvClass10, 1024 }; 1025 1026 public static ReadOnlySpan<sbyte> Vp9MvFPTree => new sbyte[] { -0, 2, -1, 4, -2, -3 }; 1027 1028 // Entropy 1029 1030 public static ReadOnlySpan<byte> Vp9Cat1Prob => new byte[] { 159 }; 1031 public static ReadOnlySpan<byte> Vp9Cat2Prob => new byte[] { 165, 145 }; 1032 public static ReadOnlySpan<byte> Vp9Cat3Prob => new byte[] { 173, 148, 140 }; 1033 public static ReadOnlySpan<byte> Vp9Cat4Prob => new byte[] { 176, 155, 140, 135 }; 1034 public static ReadOnlySpan<byte> Vp9Cat5Prob => new byte[] { 180, 157, 141, 134, 130 }; 1035 public static ReadOnlySpan<byte> Vp9Cat6Prob => new byte[] { 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 }; 1036 1037 public static ReadOnlySpan<byte> Vp9Cat6ProbHigh12 => new byte[] 1038 { 1039 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129, 1040 }; 1041 1042 private static readonly byte[] _vp9CoefbandTrans8X8Plus = { 1043 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 1044 // Beyond MAXBAND_INDEX+1 all values are filled as 5 1045 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1046 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1047 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1048 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1049 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1050 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1051 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1052 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1053 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1054 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1055 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1056 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1057 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1058 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1059 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1060 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1061 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1062 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1063 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1064 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1065 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1066 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1067 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1068 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1069 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1070 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1071 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1072 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1073 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1074 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1075 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1076 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1077 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1078 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1079 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1080 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1081 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1082 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1083 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1084 }; 1085 1086 private static ReadOnlySpan<byte> Vp9CoefbandTrans4X4 => new byte[] 1087 { 1088 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 1089 }; 1090 1091 public static ReadOnlySpan<byte> GetBandTranslate(TxSize txSize) 1092 { 1093 return txSize == TxSize.Tx4x4 ? Vp9CoefbandTrans4X4 : _vp9CoefbandTrans8X8Plus; 1094 } 1095 1096 public static readonly byte[][] Vp9Pareto8Full = { 1097 new byte[] { 3, 86, 128, 6, 86, 23, 88, 29 }, 1098 new byte[] { 6, 86, 128, 11, 87, 42, 91, 52 }, 1099 new byte[] { 9, 86, 129, 17, 88, 61, 94, 76 }, 1100 new byte[] { 12, 86, 129, 22, 88, 77, 97, 93 }, 1101 new byte[] { 15, 87, 129, 28, 89, 93, 100, 110 }, 1102 new byte[] { 17, 87, 129, 33, 90, 105, 103, 123 }, 1103 new byte[] { 20, 88, 130, 38, 91, 118, 106, 136 }, 1104 new byte[] { 23, 88, 130, 43, 91, 128, 108, 146 }, 1105 new byte[] { 26, 89, 131, 48, 92, 139, 111, 156 }, 1106 new byte[] { 28, 89, 131, 53, 93, 147, 114, 163 }, 1107 new byte[] { 31, 90, 131, 58, 94, 156, 117, 171 }, 1108 new byte[] { 34, 90, 131, 62, 94, 163, 119, 177 }, 1109 new byte[] { 37, 90, 132, 66, 95, 171, 122, 184 }, 1110 new byte[] { 39, 90, 132, 70, 96, 177, 124, 189 }, 1111 new byte[] { 42, 91, 132, 75, 97, 183, 127, 194 }, 1112 new byte[] { 44, 91, 132, 79, 97, 188, 129, 198 }, 1113 new byte[] { 47, 92, 133, 83, 98, 193, 132, 202 }, 1114 new byte[] { 49, 92, 133, 86, 99, 197, 134, 205 }, 1115 new byte[] { 52, 93, 133, 90, 100, 201, 137, 208 }, 1116 new byte[] { 54, 93, 133, 94, 100, 204, 139, 211 }, 1117 new byte[] { 57, 94, 134, 98, 101, 208, 142, 214 }, 1118 new byte[] { 59, 94, 134, 101, 102, 211, 144, 216 }, 1119 new byte[] { 62, 94, 135, 105, 103, 214, 146, 218 }, 1120 new byte[] { 64, 94, 135, 108, 103, 216, 148, 220 }, 1121 new byte[] { 66, 95, 135, 111, 104, 219, 151, 222 }, 1122 new byte[] { 68, 95, 135, 114, 105, 221, 153, 223 }, 1123 new byte[] { 71, 96, 136, 117, 106, 224, 155, 225 }, 1124 new byte[] { 73, 96, 136, 120, 106, 225, 157, 226 }, 1125 new byte[] { 76, 97, 136, 123, 107, 227, 159, 228 }, 1126 new byte[] { 78, 97, 136, 126, 108, 229, 160, 229 }, 1127 new byte[] { 80, 98, 137, 129, 109, 231, 162, 231 }, 1128 new byte[] { 82, 98, 137, 131, 109, 232, 164, 232 }, 1129 new byte[] { 84, 98, 138, 134, 110, 234, 166, 233 }, 1130 new byte[] { 86, 98, 138, 137, 111, 235, 168, 234 }, 1131 new byte[] { 89, 99, 138, 140, 112, 236, 170, 235 }, 1132 new byte[] { 91, 99, 138, 142, 112, 237, 171, 235 }, 1133 new byte[] { 93, 100, 139, 145, 113, 238, 173, 236 }, 1134 new byte[] { 95, 100, 139, 147, 114, 239, 174, 237 }, 1135 new byte[] { 97, 101, 140, 149, 115, 240, 176, 238 }, 1136 new byte[] { 99, 101, 140, 151, 115, 241, 177, 238 }, 1137 new byte[] { 101, 102, 140, 154, 116, 242, 179, 239 }, 1138 new byte[] { 103, 102, 140, 156, 117, 242, 180, 239 }, 1139 new byte[] { 105, 103, 141, 158, 118, 243, 182, 240 }, 1140 new byte[] { 107, 103, 141, 160, 118, 243, 183, 240 }, 1141 new byte[] { 109, 104, 141, 162, 119, 244, 185, 241 }, 1142 new byte[] { 111, 104, 141, 164, 119, 244, 186, 241 }, 1143 new byte[] { 113, 104, 142, 166, 120, 245, 187, 242 }, 1144 new byte[] { 114, 104, 142, 168, 121, 245, 188, 242 }, 1145 new byte[] { 116, 105, 143, 170, 122, 246, 190, 243 }, 1146 new byte[] { 118, 105, 143, 171, 122, 246, 191, 243 }, 1147 new byte[] { 120, 106, 143, 173, 123, 247, 192, 244 }, 1148 new byte[] { 121, 106, 143, 175, 124, 247, 193, 244 }, 1149 new byte[] { 123, 107, 144, 177, 125, 248, 195, 244 }, 1150 new byte[] { 125, 107, 144, 178, 125, 248, 196, 244 }, 1151 new byte[] { 127, 108, 145, 180, 126, 249, 197, 245 }, 1152 new byte[] { 128, 108, 145, 181, 127, 249, 198, 245 }, 1153 new byte[] { 130, 109, 145, 183, 128, 249, 199, 245 }, 1154 new byte[] { 132, 109, 145, 184, 128, 249, 200, 245 }, 1155 new byte[] { 134, 110, 146, 186, 129, 250, 201, 246 }, 1156 new byte[] { 135, 110, 146, 187, 130, 250, 202, 246 }, 1157 new byte[] { 137, 111, 147, 189, 131, 251, 203, 246 }, 1158 new byte[] { 138, 111, 147, 190, 131, 251, 204, 246 }, 1159 new byte[] { 140, 112, 147, 192, 132, 251, 205, 247 }, 1160 new byte[] { 141, 112, 147, 193, 132, 251, 206, 247 }, 1161 new byte[] { 143, 113, 148, 194, 133, 251, 207, 247 }, 1162 new byte[] { 144, 113, 148, 195, 134, 251, 207, 247 }, 1163 new byte[] { 146, 114, 149, 197, 135, 252, 208, 248 }, 1164 new byte[] { 147, 114, 149, 198, 135, 252, 209, 248 }, 1165 new byte[] { 149, 115, 149, 199, 136, 252, 210, 248 }, 1166 new byte[] { 150, 115, 149, 200, 137, 252, 210, 248 }, 1167 new byte[] { 152, 115, 150, 201, 138, 252, 211, 248 }, 1168 new byte[] { 153, 115, 150, 202, 138, 252, 212, 248 }, 1169 new byte[] { 155, 116, 151, 204, 139, 253, 213, 249 }, 1170 new byte[] { 156, 116, 151, 205, 139, 253, 213, 249 }, 1171 new byte[] { 158, 117, 151, 206, 140, 253, 214, 249 }, 1172 new byte[] { 159, 117, 151, 207, 141, 253, 215, 249 }, 1173 new byte[] { 161, 118, 152, 208, 142, 253, 216, 249 }, 1174 new byte[] { 162, 118, 152, 209, 142, 253, 216, 249 }, 1175 new byte[] { 163, 119, 153, 210, 143, 253, 217, 249 }, 1176 new byte[] { 164, 119, 153, 211, 143, 253, 217, 249 }, 1177 new byte[] { 166, 120, 153, 212, 144, 254, 218, 250 }, 1178 new byte[] { 167, 120, 153, 212, 145, 254, 219, 250 }, 1179 new byte[] { 168, 121, 154, 213, 146, 254, 220, 250 }, 1180 new byte[] { 169, 121, 154, 214, 146, 254, 220, 250 }, 1181 new byte[] { 171, 122, 155, 215, 147, 254, 221, 250 }, 1182 new byte[] { 172, 122, 155, 216, 147, 254, 221, 250 }, 1183 new byte[] { 173, 123, 155, 217, 148, 254, 222, 250 }, 1184 new byte[] { 174, 123, 155, 217, 149, 254, 222, 250 }, 1185 new byte[] { 176, 124, 156, 218, 150, 254, 223, 250 }, 1186 new byte[] { 177, 124, 156, 219, 150, 254, 223, 250 }, 1187 new byte[] { 178, 125, 157, 220, 151, 254, 224, 251 }, 1188 new byte[] { 179, 125, 157, 220, 151, 254, 224, 251 }, 1189 new byte[] { 180, 126, 157, 221, 152, 254, 225, 251 }, 1190 new byte[] { 181, 126, 157, 221, 152, 254, 225, 251 }, 1191 new byte[] { 183, 127, 158, 222, 153, 254, 226, 251 }, 1192 new byte[] { 184, 127, 158, 223, 154, 254, 226, 251 }, 1193 new byte[] { 185, 128, 159, 224, 155, 255, 227, 251 }, 1194 new byte[] { 186, 128, 159, 224, 155, 255, 227, 251 }, 1195 new byte[] { 187, 129, 160, 225, 156, 255, 228, 251 }, 1196 new byte[] { 188, 130, 160, 225, 156, 255, 228, 251 }, 1197 new byte[] { 189, 131, 160, 226, 157, 255, 228, 251 }, 1198 new byte[] { 190, 131, 160, 226, 158, 255, 228, 251 }, 1199 new byte[] { 191, 132, 161, 227, 159, 255, 229, 251 }, 1200 new byte[] { 192, 132, 161, 227, 159, 255, 229, 251 }, 1201 new byte[] { 193, 133, 162, 228, 160, 255, 230, 252 }, 1202 new byte[] { 194, 133, 162, 229, 160, 255, 230, 252 }, 1203 new byte[] { 195, 134, 163, 230, 161, 255, 231, 252 }, 1204 new byte[] { 196, 134, 163, 230, 161, 255, 231, 252 }, 1205 new byte[] { 197, 135, 163, 231, 162, 255, 231, 252 }, 1206 new byte[] { 198, 135, 163, 231, 162, 255, 231, 252 }, 1207 new byte[] { 199, 136, 164, 232, 163, 255, 232, 252 }, 1208 new byte[] { 200, 136, 164, 232, 164, 255, 232, 252 }, 1209 new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, 1210 new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, 1211 new byte[] { 202, 138, 166, 233, 166, 255, 233, 252 }, 1212 new byte[] { 203, 138, 166, 233, 166, 255, 233, 252 }, 1213 new byte[] { 204, 139, 166, 234, 167, 255, 234, 252 }, 1214 new byte[] { 205, 139, 166, 234, 167, 255, 234, 252 }, 1215 new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, 1216 new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, 1217 new byte[] { 207, 141, 168, 236, 169, 255, 235, 252 }, 1218 new byte[] { 208, 141, 168, 236, 170, 255, 235, 252 }, 1219 new byte[] { 209, 142, 169, 237, 171, 255, 236, 252 }, 1220 new byte[] { 209, 143, 169, 237, 171, 255, 236, 252 }, 1221 new byte[] { 210, 144, 169, 237, 172, 255, 236, 252 }, 1222 new byte[] { 211, 144, 169, 237, 172, 255, 236, 252 }, 1223 new byte[] { 212, 145, 170, 238, 173, 255, 237, 252 }, 1224 new byte[] { 213, 145, 170, 238, 173, 255, 237, 252 }, 1225 new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, 1226 new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, 1227 new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, 1228 new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, 1229 new byte[] { 216, 148, 173, 240, 176, 255, 238, 253 }, 1230 new byte[] { 217, 148, 173, 240, 176, 255, 238, 253 }, 1231 new byte[] { 218, 149, 173, 241, 177, 255, 239, 253 }, 1232 new byte[] { 218, 149, 173, 241, 178, 255, 239, 253 }, 1233 new byte[] { 219, 150, 174, 241, 179, 255, 239, 253 }, 1234 new byte[] { 219, 151, 174, 241, 179, 255, 239, 253 }, 1235 new byte[] { 220, 152, 175, 242, 180, 255, 240, 253 }, 1236 new byte[] { 221, 152, 175, 242, 180, 255, 240, 253 }, 1237 new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, 1238 new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, 1239 new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, 1240 new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, 1241 new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, 1242 new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, 1243 new byte[] { 225, 156, 178, 244, 184, 255, 241, 253 }, 1244 new byte[] { 225, 157, 178, 244, 184, 255, 241, 253 }, 1245 new byte[] { 226, 158, 179, 244, 185, 255, 242, 253 }, 1246 new byte[] { 227, 158, 179, 244, 185, 255, 242, 253 }, 1247 new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, 1248 new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, 1249 new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, 1250 new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, 1251 new byte[] { 230, 161, 182, 246, 188, 255, 243, 253 }, 1252 new byte[] { 230, 162, 182, 246, 188, 255, 243, 253 }, 1253 new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, 1254 new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, 1255 new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, 1256 new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, 1257 new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, 1258 new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, 1259 new byte[] { 234, 166, 185, 247, 192, 255, 244, 253 }, 1260 new byte[] { 234, 167, 185, 247, 192, 255, 244, 253 }, 1261 new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, 1262 new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, 1263 new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, 1264 new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, 1265 new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, 1266 new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, 1267 new byte[] { 237, 171, 189, 249, 196, 255, 245, 254 }, 1268 new byte[] { 237, 172, 189, 249, 196, 255, 245, 254 }, 1269 new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, 1270 new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, 1271 new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, 1272 new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, 1273 new byte[] { 240, 175, 192, 249, 199, 255, 246, 254 }, 1274 new byte[] { 240, 176, 192, 249, 199, 255, 246, 254 }, 1275 new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, 1276 new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, 1277 new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, 1278 new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, 1279 new byte[] { 242, 179, 195, 250, 202, 255, 246, 254 }, 1280 new byte[] { 242, 180, 195, 250, 202, 255, 246, 254 }, 1281 new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, 1282 new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, 1283 new byte[] { 243, 182, 197, 251, 204, 255, 247, 254 }, 1284 new byte[] { 243, 183, 197, 251, 204, 255, 247, 254 }, 1285 new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, 1286 new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, 1287 new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, 1288 new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, 1289 new byte[] { 245, 186, 200, 251, 207, 255, 247, 254 }, 1290 new byte[] { 245, 187, 200, 251, 207, 255, 247, 254 }, 1291 new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, 1292 new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, 1293 new byte[] { 246, 189, 202, 252, 208, 255, 248, 254 }, 1294 new byte[] { 246, 190, 202, 252, 208, 255, 248, 254 }, 1295 new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, 1296 new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, 1297 new byte[] { 247, 192, 204, 252, 210, 255, 248, 254 }, 1298 new byte[] { 247, 193, 204, 252, 210, 255, 248, 254 }, 1299 new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, 1300 new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, 1301 new byte[] { 248, 195, 206, 252, 212, 255, 249, 254 }, 1302 new byte[] { 248, 196, 206, 252, 212, 255, 249, 254 }, 1303 new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, 1304 new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, 1305 new byte[] { 249, 198, 208, 253, 214, 255, 249, 254 }, 1306 new byte[] { 249, 199, 209, 253, 214, 255, 249, 254 }, 1307 new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, 1308 new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, 1309 new byte[] { 250, 201, 211, 253, 215, 255, 249, 254 }, 1310 new byte[] { 250, 202, 211, 253, 215, 255, 249, 254 }, 1311 new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, 1312 new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, 1313 new byte[] { 251, 204, 213, 253, 217, 255, 250, 254 }, 1314 new byte[] { 251, 205, 213, 253, 217, 255, 250, 254 }, 1315 new byte[] { 251, 206, 214, 254, 218, 255, 250, 254 }, 1316 new byte[] { 251, 206, 215, 254, 218, 255, 250, 254 }, 1317 new byte[] { 252, 207, 216, 254, 219, 255, 250, 254 }, 1318 new byte[] { 252, 208, 216, 254, 219, 255, 250, 254 }, 1319 new byte[] { 252, 209, 217, 254, 220, 255, 250, 254 }, 1320 new byte[] { 252, 210, 217, 254, 220, 255, 250, 254 }, 1321 new byte[] { 252, 211, 218, 254, 221, 255, 250, 254 }, 1322 new byte[] { 252, 212, 218, 254, 221, 255, 250, 254 }, 1323 new byte[] { 253, 213, 219, 254, 222, 255, 250, 254 }, 1324 new byte[] { 253, 213, 220, 254, 222, 255, 250, 254 }, 1325 new byte[] { 253, 214, 221, 254, 223, 255, 250, 254 }, 1326 new byte[] { 253, 215, 221, 254, 223, 255, 250, 254 }, 1327 new byte[] { 253, 216, 222, 254, 224, 255, 251, 254 }, 1328 new byte[] { 253, 217, 223, 254, 224, 255, 251, 254 }, 1329 new byte[] { 253, 218, 224, 254, 225, 255, 251, 254 }, 1330 new byte[] { 253, 219, 224, 254, 225, 255, 251, 254 }, 1331 new byte[] { 254, 220, 225, 254, 225, 255, 251, 254 }, 1332 new byte[] { 254, 221, 226, 254, 225, 255, 251, 254 }, 1333 new byte[] { 254, 222, 227, 255, 226, 255, 251, 254 }, 1334 new byte[] { 254, 223, 227, 255, 226, 255, 251, 254 }, 1335 new byte[] { 254, 224, 228, 255, 227, 255, 251, 254 }, 1336 new byte[] { 254, 225, 229, 255, 227, 255, 251, 254 }, 1337 new byte[] { 254, 226, 230, 255, 228, 255, 251, 254 }, 1338 new byte[] { 254, 227, 230, 255, 229, 255, 251, 254 }, 1339 new byte[] { 255, 228, 231, 255, 230, 255, 251, 254 }, 1340 new byte[] { 255, 229, 232, 255, 230, 255, 251, 254 }, 1341 new byte[] { 255, 230, 233, 255, 231, 255, 252, 254 }, 1342 new byte[] { 255, 231, 234, 255, 231, 255, 252, 254 }, 1343 new byte[] { 255, 232, 235, 255, 232, 255, 252, 254 }, 1344 new byte[] { 255, 233, 236, 255, 232, 255, 252, 254 }, 1345 new byte[] { 255, 235, 237, 255, 233, 255, 252, 254 }, 1346 new byte[] { 255, 236, 238, 255, 234, 255, 252, 254 }, 1347 new byte[] { 255, 238, 240, 255, 235, 255, 252, 255 }, 1348 new byte[] { 255, 239, 241, 255, 235, 255, 252, 254 }, 1349 new byte[] { 255, 241, 243, 255, 236, 255, 252, 254 }, 1350 new byte[] { 255, 243, 245, 255, 237, 255, 252, 254 }, 1351 new byte[] { 255, 246, 247, 255, 239, 255, 253, 255 }, 1352 }; 1353 1354 // Array indices are identical to previously-existing INTRAMODECONTEXTNODES. 1355 public static readonly sbyte[] Vp9IntraModeTree = { 1356 -(sbyte)PredictionMode.DcPred, 2, // 0 = DC_NODE 1357 -(sbyte)PredictionMode.TmPred, 4, // 1 = TM_NODE 1358 -(sbyte)PredictionMode.VPred, 6, // 2 = V_NODE 1359 8, 12, // 3 = COM_NODE 1360 -(sbyte)PredictionMode.HPred, 10, // 4 = H_NODE 1361 -(sbyte)PredictionMode.D135Pred, -(sbyte)PredictionMode.D117Pred, // 5 = D135_NODE 1362 -(sbyte)PredictionMode.D45Pred, 14, // 6 = D45_NODE 1363 -(sbyte)PredictionMode.D63Pred, 16, // 7 = D63_NODE 1364 -(sbyte)PredictionMode.D153Pred, -(sbyte)PredictionMode.D207Pred, // 8 = D153_NODE 1365 }; 1366 1367 public static readonly sbyte[] Vp9InterModeTree = { 1368 -((sbyte)PredictionMode.ZeroMv - (sbyte)PredictionMode. NearestMv), 2, 1369 -((sbyte)PredictionMode.NearestMv - (sbyte)PredictionMode.NearestMv), 4, 1370 -((sbyte)PredictionMode.NearMv - (sbyte)PredictionMode.NearestMv), 1371 -((sbyte)PredictionMode.NewMv - (sbyte)PredictionMode.NearestMv), 1372 }; 1373 1374 public static readonly sbyte[] Vp9PartitionTree = { 1375 -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit, 1376 }; 1377 1378 public static readonly sbyte[] Vp9SwitchableInterpTree = { 1379 -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp, 1380 }; 1381 1382 public static readonly sbyte[] Vp9SegmentTree = { 1383 2, 4, 6, 8, 10, 12, 0, -1, -2, -3, -4, -5, -6, -7, 1384 }; 1385 1386 // MV Ref 1387 1388 // This is used to figure out a context for the ref blocks. The code flattens 1389 // an array that would have 3 possible counts (0, 1 & 2) for 3 choices by 1390 // adding 9 for each intra block, 3 for each zero mv and 1 for each new 1391 // motion vector. This single number is then converted into a context 1392 // with a single lookup ( CounterToContext ). 1393 public static readonly int[] Mode2Counter = { 1394 9, // DC_PRED 1395 9, // V_PRED 1396 9, // H_PRED 1397 9, // D45_PRED 1398 9, // D135_PRED 1399 9, // D117_PRED 1400 9, // D153_PRED 1401 9, // D207_PRED 1402 9, // D63_PRED 1403 9, // TM_PRED 1404 0, // NEARESTMV 1405 0, // NEARMV 1406 3, // ZEROMV 1407 1, // NEWMV 1408 }; 1409 1410 // There are 3^3 different combinations of 3 counts that can be either 0,1 or 1411 // 2. However the actual count can never be greater than 2 so the highest 1412 // counter we need is 18. 9 is an invalid counter that's never used. 1413 public static readonly MotionVectorContext[] CounterToContext = { 1414 MotionVectorContext.BothPredicted, // 0 1415 MotionVectorContext.NewPlusNonIntra, // 1 1416 MotionVectorContext.BothNew, // 2 1417 MotionVectorContext.ZeroPlusPredicted, // 3 1418 MotionVectorContext.NewPlusNonIntra, // 4 1419 MotionVectorContext.InvalidCase, // 5 1420 MotionVectorContext.BothZero, // 6 1421 MotionVectorContext.InvalidCase, // 7 1422 MotionVectorContext.InvalidCase, // 8 1423 MotionVectorContext.IntraPlusNonIntra, // 9 1424 MotionVectorContext.IntraPlusNonIntra, // 10 1425 MotionVectorContext.InvalidCase, // 11 1426 MotionVectorContext.IntraPlusNonIntra, // 12 1427 MotionVectorContext.InvalidCase, // 13 1428 MotionVectorContext.InvalidCase, // 14 1429 MotionVectorContext.InvalidCase, // 15 1430 MotionVectorContext.InvalidCase, // 16 1431 MotionVectorContext.InvalidCase, // 17 1432 MotionVectorContext.BothIntra, // 18 1433 }; 1434 1435 public static readonly Position[][] MvRefBlocks = { 1436 // 4X4 1437 new Position[] { 1438 new(-1, 0), 1439 new(0, -1), 1440 new(-1, -1), 1441 new(-2, 0), 1442 new(0, -2), 1443 new(-2, -1), 1444 new(-1, -2), 1445 new(-2, -2), 1446 }, 1447 // 4X8 1448 new Position[] { 1449 new(-1, 0), 1450 new(0, -1), 1451 new(-1, -1), 1452 new(-2, 0), 1453 new(0, -2), 1454 new(-2, -1), 1455 new(-1, -2), 1456 new(-2, -2), 1457 }, 1458 // 8X4 1459 new Position[] { 1460 new(-1, 0), 1461 new(0, -1), 1462 new(-1, -1), 1463 new(-2, 0), 1464 new(0, -2), 1465 new(-2, -1), 1466 new(-1, -2), 1467 new(-2, -2), 1468 }, 1469 // 8X8 1470 new Position[] { 1471 new(-1, 0), 1472 new(0, -1), 1473 new(-1, -1), 1474 new(-2, 0), 1475 new(0, -2), 1476 new(-2, -1), 1477 new(-1, -2), 1478 new(-2, -2), 1479 }, 1480 // 8X16 1481 new Position[] { 1482 new(0, -1), 1483 new(-1, 0), 1484 new(1, -1), 1485 new(-1, -1), 1486 new(0, -2), 1487 new(-2, 0), 1488 new(-2, -1), 1489 new(-1, -2), 1490 }, 1491 // 16X8 1492 new Position[] { 1493 new(-1, 0), 1494 new(0, -1), 1495 new(-1, 1), 1496 new(-1, -1), 1497 new(-2, 0), 1498 new(0, -2), 1499 new(-1, -2), 1500 new(-2, -1), 1501 }, 1502 // 16X16 1503 new Position[] { 1504 new(-1, 0), 1505 new(0, -1), 1506 new(-1, 1), 1507 new(1, -1), 1508 new(-1, -1), 1509 new(-3, 0), 1510 new(0, -3), 1511 new(-3, -3), 1512 }, 1513 // 16X32 1514 new Position[] { 1515 new(0, -1), 1516 new(-1, 0), 1517 new(2, -1), 1518 new(-1, -1), 1519 new(-1, 1), 1520 new(0, -3), 1521 new(-3, 0), 1522 new(-3, -3), 1523 }, 1524 // 32X16 1525 new Position[] { 1526 new(-1, 0), 1527 new(0, -1), 1528 new(-1, 2), 1529 new(-1, -1), 1530 new(1, -1), 1531 new(-3, 0), 1532 new(0, -3), 1533 new(-3, -3), 1534 }, 1535 // 32X32 1536 new Position[] { 1537 new(-1, 1), 1538 new(1, -1), 1539 new(-1, 2), 1540 new(2, -1), 1541 new(-1, -1), 1542 new(-3, 0), 1543 new(0, -3), 1544 new(-3, -3), 1545 }, 1546 // 32X64 1547 new Position[] { 1548 new(0, -1), 1549 new(-1, 0), 1550 new(4, -1), 1551 new(-1, 2), 1552 new(-1, -1), 1553 new(0, -3), 1554 new(-3, 0), 1555 new(2, -1), 1556 }, 1557 // 64X32 1558 new Position[] { 1559 new(-1, 0), 1560 new(0, -1), 1561 new(-1, 4), 1562 new(2, -1), 1563 new(-1, -1), 1564 new(-3, 0), 1565 new(0, -3), 1566 new(-1, 2), 1567 }, 1568 // 64X64 1569 new Position[] { 1570 new(-1, 3), 1571 new(3, -1), 1572 new(-1, 4), 1573 new(4, -1), 1574 new(-1, -1), 1575 new(-1, 0), 1576 new(0, -1), 1577 new(-1, 6), 1578 }, 1579 }; 1580 } 1581 }