libchdr_huffman.c (17165B)
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 huffman_build_lookup_table(decoder); 234 235 /* determine final input length and report errors */ 236 return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; 237 } 238 239 240 /*------------------------------------------------- 241 * import_tree_huffman - import a huffman-encoded 242 * huffman tree from a source data stream 243 *------------------------------------------------- 244 */ 245 246 enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf) 247 { 248 int start; 249 int last = 0; 250 int count = 0; 251 int index; 252 uint32_t curcode; 253 uint8_t rlefullbits = 0; 254 uint32_t temp; 255 enum huffman_error error; 256 /* start by parsing the lengths for the small tree */ 257 struct huffman_decoder* smallhuff = create_huffman_decoder(24, 6); 258 smallhuff->huffnode[0].numbits = bitstream_read(bitbuf, 3); 259 start = bitstream_read(bitbuf, 3) + 1; 260 for (index = 1; index < 24; index++) 261 { 262 if (index < start || count == 7) 263 smallhuff->huffnode[index].numbits = 0; 264 else 265 { 266 count = bitstream_read(bitbuf, 3); 267 smallhuff->huffnode[index].numbits = (count == 7) ? 0 : count; 268 } 269 } 270 271 /* then regenerate the tree */ 272 error = huffman_assign_canonical_codes(smallhuff); 273 if (error != HUFFERR_NONE) 274 return error; 275 huffman_build_lookup_table(smallhuff); 276 277 /* determine the maximum length of an RLE count */ 278 temp = decoder->numcodes - 9; 279 while (temp != 0) 280 temp >>= 1, rlefullbits++; 281 282 /* now process the rest of the data */ 283 for (curcode = 0; curcode < decoder->numcodes; ) 284 { 285 int value = huffman_decode_one(smallhuff, bitbuf); 286 if (value != 0) 287 decoder->huffnode[curcode++].numbits = last = value - 1; 288 else 289 { 290 int count = bitstream_read(bitbuf, 3) + 2; 291 if (count == 7+2) 292 count += bitstream_read(bitbuf, rlefullbits); 293 for ( ; count != 0 && curcode < decoder->numcodes; count--) 294 decoder->huffnode[curcode++].numbits = last; 295 } 296 } 297 298 /* make sure we free the local huffman decoder */ 299 delete_huffman_decoder(smallhuff); 300 301 /* make sure we ended up with the right number */ 302 if (curcode != decoder->numcodes) 303 return HUFFERR_INVALID_DATA; 304 305 /* assign canonical codes for all nodes based on their code lengths */ 306 error = huffman_assign_canonical_codes(decoder); 307 if (error != HUFFERR_NONE) 308 return error; 309 310 /* build the lookup table */ 311 huffman_build_lookup_table(decoder); 312 313 /* determine final input length and report errors */ 314 return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; 315 } 316 317 /*------------------------------------------------- 318 * compute_tree_from_histo - common backend for 319 * computing a tree based on the data histogram 320 *------------------------------------------------- 321 */ 322 323 enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder) 324 { 325 uint32_t i; 326 uint32_t lowerweight; 327 uint32_t upperweight; 328 /* compute the number of data items in the histogram */ 329 uint32_t sdatacount = 0; 330 for (i = 0; i < decoder->numcodes; i++) 331 sdatacount += decoder->datahisto[i]; 332 333 /* binary search to achieve the optimum encoding */ 334 lowerweight = 0; 335 upperweight = sdatacount * 2; 336 while (1) 337 { 338 /* build a tree using the current weight */ 339 uint32_t curweight = (upperweight + lowerweight) / 2; 340 int curmaxbits = huffman_build_tree(decoder, sdatacount, curweight); 341 342 /* apply binary search here */ 343 if (curmaxbits <= decoder->maxbits) 344 { 345 lowerweight = curweight; 346 347 /* early out if it worked with the raw weights, or if we're done searching */ 348 if (curweight == sdatacount || (upperweight - lowerweight) <= 1) 349 break; 350 } 351 else 352 upperweight = curweight; 353 } 354 355 /* assign canonical codes for all nodes based on their code lengths */ 356 return huffman_assign_canonical_codes(decoder); 357 } 358 359 /*************************************************************************** 360 * INTERNAL FUNCTIONS 361 *************************************************************************** 362 */ 363 364 /*------------------------------------------------- 365 * tree_node_compare - compare two tree nodes 366 * by weight 367 *------------------------------------------------- 368 */ 369 370 static int huffman_tree_node_compare(const void *item1, const void *item2) 371 { 372 const struct node_t *node1 = *(const struct node_t **)item1; 373 const struct node_t *node2 = *(const struct node_t **)item2; 374 if (node2->weight != node1->weight) 375 return node2->weight - node1->weight; 376 if (node2->bits - node1->bits == 0) 377 fprintf(stderr, "identical node sort keys, should not happen!\n"); 378 return (int)node1->bits - (int)node2->bits; 379 } 380 381 /*------------------------------------------------- 382 * build_tree - build a huffman tree based on the 383 * data distribution 384 *------------------------------------------------- 385 */ 386 387 int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight) 388 { 389 uint32_t curcode; 390 int nextalloc; 391 int listitems = 0; 392 int maxbits = 0; 393 /* make a list of all non-zero nodes */ 394 struct node_t** list = (struct node_t**)malloc(sizeof(struct node_t*) * decoder->numcodes * 2); 395 memset(decoder->huffnode, 0, decoder->numcodes * sizeof(decoder->huffnode[0])); 396 for (curcode = 0; curcode < decoder->numcodes; curcode++) 397 if (decoder->datahisto[curcode] != 0) 398 { 399 list[listitems++] = &decoder->huffnode[curcode]; 400 decoder->huffnode[curcode].count = decoder->datahisto[curcode]; 401 decoder->huffnode[curcode].bits = curcode; 402 403 /* scale the weight by the current effective length, ensuring we don't go to 0 */ 404 decoder->huffnode[curcode].weight = ((uint64_t)decoder->datahisto[curcode]) * ((uint64_t)totalweight) / ((uint64_t)totaldata); 405 if (decoder->huffnode[curcode].weight == 0) 406 decoder->huffnode[curcode].weight = 1; 407 } 408 409 #if 0 410 fprintf(stderr, "Pre-sort:\n"); 411 for (int i = 0; i < listitems; i++) { 412 fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits); 413 } 414 #endif 415 416 /* sort the list by weight, largest weight first */ 417 qsort(&list[0], listitems, sizeof(list[0]), huffman_tree_node_compare); 418 419 #if 0 420 fprintf(stderr, "Post-sort:\n"); 421 for (int i = 0; i < listitems; i++) { 422 fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits); 423 } 424 fprintf(stderr, "===================\n"); 425 #endif 426 427 /* now build the tree */ 428 nextalloc = decoder->numcodes; 429 while (listitems > 1) 430 { 431 int curitem; 432 /* remove lowest two items */ 433 struct node_t* node1 = &(*list[--listitems]); 434 struct node_t* node0 = &(*list[--listitems]); 435 436 /* create new node */ 437 struct node_t* newnode = &decoder->huffnode[nextalloc++]; 438 newnode->parent = NULL; 439 node0->parent = node1->parent = newnode; 440 newnode->weight = node0->weight + node1->weight; 441 442 /* insert into list at appropriate location */ 443 for (curitem = 0; curitem < listitems; curitem++) 444 if (newnode->weight > list[curitem]->weight) 445 { 446 memmove(&list[curitem+1], &list[curitem], (listitems - curitem) * sizeof(list[0])); 447 break; 448 } 449 list[curitem] = newnode; 450 listitems++; 451 } 452 453 /* compute the number of bits in each code, and fill in another histogram */ 454 for (curcode = 0; curcode < decoder->numcodes; curcode++) 455 { 456 struct node_t *curnode; 457 struct node_t* node = &decoder->huffnode[curcode]; 458 node->numbits = 0; 459 node->bits = 0; 460 461 /* if we have a non-zero weight, compute the number of bits */ 462 if (node->weight > 0) 463 { 464 /* determine the number of bits for this node */ 465 for (curnode = node; curnode->parent != NULL; curnode = curnode->parent) 466 node->numbits++; 467 if (node->numbits == 0) 468 node->numbits = 1; 469 470 /* keep track of the max */ 471 maxbits = MAX(maxbits, ((int)node->numbits)); 472 } 473 } 474 return maxbits; 475 } 476 477 /*------------------------------------------------- 478 * assign_canonical_codes - assign canonical codes 479 * to all the nodes based on the number of bits 480 * in each 481 *------------------------------------------------- 482 */ 483 484 enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder) 485 { 486 uint32_t curcode; 487 int codelen; 488 uint32_t curstart = 0; 489 /* build up a histogram of bit lengths */ 490 uint32_t bithisto[33] = { 0 }; 491 for (curcode = 0; curcode < decoder->numcodes; curcode++) 492 { 493 struct node_t* node = &decoder->huffnode[curcode]; 494 if (node->numbits > decoder->maxbits) 495 return HUFFERR_INTERNAL_INCONSISTENCY; 496 if (node->numbits <= 32) 497 bithisto[node->numbits]++; 498 } 499 500 /* for each code length, determine the starting code number */ 501 for (codelen = 32; codelen > 0; codelen--) 502 { 503 uint32_t nextstart = (curstart + bithisto[codelen]) >> 1; 504 if (codelen != 1 && nextstart * 2 != (curstart + bithisto[codelen])) 505 return HUFFERR_INTERNAL_INCONSISTENCY; 506 bithisto[codelen] = curstart; 507 curstart = nextstart; 508 } 509 510 /* now assign canonical codes */ 511 for (curcode = 0; curcode < decoder->numcodes; curcode++) 512 { 513 struct node_t* node = &decoder->huffnode[curcode]; 514 if (node->numbits > 0) 515 node->bits = bithisto[node->numbits]++; 516 } 517 return HUFFERR_NONE; 518 } 519 520 /*------------------------------------------------- 521 * build_lookup_table - build a lookup table for 522 * fast decoding 523 *------------------------------------------------- 524 */ 525 526 void huffman_build_lookup_table(struct huffman_decoder* decoder) 527 { 528 uint32_t curcode; 529 /* iterate over all codes */ 530 for (curcode = 0; curcode < decoder->numcodes; curcode++) 531 { 532 /* process all nodes which have non-zero bits */ 533 struct node_t* node = &decoder->huffnode[curcode]; 534 if (node->numbits > 0) 535 { 536 int shift; 537 lookup_value *dest; 538 lookup_value *destend; 539 /* set up the entry */ 540 lookup_value value = MAKE_LOOKUP(curcode, node->numbits); 541 542 /* fill all matching entries */ 543 shift = decoder->maxbits - node->numbits; 544 dest = &decoder->lookup[node->bits << shift]; 545 destend = &decoder->lookup[((node->bits + 1) << shift) - 1]; 546 while (dest <= destend) 547 *dest++ = value; 548 } 549 } 550 }