Поделиться через


Цепочки фильтров

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Цепочка фильтров — это последовательность фильтров, удовлетворяющих следующим условиям:

  • Каждый фильтр в цепочке имеет по крайней мере один подключенный входной пин-код и один подключенный выходной пин-код.
  • Можно пройти каждый фильтр в цепочке без обхода фильтров за пределами цепочки.

Например, на следующей схеме фильтры A-B, C-D и F-G-H являются цепочками фильтров. Каждая подсеть в F-G-H (F-G и G-H) также является цепочкой фильтров. Цепочка фильтров может состоять из одного фильтра, поэтому фильтры A, B, C, D, F, G и H также являются различными цепочками фильтров. Фильтр E имеет два входных соединения, поэтому любая последовательность фильтров, включающих фильтр E, не является цепочкой фильтров.

цепочка фильтров (пример 1)

Интерфейс IFilterChain предоставляет следующие методы для управления цепочками фильтров:

Ярлык Ценность
IFilterChain::StartChain Запускает цепочку.
IFilterChain::StopChain Останавливает цепочку.
IFilterChain::P auseChain Приостанавливает цепочку.
IFilterChain::RemoveChain Удаляет цепочку из графа.

 

Для добавления цепочки нет определенного метода. Чтобы добавить цепочку, вставьте новые фильтры с помощью метода IFilterGraph::AddFilter. Затем подключите фильтры, вызвав IGraphBuilder::Connect, IGraphBuilder::Renderили аналогичные методы.

При запуске графа цепочка фильтров может переключаться между выполнением и остановкой. При приостановке графа он может переключаться между приостановленным и остановленным. Это единственные переходы состояний, возможные с помощью цепочек фильтров.

Рекомендации по цепочке фильтров

При использовании методов IFilterChain важно убедиться, что фильтры в графе могут поддерживать операции цепочки фильтров. В противном случае могут возникнуть взаимоблокировки или ошибки графа. Фильтры, подключенные к цепочке, должны функционировать правильно после изменения состояния цепочки.

Лучшим способом использования IFilterChain является набор фильтров, разработанных специально для цепочки. Используйте следующие рекомендации, чтобы убедиться, что фильтры безопасны для операций цепочки фильтров. Эти точки относятся к следующей схеме.

цепочке фильтров (пример 2)

  • Перед изменением состояния цепочки фильтров все вызовы обработки данных в границе цепочки фильтров должны быть завершены. Это правило применяется к методам IMemInputPin::Receive, IPin::NewSegmentи IPin::EndOfStream. Фильтры в цепочке должны возвращаться из вызовов этих методов, сделанных фильтрами за пределами цепочки; и фильтры за пределами цепочки должны возвращаться из вызовов, выполненных фильтрами в цепочке.

Например, на предыдущей схеме фильтр B должен завершить все вызовы обработки данных из фильтра А, а фильтр E должен завершить все вызовы из фильтра D. Если пин-коды предоставляют интерфейсы IPinFlowControl и интерфейсы IPinConnection, можно отправить данные через граф, вызвав методы IPinFlowControl::Block и IGraphConfig::P ushThroughData, как описано в динамическом повторном подключении. Фильтры также могут поддерживать частные методы для отправки данных.

  • Исходящие фильтры должны ожидать изменения состояния цепочки. Например, на предыдущей схеме предположим, что цепочка остановлена, но фильтрует вызовы A IMemInputPin::Receive. Вызов завершается сбоем, а ответ фильтра A — остановить потоковую передачу. Когда приложение перезагрузит цепочку, он не влияет, так как фильтр A больше не потоковые данные.
  • Подчиненные фильтры также должны ожидать изменения состояния цепочки. Если нет, подчиненный фильтр может блокироваться, пока он ожидает выборки, которые никогда не приходят. Например, фильтры мультиплексера (MUX) часто требуют данных из всех входных закреплений. Остановка потока данных из одного входного пин-кода может блокировать обработку других потоков. Это может привести к взаимоблокировки графа.
  • Каждое закрепление соединения из фильтра за пределами цепочки к фильтру в цепочке должно иметь собственный распределитель, который не предоставляется другим подключениям. При изменении состояния цепочки или удалении из графа может быть удален распределитель. Если другие подключения использовали тот же распределитель, они больше не могут обрабатывать примеры.
  • Не удаляйте цепочку, если фильтры, подключенные к цепочке, поддерживают динамическое отключение. Как правило, подключенные фильтры поддерживают интерфейс IPinConnection или интерфейсе IPinFlowControl, но могут поддерживать частные интерфейсы.

динамическое построение графа