Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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 gráficos de filtro inicia todas as conexões de pinos. Ele chama o pino de saída IPin::Connect método, 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 pino de entrada pode aceitar ou rejeitar a conexão.
O Filter Graph Manager também pode especificar um tipo de mídia para a conexão. Em caso afirmativo, os pinos tentam se conectar com esse tipo. Caso contrário, os pinos devem negociar o tipo. O Filter Graph Manager também pode especificar um tipo de mídia de parcial, que tem o valor GUID_NULL para o tipo principal, subtipo ou tipo de formato. Nesse caso, os pinos tentam corresponder às partes do tipo de mídia especificadas; 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, verifica se o pino ainda não está ligado. Ele delega o restante do processo de conexão ao métodoCBasePin::AgreeMediaType. Tudo o que se segue é realizado por AgreeMediaType.
Se o tipo de mídia for totalmente especificado, o pino chamará o métodoCBasePin::AttemptConnection para tentar a conexão. Caso contrário, ele tenta tipos de mídia na seguinte ordem:
- Os tipos preferidos do pino de entrada.
- Os tipos preferidos do pino de saída.
Você pode inverter essa ordem definindo o sinalizador CBasePin::m_bTryMyTypesFirst como TRUE.
Em cada caso, o pino chama IPin::EnumMediaTypes para enumerar os tipos de mídia. Esse método recupera um objeto enumerador, que é passado para o CBasePin::TryMediaTypes método. 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:
- 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 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 que é necessária para a conexão. Se a classe derivada substituir CheckConnect , ela também deverá chamar o métodoCBasePin.
- 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. As 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 pino de saída chamará o método CBasePin::BreakConnect para desfazer quaisquer etapas que foram tomadas pelo CheckConnect.
O método ReceiveConnection do pino de entrada chama os métodos CheckConnect do pino de entrada, CheckMediaTypee CompleteConnect. Se algum deles falhar, a tentativa de conexão também falhará.
O diagrama a seguir mostra o processo de conexão no CBasePin:
Tópicos relacionados