blob: 5a19be51eda056ac56c99c022a50bec7d4a39b5c [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef TOOLS_ANDROID_DEVIL_UTIL_ZST_COMPRESSOR_H_
#define TOOLS_ANDROID_DEVIL_UTIL_ZST_COMPRESSOR_H_
#include <ostream>
// Forward declarations.
struct ZSTD_inBuffer_s;
typedef ZSTD_inBuffer_s ZSTD_inBuffer;
struct ZSTD_outBuffer_s;
typedef ZSTD_outBuffer_s ZSTD_outBuffer;
struct ZSTD_CCtx_s;
typedef ZSTD_CCtx_s ZSTD_CCtx;
class ZstCompressor {
public:
// The user is responsible for closing the output_stream if necessary.
explicit ZstCompressor(std::ostream& output_stream, int compression_level);
~ZstCompressor();
// Get the size of input buffer (which will be passed to CompressStreaming())
// that is recommended by zstd. It is OK to use a different input buffer size.
size_t GetRecommendedInputBufferSize();
struct UncompressedContent {
char* buffer;
size_t size;
};
// Compress the input and write the result to output_stream. Repeatedly call
// this function until you have passed everything that need to be compressed.
// If this is the last chunk of input that needs to be compressed, set
// last_chunk to true, otherwise set last_chunk to false.
// The user is responsible for freeing the input.buffer if needed.
void CompressStreaming(UncompressedContent input, bool last_chunk);
private:
// The output stream where we are writing the compressed content to.
std::ostream& output_stream_;
size_t input_buffer_recommended_size_;
// A struct containing the input buffer, the size of the contents of input
// buffer, and the position where the zstd library function stopped reading.
// The position field is updated by the zstd library functions.
ZSTD_inBuffer* input_struct_;
// A buffer where the compressed content is placed into.
char* output_buffer_;
// The size of the output buffer. Indicates how large the buffer is.
size_t output_buffer_size_;
// A struct containing the output buffer, the size of the output buffer,
// and the position where the zstd library function stopped writing.
// The position field is updated by the zstd library functions.
ZSTD_outBuffer* output_struct_;
// A context object needed by the zstd library functions.
ZSTD_CCtx* ctx_;
};
#endif // TOOLS_ANDROID_DEVIL_UTIL_ZST_COMPRESSOR_H_