7#include <QtCore/qbytearray.h>
58const CodeEntry staticHuffmanCodeTable[]
60 { 0, 0xffc00000ul, 13},
61 { 1, 0xffffb000ul, 23},
62 { 2, 0xfffffe20ul, 28},
63 { 3, 0xfffffe30ul, 28},
64 { 4, 0xfffffe40ul, 28},
65 { 5, 0xfffffe50ul, 28},
66 { 6, 0xfffffe60ul, 28},
67 { 7, 0xfffffe70ul, 28},
68 { 8, 0xfffffe80ul, 28},
69 { 9, 0xffffea00ul, 24},
70 { 10, 0xfffffff0ul, 30},
71 { 11, 0xfffffe90ul, 28},
72 { 12, 0xfffffea0ul, 28},
73 { 13, 0xfffffff4ul, 30},
74 { 14, 0xfffffeb0ul, 28},
75 { 15, 0xfffffec0ul, 28},
76 { 16, 0xfffffed0ul, 28},
77 { 17, 0xfffffee0ul, 28},
78 { 18, 0xfffffef0ul, 28},
79 { 19, 0xffffff00ul, 28},
80 { 20, 0xffffff10ul, 28},
81 { 21, 0xffffff20ul, 28},
82 { 22, 0xfffffff8ul, 30},
83 { 23, 0xffffff30ul, 28},
84 { 24, 0xffffff40ul, 28},
85 { 25, 0xffffff50ul, 28},
86 { 26, 0xffffff60ul, 28},
87 { 27, 0xffffff70ul, 28},
88 { 28, 0xffffff80ul, 28},
89 { 29, 0xffffff90ul, 28},
90 { 30, 0xffffffa0ul, 28},
91 { 31, 0xffffffb0ul, 28},
92 { 32, 0x50000000ul, 6},
93 { 33, 0xfe000000ul, 10},
94 { 34, 0xfe400000ul, 10},
95 { 35, 0xffa00000ul, 12},
96 { 36, 0xffc80000ul, 13},
97 { 37, 0x54000000ul, 6},
98 { 38, 0xf8000000ul, 8},
99 { 39, 0xff400000ul, 11},
100 { 40, 0xfe800000ul, 10},
101 { 41, 0xfec00000ul, 10},
102 { 42, 0xf9000000ul, 8},
103 { 43, 0xff600000ul, 11},
104 { 44, 0xfa000000ul, 8},
105 { 45, 0x58000000ul, 6},
106 { 46, 0x5c000000ul, 6},
107 { 47, 0x60000000ul, 6},
108 { 48, 0x00000000ul, 5},
109 { 49, 0x08000000ul, 5},
110 { 50, 0x10000000ul, 5},
111 { 51, 0x64000000ul, 6},
112 { 52, 0x68000000ul, 6},
113 { 53, 0x6c000000ul, 6},
114 { 54, 0x70000000ul, 6},
115 { 55, 0x74000000ul, 6},
116 { 56, 0x78000000ul, 6},
117 { 57, 0x7c000000ul, 6},
118 { 58, 0xb8000000ul, 7},
119 { 59, 0xfb000000ul, 8},
120 { 60, 0xfff80000ul, 15},
121 { 61, 0x80000000ul, 6},
122 { 62, 0xffb00000ul, 12},
123 { 63, 0xff000000ul, 10},
124 { 64, 0xffd00000ul, 13},
125 { 65, 0x84000000ul, 6},
126 { 66, 0xba000000ul, 7},
127 { 67, 0xbc000000ul, 7},
128 { 68, 0xbe000000ul, 7},
129 { 69, 0xc0000000ul, 7},
130 { 70, 0xc2000000ul, 7},
131 { 71, 0xc4000000ul, 7},
132 { 72, 0xc6000000ul, 7},
133 { 73, 0xc8000000ul, 7},
134 { 74, 0xca000000ul, 7},
135 { 75, 0xcc000000ul, 7},
136 { 76, 0xce000000ul, 7},
137 { 77, 0xd0000000ul, 7},
138 { 78, 0xd2000000ul, 7},
139 { 79, 0xd4000000ul, 7},
140 { 80, 0xd6000000ul, 7},
141 { 81, 0xd8000000ul, 7},
142 { 82, 0xda000000ul, 7},
143 { 83, 0xdc000000ul, 7},
144 { 84, 0xde000000ul, 7},
145 { 85, 0xe0000000ul, 7},
146 { 86, 0xe2000000ul, 7},
147 { 87, 0xe4000000ul, 7},
148 { 88, 0xfc000000ul, 8},
149 { 89, 0xe6000000ul, 7},
150 { 90, 0xfd000000ul, 8},
151 { 91, 0xffd80000ul, 13},
152 { 92, 0xfffe0000ul, 19},
153 { 93, 0xffe00000ul, 13},
154 { 94, 0xfff00000ul, 14},
155 { 95, 0x88000000ul, 6},
156 { 96, 0xfffa0000ul, 15},
157 { 97, 0x18000000ul, 5},
158 { 98, 0x8c000000ul, 6},
159 { 99, 0x20000000ul, 5},
160 {100, 0x90000000ul, 6},
161 {101, 0x28000000ul, 5},
162 {102, 0x94000000ul, 6},
163 {103, 0x98000000ul, 6},
164 {104, 0x9c000000ul, 6},
165 {105, 0x30000000ul, 5},
166 {106, 0xe8000000ul, 7},
167 {107, 0xea000000ul, 7},
168 {108, 0xa0000000ul, 6},
169 {109, 0xa4000000ul, 6},
170 {110, 0xa8000000ul, 6},
171 {111, 0x38000000ul, 5},
172 {112, 0xac000000ul, 6},
173 {113, 0xec000000ul, 7},
174 {114, 0xb0000000ul, 6},
175 {115, 0x40000000ul, 5},
176 {116, 0x48000000ul, 5},
177 {117, 0xb4000000ul, 6},
178 {118, 0xee000000ul, 7},
179 {119, 0xf0000000ul, 7},
180 {120, 0xf2000000ul, 7},
181 {121, 0xf4000000ul, 7},
182 {122, 0xf6000000ul, 7},
183 {123, 0xfffc0000ul, 15},
184 {124, 0xff800000ul, 11},
185 {125, 0xfff40000ul, 14},
186 {126, 0xffe80000ul, 13},
187 {127, 0xffffffc0ul, 28},
188 {128, 0xfffe6000ul, 20},
189 {129, 0xffff4800ul, 22},
190 {130, 0xfffe7000ul, 20},
191 {131, 0xfffe8000ul, 20},
192 {132, 0xffff4c00ul, 22},
193 {133, 0xffff5000ul, 22},
194 {134, 0xffff5400ul, 22},
195 {135, 0xffffb200ul, 23},
196 {136, 0xffff5800ul, 22},
197 {137, 0xffffb400ul, 23},
198 {138, 0xffffb600ul, 23},
199 {139, 0xffffb800ul, 23},
200 {140, 0xffffba00ul, 23},
201 {141, 0xffffbc00ul, 23},
202 {142, 0xffffeb00ul, 24},
203 {143, 0xffffbe00ul, 23},
204 {144, 0xffffec00ul, 24},
205 {145, 0xffffed00ul, 24},
206 {146, 0xffff5c00ul, 22},
207 {147, 0xffffc000ul, 23},
208 {148, 0xffffee00ul, 24},
209 {149, 0xffffc200ul, 23},
210 {150, 0xffffc400ul, 23},
211 {151, 0xffffc600ul, 23},
212 {152, 0xffffc800ul, 23},
213 {153, 0xfffee000ul, 21},
214 {154, 0xffff6000ul, 22},
215 {155, 0xffffca00ul, 23},
216 {156, 0xffff6400ul, 22},
217 {157, 0xffffcc00ul, 23},
218 {158, 0xffffce00ul, 23},
219 {159, 0xffffef00ul, 24},
220 {160, 0xffff6800ul, 22},
221 {161, 0xfffee800ul, 21},
222 {162, 0xfffe9000ul, 20},
223 {163, 0xffff6c00ul, 22},
224 {164, 0xffff7000ul, 22},
225 {165, 0xffffd000ul, 23},
226 {166, 0xffffd200ul, 23},
227 {167, 0xfffef000ul, 21},
228 {168, 0xffffd400ul, 23},
229 {169, 0xffff7400ul, 22},
230 {170, 0xffff7800ul, 22},
231 {171, 0xfffff000ul, 24},
232 {172, 0xfffef800ul, 21},
233 {173, 0xffff7c00ul, 22},
234 {174, 0xffffd600ul, 23},
235 {175, 0xffffd800ul, 23},
236 {176, 0xffff0000ul, 21},
237 {177, 0xffff0800ul, 21},
238 {178, 0xffff8000ul, 22},
239 {179, 0xffff1000ul, 21},
240 {180, 0xffffda00ul, 23},
241 {181, 0xffff8400ul, 22},
242 {182, 0xffffdc00ul, 23},
243 {183, 0xffffde00ul, 23},
244 {184, 0xfffea000ul, 20},
245 {185, 0xffff8800ul, 22},
246 {186, 0xffff8c00ul, 22},
247 {187, 0xffff9000ul, 22},
248 {188, 0xffffe000ul, 23},
249 {189, 0xffff9400ul, 22},
250 {190, 0xffff9800ul, 22},
251 {191, 0xffffe200ul, 23},
252 {192, 0xfffff800ul, 26},
253 {193, 0xfffff840ul, 26},
254 {194, 0xfffeb000ul, 20},
255 {195, 0xfffe2000ul, 19},
256 {196, 0xffff9c00ul, 22},
257 {197, 0xffffe400ul, 23},
258 {198, 0xffffa000ul, 22},
259 {199, 0xfffff600ul, 25},
260 {200, 0xfffff880ul, 26},
261 {201, 0xfffff8c0ul, 26},
262 {202, 0xfffff900ul, 26},
263 {203, 0xfffffbc0ul, 27},
264 {204, 0xfffffbe0ul, 27},
265 {205, 0xfffff940ul, 26},
266 {206, 0xfffff100ul, 24},
267 {207, 0xfffff680ul, 25},
268 {208, 0xfffe4000ul, 19},
269 {209, 0xffff1800ul, 21},
270 {210, 0xfffff980ul, 26},
271 {211, 0xfffffc00ul, 27},
272 {212, 0xfffffc20ul, 27},
273 {213, 0xfffff9c0ul, 26},
274 {214, 0xfffffc40ul, 27},
275 {215, 0xfffff200ul, 24},
276 {216, 0xffff2000ul, 21},
277 {217, 0xffff2800ul, 21},
278 {218, 0xfffffa00ul, 26},
279 {219, 0xfffffa40ul, 26},
280 {220, 0xffffffd0ul, 28},
281 {221, 0xfffffc60ul, 27},
282 {222, 0xfffffc80ul, 27},
283 {223, 0xfffffca0ul, 27},
284 {224, 0xfffec000ul, 20},
285 {225, 0xfffff300ul, 24},
286 {226, 0xfffed000ul, 20},
287 {227, 0xffff3000ul, 21},
288 {228, 0xffffa400ul, 22},
289 {229, 0xffff3800ul, 21},
290 {230, 0xffff4000ul, 21},
291 {231, 0xffffe600ul, 23},
292 {232, 0xffffa800ul, 22},
293 {233, 0xffffac00ul, 22},
294 {234, 0xfffff700ul, 25},
295 {235, 0xfffff780ul, 25},
296 {236, 0xfffff400ul, 24},
297 {237, 0xfffff500ul, 24},
298 {238, 0xfffffa80ul, 26},
299 {239, 0xffffe800ul, 23},
300 {240, 0xfffffac0ul, 26},
301 {241, 0xfffffcc0ul, 27},
302 {242, 0xfffffb00ul, 26},
303 {243, 0xfffffb40ul, 26},
304 {244, 0xfffffce0ul, 27},
305 {245, 0xfffffd00ul, 27},
306 {246, 0xfffffd20ul, 27},
307 {247, 0xfffffd40ul, 27},
308 {248, 0xfffffd60ul, 27},
309 {249, 0xffffffe0ul, 28},
310 {250, 0xfffffd80ul, 27},
311 {251, 0xfffffda0ul, 27},
312 {252, 0xfffffdc0ul, 27},
313 {253, 0xfffffde0ul, 27},
314 {254, 0xfffffe00ul, 27},
315 {255, 0xfffffb80ul, 26},
316 {256, 0xfffffffcul, 30}
319void write_huffman_code(BitOStream &outputStream,
const CodeEntry &code)
322 auto bitLength =
code.bitLength;
323 const auto hc =
code.huffmanCode >> (32 - bitLength);
325 if (bitLength > 24) {
326 outputStream.writeBits(
uchar(hc >> 24), bitLength - 24);
330 if (bitLength > 16) {
331 outputStream.writeBits(
uchar(hc >> 16), bitLength - 16);
336 outputStream.writeBits(
uchar(hc >> 8), bitLength - 8);
340 outputStream.writeBits(
uchar(hc), bitLength);
346static_assert(std::numeric_limits<uchar>::digits == 8,
"octets expected");
351 for (
int i = 0,
e = inputData.
size();
i <
e; ++
i)
352 bitLength += staticHuffmanCodeTable[
int(inputData[
i])].bitLength;
359 for (
int i = 0,
e = inputData.
size();
i <
e; ++
i) {
361 write_huffman_code(outputStream, staticHuffmanCodeTable[
value]);
381 return (chunk >> (32 - nBits)) ==
quint32((1 << nBits) - 1);
387 const auto nCodes =
sizeof staticHuffmanCodeTable /
sizeof staticHuffmanCodeTable[0];
389 std::vector<CodeEntry> symbols(staticHuffmanCodeTable, staticHuffmanCodeTable + nCodes);
393 std::sort(symbols.begin(), symbols.end(), [](
const CodeEntry &code1,
const CodeEntry &code2) {
394 if (code1.bitLength == code2.bitLength)
395 return code1.byteValue > code2.byteValue;
396 return code1.bitLength > code2.bitLength;
399 minCodeLength = symbols.back().bitLength;
408 for (
const auto &
s : symbols) {
411 Q_ASSERT(tableIndex < prefixTables.size());
413 const auto table = prefixTables[tableIndex];
415 const auto entryIndex =
s.huffmanCode <<
table.prefixLength >> (32 -
table.indexLength);
419 const auto codedLength =
table.prefixLength +
table.indexLength;
420 if (codedLength <
s.bitLength) {
422 if (!
entry.bitLength) {
424 s.bitLength - codedLength));
425 entry.bitLength =
s.bitLength;
426 entry.byteValue =
s.byteValue;
429 tableIndex =
entry.nextTable;
432 entry.byteValue =
s.byteValue;
433 entry.bitLength =
s.bitLength;
435 entry.nextTable = tableIndex;
444 for (
const auto &
table : prefixTables) {
448 if (
entry.bitLength &&
entry.bitLength < codedLength) {
468 if (readBits < minCodeLength) {
475 quint32 entryIndex = chunk >> (32 -
table->indexLength);
479 if (
entry.nextTable == tableIndex)
482 tableIndex =
entry.nextTable;
483 table = &prefixTables[tableIndex];
484 entryIndex = chunk <<
table->prefixLength >> (32 -
table->indexLength);
488 if (
entry.bitLength > readBits) {
493 if (!
entry.bitLength ||
entry.byteValue == 256) {
510 prefixTables.push_back(newTable);
512 tableData.resize(tableData.size() + newTable.size());
514 return quint32(prefixTables.size() - 1);
517PrefixTableEntry HuffmanDecoder::tableEntry(
const PrefixTable &
table,
quint32 index)
524 const PrefixTableEntry &
entry)
535 return decoder.
decodeStream(inputStream, *outputBuffer);
bool skipBits(quint64 nBits)
quint64 streamOffset() const
quint64 peekBits(quint64 from, quint64 length, T *dstPtr) const
void writeBits(uchar bits, quint8 bitLength)
quint64 bitLength() const
bool decodeStream(BitIStream &inputStream, QByteArray &outputBuffer)
constexpr qsizetype size() const noexcept
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
quint64 huffman_encoded_bit_length(QByteArrayView inputData)
static constexpr bool padding_is_valid(quint32 chunk, quint32 nBits)
bool huffman_decode_string(BitIStream &inputStream, QByteArray *outputBuffer)
void huffman_encode_string(QByteArrayView inputData, BitOStream &outputStream)
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLenum GLsizei void * table
unsigned long long quint64