Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/libchdr/src/libchdr_huffman.c
4251 views
1
/* license:BSD-3-Clause
2
* copyright-holders:Aaron Giles
3
****************************************************************************
4
5
huffman.c
6
7
Static Huffman compression and decompression helpers.
8
9
****************************************************************************
10
11
Maximum codelength is officially (alphabetsize - 1). This would be 255 bits
12
(since we use 1 byte values). However, it is also dependent upon the number
13
of samples used, as follows:
14
15
2 bits -> 3..4 samples
16
3 bits -> 5..7 samples
17
4 bits -> 8..12 samples
18
5 bits -> 13..20 samples
19
6 bits -> 21..33 samples
20
7 bits -> 34..54 samples
21
8 bits -> 55..88 samples
22
9 bits -> 89..143 samples
23
10 bits -> 144..232 samples
24
11 bits -> 233..376 samples
25
12 bits -> 377..609 samples
26
13 bits -> 610..986 samples
27
14 bits -> 987..1596 samples
28
15 bits -> 1597..2583 samples
29
16 bits -> 2584..4180 samples -> note that a 4k data size guarantees codelength <= 16 bits
30
17 bits -> 4181..6764 samples
31
18 bits -> 6765..10945 samples
32
19 bits -> 10946..17710 samples
33
20 bits -> 17711..28656 samples
34
21 bits -> 28657..46367 samples
35
22 bits -> 46368..75024 samples
36
23 bits -> 75025..121392 samples
37
24 bits -> 121393..196417 samples
38
25 bits -> 196418..317810 samples
39
26 bits -> 317811..514228 samples
40
27 bits -> 514229..832039 samples
41
28 bits -> 832040..1346268 samples
42
29 bits -> 1346269..2178308 samples
43
30 bits -> 2178309..3524577 samples
44
31 bits -> 3524578..5702886 samples
45
32 bits -> 5702887..9227464 samples
46
47
Looking at it differently, here is where powers of 2 fall into these buckets:
48
49
256 samples -> 11 bits max
50
512 samples -> 12 bits max
51
1k samples -> 14 bits max
52
2k samples -> 15 bits max
53
4k samples -> 16 bits max
54
8k samples -> 18 bits max
55
16k samples -> 19 bits max
56
32k samples -> 21 bits max
57
64k samples -> 22 bits max
58
128k samples -> 24 bits max
59
256k samples -> 25 bits max
60
512k samples -> 27 bits max
61
1M samples -> 28 bits max
62
2M samples -> 29 bits max
63
4M samples -> 31 bits max
64
8M samples -> 32 bits max
65
66
****************************************************************************
67
68
Delta-RLE encoding works as follows:
69
70
Starting value is assumed to be 0. All data is encoded as a delta
71
from the previous value, such that final[i] = final[i - 1] + delta.
72
Long runs of 0s are RLE-encoded as follows:
73
74
0x100 = repeat count of 8
75
0x101 = repeat count of 9
76
0x102 = repeat count of 10
77
0x103 = repeat count of 11
78
0x104 = repeat count of 12
79
0x105 = repeat count of 13
80
0x106 = repeat count of 14
81
0x107 = repeat count of 15
82
0x108 = repeat count of 16
83
0x109 = repeat count of 32
84
0x10a = repeat count of 64
85
0x10b = repeat count of 128
86
0x10c = repeat count of 256
87
0x10d = repeat count of 512
88
0x10e = repeat count of 1024
89
0x10f = repeat count of 2048
90
91
Note that repeat counts are reset at the end of a row, so if a 0 run
92
extends to the end of a row, a large repeat count may be used.
93
94
The reason for starting the run counts at 8 is that 0 is expected to
95
be the most common symbol, and is typically encoded in 1 or 2 bits.
96
97
***************************************************************************/
98
99
#include <stdlib.h>
100
#include <stdio.h>
101
#include <string.h>
102
103
#include <libchdr/huffman.h>
104
105
#define MAX(x,y) ((x) > (y) ? (x) : (y))
106
107
/***************************************************************************
108
* MACROS
109
***************************************************************************
110
*/
111
112
#define MAKE_LOOKUP(code,bits) (((code) << 5) | ((bits) & 0x1f))
113
114
/***************************************************************************
115
* IMPLEMENTATION
116
***************************************************************************
117
*/
118
119
/*-------------------------------------------------
120
* huffman_context_base - create an encoding/
121
* decoding context
122
*-------------------------------------------------
123
*/
124
125
struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits)
126
{
127
struct huffman_decoder* decoder = NULL;
128
129
/* limit to 24 bits */
130
if (maxbits > 24)
131
return NULL;
132
133
decoder = (struct huffman_decoder*)malloc(sizeof(struct huffman_decoder));
134
decoder->numcodes = numcodes;
135
decoder->maxbits = maxbits;
136
decoder->lookup = (lookup_value*)malloc(sizeof(lookup_value) * (1 << maxbits));
137
decoder->huffnode = (struct node_t*)malloc(sizeof(struct node_t) * numcodes);
138
decoder->datahisto = NULL;
139
decoder->prevdata = 0;
140
decoder->rleremaining = 0;
141
return decoder;
142
}
143
144
void delete_huffman_decoder(struct huffman_decoder* decoder)
145
{
146
if (decoder != NULL)
147
{
148
if (decoder->lookup != NULL)
149
free(decoder->lookup);
150
if (decoder->huffnode != NULL)
151
free(decoder->huffnode);
152
free(decoder);
153
}
154
}
155
156
/*-------------------------------------------------
157
* decode_one - decode a single code from the
158
* huffman stream
159
*-------------------------------------------------
160
*/
161
162
uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf)
163
{
164
/* peek ahead to get maxbits worth of data */
165
uint32_t bits = bitstream_peek(bitbuf, decoder->maxbits);
166
167
/* look it up, then remove the actual number of bits for this code */
168
lookup_value lookup = decoder->lookup[bits];
169
bitstream_remove(bitbuf, lookup & 0x1f);
170
171
/* return the value */
172
return lookup >> 5;
173
}
174
175
/*-------------------------------------------------
176
* import_tree_rle - import an RLE-encoded
177
* huffman tree from a source data stream
178
*-------------------------------------------------
179
*/
180
181
enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf)
182
{
183
int numbits;
184
uint32_t curnode;
185
enum huffman_error error;
186
187
/* bits per entry depends on the maxbits */
188
if (decoder->maxbits >= 16)
189
numbits = 5;
190
else if (decoder->maxbits >= 8)
191
numbits = 4;
192
else
193
numbits = 3;
194
195
/* loop until we read all the nodes */
196
for (curnode = 0; curnode < decoder->numcodes; )
197
{
198
/* a non-one value is just raw */
199
int nodebits = bitstream_read(bitbuf, numbits);
200
if (nodebits != 1)
201
decoder->huffnode[curnode++].numbits = nodebits;
202
203
/* a one value is an escape code */
204
else
205
{
206
/* a double 1 is just a single 1 */
207
nodebits = bitstream_read(bitbuf, numbits);
208
if (nodebits == 1)
209
decoder->huffnode[curnode++].numbits = nodebits;
210
211
/* otherwise, we need one for value for the repeat count */
212
else
213
{
214
int repcount = bitstream_read(bitbuf, numbits) + 3;
215
if (repcount + curnode > decoder->numcodes)
216
return HUFFERR_INVALID_DATA;
217
while (repcount--)
218
decoder->huffnode[curnode++].numbits = nodebits;
219
}
220
}
221
}
222
223
/* make sure we ended up with the right number */
224
if (curnode != decoder->numcodes)
225
return HUFFERR_INVALID_DATA;
226
227
/* assign canonical codes for all nodes based on their code lengths */
228
error = huffman_assign_canonical_codes(decoder);
229
if (error != HUFFERR_NONE)
230
return error;
231
232
/* build the lookup table */
233
error = huffman_build_lookup_table(decoder);
234
if (error != HUFFERR_NONE)
235
return error;
236
237
/* determine final input length and report errors */
238
return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE;
239
}
240
241
242
/*-------------------------------------------------
243
* import_tree_huffman - import a huffman-encoded
244
* huffman tree from a source data stream
245
*-------------------------------------------------
246
*/
247
248
enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf)
249
{
250
int start;
251
int last = 0;
252
int count = 0;
253
int index;
254
uint32_t curcode;
255
uint8_t rlefullbits = 0;
256
uint32_t temp;
257
enum huffman_error error;
258
/* start by parsing the lengths for the small tree */
259
struct huffman_decoder* smallhuff = create_huffman_decoder(24, 6);
260
smallhuff->huffnode[0].numbits = bitstream_read(bitbuf, 3);
261
start = bitstream_read(bitbuf, 3) + 1;
262
for (index = 1; index < 24; index++)
263
{
264
if (index < start || count == 7)
265
smallhuff->huffnode[index].numbits = 0;
266
else
267
{
268
count = bitstream_read(bitbuf, 3);
269
smallhuff->huffnode[index].numbits = (count == 7) ? 0 : count;
270
}
271
}
272
273
/* then regenerate the tree */
274
error = huffman_assign_canonical_codes(smallhuff);
275
if (error != HUFFERR_NONE)
276
{
277
delete_huffman_decoder(smallhuff);
278
return error;
279
}
280
error = huffman_build_lookup_table(smallhuff);
281
if (error != HUFFERR_NONE)
282
{
283
delete_huffman_decoder(smallhuff);
284
return error;
285
}
286
287
/* determine the maximum length of an RLE count */
288
temp = decoder->numcodes - 9;
289
while (temp != 0)
290
temp >>= 1, rlefullbits++;
291
292
/* now process the rest of the data */
293
for (curcode = 0; curcode < decoder->numcodes; )
294
{
295
int value = huffman_decode_one(smallhuff, bitbuf);
296
if (value != 0)
297
decoder->huffnode[curcode++].numbits = last = value - 1;
298
else
299
{
300
int count = bitstream_read(bitbuf, 3) + 2;
301
if (count == 7+2)
302
count += bitstream_read(bitbuf, rlefullbits);
303
for ( ; count != 0 && curcode < decoder->numcodes; count--)
304
decoder->huffnode[curcode++].numbits = last;
305
}
306
}
307
308
/* make sure we free the local huffman decoder */
309
delete_huffman_decoder(smallhuff);
310
311
/* make sure we ended up with the right number */
312
if (curcode != decoder->numcodes)
313
return HUFFERR_INVALID_DATA;
314
315
/* assign canonical codes for all nodes based on their code lengths */
316
error = huffman_assign_canonical_codes(decoder);
317
if (error != HUFFERR_NONE)
318
return error;
319
320
/* build the lookup table */
321
error = huffman_build_lookup_table(decoder);
322
if (error != HUFFERR_NONE)
323
return error;
324
325
/* determine final input length and report errors */
326
return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE;
327
}
328
329
/*-------------------------------------------------
330
* compute_tree_from_histo - common backend for
331
* computing a tree based on the data histogram
332
*-------------------------------------------------
333
*/
334
335
enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder)
336
{
337
uint32_t i;
338
uint32_t lowerweight;
339
uint32_t upperweight;
340
/* compute the number of data items in the histogram */
341
uint32_t sdatacount = 0;
342
for (i = 0; i < decoder->numcodes; i++)
343
sdatacount += decoder->datahisto[i];
344
345
/* binary search to achieve the optimum encoding */
346
lowerweight = 0;
347
upperweight = sdatacount * 2;
348
while (1)
349
{
350
/* build a tree using the current weight */
351
uint32_t curweight = (upperweight + lowerweight) / 2;
352
int curmaxbits = huffman_build_tree(decoder, sdatacount, curweight);
353
354
/* apply binary search here */
355
if (curmaxbits <= decoder->maxbits)
356
{
357
lowerweight = curweight;
358
359
/* early out if it worked with the raw weights, or if we're done searching */
360
if (curweight == sdatacount || (upperweight - lowerweight) <= 1)
361
break;
362
}
363
else
364
upperweight = curweight;
365
}
366
367
/* assign canonical codes for all nodes based on their code lengths */
368
return huffman_assign_canonical_codes(decoder);
369
}
370
371
/***************************************************************************
372
* INTERNAL FUNCTIONS
373
***************************************************************************
374
*/
375
376
/*-------------------------------------------------
377
* tree_node_compare - compare two tree nodes
378
* by weight
379
*-------------------------------------------------
380
*/
381
382
static int huffman_tree_node_compare(const void *item1, const void *item2)
383
{
384
const struct node_t *node1 = *(const struct node_t **)item1;
385
const struct node_t *node2 = *(const struct node_t **)item2;
386
if (node2->weight != node1->weight)
387
return node2->weight - node1->weight;
388
if (node2->bits - node1->bits == 0)
389
fprintf(stderr, "identical node sort keys, should not happen!\n");
390
return (int)node1->bits - (int)node2->bits;
391
}
392
393
/*-------------------------------------------------
394
* build_tree - build a huffman tree based on the
395
* data distribution
396
*-------------------------------------------------
397
*/
398
399
int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight)
400
{
401
uint32_t curcode;
402
int nextalloc;
403
int listitems = 0;
404
int maxbits = 0;
405
/* make a list of all non-zero nodes */
406
struct node_t** list = (struct node_t**)malloc(sizeof(struct node_t*) * decoder->numcodes * 2);
407
memset(decoder->huffnode, 0, decoder->numcodes * sizeof(decoder->huffnode[0]));
408
for (curcode = 0; curcode < decoder->numcodes; curcode++)
409
if (decoder->datahisto[curcode] != 0)
410
{
411
list[listitems++] = &decoder->huffnode[curcode];
412
decoder->huffnode[curcode].count = decoder->datahisto[curcode];
413
decoder->huffnode[curcode].bits = curcode;
414
415
/* scale the weight by the current effective length, ensuring we don't go to 0 */
416
decoder->huffnode[curcode].weight = ((uint64_t)decoder->datahisto[curcode]) * ((uint64_t)totalweight) / ((uint64_t)totaldata);
417
if (decoder->huffnode[curcode].weight == 0)
418
decoder->huffnode[curcode].weight = 1;
419
}
420
421
#if 0
422
fprintf(stderr, "Pre-sort:\n");
423
for (int i = 0; i < listitems; i++) {
424
fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits);
425
}
426
#endif
427
428
/* sort the list by weight, largest weight first */
429
qsort(&list[0], listitems, sizeof(list[0]), huffman_tree_node_compare);
430
431
#if 0
432
fprintf(stderr, "Post-sort:\n");
433
for (int i = 0; i < listitems; i++) {
434
fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits);
435
}
436
fprintf(stderr, "===================\n");
437
#endif
438
439
/* now build the tree */
440
nextalloc = decoder->numcodes;
441
while (listitems > 1)
442
{
443
int curitem;
444
/* remove lowest two items */
445
struct node_t* node1 = &(*list[--listitems]);
446
struct node_t* node0 = &(*list[--listitems]);
447
448
/* create new node */
449
struct node_t* newnode = &decoder->huffnode[nextalloc++];
450
newnode->parent = NULL;
451
node0->parent = node1->parent = newnode;
452
newnode->weight = node0->weight + node1->weight;
453
454
/* insert into list at appropriate location */
455
for (curitem = 0; curitem < listitems; curitem++)
456
if (newnode->weight > list[curitem]->weight)
457
{
458
memmove(&list[curitem+1], &list[curitem], (listitems - curitem) * sizeof(list[0]));
459
break;
460
}
461
list[curitem] = newnode;
462
listitems++;
463
}
464
465
/* compute the number of bits in each code, and fill in another histogram */
466
for (curcode = 0; curcode < decoder->numcodes; curcode++)
467
{
468
struct node_t *curnode;
469
struct node_t* node = &decoder->huffnode[curcode];
470
node->numbits = 0;
471
node->bits = 0;
472
473
/* if we have a non-zero weight, compute the number of bits */
474
if (node->weight > 0)
475
{
476
/* determine the number of bits for this node */
477
for (curnode = node; curnode->parent != NULL; curnode = curnode->parent)
478
node->numbits++;
479
if (node->numbits == 0)
480
node->numbits = 1;
481
482
/* keep track of the max */
483
maxbits = MAX(maxbits, ((int)node->numbits));
484
}
485
}
486
return maxbits;
487
}
488
489
/*-------------------------------------------------
490
* assign_canonical_codes - assign canonical codes
491
* to all the nodes based on the number of bits
492
* in each
493
*-------------------------------------------------
494
*/
495
496
enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder)
497
{
498
uint32_t curcode;
499
int codelen;
500
uint32_t curstart = 0;
501
/* build up a histogram of bit lengths */
502
uint32_t bithisto[33] = { 0 };
503
for (curcode = 0; curcode < decoder->numcodes; curcode++)
504
{
505
struct node_t* node = &decoder->huffnode[curcode];
506
if (node->numbits > decoder->maxbits)
507
return HUFFERR_INTERNAL_INCONSISTENCY;
508
if (node->numbits <= 32)
509
bithisto[node->numbits]++;
510
}
511
512
/* for each code length, determine the starting code number */
513
for (codelen = 32; codelen > 0; codelen--)
514
{
515
uint32_t nextstart = (curstart + bithisto[codelen]) >> 1;
516
if (codelen != 1 && nextstart * 2 != (curstart + bithisto[codelen]))
517
return HUFFERR_INTERNAL_INCONSISTENCY;
518
bithisto[codelen] = curstart;
519
curstart = nextstart;
520
}
521
522
/* now assign canonical codes */
523
for (curcode = 0; curcode < decoder->numcodes; curcode++)
524
{
525
struct node_t* node = &decoder->huffnode[curcode];
526
if (node->numbits > 0)
527
node->bits = bithisto[node->numbits]++;
528
}
529
return HUFFERR_NONE;
530
}
531
532
/*-------------------------------------------------
533
* build_lookup_table - build a lookup table for
534
* fast decoding
535
*-------------------------------------------------
536
*/
537
538
enum huffman_error huffman_build_lookup_table(struct huffman_decoder* decoder)
539
{
540
const lookup_value* lookupend = &decoder->lookup[(1u << decoder->maxbits)];
541
uint32_t curcode;
542
/* iterate over all codes */
543
for (curcode = 0; curcode < decoder->numcodes; curcode++)
544
{
545
/* process all nodes which have non-zero bits */
546
struct node_t* node = &decoder->huffnode[curcode];
547
if (node->numbits > 0)
548
{
549
int shift;
550
lookup_value *dest;
551
lookup_value *destend;
552
553
/* set up the entry */
554
lookup_value value = MAKE_LOOKUP(curcode, node->numbits);
555
556
/* fill all matching entries */
557
shift = decoder->maxbits - node->numbits;
558
dest = &decoder->lookup[node->bits << shift];
559
destend = &decoder->lookup[((node->bits + 1) << shift) - 1];
560
if (dest >= lookupend || destend >= lookupend || destend < dest)
561
return HUFFERR_INTERNAL_INCONSISTENCY;
562
while (dest <= destend)
563
*dest++ = value;
564
}
565
}
566
567
return HUFFERR_NONE;
568
}
569
570