summaryrefslogtreecommitdiff
path: root/src/common/zstd_compression.cpp
diff options
context:
space:
mode:
authorGravatar unknown2019-02-08 23:11:00 +0100
committerGravatar FreddyFunk2019-03-29 18:22:08 +0100
commit72477731ed20c56a4d6f18a22f43224fab667cef (patch)
treeb42e73051351850148cbffe65c528c0adfff62af /src/common/zstd_compression.cpp
parentcommon: Link libzstd_static (diff)
downloadyuzu-72477731ed20c56a4d6f18a22f43224fab667cef.tar.gz
yuzu-72477731ed20c56a4d6f18a22f43224fab667cef.tar.xz
yuzu-72477731ed20c56a4d6f18a22f43224fab667cef.zip
common/zstd_compression: Add Zstandard wrapper
Diffstat (limited to 'src/common/zstd_compression.cpp')
-rw-r--r--src/common/zstd_compression.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/common/zstd_compression.cpp b/src/common/zstd_compression.cpp
new file mode 100644
index 000000000..f6cf7a791
--- /dev/null
+++ b/src/common/zstd_compression.cpp
@@ -0,0 +1,52 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <algorithm>
8#include <zstd.h>
9
10#include "common/assert.h"
11#include "common/zstd_compression.h"
12
13namespace Common::Compression {
14
15std::vector<u8> CompressDataZSTD(const u8* source, std::size_t source_size, s32 compression_level) {
16
17 compression_level = std::clamp(compression_level, 1, ZSTD_maxCLevel());
18
19 const std::size_t max_compressed_size = ZSTD_compressBound(source_size);
20 std::vector<u8> compressed(max_compressed_size);
21
22 const std::size_t compressed_size =
23 ZSTD_compress(compressed.data(), compressed.size(), source, source_size, compression_level);
24
25 if (ZSTD_isError(compressed_size)) {
26 // Compression failed
27 return {};
28 }
29
30 compressed.resize(compressed_size);
31
32 return compressed;
33}
34
35std::vector<u8> CompressDataZSTDDefault(const u8* source, std::size_t source_size) {
36 return CompressDataZSTD(source, source_size, ZSTD_CLEVEL_DEFAULT);
37}
38
39std::vector<u8> DecompressDataZSTD(const std::vector<u8>& compressed,
40 std::size_t uncompressed_size) {
41 std::vector<u8> uncompressed(uncompressed_size);
42 const std::size_t uncompressed_result_size = ZSTD_decompress(
43 uncompressed.data(), uncompressed.size(), compressed.data(), compressed.size());
44
45 if (uncompressed_size != uncompressed_result_size || ZSTD_isError(uncompressed_result_size)) {
46 // Decompression failed
47 return {};
48 }
49 return uncompressed;
50}
51
52} // namespace Common::Compression