Partilhar via


Direct3D-Aware MFTs

Este tópico descreve como implementar uma transformação compatível com Direct3D Media Foundation (MFT) para vídeo.

Uma MFT de vídeo é considerada com reconhecimento de Direct3D se puder processar amostras que contenham superfícies Direct3D. A razão típica para suportar Direct3D em uma MFT de vídeo é habilitar a decodificação acelerada por hardware, usando DirectX Video Acceleration (DXVA).

Este tópico descreve as etapas necessárias para tornar seu MFT compatível com Direct3D. Este tópico não abrange a mecânica da decodificação DXVA. Para obter informações sobre DXVA, consulte DirectX Video Acceleration 2.0.

Importante

A partir do Windows 8, IMFDXGIDeviceManager pode ser usado em vez do IDirect3DDeviceManager9. Para aplicativos da Windows Store, você deve usar IMFDXGIDeviceManager e Microsoft Direct3D 11. Para obter mais informações, consulte o APIs de vídeo do Direct3D 11.

 

  1. Implemente o IMFTransform::GetAttributes método. Esse método retorna um ponteiro para um repositório de atributos.
  2. O MFT deve definir o valor do atributo MF_SA_D3D_AWARE como TRUE em seu próprio repositório de atributos. A partir do Windows 8, se estiver usando o Direct3D 11, use MF_SA_D3D11_AWARE.
  3. Durante a negociação de formato, se o atributo MF_SA_D3D_AWARE (ou MF_SA_D3D11_AWARE se estiver usando Direct3D 11) for TRUE, o cliente poderá enviar a mensagem MFT_MESSAGE_SET_D3D_MANAGER para a MFT. O parâmetro de evento ulParam é um ponteiro para a interfaceIDirect3DDeviceManager9. A partir do Windows 8, você pode usar IMFDXGIDeviceManager em vez de IDirect3DDeviceManager9. O cliente não é obrigado a enviar esta mensagem.
  4. O MFT chama IDirect3DDeviceManager9::GetVideoService para consultar o serviço DXVA de que precisa. A partir do Windows 8, se IMFDXGIDeviceManager foi usado, as chamadas MFT IMFDXGIDeviceManager::GetVideoService. Normalmente, um decodificador consultaria IDirectXVideoDecoderServicee um processador de vídeo consultaria IDirectXVideoProcessorService.
  5. Supondo que a etapa anterior seja bem-sucedida, os IMFTransform::GetInputAvailableType e IMFTransform::GetOutputAvailableType métodos devem retornar formatos compatíveis com DXVA.
  6. O cliente configura os tipos de mídia no MFT. Se um tipo de mídia não for compatível com DXVA, o MFT deverá retornar o código de erro MF_E_UNSUPPORTED_D3D_TYPE.
  7. Neste ponto, há duas opções, dependendo se o cliente encontra um formato DXVA adequado.
    • Se o cliente configurar com êxito um formato DXVA, ele pode começar a processar. Neste ponto, o MFT pode usar DXVA para processamento, ou voltar para o processamento de software.
    • Como alternativa, se o cliente não encontrar um formato DXVA aceitável, o cliente pode enviar outra mensagem de MFT_MESSAGE_SET_D3D_MANAGER, desta vez definindo ulParam para NULL. O MFT deve liberar o ponteiroIDirect3DDeviceManager9(o ponteiroIMFDXGIDeviceManager, se IMFDXGIDeviceManager foi usado) e quaisquer outras interfaces DXVA, e reverter para o processamento de software. Neste ponto, o MFT não deve usar o processamento DXVA.

Uma MFT com reconhecimento de Direct3D deve ser preparada para lidar com exemplos que contêm uma superfície Direct3D. O exemplo conterá exatamente um buffer de mídia. Para obter a superfície Direct3D do buffer, chame a função MFGetService e especifique o serviço MR_BUFFER_SERVICE. Para obter mais informações, consulte DirectX Surface Buffer.

Um MFT que usa DXVA deve alocar suas próprias amostras de saída, da seguinte maneira:

  1. No IMFTransform::GetOutputStreamInfo método, defina o sinalizador MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
  2. Crie um pool de superfícies DXVA, conforme descrito na especificação DXVA.
  3. Crie amostras de mídia chamando MFCreateVideoSampleFromSurface.

O MFT deve sempre suportar o processamento de software como um fallback, porque o processamento DXVA pode não estar disponível, por vários motivos:

  • A GPU pode não suportar DXVA.
  • O cliente pode não usar Direct3D.
  • Os perfis DXVA não são definidos para todos os formatos de vídeo.

Uma MFT com reconhecimento de Direct3D deve ter um único fluxo de saída. Ele não pode ter várias saídas.

Escrevendo um MFT personalizado