- Added Zstd support

- Upgrade libraries.
This commit is contained in:
Razmoth
2023-06-23 12:19:24 +04:00
parent e608a119ca
commit 2ed0a0608e
4 changed files with 38 additions and 8 deletions

View File

@@ -1,4 +1,5 @@
using K4os.Compression.LZ4;
using ZstdSharp;
using System;
using System.Data;
using System.IO;
@@ -31,7 +32,8 @@ namespace AssetStudio
Lz4,
Lz4HC,
Lzham,
Lz4Mr0k
Lz4Mr0k,
Zstd = 5
}
public class BundleFile
@@ -423,7 +425,7 @@ namespace AssetStudio
}
case CompressionType.Lz4: //LZ4
case CompressionType.Lz4HC: //LZ4HC
case CompressionType.Lz4Mr0k: //Lz4Mr0k
case CompressionType.Lz4Mr0k when Game.Type.IsMhyGroup(): //Lz4Mr0k
{
var compressedSize = (int)blockInfo.compressedSize;
var compressedBytes = BigArrayPool<byte>.Shared.Rent(compressedSize);
@@ -454,6 +456,34 @@ namespace AssetStudio
BigArrayPool<byte>.Shared.Return(uncompressedBytes);
break;
}
case CompressionType.Zstd when !Game.Type.IsMhyGroup(): //Zstd
{
var compressedSize = (int)blockInfo.compressedSize;
var compressedBytes = BigArrayPool<byte>.Shared.Rent(compressedSize);
reader.Read(compressedBytes, 0, compressedSize);
var uncompressedSize = (int)blockInfo.uncompressedSize;
var uncompressedBytes = BigArrayPool<byte>.Shared.Rent(uncompressedSize);
try
{
using var decompressor = new Decompressor();
var numWrite = decompressor.Unwrap(compressedBytes, 0, compressedSize, uncompressedBytes, 0, uncompressedSize);
if (numWrite != uncompressedSize)
{
throw new IOException($"Zstd decompression error, write {numWrite} bytes but expected {uncompressedSize} bytes");
}
}
catch(Exception ex)
{
Console.WriteLine($"Zstd decompression error:\n{ex}");
}
blocksStream.Write(uncompressedBytes.ToArray(), 0, uncompressedSize);
BigArrayPool<byte>.Shared.Return(compressedBytes);
BigArrayPool<byte>.Shared.Return(uncompressedBytes);
break;
}
default:
throw new IOException($"Unsupported compression type {compressionType}");
}