Compartir a través de


Cadenas de filtro

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

Una cadena de filtros es una secuencia de filtros que cumple las condiciones siguientes:

  • Cada filtro de la cadena tiene como máximo un pin de entrada conectado y un pin de salida conectado.
  • Es posible recorrer todos los filtros de la cadena sin atravesar filtros fuera de la cadena.

Por ejemplo, en el diagrama siguiente, los filtros A-B, C–D y F–G–H son cadenas de filtro. Cada subcadenamiento de F–G–H (F–G y G–H) también es una cadena de filtro. Una cadena de filtros puede constar de un solo filtro, por lo que los filtros A, B, C, D, F, G y H también son cadenas de filtro distintas. El filtro E tiene dos conexiones de entrada, por lo que cualquier secuencia de filtros que incluya el filtro E no es una cadena de filtros.

cadena de filtros (ejemplo 1)

La interfaz IFilterChain proporciona los métodos siguientes para controlar las cadenas de filtro:

Etiqueta Value
IFilterChain::StartChain Inicia una cadena.
IFilterChain::StopChain Detiene una cadena.
IFilterChain::P auseChain Pausa una cadena.
IFilterChain::RemoveChain Quita una cadena del gráfico.

 

No hay ningún método específico para agregar una cadena. Para agregar una cadena, inserte los nuevos filtros mediante el método IFilterGraph::AddFilter . A continuación, conecte los filtros mediante una llamada a IGraphBuilder::Connect, IGraphBuilder::Render o métodos similares.

Cuando se ejecuta el grafo, una cadena de filtros puede cambiar entre la ejecución y la detención. Cuando el gráfico está en pausa, puede cambiar entre pausado y detenido. Estas son las únicas transiciones de estado posibles con cadenas de filtro.

Directrices de la cadena de filtros

Al usar métodos IFilterChain , es importante asegurarse de que los filtros del grafo pueden admitir operaciones de encadenamiento de filtros. De lo contrario, puede provocar interbloqueos o errores de grafos. Los filtros conectados a la cadena deben funcionar correctamente después de que la cadena cambie de estado.

La mejor manera de usar IFilterChain es con un conjunto de filtros diseñados específicamente para encadenar. Use las instrucciones siguientes para asegurarse de que los filtros son seguros para las operaciones de cadena de filtros. Estos puntos hacen referencia al diagrama siguiente.

cadena de filtros (ejemplo 2)

  • Antes de que cambie el estado de la cadena de filtro, se deben completar todas las llamadas de procesamiento de datos en el límite de la cadena de filtros. Esta regla se aplica a los métodos IMemInputPin::Receive, IPin::NewSegment e IPin::EndOfStream. Los filtros de la cadena deben devolver de las llamadas a estos métodos realizados por filtros fuera de la cadena; y los filtros fuera de la cadena deben devolver de las llamadas realizadas por filtros dentro de la cadena.

Por ejemplo, en el diagrama anterior, el filtro B debe completar las llamadas de procesamiento de datos del filtro A y el filtro E debe finalizar las llamadas del filtro D. Si los pines exponen las interfaces IPinFlowControl e IPinConnection , puede insertar los datos a través del gráfico llamando a los métodos IPinFlowControl::Block e IGraphConfig::P ushThroughData , como se describe en Reconexión dinámica. Los filtros también pueden admitir métodos privados para insertar los datos.

  • Los filtros ascendentes deben esperar que cambie el estado de la cadena. Por ejemplo, en el diagrama anterior, suponga que la cadena se detiene pero filtra A llama a IMemInputPin::Receive. Se produce un error en la llamada y la respuesta del filtro A es detener el streaming. Cuando la aplicación reinicia la cadena, no tiene ningún efecto porque el filtro A ya no transmite datos.
  • Los filtros de bajada también deben esperar que cambie el estado de la cadena. Si no es así, el filtro de bajada podría bloquearse mientras espera las muestras que nunca llegan. Por ejemplo, los filtros de multiplexador (MUX) suelen requerir datos de todos sus patillas de entrada. Detener el flujo de datos de un pin de entrada podría impedir que los demás flujos se procesen. Esto puede hacer que el grafo interbloquee.
  • Cada conexión de patilla desde un filtro fuera de la cadena a un filtro dentro de la cadena debe tener su propio asignador, que no se comparte con otras conexiones. Cuando la cadena cambia el estado o se quita del gráfico, es posible que se descommita el asignador. Si otras conexiones usaban el mismo asignador, ya no pueden procesar ejemplos.
  • No quite una cadena a menos que los filtros conectados a la cadena admitan la desconexión dinámica. Normalmente, los filtros conectados admitirán la interfaz IPinConnection o IPinFlowControl , pero podrían admitir interfaces privadas en su lugar.

Creación de gráficos dinámicos