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 gilt als Direct3D-fähig , 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, um MFT Direct3D-fähig zu machen. In diesem Thema werden die Mechanismen der DXVA-Decodierung nicht behandelt. Informationen zu DXVA finden Sie unter DirectX-Videobeschleunigung 2.0.

Wichtig

Ab Windows 8 kann IMFDXGIDeviceManager anstelle von IDirect3DDeviceManager9 verwendet 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. Der MFT muss den Wert des attributs MF_SA_D3D_AWARE in seinem eigenen Attributspeicher auf TRUE festlegen. Ab Windows 8 verwenden Sie bei Verwendung von Direct3D 11 MF_SA_D3D11_AWARE.
  3. Wenn das MF_SA_D3D_AWARE -Attribut (oder MF_SA_D3D11_AWARE bei Verwendung von Direct3D 11) während der Formatverhandlung 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 IMFDXGIDeviceManager anstelle von IDirect3DDeviceManager9 verwenden. Der Client muss diese Nachricht nicht senden.
  4. Der MFT ruft IDirect3DDeviceManager9::GetVideoService auf, um den benötigten DXVA-Dienst abzufragen. Wenn IMFDXGIDeviceManager verwendet wurde, ruft MFT ab Windows 8 IMFDXGIDeviceManager::GetVideoService auf. In der Regel fragt ein Decoder IDirectXVideoDecoderService ab, und ein Videoprozessor fragt IDirectXVideoProcessorService ab.
  5. Wenn der vorherige Schritt erfolgreich war, müssen die Methoden IMFTransform::GetInputAvailableType und IMFTransform::GetOutputAvailableType 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_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ückgreifen.
    • Wenn der Client kein akzeptables DXVA-Format findet, sendet der Client möglicherweise eine weitere MFT_MESSAGE_SET_D3D_MANAGER-Nachricht , wobei ulParam dieses Mal auf NULL festgelegt wird. Der MFT muss den IDirect3DDeviceManager9-Zeiger (der IMFDXGIDeviceManager-Zeiger, wenn IMFDXGIDeviceManager verwendet wurde) und alle anderen DXVA-Schnittstellen freigeben und rückgängig machen zur Softwareverarbeitung. An diesem Punkt darf die MFT keine DXVA-Verarbeitung verwenden.

Ein Direct3D-fähiges MFT muss für die Verarbeitung von Proben vorbereitet werden, die eine Direct3D-Oberfläche enthalten. Das Beispiel enthält genau einen Medienpuffer. Um die Direct3D-Oberfläche aus dem Puffer abzurufen, rufen Sie 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 seine eigenen Ausgabebeispiele wie folgt zuordnen:

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

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

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

Ein Direct3D-fähiger MFT muss über einen einzelnen Ausgabedatenstrom verfügen. Sie darf nicht über mehrere Ausgaben verfügen.

Schreiben eines benutzerdefinierten MFT