Direct3D-Aware MFTs
In diesem Thema wird beschrieben, wie Sie eine Direct3D-orientierte Media Foundation Transform (MFT) für Video implementieren.
Ein Video-MFT gilt als Direct3D-bewusst, wenn es Beispiele verarbeiten kann, die Direct3D-Oberflächen enthalten. Der typische Grund für die Unterstützung von Direct3D in einem Video-MFT ist die Aktivierung der hardwarebeschleunigten Decodierung mithilfe der DirectX-Videobeschleunigung (DXVA).
In diesem Thema werden die Schritte beschrieben, die erforderlich sind, damit Ihr MFT Direct3D-gerät. In diesem Thema werden die Mechanismen der DXVA-Decodierung nicht beschrieben. Informationen zu DXVA finden Sie unter DirectX-Videobeschleunigung 2.0.
Wichtig
Ab dem Windows 8 kann EINDXGIDeviceManager anstelle von IDirect3DDeviceManager9 verwendet werden. Für Windows Store Apps müssen Sie DIE IDXGIDeviceManager-Klasse und Microsoft Direct3D 11 verwenden. Weitere Informationen finden Sie in den Direct3D 11-Video-APIs.
- Implementieren Sie die METHODE VERFORMTransform::GetAttributes. Diese Methode gibt einen Zeiger auf einen Attributspeicher zurück.
- Der MFT muss den Wert des MF _ SA _ D3D _ AWARE-Attributs für seinen eigenen Attributspeicher auf TRUE festlegen. Ab Windows 8 bei Verwendung von Direct3D 11 MF _ SA _ D3D11 _ AWARE verwenden.
- Wenn während der Formataushandlung das Attribut MF _ SA _ D3D _ AWARE (oder MF SA _ _ D3D11 _ AWARE bei Verwendung von Direct3D 11) TRUE ist, kann der Client die MFT MESSAGE _ SET _ _ D3D _ MANAGER-Nachricht an MFT senden. Der ulParam-Ereignisparameter ist ein Zeiger auf die IDirect3DDeviceManager9-Schnittstelle. Ab Windows 8 können Sie DIE IDirect3DDeviceManager9 anstelle von IDirect3DDeviceManager9 verwenden. Der Client muss diese Nachricht nicht senden.
- Der MFT ruft IDirect3DDeviceManager9::GetVideoService auf, um den benötigten DXVA-Dienst abzurufen. Ab Windows 8 wird durch den MFT-Aufruf DURCHDXGIDeviceManager::GetVideoServiceverwendet, wenn EINDXGIDeviceManager verwendet wurde. In der Regel würde ein Decoder IDirectXVideoDecoderServiceabfragen, und ein Videoprozessor würde nach IDirectXVideoProcessorService abfragen.
- Vorausgesetzt, dass der vorherige Schritt erfolgreich ist, müssen die METHODEN VERALTENTransform::GetInputAvailableType und DANNTransform::GetOutputAvailableType DXVA-kompatible Formate zurückgeben.
- Der Client konfiguriert die Medientypen auf dem MFT. Wenn ein Medientyp nicht mit DXVA kompatibel ist, muss MFT den Fehlercode MF _ E _ UNSUPPORTED _ D3D _ TYPE zurückgeben.
- An diesem Punkt gibt es zwei Optionen, je nachdem, ob der Client ein geeignetes DXVA-Format findet.
- Wenn der Client erfolgreich ein DXVA-Format konfiguriert, beginnt er möglicherweise mit der Verarbeitung. An diesem Punkt kann der MFT DXVA für die Verarbeitung verwenden oder auf die Softwareverarbeitung zurückfallen.
- Wenn der Client kein akzeptables DXVA-Format findet, kann der Client alternativ eine weitere MFT _ MESSAGE SET _ _ D3D _ MANAGER-Nachricht senden. Dieses Mal wird ulParam auf NULL festgelegt. Der MFT muss den IDirect3DDeviceManager9-Zeiger (den ZEIGER FÜR DEN BENUTZEROBERFLÄCHEDXGIDeviceManager, wenn EINDXGIDeviceManager verwendet wurde) und alle anderen DXVA-Schnittstellen frei geben und zur Softwareverarbeitung zurückverwenden. An diesem Punkt darf MFT keine DXVA-Verarbeitung verwenden.
Ein Direct3D-orientiertes MFT muss für die Handhabung von Beispielen vorbereitet werden, die eine Direct3D-Oberfläche enthalten. Das Beispiel enthält genau einen Medienpuffer. Um die Direct3D-Oberfläche aus dem Puffer zu erhalten, rufen Sie die MFGetService-Funktion auf, und geben Sie den MR BUFFER _ _ SERVICE-Dienst an. Weitere Informationen finden Sie unter DirectX Surface Buffer.
Eine MFT, die DXVA verwendet, muss ihre eigenen Ausgabebeispiele wie folgt zuordnen:
- Legen Sie in der METHODE VERERBTRANSFORM::GetOutputStreamInfo das Flag MFT OUTPUT STREAM _ PROVIDES _ _ _ SAMPLES fest.
- Erstellen Sie einen Pool mit DXVA-Oberflächen, wie in der DXVA-Spezifikation beschrieben.
- Erstellen Sie Medienbeispiele, indem Sie MFCreateVideoSampleFromSurface aufrufen.
MFT sollte die Softwareverarbeitung immer als Fallback unterstützen, da DXVA-Verarbeitung aus verschiedenen Gründen möglicherweise nicht verfügbar ist:
- Die GPU unterstützt DXVA möglicherweise nicht.
- Der Client verwendet möglicherweise direct3D nicht.
- DXVA-Profile sind nicht für jedes Videoformat definiert.
Ein Direct3D-orientiertes MFT muss über einen einzelnen Ausgabestream verfügen. Er darf nicht mehrere Ausgaben haben.