Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f13bc4f authored by Daniel Zheng's avatar Daniel Zheng Committed by Gerrit Code Review
Browse files

Merge "Adding block sz to compressors" into main

parents 9603a829 b3092928
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -24,24 +24,26 @@ namespace snapshot {

class ICompressor {
  public:
    explicit ICompressor(uint32_t compression_level) : compression_level_(compression_level) {}
    explicit ICompressor(uint32_t compression_level, uint32_t block_size)
        : compression_level_(compression_level), block_size_(block_size) {}

    virtual ~ICompressor() {}
    // Factory methods for compression methods.
    static std::unique_ptr<ICompressor> Gz(uint32_t compression_level);
    static std::unique_ptr<ICompressor> Brotli(uint32_t compression_level);
    static std::unique_ptr<ICompressor> Lz4(uint32_t compression_level);
    static std::unique_ptr<ICompressor> Gz(uint32_t compression_level, const int32_t BLOCK_SZ);
    static std::unique_ptr<ICompressor> Brotli(uint32_t compression_level, const int32_t BLOCK_SZ);
    static std::unique_ptr<ICompressor> Lz4(uint32_t compression_level, const int32_t BLOCK_SZ);
    static std::unique_ptr<ICompressor> Zstd(uint32_t compression_level, const int32_t BLOCK_SZ);

    static std::unique_ptr<ICompressor> Create(CowCompression compression, const int32_t BLOCK_SZ);

    uint32_t GetCompressionLevel() const { return compression_level_; }

    uint32_t GetBlockSize() const { return block_size_; }
    [[nodiscard]] virtual std::basic_string<uint8_t> Compress(const void* data,
                                                              size_t length) const = 0;

  private:
    uint32_t compression_level_;
    uint32_t block_size_;
};
}  // namespace snapshot
}  // namespace android
 No newline at end of file
+26 −19
Original line number Diff line number Diff line
@@ -56,16 +56,16 @@ std::optional<CowCompressionAlgorithm> CompressionAlgorithmFromString(std::strin
}

std::unique_ptr<ICompressor> ICompressor::Create(CowCompression compression,
                                                 const int32_t BLOCK_SZ) {
                                                 const int32_t block_size) {
    switch (compression.algorithm) {
        case kCowCompressLz4:
            return ICompressor::Lz4(compression.compression_level);
            return ICompressor::Lz4(compression.compression_level, block_size);
        case kCowCompressBrotli:
            return ICompressor::Brotli(compression.compression_level);
            return ICompressor::Brotli(compression.compression_level, block_size);
        case kCowCompressGz:
            return ICompressor::Gz(compression.compression_level);
            return ICompressor::Gz(compression.compression_level, block_size);
        case kCowCompressZstd:
            return ICompressor::Zstd(compression.compression_level, BLOCK_SZ);
            return ICompressor::Zstd(compression.compression_level, block_size);
        case kCowCompressNone:
            return nullptr;
    }
@@ -100,7 +100,8 @@ uint32_t CompressWorker::GetDefaultCompressionLevel(CowCompressionAlgorithm comp

class GzCompressor final : public ICompressor {
  public:
    GzCompressor(uint32_t compression_level) : ICompressor(compression_level){};
    GzCompressor(uint32_t compression_level, const uint32_t block_size)
        : ICompressor(compression_level, block_size){};

    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
        const auto bound = compressBound(length);
@@ -120,7 +121,8 @@ class GzCompressor final : public ICompressor {

class Lz4Compressor final : public ICompressor {
  public:
    Lz4Compressor(uint32_t compression_level) : ICompressor(compression_level){};
    Lz4Compressor(uint32_t compression_level, const uint32_t block_size)
        : ICompressor(compression_level, block_size){};

    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
        const auto bound = LZ4_compressBound(length);
@@ -151,7 +153,8 @@ class Lz4Compressor final : public ICompressor {

class BrotliCompressor final : public ICompressor {
  public:
    BrotliCompressor(uint32_t compression_level) : ICompressor(compression_level){};
    BrotliCompressor(uint32_t compression_level, const uint32_t block_size)
        : ICompressor(compression_level, block_size){};

    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
        const auto bound = BrotliEncoderMaxCompressedSize(length);
@@ -176,10 +179,11 @@ class BrotliCompressor final : public ICompressor {

class ZstdCompressor final : public ICompressor {
  public:
    ZstdCompressor(uint32_t compression_level, const uint32_t MAX_BLOCK_SIZE)
        : ICompressor(compression_level), zstd_context_(ZSTD_createCCtx(), ZSTD_freeCCtx) {
    ZstdCompressor(uint32_t compression_level, const uint32_t block_size)
        : ICompressor(compression_level, block_size),
          zstd_context_(ZSTD_createCCtx(), ZSTD_freeCCtx) {
        ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_compressionLevel, compression_level);
        ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(MAX_BLOCK_SIZE));
        ZSTD_CCtx_setParameter(zstd_context_.get(), ZSTD_c_windowLog, log2(GetBlockSize()));
    };

    std::basic_string<uint8_t> Compress(const void* data, size_t length) const override {
@@ -313,20 +317,23 @@ bool CompressWorker::GetCompressedBuffers(std::vector<std::basic_string<uint8_t>
    return true;
}

std::unique_ptr<ICompressor> ICompressor::Brotli(uint32_t compression_level) {
    return std::make_unique<BrotliCompressor>(compression_level);
std::unique_ptr<ICompressor> ICompressor::Brotli(uint32_t compression_level,
                                                 const int32_t block_size) {
    return std::make_unique<BrotliCompressor>(compression_level, block_size);
}

std::unique_ptr<ICompressor> ICompressor::Gz(uint32_t compression_level) {
    return std::make_unique<GzCompressor>(compression_level);
std::unique_ptr<ICompressor> ICompressor::Gz(uint32_t compression_level, const int32_t block_size) {
    return std::make_unique<GzCompressor>(compression_level, block_size);
}

std::unique_ptr<ICompressor> ICompressor::Lz4(uint32_t compression_level) {
    return std::make_unique<Lz4Compressor>(compression_level);
std::unique_ptr<ICompressor> ICompressor::Lz4(uint32_t compression_level,
                                              const int32_t block_size) {
    return std::make_unique<Lz4Compressor>(compression_level, block_size);
}

std::unique_ptr<ICompressor> ICompressor::Zstd(uint32_t compression_level, const int32_t BLOCK_SZ) {
    return std::make_unique<ZstdCompressor>(compression_level, BLOCK_SZ);
std::unique_ptr<ICompressor> ICompressor::Zstd(uint32_t compression_level,
                                               const int32_t block_size) {
    return std::make_unique<ZstdCompressor>(compression_level, block_size);
}

void CompressWorker::Finalize() {