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