data_compression.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2019 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <lz4hc.h>
  6. #include "data_compression.h"
  7. namespace Compression {
  8. std::vector<u8> CompressDataLZ4(const u8* source, std::size_t source_size,
  9. bool use_LZ4_high_compression) {
  10. if (source_size > LZ4_MAX_INPUT_SIZE) {
  11. // Source size exceeds LZ4 maximum input size
  12. return {};
  13. }
  14. const auto source_size_int = static_cast<int>(source_size);
  15. const int max_compressed_size = LZ4_compressBound(source_size_int);
  16. std::vector<u8> compressed(max_compressed_size);
  17. int compressed_size = 0;
  18. if (use_LZ4_high_compression) {
  19. compressed_size = LZ4_compress_HC(reinterpret_cast<const char*>(source),
  20. reinterpret_cast<char*>(compressed.data()),
  21. source_size_int, max_compressed_size, LZ4HC_CLEVEL_MAX);
  22. } else {
  23. compressed_size = LZ4_compress_default(reinterpret_cast<const char*>(source),
  24. reinterpret_cast<char*>(compressed.data()),
  25. source_size_int, max_compressed_size);
  26. }
  27. if (compressed_size <= 0) {
  28. // Compression failed
  29. return {};
  30. }
  31. compressed.resize(compressed_size);
  32. return compressed;
  33. }
  34. std::vector<u8> DecompressDataLZ4(const std::vector<u8>& compressed,
  35. std::size_t uncompressed_size) {
  36. std::vector<u8> uncompressed(uncompressed_size);
  37. const int size_check = LZ4_decompress_safe(reinterpret_cast<const char*>(compressed.data()),
  38. reinterpret_cast<char*>(uncompressed.data()),
  39. static_cast<int>(compressed.size()),
  40. static_cast<int>(uncompressed.size()));
  41. if (static_cast<int>(uncompressed_size) != size_check) {
  42. // Decompression failed
  43. return {};
  44. }
  45. return uncompressed;
  46. }
  47. } // namespace Compression