CD, DVD, VCD - MPlayer - The Movie Player for Linux

## 4.1 CD-ROM- und DVD-ROM-Laufwerke

Auszug aus der Linux-Dokumentation:

Moderne CDROM-Laufwerke können sehr hohe Abtastgeschwindigkeiten erreichen. Einige können jedoch auch ihre Geschwindigkeit reduzieren. Es gibt mehrere Gründe, dies zu tun:

- Es gibt Berichte, dass diese Laufwerke bei hohen Geschwindkeiten Lesefehler erzeugen, vor allem bei schlecht gepressten CD-ROMs. Das Herabsetzen der Geschwindigkeit kann in diesen Fällen die Datenverluste verringern.
- Viele CD-ROM Laufwerke erzeugen störend laute Geräusche, die eine niedrigere Geschwindigkeit ebenfalls reduzieren kann.

Die Lesegeschwindigkeit eines IDE-CD-Laufwerkes kann mit `hdparm` oder einem Programm namens `setcd` verringert werden. Das geht so:

`hdparm -E <Geschwindigkeit> <CD-ROM-Device>`

`setcd -x <Geschwindigkeit> <CD-ROM-Device>`

Du kannst auch folgendes probieren:

`echo current_speed:4 > /proc/ide/[CDROM-Device]/settings`

Aber dafür brauchst du Root-Privilegien. Der folgende Befehl könnte ebenfalls helfen:

`echo file_readahead:2000000 > /proc/ide/[CDROM-Device]/settings`

Dies setzt einen 2MB Lesepuffer für die Daten, was sich bei zerkratzten CDs als nützlich erweist. Wenn du die Größe zu hoch wählst, dann wird das Laufwerk ständig beschleunigen und abbremsen und dadurch die Geschwindigkeit dramatisch verringern. Es ist auch empfehlenswert, das CD-ROM Laufwerk via hdparm auf performantere Werte einzustellen:

`hdparm -d1 -a8 -u1 <CDROM-Device>`

Dies aktiviert den DMA-Zugriff, Vorauslesen und IRQ-Unmasking (genauere Details dazu findest du in der `hdparm`-Manpage)

Bitte schau dir "`/proc/ide/[CDROM-Device]/settings`" an, um das CD-ROM feineinzustellen.

SCSI-Laufwerke kennen keine einheitliche Schnittstelle zum Setzen dieser Werte (oder kennst du eine? Dann sag sie uns!) Es gibt ein Tool, das mit Plextor-SCSI-Laufwerken funktioniert.

FreeBSD:

Speed: `cdcontrol [-f device] speed [speed]`

DMA: `sysctl hw.ata.atapi_dma=1`

## 4.2 DVD-Wiedergabe

Bitte schau in der man-Page nach, wenn du eine Auflistung aller verfügbaren Optionen willst. Die Syntax bei einer normalen Digital Versatile Disc (DVD) sieht wie folgt aus:

`mplayer dvd://<track> [-dvd-device <Gerät>]`

Beispiel: `mplayer dvd://1 -dvd-device /dev/hdc`

Das Standard-DVD-Gerät ist `/dev/dvd`. Wenn das bei dir anders ist, so erstelle einen symbolischen Link auf das richtige Gerät, oder gib es auf der Kommandozeile mit der Option `-dvd-device` an.

MPlayer benutzt `libdvdread` und `libdvdcss` für die DVD Entschlüsselung und Wiedergabe. Diese beiden Bibliotheken sind im `libmpdvdkit2/`-Unterverzeichnis enthalten und müssen nicht separat installiert werden. Wir haben uns dazu entschlossen, da wir einen Fehler in der `libdvdread` beheben mussten und einen Patch hinzufügt haben, welcher Caching-Support für gecrackte CSS-Keys für `libdvdcss` ermöglicht. Dies führt zu einer Geschwindigkeitssteigerung, da MPlayer nicht vor jeder Wiedergabe die Verschlüsselung erneut knacken muss.

MPlayer kann jedoch auch die systemweiten `libdvdread`- und `libdvdcss`-Bibliotheken verwenden. Diese Lösung wird jedoch aus oben den oben genannten Gründen nicht empfohlen. Ausßerdem kann es zu Fehlern, Inkompatibilitäten zwischen den Bibliotheken und niedriger Geschwindigkeit führen.

