Paso 3. Compatibilidad con la negociación de tipos de medios

[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.

Este es el paso 3 del tutorial Escritura de filtros de transformación.

Cuando se conectan dos patillas, deben aceptar un tipo de medio para la conexión. El tipo de medio describe el formato de los datos. Sin el tipo de medio, un filtro puede entregar un tipo de datos, solo para que otro filtro lo trate como algo más.

El mecanismo básico para negociar tipos de medios es el método IPin::ReceiveConnection . El pin de salida llama a este método en el pin de entrada con un tipo de medio propuesto. El pin de entrada acepta la conexión o la rechaza. Si rechaza la conexión, el pin de salida puede probar otro tipo de medio. Si no se encuentra ningún tipo adecuado, se produce un error en la conexión. Opcionalmente, el pin de entrada puede anunciar una lista de tipos que prefiera, a través del método IPin::EnumMediaTypes . El pin de salida puede usar esta lista cuando propone tipos de medios, aunque no tiene que hacerlo.

La clase CTransformFilter implementa un marco general para este proceso, como se indica a continuación:

  • El pin de entrada no tiene tipos de medios preferidos. Se basa completamente en el filtro ascendente para proponer el tipo de medio. Para los datos de vídeo, esto tiene sentido, ya que el tipo de medio incluye el tamaño de la imagen y la velocidad de fotogramas. Normalmente, esa información debe proporcionarse mediante un filtro de origen ascendente o un filtro de analizador. En el caso de los datos de audio, el conjunto de formatos posibles es más pequeño, por lo que puede ser práctico que el pin de entrada ofrezca algunos tipos preferidos. En ese caso, invalide CBasePin::GetMediaType en el pin de entrada.
  • Cuando el filtro ascendente propone un tipo de medio, el pin de entrada llama al método CTransformFilter::CheckInputType , que acepta o rechaza el tipo.
  • El pin de salida no se conectará a menos que el pin de entrada esté conectado primero. Este comportamiento es típico para los filtros de transformación. En la mayoría de los casos, el filtro debe determinar el tipo de entrada para poder establecer el tipo de salida.
  • Cuando el pin de salida se conecta, tiene una lista de tipos de medios que propone al filtro de bajada. Llama al método CTransformFilter::GetMediaType para generar esta lista. El pin de salida también probará los tipos de medios que propone el filtro de bajada.
  • Para comprobar si un tipo de salida determinado es compatible con el tipo de entrada, el pin de salida llama al método CTransformFilter::CheckTransform .

Los tres métodos CTransformFilter enumerados anteriormente son métodos virtuales puros, por lo que la clase derivada debe implementarlos. Ninguno de estos métodos pertenece a una interfaz COM; simplemente forman parte de la implementación proporcionada por las clases base.

En las secciones siguientes se describe cada método con más detalle:

Conexión de filtros

Escribir filtros directShow