L'obiettivo è di implementare un MFT personalizzato per l'elaborazione e la sincronizzazione di video su un'applicazione esterna. I dettagli di non sono importanti. Quello che vorrei ottenere come primo passo è far funzionare MFT usando l'elaborazione video DXVA o DXVA-HD. Non ero in grado di farlo.Implementazione di una Media Foundation Transform (MFT) con DirectX Video Acceleration (DXVA)
Ecco cosa ho fatto: Ho iniziato a creare una topologia con un nodo di input sorgente (la mia webcam), un MFT (l'esempio MFT_Grayscale) e l'EVR. L'ho incluso in una piccola applicazione. La topologia ha funzionato e ho potuto vedere il flusso monocromatico dalla fotocamera. Ora voglio cambiare il codice dell'esempio MF_Grayscale in modo tale che supporti l'elaborazione video DXVA e possa usare l'accelerazione hardware fornita dal metodo VideoProcessBlt. La documentazione Microsoft fornisce informazioni e bit ma non è stato possibile ottenere un MFT in esecuzione.
Quello che ho fatto finora:
- Nel metodo
GetAttributes
mi indicano che questo MFT èMF_SA_D3D_AWARE
. - Nel metodo
ProcessMessage
Elaborare il messaggioMFT_MESSAGE_SET_D3D_MANAGER
per ottenere un handle del dispositivo, unIDirect3DDeviceManager9
e unIDirectXVideoProcessorService
. - Nel metodo
SetInputType
che usano i metodi descritti qui https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx per ottenere una struttura DXVA2_VideoDesc e seguire questo codice https://msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx per creare un dispositivo di elaborazione video. Inoltre creo le superfici conIDirectXVideoProcessorService->CreateSurface
- Nel metodo
GetOutputStreamInfo
la variabiledwFlags
assomiglia a questo:
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;
Tutto sembra essere ok fino a qui. Ora le mie domande (mi dispiace che non posso essere più specifico):
Devo adattare i metodi
GetOutputAvailableType/SetOutputType
?Nel metodo
ProcessInput
ottengo ilIMFSample
ed estrao unoIMFMediaBuffer
. Il buffer non gestisce unIDirect3DSurface9
in base alle mie chiamate di funzione. Devo memcpy i dati del buffer su una superficie Direct3D?Nel metodo
ProcessOutput
per creare un punto di partenza, desidero inoltrare il frame in ingresso all'output.VideoProcessBlt
dovrebbe fare un blit 1: 1 da input a output. La documentazione dice:Ottenere una superficie disponibile che non è attualmente in uso.
Come posso determinare se una superficie è in uso?
Come dovrei produrre la superficie? Devo usare
MFCreateVideoSampleFromSurface
oMFCreateDXSurfaceBuffer
?Sfortunatamente sono davvero perso e non sono in grado di fare progressi utilizzando la documentazione.
La situazione ora è che non vedo alcuna uscita video (la finestra ha il suo colore predefinito finestre di sfondo) e la webcam si ferma per catturare fotogrammi dopo il primo fotogramma (il LED si spegne). Inoltre, non succede nulla: l'applicazione continua a funzionare senza mostrare nulla).
Spero che qualcuno possa aiutarmi. Apprezzerei anche se qualcuno potesse indirizzarmi a campionare codice per un MFT usando l'elaborazione video DXVA o DXVA-HD. Io non sono riuscito a trovare nulla ...
Grazie
Si prega di non rispondere alle domande che chiedono consigli o collegamenti fuori sito. Hai presentato una soluzione a questo senza usare un link che è buono. Tali richieste sono fuori tema e la domanda verrà chiusa o quella parte verrà modificata. –