Etapa 3. Negociação de tipo de mídia de suporte

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, 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 é a etapa 3 do tutorial Escrevendo Filtros de Transformação.

Quando dois pinos se conectam, eles devem concordar com um tipo de mídia para a conexão. O tipo de mídia descreve o formato dos dados. Sem o tipo de mídia, um filtro pode fornecer um tipo de dados, apenas para que outro filtro os trate como outra coisa.

O mecanismo básico para negociar tipos de mídia é o método IPin::ReceiveConnection . O pino de saída chama esse método no pin de entrada com um tipo de mídia proposto. O pin de entrada aceita a conexão ou a rejeita. Se ele rejeitar a conexão, o pino de saída poderá tentar outro tipo de mídia. Se nenhum tipo adequado for encontrado, a conexão falhará. Opcionalmente, o pin de entrada pode anunciar uma lista de tipos que prefere, por meio do método IPin::EnumMediaTypes . O pino de saída pode usar essa lista quando propõe tipos de mídia, embora não precise.

A classe CTransformFilter implementa uma estrutura geral para esse processo, da seguinte maneira:

  • O pin de entrada não tem tipos de mídia preferenciais. Ele depende inteiramente do filtro upstream para propor o tipo de mídia. Para dados de vídeo, isso faz sentido, pois o tipo de mídia inclui o tamanho da imagem e a taxa de quadros. Normalmente, essas informações devem ser fornecidas por um filtro de origem upstream ou filtro de analisador. No caso de dados de áudio, o conjunto de formatos possíveis é menor, portanto, pode ser prático para o pin de entrada oferecer alguns tipos preferenciais. Nesse caso, substitua CBasePin::GetMediaType no pin de entrada.
  • Quando o filtro upstream propõe um tipo de mídia, o pin de entrada chama o método CTransformFilter::CheckInputType, que aceita ou rejeita o tipo.
  • O pino de saída não se conectará, a menos que o pino de entrada esteja conectado primeiro. Esse comportamento é típico para filtros de transformação. Na maioria dos casos, o filtro deve determinar o tipo de entrada antes de definir o tipo de saída.
  • Quando o pino de saída se conecta, ele tem uma lista de tipos de mídia que ele propõe para o filtro downstream. Ele chama o método CTransformFilter::GetMediaType para gerar essa lista. O pino de saída também tentará todos os tipos de mídia que o filtro downstream propõe.
  • Para marcar se um tipo de saída específico é compatível com o tipo de entrada, o pino de saída chama o método CTransformFilter::CheckTransform.

Os três métodos CTransformFilter listados anteriormente são métodos virtuais puros, portanto, sua classe derivada deve implementá-los. Nenhum desses métodos pertence a uma interface COM; eles são simplesmente parte da implementação fornecida pelas classes base.

As seções a seguir descrevem cada método com mais detalhes:

Como os filtros se conectam

Escrevendo filtros do DirectShow