Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Microsoft настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и захват аудио/видео в Media Foundation вместо DirectShow, если это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Во время работы графа фильтра произвольные объемы данных могут перемещаться по графу. Некоторые из этих объектов могут находиться в очередях, ожидая доставки. Бывают моменты, когда граф фильтров должен как можно быстрее удалить эти ожидающие данные и заменить их новыми данными. Например, после команды поиска исходный фильтр создает примеры из новой позиции в источнике. Чтобы свести к минимуму задержку, подчиненные фильтры должны отменить все образцы, созданные перед командой поиска. Процесс отбрасывания образцов называется промывкой. Это позволяет графу реагировать, когда события изменяют обычный поток данных.
Очистка обрабатывается немного иначе моделью извлечения, чем модель отправки. В этой статье сначала описывается модель отправки; затем рассматриваются различия модели извлечения.
Очистка происходит на двух этапах.
- Во-первых, исходный фильтр вызывает IPin::BeginFlush на входной штырь нижестоящего фильтра. Нижестоящий фильтр начинает отклонять образцы из входящего потока. Он также удаляет все семплы, которые он держит, и отправляет вызов функции BeginFlush вниз по потоку к следующему фильтру.
- Когда исходный фильтр готов к отправке новых данных, он вызывает IPin::EndFlush на входном штыре. Это сигнализирует нижнему фильтру о том, что он может получать новые примеры. Нижестоящий фильтр отправляет вызов EndFlush следующему фильтру.
В методе BeginFlush входной пин-код выполняет следующие действия:
- Вызывает BeginFlush на downstream входных выводах.
- Отклоняет все дальнейшие вызовы, связанные с потоковой передачей данных, включая получение и конец потока.
- Разблокирует любые входящие фильтры, которые блокируются в ожидании образца из распределителя фильтра. Некоторые фильтры освобождают своих распределителей для этой цели.
- Выходит из любого состояния ожидания, которое блокирует потоковую передачу. Например, фильтры рендерера блокируются при приостановке. Они также задерживаются, когда ожидают воспроизведения образца в подходящее время в потоке. Фильтр должен разблокироваться, чтобы можно было отправлять и отклонять образцы, находящиеся в очереди наверху. Этот шаг гарантирует, что все входящие фильтры в конечном итоге разблокируются.
В методе EndFlush входной пин-код выполняет следующие действия:
- Ожидает удаления всех образцов в очереди.
- Освобождает все буферные данные. Этот шаг иногда можно выполнить в методе BeginFlush. Однако BeginFlush не синхронизированы с потоком данных. Фильтр не должен обрабатывать или буферировать больше данных между вызовом BeginFlush и вызовом EndFlush.
- Очищает все ожидающие уведомления EC_COMPLETE.
- Вызовы EndFlush внизу.
На этом этапе фильтр может снова принимать примеры. Все образцы гарантированно свежее, чем смыв.
В модели извлечения фильтр синтаксического анализа инициирует очистку, а не исходный фильтр. Не только вызываются методы IPin::BeginFlush и IPin::EndFlush на нижнем фильтре, но также вызываются методы IAsyncReader::BeginFlush и IAsyncReader::EndFlush на выходном штыре исходного фильтра. Если исходный фильтр имеет ожидающие запросы на чтение, он отбрасывает их.
Связанные разделы