1 // Copyright 2011 Google Inc. All Rights Reserved.
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the COPYING file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS. All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 // -----------------------------------------------------------------------------
10 // Author: Jyrki Alakuijala (jyrki@google.com)
12 // Entropy encoding (Huffman) for webp lossless.
17 #include "./huffman_encode.h"
18 #include "../utils/utils.h"
19 #include "../webp/format_constants.h"
21 // -----------------------------------------------------------------------------
22 // Util function to optimize the symbol map for RLE coding
24 // Heuristics for selecting the stride ranges to collapse.
25 static int ValuesShouldBeCollapsedToStrideAverage(int a
, int b
) {
26 return abs(a
- b
) < 4;
29 // Change the population counts in a way that the consequent
30 // Huffman tree compression, especially its RLE-part, give smaller output.
31 static void OptimizeHuffmanForRle(int length
, uint8_t* const good_for_rle
,
32 uint32_t* const counts
) {
33 // 1) Let's make the Huffman code more compatible with rle encoding.
35 for (; length
>= 0; --length
) {
39 if (counts
[length
- 1] != 0) {
40 // Now counts[0..length - 1] does not have trailing zeros.
44 // 2) Let's mark all population counts that already can be encoded
47 // Let's not spoil any of the existing good rle codes.
48 // Mark any seq of 0's that is longer as 5 as a good_for_rle.
49 // Mark any seq of non-0's that is longer as 7 as a good_for_rle.
50 uint32_t symbol
= counts
[0];
52 for (i
= 0; i
< length
+ 1; ++i
) {
53 if (i
== length
|| counts
[i
] != symbol
) {
54 if ((symbol
== 0 && stride
>= 5) ||
55 (symbol
!= 0 && stride
>= 7)) {
57 for (k
= 0; k
< stride
; ++k
) {
58 good_for_rle
[i
- k
- 1] = 1;
70 // 3) Let's replace those population counts that lead to more rle codes.
73 uint32_t limit
= counts
[0];
75 for (i
= 0; i
< length
+ 1; ++i
) {
76 if (i
== length
|| good_for_rle
[i
] ||
77 (i
!= 0 && good_for_rle
[i
- 1]) ||
78 !ValuesShouldBeCollapsedToStrideAverage(counts
[i
], limit
)) {
79 if (stride
>= 4 || (stride
>= 3 && sum
== 0)) {
81 // The stride must end, collapse what we have, if we have enough (4).
82 uint32_t count
= (sum
+ stride
/ 2) / stride
;
87 // Don't make an all zeros stride to be upgraded to ones.
90 for (k
= 0; k
< stride
; ++k
) {
91 // We don't want to change value at counts[i],
92 // that is already belonging to the next stride. Thus - 1.
93 counts
[i
- k
- 1] = count
;
99 // All interesting strides have a count of at least 4,
100 // at least when non-zeros.
101 limit
= (counts
[i
] + counts
[i
+ 1] +
102 counts
[i
+ 2] + counts
[i
+ 3] + 2) / 4;
103 } else if (i
< length
) {
113 limit
= (sum
+ stride
/ 2) / stride
;
120 // A comparer function for two Huffman trees: sorts first by 'total count'
121 // (more comes first), and then by 'value' (more comes first).
122 static int CompareHuffmanTrees(const void* ptr1
, const void* ptr2
) {
123 const HuffmanTree
* const t1
= (const HuffmanTree
*)ptr1
;
124 const HuffmanTree
* const t2
= (const HuffmanTree
*)ptr2
;
125 if (t1
->total_count_
> t2
->total_count_
) {
127 } else if (t1
->total_count_
< t2
->total_count_
) {
130 assert(t1
->value_
!= t2
->value_
);
131 return (t1
->value_
< t2
->value_
) ? -1 : 1;
135 static void SetBitDepths(const HuffmanTree
* const tree
,
136 const HuffmanTree
* const pool
,
137 uint8_t* const bit_depths
, int level
) {
138 if (tree
->pool_index_left_
>= 0) {
139 SetBitDepths(&pool
[tree
->pool_index_left_
], pool
, bit_depths
, level
+ 1);
140 SetBitDepths(&pool
[tree
->pool_index_right_
], pool
, bit_depths
, level
+ 1);
142 bit_depths
[tree
->value_
] = level
;
146 // Create an optimal Huffman tree.
148 // (data,length): population counts.
149 // tree_limit: maximum bit depth (inclusive) of the codes.
150 // bit_depths[]: how many bits are used for the symbol.
152 // Returns 0 when an error has occurred.
154 // The catch here is that the tree cannot be arbitrarily deep
156 // count_limit is the value that is to be faked as the minimum value
157 // and this minimum value is raised until the tree matches the
158 // maximum length requirement.
160 // This algorithm is not of excellent performance for very long data blocks,
161 // especially when population counts are longer than 2**tree_limit, but
162 // we are not planning to use this with extremely long blocks.
164 // See http://en.wikipedia.org/wiki/Huffman_coding
165 static void GenerateOptimalTree(const uint32_t* const histogram
,
167 HuffmanTree
* tree
, int tree_depth_limit
,
168 uint8_t* const bit_depths
) {
170 HuffmanTree
* tree_pool
;
171 int tree_size_orig
= 0;
174 for (i
= 0; i
< histogram_size
; ++i
) {
175 if (histogram
[i
] != 0) {
180 if (tree_size_orig
== 0) { // pretty optimal already!
184 tree_pool
= tree
+ tree_size_orig
;
186 // For block sizes with less than 64k symbols we never need to do a
187 // second iteration of this loop.
188 // If we actually start running inside this loop a lot, we would perhaps
189 // be better off with the Katajainen algorithm.
190 assert(tree_size_orig
<= (1 << (tree_depth_limit
- 1)));
191 for (count_min
= 1; ; count_min
*= 2) {
192 int tree_size
= tree_size_orig
;
193 // We need to pack the Huffman tree in tree_depth_limit bits.
194 // So, we try by faking histogram entries to be at least 'count_min'.
197 for (j
= 0; j
< histogram_size
; ++j
) {
198 if (histogram
[j
] != 0) {
199 const uint32_t count
=
200 (histogram
[j
] < count_min
) ? count_min
: histogram
[j
];
201 tree
[idx
].total_count_
= count
;
202 tree
[idx
].value_
= j
;
203 tree
[idx
].pool_index_left_
= -1;
204 tree
[idx
].pool_index_right_
= -1;
209 // Build the Huffman tree.
210 qsort(tree
, tree_size
, sizeof(*tree
), CompareHuffmanTrees
);
212 if (tree_size
> 1) { // Normal case.
213 int tree_pool_size
= 0;
214 while (tree_size
> 1) { // Finish when we have only one root.
216 tree_pool
[tree_pool_size
++] = tree
[tree_size
- 1];
217 tree_pool
[tree_pool_size
++] = tree
[tree_size
- 2];
218 count
= tree_pool
[tree_pool_size
- 1].total_count_
+
219 tree_pool
[tree_pool_size
- 2].total_count_
;
222 // Search for the insertion point.
224 for (k
= 0; k
< tree_size
; ++k
) {
225 if (tree
[k
].total_count_
<= count
) {
229 memmove(tree
+ (k
+ 1), tree
+ k
, (tree_size
- k
) * sizeof(*tree
));
230 tree
[k
].total_count_
= count
;
233 tree
[k
].pool_index_left_
= tree_pool_size
- 1;
234 tree
[k
].pool_index_right_
= tree_pool_size
- 2;
235 tree_size
= tree_size
+ 1;
238 SetBitDepths(&tree
[0], tree_pool
, bit_depths
, 0);
239 } else if (tree_size
== 1) { // Trivial case: only one element.
240 bit_depths
[tree
[0].value_
] = 1;
244 // Test if this Huffman tree satisfies our 'tree_depth_limit' criteria.
245 int max_depth
= bit_depths
[0];
246 for (j
= 1; j
< histogram_size
; ++j
) {
247 if (max_depth
< bit_depths
[j
]) {
248 max_depth
= bit_depths
[j
];
251 if (max_depth
<= tree_depth_limit
) {
258 // -----------------------------------------------------------------------------
259 // Coding of the Huffman tree values
261 static HuffmanTreeToken
* CodeRepeatedValues(int repetitions
,
262 HuffmanTreeToken
* tokens
,
263 int value
, int prev_value
) {
264 assert(value
<= MAX_ALLOWED_CODE_LENGTH
);
265 if (value
!= prev_value
) {
266 tokens
->code
= value
;
267 tokens
->extra_bits
= 0;
271 while (repetitions
>= 1) {
272 if (repetitions
< 3) {
274 for (i
= 0; i
< repetitions
; ++i
) {
275 tokens
->code
= value
;
276 tokens
->extra_bits
= 0;
280 } else if (repetitions
< 7) {
282 tokens
->extra_bits
= repetitions
- 3;
287 tokens
->extra_bits
= 3;
295 static HuffmanTreeToken
* CodeRepeatedZeros(int repetitions
,
296 HuffmanTreeToken
* tokens
) {
297 while (repetitions
>= 1) {
298 if (repetitions
< 3) {
300 for (i
= 0; i
< repetitions
; ++i
) {
301 tokens
->code
= 0; // 0-value
302 tokens
->extra_bits
= 0;
306 } else if (repetitions
< 11) {
308 tokens
->extra_bits
= repetitions
- 3;
311 } else if (repetitions
< 139) {
313 tokens
->extra_bits
= repetitions
- 11;
318 tokens
->extra_bits
= 0x7f; // 138 repeated 0s
326 int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode
* const tree
,
327 HuffmanTreeToken
* tokens
, int max_tokens
) {
328 HuffmanTreeToken
* const starting_token
= tokens
;
329 HuffmanTreeToken
* const ending_token
= tokens
+ max_tokens
;
330 const int depth_size
= tree
->num_symbols
;
331 int prev_value
= 8; // 8 is the initial value for rle.
333 assert(tokens
!= NULL
);
334 while (i
< depth_size
) {
335 const int value
= tree
->code_lengths
[i
];
338 while (k
< depth_size
&& tree
->code_lengths
[k
] == value
) ++k
;
341 tokens
= CodeRepeatedZeros(runs
, tokens
);
343 tokens
= CodeRepeatedValues(runs
, tokens
, value
, prev_value
);
347 assert(tokens
<= ending_token
);
349 (void)ending_token
; // suppress 'unused variable' warning
350 return (int)(tokens
- starting_token
);
353 // -----------------------------------------------------------------------------
355 // Pre-reversed 4-bit values.
356 static const uint8_t kReversedBits
[16] = {
357 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
358 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
361 static uint32_t ReverseBits(int num_bits
, uint32_t bits
) {
364 while (i
< num_bits
) {
366 retval
|= kReversedBits
[bits
& 0xf] << (MAX_ALLOWED_CODE_LENGTH
+ 1 - i
);
369 retval
>>= (MAX_ALLOWED_CODE_LENGTH
+ 1 - num_bits
);
373 // Get the actual bit values for a tree of bit depths.
374 static void ConvertBitDepthsToSymbols(HuffmanTreeCode
* const tree
) {
375 // 0 bit-depth means that the symbol does not exist.
378 uint32_t next_code
[MAX_ALLOWED_CODE_LENGTH
+ 1];
379 int depth_count
[MAX_ALLOWED_CODE_LENGTH
+ 1] = { 0 };
381 assert(tree
!= NULL
);
382 len
= tree
->num_symbols
;
383 for (i
= 0; i
< len
; ++i
) {
384 const int code_length
= tree
->code_lengths
[i
];
385 assert(code_length
<= MAX_ALLOWED_CODE_LENGTH
);
386 ++depth_count
[code_length
];
388 depth_count
[0] = 0; // ignore unused symbol
392 for (i
= 1; i
<= MAX_ALLOWED_CODE_LENGTH
; ++i
) {
393 code
= (code
+ depth_count
[i
- 1]) << 1;
397 for (i
= 0; i
< len
; ++i
) {
398 const int code_length
= tree
->code_lengths
[i
];
399 tree
->codes
[i
] = ReverseBits(code_length
, next_code
[code_length
]++);
403 // -----------------------------------------------------------------------------
406 void VP8LCreateHuffmanTree(uint32_t* const histogram
, int tree_depth_limit
,
407 uint8_t* const buf_rle
,
408 HuffmanTree
* const huff_tree
,
409 HuffmanTreeCode
* const huff_code
) {
410 const int num_symbols
= huff_code
->num_symbols
;
411 memset(buf_rle
, 0, num_symbols
* sizeof(*buf_rle
));
412 OptimizeHuffmanForRle(num_symbols
, buf_rle
, histogram
);
413 GenerateOptimalTree(histogram
, num_symbols
, huff_tree
, tree_depth_limit
,
414 huff_code
->code_lengths
);
415 // Create the actual bit codes for the bit lengths.
416 ConvertBitDepthsToSymbols(huff_code
);