Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
- Implementieren Sie die IMFTransform::GetAttributes-Methode. Diese Methode gibt einen Zeiger auf einen Attributspeicher zurück.
- 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.
- 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.
- 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.
- Wenn der vorherige Schritt erfolgreich ist, müssen die IMFTransform::GetInputAvailableType und IMFTransform::GetOutputAvailableType Methoden DXVA-kompatible Formate zurückgeben.
- 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.
- 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:
- Legen Sie in der IMFTransform::GetOutputStreamInfo-Methode das MFT_OUTPUT_STREAM_PROVIDES_SAMPLES Flag fest.
- Erstellen Sie einen Pool von DXVA-Oberflächen, wie in der DXVA-Spezifikation beschrieben.
- 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.
Verwandte Themen