CompressedBlob.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright 2008 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // WARNING Code not big-endian safe.
  4. // To create new compressed BLOBs, use CompressFileToBlob.
  5. // File format
  6. // * Header
  7. // * [Block Pointers interleaved with block hashes (hash of decompressed data)]
  8. // * [Data]
  9. #pragma once
  10. #include <memory>
  11. #include <string>
  12. #include <vector>
  13. #include "Common/CommonTypes.h"
  14. #include "Common/IOFile.h"
  15. #include "DiscIO/Blob.h"
  16. namespace DiscIO
  17. {
  18. static constexpr u32 GCZ_MAGIC = 0xB10BC001;
  19. // GCZ file structure:
  20. // BlobHeader
  21. // u64 offsetsToBlocks[n], top bit specifies whether the block is compressed, or not.
  22. // compressed data
  23. // Blocks that won't compress to less than 97% of the original size are stored as-is.
  24. struct CompressedBlobHeader // 32 bytes
  25. {
  26. u32 magic_cookie; // 0xB10BB10B
  27. u32 sub_type; // GC image, whatever
  28. u64 compressed_data_size;
  29. u64 data_size;
  30. u32 block_size;
  31. u32 num_blocks;
  32. };
  33. class CompressedBlobReader : public SectorReader
  34. {
  35. public:
  36. static std::unique_ptr<CompressedBlobReader> Create(File::IOFile file,
  37. const std::string& filename);
  38. ~CompressedBlobReader();
  39. const CompressedBlobHeader& GetHeader() const { return m_header; }
  40. BlobType GetBlobType() const override { return BlobType::GCZ; }
  41. std::unique_ptr<BlobReader> CopyReader() const override;
  42. u64 GetRawSize() const override { return m_file_size; }
  43. u64 GetDataSize() const override { return m_header.data_size; }
  44. DataSizeType GetDataSizeType() const override { return DataSizeType::Accurate; }
  45. u64 GetBlockSize() const override { return m_header.block_size; }
  46. bool HasFastRandomAccessInBlock() const override { return false; }
  47. std::string GetCompressionMethod() const override { return "Deflate"; }
  48. std::optional<int> GetCompressionLevel() const override { return std::nullopt; }
  49. u64 GetBlockCompressedSize(u64 block_num) const;
  50. bool GetBlock(u64 block_num, u8* out_ptr) override;
  51. private:
  52. CompressedBlobReader(File::IOFile file, const std::string& filename);
  53. CompressedBlobHeader m_header;
  54. std::vector<u64> m_block_pointers;
  55. std::vector<u32> m_hashes;
  56. int m_data_offset;
  57. File::IOFile m_file;
  58. u64 m_file_size;
  59. std::vector<u8> m_zlib_buffer;
  60. std::string m_file_name;
  61. };
  62. } // namespace DiscIO