From aca0c78bad240b58d04b3140c3cc448818b48557 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 21 Jun 2020 22:30:07 +0100 Subject: [PATCH] Enable generation of RAW CD sectors from images that do only contains them cooked. Fixes #301 --- .idea/.idea.Aaru/.idea/contentModel.xml | 1 + Aaru.Decoders | 2 +- Aaru.Images/Alcohol120/Read.cs | 3 + Aaru.Images/CDRDAO/CDRDAO.cs | 21 +++-- Aaru.Images/CDRDAO/Read.cs | 106 +++++++++++++++++++++--- Aaru.Images/CDRWin/CDRWin.cs | 11 ++- Aaru.Images/CDRWin/Read.cs | 83 +++++++++++++++++++ Aaru.Images/CHD/CHD.cs | 16 ++-- Aaru.Images/CHD/Read.cs | 53 ++++++++++++ Aaru.Images/DiscJuggler/DiscJuggler.cs | 11 ++- Aaru.Images/DiscJuggler/Read.cs | 41 +++++++++ Aaru.Images/GDI/GDI.cs | 21 +++-- Aaru.Images/GDI/Read.cs | 25 ++++++ Aaru.Images/Nero/Nero.cs | 3 + Aaru.Images/Nero/Read.cs | 61 ++++++++++++++ 15 files changed, 404 insertions(+), 54 deletions(-) diff --git a/.idea/.idea.Aaru/.idea/contentModel.xml b/.idea/.idea.Aaru/.idea/contentModel.xml index 0f893557f..c3fb8d7f6 100644 --- a/.idea/.idea.Aaru/.idea/contentModel.xml +++ b/.idea/.idea.Aaru/.idea/contentModel.xml @@ -458,6 +458,7 @@ + diff --git a/Aaru.Decoders b/Aaru.Decoders index deadd0808..5227412e6 160000 --- a/Aaru.Decoders +++ b/Aaru.Decoders @@ -1 +1 @@ -Subproject commit deadd0808a3a2cf823290b2152a4f8e340b37ad1 +Subproject commit 5227412e6935a6165f633761aa7fc2f86ede4b92 diff --git a/Aaru.Images/Alcohol120/Read.cs b/Aaru.Images/Alcohol120/Read.cs index 63813170a..3b74806a2 100644 --- a/Aaru.Images/Alcohol120/Read.cs +++ b/Aaru.Images/Alcohol120/Read.cs @@ -575,6 +575,9 @@ namespace Aaru.DiscImages if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader)) + imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader); + if(imageInfo.SectorSize < 2336) imageInfo.SectorSize = 2336; diff --git a/Aaru.Images/CDRDAO/CDRDAO.cs b/Aaru.Images/CDRDAO/CDRDAO.cs index f8906bc5c..f3b554dd5 100644 --- a/Aaru.Images/CDRDAO/CDRDAO.cs +++ b/Aaru.Images/CDRDAO/CDRDAO.cs @@ -35,6 +35,7 @@ using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; namespace Aaru.DiscImages { @@ -42,11 +43,12 @@ namespace Aaru.DiscImages // TODO: Doesn't support silences that are not in files public partial class Cdrdao : IWritableOpticalImage { - IFilter cdrdaoFilter; - StreamWriter descriptorStream; - CdrdaoDisc discimage; - ImageInfo imageInfo; - Stream imageStream; + SectorBuilder _sectorBuilder; + IFilter cdrdaoFilter; + StreamWriter descriptorStream; + CdrdaoDisc discimage; + ImageInfo imageInfo; + Stream imageStream; /// Dictionary, index is track #, value is TrackFile Dictionary offsetmap; bool separateTracksWriting; @@ -60,12 +62,9 @@ namespace Aaru.DiscImages public Cdrdao() => imageInfo = new ImageInfo { ReadableSectorTags = new List(), ReadableMediaTags = new List(), - HasPartitions = true, HasSessions = true, Version = null, - ApplicationVersion = null, - MediaTitle = null, Creator = null, MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, - DriveManufacturer = null, + HasPartitions = true, HasSessions = true, Version = null, ApplicationVersion = null, + MediaTitle = null, Creator = null, MediaManufacturer = null, MediaModel = null, + MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null }; } diff --git a/Aaru.Images/CDRDAO/Read.cs b/Aaru.Images/CDRDAO/Read.cs index 22e7adf39..668cacb5d 100644 --- a/Aaru.Images/CDRDAO/Read.cs +++ b/Aaru.Images/CDRDAO/Read.cs @@ -858,6 +858,8 @@ namespace Aaru.DiscImages if(!string.IsNullOrEmpty(imageInfo.Comments)) AaruConsole.VerboseWriteLine("CDRDAO comments: {0}", imageInfo.Comments); + _sectorBuilder = new SectorBuilder(); + return true; } catch(Exception ex) @@ -1362,19 +1364,103 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } - // cdrdao audio tracks are endian swapped corresponding to Aaru - if(aaruTrack.Tracktype != CDRDAO_TRACK_TYPE_AUDIO) - return buffer; - - byte[] swapped = new byte[buffer.Length]; - - for(long i = 0; i < buffer.Length; i += 2) + switch(aaruTrack.Tracktype) { - swapped[i] = buffer[i + 1]; - swapped[i + 1] = buffer[i]; + case CDRDAO_TRACK_TYPE_MODE1: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i)); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRDAO_TRACK_TYPE_MODE2_FORM1: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 24, 2048); + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1, + (long)(sectorAddress + i)); + + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRDAO_TRACK_TYPE_MODE2_FORM2: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2324, fullSector, 24, 2324); + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form2, + (long)(sectorAddress + i)); + + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form2); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRDAO_TRACK_TYPE_MODE2: + case CDRDAO_TRACK_TYPE_MODE2_MIX: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless, + (long)(sectorAddress + i)); + + Array.Copy(buffer, i * 2336, fullSector, 16, 2336); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + + // cdrdao audio tracks are endian swapped corresponding to Aaru + case CDRDAO_TRACK_TYPE_AUDIO: + { + byte[] swapped = new byte[buffer.Length]; + + for(long i = 0; i < buffer.Length; i += 2) + { + swapped[i] = buffer[i + 1]; + swapped[i + 1] = buffer[i]; + } + + buffer = swapped; + + break; + } } - return swapped; + return buffer; } public List GetSessionTracks(Session session) => GetSessionTracks(session.SessionSequence); diff --git a/Aaru.Images/CDRWin/CDRWin.cs b/Aaru.Images/CDRWin/CDRWin.cs index 4a35a8d61..98cf82766 100644 --- a/Aaru.Images/CDRWin/CDRWin.cs +++ b/Aaru.Images/CDRWin/CDRWin.cs @@ -35,6 +35,7 @@ using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; namespace Aaru.DiscImages { @@ -49,6 +50,7 @@ namespace Aaru.DiscImages Stream _imageStream; /// Dictionary, index is track #, value is TrackFile Dictionary _offsetMap; + SectorBuilder _sectorBuilder; bool _separateTracksWriting; Dictionary _trackFlags; Dictionary _trackIsrcs; @@ -60,12 +62,9 @@ namespace Aaru.DiscImages public CdrWin() => _imageInfo = new ImageInfo { ReadableSectorTags = new List(), ReadableMediaTags = new List(), - HasPartitions = true, HasSessions = true, Version = null, - ApplicationVersion = null, - MediaTitle = null, Creator = null, MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, - DriveManufacturer = null, + HasPartitions = true, HasSessions = true, Version = null, ApplicationVersion = null, + MediaTitle = null, Creator = null, MediaManufacturer = null, MediaModel = null, + MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null }; } diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 4d248b316..4208a3d58 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -45,6 +45,7 @@ using Aaru.Console; using Aaru.Decoders.CD; using Schemas; using Session = Aaru.CommonTypes.Structs.Session; +using TrackType = Aaru.CommonTypes.Enums.TrackType; namespace Aaru.DiscImages { @@ -1326,6 +1327,8 @@ namespace Aaru.DiscImages if(!string.IsNullOrEmpty(_imageInfo.Comments)) AaruConsole.VerboseWriteLine("CDRWIN comments: {0}", _imageInfo.Comments); + _sectorBuilder = new SectorBuilder(); + return true; } catch(Exception ex) @@ -1849,6 +1852,86 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } + switch(aaruTrack.TrackType) + { + case CDRWIN_TRACK_TYPE_MODE1: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i)); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRWIN_TRACK_TYPE_MODE2_FORM1: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 24, 2048); + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1, + (long)(sectorAddress + i)); + + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRWIN_TRACK_TYPE_MODE2_FORM2: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2324, fullSector, 24, 2324); + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form2, + (long)(sectorAddress + i)); + + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form2); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case CDRWIN_TRACK_TYPE_MODE2_FORMLESS: + case CDRWIN_TRACK_TYPE_CDI: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless, + (long)(sectorAddress + i)); + + Array.Copy(buffer, i * 2336, fullSector, 16, 2336); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + } + return buffer; } diff --git a/Aaru.Images/CHD/CHD.cs b/Aaru.Images/CHD/CHD.cs index ccf370d0c..ad3315c21 100644 --- a/Aaru.Images/CHD/CHD.cs +++ b/Aaru.Images/CHD/CHD.cs @@ -36,6 +36,7 @@ using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; namespace Aaru.DiscImages { @@ -47,6 +48,7 @@ namespace Aaru.DiscImages { 0x4D, 0x43, 0x6F, 0x6D, 0x70, 0x72, 0x48, 0x44 }; + SectorBuilder _sectorBuilder; uint bytesPerHunk; byte[] cis; byte[] expectedChecksum; @@ -77,15 +79,11 @@ namespace Aaru.DiscImages public Chd() => imageInfo = new ImageInfo { - ReadableSectorTags = new List(), ReadableMediaTags = new List(), - HasPartitions = false, HasSessions = false, Application = "MAME", - Creator = null, - Comments = null, MediaManufacturer = null, MediaModel = null, - MediaSerialNumber = null, - MediaBarcode = null, MediaPartNumber = null, MediaSequence = 0, - LastMediaSequence = 0, - DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, - DriveFirmwareRevision = null + ReadableSectorTags = new List(), ReadableMediaTags = new List(), + HasPartitions = false, HasSessions = false, Application = "MAME", Creator = null, + Comments = null, MediaManufacturer = null, MediaModel = null, MediaSerialNumber = null, + MediaBarcode = null, MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, + DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null }; } } \ No newline at end of file diff --git a/Aaru.Images/CHD/Read.cs b/Aaru.Images/CHD/Read.cs index 748eb7815..e8fc5b6ee 100644 --- a/Aaru.Images/CHD/Read.cs +++ b/Aaru.Images/CHD/Read.cs @@ -1237,6 +1237,8 @@ namespace Aaru.DiscImages if(cis != null) imageInfo.MediaType = MediaType.PCCardTypeI; + _sectorBuilder = new SectorBuilder(); + return true; } @@ -1704,6 +1706,57 @@ namespace Aaru.DiscImages else Array.Copy(sector, 0, buffer, 0, track.TrackRawBytesPerSector); + switch(track.TrackType) + { + case TrackType.CdMode1 when track.TrackRawBytesPerSector == 2048: + { + byte[] fullSector = new byte[2352]; + + Array.Copy(buffer, 0, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)sectorAddress); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + + buffer = fullSector; + + break; + } + case TrackType.CdMode2Form1 when track.TrackRawBytesPerSector == 2048: + { + byte[] fullSector = new byte[2352]; + + Array.Copy(buffer, 0, fullSector, 24, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1, (long)sectorAddress); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1); + + buffer = fullSector; + + break; + } + case TrackType.CdMode2Form1 when track.TrackRawBytesPerSector == 2324: + { + byte[] fullSector = new byte[2352]; + + Array.Copy(buffer, 0, fullSector, 24, 2324); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form2, (long)sectorAddress); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form2); + + buffer = fullSector; + + break; + } + case TrackType.CdMode2Formless when track.TrackRawBytesPerSector == 2336: + { + byte[] fullSector = new byte[2352]; + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless, (long)sectorAddress); + Array.Copy(buffer, 0, fullSector, 16, 2336); + + buffer = fullSector; + + break; + } + } + return buffer; } diff --git a/Aaru.Images/DiscJuggler/DiscJuggler.cs b/Aaru.Images/DiscJuggler/DiscJuggler.cs index 29dc38aa8..ef4cf2fd9 100644 --- a/Aaru.Images/DiscJuggler/DiscJuggler.cs +++ b/Aaru.Images/DiscJuggler/DiscJuggler.cs @@ -35,6 +35,7 @@ using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; namespace Aaru.DiscImages { @@ -42,6 +43,7 @@ namespace Aaru.DiscImages // TODO: Too many unknowns to make this writable public partial class DiscJuggler : IOpticalMediaImage { + SectorBuilder _sectorBuilder; byte[] cdtext; ImageInfo imageInfo; Stream imageStream; @@ -51,12 +53,9 @@ namespace Aaru.DiscImages public DiscJuggler() => imageInfo = new ImageInfo { ReadableSectorTags = new List(), ReadableMediaTags = new List(), - HasPartitions = true, HasSessions = true, Version = null, - ApplicationVersion = null, - MediaTitle = null, Creator = null, MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, - DriveManufacturer = null, + HasPartitions = true, HasSessions = true, Version = null, ApplicationVersion = null, + MediaTitle = null, Creator = null, MediaManufacturer = null, MediaModel = null, + MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null }; } diff --git a/Aaru.Images/DiscJuggler/Read.cs b/Aaru.Images/DiscJuggler/Read.cs index 6bdcfe784..7c2925345 100644 --- a/Aaru.Images/DiscJuggler/Read.cs +++ b/Aaru.Images/DiscJuggler/Read.cs @@ -712,6 +712,8 @@ namespace Aaru.DiscImages imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.XmlMediaType = XmlMediaType.OpticalDisc; + _sectorBuilder = new SectorBuilder(); + return true; } @@ -1218,6 +1220,45 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } + switch(aaruTrack.TrackType) + { + case TrackType.CdMode1 when aaruTrack.TrackRawBytesPerSector == 2048: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i)); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case TrackType.CdMode2Formless when aaruTrack.TrackRawBytesPerSector == 2336: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless, + (long)(sectorAddress + i)); + + Array.Copy(buffer, i * 2336, fullSector, 16, 2336); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + } + return buffer; } diff --git a/Aaru.Images/GDI/GDI.cs b/Aaru.Images/GDI/GDI.cs index aa3fd5a20..fa229a07a 100644 --- a/Aaru.Images/GDI/GDI.cs +++ b/Aaru.Images/GDI/GDI.cs @@ -35,6 +35,7 @@ using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; namespace Aaru.DiscImages { @@ -42,23 +43,21 @@ namespace Aaru.DiscImages // TODO: This format doesn't support to specify pregaps that are included in the file (like Redump ones) public partial class Gdi : IOpticalMediaImage { - ulong densitySeparationSectors; - GdiDisc discimage; - StreamReader gdiStream; - ImageInfo imageInfo; - Stream imageStream; + SectorBuilder _sectorBuilder; + ulong densitySeparationSectors; + GdiDisc discimage; + StreamReader gdiStream; + ImageInfo imageInfo; + Stream imageStream; /// Dictionary, index is track #, value is track number, or 0 if a TOC Dictionary offsetmap; public Gdi() => imageInfo = new ImageInfo { ReadableSectorTags = new List(), ReadableMediaTags = new List(), - HasPartitions = true, HasSessions = true, Version = null, - ApplicationVersion = null, - MediaTitle = null, Creator = null, MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, - DriveManufacturer = null, + HasPartitions = true, HasSessions = true, Version = null, ApplicationVersion = null, + MediaTitle = null, Creator = null, MediaManufacturer = null, MediaModel = null, + MediaPartNumber = null, MediaSequence = 0, LastMediaSequence = 0, DriveManufacturer = null, DriveModel = null, DriveSerialNumber = null, DriveFirmwareRevision = null }; } diff --git a/Aaru.Images/GDI/Read.cs b/Aaru.Images/GDI/Read.cs index 71db9fefc..7ad80a61d 100644 --- a/Aaru.Images/GDI/Read.cs +++ b/Aaru.Images/GDI/Read.cs @@ -41,6 +41,8 @@ using Aaru.CommonTypes.Exceptions; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Console; +using Aaru.Decoders.CD; +using Session = Aaru.CommonTypes.Structs.Session; namespace Aaru.DiscImages { @@ -303,6 +305,8 @@ namespace Aaru.DiscImages AaruConsole.VerboseWriteLine("GDI image describes a disc of type {0}", imageInfo.MediaType); + _sectorBuilder = new SectorBuilder(); + return true; } catch(Exception ex) @@ -794,6 +798,27 @@ namespace Aaru.DiscImages } } + switch(aaruTrack.Tracktype) + { + case TrackType.CdMode1 when aaruTrack.Bps == 2048: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i)); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + } + return buffer; } diff --git a/Aaru.Images/Nero/Nero.cs b/Aaru.Images/Nero/Nero.cs index 2adb27af8..b9f456fcb 100644 --- a/Aaru.Images/Nero/Nero.cs +++ b/Aaru.Images/Nero/Nero.cs @@ -37,6 +37,8 @@ using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; +using Aaru.Decoders.CD; +using Session = Aaru.CommonTypes.Structs.Session; #pragma warning disable 414 #pragma warning disable 169 @@ -67,6 +69,7 @@ namespace Aaru.DiscImages readonly Dictionary offsetmap; Dictionary trackIsrCs; byte[] upc; + SectorBuilder _sectorBuilder; public Nero() { diff --git a/Aaru.Images/Nero/Read.cs b/Aaru.Images/Nero/Read.cs index 357526cad..910f6c258 100644 --- a/Aaru.Images/Nero/Read.cs +++ b/Aaru.Images/Nero/Read.cs @@ -1088,6 +1088,8 @@ namespace Aaru.DiscImages imageInfo.XmlMediaType = XmlMediaType.OpticalDisc; AaruConsole.VerboseWriteLine("Nero image contains a disc of type {0}", imageInfo.MediaType); + _sectorBuilder = new SectorBuilder(); + return true; } catch @@ -1641,6 +1643,65 @@ namespace Aaru.DiscImages Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize); } + switch((DaoMode)aaruTrack.Mode) + { + case DaoMode.Data: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 16, 2048); + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i)); + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case DaoMode.DataM2F1: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + Array.Copy(buffer, i * 2048, fullSector, 24, 2048); + + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1, + (long)(sectorAddress + i)); + + _sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + case DaoMode.DataM2F2: + { + byte[] fullSector = new byte[2352]; + byte[] fullBuffer = new byte[2352 * length]; + + for(uint i = 0; i < length; i++) + { + _sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless, + (long)(sectorAddress + i)); + + Array.Copy(buffer, i * 2336, fullSector, 16, 2336); + Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352); + } + + buffer = fullBuffer; + + break; + } + } + return buffer; }