Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEnginey captura de audio y 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 captura de audio y vídeo 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 clase CBasePin implementa el proceso de conexión de patillas.
El Administrador de gráficos de filtros inicia todas las conexiones de anclaje. 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, las patillas intentan coincidir con las partes del tipo de medio especificadas; el valor GUID_NULL actúa como 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 siguiente lo realiza 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 multimedia en el orden siguiente:
- Los tipos preferidos del pin de entrada.
- Tipos preferidos del pin de salida.
Puede revertir este orden estableciendo 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 cada tipo de medio y llama a TryConnection 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 de anclaje 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étodoCBasePin.
- CheckMediaType es un método virtual puro, que debe implementar la clase derivada.
- 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 alguno de estos pasos, el pin de salida llama al método CBasePin::BreakConnect para deshacer los pasos que se han realizado CheckConnect.
El métodoReceiveConnection del pin de entrada llama al CheckConnect, CheckMediaTypey métodos completeConnect. Si se produce un error en cualquiera 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