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.
- Implemente o métodoIMFTransform::GetAttributes. Esse método retorna um ponteiro para um repositório de atributos.
- 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.
- 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.
- 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.
- Supondo que a etapa anterior seja bem-sucedida, os métodos IMFTransform::GetInputAvailableType e IMFTransform::GetOutputAvailableType devem retornar formatos compatíveis com DXVA.
- 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.
- 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:
- No métodoIMFTransform::GetOutputStreamInfo, defina o sinalizador MFT_OUTPUT_STREAM_PROVIDES_SAMPLES.
- Crie um pool de superfícies DXVA, conforme descrito na especificação DXVA.
- 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.
Tópicos relacionados
-
escrevendo um MFT personalizado