8.3. DGA

PREAMBOLO.  Questa documento cerca di spiegare in poche parole cosa sia DGA e cosa possa fare (e cosa no) il driver di uscita video DGA di MPlayer.

COS'E' DGA.  DGA è il nome breve di Direct Graphics Access (accesso grafico diretto) ed è un modo per fa sì che un programma scavalchi l'X server e modifichi direttamente la memoria del framebuffer. In termini tecnici la memoria del framebuffer viene rimappata nello spazio di memoria del tuo processo. Questo è permesso dal kernel solo se hai provilegi di superutente. Puoi averli o autenticandoti come root o impostando il bit SUID sull'eseguibile di MPlayer (sconsigliato).

Ci sono due versioni di DGA: DGA1 usato da XFree 3.x.x e DGA2 che è stato introdotto con XFree 4.0.1.

DGA1 fornisce solamente accesso diretto al framebuffer come descritto sopra. Per modificare la risoluzione del segnale video devi affidarti all'estensione XVidMode.

DGA2 include le funzionalità dell'estensione XVidMode e inoltre permette la modifica della profondità di colore del display. Così, anche se stai facendo girare un X server con profondità di 32 bit, puoi passare a una di 15 e viceversa.

Tuttavia DGA ha dei punti deboli. Sembra sia in qualche modo dipendente dal chip grafico utilizzato e dall'implementazione del driver video dell'X server che controlla tale chip. Per cui non funziona su tutti i sistemi...

INSTALLARE IL SUPPORTO PER DGA IN MPLAYER.  Per prima cosa assicurati che X carichi l'estensione DGA, guarda in /var/log/XFree86.0.log:

(II) Loading extension XFree86-DGA

Attenzione, si consiglia vivamente XFree86 4.0.x o superiore! Il driver DGA di MPlayer viene rilevato automaticamente da ./configure, ovvero puoi forzarlo con --enable-dga.

Se il driver non è riuscito a reimpostare una risoluzione inferiore, fai delle prove con le opzioni -vm (solo con X 3.3.x), -fs, -bpp, -zoom per trovare una modalità video in cui ci stia il film. Per ora non c'è un convertitore :(

Diventa root. A DGA serve l'accesso da root per essere in grado di scrivere direttamente sulla memoria video. Se vuoi eseguirlo come utente, allora installa MPlayer SUID root:

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

Ora funziona anche da utente normale.

Rischi di sicurezza

Questo porta un grosso rischio di sicurezza! Non farlo mai su un server o su un computer che può essere utilizzato da altre persone, perché si possono ottenere privilegi di root attraverso MPlayer SUID root.

Ora usa l'opzione -vo dga, e sei a cavallo! (speralo:) Potresti anche provare se ti funziona l'opzione -vo sdl:driver=dga! E' molto più veloce!

MODIFICARE LA RISOLUZIONE.  Il driver DGA permette la modifica della risoluzione del segnale di uscita. Questo evita la necessità di eseguire un (lento) ridimensionamento software e allo stesso tempo fornisce un'immagine a schermo pieno. Idealmente dovrebbe ridimensionarsi alla risoluzione precisa (rispettando il rapporto di aspetto) dei dati video, ma l'X server permette solo di impostare le risoluzioni precedentemente definite in /etc/X11/XF86Config (/etc/X11/XF86Config-4 per XFree 4.X.X). Queste ultime sono conosciute come "modelines" e dipendono dalle potenzialità del tuo hardware video. Il server X legge questo file di configurazione all'avvio e disabilita le modelines incompatibili col tuo hardware. Puoi scoprire quali modalità ti restano attraverso il file di log di X11. Si può trovare qui: /var/log/XFree86.0.log.

Queste modalità si sa che funzionano correttamente con un chip Riva128, usando il driver nv.o del server X.

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 is used in two places with MPlayer: The SDL driver can be made to make use of it (-vo sdl:driver=dga) and within the DGA driver (-vo dga). The above said is true for both; in the following sections I'll explain how the DGA driver for MPlayer works. DGA viene usato con MPlayer in due posti: può essere usato attraverso il driver SDL (-vo sdl:driver=dga) e con il driver DGA (-vo dga). Quanto detto sopra è valido per entrambi; nei paragrafi seguenti viene spiegato come il driver DGA funziona per MPlayer.