#### Unterstützung für DVD-Navigation

An einer Unterstützung für DVD-Navigation via `dvdnav` wird gearbeitet. Sie ist jedoch noch nicht vollendet und wird momentan nicht gewartet. Wer weiß - vielleicht lässt sie sich sogar compilieren.

#### Alte DVD-Unterstützung - OPTIONAL

Nützlich, wenn du verschlüsselte VOBs von der Festplatte abspielen willst. Kompiliere und installiere libcss 0.0.1 (nicht neuer). Wenn MPlayer sie nicht findet, dann benutze die Option `-csslib /pfad/zu/libcss.so`. Um diese Bibliothek zu benutzen musst du root-Rechte haben, das SUID-Bit für die MPlayer-Programmdatei setzen oder den fibmap_mplayer-Wrapper benutzen, der das SUID-Bit gesetzt hat.

#### DVD-Strukturen

DVDs benutzen alle 2048 Bytes/Sektor mit ECC/CRC. Meistens beinhalten sie ein UDF-Dateisystem in einem einzigen Track. Dieses Dateisystem enthält mehrere Dateien (kleine .IFO- und .BUK-Dateien sowie die großen (1GB) .VOB-Dateien). Sie sind echte Dateien und kännen von einem in's Dateisystem eingehängten Dateisystem einer nicht verschläusselten DVD abgespielt oder kopiert werden.

Die .IFO-Dateien enthalten Filmnavigationsinformationen (z.B. Kapitel, Titel, verschiedene Kameraeinstellungen sofern vorhanden, Tabelle mit den Sprachen etc.) und werden benätigt, um den Inhalt der .VOB-Dateien (den eigentlichen Film) lesen und interpretieren zu können. Die .BUK-Dateien sind Backups der .IFO-Dateien. Sie benutzen ausschließlich Sektornummern zur Adressierung, sodass man zur DVD-Navigation das direkte Ansprechen einzelner Sektoren der DVD implementieren muss. .IFOs werden ebenfalls benätigt, um den Inhalt entschlässeln zu kännen.

Aus diesem Grund braucht die alte DVD-Unterstützung ein in den Dateibaum eingehängtes DVD-Dateisystem sowie zusätzlich Zugriff auf das Device, um einzelne Sektoren der DVD lesen zu können. Leider musst du (unter Linux) root-Rechte besitzen, um die Sektorenadresse einer Datei zu erhalten. Du hast nun die folgenden Möglichkeiten:

- Sei root oder gib der mplayer-Programmdatei das SUID-Bit.
- Lass MPlayer das Wrapper-Programm fibmap_mplayer ausführen, welches das SUID-Bit gesetzt hat, um Zugriff auf die DVD zu bekommen (wird bei der alten DVD-Unterstützung mit der `libcss` so sgemacht).
- Lass die Dateisystemtreiber des Kernels links liegen und programmiere den Support dafür erneut im User-Space. `libdvdread` 0.9.x und `libmpdvdkit2` machen das genau so (neue DVD-Unterstützung). Der UDF-Treiber des Kernels wird nicht benötigt, da diese Bibliotheken ihren eigenen UDF-Dateisystemtreiber mitbringen. Die DVD muss nicht einmal in den Dateibaum eingehängt sein, da direkt auf die Sektoren der DVD zugegriffen wird.

Manchmal hat ein Benutzer keinen Zugriff auf das Device (z.B. `/dev/dvd`). Deswegen haben die Autoren der `libdvdread` einen Emulationsmodus spendiert, der eine Umsetzung zwischen Sektornummern und Dateinamen/Offsets vornimmt. Damit wird Sektorzugriff auch bei in das Dateisystem eingehängten DVDs und sogar bei auf die Festplatte kopierten Dateien ermöglicht.

`libdvdread` akzeptiert sogar Mountpoints anstelle von Devicenamen. Dabei schaut sie in `/proc/mounts` nach, um den tatsächlichen Devicenamen für den Sektorzugriff herauszufinden. Entwickelt wurde diees Verfahren für Solaris, da Solaris Devicenamen dynamisch vergibt.

