Share via


Direct3D-Aware mft

Questo argomento descrive come implementare una trasformazione Media Foundation compatibile con Direct3D (MFT) per il video.

Un video MFT viene considerato compatibile con Direct3D se può elaborare campioni contenenti superfici Direct3D. Il motivo tipico per il supporto di Direct3D in un video MFT consiste nell'abilitare la decodifica con accelerazione hardware, usando l'accelerazione video DirectX (DXVA).

In questo argomento vengono descritti i passaggi necessari per rendere compatibile con MFT Direct3D. In questo argomento non vengono illustrati i meccanismi di decodifica DXVA. Per informazioni su DXVA, vedere DirectX Video Acceleration 2.0.

Importante

A partire da Windows 8, IMFDXGIDeviceManager può essere usato anziché IDirect3DDeviceManager9. Per le app di Windows Store, devi usare IMFDXGIDeviceManager e Microsoft Direct3D 11. Per altre info, vedi le API video Direct3D 11.

 

  1. Implementare il metodo IMFTransform::GetAttributes . Questo metodo restituisce un puntatore a un archivio attributi.
  2. MFT deve impostare il valore dell'attributo MF_SA_D3D_AWARE su TRUE nel proprio archivio attributi. A partire da Windows 8, se si usa Direct3D 11, usare MF_SA_D3D11_AWARE.
  3. Durante la negoziazione del formato, se l'attributo MF_SA_D3D_AWARE (o MF_SA_D3D11_AWARE se si usa Direct3D 11) è TRUE, il client può inviare il messaggio MFT_MESSAGE_SET_D3D_MANAGER al MFT. Il parametro di evento ulParam è un puntatore all'interfaccia IDirect3DDeviceManager9 . A partire da Windows 8, puoi usare IMFDXGIDeviceManager anziché IDirect3DDeviceManager9. Il client non è necessario per inviare questo messaggio.
  4. MFT chiama IDirect3DDeviceManager9::GetVideoService per eseguire una query per il servizio DXVA necessario. A partire da Windows 8, se IMFDXGIDeviceManager è stato usato il MFT chiama IMFDXGIDeviceManager::GetVideoService. In genere, un decodificatore esegue una query per IDirectXVideoDecoderService e un processore video esegue una query per IDirectXVideoProcessorService.
  5. Supponendo che il passaggio precedente abbia esito positivo, i metodi IMFTransform::GetInputAvailableType e IMFTransform::GetOutputAvailableType devono restituire formati compatibili con DXVA.
  6. Il client configura i tipi di supporto nel MFT. Se un tipo di supporto non è compatibile con DXVA, il MFT deve restituire il codice di errore MF_E_UNSUPPORTED_D3D_TYPE.
  7. A questo punto, sono disponibili due opzioni, a seconda che il client trovi un formato DXVA appropriato.
    • Se il client configura correttamente un formato DXVA, può iniziare l'elaborazione. A questo punto, MFT può usare DXVA per l'elaborazione o eseguire il fallback all'elaborazione software.
    • In alternativa, se il client non trova un formato DXVA accettabile, il client può inviare un altro messaggio MFT_MESSAGE_SET_D3D_MANAGER , questa volta impostando ulParam su NULL. MFT deve rilasciare il puntatore IDirect3DDeviceManager9 (puntatore IMFDXGIDeviceManager , se è stato usato IMFDXGIDeviceManager ) e qualsiasi altra interfaccia DXVA e ripristinare l'elaborazione software. A questo punto, MFT non deve usare l'elaborazione DXVA.

Un MFT compatibile con Direct3D deve essere preparato per gestire campioni che contengono una superficie Direct3D. L'esempio conterrà esattamente un buffer multimediale. Per ottenere la superficie Direct3D dal buffer, chiamare la funzione MFGetService e specificare il servizio MR_BUFFER_SERVICE . Per altre informazioni, vedere DirectX Surface Buffer.

Un MFT che usa DXVA deve allocare campioni di output personalizzati, come indicato di seguito:

  1. Nel metodo IMFTransform::GetOutputStreamInfo impostare il flag MFT_OUTPUT_STREAM_PROVIDES_SAMPLES .
  2. Creare un pool di superfici DXVA, come descritto nella specifica DXVA.
  3. Creare esempi multimediali chiamando MFCreateVideoSampleFromSurface.

MFT deve sempre supportare l'elaborazione software come fallback, perché l'elaborazione DXVA potrebbe non essere disponibile per diversi motivi:

  • La GPU potrebbe non supportare DXVA.
  • Il client potrebbe non usare Direct3D.
  • I profili DXVA non sono definiti per ogni formato video.

Un MFT compatibile con Direct3D deve avere un singolo flusso di output. Non può avere più output.

Scrittura di un MFT personalizzato