diff options
Diffstat (limited to 'brotli/dec/huffman.h')
-rw-r--r-- | brotli/dec/huffman.h | 49 |
1 files changed, 9 insertions, 40 deletions
diff --git a/brotli/dec/huffman.h b/brotli/dec/huffman.h index fbd0744..834b316 100644 --- a/brotli/dec/huffman.h +++ b/brotli/dec/huffman.h @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License. - Utilities for building and looking up Huffman trees. + Utilities for building Huffman decoding tables. */ #ifndef BROTLI_DEC_HUFFMAN_H_ @@ -25,48 +25,17 @@ extern "C" { #endif -/* A node of a Huffman tree. */ typedef struct { - int symbol_; - int children_; /* delta offset to both children (contiguous) or 0 if leaf. */ -} HuffmanTreeNode; + uint8_t bits; /* number of bits used for this symbol */ + uint16_t value; /* symbol value or table offset */ +} HuffmanCode; -/* Huffman Tree. */ -#define HUFF_LUT_BITS 7 -#define HUFF_LUT (1U << HUFF_LUT_BITS) -typedef struct HuffmanTree HuffmanTree; -struct HuffmanTree { - /* Fast lookup for short bit lengths. */ - uint8_t lut_bits_[HUFF_LUT]; - int16_t lut_symbol_[HUFF_LUT]; - int16_t lut_jump_[HUFF_LUT]; - /* Complete tree for lookups. */ - HuffmanTreeNode* root_; /* all the nodes, starting at root. */ - int max_nodes_; /* max number of nodes */ - int num_nodes_; /* number of currently occupied nodes */ -}; - -/* Returns true if the given node is not a leaf of the Huffman tree. */ -static BROTLI_INLINE int HuffmanTreeNodeIsNotLeaf( - const HuffmanTreeNode* const node) { - return node->children_; -} - -/* Go down one level. Most critical function. 'right_child' must be 0 or 1. */ -static BROTLI_INLINE const HuffmanTreeNode* HuffmanTreeNextNode( - const HuffmanTreeNode* node, int right_child) { - return node + node->children_ + right_child; -} - -/* Releases the nodes of the Huffman tree. */ -/* Note: It does NOT free 'tree' itself. */ -void BrotliHuffmanTreeRelease(HuffmanTree* const tree); - -/* Builds Huffman tree assuming code lengths are implicitly in symbol order. */ +/* Builds Huffman lookup table assuming code lengths are in symbol order. */ /* Returns false in case of error (invalid tree or memory error). */ -int BrotliHuffmanTreeBuildImplicit(HuffmanTree* const tree, - const uint8_t* const code_lengths, - int code_lengths_size); +int BrotliBuildHuffmanTable(HuffmanCode* root_table, + int root_bits, + const uint8_t* const code_lengths, + int code_lengths_size); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ |