Index: third_party/libwebp/utils/huffman.h |
diff --git a/third_party/libwebp/utils/huffman.h b/third_party/libwebp/utils/huffman.h |
index 624bc1750b4429f98065554ae822d259580582a8..c6dd6aaa4524742b74aa83385a272ec8041ec475 100644 |
--- a/third_party/libwebp/utils/huffman.h |
+++ b/third_party/libwebp/utils/huffman.h |
@@ -22,78 +22,64 @@ |
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; |
+#define HUFFMAN_TABLE_BITS 8 |
+#define HUFFMAN_TABLE_MASK ((1 << HUFFMAN_TABLE_BITS) - 1) |
+ |
+#define LENGTHS_TABLE_BITS 7 |
+#define LENGTHS_TABLE_MASK ((1 << LENGTHS_TABLE_BITS) - 1) |
-// 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 |
-}; |
-// Huffman Tree group. |
+// Huffman lookup table entry |
+typedef struct { |
+ uint8_t bits; // number of bits used for this symbol |
+ uint16_t value; // symbol value or table offset |
+} HuffmanCode; |
+ |
+// long version for holding 32b values |
+typedef struct { |
+ int bits; // number of bits used for this symbol, |
+ // or an impossible value if not a literal code. |
+ uint32_t value; // 32b packed ARGB value if literal, |
+ // or non-literal symbol otherwise |
+} HuffmanCode32; |
+ |
+#define HUFFMAN_PACKED_BITS 6 |
+#define HUFFMAN_PACKED_TABLE_SIZE (1u << HUFFMAN_PACKED_BITS) |
+ |
+// Huffman table group. |
+// Includes special handling for the following cases: |
+// - is_trivial_literal: one common literal base for RED/BLUE/ALPHA (not GREEN) |
+// - is_trivial_code: only 1 code (no bit is read from bitstream) |
+// - use_packed_table: few enough literal symbols, so all the bit codes |
+// can fit into a small look-up table packed_table[] |
+// The common literal base, if applicable, is stored in 'literal_arb'. |
typedef struct HTreeGroup HTreeGroup; |
struct HTreeGroup { |
- HuffmanTree htrees_[HUFFMAN_CODES_PER_META_CODE]; |
+ HuffmanCode* htrees[HUFFMAN_CODES_PER_META_CODE]; |
+ int is_trivial_literal; // True, if huffman trees for Red, Blue & Alpha |
+ // Symbols are trivial (have a single code). |
+ uint32_t literal_arb; // If is_trivial_literal is true, this is the |
+ // ARGB value of the pixel, with Green channel |
+ // being set to zero. |
+ int is_trivial_code; // true if is_trivial_literal with only one code |
+ int use_packed_table; // use packed table below for short literal code |
+ // table mapping input bits to a packed values, or escape case to literal code |
+ HuffmanCode32 packed_table[HUFFMAN_PACKED_TABLE_SIZE]; |
}; |
-// Returns true if the given node is not a leaf of the Huffman tree. |
-static WEBP_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 WEBP_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 VP8LHuffmanTreeFree(HuffmanTree* const tree); |
- |
// Creates the instance of HTreeGroup with specified number of tree-groups. |
HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups); |
// Releases the memory allocated for HTreeGroup. |
-void VP8LHtreeGroupsFree(HTreeGroup* htree_groups, int num_htree_groups); |
- |
-// Builds Huffman tree assuming code lengths are implicitly in symbol order. |
-// The 'huff_codes' and 'code_lengths' are pre-allocated temporary memory |
-// buffers, used for creating the huffman tree. |
-// Returns false in case of error (invalid tree or memory error). |
-int VP8LHuffmanTreeBuildImplicit(HuffmanTree* const tree, |
- const int* const code_lengths, |
- int* const huff_codes, |
- int code_lengths_size); |
- |
-// Build a Huffman tree with explicitly given lists of code lengths, codes |
-// and symbols. Verifies that all symbols added are smaller than max_symbol. |
-// Returns false in case of an invalid symbol, invalid tree or memory error. |
-int VP8LHuffmanTreeBuildExplicit(HuffmanTree* const tree, |
- const int* const code_lengths, |
- const int* const codes, |
- const int* const symbols, int max_symbol, |
- int num_symbols); |
- |
-// Utility: converts Huffman code lengths to corresponding Huffman codes. |
-// 'huff_codes' should be pre-allocated. |
-// Returns false in case of error (memory allocation, invalid codes). |
-int VP8LHuffmanCodeLengthsToCodes(const int* const code_lengths, |
- int code_lengths_size, int* const huff_codes); |
+void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups); |
+ |
+// Builds Huffman lookup table assuming code lengths are in symbol order. |
+// The 'code_lengths' is pre-allocated temporary memory buffer used for creating |
+// the huffman table. |
+// Returns built table size or 0 in case of error (invalid tree or |
+// memory error). |
+int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits, |
+ const int code_lengths[], int code_lengths_size); |
#ifdef __cplusplus |
} // extern "C" |