From b3ec79b7ae4aecac63ad9209aca9fbf61f8a982e Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 3 Dec 2015 09:31:06 +0000 Subject: [PATCH] * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.CommonTypes/DiskType.cs: Added support for CD-V. * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: Added support for CD-V. Added support for CD-DA. --- DiscImageChef.CommonTypes/ChangeLog | 5 ++ DiscImageChef.CommonTypes/DiskType.cs | 2 + DiscImageChef.Decoders/CD/Enums.cs | 10 ++- DiscImageChef.Decoders/CD/FullTOC.cs | 124 +++++++++++++++++++++----- DiscImageChef.Decoders/CD/TOC.cs | 12 ++- DiscImageChef.Decoders/ChangeLog | 10 +++ DiscImageChef/ChangeLog | 5 ++ DiscImageChef/Commands/MediaInfo.cs | 10 ++- 8 files changed, 151 insertions(+), 27 deletions(-) diff --git a/DiscImageChef.CommonTypes/ChangeLog b/DiscImageChef.CommonTypes/ChangeLog index decfced16..6dfb8846e 100644 --- a/DiscImageChef.CommonTypes/ChangeLog +++ b/DiscImageChef.CommonTypes/ChangeLog @@ -1,3 +1,8 @@ +2015-12-03 Natalia Portillo + + * DiskType.cs: + Added support for CD-V. + 2015-11-24 Natalia Portillo * DiskType.cs: diff --git a/DiscImageChef.CommonTypes/DiskType.cs b/DiscImageChef.CommonTypes/DiskType.cs index d88395eae..2a27177d2 100644 --- a/DiscImageChef.CommonTypes/DiskType.cs +++ b/DiscImageChef.CommonTypes/DiskType.cs @@ -86,6 +86,8 @@ namespace DiscImageChef.CommonTypes DTSCD, /// CD-MIDI (Red Book) CDMIDI, + /// CD-Video (ISO/IEC 61104) + CDV, /// Any unknown or standard violating CD CD, diff --git a/DiscImageChef.Decoders/CD/Enums.cs b/DiscImageChef.Decoders/CD/Enums.cs index 2964328db..0f2a597c0 100644 --- a/DiscImageChef.Decoders/CD/Enums.cs +++ b/DiscImageChef.Decoders/CD/Enums.cs @@ -56,7 +56,15 @@ namespace DiscImageChef.Decoders.CD /// /// Q Sub-channel encodes the ISRC /// - ISRC = 0x03 + ISRC = 0x03, + /// + /// Q Sub-channel encodes the start of an audio/data track (if found in TOC) + /// + TrackPointer = 0x01, + /// + /// Q Sub-channel encodes the start of a video track (if found in TOC) for CD-V + /// + VideoTrackPointer = 0x04, } public enum TOC_CONTROL : byte diff --git a/DiscImageChef.Decoders/CD/FullTOC.cs b/DiscImageChef.Decoders/CD/FullTOC.cs index 815584db4..9bea3abb1 100644 --- a/DiscImageChef.Decoders/CD/FullTOC.cs +++ b/DiscImageChef.Decoders/CD/FullTOC.cs @@ -55,6 +55,8 @@ namespace DiscImageChef.Decoders.CD /// T10/1675-D revision 2c /// T10/1675-D revision 4 /// T10/1836-D revision 2g + /// ISO/IEC 61104: Compact disc video system - 12 cm CD-V + /// ISO/IEC 60908: Audio recording - Compact disc digital audio system /// public static class FullTOC { @@ -191,12 +193,14 @@ namespace DiscImageChef.Decoders.CD StringBuilder sb = new StringBuilder(); + int lastSession = 0; + sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine(); sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine(); foreach (TrackDataDescriptor descriptor in response.TrackDescriptors) { - if ((descriptor.CONTROL != 4 && descriptor.CONTROL != 6) || - (descriptor.ADR != 1 && descriptor.ADR != 5) || + if ((descriptor.CONTROL & 0x08) == 0x08 || + (descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4) || descriptor.TNO != 0) { sb.AppendLine("Unknown TOC entry format, printing values as-is"); @@ -216,30 +220,76 @@ namespace DiscImageChef.Decoders.CD } else { - sb.AppendFormat("Session {0}", descriptor.SessionNumber).AppendLine(); + if(descriptor.SessionNumber > lastSession) + { + sb.AppendFormat("Session {0}", descriptor.SessionNumber).AppendLine(); + lastSession = descriptor.SessionNumber; + } + switch (descriptor.ADR) { case 1: + case 4: { switch (descriptor.POINT) { case 0xA0: { - sb.AppendFormat("First track number: {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("Disc type: {0}", descriptor.PSEC).AppendLine(); - sb.AppendFormat("Absolute time: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if (descriptor.ADR == 4) + { + sb.AppendFormat("First video track number: {0}", descriptor.PMIN).AppendLine(); + switch (descriptor.PSEC) + { + case 0x10: + sb.AppendLine("CD-V single in NTSC format with digital stereo sound"); + break; + case 0x11: + sb.AppendLine("CD-V single in NTSC format with digital bilingual sound"); + break; + case 0x12: + sb.AppendLine("CD-V disc in NTSC format with digital stereo sound"); + break; + case 0x13: + sb.AppendLine("CD-V disc in NTSC format with digital bilingual sound"); + break; + case 0x20: + sb.AppendLine("CD-V single in PAL format with digital stereo sound"); + break; + case 0x21: + sb.AppendLine("CD-V single in PAL format with digital bilingual sound"); + break; + case 0x22: + sb.AppendLine("CD-V disc in PAL format with digital stereo sound"); + break; + case 0x23: + sb.AppendLine("CD-V disc in PAL format with digital bilingual sound"); + break; + } + } + else + { + sb.AppendFormat("First track number: {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("Disc type: {0}", descriptor.PSEC).AppendLine(); + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + } break; } case 0xA1: { - sb.AppendFormat("Last track number: {0}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("Absolute time: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if(descriptor.ADR == 4) + sb.AppendFormat("Last video track number: {0}", descriptor.PMIN).AppendLine(); + else + sb.AppendFormat("Last track number: {0}", descriptor.PMIN).AppendLine(); + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); break; } case 0xA2: { - sb.AppendFormat("Lead-out start position: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); - sb.AppendFormat("Absolute time: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if(descriptor.PHOUR > 0) + sb.AppendFormat("Lead-out start position: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + else + sb.AppendFormat("Lead-out start position: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); break; } case 0xF0: @@ -247,15 +297,26 @@ namespace DiscImageChef.Decoders.CD sb.AppendFormat("Book type: 0x{0:X2}", descriptor.PMIN); sb.AppendFormat("Material type: 0x{0:X2}", descriptor.PSEC); sb.AppendFormat("Moment of inertia: 0x{0:X2}", descriptor.PFRAME); - sb.AppendFormat("Absolute time: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if(descriptor.PHOUR > 0) + sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + else + sb.AppendFormat("Absolute time: {0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine(); break; } default: { if (descriptor.POINT >= 0x01 && descriptor.POINT <= 0x63) { - sb.AppendFormat("Track start position for track {3}: {4:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.POINT, descriptor.PHOUR).AppendLine(); - sb.AppendFormat("Absolute time: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if (descriptor.ADR == 4) + sb.AppendFormat("Track start position for video track {3}: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.POINT).AppendLine(); + else + { + if(descriptor.PHOUR > 0) + sb.AppendFormat("Track start position for track {3}: {4:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.POINT, descriptor.PHOUR).AppendLine(); + else + sb.AppendFormat("Track start position for track {3}: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.POINT).AppendLine(); + } + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); } else { @@ -283,14 +344,22 @@ namespace DiscImageChef.Decoders.CD { case 0xB0: { - sb.AppendFormat("Start of next possible program in the recordable area of the disc: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); - sb.AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + if (descriptor.PHOUR > 0) + { + sb.AppendFormat("Start of next possible program in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + sb.AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + } + else + { + sb.AppendFormat("Start of next possible program in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine(); + sb.AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); + } break; } case 0xB1: { - sb.AppendFormat("Number of skip interval pointers: {0:X2}", descriptor.PMIN).AppendLine(); - sb.AppendFormat("Number of skip track pointers: {0:X2}", descriptor.PSEC).AppendLine(); + sb.AppendFormat("Number of skip interval pointers: {0}", descriptor.PMIN).AppendLine(); + sb.AppendFormat("Number of skip track pointers: {0}", descriptor.PSEC).AppendLine(); break; } case 0xB2: @@ -309,7 +378,10 @@ namespace DiscImageChef.Decoders.CD case 0xC0: { sb.AppendFormat("Optimum recording power: 0x{0:X2}", descriptor.Min).AppendLine(); - sb.AppendFormat("Start time of the first Lead-in area in the disc: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + if (descriptor.PHOUR > 0) + sb.AppendFormat("Start time of the first Lead-in area in the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + else + sb.AppendFormat("Start time of the first Lead-in area in the disc: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); break; } case 0xC1: @@ -326,16 +398,24 @@ namespace DiscImageChef.Decoders.CD } case 0xCF: { - sb.AppendFormat("Start position of outer part lead-in area: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); - sb.AppendFormat("Stop position of inner part lead-out area: {3:X2}:{0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + if (descriptor.PHOUR > 0) + { + sb.AppendFormat("Start position of outer part lead-in area: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR).AppendLine(); + sb.AppendFormat("Stop position of inner part lead-out area: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + } + else + { + sb.AppendFormat("Start position of outer part lead-in area: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); + sb.AppendFormat("Stop position of inner part lead-out area: {0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine(); + } break; } default: { if (descriptor.POINT >= 0x01 && descriptor.POINT <= 0x40) { - sb.AppendFormat("Start time for interval that should be skipped: {0:X2}:{1:X2}:{2:X2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); - sb.AppendFormat("Ending time for interval that should be skipped: {0:X2}:{1:X2}:{2:X2}", descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine(); + sb.AppendFormat("Start time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).AppendLine(); + sb.AppendFormat("Ending time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine(); } else { diff --git a/DiscImageChef.Decoders/CD/TOC.cs b/DiscImageChef.Decoders/CD/TOC.cs index 7ff0ebea5..c5a0eb212 100644 --- a/DiscImageChef.Decoders/CD/TOC.cs +++ b/DiscImageChef.Decoders/CD/TOC.cs @@ -55,6 +55,8 @@ namespace DiscImageChef.Decoders.CD /// T10/1675-D revision 2c /// T10/1675-D revision 4 /// T10/1836-D revision 2g + /// ISO/IEC 61104: Compact disc video system - 12 cm CD-V + /// ISO/IEC 60908: Audio recording - Compact disc digital audio system /// public static class TOC { @@ -172,8 +174,11 @@ namespace DiscImageChef.Decoders.CD case TOC_ADR.NoInformation: sb.AppendLine("Q subchannel mode not given"); break; - case TOC_ADR.CurrentPosition: - sb.AppendLine("Q subchannel stores current position"); + case TOC_ADR.TrackPointer: + sb.AppendLine("Q subchannel stores track pointer"); + break; + case TOC_ADR.VideoTrackPointer: + sb.AppendLine("Q subchannel stores video track pointer"); break; case TOC_ADR.ISRC: sb.AppendLine("Q subchannel stores ISRC"); @@ -181,6 +186,9 @@ namespace DiscImageChef.Decoders.CD case TOC_ADR.MediaCatalogNumber: sb.AppendLine("Q subchannel stores media catalog number"); break; + default: + sb.AppendFormat("Q subchannel mode {0}", descriptor.ADR).AppendLine(); + break; } if((descriptor.CONTROL & (byte)TOC_CONTROL.ReservedMask) == (byte)TOC_CONTROL.ReservedMask) diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 47f26ddf5..b67578424 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,13 @@ +2015-12-03 Natalia Portillo + + * CD/TOC.cs: + * CD/FullTOC.cs: + Added support for CD-V. + Added support for CD-DA. + + * CD/Enums.cs: + Added support for CD-V. + 2015-12-03 Natalia Portillo * DVD/PFI.cs: diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 5e1ce9169..8052c8497 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2015-12-03 Natalia Portillo + + * Commands/MediaInfo.cs: + Added support for CD-V. + 2015-12-03 Natalia Portillo * Commands/MediaInfo.cs: diff --git a/DiscImageChef/Commands/MediaInfo.cs b/DiscImageChef/Commands/MediaInfo.cs index 6779b0cea..ec82f9f5e 100644 --- a/DiscImageChef/Commands/MediaInfo.cs +++ b/DiscImageChef/Commands/MediaInfo.cs @@ -747,6 +747,7 @@ namespace DiscImageChef.Commands bool hasDataTrack = false; bool hasAudioTrack = false; bool allFirstSessionTracksAreAudio = true; + bool hasVideoTrack = false; if(toc.HasValue) { @@ -767,6 +768,9 @@ namespace DiscImageChef.Commands } else hasAudioTrack = true; + + if(track.ADR == 4) + hasVideoTrack = true; } } @@ -776,6 +780,8 @@ namespace DiscImageChef.Commands dskType = DiskType.CDDA; if(hasDataTrack && !hasAudioTrack && sessions == 1) dskType = DiskType.CDROM; + if(hasVideoTrack && !hasDataTrack && sessions == 1) + dskType = DiskType.CDV; } sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 1, dev.Timeout, out duration); @@ -795,7 +801,7 @@ namespace DiscImageChef.Commands DicConsole.WriteLine("PMA:\n{0}", Decoders.CD.PMA.Prettify(cmdBuf)); } - sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out duration); + /*sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out duration); if (sense) DicConsole.ErrorWriteLine("READ TOC/PMA/ATIP: CD-TEXT\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); else @@ -803,7 +809,7 @@ namespace DiscImageChef.Commands doWriteFile(outputPrefix, "_cdtext.bin", "SCSI READ TOC/PMA/ATIP", cmdBuf); //if(Decoders.CD.CDTextOnLeadIn.Decode(cmdBuf).HasValue) // DicConsole.WriteLine("CD-TEXT on Lead-In:\n{0}", Decoders.CD.CDTextOnLeadIn.Prettify(cmdBuf)); - } + }*/ } } #endregion CDs