Direct3D-Aware MFTs

Este tópico descreve como implementar uma MFT (transformação MFT) com reconhecimento de Direct3D para vídeo.

Um MFT de vídeo será considerado com reconhecimento de Direct3D se puder processar amostras que contenham superfícies Direct3D. O motivo típico para dar suporte ao Direct3D em um MFT de vídeo é habilitar a decodificação acelerada por hardware, usando a Aceleração de Vídeo DirectX (DXVA).

Este tópico descreve as etapas necessárias para tornar o MFT Direct3D ciente. Este tópico não aborda a mecânica da decodificação DXVA. Para obter informações sobre DXVA, consulte Aceleração de Vídeo DirectX 2.0.

Importante

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

 

  1. Implemente o método IMFTransform::GetAttributes . 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. Começando no 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 de MFT_MESSAGE_SET_D3D_MANAGER para o MFT. O parâmetro de evento ulParam é um ponteiro para a interface IDirect3DDeviceManager9 . A partir de Windows 8, você pode usar IMFDXGIDeviceManager em vez de IDirect3DDeviceManager9. O cliente não é necessário para enviar esta mensagem.
  4. O MFT chama IDirect3DDeviceManager9::GetVideoService para consultar o serviço DXVA necessário. A partir de Windows 8, se IMFDXGIDeviceManager tiver sido usado, o MFT chamará IMFDXGIDeviceManager::GetVideoService. Normalmente, um decodificador consultava IDirectXVideoDecoderService e um processador de vídeo consultava IDirectXVideoProcessorService.
  5. Supondo que a etapa anterior seja bem-sucedida, os métodos IMFTransform::GetInputAvailableType e IMFTransform::GetOutputAvailableType 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 poderá começar o processamento. Neste ponto, o MFT pode usar DXVA para processamento ou fazer fallback para o processamento de software.
    • Como alternativa, se o cliente não encontrar um formato DXVA aceitável, o cliente poderá enviar outro MFT_MESSAGE_SET_D3D_MANAGER mensagem, desta vez definindo ulParam como NULL. O MFT deve liberar o ponteiro IDirect3DDeviceManager9 (o ponteiro IMFDXGIDeviceManager, se IMFDXGIDeviceManager foi usado) e quaisquer outras interfaces DXVA e reverter ao processamento de software. Neste ponto, o MFT não deve usar o processamento DXVA.

Um MFT com reconhecimento de Direct3D deve estar preparado para manipular amostras que contenham 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 seus próprios exemplos de saída, da seguinte maneira:

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

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

  • A GPU pode não dar suporte a DXVA.
  • O cliente pode não usar Direct3D.
  • Os perfis DXVA não são definidos para cada formato de vídeo.

Um 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