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

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 a placa gráfica para processamento. Para usuários finais, isso possibilita vídeos de alta taxa de bits, como a 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 da série Windows Media Format 9, 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 Windows conteúdo baseado em mídia e a aceleração de hardware do DirectX VA será invocada automaticamente se a placa gráfica 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 é aquele usado por Reprodutor Multimídia do Windows começando com o Windows Media 9 Series.

Como Reprodutor Multimídia do Windows foi projetado antes dos filtros de 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 Windows, para reproduzir Windows conteúdo baseado em mídia. O filtro de origem de mídia do WMP Windows 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 Windows, que são hospedados dentro do Wrapper de DMO. Os diagramas a seguir ilustram as diferenças entre o Leitor de ASF do WM e o Filtro de Fonte de Mídia Windows WMP.

custom source filter outputs uncompressed samples

qasf source filter outputs compressed samples

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

Para habilitar o DirectX VA, a tarefa básica do filtro de origem é fornecer o Renderizador de Vídeo e o Decodificador WMV DMO com 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 do DirectShow® padrão habilitam.

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

Interface Descrição
IWMCodecAMVideoAccelerator Exposto pelo decodificador de mídia Windows DMO 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 de vídeo de mídia Windows.
IWMPlayerTimestampHook Implementado no filtro de origem do player. 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 de WM. Ele é chamado por um filtro de origem do player para obter interfaces do decodificador DMO.

 

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 Windows para descompactar Windows conteúdo baseado em mídia.
  • 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ídeo, conhecido como VMR.
  • O objeto Windows Leitor Assíncrono do SDK de Formato de Mídia, conhecido como leitor.
  • O objeto de mídia DirectX do decodificador de vídeo de mídia Windows, conhecido como o decodificador DMO.

A ordem das operações é a seguinte:

  1. O player cria uma instância de seu filtro de origem e um objeto leitor. O leitor cria um decodificador de vídeo DMO 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 decodificador DMO 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-lhe o pino de saída do filtro de origem de vídeo. Neste ponto, o gerenciador de grafos de filtro do DirectShow tenta conectar a VMR ao filtro de origem de vídeo do player.
  3. O gerenciador de grafo de filtro chama IPin::Conexão no pino de saída do filtro de origem de vídeo do player.

As etapas 4 a 10 ocorrem dentro de IPin::Conexão.

  1. O filtro de origem obtém a interface IWMCodecAMVideoAccelerator do método IWMReaderAccelerator::GetCodecInterface do leitor. Se o codec não oferecer 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 pino passado para Conexão para o decodificador DMO por meio de IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Em seguida, o filtro de origem delega o restante da operação IPin::Conexão para o método CBaseOutputPin::Conexão. A enumeração de formato com o SDK continua como ocorre hoje. Se o codec der suporte ao DirectX VA para o conteúdo que está sendo conectado, o codec DMO apresentará primeiro esses subtipos directx va, 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 do DirectX VA.

    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 de CBaseOutputPin::Conexão chama IPin::CompleteConnect durante a etapa 3. Se um subtipo de VA do DirectX estiver sendo considerado, a negociação de VA do DirectX será tentada. O pino de saída chama IWMCodecAMVideoAccelerator::NegotiateConnection, passando-lhe o tipo de mídia de saída atual.

  5. O decodificador DMO 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 pino de saída delega todas as chamadas IAMVideoAcceleratorNotify recebidas durante esse processo para a interface IAMVideoAcceleratorNotify do decodificador DMO, que também pode ser obtida por meio do método IWMReaderAccelerator::GetCodecInterface.

  6. Se NegotiateConnection for bem-sucedido, o pino 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 se confirme com o DirectX VA. Este é o último lugar em que o codec ou o leitor podem falhar. Se alguma 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 ignora os buffers de saída do decodificador DMO 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