QuantCommon.cs
1 using Ryujinx.Graphics.Nvdec.Vp9.Types; 2 using System; 3 using System.Diagnostics; 4 5 namespace Ryujinx.Graphics.Nvdec.Vp9 6 { 7 internal static class QuantCommon 8 { 9 public const int MinQ = 0; 10 public const int MaxQ = 255; 11 12 private static readonly short[] _dcQlookup = { 13 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 14 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 15 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 16 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, 17 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 18 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, 19 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 87, 88, 20 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110, 21 111, 113, 114, 116, 117, 118, 120, 121, 123, 125, 127, 129, 131, 134, 22 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 161, 164, 23 166, 169, 172, 174, 177, 180, 182, 185, 187, 190, 192, 195, 199, 202, 24 205, 208, 211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247, 25 250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292, 296, 300, 26 304, 309, 313, 317, 322, 326, 330, 335, 340, 344, 349, 354, 359, 364, 27 369, 374, 379, 384, 389, 395, 400, 406, 411, 417, 423, 429, 435, 441, 28 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 29 559, 569, 579, 590, 602, 614, 626, 640, 654, 668, 684, 700, 717, 736, 30 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 1139, 31 1184, 1232, 1282, 1336, 32 }; 33 34 private static readonly short[] _dcQlookup10 = { 35 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 36 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, 37 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 38 136, 140, 143, 147, 151, 155, 159, 163, 166, 170, 174, 178, 182, 39 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 40 233, 237, 241, 244, 248, 251, 255, 259, 262, 266, 269, 273, 276, 41 280, 283, 287, 290, 293, 297, 300, 304, 307, 310, 314, 317, 321, 42 324, 327, 331, 334, 337, 343, 350, 356, 362, 369, 375, 381, 387, 43 394, 400, 406, 412, 418, 424, 430, 436, 442, 448, 454, 460, 466, 44 472, 478, 484, 490, 499, 507, 516, 525, 533, 542, 550, 559, 567, 45 576, 584, 592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687, 46 698, 708, 718, 729, 739, 749, 759, 770, 782, 795, 807, 819, 831, 47 844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988, 1001, 48 1015, 1030, 1045, 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170, 1186, 1202, 49 1218, 1236, 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379, 1398, 1416, 1436, 50 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717, 51 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 52 2123, 2159, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 53 2737, 2802, 2871, 2944, 3020, 3102, 3188, 3280, 3375, 3478, 3586, 3702, 3823, 54 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347, 55 }; 56 57 private static readonly short[] _dcQlookup12 = { 58 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 59 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 60 251, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 61 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, 62 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 63 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 919, 64 934, 949, 964, 978, 993, 1008, 1022, 1037, 1051, 1065, 1080, 65 1094, 1108, 1122, 1136, 1151, 1165, 1179, 1192, 1206, 1220, 1234, 66 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342, 1368, 1393, 1419, 67 1444, 1469, 1494, 1519, 1544, 1569, 1594, 1618, 1643, 1668, 1692, 68 1717, 1741, 1765, 1789, 1814, 1838, 1862, 1885, 1909, 1933, 1957, 69 1992, 2027, 2061, 2096, 2130, 2165, 2199, 2233, 2267, 2300, 2334, 70 2367, 2400, 2434, 2467, 2499, 2532, 2575, 2618, 2661, 2704, 2746, 71 2788, 2830, 2872, 2913, 2954, 2995, 3036, 3076, 3127, 3177, 3226, 72 3275, 3324, 3373, 3421, 3469, 3517, 3565, 3621, 3677, 3733, 3788, 73 3843, 3897, 3951, 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420, 74 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942, 5013, 5083, 5153, 75 5222, 5291, 5367, 5442, 5517, 5591, 5665, 5745, 5825, 5905, 5984, 76 6063, 6149, 6234, 6319, 6404, 6495, 6587, 6678, 6769, 6867, 6966, 77 7064, 7163, 7269, 7376, 7483, 7599, 7715, 7832, 7958, 8085, 8214, 78 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 79 10245, 10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409, 12750, 13118, 80 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 17575, 18237, 18949, 81 19718, 20521, 21387, 82 }; 83 84 private static readonly short[] _acQlookup = { 85 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 86 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 87 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 88 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 89 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 90 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 91 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 92 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 93 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 94 146, 148, 150, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 95 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, 96 227, 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280, 97 285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347, 353, 98 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448, 99 456, 465, 474, 483, 492, 501, 510, 520, 530, 540, 550, 560, 571, 100 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, 729, 101 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 102 951, 969, 988, 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151, 1173, 1196, 103 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1479, 1508, 1537, 104 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828, 105 }; 106 107 private static readonly short[] _acQlookup10 = { 108 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 109 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, 110 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 111 154, 158, 163, 168, 172, 177, 181, 186, 190, 195, 199, 204, 208, 112 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 113 271, 275, 280, 284, 289, 293, 297, 302, 306, 311, 315, 319, 324, 114 328, 332, 337, 341, 345, 349, 354, 358, 362, 367, 371, 375, 379, 115 384, 388, 392, 396, 401, 409, 417, 425, 433, 441, 449, 458, 466, 116 474, 482, 490, 498, 506, 514, 523, 531, 539, 547, 555, 563, 571, 117 579, 588, 596, 604, 616, 628, 640, 652, 664, 676, 688, 700, 713, 118 725, 737, 749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889, 119 905, 922, 938, 954, 970, 986, 1002, 1018, 1038, 1058, 1078, 1098, 1118, 120 1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386, 1411, 121 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727, 1759, 1791, 122 1823, 1859, 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159, 2199, 2239, 2283, 123 2327, 2371, 2415, 2459, 2507, 2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915, 124 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391, 3455, 3523, 3591, 3659, 3731, 125 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 126 4876, 4972, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 127 6268, 6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312, 128 }; 129 130 private static readonly short[] _acQlookup12 = { 131 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 132 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 133 280, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 134 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, 135 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 136 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 1049, 1067, 137 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1246, 1264, 138 1282, 1299, 1317, 1335, 1352, 1370, 1387, 1405, 1422, 1440, 1457, 139 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595, 1627, 1660, 1693, 140 1725, 1758, 1791, 1824, 1856, 1889, 1922, 1954, 1987, 2020, 2052, 141 2085, 2118, 2150, 2183, 2216, 2248, 2281, 2313, 2346, 2378, 2411, 142 2459, 2508, 2556, 2605, 2653, 2701, 2750, 2798, 2847, 2895, 2943, 143 2992, 3040, 3088, 3137, 3185, 3234, 3298, 3362, 3426, 3491, 3555, 144 3619, 3684, 3748, 3812, 3876, 3941, 4005, 4069, 4149, 4230, 4310, 145 4390, 4470, 4550, 4631, 4711, 4791, 4871, 4967, 5064, 5160, 5256, 146 5352, 5448, 5544, 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410, 147 6522, 6650, 6778, 6906, 7034, 7162, 7290, 7435, 7579, 7723, 7867, 148 8011, 8155, 8315, 8475, 8635, 8795, 8956, 9132, 9308, 9484, 9660, 149 9836, 10028, 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661, 11885, 150 12109, 12333, 12573, 12813, 13053, 13309, 13565, 13821, 14093, 14365, 14637, 151 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 18062, 152 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 153 22766, 23214, 23662, 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 154 28143, 28687, 29247, 155 }; 156 157 public static short DcQuant(int qindex, int delta, BitDepth bitDepth) 158 { 159 switch (bitDepth) 160 { 161 case BitDepth.Bits8: 162 return _dcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; 163 case BitDepth.Bits10: 164 return _dcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; 165 case BitDepth.Bits12: 166 return _dcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; 167 default: 168 Debug.Assert(false, "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 169 170 return -1; 171 } 172 } 173 174 public static short AcQuant(int qindex, int delta, BitDepth bitDepth) 175 { 176 switch (bitDepth) 177 { 178 case BitDepth.Bits8: 179 return _acQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; 180 case BitDepth.Bits10: 181 return _acQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; 182 case BitDepth.Bits12: 183 return _acQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; 184 default: 185 Debug.Assert(false, "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 186 187 return -1; 188 } 189 } 190 191 public static int GetQIndex(ref Segmentation seg, int segmentId, int baseQIndex) 192 { 193 if (seg.IsSegFeatureActive(segmentId, SegLvlFeatures.SegLvlAltQ) != 0) 194 { 195 int data = seg.GetSegData(segmentId, SegLvlFeatures.SegLvlAltQ); 196 int segQIndex = seg.AbsDelta == Constants.SegmentAbsData ? data : baseQIndex + data; 197 198 return Math.Clamp(segQIndex, 0, MaxQ); 199 } 200 201 return baseQIndex; 202 } 203 } 204 }