Aktivieren der DirectX-Videobeschleunigung

In diesem Abschnitt wird beschrieben, wie Sie microsoft® DirectX® Videobeschleunigung aktivieren, wenn gestreamte Inhalte in einem benutzerdefinierten Player wiedergestreamt werden.

Hintergrund

DirectX Video Acceleration (DirectX VA) ist eine API-Spezifikation für die Hardwarebeschleunigung von 2D-Decodierungsvorgängen. Sie ermöglicht Softwaredecodern, bestimmte CPU-intensive Vorgänge zur Verarbeitung auf die Grafikkarte zu überladen. Für Endbenutzer ermöglicht dies videos mit hoher Bitrate, z. B. die Wiedergabe von Vollbild-DVD auf älteren Computern, die mit DirectX VA-kompatiblen Grafikkarten ausgestattet sind.

Ab dem Windows Media Format 9 Series SDK unterstützt der DMO Wrapperfilter DirectX VA. Dies bedeutet, dass Anwendungen für die lokale Wiedergabe den WM ASF-Readerfilter verwenden können, um Windows Medienbasierte Inhalte wiedergeben, und die DirectX VA-Hardwarebeschleunigung wird automatisch aufgerufen, wenn die Grafikkarte dies unterstützt. Der WM ASF-Readerfilter unterstützt jedoch keine Wiedergabe von gestreamten Inhalten. Wenn Sie DirectX VA bei der Wiedergabe von gestreamten Inhalten in einem benutzerdefinierten Player unterstützen möchten, müssen Sie daher einen alternativen Mechanismus verwenden, der von Windows Media Player ab der Windows Media 9-Serie verwendet wird.

Da Windows Media Player vor der Entwicklung der QASF-Filter entworfen wurde, verfügt Windows Media Player über einen eigenen Quellfilter, der auf dem Windows Media Format SDK basiert, um Windows medienbasierten Inhalt wieder zu spielen. Der WMP Windows Medienquellenfilter stellt dekomprimierte Daten downstream direkt an die Audio- und Videorenderer zur Verfügung. Im Gegensatz dazu stellt der WM ASF-Reader komprimierte Inhalte nachgeschaltet an den Windows Media Decoder DirectX Media Objects (DMOs) zur Verfügung, die im DMO Wrapper gehostet werden. Die folgenden Diagramme veranschaulichen die Unterschiede zwischen dem WM ASF-Reader und dem WMP-Windows Medienquellenfilter.

Benutzerdefinierter Quellfilter gibt unkomprimierte Beispiele aus

Qasf-Quellfilter gibt komprimierte Stichproben aus

Um DirectX VA für gestreamte Inhalte zu aktivieren, müssen Sie einen benutzerdefinierten Quellfilter wie den im oberen Diagramm erstellen. Im Grunde verwendet dieser Filter das Windows Media Format SDK, um ein WM Reader-Objekt zu instanziieren, die Beispiele zu dekomprimieren und nachgeschaltet an die Ausgabepins zu senden. Bei dieser Diskussion wird davon ausgegangen, dass Sie den Quellfilter bereits erstellt haben und nun bereit sind, die DirectX-Va-Unterstützung zu implementieren.

Um DirectX VA zu aktivieren, besteht die grundlegende Aufgabe des Quellfilters darin, dem Videorenderer und dem WMV-Decoder DMO die Schnittstellen zur Verfügung zu stellen, die sie zum Aushandeln der DirectX VA-Verbindung benötigen. Der Quellfilter ist an diesen Ausk worden. Nach dem Start des Streamings besteht die einzige DirectX VA-bezogene Aufgabe, die der Quellfilter ausführen kann, darin, die Zeitstempel in den Videobeispielen zu ändern, bevor der WMV-Decoder sie an den Videorenderer übergibt. Der Hauptgrund dafür ist die Bereitstellung einer benutzerdefinierten Zeitachsensteuerung, die über das hinaus geht, was die standardmäßigen DirectShow®-Schnittstellen ermöglichen.

Es werden drei Schnittstellen definiert, um die erforderliche Kommunikation zwischen dem Windows Media Format SDK, dem Quellfilter des Players, dem Windows Media Video-Decoder DMO und dem Overlay Mixer- oder Video Mixing Renderer zu ermöglichen. Diese Schnittstellen werden in der folgenden Tabelle beschrieben.

Schnittstelle BESCHREIBUNG
IWMCodecAMVideoAccelerator Wird vom Windows Media Decoder DMO verfügbar gemacht und vom Quellfilter eines Medienplayers aufgerufen, um die verschiedenen Verbindungen einrichten zu können, die erforderlich sind, um DirectX VA für die Decodierung von Inhalten Windows Media Video zu aktivieren.
IWMPlayerTimestampHook Wird im Quellfilter des Players implementiert. Sie ermöglicht es dem Filter, die Zeitstempel der Videobeispiele zu ändern, bevor sie nachgeschaltet werden.
IWMReaderAccelerator Wird für das WM-Readerobjekt implementiert. Sie wird von einem Playerquellenfilter aufgerufen, um Schnittstellen aus dem Decoder zu DMO.

Reihenfolge der Vorgänge bei der DirectX VA-fähigen Wiedergabe

