8.3. DGA
Előző | 8. fejezet - Videó kimeneti eszközök | Következő

## 8.3. DGA

BEVEZETÉS. Ez a dokumentum megpróbálja pár szóban elmagyarázni, hogy mi is az a DGA tulajdonképpen és mit tehet a DGA vezérlő az MPlayernek (és mit nem).

MI AZ A DGA. A DGA a Direct Graphics Access rövidítése és azt jelenti, hogy egy program az X szerver megkerülésével direkt eléréssel módosíthatja a framebuffer memóriát. Gyakorlatilag ez úgy történik, hogy a framebuffer memória a processzed memória tartományába kerül leképezésre. Ezt a kernel csak superuser jogokkal engedélyezi. Vagy `root` néven történő bejelentkezéssel vagy az MPlayer futtatható állományának SUID bitjének beállításával juthatsz ilyen jogokhoz. (nem javasoljuk).

Két verziója van a DGA-nak: a DGA1 az XFree 3.x.x-ban volt használatos, a DGA2 az XFree 4.0.1-ben került bevezetésre.

A DGA1 csak direkt framebuffer elérést biztosít a fent leírt módszerrel. A videó jel felbontásának megváltoztatásához az XVidMode kiterjesztést kell használnod.

A DGA2 már tartalmazza az XVidMode kiterjesztés képességeit és a képernyő színmélységét is engedi változtatni. Így alaphelyzetben 32 bites színmélységben futtatott X szervert átállíthatsz 15 bites mélységre és vissza.

Ennek ellenére a DGA-nak van néhány hátránya. Úgy tűnik ez az általad használt grafikus chip-től függ és az ezen chip-et irányító vezérlő X szerverben való megvalósításától. Így nem minden rendszeren működik...

DGA TÁMOGATÁS TELEPÍTÉSE AZ MPLAYERHEZ. Először győződj meg, hogy az X betölti a DGA kiterjesztést: lásd a `/var/log/XFree86.0.log` fájlt:

    (II) Loading extension XFree86-DGA

XFree86 4.0.x vagy újabb nagyon javasolt! Az MPlayer DGA vezérlőjét a `./configure` automatikusan megtalálja, de elő is írhatod a használatát a `--enable-dga` kapcsolóval.

