blob: 65de3a2bd5b9a6108b6d82f72936183447d1f110 [file] [log] [blame]
// 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