Abilitazione dell'accelerazione video DirectX

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita da Lettore di origine e Writer sink. Lettore di origine e Writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi Lettore di origine e Writer sink anziché 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 l'accelerazione video Di Microsoft® DirectX® durante la riproduzione di contenuti in streaming 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 scaricare alcune operazioni a elevato utilizzo della CPU nella scheda grafica per l'elaborazione. Per gli utenti finali, questo rende possibile un video a velocità elevata, ad esempio la riproduzione DVD a schermo intero nei 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 contenuti basati su Windows Media e l'accelerazione hardware DirectX VA verrà richiamata automaticamente se la scheda grafica la supporta. Tuttavia, il filtro lettore ASF WM non supporta la riproduzione di contenuti trasmessi. Pertanto, se si vuole supportare DirectX VA durante la riproduzione di contenuti in streaming in un lettore personalizzato, è necessario usare un meccanismo alternativo, ovvero quello usato da Lettore multimediale Windows a partire dalla serie Windows Media 9.

Poiché Lettore multimediale Windows è stato progettato prima che i filtri QASF siano stati sviluppati, Lettore multimediale Windows ha un proprio filtro di origine, basato su Windows Media Format SDK, per la riproduzione di contenuti basati su Windows Media. Il filtro origine di Windows Media WMP offre dati decompressi direttamente ai renderer audio e video. Al contrario, il lettore WM ASF offre contenuti compressi downstream agli oggetti multimediali DirectX Decodificatore Windows Media, ospitati all'interno del wrapper DMO. I diagrammi seguenti illustrano le differenze tra il lettore ASF WM e il filtro origine Windows Media WMP.

esempi non compressi dei filtri di origine personalizzati

Esempi compressi dei filtri di origine qasf

Per abilitare DirectX VA per il contenuto in streaming, è necessario creare un filtro di origine personalizzato come quello nel diagramma superiore. Fondamentalmente, questo filtro userà Windows Media Format SDK per creare un'istanza di un oggetto Lettore WM, decomprimere gli esempi e inviarli downstream sui pin di output. Questa discussione presuppone che il filtro di origine sia già stato creato e che sia ora pronto per implementare il supporto directX VA.

Per abilitare DirectX VA, l'attività di base del filtro di origine consiste nel fornire il Renderer video e il DMO del 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 recapita al Renderer video. Il motivo principale per eseguire questa operazione consiste nel fornire un controllo sequenza temporale personalizzato oltre a quello che le interfacce DirectShow® standard abilitano.

Tre interfacce sono definite per abilitare le comunicazioni necessarie tra Windows Media Format SDK, il filtro di origine del lettore, il DMO del decodificatore video Di Windows Media e il renderer di sovrapposizione di sovrapposizioni. 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 decodificare il contenuto di Windows Media Video.
IWMPlayerTimestampHook Implementato nel filtro di origine del giocatore. Consente al filtro di modificare i timestamp negli esempi video prima di recapitarli a valle.
IWMReaderAccelerator Implementato nell'oggetto Reader WM. Viene chiamato da un filtro di origine 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, noto come lettore.
  • Filtro di origine personalizzato, creato dall'istanza del lettore, che usa Windows Media Format SDK per decomprimere il contenuto basato su Windows Media.
  • Il pin di output video del filtro di origine del lettore, denominato pin di output.
  • Grafico del filtro di riproduzione video DirectShow, denominato grafico.
  • Il renderer di mix video, denominato VMR.
  • Oggetto Lettore asincrono di Windows Media Format SDK, definito lettore.
  • L'oggetto Media Decoder DirectX Media di Windows Media, definito decodificatore DMO.

L'ordine delle operazioni è il seguente:

  1. Il lettore crea un'istanza del filtro di origine e di un oggetto lettore. Il lettore crea un DMO del decodificatore video e imposta il tipo di input (compresso) su di esso. Ciò 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 il DMO deve conoscere il formato di input durante il passaggio 9.
  2. Il lettore chiama IGraphBuilder::Render, fornendo il pin di output del filtro di origine video. A questo punto, la gestione dei filtri DirectShow tenta di connettere vmR al filtro origine video del lettore.
  3. Il gestore del grafo del filtro chiama IPin::Connect sul pin di output del filtro origine video del lettore.

I passaggi da 4 a 10 si verificano all'interno di IPin::Connect.

  1. Il filtro di origine ottiene l'interfaccia IWMCodecAMVideoAccelerator dal metodo IWMReaderAccelerator::GetCodecInterface . Se il codec non supporta DirectX VA, la chiamata a GetCodecInterface potrebbe non riuscire. In questo caso, la negoziazione procede come di consueto, senza supporto directX VA.

  2. Il filtro di origine passa il puntatore IAMVideoAccelerator dal pin passato a Connect al decodificatore DMO tramite IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Il filtro di origine delega quindi il resto dell'operazione IPin::Connect al metodo CBaseOutputPin ::Connect. L'enumerazione di formato con l'SDK procede così come avviela 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 il supporto di DirectX VA è disponibile, 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;
    }
    
    
  4. L'implementazione 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, passandolo il tipo di supporto di output corrente.

  5. Il decodificatore DMO esegue la negoziazione necessaria con vmR tramite l'interfaccia IAMVideoAccelerator e restituisce il GUID del sottotipo video che i due hanno concordato. Il pin di output delega tutte le chiamate IAMVideoAcceleratorNotify ricevute durante questo processo all'interfaccia IAMVideoAcceleratorNotify del decodificatore DMO, che può essere ottenuta anche tramite il metodo IWMReaderAccelerator::GetCodecInterface .

  6. Se NegotiateConnection ha esito positivo, il pin di output chiama IWMCodecAMVideoAccelerator::SetPlayerNotify con un'interfaccia IWMPlayerTimestampHook . Questo hook consente al filtro di origine di aggiornare i timestamp negli esempi prima che vengano passati al renderer.

  7. Il filtro di origine chiama IWMReaderAccelerator::Notify con il tipo di supporto negoziato. Ciò consente al lettore di aggiornare le variabili interne e di eseguire il commit in DirectX VA. Questo è l'ultimo posto in cui il codec o il lettore possono avere esito negativo. 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.

  8. Viene avviata la riproduzione. Il lettore ignora i buffer di output dal decodificatore DMO se il tipo di output della connessione è DirectX VA.

  9. Quando si verifica IPin::D isconnect , il filtro di origine chiama IWMCodecAMVideoAccelerator::SetAcceleratorInterface con un valore NULL. In questo modo la connessione DirectX VA tra il codec e il renderer.

Lettura dei file ASF