Compartilhar via


Processo de conexão CBasePin

[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 seção descreve como a classe CBasePin implementa o processo de conexão de pino.

O Gerenciador de Grafo de Filtro inicia todas as conexões de fixação. Ele chama o método IPin::Connect do pino de saída, especificando o pin de entrada. O pino de saída conclui a conexão chamando o método IPin::ReceiveConnection do pino de entrada. O pin de entrada pode aceitar ou rejeitar a conexão.

O Gerenciador de Grafo de Filtro também pode especificar um tipo de mídia para a conexão. Nesse caso, os pinos tentam se conectar com esse tipo. Caso contrário, os pinos devem negociar o tipo. O Gerenciador de Grafo de Filtro também pode especificar um tipo de mídia parcial , que tem o valor GUID_NULL para o tipo principal, subtipo ou tipo de formato. Nesse caso, os pinos tentam corresponder a qualquer parte do tipo de mídia especificada; o valor GUID_NULL atua como um curinga.

O método CBasePin::Connect começa verificando se o pino pode aceitar uma conexão. Por exemplo, ele verifica se o pino ainda não está conectado. Ele delega o restante do processo de conexão ao método CBasePin::AgreeMediaType . Tudo o que se segue é executado por AgreeMediaType.

Se o tipo de mídia for totalmente especificado, o pin chamará o método CBasePin::AttemptConnection para tentar a conexão. Caso contrário, ele tentará tipos de mídia na seguinte ordem:

  1. Os tipos preferenciais do pino de entrada.
  2. Os tipos preferenciais do pino de saída.

Você pode reverter essa ordem definindo o sinalizador CBasePin::m_bTryMyTypesFirst como TRUE.

Em cada caso, o pin chama IPin::EnumMediaTypes para enumerar os tipos de mídia. Esse método recupera um objeto enumerador, que é passado para o método CBasePin::TryMediaTypes . O método TryMediaTypes percorre cada tipo de mídia e chama AttemptConnection para cada tipo.

Dentro do método AttemptConnection , o pino de saída chama os seguintes métodos:

Observe o seguinte:

  • CheckConnect é um método virtual. Na classe base, esse método verifica se as direções do pino são compatíveis. Os pinos de saída devem se conectar aos pinos de entrada e vice-versa. A classe de pino derivada normalmente substituirá esse método para executar outras verificações. Por exemplo, ele pode consultar o outro pino para uma interface necessária para a conexão. Se a classe derivada substituir CheckConnect, ela também deverá chamar o método CBasePin .
  • CheckMediaType é um método virtual puro, que a classe derivada deve implementar.
  • CompleteConnect é um método virtual que não faz nada na classe base. Classes derivadas podem substituir esse método para executar qualquer trabalho adicional necessário para concluir a conexão, como decidir um alocador de memória.

Se qualquer uma dessas etapas falhar, o pin de saída chamará o método CBasePin::BreakConnect para desfazer quaisquer etapas executadas pelo CheckConnect.

O método ReceiveConnection do pino de entrada chama os métodos CheckConnect, CheckMediaType e CompleteConnect do pino de entrada. Se algum deles falhar, a tentativa de conexão também falhará.

O diagrama a seguir mostra o processo de conexão no CBasePin:

processo de conexão cbasepin

Cbasepin