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