Negociação de tipo de mídia do EVR

[O componente descrito nesta página, Renderizador de Vídeo Avançado, é um recurso herdado. Ele foi substituído pelo SVR (Simple Video Renderer) exposto através dos componentes MediaPlayer e IMFMediaEngine. Para reproduzir conteúdo de vídeo, você deve enviar dados para um desses componentes e permitir que eles instanciem o novo renderizador de vídeo. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda enfaticamente que o novo código use o MediaPlayer ou as APIs IMFMediaEngine de nível inferior para reproduzir mídia de vídeo no Windows em vez do EVR, 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.]

Este tópico descreve como o EVR (renderizador de vídeo avançado) valida os tipos de mídia.

  • Para o filtro EVR do DirectShow, a negociação de tipo ocorre quando os marcadores de filtro são conectados.

  • Para o coletor de mídia de EVR, os tipos de mídia são definidos por meio da interface IMFMediaTypeHandler nos coletores de fluxo. Normalmente, o carregador de topologia negocia os tipos de mídia, embora o aplicativo também possa definir os tipos de mídia diretamente.

O EVR não relata nenhum tipo de mídia preferencial. O cliente precisa testar os tipos de mídia até encontrar um tipo aceitável. O tipo de mídia para o fluxo de referência precisa ser definido antes que os tipos possam ser definidos em qualquer um dos subfluxos.

Para o fluxo de referência, o mixer EVR obtém uma lista de formatos de destino de renderização DXVA (DirectX Video Acceleration) compatíveis. O apresentador EVR usa essa lista para selecionar o formato da cadeia de troca Direct3D. Se nenhum formato de destino de renderização compatível puder ser encontrado, o EVR rejeitará o tipo de mídia.

Para os subfluxos, o mixer EVR consulta se o dispositivo DXVA dá suporte a esse formato de subfluxo em combinação com o formato de destino de renderização selecionado para o fluxo de referência. Como resultado, os formatos de subfluxo disponíveis podem mudar dependendo do fluxo de referência.

Aqui está o processo com mais detalhes. Esses detalhes não são importantes para a maioria dos aplicativos, mas podem ser úteis se você estiver escrevendo um mixer ou apresentador personalizado.

Para o fluxo de referência, a negociação acontece da seguinte forma:

  1. O EVR chama IMFTransform::SetInputType no mixer.

  2. O mixer converte o tipo de mídia em uma descrição DXVA 2.0, usando a estrutura DXVA2_VideoDesc.

  3. O mixer chama IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids para obter uma lista de GUIDs de processador de vídeo.

  4. Para cada GUID de processador de vídeo, o mixer chama IDirectXVideoProcessorService::GetVideoProcessorRenderTargets para obter os formatos de destino de renderização suportados.

  5. O EVR chama IMFVideoPresenter::ProcessMessage no apresentador com a mensagem MFVP_MESSAGE_INVALIDATEMEDIATYPE. Essa mensagem faz com que o apresentador selecione um novo formato.

  6. O apresentador chama IMFTransform::GetOutputAvailableType para obter uma lista de formatos de saída disponíveis do mixer. O mixer gera essa lista a partir dos formatos obtidos na etapa 4.

  7. O apresentador seleciona um formato e chama IMFTransform::SetOutputType no mixer.

Para subfluxos, o processo é mais simples:

  1. O EVR chama IMFTransform::SetInputType no mixer.

  2. O mixer chama IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats para obter uma lista de formatos de subfluxo disponíveis.

  3. Se o formato proposto estiver contido nesta lista, o EVR aceita o tipo de entrada.

Renderizador de Vídeo Avançado