Cadeias de filtro
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 in 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 percorrer 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 subchave 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.
A interface IFilterChain fornece os seguintes métodos para controlar cadeias de filtro:
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 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::Render ou 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 filtros. Caso contrário, você poderá causar deadlocks ou erros de grafo. Os filtros conectados à cadeia devem funcionar corretamente depois que 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. Esses pontos referem-se ao diagrama a seguir.
- 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::NewSegment e IPin::EndOfStream. Os filtros na cadeia devem retornar de chamadas para esses métodos feitos por filtros fora da cadeia; os filtros e 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 interfaces IPinFlowControl e IPinConnection , você poderá efetuar push dos dados por meio do grafo chamando os métodos IPinFlowControl::Block e IGraphConfig::P ushThroughData , conforme descrito em 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 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 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 (multiplexador) geralmente exigem dados de todos os seus pinos de entrada. Interromper o fluxo de dados de um pino de entrada pode impedir o processamento de outros fluxos. 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 descompactado. Se outras conexões estiverem usando o mesmo alocador, elas não poderão mais processar amostras.
- Não remova uma cadeia, a menos que os filtros conectados à cadeia deem suporte à desconexão dinâmica. Normalmente, os filtros conectados dão suporte à interface IPinConnection ou IPinFlowControl , mas podem dar suporte a interfaces privadas.
Tópicos relacionados