Ha a vezérlő nem tud kisebb felbontásra váltani, kísérletezz a `-vm` (csak X 3.3.x esetén), `-fs`, `-bpp`, `-zoom` kapcsolókkal a filmnek legmegfelelőbb videó mód megtalálásához. Még nincs konverter :(

Lépj be `root`ként. A DGA-hoz root elérés kell, hogy közvetlenül tudjon írni a videó memóriába. Ha felhasználóként akarod futtatni, telepítsd az MPlayert SUID root-tal:

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

Így már egyszerű felhasználók esetében is működik.

### Biztonsági kockázat

Ez nagy biztonsági kockázatot jelent! Soha ne csináld ezt meg egy szerveren vagy egy olyan számítógépen amihez mások is hozzáférnek, mert root jogokat szerezhetnek a SUID root-os MPlayerrel.

Használd a `-vo dga` kapcsolót, és már megy is! (reméljük:) Kipróbálhatod a `-vo sdl:driver=dga` kapcsolót is, hogy működik-e! Sokkal gyorsabb!

FELBONTÁS VÁLTÁS. A DGA vezérlő lehetővé teszi a kimeneti jel felbontásának megváltoztatását. Ezzel elkerülhető a (lassú) szoftveres méretezés és ugyanakkor teljes képernyős képet biztosít. Ideális helyzetben pontosan a videó adat felbontására vált (kivéve az aspect arányt), de az X szerver csak a `/etc/X11/XF86Config` (`/etc/X11/XF86Config-4` XFree 4.X.X esetén) fájlban előírt felbontásokra enged váltani. Ezeket modline-oknak nevezik és a videó hardvered tulajdonságain múlik. Az X szerver átnézi ezt a konfigurációs fájlt indításkor és letiltja a hardverednek nem megfelelőeket. Az X11 log fájlból kiderítheted, hogy mely módok engedélyezettek. Megtalálhatóak a `/var/log/XFree86.0.log` fájlban.

Ezek a bejegyzések tudvalevőleg működnek Riva128 chip-en, az nv.o X szerver vezérlő modul használatával.

    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. A DGA két helyen használható az MPlayerben: Az SDL vezérlőnek előírhatod a használatát (`-vo sdl:driver=dga`) és a DGA vezérlőben (`-vo dga`). A fent említettek vonatkoznak mind a kettőre; a következő részben leírom, hogyan működik az MPlayer DGA vezérlője.

TULAJDONSÁGOK. A DGA vezérlő használatát a `-vo dga` kapcsoló parancssorban történő megadásával írhatod elő. Alapértelmezésként az videó eredeti felbontásához legközelebb álló felbontásra vált. Szándékosan figyelmen kívül hagyja a `-vm` és `-fs` kapcsolókat (videó mód váltás engedélyezése és teljes képernyő) - mindig a lehető legtöbbet megpróbálja elfedni a képernyődből a videó mód váltásával, így megspórolja a képméretezéshez szükséges plusz CPU ciklusokat. Ha nem tetszik az általa választott mód, kényszerítheted, hogy az általad megadott felbontáshoz legközelebbit keresse meg az `-x` és `-y` kapcsolókkal. A `-v` kapcsoló beírásának hatására a DGA vezérlő sok egyéb mellett kilistázza az aktuális `XF86Config` fájl által támogatott összes felbontást. DGA2 használata esetén előírhatod a színmélységet is a `-bpp` kapcsolóval. Az érvényes színmélységek 15, 16, 24 és 32. A hardvereden múlik, hogy ezek a színmélységek alapból támogatottak-e vagy (valószínűleg lassú) konverziót kell végezni.

Ha vagy olyan szerencsés, hogy elegendő memóriád van az egész, nem képernyőn lévő kép bemásolásához, a DGA vezérlő dupla bufferelést fog használni, ami egyenletesebb film lejátszást eredményez. Kiírja, hogy a dupla bufferelés engedélyezett-e vagy sem.

A dupla bufferelés azt jelenti,h ogy a videód következő képkockája a memória egy nem megjelenített részére másolódik, amíg az aktuális képkocka van a képernyőn. Ha kész a következő képkocka, a grafikus chip megkapja az új kép memóriabeli helyét, és egyszerűen onnan megjeleníti a képet. Eközben a másik buffer ismét feltöltődik új videó adattal.

A dupla bufferelés bekapcsolható a `-double` kapcsolóval, vagy letiltható a `-nodouble`-lal. A jelenlegi alapértelmezett beállítás szerint le van tiltva a dupla bufferelés. DGA vezérlő használata esetén az onscreen display (OSD) csak akkor működik, ha a dupla bufferelés engedélyezve van. Azonban a dupla bufferelés nagy sebességcsökkenéssel járhat (az én K6-II+ 525 gépemen további 20% CPU idő!) a hardvered DGA implementációjától függően.

SEBESSÉGI ADATOK. Általánosságban a DGA framebuffer elérésének legalább olyan gyorsnak kell lennie, mint az X11-es vezérlőnek a teljes képernyős képhez szükséges kiegészítők használatával. Az MPlayer által kiírt százalékos sebesség értékeket azonban fenntartással kezeld, mert például az X11-es vezérlő esetén nem tartalmazzák azt az időt, ami az X szervernek kell a kirajzoláshoz. Hurkold rá a terminált egy soros vonalra és indítsd el a top programot, akkor megtudod mi is történik valójában a dobozodban.

Kijelenthetjük, hogy a DGA gyorsítása a 'normális' X11-es használathoz képest erőteljesen függ a grafikus kártyádtól és hogy a hozzá tartozó X szerver modul mennyire optimalizált.

Ha lassú rendszered van, jobb ha 15 vagy 16 bites színmélységet használsz, mivel ezek fele akkora memória sávszélességet igényelnek, mint a 32 bites megjelenítés.

A 24 bites színmélység használata jó ötlet, ha a kártyád natívan támogatja a 32 bites mélységet, mivel ez is 25%-kal kevesebb adatátvitelt jelent a 32/32 módhoz képest.

Láttam pár AVI fájlt 266-os Pentium MMX-en lejátszva. Az AMD K6-2 CPU-k is működnek 400 MHZ vagy afölött.

ISMERT HIBÁK. Nos, az XFree néhány fejlesztője szerint a DGA egy szörnyeteg. Ők azt mondják, jobb ha nem használod. Az implementációja nem mindig tökéletes az XFree-hez tartozó chipset vezérlőkkel.

- Az XFree 4.0.3 és az `nv.o` esetén van egy hiba, ami érdekes színeket eredményez.

- ATI vezérlő esetén egynél többször kell visszaváltani a módot a DGA-s lejátszás után.

- Néhány vezérlő egyszerűen képtelen visszaváltani normál felbontásra (használd a Ctrl-Alt-Keypad + és Ctrl-Alt-Keypad - kombinációkat a kézi váltáshoz).

- Néhány vezérlő egyszerűen rossz színeket jelenít meg.

- Néhány vezérlő hamis adatot ad a processz címterébe bemappolt memória méretéről, így a vo_dga nem használ dupla bufferelést (SIS?).

- Néhány vezérlő egy használható módot sem jelez. Ebben az esetben a DGA vezérlő összeomlik és azt írja, hogy 100000x100000-es értelmetlen mód vagy valami hasonló.

- Az OSD csak engedélyezett dupla buffereléssel működik (különben villog).

Előző | Fel | Következő
8.2. Xv | Tartalom | 8.4. SDL