Abilitazione dell'accelerazione video DirectX

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 Windows contenuto basato su supporti 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 Windows Serie 9 media.

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 supporti Windows. Il filtro origine multimediale WMP Windows fornisce dati decompressi direttamente ai renderer audio e video. Al contrario, il lettore WM ASF offre contenuti compressi downstream ai Windows Media Decoder DirectX Media Objects (DMO), ospitati all'interno del wrapper DMO. I diagrammi seguenti illustrano le differenze tra il lettore WM ASF e il filtro origine multimediale WMP Windows.

custom source filter outputs uncompressed samples

qasf source filter outputs compressed samples

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à l'SDK di formato multimediale Windows 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 decodificatore WMV DMO 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 decodificatore Windows media video DMO e il Mixer di sovrapposizione o il renderer di mix video. Queste interfacce sono descritte nella tabella seguente.

Interfaccia Descrizione
IWMCodecAMVideoAccelerator Esposto dal Windows Decodificatore multimediale DMO e chiamato dal filtro di origine di un lettore multimediale per configurare le varie connessioni necessarie per abilitare DirectX VA per decodificare Windows contenuto video multimediale.
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 da un'istanza del lettore, che usa l'SDK di formato multimediale Windows per decomprimere Windows contenuto basato su supporti.
  • 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 Windows Media Format SDK, definito lettore.
  • L'oggetto Media Decoder DirectX DirectX media Windows, denominato 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 decodificatore video DMO 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 grafico del filtro chiama IPin::Connessione nel pin di output del filtro origine video del lettore.

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

  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 Connessione al decodificatore DMO tramite IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Il filtro di origine delega quindi il resto dell'operazione IPin::Connessione al metodo CBaseOutputPin::Connessione. 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 di CBaseOutputPin::Connessione 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 al decodificatore DMO'interfaccia IAMVideoAcceleratorNotify, 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