Home | Kontakt | Sitemap

Start

Über mich

Kontakt

Sitemap

Lizenz

Anleitungen

DVD, miniDVD

SVCD

Audio, Audio-CD (CD-DA)

AVI

Software

Von Freunden und Bekannten

Eigene Programme

Programmierung

Delphi

Lazarus

Delphi/Lazarus

Projekte

MPEG-1/2 Video

Optische Laufwerke

Audio-CD (CDDA)

Raspberry Pi Dashcam

Verschiedenes

MPEG 2 Schnitt

Project X

VCD Easy

Hardlinks

Windows

Links

Software

 

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

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

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

 76543210
0Disc Structure Data Length
1
2Reserviert
3
 Physical Format Information
0Disk Category/BooktypePart Version
1Disc SizeMaximum Rate
2ReserviertNumber of LayersTrack PathLayer Type
3Linear DensityTrack Density
4$00
5Starting Physical Sector Number of Data Area
6
7
8$00
9End Physical Sector Number of Data Area
10
11
12$00
13End Physical Sector Number in Layer 0
14
15
16BCAReserviert
17Media Specific
..
2047

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

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

Disk CategoryMedia
0000bDVD-ROM
0001bDVD-RAM
0010bDVD-R
0011bDVD-RW
0100bHD DVD-ROM
0101bHD DVD-RAM
0110bHD DVD-R
0111bReserved
Disk CategoryMedia
1000bReserved
1001bDVD+RW
1010bDVD+R
1011bReserved
1100bReserved
1101bDVD+RW DL
1110bDVD+R DL
1111bReserved

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

Maximum Rate: Maximale Lesegeschwindigkeit:

Maximum RateRead Rate
0000b2.52 Mbps
0001b5.04 Mbps
0010b10.08 Mbps
0011b20.16 Mbps
0100b30.24 Mbps
1111bNot Specified
OthersReserved

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:

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

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

CodeLinear Density
0000b0.267 µm/bit
0001b0.293 µm/bit
0010b0.409 to 0.435 µm/bit
0100b 0.280 to 0.291 µm/bit
0101b0.153 µm/bit
0110b0.130 to 0.140 µm/bit
1000b0.353 µm/bit
AndereReserviert

Track Density: Gibt die Spurbreite auf dem Medium an.

CodeTrack Density
0000b0.74 µm/track
0001b0.80 µm/track
0010b0.615 µm/track
0011b0.40 µm/track
0100b0.34 µm/track
AndereReserviert

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

Disc Structure List > DVD Physische Formatinformationen > DVD Copyright Information