- 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

@@ -10,9 +10,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.4-beta" /> <PackageReference Include="K4os.Compression.LZ4" Version="1.3.5" />
<PackageReference Include="MessagePack" Version="2.5.108" /> <PackageReference Include="MessagePack" Version="2.6.100-alpha" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,4 +1,5 @@
using K4os.Compression.LZ4; using K4os.Compression.LZ4;
using ZstdSharp;
using System; using System;
using System.Data; using System.Data;
using System.IO; using System.IO;
@@ -31,7 +32,8 @@ namespace AssetStudio
Lz4, Lz4,
Lz4HC, Lz4HC,
Lzham, Lzham,
Lz4Mr0k Lz4Mr0k,
Zstd = 5
} }
public class BundleFile public class BundleFile
@@ -423,7 +425,7 @@ namespace AssetStudio
} }
case CompressionType.Lz4: //LZ4 case CompressionType.Lz4: //LZ4
case CompressionType.Lz4HC: //LZ4HC case CompressionType.Lz4HC: //LZ4HC
case CompressionType.Lz4Mr0k: //Lz4Mr0k case CompressionType.Lz4Mr0k when Game.Type.IsMhyGroup(): //Lz4Mr0k
{ {
var compressedSize = (int)blockInfo.compressedSize; var compressedSize = (int)blockInfo.compressedSize;
var compressedBytes = BigArrayPool<byte>.Shared.Rent(compressedSize); var compressedBytes = BigArrayPool<byte>.Shared.Rent(compressedSize);
@@ -454,6 +456,34 @@ namespace AssetStudio
BigArrayPool<byte>.Shared.Return(uncompressedBytes); BigArrayPool<byte>.Shared.Return(uncompressedBytes);
break; 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: default:
throw new IOException($"Unsupported compression type {compressionType}"); throw new IOException($"Unsupported compression type {compressionType}");
} }

View File

@@ -11,9 +11,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" /> <PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="7.0.0" /> <PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.0-preview.5.23280.8" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -68,7 +68,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="OpenTK" Version="5.0.0-pre.8" /> <PackageReference Include="OpenTK" Version="5.0.0-pre.8" />
<Reference Include="OpenTK.WinForms"> <Reference Include="OpenTK.WinForms">
<HintPath>Libraries\OpenTK.WinForms.dll</HintPath> <HintPath>Libraries\OpenTK.WinForms.dll</HintPath>