Projekte > Optische Laufwerke > Medieninformationen

Physikalische Formatinformationen

READ DISC STRUCTURE Command - Operation Code $AD
Physical Format Information - Format Code $00

Wenn der Format Code für die Physical Format Informationen in der Liste der unterstützten Formate aufgeführt und das RDS-Flag gesetzt ist, kann diese Information gelesen werden.

 

Command Descriptor Block

  7 6 5 4 3 2 1 0
0 Operation Code = $AD
1 Reserviert Media Type
2 Address
3
4
5
6 Layer Number
7 Format Code = $00
8 Allocation Length
9
10 AGID Reserviert
11 Control

 

Zu setzende Werte:

Operation Code: $AD - READ DISC STRUCTURE Command.

Media Type: Es gibt nur die beiden Werte 0000b für DVD und 0001b für BD. Den Type des eingelegten Mediums kann man mit dem GET CONFIGURATION Command feststellen.

Format Code: $00 - Physische Formatinformationen für das eingelegte Medium.

Address, Layer Number und AGID: Die Werte sind vom gewählten Format Code abhängig. Für den Format Code $00 sind die Felder reserviert.

Allocation Length: $FFFE - Die Länge der Antwortstruktur. Hier wird das Maximum eingetragen.

Control - ?

 

Antwortstruktur

  7 6 5 4 3 2 1 0
0 Disc Structure Data Length
1
2 Reserviert
3
  Physical Format Information
0 Disk Category/Booktype Part Version
1 Disc Size Maximum Rate
2 Reserviert Number of Layers Track Path Layer Type
3 Linear Density Track Density
4 $00
5 Starting Physical Sector Number of Data Area
6
7
8 $00
9 End Physical Sector Number of Data Area
10
11
12 $00
13 End Physical Sector Number in Layer 0
14
15
16 BCA Reserviert
17 Media Specific
..
2047

 
Disc Structure Data Length: Länge der folgenden Datenstruktur. Maximal 2045 Byte.

Disk Category: Gibt den (Book-) Typ der DVD an:

Disk Category Media
0000b DVD-ROM
0001b DVD-RAM
0010b DVD-R
0011b DVD-RW
0100b HD DVD-ROM
0101b HD DVD-RAM
0110b HD DVD-R
0111b Reserved
Disk Category Media
1000b Reserved
1001b DVD+RW
1010b DVD+R
1011b Reserved
1100b Reserved
1101b DVD+RW DL
1110b DVD+R DL
1111b Reserved

 

Disc Size: Die Größe der eingelegten DVD. Der Wert 0000b bedeutet 120 mm, 0001b 80 mm.

Maximum Rate: Maximale Lesegeschwindigkeit:

Maximum Rate Read Rate
0000b 2.52 Mbps
0001b 5.04 Mbps
0010b 10.08 Mbps
0011b 20.16 Mbps
0100b 30.24 Mbps
1111b Not Specified
Others Reserved

Number of Layers: Die Anzahl der Layer auf dieser Seite der Disk. Der Wert 00b bedeutet Single Layer und 01b Double Layer.

Track Path: Wenn das Flag gesetzt ist, ist es Opposite Track Path (OTP). Sonst Parallel Track Path (PTP).

Layer Type: Dies sind:

Bit Layer Type
0 Layer mit gegossenen Daten
1 Layer mit geschriebenen Daten
2 Layer mit wiederbeschreibbaren Daten
3 Reserviert

 

Linear Density: Gibt die minimale und maximale Länge der Pits in diesem Layer an.

Code Linear Density
0000b 0.267 µm/bit
0001b 0.293 µm/bit
0010b 0.409 to 0.435 µm/bit
0100b 0.280 to 0.291 µm/bit
0101b 0.153 µm/bit
0110b 0.130 to 0.140 µm/bit
1000b 0.353 µm/bit
Andere Reserviert

Track Density: Gibt die Spurbreite auf dem Medium an.

Code Track Density
0000b 0.74 µm/track
0001b 0.80 µm/track
0010b 0.615 µm/track
0011b 0.40 µm/track
0100b 0.34 µm/track
Andere Reserviert

 
Starting Physical Sector Number of Data Area: Der erste Sektor mit Nutzdaten. Für DVD-ROM, DVD-R Single und Double Layer, DVD-RW, DVD+R/+RW Single und Double Layer ist der Wert $30000 und für DVD-RAM $31000.

End Physical Sector Number of Data Area: Der letzte Sektor mit Nutzdaten.

End Physical Sector Number in Layer 0: Der letzte Sektor mit Nutzdaten in Layer 0.

BCA: Gibt an, ob ein Burst Cutting area vorhanden ist.

 

