Habilitando a aceleração de vídeo do DirectX

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador do Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador do Coletor em vez do SDK do Windows Media Format 11, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Esta seção descreve como habilitar a Aceleração de Vídeo do Microsoft® DirectX® ao reproduzir conteúdo transmitido em um player personalizado.

Segundo plano

A Aceleração de Vídeo DirectX (DirectX VA) é uma especificação de API para aceleração de hardware de operações de decodificação 2D. Ele permite que os decodificadores de software descarreguem determinadas operações com uso intensivo de CPU para os cartão gráficos para processamento. Para usuários finais, isso possibilita vídeos de alta taxa de bits, como reprodução de DVD em tela inteira em computadores mais antigos equipados com placas gráficas compatíveis com VA do DirectX.

A partir do SDK do Windows Media Format 9 Series, o filtro wrapper DMO dá suporte ao DirectX VA. Isso significa que, para a reprodução local, os aplicativos podem usar o filtro leitor de ASF do WM para reproduzir conteúdo baseado em Windows Media e a aceleração de hardware directX VA será invocada automaticamente se os elementos gráficos cartão der suporte a ele. No entanto, o filtro Leitor do ASF do WM não dá suporte à reprodução de conteúdo transmitido. Portanto, se você quiser dar suporte ao DirectX VA ao reproduzir conteúdo transmitido em um player personalizado, deverá usar um mecanismo alternativo, que é o usado pelo Reprodutor Multimídia do Windows começando com o Windows Media 9 Series.

Como Reprodutor Multimídia do Windows foi projetado antes dos filtros QASF terem sido desenvolvidos, Reprodutor Multimídia do Windows tem seu próprio filtro de origem, com base no SDK do Formato de Mídia do Windows, para reproduzir conteúdo baseado no Windows Media. O Filtro de Origem de Mídia do Windows WMP fornece dados descompactados downstream diretamente para os renderizadores de áudio e vídeo. Por outro lado, o Leitor de ASF do WM fornece conteúdo compactado downstream para os DMOs (Objetos de Mídia DirectX) do Decodificador de Mídia do Windows Media, que são hospedados dentro do Wrapper DMO. Os diagramas a seguir ilustram as diferenças entre o Leitor do ASF do WM e o Filtro de Origem de Mídia do Windows WMP.

exemplos descompactados de saídas de filtro de origem personalizadas

exemplos compactados de saídas de filtro de origem qasf

Para habilitar o DirectX VA para conteúdo transmitido, você deve criar um filtro de origem personalizado como o do diagrama superior. Basicamente, esse filtro usará o SDK do Windows Media Format para instanciar um objeto leitor de WM, descompactar os exemplos e enviá-los downstream em seus pinos de saída. Esta discussão pressupõe que você já criou o filtro de origem e agora está pronto para implementar o suporte a VA do DirectX.

Para habilitar o DirectX VA, a tarefa básica do filtro de origem é fornecer ao Renderizador de Vídeo e ao DMO do Decodificador WMV as interfaces necessárias para negociar a conexão directx va. O filtro de origem não participa dessas negociações. Após o início do streaming, a única tarefa relacionada ao DirectX VA que o filtro de origem pode executar é modificar os carimbos de data/hora nos exemplos de vídeo antes que o decodificador WMV os entregue ao Renderizador de Vídeo. O principal motivo para fazer isso é fornecer controle de linha do tempo personalizado além do que as interfaces DirectShow® padrão habilitam.

Três interfaces são definidas para habilitar as comunicações necessárias entre o SDK do Formato de Mídia do Windows, o filtro de origem do player, o DMO do decodificador de Vídeo do Windows Media e o Renderizador de Combinação de Vídeos ou Mixer de Sobreposição. Essas interfaces são descritas na tabela a seguir.

Interface Descrição
IWMCodecAMVideoAccelerator Exposto pela DMO do Decodificador do Windows Media e chamado pelo filtro de origem de um player de mídia para configurar as várias conexões necessárias para habilitar o DirectX VA para decodificação do conteúdo do Vídeo do Windows Media.
IWMPlayerTimestampHook Implementado no filtro de origem do jogador. Ele permite que o filtro modifique os carimbos de data/hora nos exemplos de vídeo antes de entregá-los downstream.
IWMReaderAccelerator Implementado no objeto Leitor do WM. Ele é chamado por um filtro de origem do player para obter interfaces do DMO do decodificador.

 

Ordem das operações na reprodução habilitada para VA do DirectX

Esta seção descreve a ordem geral das operações em tempo de execução para um player habilitado para VA do DirectX e seu filtro de origem. Os componentes mencionados nesta seção são:

  • Um media player de terceiros, conhecido como o jogador.
  • Um filtro de origem personalizado, instanciado pelo player, que usa o SDK de Formato de Mídia do Windows para descompactar o conteúdo baseado no Windows Media.
  • O pino de saída de vídeo do filtro de origem do player, conhecido como o pino de saída.
  • O grafo de filtro de reprodução de vídeo do DirectShow, conhecido como grafo.
  • O Renderizador de Combinação de Vídeos, conhecido como VMR.
  • O objeto Leitor Assíncrono do SDK do Windows Media Format, conhecido como leitor.
  • O Objeto de Mídia DirectX do Decodificador de Vídeo do Windows Media, conhecido como DMO do decodificador.

