| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <src/lib/chunked-compression/chunked-archive.h> |
| #include <src/lib/chunked-compression/compression-params.h> |
| #include <zstd/zstd.h> |
| |
| namespace chunked_compression { |
| |
| bool CompressionParams::IsValid() { |
| return MinCompressionLevel() <= compression_level && compression_level <= MaxCompressionLevel() && |
| MinChunkSize() <= chunk_size && chunk_size <= MaxChunkSize(); |
| } |
| |
| size_t CompressionParams::ComputeOutputSizeLimit(size_t len) { |
| if (len == 0) { |
| return 0ul; |
| } |
| const size_t num_frames = HeaderWriter::NumFramesForDataSize(len, chunk_size); |
| size_t size = HeaderWriter::MetadataSizeForNumFrames(num_frames); |
| size += (ZSTD_compressBound(chunk_size) * num_frames); |
| return size; |
| } |
| |
| int CompressionParams::DefaultCompressionLevel() { return 3; } |
| int CompressionParams::MinCompressionLevel() { return ZSTD_minCLevel(); } |
| int CompressionParams::MaxCompressionLevel() { return ZSTD_maxCLevel(); } |
| |
| size_t CompressionParams::ChunkSizeForInputSize(size_t len) { |
| if (len <= (1 << 20)) { // Up to 1M |
| return MinChunkSize(); |
| } else if (len <= (1 << 24)) { // Up to 16M |
| return 262144; // 256K, or 64 4k pages |
| } else if (len <= (1 << 26)) { // Up to 64M |
| return 524288; // 512K, or 128 4k pages |
| } else { |
| return MaxChunkSize(); |
| } |
| } |
| size_t CompressionParams::MinChunkSize() { return 131072; /* 128K, or 32 4k pages */ } |
| size_t CompressionParams::MaxChunkSize() { return 1048576; /* 1M, or 256 4k pages */ } |
| |
| } // namespace chunked_compression |