Deklarationen

 
  {
  *  Für die Auswertung.
  }
  type
    TPhysicalFormatInformation = record
      DataLength       : Word;
      DiskCategory     : Byte;
      PartVersion      : Byte;
      DiscSize         : Byte;
      MaximumRate      : Byte;
      NumberOfLayers   : Byte;
      TrackPath        : Boolean;
      LayerType        : Byte;
      LinearDensity    : Byte;
      TrackDensity     : Byte;
      StartSectorData  : Cardinal;
      EndSectorData    : Cardinal;
      EndSectorLayer0  : Cardinal;
      BurstCuttingArea : Boolean;
      MediaSpecific    : Array[17..2047] of Byte;
    end;
 
  {
  *  Für den Befehl.
  }
  const
    SCSIOP_READ_DISC_STRUCTURE      = $AD;
    FMT_PHYSICAL_FORMAT_INFORMATION = $00;
 
  type
    TREAD_DISC_STRUCTURE_CDB = record
      OperationCode    : Byte;
      MediaType        : Byte;
      Address          : Cardinal;
      LayerNumber      : Byte;
      Format           : Byte;
      AllocationLength : Word;
      AGID             : Byte;
      Control          : Byte;
    end;
 
  type
    TREAD_DISC_STRUCTURE_Data_Format = record
    Header : Array[$0000..$0003] of Byte;
    Data   : Array[$0000..$FFF9] of Byte;
  end;
 
          

 

Ausführung und Auswertung

Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet.

 
  function TOptDrives.PhysicalFormatInformation(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  READ DISC STRUCTURE Command - Physical Format Information
  }
  var
    READ_DISC_STRUCTURE_CDB : TREAD_DISC_STRUCTURE_CDB;
    pReadDiscStructure      : pREAD_DISC_STRUCTURE_Data_Format;
    aCDB                    : Array of Byte;
    nMediaType              : Byte;
    i                       : Integer;
  begin
    {
    *  Init
    }
    Result := False;
    nMediaType := $FF;
    {
    *  Media Type prüfen. Nur auf DVD.
    }
    if GetConfiguration_DVDInDrive or GetConfiguration_HDDVDInDrive
    then nMediaType := 0;
    if nMediaType <> $FF
    then begin
      {
      *  Physical Format Information initialisieren.
      }
      FillChar(FDrive[FActive].PhysicalFormatInfo,
               SizeOf(FDrive[FActive].PhysicalFormatInfo), $00);
      {
      *  Command Descriptor Block.
      }
      ZeroMemory(@READ_DISC_STRUCTURE_CDB, SizeOf(TREAD_DISC_STRUCTURE_CDB));
      with READ_DISC_STRUCTURE_CDB
      do begin
        OperationCode    := SCSIOP_READ_DISC_STRUCTURE;
        MediaType        := nMediaType;
        Format           := FMT_PHYSICAL_FORMAT_INFORMATION;
        AllocationLength := SizeOf(TREAD_DISC_STRUCTURE_Data_Format);
      end;
      {
      *  Den Command Descriptor Block übertragen.
      }
      SetLength(aCDB, 12);
      aCDB[0]  := READ_DISC_STRUCTURE_CDB.OperationCode;
      aCDB[1]  := READ_DISC_STRUCTURE_CDB.MediaType and $0F;
      aCDB[7]  := READ_DISC_STRUCTURE_CDB.Format;
      aCDB[8]  := HiByte(READ_DISC_STRUCTURE_CDB.AllocationLength);
      aCDB[9]  := LoByte(READ_DISC_STRUCTURE_CDB.AllocationLength);
      {
      *  Befehl ausführen.
      }
      GetMem(pReadDiscStructure, SizeOf(TREAD_DISC_STRUCTURE_Data_Format));
      Result := GET_SCSI_PASS_THROUGH_DIRECT(aDevice, aCDB, pReadDiscStructure,
                                          SizeOf(TREAD_DISC_STRUCTURE_Data_Format));
      if Result then
      with FDrive[FActive].PhysicalFormatInfo
      do begin
        DataLength := pReadDiscStructure.Header[0] shl 8 or
                      pReadDiscStructure.Header[1];
        {
        *  Prüfen, ob Daten folgen.
        }
        if DataLength > 2
        then begin
          DiskCategory    := pReadDiscStructure.Data[0] and $F0 shr 4;
          PartVersion     := pReadDiscStructure.Data[0] and $0F;
          DiscSize        := pReadDiscStructure.Data[1] and $F0 shr 4;
          MaximumRate     := pReadDiscStructure.Data[1] and $0F;
          NumberOfLayers  := pReadDiscStructure.Data[2] and $60 shr 5;
          TrackPath       := pReadDiscStructure.Data[2] and $10 > 0;
          LayerType       := pReadDiscStructure.Data[2] and $0F;
          LinearDensity   := pReadDiscStructure.Data[3] and $F0 shr 4;
          TrackDensity    := pReadDiscStructure.Data[3] and $0F;
          StartSectorData := pReadDiscStructure.Data[5] shl 16 or
                             pReadDiscStructure.Data[6] shl 8 or
                             pReadDiscStructure.Data[7];
          EndSectorData   := pReadDiscStructure.Data[9] shl 16 or
                             pReadDiscStructure.Data[10] shl 8 or
                             pReadDiscStructure.Data[11];
          EndSectorLayer0 := pReadDiscStructure.Data[13] shl 16 or
                             pReadDiscStructure.Data[14] shl 8 or
                             pReadDiscStructure.Data[15];
          BurtCuttingArea := pReadDiscStructure.Data[16] and $80 > 0;
        end;
      end;
    end;
  end;
          

In der Demo wird die Funktion in ähnlicher Form genutzt:

Physical Format Information (podPhysicalFormat.7z - 302 kb) MD5 (1 kb). Stand: 13. August 2013

Änderungen an der Demo

Datum Beschreibung
13.08.2013Kleine Überarbeitung und neuer Name