• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2010 Google Inc. All Rights Reserved.
2 
3    Distributed under MIT license.
4    See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5 */
6 
7 /* Entropy encoding (Huffman) utilities. */
8 
9 #include "entropy_encode.h"
10 
11 #include <string.h>  /* memset */
12 
13 #include <brotli/types.h>
14 
15 #include "../common/constants.h"
16 #include "../common/platform.h"
17 
18 #if defined(__cplusplus) || defined(c_plusplus)
19 extern "C" {
20 #endif
21 
22 const size_t kBrotliShellGaps[] = {132, 57, 23, 10, 4, 1};
23 
BrotliSetDepth(int p0,HuffmanTree * pool,uint8_t * depth,int max_depth)24 BROTLI_BOOL BrotliSetDepth(
25     int p0, HuffmanTree* pool, uint8_t* depth, int max_depth) {
26   int stack[16];
27   int level = 0;
28   int p = p0;
29   BROTLI_DCHECK(max_depth <= 15);
30   stack[0] = -1;
31   while (BROTLI_TRUE) {
32     if (pool[p].index_left_ >= 0) {
33       level++;
34       if (level > max_depth) return BROTLI_FALSE;
35       stack[level] = pool[p].index_right_or_value_;
36       p = pool[p].index_left_;
37       continue;
38     } else {
39       depth[pool[p].index_right_or_value_] = (uint8_t)level;
40     }
41     while (level >= 0 && stack[level] == -1) level--;
42     if (level < 0) return BROTLI_TRUE;
43     p = stack[level];
44     stack[level] = -1;
45   }
46 }
47 
48 /* Sort the root nodes, least popular first. */
SortHuffmanTree(const HuffmanTree * v0,const HuffmanTree * v1)49 static BROTLI_INLINE BROTLI_BOOL SortHuffmanTree(
50     const HuffmanTree* v0, const HuffmanTree* v1) {
51   if (v0->total_count_ != v1->total_count_) {
52     return TO_BROTLI_BOOL(v0->total_count_ < v1->total_count_);
53   }
54   return TO_BROTLI_BOOL(v0->index_right_or_value_ > v1->index_right_or_value_);
55 }
56 
57 /* This function will create a Huffman tree.
58 
59    The catch here is that the tree cannot be arbitrarily deep.
60    Brotli specifies a maximum depth of 15 bits for "code trees"
61    and 7 bits for "code length code trees."
62 
63    count_limit is the value that is to be faked as the minimum value
64    and this minimum value is raised until the tree matches the
65    maximum length requirement.
66 
67    This algorithm is not of excellent performance for very long data blocks,
68    especially when population counts are longer than 2**tree_limit, but
69    we are not planning to use this with extremely long blocks.
70 
71    See http://en.wikipedia.org/wiki/Huffman_coding */
BrotliCreateHuffmanTree(const uint32_t * data,const size_t length,const int tree_limit,HuffmanTree * tree,uint8_t * depth)72 void BrotliCreateHuffmanTree(const uint32_t* data,
73                              const size_t length,
74                              const int tree_limit,
75                              HuffmanTree* tree,
76                              uint8_t* depth) {
77   uint32_t count_limit;
78   HuffmanTree sentinel;
79   InitHuffmanTree(&sentinel, BROTLI_UINT32_MAX, -1, -1);
80   /* For block sizes below 64 kB, we never need to do a second iteration
81      of this loop. Probably all of our block sizes will be smaller than
82      that, so this loop is mostly of academic interest. If we actually
83      would need this, we would be better off with the Katajainen algorithm. */
84   for (count_limit = 1; ; count_limit *= 2) {
85     size_t n = 0;
86     size_t i;
87     size_t j;
88     size_t k;
89     for (i = length; i != 0;) {
90       --i;
91       if (data[i]) {
92         const uint32_t count = BROTLI_MAX(uint32_t, data[i], count_limit);
93         InitHuffmanTree(&tree[n++], count, -1, (int16_t)i);
94       }
95     }
96 
97     if (n == 1) {
98       depth[tree[0].index_right_or_value_] = 1;  /* Only one element. */
99       break;
100     }
101 
102     SortHuffmanTreeItems(tree, n, SortHuffmanTree);
103 
104     /* The nodes are:
105        [0, n): the sorted leaf nodes that we start with.
106        [n]: we add a sentinel here.
107        [n + 1, 2n): new parent nodes are added here, starting from
108                     (n+1). These are naturally in ascending order.
109        [2n]: we add a sentinel at the end as well.
110        There will be (2n+1) elements at the end. */
111     tree[n] = sentinel;
112     tree[n + 1] = sentinel;
113 
114     i = 0;      /* Points to the next leaf node. */
115     j = n + 1;  /* Points to the next non-leaf node. */
116     for (k = n - 1; k != 0; --k) {
117       size_t left, right;
118       if (tree[i].total_count_ <= tree[j].total_count_) {
119         left = i;
120         ++i;
121       } else {
122         left = j;
123         ++j;
124       }
125       if (tree[i].total_count_ <= tree[j].total_count_) {
126         right = i;
127         ++i;
128       } else {
129         right = j;
130         ++j;
131       }
132 
133       {
134         /* The sentinel node becomes the parent node. */
135         size_t j_end = 2 * n - k;
136         tree[j_end].total_count_ =
137             tree[left].total_count_ + tree[right].total_count_;
138         tree[j_end].index_left_ = (int16_t)left;
139         tree[j_end].index_right_or_value_ = (int16_t)right;
140 
141         /* Add back the last sentinel node. */
142         tree[j_end + 1] = sentinel;
143       }
144     }
145     if (BrotliSetDepth((int)(2 * n - 1), &tree[0], depth, tree_limit)) {
146       /* We need to pack the Huffman tree in tree_limit bits. If this was not
147          successful, add fake entities to the lowest values and retry. */
148       break;
149     }
150   }
151 }
152 
Reverse(uint8_t * v,size_t start,size_t end)153 static void Reverse(uint8_t* v, size_t start, size_t end) {
154   --end;
155   while (start < end) {
156     uint8_t tmp = v[start];
157     v[start] = v[end];
158     v[end] = tmp;
159     ++start;
160     --end;
161   }
162 }
163 
BrotliWriteHuffmanTreeRepetitions(const uint8_t previous_value,const uint8_t value,size_t repetitions,size_t * tree_size,uint8_t * tree,uint8_t * extra_bits_data)164 static void BrotliWriteHuffmanTreeRepetitions(
165     const uint8_t previous_value,
166     const uint8_t value,
167     size_t repetitions,
168     size_t* tree_size,
169     uint8_t* tree,
170     uint8_t* extra_bits_data) {
171   BROTLI_DCHECK(repetitions > 0);
172   if (previous_value != value) {
173     tree[*tree_size] = value;
174     extra_bits_data[*tree_size] = 0;
175     ++(*tree_size);
176     --repetitions;
177   }
178   if (repetitions == 7) {
179     tree[*tree_size] = value;
180     extra_bits_data[*tree_size] = 0;
181     ++(*tree_size);
182     --repetitions;
183   }
184   if (repetitions < 3) {
185     size_t i;
186     for (i = 0; i < repetitions; ++i) {
187       tree[*tree_size] = value;
188       extra_bits_data[*tree_size] = 0;
189       ++(*tree_size);
190     }
191   } else {
192     size_t start = *tree_size;
193     repetitions -= 3;
194     while (BROTLI_TRUE) {
195       tree[*tree_size] = BROTLI_REPEAT_PREVIOUS_CODE_LENGTH;
196       extra_bits_data[*tree_size] = repetitions & 0x3;
197       ++(*tree_size);
198       repetitions >>= 2;
199       if (repetitions == 0) {
200         break;
201       }
202       --repetitions;
203     }
204     Reverse(tree, start, *tree_size);
205     Reverse(extra_bits_data, start, *tree_size);
206   }
207 }
208 
BrotliWriteHuffmanTreeRepetitionsZeros(size_t repetitions,size_t * tree_size,uint8_t * tree,uint8_t * extra_bits_data)209 static void BrotliWriteHuffmanTreeRepetitionsZeros(
210     size_t repetitions,
211     size_t* tree_size,
212     uint8_t* tree,
213     uint8_t* extra_bits_data) {
214   if (repetitions == 11) {
215     tree[*tree_size] = 0;
216     extra_bits_data[*tree_size] = 0;
217     ++(*tree_size);
218     --repetitions;
219   }
220   if (repetitions < 3) {
221     size_t i;
222     for (i = 0; i < repetitions; ++i) {
223       tree[*tree_size] = 0;
224       extra_bits_data[*tree_size] = 0;
225       ++(*tree_size);
226     }
227   } else {
228     size_t start = *tree_size;
229     repetitions -= 3;
230     while (BROTLI_TRUE) {
231       tree[*tree_size] = BROTLI_REPEAT_ZERO_CODE_LENGTH;
232       extra_bits_data[*tree_size] = repetitions & 0x7;
233       ++(*tree_size);
234       repetitions >>= 3;
235       if (repetitions == 0) {
236         break;
237       }
238       --repetitions;
239     }
240     Reverse(tree, start, *tree_size);
241     Reverse(extra_bits_data, start, *tree_size);
242   }
243 }
244 
BrotliOptimizeHuffmanCountsForRle(size_t length,uint32_t * counts,uint8_t * good_for_rle)245 void BrotliOptimizeHuffmanCountsForRle(size_t length, uint32_t* counts,
246                                        uint8_t* good_for_rle) {
247   size_t nonzero_count = 0;
248   size_t stride;
249   size_t limit;
250   size_t sum;
251   const size_t streak_limit = 1240;
252   /* Let's make the Huffman code more compatible with RLE encoding. */
253   size_t i;
254   for (i = 0; i < length; i++) {
255     if (counts[i]) {
256       ++nonzero_count;
257     }
258   }
259   if (nonzero_count < 16) {
260     return;
261   }
262   while (length != 0 && counts[length - 1] == 0) {
263     --length;
264   }
265   if (length == 0) {
266     return;  /* All zeros. */
267   }
268   /* Now counts[0..length - 1] does not have trailing zeros. */
269   {
270     size_t nonzeros = 0;
271     uint32_t smallest_nonzero = 1 << 30;
272     for (i = 0; i < length; ++i) {
273       if (counts[i] != 0) {
274         ++nonzeros;
275         if (smallest_nonzero > counts[i]) {
276           smallest_nonzero = counts[i];
277         }
278       }
279     }
280     if (nonzeros < 5) {
281       /* Small histogram will model it well. */
282       return;
283     }
284     if (smallest_nonzero < 4) {
285       size_t zeros = length - nonzeros;
286       if (zeros < 6) {
287         for (i = 1; i < length - 1; ++i) {
288           if (counts[i - 1] != 0 && counts[i] == 0 && counts[i + 1] != 0) {
289             counts[i] = 1;
290           }
291         }
292       }
293     }
294     if (nonzeros < 28) {
295       return;
296     }
297   }
298   /* 2) Let's mark all population counts that already can be encoded
299      with an RLE code. */
300   memset(good_for_rle, 0, length);
301   {
302     /* Let's not spoil any of the existing good RLE codes.
303        Mark any seq of 0's that is longer as 5 as a good_for_rle.
304        Mark any seq of non-0's that is longer as 7 as a good_for_rle. */
305     uint32_t symbol = counts[0];
306     size_t step = 0;
307     for (i = 0; i <= length; ++i) {
308       if (i == length || counts[i] != symbol) {
309         if ((symbol == 0 && step >= 5) ||
310             (symbol != 0 && step >= 7)) {
311           size_t k;
312           for (k = 0; k < step; ++k) {
313             good_for_rle[i - k - 1] = 1;
314           }
315         }
316         step = 1;
317         if (i != length) {
318           symbol = counts[i];
319         }
320       } else {
321         ++step;
322       }
323     }
324   }
325   /* 3) Let's replace those population counts that lead to more RLE codes.
326      Math here is in 24.8 fixed point representation. */
327   stride = 0;
328   limit = 256 * (counts[0] + counts[1] + counts[2]) / 3 + 420;
329   sum = 0;
330   for (i = 0; i <= length; ++i) {
331     if (i == length || good_for_rle[i] ||
332         (i != 0 && good_for_rle[i - 1]) ||
333         (256 * counts[i] - limit + streak_limit) >= 2 * streak_limit) {
334       if (stride >= 4 || (stride >= 3 && sum == 0)) {
335         size_t k;
336         /* The stride must end, collapse what we have, if we have enough (4). */
337         size_t count = (sum + stride / 2) / stride;
338         if (count == 0) {
339           count = 1;
340         }
341         if (sum == 0) {
342           /* Don't make an all zeros stride to be upgraded to ones. */
343           count = 0;
344         }
345         for (k = 0; k < stride; ++k) {
346           /* We don't want to change value at counts[i],
347              that is already belonging to the next stride. Thus - 1. */
348           counts[i - k - 1] = (uint32_t)count;
349         }
350       }
351       stride = 0;
352       sum = 0;
353       if (i < length - 2) {
354         /* All interesting strides have a count of at least 4, */
355         /* at least when non-zeros. */
356         limit = 256 * (counts[i] + counts[i + 1] + counts[i + 2]) / 3 + 420;
357       } else if (i < length) {
358         limit = 256 * counts[i];
359       } else {
360         limit = 0;
361       }
362     }
363     ++stride;
364     if (i != length) {
365       sum += counts[i];
366       if (stride >= 4) {
367         limit = (256 * sum + stride / 2) / stride;
368       }
369       if (stride == 4) {
370         limit += 120;
371       }
372     }
373   }
374 }
375 
DecideOverRleUse(const uint8_t * depth,const size_t length,BROTLI_BOOL * use_rle_for_non_zero,BROTLI_BOOL * use_rle_for_zero)376 static void DecideOverRleUse(const uint8_t* depth, const size_t length,
377                              BROTLI_BOOL* use_rle_for_non_zero,
378                              BROTLI_BOOL* use_rle_for_zero) {
379   size_t total_reps_zero = 0;
380   size_t total_reps_non_zero = 0;
381   size_t count_reps_zero = 1;
382   size_t count_reps_non_zero = 1;
383   size_t i;
384   for (i = 0; i < length;) {
385     const uint8_t value = depth[i];
386     size_t reps = 1;
387     size_t k;
388     for (k = i + 1; k < length && depth[k] == value; ++k) {
389       ++reps;
390     }
391     if (reps >= 3 && value == 0) {
392       total_reps_zero += reps;
393       ++count_reps_zero;
394     }
395     if (reps >= 4 && value != 0) {
396       total_reps_non_zero += reps;
397       ++count_reps_non_zero;
398     }
399     i += reps;
400   }
401   *use_rle_for_non_zero =
402       TO_BROTLI_BOOL(total_reps_non_zero > count_reps_non_zero * 2);
403   *use_rle_for_zero = TO_BROTLI_BOOL(total_reps_zero > count_reps_zero * 2);
404 }
405 
BrotliWriteHuffmanTree(const uint8_t * depth,size_t length,size_t * tree_size,uint8_t * tree,uint8_t * extra_bits_data)406 void BrotliWriteHuffmanTree(const uint8_t* depth,
407                             size_t length,
408                             size_t* tree_size,
409                             uint8_t* tree,
410                             uint8_t* extra_bits_data) {
411   uint8_t previous_value = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
412   size_t i;
413   BROTLI_BOOL use_rle_for_non_zero = BROTLI_FALSE;
414   BROTLI_BOOL use_rle_for_zero = BROTLI_FALSE;
415 
416   /* Throw away trailing zeros. */
417   size_t new_length = length;
418   for (i = 0; i < length; ++i) {
419     if (depth[length - i - 1] == 0) {
420       --new_length;
421     } else {
422       break;
423     }
424   }
425 
426   /* First gather statistics on if it is a good idea to do RLE. */
427   if (length > 50) {
428     /* Find RLE coding for longer codes.
429        Shorter codes seem not to benefit from RLE. */
430     DecideOverRleUse(depth, new_length,
431                      &use_rle_for_non_zero, &use_rle_for_zero);
432   }
433 
434   /* Actual RLE coding. */
435   for (i = 0; i < new_length;) {
436     const uint8_t value = depth[i];
437     size_t reps = 1;
438     if ((value != 0 && use_rle_for_non_zero) ||
439         (value == 0 && use_rle_for_zero)) {
440       size_t k;
441       for (k = i + 1; k < new_length && depth[k] == value; ++k) {
442         ++reps;
443       }
444     }
445     if (value == 0) {
446       BrotliWriteHuffmanTreeRepetitionsZeros(
447           reps, tree_size, tree, extra_bits_data);
448     } else {
449       BrotliWriteHuffmanTreeRepetitions(previous_value,
450                                         value, reps, tree_size,
451                                         tree, extra_bits_data);
452       previous_value = value;
453     }
454     i += reps;
455   }
456 }
457 
BrotliReverseBits(size_t num_bits,uint16_t bits)458 static uint16_t BrotliReverseBits(size_t num_bits, uint16_t bits) {
459   static const size_t kLut[16] = {  /* Pre-reversed 4-bit values. */
460     0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E,
461     0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F
462   };
463   size_t retval = kLut[bits & 0x0F];
464   size_t i;
465   for (i = 4; i < num_bits; i += 4) {
466     retval <<= 4;
467     bits = (uint16_t)(bits >> 4);
468     retval |= kLut[bits & 0x0F];
469   }
470   retval >>= ((0 - num_bits) & 0x03);
471   return (uint16_t)retval;
472 }
473 
474 /* 0..15 are values for bits */
475 #define MAX_HUFFMAN_BITS 16
476 
BrotliConvertBitDepthsToSymbols(const uint8_t * depth,size_t len,uint16_t * bits)477 void BrotliConvertBitDepthsToSymbols(const uint8_t* depth,
478                                      size_t len,
479                                      uint16_t* bits) {
480   /* In Brotli, all bit depths are [1..15]
481      0 bit depth means that the symbol does not exist. */
482   uint16_t bl_count[MAX_HUFFMAN_BITS] = { 0 };
483   uint16_t next_code[MAX_HUFFMAN_BITS];
484   size_t i;
485   int code = 0;
486   for (i = 0; i < len; ++i) {
487     ++bl_count[depth[i]];
488   }
489   bl_count[0] = 0;
490   next_code[0] = 0;
491   for (i = 1; i < MAX_HUFFMAN_BITS; ++i) {
492     code = (code + bl_count[i - 1]) << 1;
493     next_code[i] = (uint16_t)code;
494   }
495   for (i = 0; i < len; ++i) {
496     if (depth[i]) {
497       bits[i] = BrotliReverseBits(depth[i], next_code[depth[i]]++);
498     }
499   }
500 }
501 
502 #if defined(__cplusplus) || defined(c_plusplus)
503 }  /* extern "C" */
504 #endif
505