A ordem das operações é a seguinte:

  1. O jogador cria uma instância de seu filtro de origem e um objeto de leitor. O leitor cria um DMO do decodificador de vídeo e define o tipo de entrada (compactado) nele. Isso deve acontecer antes que o player tente configurar seu grafo de reprodução de vídeo porque o SDK e o DMO do decodificador devem estar envolvidos no processo de negociação com o grafo e o DMO deve saber o formato de entrada durante a etapa 9.
  2. O player chama IGraphBuilder::Render, fornecendo o pin de saída do filtro de origem do vídeo. Neste ponto, o gerenciador de grafo de filtros directShow tenta conectar a VMR ao filtro de origem de vídeo do player.
  3. O gerenciador de grafo de filtro chama IPin::Connect no pino de saída do filtro de origem de vídeo do player.

As etapas 4 a 10 ocorrem dentro de IPin::Connect.

  1. O filtro de origem obtém a interface IWMCodecAMVideoAccelerator do método IWMReaderAccelerator::GetCodecInterface do leitor. Se o codec não der suporte ao DirectX VA, a chamada para GetCodecInterface poderá falhar. Nesse caso, a negociação prossegue como de costume, sem o suporte do DirectX VA.

  2. O filtro de origem passa o ponteiro IAMVideoAccelerator do pin passado para Conectar-se ao DMO do decodificador por meio de IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Em seguida, o filtro de origem delega o restante da operação IPin::Connect ao método CBaseOutputPin::Connect . A enumeração de formato com o SDK continua como acontece hoje. Se o codec der suporte ao DirectX VA para o conteúdo que está sendo conectado, o DMO do codec apresentará esses subtipos directx va primeiro, antes dos tipos YUV e RGB com suporte. Se o suporte ao DirectX VA estiver disponível, as etapas 7 a 11 serão tentadas no contexto de um subtipo de VA do DirectX. O snippet de código a seguir mostra como identificar um subtipo de mídia va directx.

    bool IsDXVASubtype( AM_MEDIA_TYPE * pmt )
    {
        // All DXVA types have the same last 3 DWORDs.
        // guidDXVA is the base GUID for all DXVA subtypes.
    
        GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } };
    
        unsigned long const * plguid;
        unsigned long const * plguidDXVA;
        plguid = (unsigned long const *)&pmt->subtype;
        plguidDXVA = (unsigned long *)&guidDXVA;
    
        if( ( plguid[1] == plguidDXVA[1] ) &&
            ( plguid[2] == plguidDXVA[2] ) &&
            ( plguid[3] == plguidDXVA[3] ) )
        {
            return true;
        }
    
        return false;
    }
    
    
  4. A implementação CBaseOutputPin::Connect chama IPin::CompleteConnect durante a etapa 3. Se um subtipo va directx estiver sendo considerado, a negociação de VA do DirectX será tentada. O pin de saída chama IWMCodecAMVideoAccelerator::NegotiateConnection, passando-lhe o tipo de mídia de saída atual.

  5. O DMO do decodificador executa a negociação necessária com a VMR por meio da interface IAMVideoAccelerator e retorna o GUID do subtipo de vídeo que os dois concordaram. O pin de saída delega todas as chamadas IAMVideoAcceleratorNotify recebidas durante esse processo para a interface IAMVideoAcceleratorNotify do DMO do decodificador, que também pode ser obtida por meio do método IWMReaderAccelerator::GetCodecInterface .

  6. Se NegotiateConnection for bem-sucedido, o pin de saída chamará IWMCodecAMVideoAccelerator::SetPlayerNotify com uma interface IWMPlayerTimestampHook . Esse gancho permite que o filtro de origem atualize os carimbos de data/hora nos exemplos antes de serem entregues ao renderizador.

  7. O filtro de origem chama IWMReaderAccelerator::Notify com o tipo de mídia negociado. Isso permite que o leitor atualize suas variáveis internas e confirme o DirectX VA. Esse é o último lugar em que o codec ou o leitor pode falhar. Se qualquer uma das etapas acima falhar, o filtro de origem deverá retornar à etapa 3 e tentar o próximo tipo enumerado pelo leitor.

  8. A reprodução é iniciada. O leitor ignorará os buffers de saída do DMO do decodificador se o tipo de saída de conexão for DirectX VA.

  9. Quando IPin::D isconnect ocorre, o filtro de origem chama IWMCodecAMVideoAccelerator::SetAcceleratorInterface com um NULL. Isso interrompe a conexão directx va entre o codec e o renderizador.

Lendo arquivos ASF