Partilhar via


Correntes de Filtros

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

Um de 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 atravessar 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 filtros. Cada subcadeia 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, de modo que os filtros A, B, C, D, F, G e H também são cadeias de filtros 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)

O interface de IFilterChain fornece os seguintes métodos para controlar cadeias de filtros:

Rótulo Valor
IFilterChain::StartChain Inicia uma cadeia.
IFilterChain::StopChain Interrompe uma cadeia.
IFilterChain::P auseChain Pausa uma cadeia.
IFilterChain::RemoveChain Remove uma cadeia do gráfico.

 

Não existe um 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::Renderou métodos semelhantes.

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

Diretrizes da cadeia de filtros

Quando você usa métodos de IFilterChain, é importante certificar-se de que os filtros no gráfico podem suportar operações de encadeamento de filtros. Caso contrário, você pode causar deadlocks ou erros de gráfico. Os filtros conectados à cadeia devem funcionar corretamente após a cadeia mudar de 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. Estes pontos referem-se ao diagrama seguinte.

cadeia de filtros (exemplo 2)

  • Antes que o estado da cadeia de filtros mude, todas as chamadas de processamento de dados no limite da cadeia de filtros devem ser concluídas. Esta regra aplica-se aos métodos IMemInputPin::Receive, IPin::NewSegmente IPin::EndOfStream. Os filtros na cadeia devem retornar de chamadas para esses métodos feitas 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 expõem o IPinFlowControl e interfaces IPinConnection, você pode enviar os dados pelo gráfico chamando o IPinFlowControl::Block e métodos de IGraphConfig::P ushThroughData, conforme descrito em de Reconexão Dinâmica. Os filtros também podem oferecer suporte a métodos privados para enviar os dados por push.

  • Os filtros a montante devem esperar que o estado da cadeia mude. Por exemplo, no diagrama anterior, suponha que a cadeia é interrompida, mas o filtro A chama IMemInputPin::Receive. A chamada falha e a resposta do filtro A é parar 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 a jusante também devem esperar que o estado da cadeia mude. Caso contrário, o filtro a jusante pode bloquear enquanto aguarda amostras que nunca chegam. Por exemplo, os filtros de multiplexador (MUX) geralmente exigem dados de todos os seus pinos de entrada. Interromper o fluxo de dados de um pino de entrada pode bloquear o processamento de outros fluxos. Isso pode causar o bloqueio do gráfico.
  • Cada ligação de pino de um filtro fora da cadeia a um filtro dentro da cadeia deve ter o seu próprio alocador, que não é partilhado por outras ligações. Quando a cadeia muda de estado ou é removida do gráfico, o alocador pode ser descomprometido. Se outras conexões estivessem usando o mesmo alocador, elas não poderiam mais processar amostras.
  • Não remova uma corrente a menos que os filtros ligados à corrente suportem a desconexão dinâmica. Normalmente, os filtros conectados suportarão o IPinConnection ou interface IPinFlowControl, mas podem oferecer suporte a interfaces privadas.

Dynamic Graph Building