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

13.08.2013Kleine Überarbeitung und neuer Name