Parlando con amici e colleghi della riproduzione video su personal computer ho riscontrato più volte che, anche per gli appassionati, il concetto di video renderer è per lo più sconosciuto e, di fronte alla scelta che alcuni software di riproduzione consentono di compiere, si sceglie quello che capita.
Approfitto, quindi, di questo spazio nella rubrica Multimedia & dintorni per mettere ordine nel caos dei video renderer al quale mamma Microsoft ci ha sottoposto nel corso degli anni. Nell’intricato mondo dell’API DirectShow, il framework multimediale proposto da Microsoft allo scopo di consentire agli sviluppatori software di trattare ed elaborare uno stream di dati audio/video, i renderer rappresentano l’ultima parte del percorso di elaborazione cui sottoporre il proprio file multimediale.
Normalmente un percorso di calcolo DirectShow prevede tre tipi di filtri: Source filter, che ha il compito di leggere lo stream di dati multimediali (è il caso dei vari splitter, cioè i lettori dei formati di file), Transform filter, rappresentati essenzialmente dai codec che compiono la decodifica audio/video (H264, Mpeg2, MP3, AAC, ecc…), e Renderer filter. Questi ultimi possono essere audio o video a seconda della tipologia di stream di dati trattati.
Le versioni del DirectShow antecedenti alla 6.0, siamo nell’epoca di Windows 95, proponevano un video renderer chiamato con molta fantasia proprio Video Renderer. Il suo funzionamento si basava essenzialmente sul rendering del flusso video attraverso il DirectDraw.
A quei tempi il concetto di accelerazione in hardware della riproduzione video era ancora molto acerbo ed infatti la riproduzione video attraverso il Video Renderer finiva con il poggiarsi direttamente sulle API GDI di Windows la cui accelerazione in hardware era nulla. Il risultato era una visualizzazione fortemente dipendente dalla potenza di calcolo della CPU con tutto ciò che ne conseguiva per i possessori di processori meno prestanti: frame persi, fluidità a tratti e quant’altro.
Per sollevare la CPU dal compito di eseguire il rendering dei flussi video, il DirectShow 6.0 introdusse l’Overlay Mixer renderer. Il concetto alla base di questo video renderer è di proiettare direttamente nella memoria della scheda video il flusso video da visualizzare. Tale scopo fu raggiunto introducendo nelle schede video un componente hardware dedicato ad eseguire tale operazione.
Utilizzando un supporto hardware specifico, l’Overlay Mixer raggiunse pienamente l’obiettivo di ridurre al minimo l’occupazione della CPU per quanto concerne le operazioni di rendering del flusso video e rappresenta ad oggi ancora la modalità computazionalmente meno costosa limitatamente a tale operazione. Tuttavia l’Overlay Mixer introdusse anche una serie di limitazioni che all’epoca non ebbero molta risonanza a causa dell’uso limitato dei personal computer per le applicazioni multimediali.
La limitazione maggiore è legata al numero di Overlay Mixer in hardware delle schede video. Nella maggioranza dei casi, infatti, le schede video avevano un solo mixer hardware il che limitava non solo il numero massimo di video visualizzabili contemporaneamente a uno, ma solo una delle due (o più) uscite della scheda video potevano utilizzarlo. Non capita di rado ancora oggi di assistere ad una presentazione nella quale il notebook è collegato ad un videoproiettore utilizzando l’uscita video secondaria e, per questo motivo, al posto di visionare il filmato la platea assiste ad un bel rettangolo nero. Un ulteriore limite dell’Overlay Mixer renderer è quello di rendere a dir poco impossibile effettuare screenshot di un filmato perché la regione di schermo nella quale ricade il video è trattata da hardware dedicato che invia direttamente i dati all’uscita video, senza ricadere nel classico rendering via GDI o DirectDraw.
Con Windows XP, il primo sistema operativo Microsoft dedicato agli home user e basato sul kernel NT, fu esplicita la volontà della casa di Redmond di abbattere le limitazioni dell’Overlay Mixer renderer, introducendo il Video Mixer Renderer 7 (VMR 7), parte delle API DirectShow 7. Questo nuovo renderer non si poggiava più sull’hardware dedicato dell’Overlay Mixer, ma offriva un percorso simile a quello del primo Video Renderer, con, però, l’obbligo di basare il rendering video sul DirectDraw e non sulle GDI, consci del fatto che la maggioranza delle schede video offrivano un’accelerazione in hardware del DirectDraw molto più efficace di quanto possibile con le GDI. Inoltre il VMR 7 consentiva di eseguire il mixing di più stream video tra loro, dando la possibilità di introdurre, ad esempio, uno stream video dedicato ai sottotitoli.
Con il rilascio delle DirectX 9, Microsoft presenta anche il suo nuovo Video Mixer Renderer 9 che, contrariamente alla versione precedente, non si poggia più sul DirectDraw, bensì sul Direct3D 9. Nonostante il VMR 9 non fosse la modalità predefinita in Windows Media Player, divenne la preferita perché grazie alla sua associazione con il Direct3D 9 consentì ai produttori di schede video di avvalersi delle capacità di pixel shading dei loro processori grafici per eseguire la decodifica ed il post-processing.
In realtà l’accelerazione in hardware della riproduzione video (che si poggia sull’API DXVA) fu estesa anche al renderer Overlay Mixer per garantire la retrocompatibilità con i software di riproduzione più datati. Nonostante tutto, il VMR 9 resta il renderer più avanzato disponibile sotto Windows XP ed è l’unico a garantire, scheda video permettendo, la piena accelerazione in hardware della riproduzione video senza le limitazioni dell’Overlay Mixer.
In questo percorso evolutivo un aspetto che sicuramente alcuni avranno notato è la quantità notevole di API introdotte per eseguire sempre la stessa operazione. Il risultato è che in Windows XP esistono ben quattro differenti modalità per eseguire il video renderer, ognuna delle quali si poggia su API distinte: GDI, overlay mixer, DirectDraw e Direct3D.
Quando si tratta di migliorare qualcosa in informatica esiste spesso sia un approccio evolutivo, che un approccio rivoluzionario. Non nego che spesso il sottoscritto preferisca il secondo perché evolvere più volte conservando la retrocompatibilità porta inevitabilmente a scelte di compromesso che limitano l’orizzonte di innovazione ed introducono spesso confusione. In tal senso mi trovo d’accordo con Microsoft che ha colto al balzo l’occasione di ristrutturare profondamente la riproduzione multimediale con l’arrivo del pluricriticato Windows Vista.
Con il nuovo sistema operativo, infatti, Microsoft abbandona lo sviluppo dell’API DirectShow in favore del framework multimediale Media Foundation, assieme al quale debutta il nuovo Enhanced Video Renderer (EVR) e la versione 2.0 dell’API DXVA. L’EVR si poggia sul Direct3D ed ha funzionalità analoghe al VMR 9, alle quali aggiunge altre caratteristiche proprie di Windows Vista come il nuovo Multimedia Class Scheduler Service, un gestore dei thread dedicato alla riproduzione multimediale che assicura un timing molto più preciso e ad elevata priorità.
Il DXVA 2.0 garantisce una maggiore flessibilità nella programmazione delle operazioni accelerate in hardware dalla scheda video e può essere richiamato direttamente dai codec senza passare attraverso il video renderer. L’intero nuovo ecosistema per la riproduzione multimediale è disponibile solo in Windows Vista e richiede driver video WDDM compatibili con l’API DXVA 2.0 e l’EVR. Nel complesso, quindi, si può affermare che solo con l’ultimo sistema operativo Microsoft è stato raggiunto l’obiettivo di definire un’API per la riproduzione multimediale che possa facilmente avvalersi della potenza delle GPU senza particolari limitazioni.