From 09be7a9ea6cc6e2d4542ae6c7a4280aca1ee6e19 Mon Sep 17 00:00:00 2001 From: iAmAsval Date: Wed, 23 Dec 2020 17:46:11 +0100 Subject: [PATCH] updated FByteBulkData so close #147 --- .../Parsers/Objects/FByteBulkData.cs | 52 ++++++++++--------- .../Parsers/Objects/FByteBulkDataHeader.cs | 38 ++++++++++++++ FModel/Windows/SoundPlayer/NVorbisSource.cs | 9 +--- 3 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs diff --git a/FModel/PakReader/Parsers/Objects/FByteBulkData.cs b/FModel/PakReader/Parsers/Objects/FByteBulkData.cs index 9665067b..58c919ee 100644 --- a/FModel/PakReader/Parsers/Objects/FByteBulkData.cs +++ b/FModel/PakReader/Parsers/Objects/FByteBulkData.cs @@ -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; } } } diff --git a/FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs b/FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs new file mode 100644 index 00000000..e7f638f2 --- /dev/null +++ b/FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs @@ -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); + } + } + } +} diff --git a/FModel/Windows/SoundPlayer/NVorbisSource.cs b/FModel/Windows/SoundPlayer/NVorbisSource.cs index 69a8e3bb..2eac2611 100644 --- a/FModel/Windows/SoundPlayer/NVorbisSource.cs +++ b/FModel/Windows/SoundPlayer/NVorbisSource.cs @@ -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; } }