Brotli Compression
This page explains how to compress and decompress data using Brotli.
Code snippets assume using namespace boost::capy; is in effect.
|
What is Brotli?
Brotli is a modern compression algorithm developed by Google. It offers:
-
Excellent compression ratios, especially for text
-
Good decompression speed
-
Support for shared dictionaries
-
Wide browser support for web content
Brotli typically achieves 20-25% better compression than gzip on text content.
Setup
#include <boost/capy/brotli.hpp>
#include <boost/capy/datastore.hpp>
datastore ctx;
// Install encoder and decoder services
auto& encoder = brotli::install_encode_service(ctx);
auto& decoder = brotli::install_decode_service(ctx);
The services manage internal state and can be reused for multiple operations.
Encoding (Compression)
std::vector<char> input = get_data();
std::vector<char> output;
// Compress with default quality
brotli::encode_result result = encoder.encode(
input.data(), input.size(),
output
);
if (result.ec)
handle_error(result.ec);
// output now contains compressed data
Decoding (Decompression)
std::vector<char> compressed = get_compressed();
std::vector<char> output;
// Decompress
brotli::decode_result result = decoder.decode(
compressed.data(), compressed.size(),
output
);
if (result.ec)
handle_error(result.ec);
// output now contains original data
Decompression is typically much faster than compression.
Shared Dictionaries
Shared dictionaries improve compression for similar content by providing a common reference:
// Load a pre-computed dictionary
brotli::shared_dictionary dict = load_dictionary();
// Install services with dictionary
auto& encoder = brotli::install_encode_service(ctx, dict);
auto& decoder = brotli::install_decode_service(ctx, dict);
Both encoder and decoder must use the same dictionary.
Error Handling
brotli::encode_result result = encoder.encode(input, output);
if (result.ec == brotli::error::invalid_input)
{
// Input data is malformed
}
else if (result.ec)
{
std::cerr << "Brotli error: " << result.ec.message() << "\n";
}
When to Use Brotli
Use Brotli when:
-
Compression ratio is important
-
Content is text-heavy (HTML, CSS, JS, JSON)
-
Compressing once, decompressing many times
-
Target supports Brotli (modern browsers, HTTP/2)
Avoid Brotli when:
-
Compatibility with older systems is required
-
Compression speed is critical
-
Content is already compressed (images, video)
Summary
| Function | Purpose |
|---|---|
|
Create compression service |
|
Create decompression service |
|
Compress data |
|
Decompress data |
|
Shared dictionary for improved compression |
Next Steps
-
ZLib — DEFLATE/gzip compression
-
Containers — Service container (
datastore)