Aktivieren der DirectX-Videobeschleunigung
[Das dieser Seite zugeordnete Feature Windows Media Format 11 SDK ist ein Legacyfeature. Es wurde von Source Reader und Sink Writer abgelöst. Source Reader und Sink Writer wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit quellleser und Senkenschreiber anstelle des Windows Media Format 11 SDK verwendet. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
In diesem Abschnitt wird beschrieben, wie Sie die Microsoft® DirectX-Videobeschleunigung® aktivieren, wenn Gestreamte Inhalte in einem benutzerdefinierten Player wiedergegeben werden.
Hintergrund
DirectX Video Acceleration (DirectX VA) ist eine API-Spezifikation für die Hardwarebeschleunigung von 2D-Decodierungsvorgängen. Es ermöglicht Softwaredecodern, bestimmte CPU-intensive Vorgänge zur Verarbeitung auf die Grafik Karte auszulagern. Für Endbenutzer ermöglicht dies videos mit hoher Bitrate, z. B. die Vollbild-DVD-Wiedergabe auf älteren Computern, die mit DirectX VA-kompatiblen Grafikkarten ausgestattet sind.
Ab dem Windows Media Format 9 Series SDK unterstützt der DMO Wrapper-Filter DirectX VA. Dies bedeutet, dass Anwendungen für die lokale Wiedergabe den WM ASF Reader-Filter verwenden können, um Windows Media-basierte Inhalte wiederzugeben, und die DirectX VA-Hardwarebeschleunigung wird automatisch aufgerufen, wenn die Grafik Karte sie unterstützt. Der WM ASF Reader-Filter 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 Medienwiedergabe ab der Windows Media 9-Serie verwendet wird.
Da Windows Medienwiedergabe vor der Entwicklung der QASF-Filter entwickelt wurde, verfügt Windows Medienwiedergabe über einen eigenen Quellfilter, der auf dem Windows Media Format SDK basiert, für die Wiedergabe von Windows Media-basierten Inhalten. Der WMP-Windows Media-Quellfilter übermittelt dekomprimierte Daten direkt an die Audio- und Videorenderer. Im Gegensatz dazu liefert der WM-ASF-Reader komprimierte Inhalte nach den DirectX-Medienobjekten (DMOs) von Windows Media Decoder, die im DMO-Wrapper gehostet werden. Die folgenden Diagramme veranschaulichen die Unterschiede zwischen dem WM ASF-Reader und dem WMP Windows Media-Quellfilter.
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 sie nacheinander an seine Ausgabepins zu senden. In 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, den Video Renderer und den WMV Decoder DMO mit den Schnittstellen bereitzustellen, die sie zum Aushandeln der DirectX VA-Verbindung benötigen. Der Quellfilter nimmt nicht an diesen Verhandlungen teil. Nach dem Start des Streamings besteht die einzige DirectX VA-bezogene Aufgabe, die der Quellfilter ausführen kann, darin, die Zeitstempel der Videobeispiele zu ändern, bevor der WMV-Decoder sie an den Videorenderer übermittelt. Der Hauptgrund dafür ist die Bereitstellung benutzerdefinierter Zeitleiste Kontrolle, die über die Standardmäßigen DirectShow-Schnittstellen® hinausgeht.
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 videomischen 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 Media Players aufgerufen, um die verschiedenen Verbindungen einzurichten, die zum Aktivieren von DirectX VA für die Decodierung von Windows Media Video-Inhalten erforderlich sind. |
IWMPlayerTimestampHook | Für den Quellfilter des Spielers implementiert. Es ermöglicht dem Filter, die Zeitstempel in den Videobeispielen zu ändern, bevor sie nachgeschaltet werden. |
IWMReaderAccelerator | Implementiert für das WM Reader-Objekt. Sie wird von einem Playerquellenfilter aufgerufen, um Schnittstellen aus dem Decoder-DMO abzurufen. |
Reihenfolge der Vorgänge in 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. Die in diesem Abschnitt genannten Komponenten sind:
- Ein Media Player eines Drittanbieters, der als Player bezeichnet wird.
- Ein benutzerdefinierter Quellfilter, der vom Player instanziiert wird und das Windows Media Format SDK zum Dekomprimieren von Windows Media-basierten Inhalten verwendet.
- Der Videoausgabepin des Quellfilters des Players, der als Ausgabepin bezeichnet wird.
- Das DirectShow-Videowiedergabefilterdiagramm, das als Graph bezeichnet wird.
- Der Videomischungsrenderer, der als VMR bezeichnet wird.
- Das Windows Media Format SDK Asynchronous Reader-Objekt, das als Reader bezeichnet wird.
- Das DirectX-Medienobjekt des Windows Media-Videodecoders, das als Decoder-DMO bezeichnet wird.
Die Reihenfolge der Vorgänge lautet wie folgt:
- Der Player instanziiert seinen Quellfilter und ein Reader-Objekt. 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 die Decoder-DMO am Aushandlungsprozess mit dem Diagramm beteiligt sein müssen und die DMO das Eingabeformat in Schritt 9 kennen muss.
- Der Player ruft IGraphBuilder::Render auf und stellt den Ausgabepin des Videoquellenfilters bereit. An diesem Punkt versucht der DirectShow-Filtergraph-Manager, die VMR mit dem Videoquellenfilter des Players zu verbinden.
- Der Filterdiagramm-Manager ruft IPin::Connect am Ausgabepin des Videoquellenfilters des Players auf.
Die Schritte 4 bis 10 treten innerhalb von IPin::Connect auf.
Der Quellfilter ruft die IWMCodecAMVideoAccelerator-Schnittstelle von der IWMReaderAccelerator::GetCodecInterface-Methode des Readers ab. Wenn der Codec DirectX VA nicht unterstützt, schlägt der Aufruf von GetCodecInterface möglicherweise fehl. In diesem Fall wird die Aushandlung wie gewohnt ohne DirectX VA-Unterstützung fortgesetzt.
Der Quellfilter übergibt den IAMVideoAccelerator-Zeiger von der Pin, die über IWMCodecAMVideoAccelerator::SetAcceleratorInterface an Connect to the decoder DMO übergeben wird.
Der Quellfilter delegiert dann den Rest des IPin::Connect-Vorgangs an die CBaseOutputPin::Connect-Methode . Die Formatenumeration mit dem SDK wird wie heute fortgesetzt. Wenn der Codec DirectX VA für den verbundenen Inhalt unterstützt, stellt der Codec-DMO diese DirectX VA-Untertypen zuerst vor den unterstützten TYPEN YUV und RGB dar. 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; }
Die CBaseOutputPin::Connect-Implementierung ruft in Schritt 3 IPin::CompleteConnect auf. Wenn ein DirectX VA-Untertyp in Betracht gezogen wird, wird versucht, die DirectX VA-Aushandlung durchzuführen. Der Ausgabepin ruft IWMCodecAMVideoAccelerator::NegotiateConnection auf und übergibt den aktuellen Ausgabemedientyp.
Der Decoder-DMO führt die erforderliche Aushandlung mit der VMR über die IAMVideoAccelerator-Schnittstelle aus und gibt die Videountertyp-GUID zurück, für die die beiden vereinbart 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 abgerufen werden kann.
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.
Der Quellfilter ruft IWMReaderAccelerator::Notify mit dem ausgehandelten Medientyp auf. Dadurch kann der Leser seine internen Variablen aktualisieren und einen Commit für DirectX VA ausführen. Dies ist die letzte Stelle, an der der Codec oder Der Reader fehlschlägt. Wenn einer der oben genannten Schritte fehlschlägt, sollte der Quellfilter zu Schritt 3 zurückkehren und den nächsten Typ ausprobieren, der vom Reader aufgelistet wird.
Die Wiedergabe beginnt. Der Reader ignoriert Ausgabepuffer aus dem Decoder-DMO, wenn der Verbindungsausgabetyp DirectX VA ist.
Wenn IPin::D isconnect auftritt, ruft der Quellfilter IWMCodecAMVideoAccelerator::SetAcceleratorInterfacemit null auf. Dadurch wird die DirectX VA-Verbindung zwischen dem Codec und dem Renderer unterbrochen.
Zugehörige Themen