* DiscImageChef.Metadata/DiskType.cs:

* DiscImageChef.Metadata/DiscImageChef.Metadata.csproj:
	  Added method to convert DiskType to disk type and subtype
	  strings.

	* DiscImageChef.DiscImages/CDRWin.cs:
	  Added extra track information.
	Corrected ReadLong for CD+G, subchannel should never come
	  along main channel on reading.

	* DiscImageChef.DiscImages/ImagePlugin.cs:
	  Added extra track information.
	Added audio media type.

	* DiscImageChef.DiscImages/Nero.cs:
	  Added extra track information.

	* DiscImageChef.DiscImages/ZZZRawImage.cs:
	  Added support for ReadLong and a single track and session
	  for optical discs.

	* DiscImageChef.Filesystems/FFS.cs:
	* DiscImageChef.Filesystems/BFS.cs:
	* DiscImageChef.Filesystems/ODS.cs:
	* DiscImageChef.Filesystems/SysV.cs:
	* DiscImageChef.Filesystems/extFS.cs:
	* DiscImageChef.Filesystems/ProDOS.cs:
	* DiscImageChef.Filesystems/ext2FS.cs:
	* DiscImageChef.Filesystems/LisaFS.cs:
	* DiscImageChef.Filesystems/MinixFS.cs:
	* DiscImageChef.Filesystems/UNIXBFS.cs:
	* DiscImageChef.Filesystems/AppleMFS.cs:
	* DiscImageChef.Filesystems/PCEngine.cs:
	* DiscImageChef.Filesystems/AppleHFS.cs:
	* DiscImageChef.Filesystems/AmigaDOS.cs:
	* DiscImageChef.Filesystems/AppleHFSPlus.cs:
	  Completed XML information.

	* DiscImageChef.Filesystems/ISO9660.cs:
	  Corrected fail in Sega CD IP.BIN decoding.
	Corrected IP.BIN date decoding.
	Trim spaces at end of Volume Descriptor string fields.
	Completed XML information.

	* DiscImageChef/Commands/Checksum.cs:
	  Checking memory usage on each step makes checksum
	  calculation abismally slower. Removed.

	* DiscImageChef/Main.cs:
	* DiscImageChef/Options.cs:
	* DiscImageChef/DiscImageChef.csproj:
	* DiscImageChef/Commands/CreateSidecar.cs:
	  Added method for creating CICM Metadata XML sidecar.
This commit is contained in:
2015-12-06 05:09:31 +00:00
parent 564775d3f7
commit 36e12eb1a7
31 changed files with 2354 additions and 125 deletions

View File