CARATTERISTICHE.  Il driver DGA viene utilizzato specificando -vo dga sulla riga comando. Il comportamento di default è di passare ad una risoluzione il più vicino possibile a quella originaria del video. Ignora volutamente le opzioni -vm e -fs (abilitazione ridimensionamento video e schermo intero) - cerca sempre di coprire la più vasta area possibile dello schermo reimpostando la modalità video, evitando così di sprecare cicli della CPU per ridimensionare l'immagine. Se la modalità video selezionata non ti piace, puoi forzarlo a scegliere la modalità più prossima alla risoluzione specificata con -x e -y. Impostando l'opzione -v, il driver DGA emetterà, tra una sacco ci altre cose, un'elenco delle risoluzioni supportate dal tuo file XF86Config. Se hai DGA2, puoi anche forzarlo ad utilizzare una data profondità usando l'opzione -bpp. Profondità valide sono 15, 16, 24 e 32. Se queste profondità siano supportate nativamente oppure se debba venir effettuata una conversione (eventualmente lenta), dipende dal tuo hardware.

Se dovessi essere abbastanza fortunato da avere sufficiente memoria fuori dalla visualizzazione per poterci far stare un'immagine intera, il driver DGA userà un buffering doppio, fornendo una riproduzione più fluida. Ti dirà quando il doppio buffering sarà abilitato o no.

"Doppio buffering" significa che il fotogramma successivo del video viene disegnato nella memoria fuori dello schermo, mentre il fotogramma corrente viene mostrato. Quando il fotogramma successivo è pronto, il chip grafico rivece solo l'indirizzo in memoria del nuovo fotogramma e semplicemente prende da là i dati da mostrare. Nel frattempo l'altro buffer di memoria viene riempito con altri dati video.

Il doppio buffering può venir abilitato usando l'opzione -double e disabilitato con -nodouble. L'opzione attuale di default è di disabilitarlo. Usando il driver DGA, la visualizzazione dati su schermo (OSD, onscreen display) funziona solo con il doppio buffering abilitato. In ogni caso, abilitare il doppio buffering può portare una pesante penalizzazione della velocità (sul mio K6-II+ 525 usa un ulteriore 20% di tempo di CPU) in dipendenza dall'implementazione per DGA del tuo hardware.

PROBLEMI DI VELOCITA'.  In generale, l'accesso DGA al framebuffer dovrebbe essere almeno veloce quanto utilizzare il driver X11, con il beneficio aggiunto di ottenere un'immagine a schermo intero. I valori di velocità percentuale emessi da MPlayer devono essere interpretati con un po' di attenzione, dato che per esempio con il driver X11 non includono il tempo usato dal server X per il disegno effettivo. Attacca un terminale sulla seriale della tua macchina e lancia top per vedere cosa stia davvero succedendo.

In linea di massima, l'aumento di velocità usando DGA rispetto all'utilizzo 'normale' di X11 dipende fortemente dalla tua scheda video e da quanto bene il relativo modulo del server X sia ottimizzato.

Se hai un sistema lento, è meglio usare una profondità di 15 o 16 bit, visto che richiedono solo la metà della banda di memoria di una visualizzazion a 32 bit.

Usare una profondità di 24 è una buona idea anche se la tua scheda supporta nativamente solo quella a 32 bit, dato che trasferisce il 25% dei dati in meno rispetto alla modalità a 32/32.

Ho visto alcuni file AVI riprodotti su Pentium MMX 266. Le CPU AMD K6-2 possono lavorare a 400 MHz e oltre.

PROBLEMI/BACHI CONOSCIUTI.  Bene, secondo gli sviluppatori di XFree, DGA è quasi una bestia. Ti dicono che è meglio non usarla. La sua implementazione non è sempre perfetta con tutti i driver dei chip per XFree che ci sono là fuori.