载入中...
搜索中...
未找到
EvpackCompression.cpp
浏览该文件的文档.
2
3#include <zstd.h>
4
5#include <limits>
6
7namespace eve::asset {
8namespace {
9
10} // namespace
11
13 EvpackCodec codec, std::span<const std::uint8_t> decoded) {
14 if (codec == EvpackCodec::None)
15 return Result<std::vector<std::uint8_t>>::success(
16 std::vector<std::uint8_t>(decoded.begin(), decoded.end()));
17 if (codec != EvpackCodec::Zstd)
19 DiagnosticCode::Unsupported, "unknown runtime chunk codec", {}, {}, "asset.evpack.codec"));
20 if (decoded.size() > ZSTD_MAX_INPUT_SIZE)
22 DiagnosticCode::InvalidArgument, "chunk exceeds the Zstd input limit", {}, {}, "asset.evpack.codec"));
23 const std::size_t bound = ZSTD_compressBound(decoded.size());
24 std::vector<std::uint8_t> stored(bound);
25 const std::size_t size = ZSTD_compress(stored.data(), stored.size(), decoded.data(), decoded.size(), 3);
26 if (ZSTD_isError(size))
28 DiagnosticCode::Failed, std::string("Zstd compression failed: ") + ZSTD_getErrorName(size), {}, {},
29 "asset.evpack.codec"));
30 stored.resize(size);
31 return Result<std::vector<std::uint8_t>>::success(std::move(stored));
32}
33
35 EvpackCodec codec, std::span<const std::uint8_t> stored, std::uint64_t decodedSize,
36 std::uint64_t maximumDecodedBytes) {
37 if (decodedSize > maximumDecodedBytes || decodedSize > std::numeric_limits<std::size_t>::max())
39 "decoded chunk exceeds its resource budget",
40 {}, {}, "asset.evpack.codec"));
41 if (codec == EvpackCodec::None) {
42 if (stored.size() != decodedSize)
43 return Result<std::vector<std::uint8_t>>::failure(
44 Diagnostic::error(DiagnosticCode::ParseError, "uncompressed chunk size does not match the TOC", {}, {},
45 "asset.evpack.codec"));
46 return Result<std::vector<std::uint8_t>>::success(
47 std::vector<std::uint8_t>(stored.begin(), stored.end()));
48 }
49 if (codec != EvpackCodec::Zstd)
51 DiagnosticCode::Unsupported, "unknown runtime chunk codec", {}, {}, "asset.evpack.codec"));
52 std::vector<std::uint8_t> decoded(static_cast<std::size_t>(decodedSize));
53 const std::size_t size = ZSTD_decompress(decoded.data(), decoded.size(), stored.data(), stored.size());
54 if (ZSTD_isError(size))
56 DiagnosticCode::ParseError, std::string("Zstd decompression failed: ") + ZSTD_getErrorName(size), {}, {},
57 "asset.evpack.codec"));
58 if (size != decoded.size())
60 DiagnosticCode::ParseError, "decoded chunk size does not match the TOC", {}, {}, "asset.evpack.codec"));
61 return Result<std::vector<std::uint8_t>>::success(std::move(decoded));
62}
63
65 if (codec == EvpackCodec::None) return "none/1";
66 if (codec == EvpackCodec::Zstd)
67 return "zstd/" + std::to_string(ZSTD_VERSION_MAJOR) + "." +
68 std::to_string(ZSTD_VERSION_MINOR) + "." + std::to_string(ZSTD_VERSION_RELEASE) + "/level-3";
69 return "unknown";
70}
71
72} // namespace eve::asset
std::uint64_t decodedSize
Bounded deterministic compression used by the .evpack wire format.
std::vector< std::uint8_t > stored
Definition Evpack.cpp:171
float size
Definition TreeMesh.cpp:156
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
std::string evpackCodecBuildIdentity(EvpackCodec codec)
Stable codec implementation identity included in deterministic Cook keys.
EvpackCodec
Physical outer compression applied to one runtime chunk.
Definition Evpack.h:36
Result< std::vector< std::uint8_t > > compressEvpackChunk(EvpackCodec codec, std::span< const std::uint8_t > decoded)
Compress decoded chunk bytes using the selected stable wire codec.
Result< std::vector< std::uint8_t > > decompressEvpackChunk(EvpackCodec codec, std::span< const std::uint8_t > stored, std::uint64_t decodedSize, std::uint64_t maximumDecodedBytes)
Decode one chunk into its authenticated canonical bytes.