@@ -1799,8 +1799,8 @@ namespace DiscImageChef.ImagePlugins
case CDRWinTrackTypeCDG:
{
sector_offset = 0;
sector_size = 2448;
sector_skip = 0;
sector_size = 2352;
sector_skip = 96;
break;
}
default:
@@ -1907,6 +1907,19 @@ namespace DiscImageChef.ImagePlugins
_track.TrackSession = cdr_track.session;
_track.TrackSequence = cdr_track.sequence;
_track.TrackType = CDRWinTrackTypeToTrackType(cdr_track.tracktype);
_track.TrackFile = cdr_track.trackfile.datafile;
_track.TrackFileOffset = cdr_track.trackfile.offset;
_track.TrackFileType = cdr_track.trackfile.filetype;
_track.TrackRawBytesPerSector = cdr_track.bps;
_track.TrackBytesPerSector = CDRWinTrackTypeToCookedBytesPerSector(cdr_track.tracktype);
if (cdr_track.bps == 2448)
{
_track.TrackSubchannelFile = cdr_track.trackfile.datafile;
_track.TrackSubchannelOffset = cdr_track.trackfile.offset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
}
else
_track.TrackSubchannelType = TrackSubchannelType.None;
tracks.Add(_track);
previousStartSector = _track.TrackEndSector + 1;
@@ -1943,6 +1956,19 @@ namespace DiscImageChef.ImagePlugins
_track.TrackSession = cdr_track.session;
_track.TrackSequence = cdr_track.sequence;
_track.TrackType = CDRWinTrackTypeToTrackType(cdr_track.tracktype);
_track.TrackFile = cdr_track.trackfile.datafile;
_track.TrackFileOffset = cdr_track.trackfile.offset;
_track.TrackFileType = cdr_track.trackfile.filetype;
_track.TrackRawBytesPerSector = cdr_track.bps;
_track.TrackBytesPerSector = CDRWinTrackTypeToCookedBytesPerSector(cdr_track.tracktype);
if (cdr_track.bps == 2448)
{
_track.TrackSubchannelFile = cdr_track.trackfile.datafile;
_track.TrackSubchannelOffset = cdr_track.trackfile.offset;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
}
else
_track.TrackSubchannelType = TrackSubchannelType.None;
tracks.Add(_track);
}
@@ -2078,6 +2104,30 @@ namespace DiscImageChef.ImagePlugins
}
}
static UInt16 CDRWinTrackTypeToCookedBytesPerSector(string trackType)
{
switch (trackType)
{
case CDRWinTrackTypeMode1:
case CDRWinTrackTypeMode2Form1:
case CDRWinTrackTypeMode1Raw:
return 2048;
case CDRWinTrackTypeMode2Form2:
return 2324;
case CDRWinTrackTypeMode2Formless:
case CDRWinTrackTypeCDI:
case CDRWinTrackTypeMode2Raw:
case CDRWinTrackTypeCDIRaw:
return 2336;
case CDRWinTrackTypeAudio:
return 2352;
case CDRWinTrackTypeCDG:
return 2448;
default:
return 0;
}
}
static TrackType CDRWinTrackTypeToTrackType(string trackType)
{
switch (trackType)

View File

@@ -1,3 +1,21 @@
2015-12-06 Natalia Portillo <claunia@claunia.com>
* CDRWin.cs:
Added extra track information.
Corrected ReadLong for CD+G, subchannel should never come
along main channel on reading.
* ImagePlugin.cs:
Added extra track information.
Added audio media type.
* Nero.cs:
Added extra track information.
* ZZZRawImage.cs:
Added support for ReadLong and a single track and session
for optical discs.
2015-12-05 Natalia Portillo <claunia@claunia.com>
* VHD.cs:

View File

@@ -467,6 +467,23 @@ namespace DiscImageChef.ImagePlugins
public string TrackDescription;
/// <summary>Indexes, 00 to 99 and sector offset</summary>
public Dictionary<int, UInt64> Indexes;
public string TrackFile;
public ulong TrackFileOffset;
public string TrackFileType;
public int TrackBytesPerSector;
public int TrackRawBytesPerSector;
public string TrackSubchannelFile;
public ulong TrackSubchannelOffset;
public TrackSubchannelType TrackSubchannelType;
}
public enum TrackSubchannelType
{
None,
Packed,
Raw,
PackedInterleaved,
RawInterleaved
}
/// <summary>
@@ -626,7 +643,8 @@ namespace DiscImageChef.ImagePlugins
{
OpticalDisc,
BlockMedia,
LinearMedia
LinearMedia,
AudioMedia
}
/// <summary>

View File

@@ -1533,6 +1533,55 @@ namespace DiscImageChef.ImagePlugins
_track.TrackStartSector = _neroTrack.StartLBA;
_track.TrackType = NeroTrackModeToTrackType((DAOMode)_neroTrack.Mode);
imageTracks.Add(_track);
_track.TrackFile = _imagePath;
_track.TrackFileOffset = _neroTrack.Offset;
_track.TrackFileType = "BINARY";
_track.TrackSubchannelType = TrackSubchannelType.None;
switch((DAOMode)_neroTrack.Mode)
{
case DAOMode.Audio:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DAOMode.AudioSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DAOMode.Data:
case DAOMode.DataM2F1:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2048;
break;
case DAOMode.DataM2F2:
_track.TrackBytesPerSector = 2336;
_track.TrackRawBytesPerSector = 2336;
break;
case DAOMode.DataM2Raw:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2352;
break;
case DAOMode.DataM2RawSub:
_track.TrackBytesPerSector = 2352;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
case DAOMode.DataRaw:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2352;
break;
case DAOMode.DataRawSub:
_track.TrackBytesPerSector = 2048;
_track.TrackRawBytesPerSector = 2448;
_track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
break;
}
if(_track.TrackSubchannelType == TrackSubchannelType.RawInterleaved)
{
_track.TrackSubchannelFile = _imagePath;
_track.TrackSubchannelOffset = _neroTrack.Offset;
}
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackDescription = {0}", _track.TrackDescription);
DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackEndSector = {0}", _track.TrackEndSector);

