8.3. DGA

PRÄAMBEL.  Dieser Abschnitt versucht, in wenigen Worten zu beschreiben, was DGA generell ist und was der DGA-Videotreiber in MPlayer erreichen kann, und was nicht.

WAS IST DGA?  DGA ist die Abkürzung für Direct Graphics Access (direkter Zugriff auf die Grafikhardware) und gibt Programmen die Möglichkeit, unter Umgehung des X-Servers direkt den Framebuffer der Grafikkarte zu verändern. Technisch gesehen wird das dadurch realisiert, dass der Framebuffer-Speicher in den virtuellen Adressraum des jeweiligen Prozesses abgebildet wird. Das wird vom Kernel aber nur dann zugelassen, wenn der Prozess Superuserprivilegien besitzt. Dazu musst du dich entweder als root anmelden oder das SUID-bit des MPlayer-Binaries setzen (was nicht empfohlen wird).

Von DGA gibt es zwei Versionen: DGA1 kommt mit XFree 3.x.x, und DGA2 wurde mit XFree 4.0.1 eingeführt.

DGA1 bietet nur den oben beschriebenen Zugriff auf den Framebuffer. Die Umschaltung des Videomodus klappt nur mit der XVidMode-Erweiterung.

DGA2 beinhaltet die Features der XVidMode-Erweiterung und erlaubt außerdem, die Farbtiefe zu ändern. Damit kannst du also auf 32bit Farbtiefe umschalten, auch wenn der X-Server gerade mit 15bit Farbtiefe läuft und umgekehrt.

DGA hat aber auch ein paar Nachteile. Die Funktionsweise scheint ein wenig von der Grafikkarte und der Implementierung des Grafikkartentreibers im X-Server abhängig zu sein, der diesen Chip kontrolliert. Es fuktioniert also nicht auf jedem System...

DGA-UNTERSTÜTZUNG FÜR MPLAYER INSTALLIEREN.  Stelle als erstes sicher, dass X die DGA-Erweiterung lädt. Schau in /var/log/XFree86.0.log nach:

(II) Loading extension XFree86-DGA

Wie du siehst, ist XFree86 4.0.x oder neuer sehr zu empfehlen! MPlayers DGA-Treiber wird von ./configure automatisch erkannt. Alternativ kannst du seine Compilierung mit --enable-dga erzwingen.

