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