View File

@@ -398,6 +398,154 @@ namespace DiscImageChef.ImagePlugins
return null;
}
public override List<Track> GetTracks()
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackEndSector = ImageInfo.sectors - 1;
trk.TrackFile = rawImagePath;
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Track> GetSessionTracks(Session session)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (session.SessionSequence != 1)
throw new ArgumentOutOfRangeException("session", "Only a single session is supported");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackEndSector = ImageInfo.sectors - 1;
trk.TrackFile = rawImagePath;
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Track> GetSessionTracks(UInt16 session)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (session != 1)
throw new ArgumentOutOfRangeException("session", "Only a single session is supported");
Track trk = new Track();
trk.TrackBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackEndSector = ImageInfo.sectors - 1;
trk.TrackFile = rawImagePath;
trk.TrackFileOffset = 0;
trk.TrackFileType = "BINARY";
trk.TrackRawBytesPerSector = (int)ImageInfo.sectorSize;
trk.TrackSequence = 1;
trk.TrackStartSector = 0;
trk.TrackSubchannelType = TrackSubchannelType.None;
trk.TrackType = TrackType.Data;
trk.TrackSession = 1;
List<Track> lst = new List<Track>();
lst.Add(trk);
return lst;
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Session> GetSessions()
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
Session sess = new Session();
sess.EndSector = ImageInfo.sectors - 1;
sess.EndTrack = 1;
sess.SessionSequence = 1;
sess.StartSector = 0;
sess.StartTrack = 1;
List<Session> lst = new List<Session>();
lst.Add(sess);
return lst;
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSector(UInt64 sectorAddress, UInt32 track)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (track != 1)
throw new ArgumentOutOfRangeException("track", "Only a single session is supported");
return ReadSector(sectorAddress);
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectors(UInt64 sectorAddress, UInt32 length, UInt32 track)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (track != 1)
throw new ArgumentOutOfRangeException("track", "Only a single session is supported");
return ReadSectors(sectorAddress, length);
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorLong(UInt64 sectorAddress, UInt32 track)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (track != 1)
throw new ArgumentOutOfRangeException("track", "Only a single session is supported");
return ReadSector(sectorAddress);
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorsLong(UInt64 sectorAddress, UInt32 length, UInt32 track)
{
if (ImageInfo.xmlMediaType == XmlMediaType.OpticalDisc)
{
if (track != 1)
throw new ArgumentOutOfRangeException("track", "Only a single session is supported");
return ReadSectors(sectorAddress, length);
}
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
#region Private methods
DiskType CalculateDiskType()
@@ -645,56 +793,16 @@ namespace DiscImageChef.ImagePlugins
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Track> GetTracks()
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Track> GetSessionTracks(Session session)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Track> GetSessionTracks(UInt16 session)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override List<Session> GetSessions()
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSector(UInt64 sectorAddress, UInt32 track)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorTag(UInt64 sectorAddress, UInt32 track, SectorTagType tag)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectors(UInt64 sectorAddress, UInt32 length, UInt32 track)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorsTag(UInt64 sectorAddress, UInt32 length, UInt32 track, SectorTagType tag)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorLong(UInt64 sectorAddress, UInt32 track)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
public override byte[] ReadSectorsLong(UInt64 sectorAddress, UInt32 length, UInt32 track)
{
throw new FeatureUnsupportedImageException("Feature not supported by image format");
}
#endregion Unsupported features
}
}