Falls der Treiber nicht zu einer kleineren Auflösung wechseln konnte, dann experimentiere mit den Optionen -vm (nur bei X 3.3.x), -fs, -bpp, -zoom herum, um einen Videomodus zu finden, in den der Film reinpasst. Momentan gibt es keinen Konverter :(

Werde root. DGA braucht root-Privilegien, um direkt in den Grafikspeicher zu schreiben. Wenn du MPlayer als normaler Nutzer starten möchtest, dann installiere MPlayer mit dem SUID-Bit:

chown root /usr/local/bin/mplayer
chmod 750 /usr/local/bin/mplayer
chmod +s /usr/local/bin/mplayer

Jetzt funktioniert es auch als normaler Benutzer.

Warnung: Sicherheitsrisiko!

Dieses ist ein großes Sicherheitsloch. Tu das niemals auf einem Server oder auf einem Computer, auf den auch andere Leute Zugriff haben, da sie durch einen SUID-root-MPlayer root-Privilegien erlangen können.

Benutze jetzt die Option -vo dga, und ab geht's (hoffe ich zumindest :))! Du solltest auch ausprobieren, ob bei dir die Option -vo sdl:dga funktioniert. Sie ist viel schneller.

ÄNDERN DER AUFLÖSUNG.  Der DGA-Treiber ermöglicht es, die Auflösung des Output-Signals zu ändern. Damit entfällt die Notwendigkeit der (langsamen) Softwareskalierung und bietet gleichzeitig ein Vollbild. Idealerweise würde DGA in die gleiche Auflösung schalten, die das Video (natürlich unter Beachtung des Höhen-/Breitenverhältnisses) hat, aber der X-Server lässt nur Auflösungen zu, die vorher in der /etc/X11/XF86Config bzw. /etc/X11/XF86Config-4 definiert wurden, bezüglich XFree 4.X.X. Diese werden durch sogenannte Modelines festgelegt und hängen von den Fähigkeiten deiner Grafikhardware ab. Der X-Server liest diese Konfigurationsdatei beim Start ein und deaktiviert alle Modelines, die sich nicht mit deiner Hardware vertragen. Du kannst die überlebenden Modelines anhand der X11-Logdatei herausfinden (normalerweise /var/log/XFree86.0.log).

Diese Einträge funktionieren mit einem Riva128-Chip und dem nv.o-X-Server-Treibermodul.

Section "Modes"
  Identifier "Modes[0]"
  Modeline "800x600"  40     800 840 968 1056  600 601 605 628
  Modeline "712x600"  35.0   712 740 850 900   400 410 412 425
  Modeline "640x480"  25.175 640 664 760 800   480 491 493 525
  Modeline "400x300"  20     400 416 480 528   300 301 303 314 Doublescan
  Modeline "352x288"  25.10  352 368 416 432   288 296 290 310
  Modeline "352x240"  15.750 352 368 416 432   240 244 246 262 Doublescan
  Modeline "320x240"  12.588 320 336 384 400   240 245 246 262 Doublescan
EndSection

DGA & MPLAYER.  DGA wird bei MPlayer an zwei Stellen benutzt: beim SDL-Treiber mit (-vo sdl:driver=dga) oder beim DGA-Treiber selbst (-vo dga). Das oben gesagte gilt für beide Treiber. In den folgenden Abschnitten erkläre ich, wie der DGA-Treiber von MPlayer selber arbeitet.

FEATURES DES DGA-TREIBERS.  Der DGA-Treiber wird durch die Option -vo dga aktiviert. Sein Standardverhalten sieht vor, dass er in die Auflösung schaltet, die der Videoauflösung am nächsten kommt. Der Treiber ignoriert absichtlich die Optionen -vm (Videomodusumschaltung aktivieren) und -fs (Vollbildmodus erzwingen) - er versucht immer, so viel Bildfläche wie möglich durch eine Änderung der Auflösung zu bedecken. Dadurch wird nicht ein einziger weiterer CPU-Takt für die Skalierung des Bildes verwendet. Wenn du mit dem Modus nicht zufrieden bist, den der Treiber gewählt hat, dann kannst du ihn zwingen, denjenigen Modus zu wählen, der am besten zu dem mit den Optionen -x und -y angegebenen Werten passt. Die Option -v veranlasst den DGA-Treiber, neben einigen anderen Dingen auch alle von deiner XF86Config-Datei unterstützen Videomodi aufzulisten. Wenn DGA2 verwendet wird, dann kannst du mit der Option -bpp die Verwendung einer bestimmten Farbtiefe erzwingen. Gültige Werte sind 15, 16, 24 und 32. Es hängt dann von deiner Hardware ab, ob der Modus nativ unterstützt wird oder ob eine (möglicherweise langsame) Konvertierung stattfindet.

Wenn du Glück hast und dir genug unbenutzter Grafikspeicher zur Verfügung steht, um ein komplettes Bild aufzunehmen, dann wird der DGA-Treiber Doppelpufferung verwenden, was zu einer regelmäßigeren Wiedergabe führt. Der DGA-Treiber wird dir mitteilen, ob Doppelpufferung angeschaltet ist oder nicht.

Doppelpufferung bedeutet, dass das nächste Bild deines Videos bereits an einer anderen Stelle im Grafikspeicher aufgebaut wird, während das aktuelle Bild angezeigt wird. Ist das nächste Bild fertig, so wird dem Grafikchip nur noch mitgeteilt, wo er das neue Bild im Speicher finden kann. Somit holt sich der Chip seine Daten einfach von dort. In der Zwischenzeit wird der andere, jetzt unbenutze Puffer wieder mit neuen Videodaten gefüllt.

Doppelpufferung kann mit der Option -double aktiviert und mit -nodouble deaktiviert werden. Momentan ist die Doppelpufferung per Voreinstellung deaktiviert. Wird der DGA-Treiber verwendet, dann funktioniert das Onscreen-Display (ODS) nur dann, wenn auch die Doppelpufferung aktiviert ist. Andererseits kann die Doppelpufferung auch einen großen Geschwindigkeitseinbruch hervorrufen, was stark von der DGA-Implementierung der Treiber für deine Hardware abhängt (auf meinem K6-II+ 525 benötigt Doppelpufferung weitere 20% CPU-Zeit!).

PUNKTE BEZÜGLICH DER GESCHWINDIGKEIT.  Generell gesehen sollte der Zugriff auf den DGA-Framebuffer genauso schnell sein wie der X11-Treiber, wobei man zusätzlich noch ein Vollbild erhält. Die prozentualen Geschwindigkeitswerte, die MPlayer ausgibt, müssen mit Vorsicht genossen werden, da sie z.B. beim X11-Treiber nicht die Zeit beinhalten, die der X-Server tatsächlich zum Anzeigen des Bildes benötigt. Klemm ein Terminal an deinen seriellen Port und starte top, wenn du wissen willst, wie's wirklich mit der Geschwindigkeit aussieht.

Allgemein betrachtet hängt die Geschwindigkeitsverbesserung von DGA gegenüber dem 'normalen' X11-Treiber sehr von deiner Grafikkarte und davon ab, wie gut das X-Servermodul optimiert ist.

Wenn du ein langsames System hast, dann benutz besser eine Farbtiefe von 15 oder 16bit, da sie nur die halbe Bandbreite des 32bit-Farbmodus benötigen.

Einge gute Idee ist auch die Verwendung von 24bit Farbtiefe, selbst dann, wenn deine Grafikkarte nativ nur 32bit unterstützt, da bei 24bit 25% weniger Daten im Vergleich zum 32/32-Modus über den Bus transferiert werden müssen.

Ich habe schon gesehen, wie einige AVI-Dateien auf einem Pentium MMX 266 wiedergegeben werden konnten. AMD K6-2-CPUs werden ab ca. 400 MHz oder höher funktionieren.

BEKANNTE FEHLER.  Die Entwickler von XFree sagen selbst, dass DGA ein ganz schönes Monstrum ist. Sie raten eher davon ab, es zu benutzen, da seine Implementierung in einige Chipset-Treiber für XFree nicht immer ganz fehlerfrei war.