mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2026-04-05 21:51:03 +00:00
56 lines
1.9 KiB
Plaintext
56 lines
1.9 KiB
Plaintext
[appendix]
|
|
== 🗃️ Compression Types
|
|
|
|
This apprendix lists all supported compression algorithms used within AaruFormat images.
|
|
|
|
NOTE: Compression method definitions may evolve over time.
|
|
For the latest and most accurate listing, refer to the `libaaruformat` source.
|
|
|
|
[cols="1,5",options="header"]
|
|
|===
|
|
|Value
|
|
|Algorithm
|
|
|
|
|0 |None
|
|
|1 |LZMA — 5-byte properties prefix followed by compressed stream
|
|
|2 |FLAC
|
|
|3 |LZMA after Claunia Subchannel Transform (see Appendix D) — 5-byte properties prefix followed by compressed stream
|
|
|4 |Zstandard (zstd) — standard zstd frame, no prefix
|
|
|5 |Zstandard after Claunia Subchannel Transform (see Appendix D) — standard zstd frame, no prefix
|
|
|===
|
|
|
|
=== 📝 Notes on LZMA Properties Prefix (IDs 1 and 3)
|
|
|
|
For LZMA-compressed blocks, the on-disk payload immediately following the block header is:
|
|
|
|
----
|
|
[ 5-byte LZMA properties ] [ compressed stream ]
|
|
----
|
|
|
|
The `cmpLength` field in the block header covers the **entire payload** including the 5-byte properties prefix:
|
|
|
|
----
|
|
cmpLength = 5 + compressed_stream_size
|
|
----
|
|
|
|
The `cmpCrc64` checksum covers only the **compressed stream**, excluding the properties prefix:
|
|
|
|
----
|
|
cmpCrc64 = CRC64(payload[5 .. cmpLength - 1])
|
|
----
|
|
|
|
To decompress:
|
|
|
|
1. Read `cmpLength` bytes from the file position after the block header.
|
|
2. The first 5 bytes are LZMA properties (see LZMA SDK specification).
|
|
3. The remaining `cmpLength - 5` bytes are the compressed stream.
|
|
4. Decompress into `length` bytes using the properties and the compressed stream.
|
|
|
|
=== 📝 Notes on Zstandard (IDs 4 and 5)
|
|
|
|
Unlike LZMA (IDs 1 and 3), Zstandard compressed payloads are stored as self-contained zstd frames.
|
|
The `cmpLength` field in the block header covers the entire compressed payload with no additional prefix bytes.
|
|
|
|
ID 5 (`ZstdCst`) applies the Claunia Subchannel Transform before compression and is restricted to blocks with data type `CdSubchannel`.
|
|
This mirrors the constraint on ID 3 (`LzmaCst`).
|