Abilitazione dell'accelerazione video DirectX
[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stato sostituito da lettore di origine e scrittore di sink. Source Reader e Sink Writer sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi lettore di origine e scrittore di destinazione invece di Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Questa sezione descrive come abilitare® Microsoft DirectX® Video Acceleration durante la riproduzione di contenuti trasmessi in un lettore personalizzato.
Sfondo
DirectX Video Acceleration (DirectX VA) è una specifica API per l'accelerazione hardware delle operazioni di decodifica 2D. Consente ai decodificatori software di eseguire l'offload di determinate operazioni a elevato utilizzo di CPU nella scheda grafica per l'elaborazione. Per gli utenti finali, questo rende possibile video a velocità elevata, ad esempio la riproduzione di DVD a schermo intero su computer meno recenti dotati di schede grafiche compatibili con DirectX VA.
A partire da Windows Media Format 9 Series SDK, il filtro Wrapper DMO supporta DirectX VA. Ciò significa che, per la riproduzione locale, le applicazioni possono usare il filtro lettore ASF WM per riprodurre contenuto basato su Windows Media e l'accelerazione hardware DirectX VA verrà richiamata automaticamente se la scheda grafica lo supporta. Tuttavia, il filtro lettore ASF WM non supporta la riproduzione di contenuti trasmessi. Pertanto, se vuoi supportare DirectX VA durante la riproduzione di contenuti trasmessi in un lettore personalizzato, devi usare un meccanismo alternativo, che è quello usato da Windows Media Player a partire dalla serie windows Media 9.
Poiché Windows Media Player è stato progettato prima dello sviluppo dei filtri QASF, Windows Media Player ha un proprio filtro di origine, basato su Windows Media Format SDK, per la riproduzione di contenuti basati su Windows Media. Il filtro origine multimediale Windows WMP fornisce i dati decompressi downstream direttamente ai renderer audio e video. Al contrario, il WM ASF Reader fornisce contenuto compresso a valle agli Oggetti Media DirectX (DMO) del decodificatore multimediale Windows, ospitati all'interno del Wrapper DMO. I diagrammi seguenti illustrano le differenze tra il lettore WM ASF e il filtro origine di Windows Media WMP.
Per abilitare DirectX VA per il contenuto trasmesso, è necessario creare un filtro di origine personalizzato come quello nel diagramma superiore. In pratica, questo filtro userà Windows Media Format SDK per creare un'istanza di un oggetto Lettore WM, decomprimere gli esempi e inviarli downstream sui relativi pin di output. Questa discussione presuppone che il filtro di origine sia già stato creato e che sia ora pronto per implementare il supporto di DirectX VA.
Per abilitare DirectX VA, l'attività di base del filtro di origine consiste nel fornire il Renderer video e il DMO decodificatore WMV con le interfacce necessarie per negoziare la connessione DirectX VA. Il filtro di origine non partecipa a tali negoziati. Dopo l'avvio dello streaming, l'unica attività correlata a DirectX VA che il filtro di origine può eseguire consiste nel modificare i timestamp negli esempi video prima che il decodificatore WMV li distribuisca al Renderer video. Il motivo principale di questa operazione è fornire un controllo sequenza temporale personalizzato oltre a quello che abilitano le interfacce DirectShow® standard.
Sono definite tre interfacce per abilitare le comunicazioni necessarie tra Windows Media Format SDK, il filtro di origine del lettore, il decodificatore DMO di Windows Media Video e il mixer overlay o il renderer di mixaggio video. Queste interfacce sono descritte nella tabella seguente.
Interfaccia | Descrizione |
---|---|
IWMCodecAMVideoAccelerator | Esposto da Windows Media Decoder DMO e chiamato dal filtro di origine di un lettore multimediale per configurare le varie connessioni necessarie per abilitare DirectX VA per la decodifica del contenuto di Windows Media Video. |
IWMPlayerTimestampHook | Implementato nel filtro di origine del lettore. Consente al filtro di modificare i timestamp negli esempi video prima di recapitarli a valle. |
IWMReaderAccelerator | Implementato nell'oggetto Lettore WM. Viene chiamato da un filtro di origine del lettore per ottenere interfacce dal decodificatore DMO. |
Ordine delle operazioni nella riproduzione abilitata per DirectX VA
Questa sezione descrive l'ordine generale delle operazioni in fase di esecuzione per un lettore abilitato per DirectX VA e il relativo filtro di origine. I componenti a cui si fa riferimento in questa sezione sono:
- Un lettore multimediale di terze parti, detto lettore.
- Filtro di origine personalizzato, creato dall'istanza del lettore, che usa Windows Media Format SDK per decomprimere il contenuto basato su Windows Media.
- Pin di output video del filtro di origine del lettore, detto pin di output.
- Il grafico del filtro di riproduzione video DirectShow, noto come grafico.
- Il renderer di mixaggio video, noto come VMR.
- Oggetto Lettore asincrono di Windows Media Format SDK, detto lettore.
- L'oggetto multimediale DirectX Media, noto come decoder video di Windows Media DMO.
L'ordine delle operazioni è il seguente:
- Il lettore crea un'istanza del filtro di origine e di un oggetto lettore. Il lettore crea un decodificatore video DMO e imposta su di esso il tipo di input (compresso). Questa operazione deve verificarsi prima che il lettore tenti di configurare il grafico di riproduzione video perché l'SDK e il decodificatore DMO devono essere coinvolti nel processo di negoziazione con il grafico e DMO deve conoscere il formato di input durante il passaggio 9.
- Il lettore chiama IGraphBuilder::Render, fornendogli il pin di output del filtro di origine video. A questo punto, il DirectShow filter graph manager tenta di connettere il VMR al filtro di origine video del lettore.
- Il manager del grafico dei filtri chiama IPin::Connect sul pin di uscita del filtro sorgente video del lettore.
I passaggi da 4 a 10 si verificano all'interno di IPin::Connect.
Il filtro di origine ottiene l'interfaccia IWMCodecAMVideoAccelerator dal metodo IWMReaderAccelerator::GetCodecInterface del lettore. Se il codec non supporta DirectX VA, la chiamata a GetCodecInterface potrebbe non riuscire. In questo caso, la negoziazione procede come di consueto, senza il supporto di DirectX VA.
Il filtro di origine passa il puntatore IAMVideoAccelerator dal pin passato nel Connect al decodificatore DMO tramite IWMCodecAMVideoAccelerator::SetAcceleratorInterface.
Il filtro di origine delega quindi il resto dell'operazione IPin::Connect al metodo CBaseOutputPin::Connect. L'enumerazione del formato con l'SDK procede come avviene oggi. Se il codec supporta DirectX VA per il contenuto connesso, il codec DMO presenta prima i sottotipi DirectX VA, prima dei tipi YUV e RGB supportati. Se è disponibile il supporto di DirectX VA, i passaggi da 7 a 11 vengono tentati nel contesto di un sottotipo directX VA. Il frammento di codice seguente illustra come identificare un sottotipo multimediale DirectX VA.
bool IsDXVASubtype( AM_MEDIA_TYPE * pmt ) { // All DXVA types have the same last 3 DWORDs. // guidDXVA is the base GUID for all DXVA subtypes. GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } }; unsigned long const * plguid; unsigned long const * plguidDXVA; plguid = (unsigned long const *)&pmt->subtype; plguidDXVA = (unsigned long *)&guidDXVA; if( ( plguid[1] == plguidDXVA[1] ) && ( plguid[2] == plguidDXVA[2] ) && ( plguid[3] == plguidDXVA[3] ) ) { return true; } return false; }
L'implementazione di CBaseOutputPin::Connect chiama IPin::CompleteConnect durante il passaggio 3. Se viene considerato un sottotipo DirectX VA, viene tentata la negoziazione DirectX VA. Il pin di output chiama IWMCodecAMVideoAccelerator::NegotiateConnection, passandogli il tipo di supporto multimediale di output corrente.
Il DMO del decodificatore esegue la negoziazione richiesta con vmR tramite l'interfaccia IAMVideoAccelerator e restituisce il GUID del sottotipo video su cui i due hanno concordato. Il pin di output delega tutte le chiamate IAMVideoAcceleratorNotify ricevute durante questo processo all'interfaccia IAMVideoAcceleratorNotify del decoder DMO, che può essere ottenuta anche tramite il metodo IWMReaderAccelerator::GetCodecInterface.
Se NegotiateConnection ha esito positivo, il pin di output chiama IWMCodecAMVideoAccelerator::SetPlayerNotify con una interfaccia IWMPlayerTimestampHook. Questo hook consente al filtro di origine di aggiornare i timestamp negli esempi prima che vengano passati al renderer.
Il filtro di origine chiama IWMReaderAccelerator::Notify con il tipo di media negoziato. In questo modo il lettore può aggiornare le variabili interne ed eseguire il commit in DirectX VA. Questo è l'ultimo punto in cui il codec o il lettore può fallire. Se uno dei passaggi precedenti ha esito negativo, il filtro di origine deve tornare al passaggio 3 e provare il tipo successivo enumerato dal lettore.
Viene avviata la riproduzione. Il lettore ignora i buffer di output dal decodificatore DMO se il tipo di output della connessione è DirectX VA.
Quando IPin::Disconnect si verifica, il filtro di origine chiama IWMCodecAMVideoAccelerator::SetAcceleratorInterface con un NULL. In questo modo si interrompe la connessione DirectX VA tra il codec e il renderer.
Argomenti correlati