Фильтрация состояний

Фильтры имеют три возможных состояния: остановлено, приостановлено и запущено. Назначением приостановленного состояния является подсказка в графе, чтобы команда запуска немедленно отвечала на запросы. фильтр Graph Manager управляет всеми переходами состояния. когда приложение вызывает имедиаконтрол:: Run, имедиаконтрол::P аусеили имедиаконтрол:: останавливаться, фильтр Graph Manager вызывает соответствующий метод имедиафилтер для всех фильтров. переходы между остановленными и запущенными всегда проходят через приостановленное состояние, поэтому если приложение вызывает выполнение на остановленном графе, фильтр Graph Manager приостанавливает граф перед его запуском.

Для большинства фильтров запущенные и приостановленные состояния идентичны. Рассмотрим следующий граф фильтра:

Модуль подготовки > преобразования источника >

Предположим, что фильтр источника не является источником динамической записи. Когда фильтр источника приостанавливается, он создает поток, который создает новые данные и записывает их в примеры носителей как можно быстрее. Поток "отправляет" образцы, вызывая имеминпутпин:: Receive на входном закрепление фильтра преобразования. Фильтр преобразования получает образцы в потоке исходного фильтра. Он может использовать рабочий поток для доставки образцов в модуль подготовки отчетов, но обычно он доставляет их в один и тот же поток. Пока модуль подготовки отчетов приостановлен, он ждет получения примера. После получения он блокирует и удерживает этот пример неограниченным образом. Если это модуль подготовки видео, он отображает пример в виде изображения афиши, при необходимости Перерисовывает изображение.

На этом этапе поток полностью куед и готов к отрисовке. Если граф остается приостановленным, выборка будет выводиться на диаграмме за первый пример, пока все фильтры не будут заблокированы в Receive или имемаллокатор::-buffer. Однако данные не теряются. После того как исходный поток разблокируется, он просто возобновляется с того места, где он был заблокирован.

Фильтр источника и фильтр преобразования игнорируют переход от приостановленного к работающему — они просто продолжают обрабатывать данные как можно быстрее. Но когда модуль подготовки отчетов запускается, он начинает отрисовку образцов. Сначала он выводит пример, удерживаемый в момент приостановки. Затем каждый раз, когда он получает новый пример, он вычисляет время презентации в примере. (Дополнительные сведения см. в разделе время и часы в DirectShow.) Модуль подготовки отчетов хранит каждый выбор до времени презентации, после чего он отображает пример. Хотя он ждет времени презентации, он либо блокируется в методе Receive , либо получает новые примеры в рабочем потоке с очередью. Фильтрация вышестоящего модуля модуля подготовки отчетов не участвует в планировании.

Динамические источники, такие как устройства записи, являются исключением из этой общей архитектуры. В реальном источнике нет необходимости заранее полагаться на какие-либо данные. Приложение может приостановить граф, а затем подождать длительное время, прежде чем запускать его. Граф не должен визуализировать "устаревшие" образцы. Таким образом, в реальном источнике нет выборок при приостановке, только во время выполнения. чтобы сообщить об этом факте в фильтр Graph Manager, метод имедиафилтер:: webmethod исходного фильтра возвращает команду VFW _ s не _ удается _ подсказку. Этот код возврата означает, что фильтр переключен на приостановленное состояние, даже если модуль подготовки отчетов не получал никаких данных.

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

Переходы состояния

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

  • Приостановлено для приостановки: по мере приостановки каждого фильтра он готов к получению примеров со следующего фильтра. Фильтр источника является последним для приостановки. Он создает поток потоковой передачи и начинает доставку образцов. Так как все нисходящие фильтры приостановлены, ни один из фильтров не отклоняет выборки. фильтр Graph Manager не завершает переход, пока каждый визуализатор в графе не получит пример (за исключением динамических источников, как описано выше).
  • Приостановлено на остановлено: при остановке фильтра он освобождает все содержащиеся в нем образцы, которые разблокируют все исходящие фильтры, ожидающие в процессе работы с потоком. Если фильтр ожидает ресурс внутри метода Receive , он останавливает ожидание и возвращает результат Receive, который разблокирует вызывающий фильтр. таким образом, когда диспетчер Graph Manager останавливает следующий вышестоящий фильтр, этот фильтр не блокируется в @ buffer или Receive и может реагировать на команду stop. Вышестоящий фильтр может доставлять несколько дополнительных выборок перед получением команды остановки, но подчиненный фильтр просто отклоняет их, так как он уже остановлен.

Flow данных в фильтре Graph