• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/quantizer.h"
16 
17 #include <cassert>
18 #include <cstdint>
19 
20 #include "src/utils/common.h"
21 
22 #if LIBGAV1_MAX_BITDEPTH != 8 && LIBGAV1_MAX_BITDEPTH != 10
23 #error LIBGAV1_MAX_BITDEPTH must be 8 or 10
24 #endif
25 
26 namespace libgav1 {
27 namespace {
28 
29 // Format the kDcLookup and kAcLookup arrays manually for easier comparison
30 // with the Dc_Qlookup and Ac_Qlookup arrays in Section 7.12.2.
31 
32 // clang-format off
33 constexpr int16_t kDcLookup[][256] = {
34   // Lookup table for 8 bit.
35   {
36     4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16,
37     17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26,
38     27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37,
39     38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47,
40     48, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57,
41     57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66,
42     67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76,
43     77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85,
44     87, 88, 90, 92, 93, 95, 96, 98, 99, 101, 102, 104,
45     105, 107, 108, 110, 111, 113, 114, 116, 117, 118, 120, 121,
46     123, 125, 127, 129, 131, 134, 136, 138, 140, 142, 144, 146,
47     148, 150, 152, 154, 156, 158, 161, 164, 166, 169, 172, 174,
48     177, 180, 182, 185, 187, 190, 192, 195, 199, 202, 205, 208,
49     211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247,
50     250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292,
51     296, 300, 304, 309, 313, 317, 322, 326, 330, 335, 340, 344,
52     349, 354, 359, 364, 369, 374, 379, 384, 389, 395, 400, 406,
53     411, 417, 423, 429, 435, 441, 447, 454, 461, 467, 475, 482,
54     489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590,
55     602, 614, 626, 640, 654, 668, 684, 700, 717, 736, 755, 775,
56     796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 1139,
57     1184, 1232, 1282, 1336
58   },
59 #if LIBGAV1_MAX_BITDEPTH >= 10
60   // Lookup table for 10 bit.
61   {
62     4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34,
63     37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75,
64     78, 82, 86, 90, 93, 97, 101, 105, 109, 113, 116, 120,
65     124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163, 166,
66     170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212,
67     215, 219, 223, 226, 230, 233, 237, 241, 244, 248, 251, 255,
68     259, 262, 266, 269, 273, 276, 280, 283, 287, 290, 293, 297,
69     300, 304, 307, 310, 314, 317, 321, 324, 327, 331, 334, 337,
70     343, 350, 356, 362, 369, 375, 381, 387, 394, 400, 406, 412,
71     418, 424, 430, 436, 442, 448, 454, 460, 466, 472, 478, 484,
72     490, 499, 507, 516, 525, 533, 542, 550, 559, 567, 576, 584,
73     592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687, 698,
74     708, 718, 729, 739, 749, 759, 770, 782, 795, 807, 819, 831,
75     844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988,
76     1001, 1015, 1030, 1045, 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170,
77     1186, 1202, 1218, 1236, 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379,
78     1398, 1416, 1436, 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624,
79     1647, 1670, 1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929,
80     1958, 1990, 2021, 2054, 2088, 2123, 2159, 2197, 2236, 2276, 2319, 2363,
81     2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102,
82     3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559,
83     4737, 4929, 5130, 5347
84   },
85 #endif  // LIBGAV1_MAX_BITDEPTH >= 10
86 };
87 
88 constexpr int16_t kAcLookup[][256] = {
89   // Lookup table for 8 bit.
90   {
91     4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
92     19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
93     31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
94     43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
95     55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
96     67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
97     79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
98     91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
99     104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126,
100     128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150,
101     152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185,
102     188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, 227,
103     231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280,
104     285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347,
105     353, 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432,
106     440, 448, 456, 465, 474, 483, 492, 501, 510, 520, 530, 540,
107     550, 560, 571, 582, 593, 604, 615, 627, 639, 651, 663, 676,
108     689, 702, 715, 729, 743, 757, 771, 786, 801, 816, 832, 848,
109     864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, 1066,
110     1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
111     1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692,
112     1725, 1759, 1793, 1828
113   },
114 #if LIBGAV1_MAX_BITDEPTH >= 10
115   // Lookup table for 10 bit.
116   {
117     4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37,
118     40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83,
119     88, 92, 96, 100, 105, 109, 114, 118, 122, 127, 131, 136,
120     140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186, 190,
121     195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244,
122     249, 253, 258, 262, 267, 271, 275, 280, 284, 289, 293, 297,
123     302, 306, 311, 315, 319, 324, 328, 332, 337, 341, 345, 349,
124     354, 358, 362, 367, 371, 375, 379, 384, 388, 392, 396, 401,
125     409, 417, 425, 433, 441, 449, 458, 466, 474, 482, 490, 498,
126     506, 514, 523, 531, 539, 547, 555, 563, 571, 579, 588, 596,
127     604, 616, 628, 640, 652, 664, 676, 688, 700, 713, 725, 737,
128     749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889, 905,
129     922, 938, 954, 970, 986, 1002, 1018, 1038, 1058, 1078, 1098, 1118,
130     1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386,
131     1411, 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727,
132     1759, 1791, 1823, 1859, 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159,
133     2199, 2239, 2283, 2327, 2371, 2415, 2459, 2507, 2555, 2603, 2651, 2703,
134     2755, 2807, 2859, 2915, 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391,
135     3455, 3523, 3591, 3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264,
136     4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972, 5068, 5168, 5268, 5372,
137     5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768,
138     6900, 7036, 7172, 7312
139   },
140 #endif  // LIBGAV1_MAX_BITDEPTH >= 10
141 };
142 // clang-format on
143 
144 }  // namespace
145 
GetQIndex(const Segmentation & segmentation,int index,int base_qindex)146 int GetQIndex(const Segmentation& segmentation, int index, int base_qindex) {
147   if (segmentation.FeatureActive(index, kSegmentFeatureQuantizer)) {
148     const int segment_qindex =
149         base_qindex +
150         segmentation.feature_data[index][kSegmentFeatureQuantizer];
151     return Clip3(segment_qindex, kMinQuantizer, kMaxQuantizer);
152   }
153   return base_qindex;
154 }
155 
Quantizer(int bitdepth,const QuantizerParameters * params)156 Quantizer::Quantizer(int bitdepth, const QuantizerParameters* params)
157     : params_(*params) {
158   assert(bitdepth >= 8 && bitdepth <= LIBGAV1_MAX_BITDEPTH);
159   const int index = BitdepthToArrayIndex(bitdepth);
160   dc_lookup_ = kDcLookup[index];
161   ac_lookup_ = kAcLookup[index];
162 }
163 
GetDcValue(Plane plane,int qindex) const164 int Quantizer::GetDcValue(Plane plane, int qindex) const {
165   return dc_lookup_[Clip3(qindex + params_.delta_dc[plane], kMinQuantizer,
166                           kMaxQuantizer)];
167 }
168 
GetAcValue(Plane plane,int qindex) const169 int Quantizer::GetAcValue(Plane plane, int qindex) const {
170   return ac_lookup_[Clip3(qindex + params_.delta_ac[plane], kMinQuantizer,
171                           kMaxQuantizer)];
172 }
173 
174 }  // namespace libgav1
175