Optimize repetitive code in dicformat.

This commit is contained in:
2019-03-22 21:25:45 +00:00
parent 0ce664f9ee
commit dd6d009a42
2 changed files with 95 additions and 58 deletions

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ContentModelStore"> <component name="ContentModelStore">
<e p="$APPLICATION_CONFIG_DIR$/consoles/db" t="IncludeRecursive" />
<e p="$APPLICATION_CONFIG_DIR$/extensions" t="IncludeRecursive" /> <e p="$APPLICATION_CONFIG_DIR$/extensions" t="IncludeRecursive" />
<e p="$USER_HOME$/.Rider2018.3/system/extResources" t="IncludeRecursive" /> <e p="$USER_HOME$/.Rider2018.3/system/extResources" t="IncludeRecursive" />
<e p="$USER_HOME$/.Rider2018.3/system/resharper-host/local/Transient/ReSharperHost/v183/SolutionCaches/_DiscImageChef.-1491758497.00" t="ExcludeRecursive" /> <e p="$USER_HOME$/.Rider2018.3/system/resharper-host/local/Transient/ReSharperHost/v183/SolutionCaches/_DiscImageChef.-1491758497.00" t="ExcludeRecursive" />

View File

@@ -58,7 +58,8 @@ namespace DiscImageChef.DiscImages
{ {
public bool Open(IFilter imageFilter) public bool Open(IFilter imageFilter)
{ {
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
imageStream = imageFilter.GetDataForkStream(); imageStream = imageFilter.GetDataForkStream();
imageStream.Seek(0, SeekOrigin.Begin); imageStream.Seek(0, SeekOrigin.Begin);
@@ -75,7 +76,8 @@ namespace DiscImageChef.DiscImages
imageInfo.ApplicationVersion = $"{header.applicationMajorVersion}.{header.applicationMinorVersion}"; imageInfo.ApplicationVersion = $"{header.applicationMajorVersion}.{header.applicationMinorVersion}";
imageInfo.Version = $"{header.imageMajorVersion}.{header.imageMinorVersion}"; imageInfo.Version = $"{header.imageMajorVersion}.{header.imageMinorVersion}";
imageInfo.MediaType = header.mediaType; imageInfo.MediaType = header.mediaType;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Read the index header // Read the index header
imageStream.Position = (long)header.indexOffset; imageStream.Position = (long)header.indexOffset;
@@ -87,7 +89,8 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Index at {0} contains {1} entries", DicConsole.DebugWriteLine("DiscImageChef format plugin", "Index at {0} contains {1} entries",
header.indexOffset, idxHeader.entries); header.indexOffset, idxHeader.entries);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Fill in-memory index // Fill in-memory index
index = new List<IndexEntry>(); index = new List<IndexEntry>();
@@ -101,7 +104,9 @@ namespace DiscImageChef.DiscImages
entry.dataType, entry.offset); entry.dataType, entry.offset);
index.Add(entry); index.Add(entry);
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
imageInfo.ImageSize = 0; imageInfo.ImageSize = 0;
@@ -152,7 +157,8 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Found data block type {0} at position {1}", entry.dataType, "Found data block type {0} at position {1}", entry.dataType,
entry.offset); entry.offset);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Decompress media tag // Decompress media tag
if(blockHeader.compression == CompressionType.Lzma || blockHeader.compression == if(blockHeader.compression == CompressionType.Lzma || blockHeader.compression ==
@@ -186,13 +192,15 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Took {0} seconds to decompress block", "Took {0} seconds to decompress block",
(endDecompress - startDecompress).TotalSeconds); (endDecompress - startDecompress).TotalSeconds);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
} }
else if(blockHeader.compression == CompressionType.None) else if(blockHeader.compression == CompressionType.None)
{ {
data = new byte[blockHeader.length]; data = new byte[blockHeader.length];
imageStream.Read(data, 0, (int)blockHeader.length); imageStream.Read(data, 0, (int)blockHeader.length);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
} }
else else
{ {
@@ -228,7 +236,8 @@ namespace DiscImageChef.DiscImages
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case DataType.CdSectorSuffix: case DataType.CdSectorSuffix:
case DataType.CdSectorSuffixCorrected: case DataType.CdSectorSuffixCorrected:
@@ -249,13 +258,15 @@ namespace DiscImageChef.DiscImages
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEccQ);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc)) if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case DataType.CdSectorSubchannel: case DataType.CdSectorSubchannel:
sectorSubchannel = data; sectorSubchannel = data;
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case DataType.AppleProfileTag: case DataType.AppleProfileTag:
case DataType.AppleSonyTag: case DataType.AppleSonyTag:
@@ -263,11 +274,13 @@ namespace DiscImageChef.DiscImages
sectorSubchannel = data; sectorSubchannel = data;
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.AppleSectorTag)) if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.AppleSectorTag))
imageInfo.ReadableSectorTags.Add(SectorTagType.AppleSectorTag); imageInfo.ReadableSectorTags.Add(SectorTagType.AppleSectorTag);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case DataType.CompactDiscMode2Subheader: case DataType.CompactDiscMode2Subheader:
mode2Subheaders = data; mode2Subheaders = data;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
default: default:
MediaTagType mediaTagType = GetMediaTagTypeForDataType(blockHeader.type); MediaTagType mediaTagType = GetMediaTagTypeForDataType(blockHeader.type);
@@ -282,25 +295,26 @@ namespace DiscImageChef.DiscImages
} }
mediaTags.Add(mediaTagType, data); mediaTags.Add(mediaTagType, data);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
} }
break; break;
case BlockType.DeDuplicationTable: case BlockType.DeDuplicationTable:
// Only user data deduplication tables are used right now structureBytes = new byte[Marshal.SizeOf<DdtHeader>()];
imageStream.Read(structureBytes, 0, structureBytes.Length);
DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian<DdtHeader>(structureBytes);
imageInfo.ImageSize += ddtHeader.cmpLength;
if(ddtHeader.identifier != BlockType.DeDuplicationTable) break;
if(entry.dataType == DataType.UserData) if(entry.dataType == DataType.UserData)
{ {
structureBytes = new byte[Marshal.SizeOf<DdtHeader>()];
imageStream.Read(structureBytes, 0, structureBytes.Length);
DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian<DdtHeader>(structureBytes);
imageInfo.ImageSize += ddtHeader.cmpLength;
if(ddtHeader.identifier != BlockType.DeDuplicationTable) break;
imageInfo.Sectors = ddtHeader.entries; imageInfo.Sectors = ddtHeader.entries;
shift = ddtHeader.shift; shift = ddtHeader.shift;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Check for DDT compression // Check for DDT compression
switch(ddtHeader.compression) switch(ddtHeader.compression)
@@ -324,12 +338,14 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Took {0} seconds to decompress DDT", "Took {0} seconds to decompress DDT",
(ddtEnd - ddtStart).TotalSeconds); (ddtEnd - ddtStart).TotalSeconds);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
break; break;
case CompressionType.None: case CompressionType.None:
inMemoryDdt = false; inMemoryDdt = false;
outMemoryDdtPosition = (long)entry.offset; outMemoryDdtPosition = (long)entry.offset;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
break; break;
default: default:
throw new throw new
@@ -341,16 +357,10 @@ namespace DiscImageChef.DiscImages
else if(entry.dataType == DataType.CdSectorPrefixCorrected || else if(entry.dataType == DataType.CdSectorPrefixCorrected ||
entry.dataType == DataType.CdSectorSuffixCorrected) entry.dataType == DataType.CdSectorSuffixCorrected)
{ {
structureBytes = new byte[Marshal.SizeOf<DdtHeader>()];
imageStream.Read(structureBytes, 0, structureBytes.Length);
DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian<DdtHeader>(structureBytes);
imageInfo.ImageSize += ddtHeader.cmpLength;
if(ddtHeader.identifier != BlockType.DeDuplicationTable) break;
uint[] cdDdt = new uint[ddtHeader.entries]; uint[] cdDdt = new uint[ddtHeader.entries];
byte[] decompressedDdt = new byte[ddtHeader.length]; byte[] decompressedDdt = new byte[ddtHeader.length];
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Check for DDT compression // Check for DDT compression
switch(ddtHeader.compression) switch(ddtHeader.compression)
@@ -371,11 +381,13 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Took {0} seconds to decompress DDT", "Took {0} seconds to decompress DDT",
(ddtEnd - ddtStart).TotalSeconds); (ddtEnd - ddtStart).TotalSeconds);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
break; break;
case CompressionType.None: case CompressionType.None:
imageStream.Read(decompressedDdt, 0, decompressedDdt.Length); imageStream.Read(decompressedDdt, 0, decompressedDdt.Length);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
break; break;
default: default:
throw new throw new
@@ -386,7 +398,8 @@ namespace DiscImageChef.DiscImages
if(entry.dataType == DataType.CdSectorPrefixCorrected) sectorPrefixDdt = cdDdt; if(entry.dataType == DataType.CdSectorPrefixCorrected) sectorPrefixDdt = cdDdt;
else if(entry.dataType == DataType.CdSectorSuffixCorrected) sectorSuffixDdt = cdDdt; else if(entry.dataType == DataType.CdSectorSuffixCorrected) sectorSuffixDdt = cdDdt;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
} }
break; break;
@@ -404,7 +417,8 @@ namespace DiscImageChef.DiscImages
imageInfo.Cylinders = geometryBlock.cylinders; imageInfo.Cylinders = geometryBlock.cylinders;
imageInfo.Heads = geometryBlock.heads; imageInfo.Heads = geometryBlock.heads;
imageInfo.SectorsPerTrack = geometryBlock.sectorsPerTrack; imageInfo.SectorsPerTrack = geometryBlock.sectorsPerTrack;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
} }
break; break;
@@ -575,7 +589,8 @@ namespace DiscImageChef.DiscImages
imageInfo.DriveFirmwareRevision); imageInfo.DriveFirmwareRevision);
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
// Optical disc tracks block // Optical disc tracks block
case BlockType.TracksBlock: case BlockType.TracksBlock:
@@ -636,7 +651,8 @@ namespace DiscImageChef.DiscImages
imageInfo.HasPartitions = true; imageInfo.HasPartitions = true;
imageInfo.HasSessions = true; imageInfo.HasSessions = true;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
// CICM XML metadata block // CICM XML metadata block
case BlockType.CicmBlock: case BlockType.CicmBlock:
@@ -648,7 +664,8 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Found CICM XML metadata block at position {0}", entry.offset); "Found CICM XML metadata block at position {0}", entry.offset);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
byte[] cicmBytes = new byte[cicmBlock.length]; byte[] cicmBytes = new byte[cicmBlock.length];
imageStream.Read(cicmBytes, 0, cicmBytes.Length); imageStream.Read(cicmBytes, 0, cicmBytes.Length);
@@ -667,7 +684,8 @@ namespace DiscImageChef.DiscImages
CicmMetadata = null; CicmMetadata = null;
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
// Dump hardware block // Dump hardware block
case BlockType.DumpHardwareBlock: case BlockType.DumpHardwareBlock:
@@ -679,7 +697,8 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", DicConsole.DebugWriteLine("DiscImageChef format plugin",
"Found dump hardware block at position {0}", entry.offset); "Found dump hardware block at position {0}", entry.offset);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
structureBytes = new byte[dumpBlock.length]; structureBytes = new byte[dumpBlock.length];
imageStream.Read(structureBytes, 0, structureBytes.Length); imageStream.Read(structureBytes, 0, structureBytes.Length);
@@ -789,7 +808,8 @@ namespace DiscImageChef.DiscImages
} }
if(DumpHardware.Count == 0) DumpHardware = null; if(DumpHardware.Count == 0) DumpHardware = null;
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
} }
} }
@@ -802,6 +822,8 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Image last written on {0}", DicConsole.DebugWriteLine("DiscImageChef format plugin", "Image last written on {0}",
imageInfo.LastModificationTime); imageInfo.LastModificationTime);
imageInfo.XmlMediaType = GetXmlMediaType(header.mediaType);
if(geometryBlock.identifier != BlockType.GeometryBlock && imageInfo.XmlMediaType == XmlMediaType.BlockMedia) if(geometryBlock.identifier != BlockType.GeometryBlock && imageInfo.XmlMediaType == XmlMediaType.BlockMedia)
{ {
imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63);
@@ -809,21 +831,23 @@ namespace DiscImageChef.DiscImages
imageInfo.SectorsPerTrack = 63; imageInfo.SectorsPerTrack = 63;
} }
imageInfo.XmlMediaType = GetXmlMediaType(header.mediaType);
imageInfo.ReadableMediaTags.AddRange(mediaTags.Keys); imageInfo.ReadableMediaTags.AddRange(mediaTags.Keys);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Initialize caches // Initialize caches
blockCache = new Dictionary<ulong, byte[]>(); blockCache = new Dictionary<ulong, byte[]>();
blockHeaderCache = new Dictionary<ulong, BlockHeader>(); blockHeaderCache = new Dictionary<ulong, BlockHeader>();
currentCacheSize = 0; currentCacheSize = 0;
if(!inMemoryDdt) ddtEntryCache = new Dictionary<ulong, ulong>(); if(!inMemoryDdt) ddtEntryCache = new Dictionary<ulong, ulong>();
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
// Initialize tracks, sessions and partitions // Initialize tracks, sessions and partitions
if(imageInfo.XmlMediaType == XmlMediaType.OpticalDisc) if(imageInfo.XmlMediaType == XmlMediaType.OpticalDisc)
{ {
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
if(Tracks == null || Tracks.Count == 0) if(Tracks == null || Tracks.Count == 0)
{ {
Tracks = new List<Track> Tracks = new List<Track>
@@ -846,7 +870,9 @@ namespace DiscImageChef.DiscImages
trackFlags = new Dictionary<byte, byte> {{1, (byte)CdFlags.DataTrack}}; trackFlags = new Dictionary<byte, byte> {{1, (byte)CdFlags.DataTrack}};
trackIsrcs = new Dictionary<byte, string>(); trackIsrcs = new Dictionary<byte, string>();
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
Sessions = new List<Session>(); Sessions = new List<Session>();
for(int i = 1; i <= Tracks.Max(t => t.TrackSession); i++) for(int i = 1; i <= Tracks.Max(t => t.TrackSession); i++)
@@ -859,7 +885,8 @@ namespace DiscImageChef.DiscImages
Tracks.Where(t => t.TrackSession == i).Min(t => t.TrackStartSector), Tracks.Where(t => t.TrackSession == i).Min(t => t.TrackStartSector),
EndSector = Tracks.Where(t => t.TrackSession == i).Max(t => t.TrackEndSector) EndSector = Tracks.Where(t => t.TrackSession == i).Max(t => t.TrackEndSector)
}); });
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
ulong currentTrackOffset = 0; ulong currentTrackOffset = 0;
Partitions = new List<Partition>(); Partitions = new List<Partition>();
@@ -880,7 +907,9 @@ namespace DiscImageChef.DiscImages
currentTrackOffset += (track.TrackEndSector - track.TrackStartSector + 1) * currentTrackOffset += (track.TrackEndSector - track.TrackStartSector + 1) *
(ulong)track.TrackBytesPerSector; (ulong)track.TrackBytesPerSector;
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
Track[] tracks = Tracks.ToArray(); Track[] tracks = Tracks.ToArray();
for(int i = 0; i < tracks.Length; i++) for(int i = 0; i < tracks.Length; i++)
@@ -899,10 +928,13 @@ namespace DiscImageChef.DiscImages
tracks[i].TrackSubchannelFilter = tracks[i].TrackFilter; tracks[i].TrackSubchannelFilter = tracks[i].TrackFilter;
tracks[i].TrackSubchannelType = TrackSubchannelType.Raw; tracks[i].TrackSubchannelType = TrackSubchannelType.Raw;
} }
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false));
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
Tracks = tracks.ToList(); Tracks = tracks.ToList();
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
} }
else else
{ {
@@ -915,7 +947,8 @@ namespace DiscImageChef.DiscImages
if(sectorSuffixDdt != null) EccInit(); if(sectorSuffixDdt != null) EccInit();
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
return true; return true;
} }
@@ -958,13 +991,15 @@ namespace DiscImageChef.DiscImages
blockHeader = Marshal.SpanToStructureLittleEndian<BlockHeader>(structureBytes); blockHeader = Marshal.SpanToStructureLittleEndian<BlockHeader>(structureBytes);
// Decompress block // Decompress block
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
switch(blockHeader.compression) switch(blockHeader.compression)
{ {
case CompressionType.None: case CompressionType.None:
block = new byte[blockHeader.length]; block = new byte[blockHeader.length];
imageStream.Read(block, 0, (int)blockHeader.length); imageStream.Read(block, 0, (int)blockHeader.length);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case CompressionType.Lzma: case CompressionType.Lzma:
byte[] compressedBlock = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; byte[] compressedBlock = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH];
@@ -977,7 +1012,8 @@ namespace DiscImageChef.DiscImages
lzmaBlock.Read(block, 0, (int)blockHeader.length); lzmaBlock.Read(block, 0, (int)blockHeader.length);
lzmaBlock.Close(); lzmaBlock.Close();
compressedBlockMs.Close(); compressedBlockMs.Close();
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
case CompressionType.Flac: case CompressionType.Flac:
byte[] flacBlock = new byte[blockHeader.cmpLength]; byte[] flacBlock = new byte[blockHeader.cmpLength];
@@ -990,7 +1026,8 @@ namespace DiscImageChef.DiscImages
flakeReader.Read(audioBuffer, samples); flakeReader.Read(audioBuffer, samples);
flakeReader.Close(); flakeReader.Close();
flacMs.Close(); flacMs.Close();
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
break; break;
default: default:
throw new throw new
@@ -1012,7 +1049,8 @@ namespace DiscImageChef.DiscImages
sector = new byte[blockHeader.sectorSize]; sector = new byte[blockHeader.sectorSize];
Array.Copy(block, (long)(offset * blockHeader.sectorSize), sector, 0, blockHeader.sectorSize); Array.Copy(block, (long)(offset * blockHeader.sectorSize), sector, 0, blockHeader.sectorSize);
DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); DicConsole.DebugWriteLine("DiscImageChef format plugin", "Memory snapshot: {0} bytes",
GC.GetTotalMemory(false));
return sector; return sector;
} }