| /* Copyright 2017 Google Inc. All Rights Reserved. |
| |
| Distributed under MIT license. |
| See file LICENSE for detail or copy at https://opensource.org/licenses/MIT |
| */ |
| |
| #ifndef BROTLI_ENC_ENCODER_DICT_H_ |
| #define BROTLI_ENC_ENCODER_DICT_H_ |
| |
| #include "../common/dictionary.h" |
| #include "../common/platform.h" |
| #include <brotli/shared_dictionary.h> |
| #include <brotli/types.h> |
| #include "compound_dictionary.h" |
| #include "memory.h" |
| #include "static_dict_lut.h" |
| |
| #if defined(__cplusplus) || defined(c_plusplus) |
| extern "C" { |
| #endif |
| |
| /* |
| Dictionary hierarchy for Encoder: |
| -SharedEncoderDictionary |
| --CompoundDictionary |
| ---PreparedDictionary [up to 15x] |
| = prefix dictionary with precomputed hashes |
| --ContextualEncoderDictionary |
| ---BrotliEncoderDictionary [up to 64x] |
| = for each context, precomputed static dictionary with words + transforms |
| |
| Dictionary hiearchy from common: similar, but without precomputed hashes |
| -BrotliSharedDictionary |
| --BrotliDictionary [up to 64x] |
| --BrotliTransforms [up to 64x] |
| --const uint8_t* prefix [up to 15x]: compound dictionaries |
| */ |
| |
| typedef struct BrotliTrieNode { |
| uint8_t single; /* if 1, sub is a single node for c instead of 256 */ |
| uint8_t c; |
| uint8_t len_; /* untransformed length */ |
| uint32_t idx_; /* word index + num words * transform index */ |
| uint32_t sub; /* index of sub node(s) in the pool */ |
| } BrotliTrieNode; |
| |
| typedef struct BrotliTrie { |
| BrotliTrieNode* pool; |
| size_t pool_capacity; |
| size_t pool_size; |
| BrotliTrieNode root; |
| } BrotliTrie; |
| |
| BROTLI_INTERNAL const BrotliTrieNode* BrotliTrieSub(const BrotliTrie* trie, |
| const BrotliTrieNode* node, uint8_t c); |
| /* Dictionary data (words and transforms) for 1 possible context */ |
| typedef struct BrotliEncoderDictionary { |
| const BrotliDictionary* words; |
| uint32_t num_transforms; |
| |
| /* cut off for fast encoder */ |
| uint32_t cutoffTransformsCount; |
| uint64_t cutoffTransforms; |
| |
| /* from dictionary_hash.h, for fast encoder */ |
| const uint16_t* hash_table_words; |
| const uint8_t* hash_table_lengths; |
| |
| /* from static_dict_lut.h, for slow encoder */ |
| const uint16_t* buckets; |
| const DictWord* dict_words; |
| /* Heavy version, for use by slow encoder when there are custom transforms. |
| Contains every possible transformed dictionary word in a trie. It encodes |
| about as fast as the non-heavy encoder but consumes a lot of memory and |
| takes time to build. */ |
| BrotliTrie trie; |
| BROTLI_BOOL has_words_heavy; |
| |
| /* Reference to other dictionaries. */ |
| const struct ContextualEncoderDictionary* parent; |
| |
| /* Allocated memory, used only when not using the Brotli defaults */ |
| uint16_t* hash_table_data_words_; |
| uint8_t* hash_table_data_lengths_; |
| size_t buckets_alloc_size_; |
| uint16_t* buckets_data_; |
| size_t dict_words_alloc_size_; |
| DictWord* dict_words_data_; |
| BrotliDictionary* words_instance_; |
| } BrotliEncoderDictionary; |
| |
| /* Dictionary data for all 64 contexts */ |
| typedef struct ContextualEncoderDictionary { |
| BROTLI_BOOL context_based; |
| uint8_t num_dictionaries; |
| uint8_t context_map[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; |
| const BrotliEncoderDictionary* dict[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS]; |
| |
| /* If num_instances_ is 1, instance_ is used, else dynamic allocation with |
| instances_ is used. */ |
| size_t num_instances_; |
| BrotliEncoderDictionary instance_; |
| BrotliEncoderDictionary* instances_; |
| } ContextualEncoderDictionary; |
| |
| static const uint32_t kSharedDictionaryMagic = 0xDEBCEDE1; |
| static const uint32_t kManagedDictionaryMagic = 0xDEBCEDE2; |
| |
| typedef struct SharedEncoderDictionary { |
| /* Magic value to distinguish this struct from PreparedDictionary for |
| certain external usages. */ |
| uint32_t magic; |
| |
| /* LZ77 prefix, compound dictionary */ |
| CompoundDictionary compound; |
| |
| /* Custom static dictionary (optionally context-based) */ |
| ContextualEncoderDictionary contextual; |
| |
| /* The maximum quality the dictionary was computed for */ |
| int max_quality; |
| } SharedEncoderDictionary; |
| |
| typedef struct ManagedDictionary { |
| uint32_t magic; |
| MemoryManager memory_manager_; |
| uint32_t* dictionary; |
| } ManagedDictionary; |
| |
| /* Initializes to the brotli built-in dictionary */ |
| BROTLI_INTERNAL void BrotliInitSharedEncoderDictionary( |
| SharedEncoderDictionary* dict); |
| |
| /* Initializes to shared dictionary that will be parsed from |
| encoded_dict. Requires that you keep the encoded_dict buffer |
| around, parts of data will point to it. */ |
| BROTLI_INTERNAL BROTLI_BOOL BrotliInitCustomSharedEncoderDictionary( |
| MemoryManager* m, const uint8_t* encoded_dict, size_t size, |
| int quality, SharedEncoderDictionary* dict); |
| |
| BROTLI_INTERNAL void BrotliCleanupSharedEncoderDictionary( |
| MemoryManager* m, SharedEncoderDictionary* dict); |
| |
| BROTLI_INTERNAL ManagedDictionary* BrotliCreateManagedDictionary( |
| brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque); |
| |
| BROTLI_INTERNAL void BrotliDestroyManagedDictionary( |
| ManagedDictionary* dictionary); |
| |
| #if defined(__cplusplus) || defined(c_plusplus) |
| } /* extern "C" */ |
| #endif |
| |
| #endif /* BROTLI_ENC_ENCODER_DICT_H_ */ |