Compartilhar via


Cadeias de Filtros

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture 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.]

Uma cadeia de filtros é uma sequência de filtros que atende às seguintes condições:

  • Cada filtro na cadeia tem no máximo um pino de entrada conectado e um pino de saída conectado.
  • É possível percorrer todos os filtros da cadeia sem atravessar filtros fora da cadeia.

Por exemplo, no diagrama a seguir, os filtros A-B, C-D e F-G-H são cadeias de filtro. Cada subchain em F-G-H (F–G e G–H) também é uma cadeia de filtros. Uma cadeia de filtros pode consistir em um único filtro, portanto, os filtros A, B, C, D, F, G e H também são cadeias de filtro distintas. O Filtro E tem duas conexões de entrada, portanto, qualquer sequência de filtros que inclua o filtro E não é uma cadeia de filtros.

cadeia de filtros (exemplo 1)

A interface IFilterChain fornece os seguintes métodos para controlar cadeias de filtro:

Etiqueta Valor
IFilterChain::StartChain Inicia uma cadeia.
IFilterChain::StopChain Interrompe uma cadeia.
IFilterChain::P auseChain Pausa uma cadeia.
IFilterChain::RemoveChain Remove uma cadeia do grafo.

 

Não há nenhum método específico para adicionar uma cadeia. Para adicionar uma cadeia, insira os novos filtros usando o método IFilterGraph::AddFilter. Em seguida, conecte os filtros chamando IGraphBuilder::Connect, IGraphBuilder::Renderizarou métodos semelhantes.

Quando o grafo está em execução, uma cadeia de filtros pode alternar entre a execução e a parada. Quando o grafo é pausado, ele pode alternar entre pausado e parado. Essas são as únicas transições de estado possíveis com cadeias de filtro.

Diretrizes da cadeia de filtros

Quando você usa métodos IFilterChain, é importante garantir que os filtros no grafo possam dar suporte a operações de encadeamento de filtro. Caso contrário, você poderá causar deadlocks ou erros de grafo. Os filtros conectados à cadeia devem funcionar corretamente após a cadeia alterar o estado.

A melhor maneira de usar iFilterChain é com um conjunto de filtros que você projetou especificamente para encadeamento. Use as diretrizes a seguir para garantir que seus filtros sejam seguros para operações de cadeia de filtros. Esses pontos referem-se ao diagrama a seguir.

cadeia de filtros (exemplo 2)

  • Antes que o estado da cadeia de filtros seja alterado, todas as chamadas de processamento de dados no limite da cadeia de filtros devem ser concluídas. Essa regra se aplica aos métodos IMemInputPin::Receive, IPin::NewSegmente IPin::EndOfStream. Os filtros na cadeia devem retornar de chamadas para esses métodos feitos por filtros fora da cadeia; e os filtros fora da cadeia devem retornar de chamadas feitas por filtros dentro da cadeia.

Por exemplo, no diagrama anterior, o filtro B deve concluir todas as chamadas de processamento de dados do filtro A e o filtro E deve concluir todas as chamadas do filtro D. Se os pinos exporem as interfacesIPinFlowControleIPinConnection, você poderá enviar os dados por push por meio do grafo chamando os métodos IPinFlowControl::Block e IGraphConfig::P ushThroughData, conforme descrito em de Reconexão Dinâmica . Os filtros também podem dar suporte a métodos privados para enviar os dados por push.

  • Os filtros upstream devem esperar que o estado da cadeia seja alterado. Por exemplo, no diagrama anterior, suponha que a cadeia seja interrompida, mas filtre as chamadas A IMemInputPin::Receive. A chamada falha e a resposta do filtro A é interromper o streaming. Quando o aplicativo reinicia a cadeia, ele não tem efeito porque o filtro A não está mais transmitindo dados.
  • Os filtros downstream também devem esperar que o estado da cadeia seja alterado. Caso contrário, o filtro downstream poderá ser bloqueado enquanto aguarda amostras que nunca chegam. Por exemplo, filtros MUX (multiplexer) geralmente exigem dados de todos os seus pinos de entrada. Interromper o fluxo de dados de um pino de entrada pode impedir que os outros fluxos sejam processados. Isso pode fazer com que o grafo seja deadlock.
  • Cada conexão de pino de um filtro fora da cadeia para um filtro dentro da cadeia deve ter seu próprio alocador, que não é compartilhado por outras conexões. Quando a cadeia altera o estado ou é removida do grafo, o alocador pode ser descompactada. Se outras conexões estivessem usando o mesmo alocador, elas não poderão mais processar exemplos.
  • Não remova uma cadeia, a menos que os filtros conectados à cadeia ofereçam suporte à desconexão dinâmica. Normalmente, os filtros conectados darão suporte ao IPinConnection ou interface de IPinFlowControl, mas podem dar suporte a interfaces privadas.

de construção do Gráfico Dinâmico