MCPcopy Create free account
hub / github.com/ValveSoftware/openvr / HuffmanTree_makeFromLengths2

Function HuffmanTree_makeFromLengths2

samples/shared/lodepng.cpp:604–641  ·  view source on GitHub ↗

Second step for the ...makeFromLengths and ...makeFromFrequencies functions. numcodes, lengths and maxbitlen must already be filled in correctly. return value is error. */

Source from the content-addressed store, hash-verified

602value is error.
603*/
604static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree)
605{
606 uivector blcount;
607 uivector nextcode;
608 unsigned bits, n, error = 0;
609
610 uivector_init(&blcount);
611 uivector_init(&nextcode);
612
613 tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned));
614 if(!tree->tree1d) error = 83; /*alloc fail*/
615
616 if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0)
617 || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0))
618 error = 83; /*alloc fail*/
619
620 if(!error)
621 {
622 /*step 1: count number of instances of each code length*/
623 for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++;
624 /*step 2: generate the nextcode values*/
625 for(bits = 1; bits <= tree->maxbitlen; bits++)
626 {
627 nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1;
628 }
629 /*step 3: generate all the codes*/
630 for(n = 0; n < tree->numcodes; n++)
631 {
632 if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++;
633 }
634 }
635
636 uivector_cleanup(&blcount);
637 uivector_cleanup(&nextcode);
638
639 if(!error) return HuffmanTree_make2DTree(tree);
640 else return error;
641}
642
643/*
644given the code lengths (as stored in the PNG file), generate the tree as defined

Callers 2

Calls 5

uivector_initFunction · 0.85
lodepng_mallocFunction · 0.85
uivector_resizevFunction · 0.85
uivector_cleanupFunction · 0.85
HuffmanTree_make2DTreeFunction · 0.85

Tested by

no test coverage detected