2015-02-11 16 views
5

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:

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 il IMFSample ed estrao uno IMFMediaBuffer. Il buffer non gestisce un IDirect3DSurface9 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 o MFCreateDXSurfaceBuffer?

  • 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

risposta

0

Il modo più semplice per ottenere i campioni Media Foundation è quello di scaricare e installare 'Microsoft Windows SDK per Windows 7 e .NET Framework 4' dal http://www.microsoft.com/en-us/download/details.aspx?id=8279. Installare gli esempi e quindi individuarli in "v7.1/Samples/Multimedia/MediaFoundation". Gli esempi di Media Foundation si trovano sul sito Microsoft Code Gallery, ma non sono riuscito a trovarli lì. Gli esempi non sono più inclusi nelle versioni di Windows SDK.

Gli esempi direttamente rilevanti per la tua domanda sono probabilmente Decoder, DXVA_HD, DXVA2_VideoProc, EVRPresenter, MPEG1Source e topoedit.

Non riesco a fornire più aiuto perché attualmente sto lottando con alcuni degli stessi problemi.

+0

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

1

Devo adattare i metodi GetOutputAvailableType/SetOutputType?

Sì. È necessario fornire gli attributi come al solito, senza requisiti speciali.

Devo memcpy i dati del buffer su una superficie Direct3D?

Sì. È necessario preoccuparsi di IDirect3DDeviceManager9 e LockDevice quando si esegue questa operazione, poiché EVR potrebbe utilizzare la superficie allo stesso tempo.

Come determinare se una superficie è in uso?

Devi preoccuparti soprattutto quando la superficie è libera per l'uso. Il tuo MFT deve implementare l'interfaccia IMFAsyncCallback. Dopo aver utilizzato MFCreateVideoSampleFromSurface, si esegue una query per l'interfaccia IMFTrackedSample e si chiama SetAllocator. Il metodo Invoke ti dirà quando la superficie è libera.

Come dovrei produrre la superficie? Dovrei usare MFCreateVideoSampleFromSurface o MFCreateDXSurfaceBuffer?

Poiché si utilizza IDirectXVideoProcessorService-> CreateSurface, MFCreateVideoSampleFromSurface è il posto giusto. Esegui la superficie attraverso l'IMFSample.

Controllare questo progetto:

MFNode

Sotto MFTDxva2Decoder e MFSkDxva2Renderer, troverete alcune elaborazioni dxva2.