Freigeben über


Direct3D-Aware MFTs

In diesem Thema wird beschrieben, wie Sie eine Direct3D-fähige Media Foundation-Transformation (MFT) für Video implementieren.

Ein Video-MFT wird als Direct3D-fähigen betrachtet, wenn Es Beispiele verarbeiten kann, die Direct3D-Oberflächen enthalten. Der typische Grund für die Unterstützung von Direct3D in einem Video-MFT besteht darin, die hardwarebeschleunigte Decodierung mithilfe von DirectX Video Acceleration (DXVA) zu aktivieren.

In diesem Thema werden die Schritte beschrieben, die erforderlich sind, um Ihre MFT Direct3D-fähig zu machen. In diesem Thema wird die Mechanik der DXVA-Decodierung nicht behandelt. Informationen zu DXVA finden Sie unter DirectX Video Acceleration 2.0.

Wichtig

Ab Windows 8 können IMFDXGIDeviceManager- anstelle der IDirect3DDeviceManager9verwendet werden. Für Windows Store-Apps müssen Sie IMFDXGIDeviceManager und Microsoft Direct3D 11 verwenden. Weitere Informationen finden Sie in den Direct3D 11-Video-APIs.

 

  1. Implementieren Sie die IMFTransform::GetAttributes-Methode. Diese Methode gibt einen Zeiger auf einen Attributspeicher zurück.
  2. MFT muss den Wert des attributs MF_SA_D3D_AWARE auf TRUE- im eigenen Attributspeicher festlegen. Ab Windows 8 verwenden Sie bei Verwendung von Direct3D 11 MF_SA_D3D11_AWARE.
  3. Wenn die MF_SA_D3D_AWARE (oder MF_SA_D3D11_AWARE bei Verwendung von Direct3D 11)-Attribut TRUEist, kann der Client die MFT_MESSAGE_SET_D3D_MANAGER Nachricht an den MFT senden. Der ulParam- Ereignisparameter ist ein Zeiger auf die IDirect3DDeviceManager9 Schnittstelle. Ab Windows 8 können Sie IMFDXGIDeviceManager- anstelle von IDirect3DDeviceManager9verwenden. Der Client ist nicht erforderlich, um diese Nachricht zu senden.
  4. MFT ruft IDirect3DDeviceManager9::GetVideoService auf, um den benötigten DXVA-Dienst abzufragen. Ab Windows 8, wenn IMFDXGIDeviceManager verwendet wurde, werden die MFT-Aufrufe IMFDXGIDeviceManager::GetVideoServiceverwendet. In der Regel würde ein Decoder IDirectXVideoDecoderService-abfragen, und ein Videoprozessor würde IDirectXVideoProcessorServiceabfragen.
  5. Wenn der vorherige Schritt erfolgreich ist, müssen die IMFTransform::GetInputAvailableType und IMFTransform::GetOutputAvailableType Methoden DXVA-kompatible Formate zurückgeben.
  6. Der Client konfiguriert die Medientypen im MFT. Wenn ein Medientyp nicht mit DXVA kompatibel ist, muss MFT den Fehlercode MF_E_UNSUPPORTED_D3D_TYPEzurü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, kann er mit der Verarbeitung beginnen. Zu diesem Zeitpunkt kann MFT DXVA für die Verarbeitung verwenden oder auf die Softwareverarbeitung zurückgreifen.
    • Wenn der Client kein akzeptables DXVA-Format findet, sendet der Client möglicherweise eine weitere MFT_MESSAGE_SET_D3D_MANAGER Nachricht, dieses Mal ulParam auf NULL-. Der MFT muss den IDirect3DDeviceManager9 Zeiger freigeben (der IMFDXGIDeviceManager Zeiger, wenn IMFDXGIDeviceManager verwendet wurde) und alle anderen DXVA-Schnittstellen und die Softwareverarbeitung wiederherstellen. Zu diesem Zeitpunkt darf die MFT keine DXVA-Verarbeitung verwenden.

Ein Direct3D-fähiger MFT muss vorbereitet sein, um Beispiele zu verarbeiten, die eine Direct3D-Oberfläche enthalten. Das Beispiel enthält genau einen Medienpuffer. Rufen Sie zum Abrufen der Direct3D-Oberfläche aus dem Puffer die MFGetService--Funktion auf, und geben Sie den MR_BUFFER_SERVICE-Dienst an. Weitere Informationen finden Sie unter DirectX Surface Buffer.

Ein MFT, der DXVA verwendet, muss wie folgt eigene Ausgabebeispiele zuweisen:

  1. Legen Sie in der IMFTransform::GetOutputStreamInfo-Methode das MFT_OUTPUT_STREAM_PROVIDES_SAMPLES Flag fest.
  2. Erstellen Sie einen Pool von DXVA-Oberflächen, wie in der DXVA-Spezifikation beschrieben.
  3. Erstellen Sie Medienbeispiele, indem Sie MFCreateVideoSampleFromSurfaceaufrufen.

Die MFT sollte die Softwareverarbeitung immer als Fallback unterstützen, da die DXVA-Verarbeitung aus mehreren Gründen möglicherweise nicht verfügbar ist:

  • Die GPU unterstützt möglicherweise DXVA nicht.
  • Der Client verwendet möglicherweise nicht Direct3D.
  • DXVA-Profile werden nicht für jedes Videoformat definiert.

Ein Direct3D-fähiger MFT muss über einen einzelnen Ausgabedatenstrom verfügen. Es können nicht mehrere Ausgaben vorhanden sein.

Schreiben eines benutzerdefinierten MFT-