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.
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.
Con XFree 4.0.3 e nv.o c'è un baco che porta ad avere strani colori.
I driver ATI hanno bisogno che la modalità sia reimpostata più di una volta dopo aver utilizzato DGA.
Alcuni driver semplicemente non riescono a tornare alla risoluzione normale (Usa Ctrl-Alt-Keypad + e Ctrl-Alt-Keypad - per cambiarla manualmente).
Alcuni driver semplicemente mostrano strani colori.
Alcuni driver mentono riguardo alla memoria che mappano nello spazio indirizzi del processo, perciò vo_dga non usa il doppio buffering (SIS?).
Alcuni driver sembra che falliscano nel fornire almeno una modalità valida. In questo caso il driver DGA andrà in crash raccontandoti di una modalità senza senso tipo 100000x100000 o qualcosa di simile.
L'OSD funziona solo col doppio buffering abilitato (altrimenti sfarfalla).