Partilhar via


Negociação do tipo de mídia EVR

[O componente descrito nesta página, Enhanced Video Renderer, é um recurso herdado. Ele foi substituído pelo Simple Video Renderer (SVR) exposto através do MediaPlayer e IMFMediaEngine componentes. 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 componentes foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda enfaticamente que o novo código use MediaPlayer ou o nível inferior IMFMediaEngine APIs 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 renderizador de vídeo avançado (EVR) valida tipos de mídia.

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

  • Para o coletor de mídia EVR, os tipos de mídia são definidos através da interfaceIMFMediaTypeHandlernos 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 preferido. O cliente deve testar os tipos de mídia até encontrar um tipo aceitável. O tipo de mídia para o fluxo de referência deve ser definido antes que os tipos possam ser definidos em qualquer um dos subfluxos.

Para o fluxo de referência, o misturador EVR obtém uma lista de formatos de destino de renderização compatíveis com DirectX Video Acceleration (DXVA). O apresentador EVR usa essa lista para selecionar o formato para a cadeia de permuta 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 misturador EVR consulta se o dispositivo DXVA suporta esse formato de subfluxo em combinação com o formato de destino de renderização que foi 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 em mais detalhes. Esses detalhes não são importantes para a maioria dos aplicativos, mas podem ser úteis se você estiver escrevendo um misturador ou apresentador personalizado.

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

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

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

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

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

  5. O EVR chama IMFVideoPresenter::P rocessMessage 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 misturador. O misturador gera esta lista a partir dos formatos obtidos no passo 4.

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

Para subfluxos, o processo é mais simples:

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

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

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

Renderizador de vídeo aprimorado