2018-02-26 14:04:36 +00:00
|
|
|
/* 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_
|
|
|
|
|
2021-08-04 12:42:02 +00:00
|
|
|
#include <brotli/shared_dictionary.h>
|
2018-02-26 14:04:36 +00:00
|
|
|
#include <brotli/types.h>
|
2022-11-17 13:03:09 +00:00
|
|
|
|
|
|
|
#include "../common/dictionary.h"
|
|
|
|
#include "../common/platform.h"
|
2021-09-08 07:18:45 +00:00
|
|
|
#include "compound_dictionary.h"
|
|
|
|
#include "memory.h"
|
|
|
|
#include "static_dict_lut.h"
|
2018-02-26 14:04:36 +00:00
|
|
|
|
|
|
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2021-08-04 12:42:02 +00:00
|
|
|
/*
|
|
|
|
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;
|
|
|
|
|
2023-08-18 09:55:01 +00:00
|
|
|
#if defined(BROTLI_EXPERIMENTAL)
|
2021-08-04 12:42:02 +00:00
|
|
|
BROTLI_INTERNAL const BrotliTrieNode* BrotliTrieSub(const BrotliTrie* trie,
|
|
|
|
const BrotliTrieNode* node, uint8_t c);
|
2023-08-18 09:55:01 +00:00
|
|
|
#endif /* BROTLI_EXPERIMENTAL */
|
|
|
|
|
2018-02-26 14:04:36 +00:00
|
|
|
/* Dictionary data (words and transforms) for 1 possible context */
|
|
|
|
typedef struct BrotliEncoderDictionary {
|
|
|
|
const BrotliDictionary* words;
|
2019-04-12 11:57:42 +00:00
|
|
|
uint32_t num_transforms;
|
2018-02-26 14:04:36 +00:00
|
|
|
|
|
|
|
/* cut off for fast encoder */
|
|
|
|
uint32_t cutoffTransformsCount;
|
|
|
|
uint64_t cutoffTransforms;
|
|
|
|
|
|
|
|
/* from dictionary_hash.h, for fast encoder */
|
2019-04-12 11:57:42 +00:00
|
|
|
const uint16_t* hash_table_words;
|
|
|
|
const uint8_t* hash_table_lengths;
|
2018-02-26 14:04:36 +00:00
|
|
|
|
|
|
|
/* from static_dict_lut.h, for slow encoder */
|
|
|
|
const uint16_t* buckets;
|
|
|
|
const DictWord* dict_words;
|
2021-08-04 12:42:02 +00:00
|
|
|
/* 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_;
|
2018-02-26 14:04:36 +00:00
|
|
|
} BrotliEncoderDictionary;
|
|
|
|
|
2021-08-04 12:42:02 +00:00
|
|
|
/* 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;
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2023-08-18 09:55:01 +00:00
|
|
|
#if defined(BROTLI_EXPERIMENTAL)
|
2021-08-04 12:42:02 +00:00
|
|
|
/* 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);
|
2023-08-18 09:55:01 +00:00
|
|
|
#endif /* BROTLI_EXPERIMENTAL */
|
2021-08-04 12:42:02 +00:00
|
|
|
|
|
|
|
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);
|
2018-02-26 14:04:36 +00:00
|
|
|
|
|
|
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
|
|
} /* extern "C" */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* BROTLI_ENC_ENCODER_DICT_H_ */
|