In diesem Abschnitt wird die allgemeine Reihenfolge der Vorgänge zur Laufzeit für einen DirectX VA-fähigen Player und dessen Quellfilter beschrieben. In diesem Abschnitt werden die folgenden Komponenten beschrieben:

  • Ein Medienplayer eines Drittanbieters, der als Player bezeichnet wird.
  • Ein benutzerdefinierter Quellfilter, der vom Player instanziiert wird und das Windows Media Format SDK verwendet, um Windows medienbasierten Inhalt zu dekomprimieren.
  • Der Videoausgabepin des Quellfilters des Players, der als Ausgabepin bezeichnet wird.
  • Das DirectShow-Videowiedergabefilterdiagramm, das als Diagramm bezeichnet wird.
  • Der VideoMischungsrenderer, der als VMR bezeichnet wird.
  • Das Windows Sdk für asynchrone Reader, das als Reader bezeichnet wird.
  • Das Windows Media Video Decoder DirectX Media Object, das als Decoder-Objekt bezeichnet DMO.

Die Reihenfolge der Vorgänge lautet wie folgt:

  1. Der Player instanziiert seinen Quellfilter und ein Readerobjekt. Der Reader erstellt einen Videodecoder DMO und legt den (komprimierten) Eingabetyp darauf fest. Dies muss geschehen, bevor der Player versucht, seinen Videowiedergabegraphen zu konfigurieren, da das SDK und der Decoder DMO am Aushandlungsprozess mit dem Graph beteiligt sein müssen und der DMO das Eingabeformat in Schritt 9 kennen muss.
  2. Der Player ruft IGraphBuilder::Render auf und stellt den Ausgabepin des Videoquellenfilters zur Verfügung. An diesem Punkt versucht der DirectShow-Filtergraph-Manager, die VMR mit dem Videoquellenfilter des Players zu verbinden.
  3. Der Filterdiagramm-Manager ruft IPin::Verbinden auf dem Ausgabepin des Videoquellenfilters des Players auf.

Die Schritte 4 bis 10 erfolgen innerhalb von IPin::Verbinden.

  1. Der Quellfilter erhält die IWMCodecAMVideoAccelerator-Schnittstelle aus der IWMReaderAccelerator::GetCodecInterface-Methode des Readers. Wenn der Codec DirectX VA nicht unterstützt, kann der Aufruf von GetCodecInterface fehlschlagen. In diesem Fall wird die Aushandlung wie gewohnt ohne DirectX VA-Unterstützung fortgesetzt.

  2. Der Quellfilter übergibt den IAMVideoAccelerator-Zeiger von dem an Verbinden übergebenen Pin an den Decoder DMO über IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Der Quellfilter delegiert dann den Rest des IPin::Verbinden-Vorgangs an die CBaseOutputPin::Verbinden-Methode. Die Formatenumeration mit dem SDK wird wie heute fortgesetzt. Wenn der Codec DirectX VA für den inhalt unterstützt, der verbunden wird, stellt der Codec DMO diese DirectX VA-Untertypen zuerst vor den unterstützten YUV- und RGB-Typen vor. Wenn DirectX VA-Unterstützung verfügbar ist, werden die Schritte 7 bis 11 im Kontext eines DirectX VA-Untertyps versucht. Der folgende Codeausschnitt zeigt, wie Sie einen DirectX VA-Medienuntertyp identifizieren.

    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. Die CBaseOutputPin::Verbinden-Implementierung ruft in Schritt 3 IPin::CompleteConnect auf. Wenn ein DirectX VA-Untertyp berücksichtigt wird, wird versucht, die DirectX VA-Aushandlung zu versuchen. Der Ausgabepin ruft IWMCodecAMVideoAccelerator::NegotiateConnection auf und über gibt ihn an den aktuellen Ausgabemedientyp weiter.

  5. Der Decoder DMO führt die erforderliche Aushandlung mit der VMR über die IAMVideoAccelerator-Schnittstelle aus und gibt die Videountertyp-GUID zurück, auf die sich die beiden festgelegt haben. Der Ausgabepin delegiert alle IAMVideoAcceleratorNotify-Aufrufe, die während dieses Prozesses empfangen werden, an die IAMVideoAcceleratorNotify-Schnittstelle des Decoders DMO, die auch über die IWMReaderAccelerator::GetCodecInterface-Methode erhalten werden kann.

  6. Wenn NegotiateConnection erfolgreich ist, ruft der Ausgabepin IWMCodecAMVideoAccelerator::SetPlayerNotify mit einer IWMPlayerTimestampHook-Schnittstelle auf. Mit diesem Hook kann der Quellfilter die Zeitstempel der Beispiele aktualisieren, bevor sie an den Renderer übergeben werden.

  7. Der Quellfilter ruft IWMReaderAccelerator::Notify mit dem ausgehandelten Medientyp auf. Dies ermöglicht dem Reader, seine internen Variablen zu aktualisieren und einen Commit für DirectX VA zu erstellen. Dies ist der letzte Ort, an dem der Codec oder Reader fehlschlagen kann. Wenn einer der oben genannten Schritte fehlschlägt, sollte der Quellfilter zu Schritt 3 zurückkehren und den nächsten vom Reader aufzählten Typ ausprobieren.

  8. Die Wiedergabe wird gestartet. Der Reader ignoriert Ausgabepuffer aus dem Decoder und DMO, wenn der Verbindungsausgabetyp DirectX VA ist.

  9. Wenn IPin::D isconnect auftritt, ruft der Quellfilter IWMCodecAMVideoAccelerator::SetAcceleratorInterface mit einem NULL-Wert auf. Dadurch wird die DirectX VA-Verbindung zwischen dem Codec und dem Renderer unterbricht.

Lesen von ASF-Dateien