LCOV - code coverage report
Current view: top level - modules/brotli/dec - huffman.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 157 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Copyright 2013 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             : /* Utilities for building Huffman decoding tables. */
       8             : 
       9             : #include "./huffman.h"
      10             : 
      11             : #include <string.h>  /* memcpy, memset */
      12             : 
      13             : #include "./port.h"
      14             : #include "./types.h"
      15             : 
      16             : #if defined(__cplusplus) || defined(c_plusplus)
      17             : extern "C" {
      18             : #endif
      19             : 
      20             : #define BROTLI_REVERSE_BITS_MAX 8
      21             : 
      22             : #ifdef BROTLI_RBIT
      23             : #define BROTLI_REVERSE_BITS_BASE (32 - BROTLI_REVERSE_BITS_MAX)
      24             : #else
      25             : #define BROTLI_REVERSE_BITS_BASE 0
      26             : static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
      27             :   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
      28             :   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
      29             :   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
      30             :   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
      31             :   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
      32             :   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
      33             :   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
      34             :   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
      35             :   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
      36             :   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
      37             :   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
      38             :   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
      39             :   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
      40             :   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
      41             :   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
      42             :   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
      43             :   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
      44             :   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
      45             :   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
      46             :   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
      47             :   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
      48             :   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
      49             :   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
      50             :   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
      51             :   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
      52             :   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
      53             :   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
      54             :   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
      55             :   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
      56             :   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
      57             :   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
      58             :   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
      59             : };
      60             : #endif  /* BROTLI_RBIT */
      61             : 
      62             : #define BROTLI_REVERSE_BITS_LOWEST \
      63             :   (1U << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
      64             : 
      65             : /* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
      66             :    where reverse(value, len) is the bit-wise reversal of the len least
      67             :    significant bits of value. */
      68             : static BROTLI_INLINE uint32_t BrotliReverseBits(uint32_t num) {
      69             : #ifdef BROTLI_RBIT
      70             :   return BROTLI_RBIT(num);
      71             : #else
      72           0 :   return kReverseBits[num];
      73             : #endif
      74             : }
      75             : 
      76             : /* Stores code in table[0], table[step], table[2*step], ..., table[end] */
      77             : /* Assumes that end is an integer multiple of step */
      78             : static BROTLI_INLINE void ReplicateValue(HuffmanCode* table,
      79             :                                          int step, int end,
      80             :                                          HuffmanCode code) {
      81             :   do {
      82           0 :     end -= step;
      83           0 :     table[end] = code;
      84           0 :   } while (end > 0);
      85             : }
      86             : 
      87             : /* Returns the table width of the next 2nd level table. count is the histogram
      88             :    of bit lengths for the remaining symbols, len is the code length of the next
      89             :    processed symbol */
      90             : static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
      91             :                                           int len, int root_bits) {
      92           0 :   int left = 1 << (len - root_bits);
      93           0 :   while (len < BROTLI_HUFFMAN_MAX_CODE_LENGTH) {
      94           0 :     left -= count[len];
      95           0 :     if (left <= 0) break;
      96           0 :     ++len;
      97           0 :     left <<= 1;
      98             :   }
      99           0 :   return len - root_bits;
     100             : }
     101             : 
     102           0 : void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
     103             :                                         const uint8_t* const code_lengths,
     104             :                                         uint16_t* count) {
     105             :   HuffmanCode code;   /* current table entry */
     106             :   int symbol;         /* symbol index in original or sorted table */
     107             :   uint32_t key;       /* prefix code */
     108             :   uint32_t key_step;  /* prefix code addend */
     109             :   int step;           /* step size to replicate values in current table */
     110             :   int table_size;     /* size of current table */
     111             :   int sorted[18];     /* symbols sorted by code length */
     112             :   /* offsets in sorted table for each length */
     113             :   int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
     114             :   int bits;
     115             :   int bits_count;
     116             :   BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
     117             :                 BROTLI_REVERSE_BITS_MAX);
     118             : 
     119             :   /* generate offsets into sorted symbol table by code length */
     120           0 :   symbol = -1;
     121           0 :   bits = 1;
     122           0 :   BROTLI_REPEAT(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH, {
     123             :     symbol += count[bits];
     124             :     offset[bits] = symbol;
     125             :     bits++;
     126             :   });
     127             :   /* Symbols with code length 0 are placed after all other symbols. */
     128           0 :   offset[0] = 17;
     129             : 
     130             :   /* sort symbols by length, by symbol order within each length */
     131           0 :   symbol = 18;
     132             :   do {
     133           0 :     BROTLI_REPEAT(6, {
     134             :       symbol--;
     135             :       sorted[offset[code_lengths[symbol]]--] = symbol;
     136             :     });
     137           0 :   } while (symbol != 0);
     138             : 
     139           0 :   table_size = 1 << BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH;
     140             : 
     141             :   /* Special case: all symbols but one have 0 code length. */
     142           0 :   if (offset[0] == 0) {
     143           0 :     code.bits = 0;
     144           0 :     code.value = (uint16_t)sorted[0];
     145           0 :     for (key = 0; key < (uint32_t)table_size; ++key) {
     146           0 :       table[key] = code;
     147             :     }
     148           0 :     return;
     149             :   }
     150             : 
     151             :   /* fill in table */
     152           0 :   key = 0;
     153           0 :   key_step = BROTLI_REVERSE_BITS_LOWEST;
     154           0 :   symbol = 0;
     155           0 :   bits = 1;
     156           0 :   step = 2;
     157             :   do {
     158           0 :     code.bits = (uint8_t)bits;
     159           0 :     for (bits_count = count[bits]; bits_count != 0; --bits_count) {
     160           0 :       code.value = (uint16_t)sorted[symbol++];
     161           0 :       ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
     162           0 :       key += key_step;
     163             :     }
     164           0 :     step <<= 1;
     165           0 :     key_step >>= 1;
     166           0 :   } while (++bits <= BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
     167             : }
     168             : 
     169           0 : uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
     170             :                                  int root_bits,
     171             :                                  const uint16_t* const symbol_lists,
     172             :                                  uint16_t* count) {
     173             :   HuffmanCode code;       /* current table entry */
     174             :   HuffmanCode* table;     /* next available space in table */
     175             :   int len;                /* current code length */
     176             :   int symbol;             /* symbol index in original or sorted table */
     177             :   uint32_t key;           /* prefix code */
     178             :   uint32_t key_step;      /* prefix code addend */
     179             :   uint32_t sub_key;       /* 2nd level table prefix code */
     180             :   uint32_t sub_key_step;  /* 2nd level table prefix code addend */
     181             :   int step;               /* step size to replicate values in current table */
     182             :   int table_bits;         /* key length of current table */
     183             :   int table_size;         /* size of current table */
     184             :   int total_size;         /* sum of root table size and 2nd level table sizes */
     185           0 :   int max_length = -1;
     186             :   int bits;
     187             :   int bits_count;
     188             : 
     189             :   BROTLI_DCHECK(root_bits <= BROTLI_REVERSE_BITS_MAX);
     190             :   BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH - root_bits <=
     191             :                 BROTLI_REVERSE_BITS_MAX);
     192             : 
     193           0 :   while (symbol_lists[max_length] == 0xFFFF) max_length--;
     194           0 :   max_length += BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1;
     195             : 
     196           0 :   table = root_table;
     197           0 :   table_bits = root_bits;
     198           0 :   table_size = 1 << table_bits;
     199           0 :   total_size = table_size;
     200             : 
     201             :   /* fill in root table */
     202             :   /* let's reduce the table size to a smaller size if possible, and */
     203             :   /* create the repetitions by memcpy if possible in the coming loop */
     204           0 :   if (table_bits > max_length) {
     205           0 :     table_bits = max_length;
     206           0 :     table_size = 1 << table_bits;
     207             :   }
     208           0 :   key = 0;
     209           0 :   key_step = BROTLI_REVERSE_BITS_LOWEST;
     210           0 :   bits = 1;
     211           0 :   step = 2;
     212             :   do {
     213           0 :     code.bits = (uint8_t)bits;
     214           0 :     symbol = bits - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
     215           0 :     for (bits_count = count[bits]; bits_count != 0; --bits_count) {
     216           0 :       symbol = symbol_lists[symbol];
     217           0 :       code.value = (uint16_t)symbol;
     218           0 :       ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
     219           0 :       key += key_step;
     220             :     }
     221           0 :     step <<= 1;
     222           0 :     key_step >>= 1;
     223           0 :   } while (++bits <= table_bits);
     224             : 
     225             :   /* if root_bits != table_bits we only created one fraction of the */
     226             :   /* table, and we need to replicate it now. */
     227           0 :   while (total_size != table_size) {
     228           0 :     memcpy(&table[table_size], &table[0],
     229           0 :            (size_t)table_size * sizeof(table[0]));
     230           0 :     table_size <<= 1;
     231             :   }
     232             : 
     233             :   /* fill in 2nd level tables and add pointers to root table */
     234           0 :   key_step = BROTLI_REVERSE_BITS_LOWEST >> (root_bits - 1);
     235           0 :   sub_key = (BROTLI_REVERSE_BITS_LOWEST << 1);
     236           0 :   sub_key_step = BROTLI_REVERSE_BITS_LOWEST;
     237           0 :   for (len = root_bits + 1, step = 2; len <= max_length; ++len) {
     238           0 :     symbol = len - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
     239           0 :     for (; count[len] != 0; --count[len]) {
     240           0 :       if (sub_key == (BROTLI_REVERSE_BITS_LOWEST << 1U)) {
     241           0 :         table += table_size;
     242           0 :         table_bits = NextTableBitSize(count, len, root_bits);
     243           0 :         table_size = 1 << table_bits;
     244           0 :         total_size += table_size;
     245           0 :         sub_key = BrotliReverseBits(key);
     246           0 :         key += key_step;
     247           0 :         root_table[sub_key].bits = (uint8_t)(table_bits + root_bits);
     248           0 :         root_table[sub_key].value =
     249           0 :             (uint16_t)(((size_t)(table - root_table)) - sub_key);
     250           0 :         sub_key = 0;
     251             :       }
     252           0 :       code.bits = (uint8_t)(len - root_bits);
     253           0 :       symbol = symbol_lists[symbol];
     254           0 :       code.value = (uint16_t)symbol;
     255           0 :       ReplicateValue(
     256           0 :           &table[BrotliReverseBits(sub_key)], step, table_size, code);
     257           0 :       sub_key += sub_key_step;
     258             :     }
     259           0 :     step <<= 1;
     260           0 :     sub_key_step >>= 1;
     261             :   }
     262           0 :   return (uint32_t)total_size;
     263             : }
     264             : 
     265           0 : uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
     266             :                                        int root_bits,
     267             :                                        uint16_t* val,
     268             :                                        uint32_t num_symbols) {
     269           0 :   uint32_t table_size = 1;
     270           0 :   const uint32_t goal_size = 1U << root_bits;
     271           0 :   switch (num_symbols) {
     272             :     case 0:
     273           0 :       table[0].bits = 0;
     274           0 :       table[0].value = val[0];
     275           0 :       break;
     276             :     case 1:
     277           0 :       table[0].bits = 1;
     278           0 :       table[1].bits = 1;
     279           0 :       if (val[1] > val[0]) {
     280           0 :         table[0].value = val[0];
     281           0 :         table[1].value = val[1];
     282             :       } else {
     283           0 :         table[0].value = val[1];
     284           0 :         table[1].value = val[0];
     285             :       }
     286           0 :       table_size = 2;
     287           0 :       break;
     288             :     case 2:
     289           0 :       table[0].bits = 1;
     290           0 :       table[0].value = val[0];
     291           0 :       table[2].bits = 1;
     292           0 :       table[2].value = val[0];
     293           0 :       if (val[2] > val[1]) {
     294           0 :         table[1].value = val[1];
     295           0 :         table[3].value = val[2];
     296             :       } else {
     297           0 :         table[1].value = val[2];
     298           0 :         table[3].value = val[1];
     299             :       }
     300           0 :       table[1].bits = 2;
     301           0 :       table[3].bits = 2;
     302           0 :       table_size = 4;
     303           0 :       break;
     304             :     case 3: {
     305             :       int i, k;
     306           0 :       for (i = 0; i < 3; ++i) {
     307           0 :         for (k = i + 1; k < 4; ++k) {
     308           0 :           if (val[k] < val[i]) {
     309           0 :             uint16_t t = val[k];
     310           0 :             val[k] = val[i];
     311           0 :             val[i] = t;
     312             :           }
     313             :         }
     314             :       }
     315           0 :       for (i = 0; i < 4; ++i) {
     316           0 :         table[i].bits = 2;
     317             :       }
     318           0 :       table[0].value = val[0];
     319           0 :       table[2].value = val[1];
     320           0 :       table[1].value = val[2];
     321           0 :       table[3].value = val[3];
     322           0 :       table_size = 4;
     323           0 :       break;
     324             :     }
     325             :     case 4: {
     326             :       int i;
     327           0 :       if (val[3] < val[2]) {
     328           0 :         uint16_t t = val[3];
     329           0 :         val[3] = val[2];
     330           0 :         val[2] = t;
     331             :       }
     332           0 :       for (i = 0; i < 7; ++i) {
     333           0 :         table[i].value = val[0];
     334           0 :         table[i].bits = (uint8_t)(1 + (i & 1));
     335             :       }
     336           0 :       table[1].value = val[1];
     337           0 :       table[3].value = val[2];
     338           0 :       table[5].value = val[1];
     339           0 :       table[7].value = val[3];
     340           0 :       table[3].bits = 3;
     341           0 :       table[7].bits = 3;
     342           0 :       table_size = 8;
     343           0 :       break;
     344             :     }
     345             :   }
     346           0 :   while (table_size != goal_size) {
     347           0 :     memcpy(&table[table_size], &table[0],
     348           0 :            (size_t)table_size * sizeof(table[0]));
     349           0 :     table_size <<= 1;
     350             :   }
     351           0 :   return goal_size;
     352             : }
     353             : 
     354             : #if defined(__cplusplus) || defined(c_plusplus)
     355             : }  /* extern "C" */
     356             : #endif

Generated by: LCOV version 1.13