diff --git a/MPF.Library/DiscImageCreator/Parameters.cs b/MPF.Library/DiscImageCreator/Parameters.cs
index 898b565c..33413804 100644
--- a/MPF.Library/DiscImageCreator/Parameters.cs
+++ b/MPF.Library/DiscImageCreator/Parameters.cs
@@ -1929,24 +1929,29 @@ namespace MPF.DiscImageCreator
info.SizeAndChecksums.SHA1 = sha1;
}
- // Deal with the layerbreak
- string layerbreak = null;
+ // Deal with the layerbreaks
if (this.Type == MediaType.DVD)
- layerbreak = GetLayerbreak(basePath + "_disc.txt", xgd) ?? "";
+ {
+ string layerbreak = GetLayerbreak(basePath + "_disc.txt", xgd) ?? "";
+ info.SizeAndChecksums.Layerbreak = !string.IsNullOrEmpty(layerbreak) ? Int64.Parse(layerbreak) : default;
+ }
else if (this.Type == MediaType.BluRay)
- layerbreak = info.SizeAndChecksums.Size > 25_025_314_816 ? "25025314816" : null;
+ {
+ if (GetLayerbreak(Path.Combine(outputDirectory, "PIC.bin"), out long? layerbreak1, out long? layerbreak2, out long? layerbreak3))
+ {
+ info.SizeAndChecksums.Layerbreak = layerbreak1 ?? default;
+ info.SizeAndChecksums.Layerbreak2 = layerbreak2 ?? default;
+ info.SizeAndChecksums.Layerbreak3 = layerbreak3 ?? default;
+ }
+ else
+ {
+ string layerbreak = GetLayerbreak(basePath + "_disc.txt", xgd) ?? "";
+ info.SizeAndChecksums.Layerbreak = !string.IsNullOrEmpty(layerbreak) ? Int64.Parse(layerbreak) : default;
+ }
+ }
- // If we have a single-layer disc
- if (string.IsNullOrWhiteSpace(layerbreak))
- {
- info.Extras.PVD = GetPVD(basePath + "_mainInfo.txt") ?? "";
- }
- // If we have a dual-layer disc
- else
- {
- info.Extras.PVD = GetPVD(basePath + "_mainInfo.txt") ?? "";
- info.SizeAndChecksums.Layerbreak = Int64.Parse(layerbreak);
- }
+ // Read the PVD
+ info.Extras.PVD = GetPVD(basePath + "_mainInfo.txt") ?? "";
// Bluray-specific options
if (this.Type == MediaType.BluRay)
@@ -2819,6 +2824,63 @@ namespace MPF.DiscImageCreator
}
}
+ ///
+ /// Get the layerbreak info associated with the dump
+ ///
+ /// Path to the PIC.bin file associated with the dump
+ /// True if layerbreak info was set, false otherwise
+ /// https://stackoverflow.com/questions/9932096/add-separator-to-string-at-every-n-characters
+ private static bool GetLayerbreak(string picPath, out long? layerbreak1, out long? layerbreak2, out long? layerbreak3)
+ {
+ // Set the default values
+ layerbreak1 = null; layerbreak2 = null; layerbreak3 = null;
+
+ // If the file doesn't exist, we can't get the info
+ if (!File.Exists(picPath))
+ return false;
+
+ try
+ {
+ using (BinaryReader br = new BinaryReader(File.OpenRead(picPath)))
+ {
+ // Layerbreak 1
+ br.BaseStream.Seek(0x1C, SeekOrigin.Begin);
+ long layerbreak1Offset = br.ReadInt32();
+ long layerbreak1Value = br.ReadInt32();
+ if (layerbreak1Value != 17341438)
+ return false;
+
+ layerbreak1 = layerbreak1Value - layerbreak1Offset + 2;
+
+ // Layerbreak 2
+ br.BaseStream.Seek(0x5C, SeekOrigin.Begin);
+ long layerbreak2Offset = br.ReadInt32();
+ long layerbreak2Value = br.ReadInt32();
+ if (layerbreak2Value != 66060286)
+ return true;
+
+ layerbreak2 = layerbreak2Value - layerbreak2Offset + 2;
+
+ // TODO: Figure out the default value for layerbreak 3
+ // Layerbreak 3
+ // br.BaseStream.Seek(0x9C, SeekOrigin.Begin);
+ // long layerbreak3Offset = br.ReadInt32();
+ // long layerbreak3Value = br.ReadInt32();
+ // if (layerbreak3Value != 66060286)
+ // return true;
+
+ // layerbreak3 = layerbreak3Value - layerbreak3Offset + 2;
+
+ return true;
+ }
+ }
+ catch
+ {
+ // We don't care what the error was
+ return false;
+ }
+ }
+
///
/// Get if LibCrypt data is detected in the subchannel file, if possible
///