blob: 6575605cd70485bcc783f7745a37203f477fe33e [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 <fbl/algorithm.h>
#include <src/lib/chunked-compression/chunked-archive.h>
#include <src/lib/chunked-compression/compression-params.h>
#include <zstd/zstd.h>
namespace chunked_compression {
namespace {
constexpr size_t kKiB = 1024;
} // namespace
bool CompressionParams::IsValid() {
return MinCompressionLevel() <= compression_level && compression_level <= MaxCompressionLevel() &&
MinChunkSize() <= chunk_size && chunk_size % MinChunkSize() == 0;
}
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, size_t target_size) {
size_t rounded_target = fbl::round_up(target_size, MinChunkSize());
if (HeaderWriter::NumFramesForDataSize(len, rounded_target) <= kChunkArchiveMaxFrames) {
return rounded_target;
}
// For larger files, just max out the number of frames.
size_t lower_bound_frame_size =
fbl::round_up(len, kChunkArchiveMaxFrames) / kChunkArchiveMaxFrames;
return fbl::round_up(lower_bound_frame_size, MinChunkSize());
}
size_t CompressionParams::MinChunkSize() { return 8 * kKiB; }
} // namespace chunked_compression