Ziel ist die Implementierung einer benutzerdefinierten MFT für die Videoverarbeitung und Synchronisierung mit einer externen Anwendung. Die Details sind nicht wichtig. Was ich als ersten Schritt erreichen möchte, ist, die MFT mithilfe von DXVA-Videoverarbeitung oder DXVA-HD in Betrieb zu nehmen. Ich war dazu nicht in der Lage.Implementieren einer Media Foundation-Transformation (MFT) mit DirectX-Videobeschleunigung (DXVA)
Hier ist, was ich getan habe: Ich begann mit dem Aufbau einer Topologie mit einem Source-Eingangsknoten (meine Webcam), eine MFT (das MFT_Grayscale Beispiel) und der EVR. Ich habe dies in eine kleine Anwendung aufgenommen. Die Topologie funktionierte und ich konnte den monochromen Strom von der Kamera sehen. Jetzt möchte ich den Code des MF_Grayscale-Beispiels so ändern, dass es die DXVA-Videoverarbeitung unterstützt und die von der VideoProcessBlt-Methode bereitgestellte Hardwarebeschleunigung verwenden kann. Die Microsoft-Dokumentation gibt einige Informationen, aber ich konnte keine laufende MFT durchführen.
Was ich bisher tat:
- Bei dem Verfahren
GetAttributes
ich zeigen, dass diese MFTMF_SA_D3D_AWARE
ist. - In der Methode
ProcessMessage
verarbeite ich die NachrichtMFT_MESSAGE_SET_D3D_MANAGER
, um eine Gerätehandle, eineIDirect3DDeviceManager9
und eineIDirectXVideoProcessorService
zu erhalten. - Im
SetInputType
Methode verwende ich die hier beschriebenen Methoden https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx eine DXVA2_VideoDesc Struktur zu erhalten und diesen Code https://msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx folgen einer Videoverarbeitungsvorrichtung zu schaffen. Zusätzlich erstelle ich die OberflächenIDirectXVideoProcessorService->CreateSurface
- Bei dem Verfahren unter Verwendung von
GetOutputStreamInfo
diedwFlags
Variable wie folgt aussehen:
pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
Alles, bis hier in Ordnung zu sein scheint. Nun meine Fragen (Es tut mir leid, dass ich nicht mehr spezifisch sein können):
Muss ich die
GetOutputAvailableType/SetOutputType
Methoden anzupassen?In der
ProcessInput
Methode bekomme ich dieIMFSample
und extrahiere eineIMFMediaBuffer
. Der Puffer verwaltet keineIDirect3DSurface9
gemäß meinen Funktionsaufrufen. Muss ich die Daten des Puffers auf einer Direct3D-Oberfläche speichern?In der
ProcessOutput
Methode, um einen Startpunkt zu machen, möchte ich den eingehenden Rahmen an den Ausgang weiterleiten.VideoProcessBlt
sollte ein 1: 1 Blit vom Eingang zum Ausgang machen. Die Dokumentation lautet:Eine verfügbare Oberfläche abrufen, die derzeit nicht verwendet wird.
Wie kann ich feststellen, ob eine Oberfläche im Einsatz ist?
Wie soll ich die Oberfläche ausgeben? Sollte ich
MFCreateVideoSampleFromSurface
oderMFCreateDXSurfaceBuffer
verwenden?Leider bin ich wirklich verloren und kann mit der Dokumentation keine Fortschritte machen.
Die Situation ist jetzt, dass ich keinen Videoausgang sehen (das Fenster hat seine Standard-Windows-Hintergrundfarbe) und die Webcam stoppt Frames nach dem ersten Frame zu erfassen (die LED erlischt). Außerdem passiert nichts - die Anwendung läuft einfach weiter ohne etwas anzuzeigen.
Ich hoffe, dass mir jemand helfen kann. Ich würde auch schätzen, wenn jemand mich dazu bringen könnte, Code für eine MFT mit DXVA-Videoverarbeitung oder DXVA-HD zu probieren. Ich war nicht in der Lage, etwas zu finden ...
Dank
Bitte beantworten Sie keine Fragen und fragen Sie nach externen Empfehlungen oder Links. Sie haben eine Lösung dafür vorgestellt, ohne einen guten Link zu verwenden. Solche Anfragen sind off-topic und die Frage wird entweder geschlossen oder dieser Teil wird bearbeitet. –