Partilhar via


Ativando a aceleração de vídeo DirectX

[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído por Source Reader e Sink Writer. O Source Reader e o Sink Writer foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que, sempre que possível, o novo código utilize o Leitor de Origem e o Gravador de Destino em vez do SDK do Windows Media Format 11 . 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 o Microsoft® DirectX® Video Acceleration ao reproduzir conteúdo transmitido em um player personalizado.

Contexto geral

DirectX Video Acceleration (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 certas operações com uso intensivo de CPU para a placa gráfica para processamento. Para os usuários finais, isso possibilita vídeos de alta taxa de bits, como reprodução de DVD em tela cheia em computadores mais antigos equipados com placas gráficas compatíveis com DirectX VA.

Começando com o SDK do Windows Media Format 9 Series, o filtro DMO Wrapper suporta DirectX VA. Isto significa que, para reprodução local, as aplicações podem utilizar o filtro WM ASF Reader para reproduzir conteúdo baseado no Windows Media e a aceleração de hardware DirectX VA será invocada automaticamente se a placa gráfica o suportar. No entanto, o filtro WM ASF Reader não suporta a reprodução de conteúdo transmitido. Portanto, se você quiser oferecer suporte ao DirectX VA ao reproduzir conteúdo transmitido em um player personalizado, você deve usar um mecanismo alternativo, que é o usado pelo Windows Media Player a partir do Windows Media 9 Series.

Uma vez que o Windows Media Player foi concebido antes de os filtros QASF terem sido desenvolvidos, o Windows Media Player tem o seu próprio filtro de origem, baseado no SDK do Windows Media Format, para reproduzir conteúdo baseado no Windows Media. O WMP Windows Media Source Filter fornece dados descompactados downstream diretamente para os renderizadores de áudio e vídeo. Por outro lado, o WM ASF Reader fornece conteúdo compactado para jusante aos DirectX Media Objects (DMOs) do Windows Media Decoder, que são hospedados dentro do DMO Wrapper. Os diagramas a seguir ilustram as diferenças entre o WM ASF Reader e o WMP Windows Media Source Filter.

filtro de origem personalizado produz amostras não compactadas

filtro de origem QASF produz amostras compactadas

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 WM Reader, descompactar os exemplos e enviá-los downstream em seus pinos de saída. Esta discussão pressupõe que você já tenha criado o filtro de origem e agora esteja 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 nessas negociações. Depois que o streaming é iniciado, a única tarefa relacionada ao DirectX VA que o filtro de origem pode executar é modificar os carimbos de data/hora nas amostras de vídeo antes que o decodificador WMV os entregue ao renderizador de vídeo. A principal razão para fazer isso é fornecer controle de linha do tempo personalizado além do que as interfaces padrão do DirectShow® permitem.

São definidas três interfaces para permitir as comunicações necessárias entre o SDK do Windows Media Format, o filtro de origem do leitor, o DMO do descodificador de vídeo do Windows Media e o Misturador de Sobreposição ou o Renderizador de Mistura de Vídeo. Essas interfaces são descritas na tabela a seguir.

Interface Descrição
IWMCodecAMVideoAccelerator Exposto pelo DMO do Windows Media Decoder e chamado pelo filtro de origem de um media player para configurar as várias conexões necessárias para habilitar o DirectX VA para decodificação de conteúdo do Windows Media Video.
IWMPlayerTimestampHook Implementado no filtro de origem do jogador. Ele permite que o filtro modifique os carimbos de data/hora nas amostras de vídeo antes de entregá-las a jusante.
IWMReaderAccelerator Implementado no objeto WM Reader. É chamado por um filtro de origem do jogador para obter interfaces do decodificador DMO.

 

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

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

  • Um media player de terceiros, conhecido como player.
  • Um filtro de origem personalizado, instanciado pelo leitor, que utiliza o SDK do Windows Media Format para descomprimir conteúdo baseado no Windows Media.
  • O pino de saída de vídeo do filtro de origem do leitor, referido como o pino de saída.
  • O gráfico de filtro de reprodução de vídeo DirectShow, conhecido como gráfico.
  • O renderizador de mistura de vídeo, conhecido como VMR.
  • O objeto Leitor assíncrono do SDK do Windows Media Format, conhecido como leitor.
  • O Windows Media Video Decoder DirectX Media Object, referido como o descodificador DMO.

A ordem das operações é a seguinte:

  1. O player instancia 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 gráfico de reprodução de vídeo, porque o SDK e o decodificador DMO devem estar envolvidos no processo de negociação com o gráfico, e o DMO deve conhecer o formato de entrada durante a etapa 9.
  2. O player chama IGraphBuilder::Render, fornecendo-lhe o pino de saída do filtro de fonte de vídeo. Neste ponto, o gerenciador de gráficos de filtro DirectShow tenta conectar o VMR ao filtro de fonte de vídeo do player.
  3. O gerenciador de gráficos de filtro chama IPin::Connect no pino de saída do filtro de fonte de vídeo do player.

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

  1. O filtro de origem obtém a interface da IWMCodecAMVideoAccelerator do método do leitor IWMReaderAccelerator::GetCodecInterface. Se o codec não suportar DirectX VA, a chamada para GetCodecInterface pode falhar. Neste caso, a negociação prossegue normalmente, sem suporte a DirectX VA.

  2. O filtro de origem passa o ponteiro IAMVideoAccelerator do pino passado para Connect para o decodificador DMO através 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 formatos com o SDK prossegue como é feita atualmente. Se o codec suportar DirectX VA para o conteúdo que está sendo conectado, o codec DMO apresentará esses subtipos DirectX VA primeiro, antes dos tipos YUV e RGB suportados. Se o suporte a VA DirectX estiver disponível, as etapas 7 a 11 serão realizadas no contexto de um subtipo DirectX VA. O trecho de código a seguir mostra como identificar um subtipo de mídia 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 do CBaseOutputPin::Connect chama IPin::CompleteConnect durante o passo 3. Se um subtipo de VA 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 meio de saída atual.

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

  6. Se NegotiateConnection for bem-sucedido, o pino de saída chamará IWMCodecAMVideoAccelerator::SetPlayerNotify com uma interface de IWMPlayerTimestampHook. Esse gancho permite que o filtro de origem atualize os carimbos de data/hora nas amostras antes que eles sejam 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 comprometa com o DirectX VA. Este é o último lugar em que o codec ou leitor pode falhar. Se qualquer uma das etapas acima falhar, o filtro de origem deve 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 da conexão for DirectX VA.

  9. Quando IPin::Disconnect ocorre, o filtro de origem chama IWMCodecAMVideoAccelerator::SetAcceleratorInterface com um NULL. Isso quebra a conexão DirectX VA entre o codec e o renderizador.

Lendo arquivos ASF