github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/webp/libwebp/src/utils/huffman_encode.c (about)

     1  // Copyright 2011 Google Inc. All Rights Reserved.
     2  //
     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  // -----------------------------------------------------------------------------
     9  //
    10  // Author: Jyrki Alakuijala (jyrki@google.com)
    11  //
    12  // Entropy encoding (Huffman) for webp lossless.
    13  
    14  #include <assert.h>
    15  #include <stdlib.h>
    16  #include <string.h>
    17  #include "./huffman_encode.h"
    18  #include "../utils/utils.h"
    19  #include "../webp/format_constants.h"
    20  
    21  // -----------------------------------------------------------------------------
    22  // Util function to optimize the symbol map for RLE coding
    23  
    24  // Heuristics for selecting the stride ranges to collapse.
    25  static int ValuesShouldBeCollapsedToStrideAverage(int a, int b) {
    26    return abs(a - b) < 4;
    27  }
    28  
    29  // Change the population counts in a way that the consequent
    30  // Huffman tree compression, especially its RLE-part, give smaller output.
    31  static int OptimizeHuffmanForRle(int length, int* const counts) {
    32    uint8_t* good_for_rle;
    33    // 1) Let's make the Huffman code more compatible with rle encoding.
    34    int i;
    35    for (; length >= 0; --length) {
    36      if (length == 0) {
    37        return 1;  // All zeros.
    38      }
    39      if (counts[length - 1] != 0) {
    40        // Now counts[0..length - 1] does not have trailing zeros.
    41        break;
    42      }
    43    }
    44    // 2) Let's mark all population counts that already can be encoded
    45    // with an rle code.
    46    good_for_rle = (uint8_t*)calloc(length, 1);
    47    if (good_for_rle == NULL) {
    48      return 0;
    49    }
    50    {
    51      // Let's not spoil any of the existing good rle codes.
    52      // Mark any seq of 0's that is longer as 5 as a good_for_rle.
    53      // Mark any seq of non-0's that is longer as 7 as a good_for_rle.
    54      int symbol = counts[0];
    55      int stride = 0;
    56      for (i = 0; i < length + 1; ++i) {
    57        if (i == length || counts[i] != symbol) {
    58          if ((symbol == 0 && stride >= 5) ||
    59              (symbol != 0 && stride >= 7)) {
    60            int k;
    61            for (k = 0; k < stride; ++k) {
    62              good_for_rle[i - k - 1] = 1;
    63            }
    64          }
    65          stride = 1;
    66          if (i != length) {
    67            symbol = counts[i];
    68          }
    69        } else {
    70          ++stride;
    71        }
    72      }
    73    }
    74    // 3) Let's replace those population counts that lead to more rle codes.
    75    {
    76      int stride = 0;
    77      int limit = counts[0];
    78      int sum = 0;
    79      for (i = 0; i < length + 1; ++i) {
    80        if (i == length || good_for_rle[i] ||
    81            (i != 0 && good_for_rle[i - 1]) ||
    82            !ValuesShouldBeCollapsedToStrideAverage(counts[i], limit)) {
    83          if (stride >= 4 || (stride >= 3 && sum == 0)) {
    84            int k;
    85            // The stride must end, collapse what we have, if we have enough (4).
    86            int count = (sum + stride / 2) / stride;
    87            if (count < 1) {
    88              count = 1;
    89            }
    90            if (sum == 0) {
    91              // Don't make an all zeros stride to be upgraded to ones.
    92              count = 0;
    93            }
    94            for (k = 0; k < stride; ++k) {
    95              // We don't want to change value at counts[i],
    96              // that is already belonging to the next stride. Thus - 1.
    97              counts[i - k - 1] = count;
    98            }
    99          }
   100          stride = 0;
   101          sum = 0;
   102          if (i < length - 3) {
   103            // All interesting strides have a count of at least 4,
   104            // at least when non-zeros.
   105            limit = (counts[i] + counts[i + 1] +
   106                     counts[i + 2] + counts[i + 3] + 2) / 4;
   107          } else if (i < length) {
   108            limit = counts[i];
   109          } else {
   110            limit = 0;
   111          }
   112        }
   113        ++stride;
   114        if (i != length) {
   115          sum += counts[i];
   116          if (stride >= 4) {
   117            limit = (sum + stride / 2) / stride;
   118          }
   119        }
   120      }
   121    }
   122    free(good_for_rle);
   123    return 1;
   124  }
   125  
   126  typedef struct {
   127    int total_count_;
   128    int value_;
   129    int pool_index_left_;
   130    int pool_index_right_;
   131  } HuffmanTree;
   132  
   133  // A comparer function for two Huffman trees: sorts first by 'total count'
   134  // (more comes first), and then by 'value' (more comes first).
   135  static int CompareHuffmanTrees(const void* ptr1, const void* ptr2) {
   136    const HuffmanTree* const t1 = (const HuffmanTree*)ptr1;
   137    const HuffmanTree* const t2 = (const HuffmanTree*)ptr2;
   138    if (t1->total_count_ > t2->total_count_) {
   139      return -1;
   140    } else if (t1->total_count_ < t2->total_count_) {
   141      return 1;
   142    } else {
   143      assert(t1->value_ != t2->value_);
   144      return (t1->value_ < t2->value_) ? -1 : 1;
   145    }
   146  }
   147  
   148  static void SetBitDepths(const HuffmanTree* const tree,
   149                           const HuffmanTree* const pool,
   150                           uint8_t* const bit_depths, int level) {
   151    if (tree->pool_index_left_ >= 0) {
   152      SetBitDepths(&pool[tree->pool_index_left_], pool, bit_depths, level + 1);
   153      SetBitDepths(&pool[tree->pool_index_right_], pool, bit_depths, level + 1);
   154    } else {
   155      bit_depths[tree->value_] = level;
   156    }
   157  }
   158  
   159  // Create an optimal Huffman tree.
   160  //
   161  // (data,length): population counts.
   162  // tree_limit: maximum bit depth (inclusive) of the codes.
   163  // bit_depths[]: how many bits are used for the symbol.
   164  //
   165  // Returns 0 when an error has occurred.
   166  //
   167  // The catch here is that the tree cannot be arbitrarily deep
   168  //
   169  // count_limit is the value that is to be faked as the minimum value
   170  // and this minimum value is raised until the tree matches the
   171  // maximum length requirement.
   172  //
   173  // This algorithm is not of excellent performance for very long data blocks,
   174  // especially when population counts are longer than 2**tree_limit, but
   175  // we are not planning to use this with extremely long blocks.
   176  //
   177  // See http://en.wikipedia.org/wiki/Huffman_coding
   178  static int GenerateOptimalTree(const int* const histogram, int histogram_size,
   179                                 int tree_depth_limit,
   180                                 uint8_t* const bit_depths) {
   181    int count_min;
   182    HuffmanTree* tree_pool;
   183    HuffmanTree* tree;
   184    int tree_size_orig = 0;
   185    int i;
   186  
   187    for (i = 0; i < histogram_size; ++i) {
   188      if (histogram[i] != 0) {
   189        ++tree_size_orig;
   190      }
   191    }
   192  
   193    if (tree_size_orig == 0) {   // pretty optimal already!
   194      return 1;
   195    }
   196  
   197    // 3 * tree_size is enough to cover all the nodes representing a
   198    // population and all the inserted nodes combining two existing nodes.
   199    // The tree pool needs 2 * (tree_size_orig - 1) entities, and the
   200    // tree needs exactly tree_size_orig entities.
   201    tree = (HuffmanTree*)WebPSafeMalloc(3ULL * tree_size_orig, sizeof(*tree));
   202    if (tree == NULL) return 0;
   203    tree_pool = tree + tree_size_orig;
   204  
   205    // For block sizes with less than 64k symbols we never need to do a
   206    // second iteration of this loop.
   207    // If we actually start running inside this loop a lot, we would perhaps
   208    // be better off with the Katajainen algorithm.
   209    assert(tree_size_orig <= (1 << (tree_depth_limit - 1)));
   210    for (count_min = 1; ; count_min *= 2) {
   211      int tree_size = tree_size_orig;
   212      // We need to pack the Huffman tree in tree_depth_limit bits.
   213      // So, we try by faking histogram entries to be at least 'count_min'.
   214      int idx = 0;
   215      int j;
   216      for (j = 0; j < histogram_size; ++j) {
   217        if (histogram[j] != 0) {
   218          const int count =
   219              (histogram[j] < count_min) ? count_min : histogram[j];
   220          tree[idx].total_count_ = count;
   221          tree[idx].value_ = j;
   222          tree[idx].pool_index_left_ = -1;
   223          tree[idx].pool_index_right_ = -1;
   224          ++idx;
   225        }
   226      }
   227  
   228      // Build the Huffman tree.
   229      qsort(tree, tree_size, sizeof(*tree), CompareHuffmanTrees);
   230  
   231      if (tree_size > 1) {  // Normal case.
   232        int tree_pool_size = 0;
   233        while (tree_size > 1) {  // Finish when we have only one root.
   234          int count;
   235          tree_pool[tree_pool_size++] = tree[tree_size - 1];
   236          tree_pool[tree_pool_size++] = tree[tree_size - 2];
   237          count = tree_pool[tree_pool_size - 1].total_count_ +
   238                  tree_pool[tree_pool_size - 2].total_count_;
   239          tree_size -= 2;
   240          {
   241            // Search for the insertion point.
   242            int k;
   243            for (k = 0; k < tree_size; ++k) {
   244              if (tree[k].total_count_ <= count) {
   245                break;
   246              }
   247            }
   248            memmove(tree + (k + 1), tree + k, (tree_size - k) * sizeof(*tree));
   249            tree[k].total_count_ = count;
   250            tree[k].value_ = -1;
   251  
   252            tree[k].pool_index_left_ = tree_pool_size - 1;
   253            tree[k].pool_index_right_ = tree_pool_size - 2;
   254            tree_size = tree_size + 1;
   255          }
   256        }
   257        SetBitDepths(&tree[0], tree_pool, bit_depths, 0);
   258      } else if (tree_size == 1) {  // Trivial case: only one element.
   259        bit_depths[tree[0].value_] = 1;
   260      }
   261  
   262      {
   263        // Test if this Huffman tree satisfies our 'tree_depth_limit' criteria.
   264        int max_depth = bit_depths[0];
   265        for (j = 1; j < histogram_size; ++j) {
   266          if (max_depth < bit_depths[j]) {
   267            max_depth = bit_depths[j];
   268          }
   269        }
   270        if (max_depth <= tree_depth_limit) {
   271          break;
   272        }
   273      }
   274    }
   275    free(tree);
   276    return 1;
   277  }
   278  
   279  // -----------------------------------------------------------------------------
   280  // Coding of the Huffman tree values
   281  
   282  static HuffmanTreeToken* CodeRepeatedValues(int repetitions,
   283                                              HuffmanTreeToken* tokens,
   284                                              int value, int prev_value) {
   285    assert(value <= MAX_ALLOWED_CODE_LENGTH);
   286    if (value != prev_value) {
   287      tokens->code = value;
   288      tokens->extra_bits = 0;
   289      ++tokens;
   290      --repetitions;
   291    }
   292    while (repetitions >= 1) {
   293      if (repetitions < 3) {
   294        int i;
   295        for (i = 0; i < repetitions; ++i) {
   296          tokens->code = value;
   297          tokens->extra_bits = 0;
   298          ++tokens;
   299        }
   300        break;
   301      } else if (repetitions < 7) {
   302        tokens->code = 16;
   303        tokens->extra_bits = repetitions - 3;
   304        ++tokens;
   305        break;
   306      } else {
   307        tokens->code = 16;
   308        tokens->extra_bits = 3;
   309        ++tokens;
   310        repetitions -= 6;
   311      }
   312    }
   313    return tokens;
   314  }
   315  
   316  static HuffmanTreeToken* CodeRepeatedZeros(int repetitions,
   317                                             HuffmanTreeToken* tokens) {
   318    while (repetitions >= 1) {
   319      if (repetitions < 3) {
   320        int i;
   321        for (i = 0; i < repetitions; ++i) {
   322          tokens->code = 0;   // 0-value
   323          tokens->extra_bits = 0;
   324          ++tokens;
   325        }
   326        break;
   327      } else if (repetitions < 11) {
   328        tokens->code = 17;
   329        tokens->extra_bits = repetitions - 3;
   330        ++tokens;
   331        break;
   332      } else if (repetitions < 139) {
   333        tokens->code = 18;
   334        tokens->extra_bits = repetitions - 11;
   335        ++tokens;
   336        break;
   337      } else {
   338        tokens->code = 18;
   339        tokens->extra_bits = 0x7f;  // 138 repeated 0s
   340        ++tokens;
   341        repetitions -= 138;
   342      }
   343    }
   344    return tokens;
   345  }
   346  
   347  int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode* const tree,
   348                                      HuffmanTreeToken* tokens, int max_tokens) {
   349    HuffmanTreeToken* const starting_token = tokens;
   350    HuffmanTreeToken* const ending_token = tokens + max_tokens;
   351    const int depth_size = tree->num_symbols;
   352    int prev_value = 8;  // 8 is the initial value for rle.
   353    int i = 0;
   354    assert(tokens != NULL);
   355    while (i < depth_size) {
   356      const int value = tree->code_lengths[i];
   357      int k = i + 1;
   358      int runs;
   359      while (k < depth_size && tree->code_lengths[k] == value) ++k;
   360      runs = k - i;
   361      if (value == 0) {
   362        tokens = CodeRepeatedZeros(runs, tokens);
   363      } else {
   364        tokens = CodeRepeatedValues(runs, tokens, value, prev_value);
   365        prev_value = value;
   366      }
   367      i += runs;
   368      assert(tokens <= ending_token);
   369    }
   370    (void)ending_token;    // suppress 'unused variable' warning
   371    return (int)(tokens - starting_token);
   372  }
   373  
   374  // -----------------------------------------------------------------------------
   375  
   376  // Pre-reversed 4-bit values.
   377  static const uint8_t kReversedBits[16] = {
   378    0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
   379    0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
   380  };
   381  
   382  static uint32_t ReverseBits(int num_bits, uint32_t bits) {
   383    uint32_t retval = 0;
   384    int i = 0;
   385    while (i < num_bits) {
   386      i += 4;
   387      retval |= kReversedBits[bits & 0xf] << (MAX_ALLOWED_CODE_LENGTH + 1 - i);
   388      bits >>= 4;
   389    }
   390    retval >>= (MAX_ALLOWED_CODE_LENGTH + 1 - num_bits);
   391    return retval;
   392  }
   393  
   394  // Get the actual bit values for a tree of bit depths.
   395  static void ConvertBitDepthsToSymbols(HuffmanTreeCode* const tree) {
   396    // 0 bit-depth means that the symbol does not exist.
   397    int i;
   398    int len;
   399    uint32_t next_code[MAX_ALLOWED_CODE_LENGTH + 1];
   400    int depth_count[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 };
   401  
   402    assert(tree != NULL);
   403    len = tree->num_symbols;
   404    for (i = 0; i < len; ++i) {
   405      const int code_length = tree->code_lengths[i];
   406      assert(code_length <= MAX_ALLOWED_CODE_LENGTH);
   407      ++depth_count[code_length];
   408    }
   409    depth_count[0] = 0;  // ignore unused symbol
   410    next_code[0] = 0;
   411    {
   412      uint32_t code = 0;
   413      for (i = 1; i <= MAX_ALLOWED_CODE_LENGTH; ++i) {
   414        code = (code + depth_count[i - 1]) << 1;
   415        next_code[i] = code;
   416      }
   417    }
   418    for (i = 0; i < len; ++i) {
   419      const int code_length = tree->code_lengths[i];
   420      tree->codes[i] = ReverseBits(code_length, next_code[code_length]++);
   421    }
   422  }
   423  
   424  // -----------------------------------------------------------------------------
   425  // Main entry point
   426  
   427  int VP8LCreateHuffmanTree(int* const histogram, int tree_depth_limit,
   428                            HuffmanTreeCode* const tree) {
   429    const int num_symbols = tree->num_symbols;
   430    if (!OptimizeHuffmanForRle(num_symbols, histogram)) {
   431      return 0;
   432    }
   433    if (!GenerateOptimalTree(histogram, num_symbols,
   434                             tree_depth_limit, tree->code_lengths)) {
   435      return 0;
   436    }
   437    // Create the actual bit codes for the bit lengths.
   438    ConvertBitDepthsToSymbols(tree);
   439    return 1;
   440  }