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.

  1. Implementieren Sie die METHODE VERFORMTransform::GetAttributes. Diese Methode gibt einen Zeiger auf einen Attributspeicher zurück.
  2. 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.
  3. 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.
  4. 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.
  5. Vorausgesetzt, dass der vorherige Schritt erfolgreich ist, müssen die METHODEN VERALTENTransform::GetInputAvailableType und DANNTransform::GetOutputAvailableType DXVA-kompatible Formate zurückgeben.
  6. 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.
  7. 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:

  1. Legen Sie in der METHODE VERERBTRANSFORM::GetOutputStreamInfo das Flag MFT OUTPUT STREAM _ PROVIDES _ _ _ SAMPLES fest.
  2. Erstellen Sie einen Pool mit DXVA-Oberflächen, wie in der DXVA-Spezifikation beschrieben.
  3. 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.

Schreiben eines benutzerdefinierten MFT