Compartilhar via


Direct3D-Aware MFTs

Este tópico descreve como implementar uma MFT (transformação do Direct3D- aware Media Foundation) para vídeo.

Um MFT de vídeo é considerado com reconhecimento direct3D se puder processar amostras que contêm 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 DXVA (Aceleração de Vídeo DirectX).

Este tópico descreve as etapas necessárias para tornar o MFT Direct3D consciente. Este tópico não aborda 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 podem ser usados em vez doIDirect3DDeviceManager9. 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étodoIMFTransform::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 para VERDADEIRO em seu próprio repositório de atributos. A partir do Windows 8, se o uso do Direct3D 11 usar 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 o Direct3D 11) for VERDADEIRO, 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 deIDirect3DDeviceManager9. A partir do Windows 8, você pode usar IMFDXGIDeviceManager em vez de IDirect3DDeviceManager9. O cliente não é necessário para enviar essa 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 IDirectXVideoDecoderService e um processador de vídeo consultaria 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 outra mensagem MFT_MESSAGE_SET_D3D_MANAGER, desta vez configurando ulParam para NULL. O MFT deve liberar o ponteiro deIDirect3DDeviceManager9 (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.

Um MFT com reconhecimento direct3D deve estar preparado para lidar com amostras 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 do Buffer de Superfície do DirectX.

Um MFT que usa DXVA deve alocar seus próprios exemplos de saída, da seguinte maneira:

  1. No métodoIMFTransform::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 o Direct3D.
  • Os perfis DXVA não são definidos para cada formato de vídeo.

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

escrevendo um MFT personalizado