Der Standardname für das DVD-Device ist `/dev/dvd`. Sollte das bei dir anders sein, so erstelle einen symbolischen Link auf das richtige Device, oder gib es beim Starten mit der Option `-dvd-device` separat an.

#### DVD-Authentifizierung

Die Authentifizierung und Entschlüsselung der neuen DVD-Unterstützung wird durch eine gepatchte `libdvdcss` ermöglicht (siehe oben). Die Zugriffsmethoden können über die Umgebungsvariable `DVDCSS_METHOD` gewählt werden. Gäultige Werte sind `key`, `disk` und `title`.

Wird nichts angegeben, so versucht libdvdcss die folgenden Methoden (Standardwerte: key, title-Request):

1. bus key:Dieser Schlüssel wird während der Authentifizierung (eine lange Mischung aus ioctls und verschiedenen Schlüsselaustauschen, dient der Entschlüsselung) verhandelt. Er wird benutzt, um die title- und disk-Schlüssel vor dem Versand über den ungeschützten Systembus zu verschlüsseln und damit ein Ablauschen der Schlüssel zu verhindern. Der bus key ist erforderlich, um den verschlüsselten disk key zu erhalten und zu entschlüsseln.
2. cached key: MPlayer sucht nach bereits gecrackten Schlüsseln, die im `~/.mplayer/DVDKeys`-Verzeichnis gespeichert werden (das ist schnell ;).
3. key: Falls kein cached key vorhanden ist, so versucht MPlayer den disk key mit Hilfe einer Reihe von mitgelieferten und eincompilierten player keys zu entschlüsseln.
4. disk: Wenn die key-Methode fehlschlägt (z.B. wenn keine Player-Schlüssel dabei sind), so versucht MPlayer, den disk key mit Hilfe eines brute-force-Algorithmusses zu knacken. Dieser Prozess belastet die CPU sehr und benötigt mindestens 64MB Speicher (16M 32Bit breite Einträge in einer Hashtabelle), um temporäre Werte zu speichern. Diese Methode sollte immer funktionieren, ist aber langsam.
5. title request: Mit dem disk key kann MPlayer den verschlüsselten title key anfordern, der auf versteckten Sektoren, die mit `ioctl()` ausgelesen werden, auf der DVD gespeichert ist. Der Gebietsschutz der RPC-2-konformen DVD-Laufwerke wird in diesem Schritt realisiert. Bei manchen Laufwerken kann dieser Schritt fehlschlagen. Wenn die Anforderung erfolgreich war, wird der title key mit dem bus key und dem disk key entschlüsselt.
6. title: Diese Methode wird dann benutzt, wenn die Anforderung für den title key fehlgeschlagen ist. Sie basiert nicht auf einem Datenaustausch mit dem DVD-Laufwerk sondern benutzt einen kryptographischen Angriff, der den title key versucht zu erraten. (Dabei wird versucht, sich wiederholende Muster im entschlüsselten Inhalt der VOBs zu finden. Geraten wird dann, dass die ersten verschlüsselten Bytes des dazu passenden verschlüsselten Textes eine Weiterführung dieser Muster sind.) Diese Methode ist auch als "known plaintext attack" (Angriff bei bekanntem Klartext) oder "DeCSSPlus" bekannt. In seltenen Fällen kann auch diese Methode fehlschlagen, wenn nicht genug verschlüsselte Daten auf der DVD vorhanden sind, um einen statistischen Angriff zu starten, oder weil sich der Schlüssel mitten in einem Titel ändert. Diese Methode ist die einzige Möglichkeit, den auf der Festplatte gespeicherten Inhalt einer DVD zu entschlüsseln und bei RPC2-Laufwerken mit falschem Regionalcode (langsam).

