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


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

[Функция, связанная с этой страницей 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 должен завершить все вызовы обработки данных из фильтра A, а фильтр E — все вызовы из фильтра D. Если контакты предоставляют интерфейсы IPinFlowControl и IPinConnection , данные можно отправить через граф, вызвав методы IPinFlowControl::Block и IGraphConfig::P ushThroughData , как описано в разделе Динамическое повторное подключение. Фильтры также могут поддерживать частные методы для отправки данных.

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

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