126fa459cSmrg/* Copyright 2013 Google Inc. All Rights Reserved.
226fa459cSmrg
326fa459cSmrg   Distributed under MIT license.
426fa459cSmrg   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
526fa459cSmrg*/
626fa459cSmrg
726fa459cSmrg/* Utilities for building Huffman decoding tables. */
826fa459cSmrg
926fa459cSmrg#include "./huffman.h"
1026fa459cSmrg
1126fa459cSmrg#include <string.h>  /* memcpy, memset */
1226fa459cSmrg
1326fa459cSmrg#include "../common/constants.h"
1426fa459cSmrg#include "../common/platform.h"
1526fa459cSmrg#include <brotli/types.h>
1626fa459cSmrg
1726fa459cSmrg#if defined(__cplusplus) || defined(c_plusplus)
1826fa459cSmrgextern "C" {
1926fa459cSmrg#endif
2026fa459cSmrg
2126fa459cSmrg#define BROTLI_REVERSE_BITS_MAX 8
2226fa459cSmrg
2326fa459cSmrg#if defined(BROTLI_RBIT)
2426fa459cSmrg#define BROTLI_REVERSE_BITS_BASE \
2526fa459cSmrg  ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX)
2626fa459cSmrg#else
2726fa459cSmrg#define BROTLI_REVERSE_BITS_BASE 0
2826fa459cSmrgstatic uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
2926fa459cSmrg  0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
3026fa459cSmrg  0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
3126fa459cSmrg  0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
3226fa459cSmrg  0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
3326fa459cSmrg  0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
3426fa459cSmrg  0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
3526fa459cSmrg  0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
3626fa459cSmrg  0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
3726fa459cSmrg  0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
3826fa459cSmrg  0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
3926fa459cSmrg  0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
4026fa459cSmrg  0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
4126fa459cSmrg  0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
4226fa459cSmrg  0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
4326fa459cSmrg  0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
4426fa459cSmrg  0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
4526fa459cSmrg  0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
4626fa459cSmrg  0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
4726fa459cSmrg  0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
4826fa459cSmrg  0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
4926fa459cSmrg  0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
5026fa459cSmrg  0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
5126fa459cSmrg  0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
5226fa459cSmrg  0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
5326fa459cSmrg  0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
5426fa459cSmrg  0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
5526fa459cSmrg  0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
5626fa459cSmrg  0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
5726fa459cSmrg  0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
5826fa459cSmrg  0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
5926fa459cSmrg  0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
6026fa459cSmrg  0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
6126fa459cSmrg};
6226fa459cSmrg#endif  /* BROTLI_RBIT */
6326fa459cSmrg
6426fa459cSmrg#define BROTLI_REVERSE_BITS_LOWEST \
6526fa459cSmrg  ((brotli_reg_t)1 << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
6626fa459cSmrg
6726fa459cSmrg/* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
6826fa459cSmrg   where reverse(value, len) is the bit-wise reversal of the len least
6926fa459cSmrg   significant bits of value. */
7026fa459cSmrgstatic BROTLI_INLINE brotli_reg_t BrotliReverseBits(brotli_reg_t num) {
7126fa459cSmrg#if defined(BROTLI_RBIT)
7226fa459cSmrg  return BROTLI_RBIT(num);
7326fa459cSmrg#else
7426fa459cSmrg  return kReverseBits[num];
7526fa459cSmrg#endif
7626fa459cSmrg}
7726fa459cSmrg
7826fa459cSmrg/* Stores code in table[0], table[step], table[2*step], ..., table[end] */
7926fa459cSmrg/* Assumes that end is an integer multiple of step */
8026fa459cSmrgstatic BROTLI_INLINE void ReplicateValue(HuffmanCode* table,
8126fa459cSmrg                                         int step, int end,
8226fa459cSmrg                                         HuffmanCode code) {
8326fa459cSmrg  do {
8426fa459cSmrg    end -= step;
8526fa459cSmrg    table[end] = code;
8626fa459cSmrg  } while (end > 0);
8726fa459cSmrg}
8826fa459cSmrg
8926fa459cSmrg/* Returns the table width of the next 2nd level table. |count| is the histogram
9026fa459cSmrg   of bit lengths for the remaining symbols, |len| is the code length of the
9126fa459cSmrg   next processed symbol. */
9226fa459cSmrgstatic BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
9326fa459cSmrg                                          int len, int root_bits) {
9426fa459cSmrg  int left = 1 << (len - root_bits);
9526fa459cSmrg  while (len < BROTLI_HUFFMAN_MAX_CODE_LENGTH) {
9626fa459cSmrg    left -= count[len];
9726fa459cSmrg    if (left <= 0) break;
9826fa459cSmrg    ++len;
9926fa459cSmrg    left <<= 1;
10026fa459cSmrg  }
10126fa459cSmrg  return len - root_bits;
10226fa459cSmrg}
10326fa459cSmrg
10426fa459cSmrgvoid BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
10526fa459cSmrg                                        const uint8_t* const code_lengths,
10626fa459cSmrg                                        uint16_t* count) {
10726fa459cSmrg  HuffmanCode code;       /* current table entry */
10826fa459cSmrg  int symbol;             /* symbol index in original or sorted table */
10926fa459cSmrg  brotli_reg_t key;       /* prefix code */
11026fa459cSmrg  brotli_reg_t key_step;  /* prefix code addend */
11126fa459cSmrg  int step;               /* step size to replicate values in current table */
11226fa459cSmrg  int table_size;         /* size of current table */
11326fa459cSmrg  int sorted[BROTLI_CODE_LENGTH_CODES];  /* symbols sorted by code length */
11426fa459cSmrg  /* offsets in sorted table for each length */
11526fa459cSmrg  int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
11626fa459cSmrg  int bits;
11726fa459cSmrg  int bits_count;
11826fa459cSmrg  BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
11926fa459cSmrg                BROTLI_REVERSE_BITS_MAX);
12026fa459cSmrg
12126fa459cSmrg  /* Generate offsets into sorted symbol table by code length. */
12226fa459cSmrg  symbol = -1;
12326fa459cSmrg  bits = 1;
12426fa459cSmrg  BROTLI_REPEAT(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH, {
12526fa459cSmrg    symbol += count[bits];
12626fa459cSmrg    offset[bits] = symbol;
12726fa459cSmrg    bits++;
12826fa459cSmrg  });
12926fa459cSmrg  /* Symbols with code length 0 are placed after all other symbols. */
13026fa459cSmrg  offset[0] = BROTLI_CODE_LENGTH_CODES - 1;
13126fa459cSmrg
13226fa459cSmrg  /* Sort symbols by length, by symbol order within each length. */
13326fa459cSmrg  symbol = BROTLI_CODE_LENGTH_CODES;
13426fa459cSmrg  do {
13526fa459cSmrg    BROTLI_REPEAT(6, {
13626fa459cSmrg      symbol--;
13726fa459cSmrg      sorted[offset[code_lengths[symbol]]--] = symbol;
13826fa459cSmrg    });
13926fa459cSmrg  } while (symbol != 0);
14026fa459cSmrg
14126fa459cSmrg  table_size = 1 << BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH;
14226fa459cSmrg
14326fa459cSmrg  /* Special case: all symbols but one have 0 code length. */
14426fa459cSmrg  if (offset[0] == 0) {
14526fa459cSmrg    code = ConstructHuffmanCode(0, (uint16_t)sorted[0]);
14626fa459cSmrg    for (key = 0; key < (brotli_reg_t)table_size; ++key) {
14726fa459cSmrg      table[key] = code;
14826fa459cSmrg    }
14926fa459cSmrg    return;
15026fa459cSmrg  }
15126fa459cSmrg
15226fa459cSmrg  /* Fill in table. */
15326fa459cSmrg  key = 0;
15426fa459cSmrg  key_step = BROTLI_REVERSE_BITS_LOWEST;
15526fa459cSmrg  symbol = 0;
15626fa459cSmrg  bits = 1;
15726fa459cSmrg  step = 2;
15826fa459cSmrg  do {
15926fa459cSmrg    for (bits_count = count[bits]; bits_count != 0; --bits_count) {
16026fa459cSmrg      code = ConstructHuffmanCode((uint8_t)bits, (uint16_t)sorted[symbol++]);
16126fa459cSmrg      ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
16226fa459cSmrg      key += key_step;
16326fa459cSmrg    }
16426fa459cSmrg    step <<= 1;
16526fa459cSmrg    key_step >>= 1;
16626fa459cSmrg  } while (++bits <= BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
16726fa459cSmrg}
16826fa459cSmrg
16926fa459cSmrguint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
17026fa459cSmrg                                 int root_bits,
17126fa459cSmrg                                 const uint16_t* const symbol_lists,
17226fa459cSmrg                                 uint16_t* count) {
17326fa459cSmrg  HuffmanCode code;       /* current table entry */
17426fa459cSmrg  HuffmanCode* table;     /* next available space in table */
17526fa459cSmrg  int len;                /* current code length */
17626fa459cSmrg  int symbol;             /* symbol index in original or sorted table */
17726fa459cSmrg  brotli_reg_t key;       /* prefix code */
17826fa459cSmrg  brotli_reg_t key_step;  /* prefix code addend */
17926fa459cSmrg  brotli_reg_t sub_key;   /* 2nd level table prefix code */
18026fa459cSmrg  brotli_reg_t sub_key_step;  /* 2nd level table prefix code addend */
18126fa459cSmrg  int step;               /* step size to replicate values in current table */
18226fa459cSmrg  int table_bits;         /* key length of current table */
18326fa459cSmrg  int table_size;         /* size of current table */
18426fa459cSmrg  int total_size;         /* sum of root table size and 2nd level table sizes */
18526fa459cSmrg  int max_length = -1;
18626fa459cSmrg  int bits;
18726fa459cSmrg  int bits_count;
18826fa459cSmrg
18926fa459cSmrg  BROTLI_DCHECK(root_bits <= BROTLI_REVERSE_BITS_MAX);
19026fa459cSmrg  BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH - root_bits <=
19126fa459cSmrg                BROTLI_REVERSE_BITS_MAX);
19226fa459cSmrg
19326fa459cSmrg  while (symbol_lists[max_length] == 0xFFFF) max_length--;
19426fa459cSmrg  max_length += BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1;
19526fa459cSmrg
19626fa459cSmrg  table = root_table;
19726fa459cSmrg  table_bits = root_bits;
19826fa459cSmrg  table_size = 1 << table_bits;
19926fa459cSmrg  total_size = table_size;
20026fa459cSmrg
20126fa459cSmrg  /* Fill in the root table. Reduce the table size to if possible,
20226fa459cSmrg     and create the repetitions by memcpy. */
20326fa459cSmrg  if (table_bits > max_length) {
20426fa459cSmrg    table_bits = max_length;
20526fa459cSmrg    table_size = 1 << table_bits;
20626fa459cSmrg  }
20726fa459cSmrg  key = 0;
20826fa459cSmrg  key_step = BROTLI_REVERSE_BITS_LOWEST;
20926fa459cSmrg  bits = 1;
21026fa459cSmrg  step = 2;
21126fa459cSmrg  do {
21226fa459cSmrg    symbol = bits - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
21326fa459cSmrg    for (bits_count = count[bits]; bits_count != 0; --bits_count) {
21426fa459cSmrg      symbol = symbol_lists[symbol];
21526fa459cSmrg      code = ConstructHuffmanCode((uint8_t)bits, (uint16_t)symbol);
21626fa459cSmrg      ReplicateValue(&table[BrotliReverseBits(key)], step, table_size, code);
21726fa459cSmrg      key += key_step;
21826fa459cSmrg    }
21926fa459cSmrg    step <<= 1;
22026fa459cSmrg    key_step >>= 1;
22126fa459cSmrg  } while (++bits <= table_bits);
22226fa459cSmrg
22326fa459cSmrg  /* If root_bits != table_bits then replicate to fill the remaining slots. */
22426fa459cSmrg  while (total_size != table_size) {
22526fa459cSmrg    memcpy(&table[table_size], &table[0],
22626fa459cSmrg           (size_t)table_size * sizeof(table[0]));
22726fa459cSmrg    table_size <<= 1;
22826fa459cSmrg  }
22926fa459cSmrg
23026fa459cSmrg  /* Fill in 2nd level tables and add pointers to root table. */
23126fa459cSmrg  key_step = BROTLI_REVERSE_BITS_LOWEST >> (root_bits - 1);
23226fa459cSmrg  sub_key = (BROTLI_REVERSE_BITS_LOWEST << 1);
23326fa459cSmrg  sub_key_step = BROTLI_REVERSE_BITS_LOWEST;
23426fa459cSmrg  for (len = root_bits + 1, step = 2; len <= max_length; ++len) {
23526fa459cSmrg    symbol = len - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
23626fa459cSmrg    for (; count[len] != 0; --count[len]) {
23726fa459cSmrg      if (sub_key == (BROTLI_REVERSE_BITS_LOWEST << 1U)) {
23826fa459cSmrg        table += table_size;
23926fa459cSmrg        table_bits = NextTableBitSize(count, len, root_bits);
24026fa459cSmrg        table_size = 1 << table_bits;
24126fa459cSmrg        total_size += table_size;
24226fa459cSmrg        sub_key = BrotliReverseBits(key);
24326fa459cSmrg        key += key_step;
24426fa459cSmrg        root_table[sub_key] = ConstructHuffmanCode(
24526fa459cSmrg            (uint8_t)(table_bits + root_bits),
24626fa459cSmrg            (uint16_t)(((size_t)(table - root_table)) - sub_key));
24726fa459cSmrg        sub_key = 0;
24826fa459cSmrg      }
24926fa459cSmrg      symbol = symbol_lists[symbol];
25026fa459cSmrg      code = ConstructHuffmanCode((uint8_t)(len - root_bits), (uint16_t)symbol);
25126fa459cSmrg      ReplicateValue(
25226fa459cSmrg          &table[BrotliReverseBits(sub_key)], step, table_size, code);
25326fa459cSmrg      sub_key += sub_key_step;
25426fa459cSmrg    }
25526fa459cSmrg    step <<= 1;
25626fa459cSmrg    sub_key_step >>= 1;
25726fa459cSmrg  }
25826fa459cSmrg  return (uint32_t)total_size;
25926fa459cSmrg}
26026fa459cSmrg
26126fa459cSmrguint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
26226fa459cSmrg                                       int root_bits,
26326fa459cSmrg                                       uint16_t* val,
26426fa459cSmrg                                       uint32_t num_symbols) {
26526fa459cSmrg  uint32_t table_size = 1;
26626fa459cSmrg  const uint32_t goal_size = 1U << root_bits;
26726fa459cSmrg  switch (num_symbols) {
26826fa459cSmrg    case 0:
26926fa459cSmrg      table[0] = ConstructHuffmanCode(0, val[0]);
27026fa459cSmrg      break;
27126fa459cSmrg    case 1:
27226fa459cSmrg      if (val[1] > val[0]) {
27326fa459cSmrg        table[0] = ConstructHuffmanCode(1, val[0]);
27426fa459cSmrg        table[1] = ConstructHuffmanCode(1, val[1]);
27526fa459cSmrg      } else {
27626fa459cSmrg        table[0] = ConstructHuffmanCode(1, val[1]);
27726fa459cSmrg        table[1] = ConstructHuffmanCode(1, val[0]);
27826fa459cSmrg      }
27926fa459cSmrg      table_size = 2;
28026fa459cSmrg      break;
28126fa459cSmrg    case 2:
28226fa459cSmrg      table[0] = ConstructHuffmanCode(1, val[0]);
28326fa459cSmrg      table[2] = ConstructHuffmanCode(1, val[0]);
28426fa459cSmrg      if (val[2] > val[1]) {
28526fa459cSmrg        table[1] = ConstructHuffmanCode(2, val[1]);
28626fa459cSmrg        table[3] = ConstructHuffmanCode(2, val[2]);
28726fa459cSmrg      } else {
28826fa459cSmrg        table[1] = ConstructHuffmanCode(2, val[2]);
28926fa459cSmrg        table[3] = ConstructHuffmanCode(2, val[1]);
29026fa459cSmrg      }
29126fa459cSmrg      table_size = 4;
29226fa459cSmrg      break;
29326fa459cSmrg    case 3: {
29426fa459cSmrg      int i, k;
29526fa459cSmrg      for (i = 0; i < 3; ++i) {
29626fa459cSmrg        for (k = i + 1; k < 4; ++k) {
29726fa459cSmrg          if (val[k] < val[i]) {
29826fa459cSmrg            uint16_t t = val[k];
29926fa459cSmrg            val[k] = val[i];
30026fa459cSmrg            val[i] = t;
30126fa459cSmrg          }
30226fa459cSmrg        }
30326fa459cSmrg      }
30426fa459cSmrg      table[0] = ConstructHuffmanCode(2, val[0]);
30526fa459cSmrg      table[2] = ConstructHuffmanCode(2, val[1]);
30626fa459cSmrg      table[1] = ConstructHuffmanCode(2, val[2]);
30726fa459cSmrg      table[3] = ConstructHuffmanCode(2, val[3]);
30826fa459cSmrg      table_size = 4;
30926fa459cSmrg      break;
31026fa459cSmrg    }
31126fa459cSmrg    case 4: {
31226fa459cSmrg      if (val[3] < val[2]) {
31326fa459cSmrg        uint16_t t = val[3];
31426fa459cSmrg        val[3] = val[2];
31526fa459cSmrg        val[2] = t;
31626fa459cSmrg      }
31726fa459cSmrg      table[0] = ConstructHuffmanCode(1, val[0]);
31826fa459cSmrg      table[1] = ConstructHuffmanCode(2, val[1]);
31926fa459cSmrg      table[2] = ConstructHuffmanCode(1, val[0]);
32026fa459cSmrg      table[3] = ConstructHuffmanCode(3, val[2]);
32126fa459cSmrg      table[4] = ConstructHuffmanCode(1, val[0]);
32226fa459cSmrg      table[5] = ConstructHuffmanCode(2, val[1]);
32326fa459cSmrg      table[6] = ConstructHuffmanCode(1, val[0]);
32426fa459cSmrg      table[7] = ConstructHuffmanCode(3, val[3]);
32526fa459cSmrg      table_size = 8;
32626fa459cSmrg      break;
32726fa459cSmrg    }
32826fa459cSmrg  }
32926fa459cSmrg  while (table_size != goal_size) {
33026fa459cSmrg    memcpy(&table[table_size], &table[0],
33126fa459cSmrg           (size_t)table_size * sizeof(table[0]));
33226fa459cSmrg    table_size <<= 1;
33326fa459cSmrg  }
33426fa459cSmrg  return goal_size;
33526fa459cSmrg}
33626fa459cSmrg
33726fa459cSmrg#if defined(__cplusplus) || defined(c_plusplus)
33826fa459cSmrg}  /* extern "C" */
33926fa459cSmrg#endif
340