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


Промывки

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

Во время работы графа фильтра по графу могут перемещаться произвольные объемы данных. Некоторые из этих модулей могут находиться в очередях, ожидая доставки. Иногда графу фильтров требуется как можно быстрее удалить эти ожидающие данные и заменить их новыми данными. Например, после выполнения команды seek фильтр источника создает примеры из новой позиции в источнике. Чтобы свести к минимуму задержку, подчиненные фильтры должны отменить все примеры, созданные до выполнения команды seek. Процесс отмены выборок называется очисткой. Это позволяет графу лучше реагировать на события, изменяя обычный поток данных.

Очистка обрабатывается моделью извлечения немного иначе, чем моделью принудительной передачи. В начале этой статьи описывается модель принудительной отправки; затем он описывает различия в модели по запросу.

Очистка выполняется в два этапа.

  • Во-первых, исходный фильтр вызывает IPin::BeginFlush для входного контакта нижестоящего фильтра. Нижестоящий фильтр начинает отклонять примеры из вышестоящий. Он также удаляет все образцы, которые он удерживает, и отправляет подчиненный вызов BeginFlush следующему фильтру.
  • Когда исходный фильтр будет готов к отправке новых данных, он вызывает IPin::EndFlush для входного закрепления. Это сигнализирует нисходящему фильтру о том, что он может получать новые образцы. Нижестоящий фильтр отправляет вызов EndFlush следующему фильтру.

В методе BeginFlush входной контакт выполняет следующие действия:

  1. Вызывает BeginFlush для подчиненных входных контактов.
  2. Отклоняет дальнейшие вызовы данных потока, включая Receive и EndOfStream.
  3. Разблокирует все вышестоящий фильтры, которые заблокированы в ожидании образца из распределителя фильтра. Для этой цели некоторые фильтры выводят из эксплуатации свои распределители.
  4. Завершает работу с любыми ожиданиями, которые блокируют потоковую передачу. Например, фильтры отрисовщика блокируются при приостановке. Они также блокируются, когда они ожидают отрисовки образца в правильное время потока. Фильтр должен разблокироваться, чтобы образцы, помещенные в очередь вышестоящий, могли быть доставлены и отклонены. Этот шаг гарантирует, что все фильтры вышестоящий в конечном итоге будут разблокироваться.

В методе EndFlush входной контакт выполняет следующие действия:

  1. Ожидает отмены всех поставленных в очередь примеров.
  2. Освобождает все буферизированные данные. Этот шаг иногда можно выполнить в методе BeginFlush . Однако BeginFlush не синхронизируется с потоком потоковой передачи. Фильтр не должен обрабатывать или буферизовывать данные между вызовом BeginFlush и вызовом EndFlush.
  3. Удаляет все ожидающие уведомления EC_COMPLETE.
  4. Вызывает Метод EndFlush, подчиненный .

На этом этапе фильтр может снова принимать примеры. Все образцы гарантированно будут более поздними, чем очистка.

В модели по запросу фильтр синтаксического анализа инициирует очистку, а не исходный фильтр. Он не только вызывает IPin::BeginFlush и IPin::EndFlush в нисходящем фильтре, но также вызывает IAsyncReader::BeginFlush и IAsyncReader::EndFlush в выходном контакте исходного фильтра. Если исходный фильтр имеет ожидающие запросы на чтение, они будут удалены.

Очистка данных