RPC-1-konforme DVD-Laufwerke sind nur über den Gebietsschutz geschützt, den der Softwareplayer bietet. RPC-2-konforme Laufwerke haben dagegen einen Hardwareschutz, der es nur fünf mal erlaubt, den Gebietscode zu ändern. Es ist evtl. nötig oder empfehlenswert, dass du Firmware für dein Laufwerk zu finden, die nur einen RPC-1-Schutz implementiert. Firmwareupgrades können auf dieser Firmwareseite gefunden werden. Solltest du dort keine Firmware für dein Laufwerk finden, so kannst du mit dem region set tool den Gebietscode deines DVD-Laufwerks ändern (klappt nur unter Linux). Warnung: Du kannst nur fünf mal den Gebietscode ädnern.

## 4.3 VCD Wiedergabe

Abspielen von Standard Video-CDs:

`mplayer vcd://<Tracknummer> [-cdrom-device <Gerät>]`

Beispiele:
`mplayer vcd://2 -cdrom-device /dev/hdc`

Das Standard-CD-Rom-Laufwerk ist `/dev/cdrom`. Falls das bei dir nicht der Fall ist, erstelle einen symbolischen Link oder gib das richtige Gerät mit `-cdrom-device` auf der Kommandozeile an.

Anmerkung: Zumindest einige Plextor- und Toshiba-SCSI-CD-Rom-Laufwerke haben eine grauenvolle Geschwindkeit beim Lesen von VCDs. Das liegt daran, dass der ioctl-Aufruf CDROMREADRAW nicht vollständig implementiert ist. Wenn du Ahnung von der SCSI-Programmierung hast, dann hilf uns, generische Unterstützung für VCD auf SCSI-Laufwerken zu implementieren.

Bis dahin kannst du mit readvcd Daten von der VCD extrahieren und diese mit MPlayer abspielen.

#### VCD-Struktur

Eine VCD besteht aus einem oder mehreren Spuren:

- Die erste Spur ist eine kleine Datenspur mit 2048 Bytes pro Sektor, die ein ISO9660-Dateisystem enthält, auf dem meist ein VCD-Player für Windows und eventuell auch andere Informationen (Bilder, Texte etc.) gespeichert sind.
- Die zweite Spur und alle folgenden sind MPEG-Spuren mit 2324 Bytes pro Sektor, die ein MPEG-PS-Datenpaket pro Sektor anstelle des Dateisystems enthalten. Ähnlich wie bei Audio-CDs können diese Spuren nicht gemountet werden (hast du jemals eine Audio-CD gemountet, um sie abzuspielen?). Da die meisten Filme sich auf der zweiten Spur befinden, solltest du zuerst `vcd://2` ausprobieren.
- Es existieren auch VCDs ohne die erste Spur (nur eine Spur, überhaupt kein Dateisystem). Diese lassen sich abspielen aber nicht mounten.

#### Über .DAT-Dateien:

Die ca. 600MB große sichtbare Datei auf der ersten Spur der gemounteten VCD ist keine echte Datei! Es handelt sich dabei um ein sogenanntes ISO-Gateway, das erstellt wurde, um Windows zu ermöglichen, solche Spuren zu lesen (Windows erlaubt Anwendungen den direkten Zugtriff auf das Laufwekr nämlich nicht). Unter Linux kannst du diese Datei weder einfach kopieren noch einfach abspielen (sie enthalten dann nur Müll). Unter Windows geht das, weil der ISO9660-Treiber den direkten Zugriff auf die Spur emuliert. Um eine .DAT-Datei abzuspielen, brauchst du einen Kerneltreiber, der in der Linux-Version von PowerDVD enthalten ist. Er enthält einen modifizierten Treiber für das ISO9660-Dateisystem (`vcdfs/isofs-2.4.X.o`), der ebenfalls in der Lage ist, das direkte Auslesen über diese .DAT-Datei zu emulieren. Wenn du die Disc mit diesem Treiber mountest, dann kannst du die .DAT-Datei kopieren und sogar direkt mit MPlayer abspielen. Das wird aber nicht mit dem Standard-ISO9660-Treiber funktionieren! Benutze dabei `-vcd`. Alternativen für's Kopieren einer VCD sind der neue cdfs-Kerneltreiber (der nicht Teil des offiziellen Kernels ist), der CD-Sessions als Abbilder anzeigt, und cdrdao, ein Anwendung zum Bit-für-Bit-Grabben/Kopieren von CDs.