aboutsummaryrefslogtreecommitdiff
path: root/c/enc/metablock.h
diff options
context:
space:
mode:
authorEugene Kliuchnikov <eustas@google.com>2017-04-23 14:07:08 +0200
committerGitHub <noreply@github.com>2017-04-23 14:07:08 +0200
commit6ece1d8791a887c1b3fd500435be97d42921cee7 (patch)
treecc5504ff795d2d28efaccc8e30d4c72e0acd1eab /c/enc/metablock.h
parent04de756ad2b0a8f58987d415ef520467e3440f20 (diff)
downloadbrotli-6ece1d8791a887c1b3fd500435be97d42921cee7.tar.gz
Move files & update paths (#541)
* Move files & update paths * Rename build to scripts. * Fix paths * Fix script.
Diffstat (limited to 'c/enc/metablock.h')
-rw-r--r--c/enc/metablock.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/c/enc/metablock.h b/c/enc/metablock.h
new file mode 100644
index 0000000..cc52399
--- /dev/null
+++ b/c/enc/metablock.h
@@ -0,0 +1,100 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Algorithms for distributing the literals and commands of a metablock between
+ block types and contexts. */
+
+#ifndef BROTLI_ENC_METABLOCK_H_
+#define BROTLI_ENC_METABLOCK_H_
+
+#include <brotli/types.h>
+#include "./block_splitter.h"
+#include "./command.h"
+#include "./context.h"
+#include "./histogram.h"
+#include "./memory.h"
+#include "./port.h"
+#include "./quality.h"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+typedef struct MetaBlockSplit {
+ BlockSplit literal_split;
+ BlockSplit command_split;
+ BlockSplit distance_split;
+ uint32_t* literal_context_map;
+ size_t literal_context_map_size;
+ uint32_t* distance_context_map;
+ size_t distance_context_map_size;
+ HistogramLiteral* literal_histograms;
+ size_t literal_histograms_size;
+ HistogramCommand* command_histograms;
+ size_t command_histograms_size;
+ HistogramDistance* distance_histograms;
+ size_t distance_histograms_size;
+} MetaBlockSplit;
+
+static BROTLI_INLINE void InitMetaBlockSplit(MetaBlockSplit* mb) {
+ BrotliInitBlockSplit(&mb->literal_split);
+ BrotliInitBlockSplit(&mb->command_split);
+ BrotliInitBlockSplit(&mb->distance_split);
+ mb->literal_context_map = 0;
+ mb->literal_context_map_size = 0;
+ mb->distance_context_map = 0;
+ mb->distance_context_map_size = 0;
+ mb->literal_histograms = 0;
+ mb->literal_histograms_size = 0;
+ mb->command_histograms = 0;
+ mb->command_histograms_size = 0;
+ mb->distance_histograms = 0;
+ mb->distance_histograms_size = 0;
+}
+
+static BROTLI_INLINE void DestroyMetaBlockSplit(
+ MemoryManager* m, MetaBlockSplit* mb) {
+ BrotliDestroyBlockSplit(m, &mb->literal_split);
+ BrotliDestroyBlockSplit(m, &mb->command_split);
+ BrotliDestroyBlockSplit(m, &mb->distance_split);
+ BROTLI_FREE(m, mb->literal_context_map);
+ BROTLI_FREE(m, mb->distance_context_map);
+ BROTLI_FREE(m, mb->literal_histograms);
+ BROTLI_FREE(m, mb->command_histograms);
+ BROTLI_FREE(m, mb->distance_histograms);
+}
+
+/* Uses the slow shortest-path block splitter and does context clustering. */
+BROTLI_INTERNAL void BrotliBuildMetaBlock(MemoryManager* m,
+ const uint8_t* ringbuffer,
+ const size_t pos,
+ const size_t mask,
+ const BrotliEncoderParams* params,
+ uint8_t prev_byte,
+ uint8_t prev_byte2,
+ const Command* cmds,
+ size_t num_commands,
+ ContextType literal_context_mode,
+ MetaBlockSplit* mb);
+
+/* Uses a fast greedy block splitter that tries to merge current block with the
+ last or the second last block and uses a static context clustering which
+ is the same for all block types. */
+BROTLI_INTERNAL void BrotliBuildMetaBlockGreedy(
+ MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask,
+ uint8_t prev_byte, uint8_t prev_byte2, ContextType literal_context_mode,
+ size_t num_contexts, const uint32_t* static_context_map,
+ const Command* commands, size_t n_commands, MetaBlockSplit* mb);
+
+BROTLI_INTERNAL void BrotliOptimizeHistograms(size_t num_direct_distance_codes,
+ size_t distance_postfix_bits,
+ MetaBlockSplit* mb);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* extern "C" */
+#endif
+
+#endif /* BROTLI_ENC_METABLOCK_H_ */