25#include <brotli/decode.h>
26#include <brotli/encode.h>
49 bool old = std::exchange(
finished_,
true);
51 LOG(
FATAL) <<
"Decoder::Finish called while already finished?";
71 bool old = std::exchange(
finished_,
true);
73 LOG(
FATAL) <<
"Decoder::Finish called while already finished?";
102 *output = std::span(
output_buffer_.data(),
static_cast<char*
>(p));
117 size_t available_out = output->size();
118 void* p = output->data();
123 available_out -= len;
127 output->resize(output->size() - available_out);
139 decoder_(BrotliDecoderCreateInstance(nullptr, nullptr, nullptr),
140 BrotliDecoderDestroyInstance) {}
147 uint8_t* next_out =
reinterpret_cast<uint8_t*
>(
output_buffer_.data());
149 BrotliDecoderResult r = BrotliDecoderDecompressStream(
150 decoder_.get(), &available_in, &next_in, &available_out, &next_out,
nullptr);
159 case BROTLI_DECODER_RESULT_SUCCESS:
162 case BROTLI_DECODER_RESULT_ERROR:
164 case BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:
169 case BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:
175 std::unique_ptr<BrotliDecoderState, void (*)(BrotliDecoderState*)>
decoder_;
183 encoder_(BrotliEncoderCreateInstance(nullptr, nullptr, nullptr),
184 BrotliEncoderDestroyInstance) {
185 BrotliEncoderSetParameter(
encoder_.get(), BROTLI_PARAM_QUALITY, 1);
196 uint8_t* next_out =
reinterpret_cast<uint8_t*
>(
199 BrotliEncoderOperation op = BROTLI_OPERATION_PROCESS;
201 op = BROTLI_OPERATION_FINISH;
204 if (!BrotliEncoderCompressStream(
encoder_.get(), op, &available_in, &next_in,
205 &available_out, &next_out,
nullptr)) {
214 if (BrotliEncoderIsFinished(
encoder_.get())) {
232 std::unique_ptr<BrotliEncoderState, void (*)(BrotliEncoderState*)>
encoder_;
239 if (LZ4F_createDecompressionContext(&dctx, LZ4F_VERSION) != 0) {
240 LOG(
FATAL) <<
"failed to initialize LZ4 decompression context";
242 decoder_ = std::unique_ptr<LZ4F_dctx, decltype(&LZ4F_freeDecompressionContext)>(
243 dctx, LZ4F_freeDecompressionContext);
253 size_t rc = LZ4F_decompress(
decoder_.get(), next_out, &available_out, next_in,
254 &available_in,
nullptr);
255 if (LZ4F_isError(rc)) {
256 LOG(
ERROR) <<
"LZ4F_decompress failed: " << LZ4F_getErrorName(rc);
264 LOG(
ERROR) <<
"LZ4 stream hit end before reading all data";
282 std::unique_ptr<LZ4F_dctx, LZ4F_errorCode_t (*)(LZ4F_dctx*)>
decoder_;
289 if (LZ4F_createCompressionContext(&cctx, LZ4F_VERSION) != 0) {
290 LOG(
FATAL) <<
"failed to initialize LZ4 compression context";
292 encoder_ = std::unique_ptr<LZ4F_cctx, decltype(&LZ4F_freeCompressionContext)>(
293 cctx, LZ4F_freeCompressionContext);
296 if (LZ4F_isError(rc)) {
297 LOG(
FATAL) <<
"LZ4F_compressBegin failed: %s", LZ4F_getErrorName(rc);
319 constexpr size_t max_input_size = 65536;
320 const size_t encode_block_size = LZ4F_compressBound(max_input_size,
nullptr);
322 if (available_in != 0) {
324 LOG(
ERROR) <<
"LZ4Encoder received data after Finish?";
328 available_in =
std::min(available_in, max_input_size);
330 Block encode_block(encode_block_size);
331 size_t available_out = encode_block.
capacity();
332 char* next_out = encode_block.
data();
334 size_t rc = LZ4F_compressUpdate(
encoder_.get(), next_out, available_out, next_in,
335 available_in,
nullptr);
336 if (LZ4F_isError(rc)) {
337 LOG(
ERROR) <<
"LZ4F_compressUpdate failed: " << LZ4F_getErrorName(rc);
346 encode_block.
resize(encode_block_size - available_out);
353 Block final_block(encode_block_size + 4);
354 size_t rc = LZ4F_compressEnd(
encoder_.get(), final_block.
data(), final_block.
size(),
356 if (LZ4F_isError(rc)) {
357 LOG(
ERROR) <<
"LZ4F_compressEnd failed: " << LZ4F_getErrorName(rc);
382 std::unique_ptr<LZ4F_cctx, LZ4F_errorCode_t (*)(LZ4F_cctx*)>
encoder_;
388 :
Decoder(output_buffer),
decoder_(ZSTD_createDStream(), ZSTD_freeDStream) {
390 LOG(
FATAL) <<
"failed to initialize Zstd decompression context";
407 size_t rc = ZSTD_decompressStream(
decoder_.get(), &out, &in);
408 if (ZSTD_isError(rc)) {
409 LOG(
ERROR) <<
"ZSTD_decompressStream failed: " << ZSTD_getErrorName(rc);
416 LOG(
ERROR) <<
"Zstd stream hit end before reading all data";
433 std::unique_ptr<ZSTD_DStream, size_t (*)(ZSTD_DStream*)>
decoder_;
438 :
Encoder(output_block_size),
encoder_(ZSTD_createCStream(), ZSTD_freeCStream) {
440 LOG(
FATAL) <<
"failed to initialize Zstd compression context";
442 ZSTD_CCtx_setParameter(
encoder_.get(), ZSTD_c_compressionLevel, 1);
454 out.dst = output->data();
455 out.size =
static_cast<size_t>(output->size());
458 ZSTD_EndDirective end_directive =
finished_ ? ZSTD_e_end : ZSTD_e_continue;
459 size_t rc = ZSTD_compressStream2(
encoder_.get(), &out, &in, end_directive);
460 if (ZSTD_isError(rc)) {
461 LOG(
ERROR) <<
"ZSTD_compressStream2 failed: " << ZSTD_getErrorName(rc);
466 output->resize(out.pos);
472 LOG(
ERROR) <<
"ZSTD_compressStream2 finished early";
485 std::unique_ptr<ZSTD_CStream, size_t (*)(ZSTD_CStream*)>
encoder_;
EncodeResult
Definition: compression_utils.h:39
DecodeResult
Definition: compression_utils.h:32
#define min(a, b)
Definition: ext4_utils.h:44
#define FATAL(x...)
Definition: image.h:31
ResponseHeader header
Definition: incremental_server.cpp:0
#define LOG(severity)
Definition: logging.h:223
@ ERROR
Definition: logging.h:92
size_t capacity() const
Definition: types.h:106
void resize(size_t new_size)
Definition: types.h:68
size_t size() const
Definition: types.h:107
char * data()
Definition: types.h:110
Definition: compression_utils.h:136
BrotliDecoder(std::span< char > output_buffer)
Definition: compression_utils.h:137
DecodeResult Decode(std::span< char > *output) final
Definition: compression_utils.h:142
std::unique_ptr< BrotliDecoderState, void(*)(BrotliDecoderState *)> decoder_
Definition: compression_utils.h:175
Definition: compression_utils.h:178
Block output_block_
Definition: compression_utils.h:230
EncodeResult Encode(Block *output) final
Definition: compression_utils.h:188
size_t output_bytes_left_
Definition: compression_utils.h:231
BrotliEncoder(size_t output_block_size)
Definition: compression_utils.h:179
std::unique_ptr< BrotliEncoderState, void(*)(BrotliEncoderState *)> encoder_
Definition: compression_utils.h:232
Definition: compression_utils.h:46
bool Finish()
Definition: compression_utils.h:48
Decoder(std::span< char > output_buffer)
Definition: compression_utils.h:60
std::span< char > output_buffer_
Definition: compression_utils.h:65
bool finished_
Definition: compression_utils.h:63
virtual DecodeResult Decode(std::span< char > *output)=0
void Append(Block &&block)
Definition: compression_utils.h:47
IOVector input_buffer_
Definition: compression_utils.h:64
Definition: compression_utils.h:68
Encoder(size_t output_block_size)
Definition: compression_utils.h:82
bool Finish()
Definition: compression_utils.h:70
IOVector input_buffer_
Definition: compression_utils.h:87
const size_t output_block_size_
Definition: compression_utils.h:85
void Append(Block input)
Definition: compression_utils.h:69
bool finished_
Definition: compression_utils.h:86
virtual EncodeResult Encode(Block *output)=0
void append(block_type &&block)
Definition: types.h:207
size_type front_size() const
Definition: types.h:186
void drop_front(size_type len)
Definition: types.cpp:41
size_type size() const
Definition: types.h:194
IOVector take_front(size_type len)
Definition: types.cpp:65
bool empty() const
Definition: types.h:195
const value_type * front_data() const
Definition: types.h:178
CollectionType coalesce() const &
Definition: types.h:248
Definition: compression_utils.h:235
DecodeResult Decode(std::span< char > *output) final
Definition: compression_utils.h:246
LZ4Decoder(std::span< char > output_buffer)
Definition: compression_utils.h:236
std::unique_ptr< LZ4F_dctx, LZ4F_errorCode_t(*)(LZ4F_dctx *)> decoder_
Definition: compression_utils.h:282
bool lz4_done_
Definition: compression_utils.h:281
Definition: compression_utils.h:285
bool OutputReady() const
Definition: compression_utils.h:304
std::unique_ptr< LZ4F_cctx, LZ4F_errorCode_t(*)(LZ4F_cctx *)> encoder_
Definition: compression_utils.h:382
LZ4Encoder(size_t output_block_size)
Definition: compression_utils.h:286
IOVector output_buffer_
Definition: compression_utils.h:383
bool lz4_finalized_
Definition: compression_utils.h:381
EncodeResult Encode(Block *output) final
Definition: compression_utils.h:309
Definition: compression_utils.h:90
NullDecoder(std::span< char > output_buffer)
Definition: compression_utils.h:91
DecodeResult Decode(std::span< char > *output) final
Definition: compression_utils.h:93
Definition: compression_utils.h:110
NullEncoder(size_t output_block_size)
Definition: compression_utils.h:111
EncodeResult Encode(Block *output) final
Definition: compression_utils.h:113
Definition: compression_utils.h:386
ZstdDecoder(std::span< char > output_buffer)
Definition: compression_utils.h:387
std::unique_ptr< ZSTD_DStream, size_t(*)(ZSTD_DStream *)> decoder_
Definition: compression_utils.h:433
bool zstd_done_
Definition: compression_utils.h:432
DecodeResult Decode(std::span< char > *output) final
Definition: compression_utils.h:394
Definition: compression_utils.h:436
EncodeResult Encode(Block *output) final
Definition: compression_utils.h:445
ZstdEncoder(size_t output_block_size)
Definition: compression_utils.h:437
std::unique_ptr< ZSTD_CStream, size_t(*)(ZSTD_CStream *)> encoder_
Definition: compression_utils.h:485