Proceso de conexión de CBasePin
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
En esta sección se describe cómo la clase CBasePin implementa el proceso de conexión de patillas.
El Administrador de gráficos de filtros inicia todas las conexiones de patillas. Llama al método IPin::Connect del pin de salida, especificando el pin de entrada. El pin de salida completa la conexión llamando al método IPin::ReceiveConnection del pin de entrada. El pin de entrada puede aceptar o rechazar la conexión.
El Administrador de gráficos de filtros también puede especificar un tipo de medio para la conexión. Si es así, las patillas intentan conectarse con ese tipo. Si no es así, las patillas deben negociar el tipo. El Administrador de gráficos de filtros también puede especificar un tipo de medio parcial , que tiene el valor GUID_NULL para el tipo principal, subtipo o tipo de formato. En ese caso, los pines intentan coincidir con las partes del tipo de medio especificadas; el valor GUID_NULL actúa como carácter comodín.
El método CBasePin::Connect comienza comprobando que el pin puede aceptar una conexión. Por ejemplo, comprueba que el pin aún no está conectado. Delega el resto del proceso de conexión al método CBasePin::AgreeMediaType . Todo lo que sigue es realizado por AgreeMediaType.
Si el tipo de medio está completamente especificado, el pin llama al método CBasePin::AttemptConnection para intentar la conexión. De lo contrario, intenta los tipos de medios en el orden siguiente:
- Los tipos preferidos del pin de entrada.
- Los tipos preferidos del pin de salida.
Para revertir este orden, establezca la marca CBasePin::m_bTryMyTypesFirst en TRUE.
En cada caso, el pin llama a IPin::EnumMediaTypes para enumerar los tipos de medios. Este método recupera un objeto enumerador, que se pasa al método CBasePin::TryMediaTypes . El método TryMediaTypes recorre en bucle cada tipo de medio y llama a AttemptConnection para cada tipo.
Dentro del método AttemptConnection , el pin de salida llama a los métodos siguientes:
- Llama a CBasePin::CheckConnect en sí mismo para comprobar si el pin de entrada es adecuado.
- Llama a CBasePin::CheckMediaType en sí mismo para validar el tipo de medio.
- Llama a IPin::ReceiveConnection en el pin de entrada. El pin de entrada usa este método para determinar si debe aceptar la conexión.
- Llama a CBasePin::CompleteConnect en sí mismo para completar la conexión.
Tenga en cuenta lo siguiente:
- CheckConnect es un método virtual. En la clase base, este método comprueba si las direcciones del pin son compatibles. Los pines de salida deben conectarse a los pines de entrada y viceversa. La clase pin derivada normalmente invalidará este método para realizar otras comprobaciones. Por ejemplo, podría consultar el otro pin para una interfaz necesaria para la conexión. Si la clase derivada invalida CheckConnect, también debe llamar al método CBasePin .
- CheckMediaType es un método virtual puro, que la clase derivada debe implementar.
- CompleteConnect es un método virtual que no hace nada en la clase base. Las clases derivadas pueden invalidar este método para realizar cualquier trabajo adicional necesario para completar la conexión, como decidir un asignador de memoria.
Si se produce un error en cualquiera de estos pasos, el pin de salida llama al método CBasePin::BreakConnect para deshacer los pasos que ha llevado a cabo CheckConnect.
El método ReceiveConnection del pin de entrada llama a los métodos CheckConnect, CheckMediaType y CompleteConnect del pin de entrada. Si se produce un error en alguno de estos errores, también se produce un error en el intento de conexión.
En el diagrama siguiente se muestra el proceso de conexión en CBasePin:
Temas relacionados