updated FByteBulkData so close #147

This commit is contained in:
iAmAsval 2020-12-23 17:46:11 +01:00
parent b736325b6a
commit 09be7a9ea6
3 changed files with 66 additions and 33 deletions

View File

@ -4,43 +4,45 @@ namespace FModel.PakReader.Parsers.Objects
{
public readonly struct FByteBulkData : IUStruct
{
public readonly FByteBulkDataHeader Header;
public readonly byte[] Data;
internal FByteBulkData(BinaryReader reader, Stream ubulk, long ubulkOffset)
{
var BulkDataFlags = reader.ReadInt32();
Header = new FByteBulkDataHeader(reader, ubulkOffset);
var bulkDataFlags = Header.BulkDataFlags;
var ElementCount = reader.ReadInt32();
_ = reader.ReadInt32(); //BulkDataSizeOnDisk
var BulkDataOffsetInFile = reader.ReadInt64();
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_NoOffsetFixUp) == 0) // UE4.26 flag
Data = new byte[Header.ElementCount];
if (Header.ElementCount == 0)
{
BulkDataOffsetInFile += ubulkOffset;
}
Data = null;
if ((BulkDataFlags & 0x20) != 0 || ElementCount == 0)
return;
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_OptionalPayload) != 0) //.uptnl
}
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_Unused) != 0)
{
return;
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadAtEndOfFile) != 0 &&
BulkDataOffsetInFile + ElementCount <= reader.BaseStream.Length) //.uasset
{
long rememberMe = reader.BaseStream.Position;
reader.BaseStream.Seek(BulkDataOffsetInFile, SeekOrigin.Begin);
Data = reader.ReadBytes(ElementCount);
reader.BaseStream.Seek(rememberMe, SeekOrigin.Begin);
}
else if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_ForceInlinePayload) != 0) //.uexp
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_OptionalPayload) != 0) //.uptnl
{
Data = reader.ReadBytes(ElementCount);
return;
}
else if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadInSeperateFile) != 0 && ubulk != null) //.ubulk
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_ForceInlinePayload) != 0) //.uexp
{
ubulk.Position = BulkDataOffsetInFile;
Data = new byte[ElementCount];
ubulk.Read(Data, 0, (int)ElementCount);
reader.Read(Data, 0, Header.ElementCount);
}
else if((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadInSeperateFile) != 0) //.ubulk
{
ubulk.Position = Header.OffsetInFile;
ubulk.Read(Data, 0, Header.ElementCount);
}
else if((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadAtEndOfFile) != 0) //.uexp
{
var savePos = reader.BaseStream.Position;
if (Header.OffsetInFile + Header.ElementCount <= reader.BaseStream.Length)
{
reader.BaseStream.Position = Header.OffsetInFile;
reader.Read(Data, 0, Header.ElementCount);
}
reader.BaseStream.Position = savePos;
}
}
}

View File

@ -0,0 +1,38 @@
using System.IO;
namespace FModel.PakReader.Parsers.Objects
{
public readonly struct FByteBulkDataHeader : IUStruct
{
public readonly int BulkDataFlags;
public readonly int ElementCount;
public readonly long SizeOnDisk;
public readonly long OffsetInFile;
internal FByteBulkDataHeader(BinaryReader reader, long ubulkOffset)
{
BulkDataFlags = reader.ReadInt32();
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_Size64Bit) != 0)
{
ElementCount = (int)reader.ReadInt64();
SizeOnDisk = reader.ReadInt64();
}
else
{
ElementCount = reader.ReadInt32();
SizeOnDisk = reader.ReadInt32();
}
OffsetInFile = reader.ReadInt64();
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_NoOffsetFixUp) == 0) // UE4.26 flag
{
OffsetInFile += ubulkOffset;
}
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_BadDataVersion) != 0)
{
reader.ReadBytes(2);
}
}
}
}

View File

@ -38,14 +38,7 @@ namespace FModel.Windows.SoundPlayer
{
get
{
try
{
return CanSeek ? (long)(_vorbisReader.TotalTime.TotalSeconds * _waveFormat.SampleRate * _waveFormat.Channels) : 0;
}
catch (Exception)
{
return 0;
}
return CanSeek ? (long)(_vorbisReader.TotalTime.TotalSeconds * _waveFormat.SampleRate * _waveFormat.Channels) : 0;
}
}