2015-02-11 4 views
5

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 MFT MF_SA_D3D_AWARE ist.
  • In der Methode ProcessMessage verarbeite ich die Nachricht MFT_MESSAGE_SET_D3D_MANAGER, um eine Gerätehandle, eine IDirect3DDeviceManager9 und eine IDirectXVideoProcessorService 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ächen IDirectXVideoProcessorService->CreateSurface
  • Bei dem Verfahren unter Verwendung von GetOutputStreamInfo die dwFlags 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 die IMFSample und extrahiere eine IMFMediaBuffer. Der Puffer verwaltet keine IDirect3DSurface9 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 oder MFCreateDXSurfaceBuffer 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

Antwort

0

Der einfachste Weg, um die Media Foundation Proben zu erhalten, ist ‚Microsoft Windows SDK für Windows 7 und .NET Framework 4‘ von http://www.microsoft.com/en-us/download/details.aspx?id=8279 herunterladen und installieren. Installieren Sie die Samples und suchen Sie sie unter 'v7.1/Samples/Multimedia/MediaFoundation'. Die Media Foundation-Beispiele befinden sich angeblich auf der Microsoft Code Gallery-Website, aber ich konnte sie dort nicht finden. Die Beispiele sind nicht mehr in den Windows SDK-Versionen enthalten.

Die Beispiele, die für Ihre Frage relevant sind, sind wahrscheinlich Decoder, DXVA_HD, DXVA2_VideoProc, EVRPresenter, MPEG1Source und topoedit.

Ich kann nicht mehr helfen, da ich gerade mit einigen der gleichen Probleme kämpfe.

+0

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. –

1

Muss ich die Methoden GetOutputAvailableType/SetOutputType anpassen?

Ja. Sie müssen Attribute wie gewohnt bereitstellen, ohne besondere Anforderungen.

Muss ich die Daten des Puffers auf einer Direct3D-Oberfläche speichern?

Ja. Sie müssen sich dabei um IDirect3DDeviceManager9 und LockDevice kümmern, da EVR die Oberfläche zur gleichen Zeit verwenden kann.

Wie kann ich feststellen, ob eine Oberfläche verwendet wird?

Sie müssen besonders vorsichtig sein, wenn die Oberfläche frei ist. Ihre MFT muss die IMFAsyncCallback-Schnittstelle implementieren. Nachdem Sie MFCreateVideoSampleFromSurface verwendet haben, suchen Sie nach der Schnittstelle IMFTrackedSample und rufen SetAllocator auf. Die Invoke-Methode zeigt Ihnen an, wenn die Oberfläche frei ist.

Wie soll ich die Oberfläche ausgeben? Soll ich MFCreateVideoSampleFromSurface oder MFCreateDXSurfaceBuffer verwenden?

Da Sie IDirectXVideoProcessorService-> CreateSurface verwenden, ist MFCreateVideoSampleFromSurface der richtige Ort. Sie geben die Oberfläche über das IMFSample aus.

prüfen dieses Projekt:

MFNode

Unter MFTDxva2Decoder und MFSkDxva2Renderer, werden Sie einige dxva2 Verarbeitung finden.