Compartilhar via


Processo de conexão CBasePin

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture 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 Audio/Video Capture 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 pin. Ele chama o método IPin::Connect do pino de saída, especificando o pino 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 tentarão 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 pino 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 para verdadeiro.

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étodoCBasePin::TryMediaTypes. O método TryMediaTypes percorre cada tipo de mídia e chama TryConnection para cada tipo.

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

  • Ele chama CBasePin::CheckConnect em si mesmo para verificar se o pino de entrada é adequado.
  • Ele chama CBasePin::CheckMediaType em si mesmo para validar o tipo de mídia.
  • Ele chama IPin::ReceiveConnection no pino de entrada. O pino de entrada usa esse método para determinar se ele deve aceitar a conexão.
  • Ele chama CBasePin::CompleteConnect em si mesmo para concluir a conexão.

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 a 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 alguma dessas etapas falhar, o pino de saída chamará o método CBasePin::BreakConnect para desfazer as etapas executadas pelo CheckConnect.

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

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

processo de conexão cbasepin

CBasePin