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


Уведомления о завершении потока

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

Когда исходный фильтр отправляет данные, он вызывает метод IPin::EndOfStream на нижнем входном пин-коде. Подчиненный фильтр распространяет вызов следующего фильтра и т. д. Когда вызов EndOfStream достигает отрисовщика, отрисовщик отправляет событие EC_COMPLETE диспетчеру графов фильтра. Если средство отрисовки имеет несколько входных контактов, оно доставляет событие EC_COMPLETE после получения уведомления о завершении потока.

Фильтр должен сериализовать вызовы EndOfStream с другими вызовами потоковой передачи, например IMemInputPin::Receive. (Другими словами, подчиненный фильтр должен всегда получать вызовы в правильном порядке.)

В некоторых случаях подчиненный фильтр может обнаружить конец потока перед выполнением исходного фильтра. (Например, нижестоящий фильтр может анализировать поток.) В этом случае подчиненный фильтр может отправлять уведомление конца потока, в этом случае он должен возвращать S_FALSE из IMemInputPin::Получение до остановки или очистки графа. Значение возвращаемого значения S_FALSE сообщает исходному фильтру, чтобы прекратить отправку данных.

Обработка EC_COMPLETE по умолчанию

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

Чтобы определить количество потоков, диспетчер графов фильтров подсчитывает количество фильтров, которые поддерживают поиск (через IMediaSeeking или IMediaPosition) и имеют отрисованный входной пин-код, который определяется как входной пин-код без соответствующих выходных данных. Диспетчер графов фильтров определяет, отображается ли пин-код одним из двух способов:

  • Метод IPin::QueryInternalConnections возвращает ноль в параметре nPin.
  • Фильтр предоставляет интерфейс IAMFilterMiscFlags и возвращает флаг AM_FILTER_MISC_FLAGS_IS_RENDERER.

Уведомления о завершении потока в режиме извлечения

В подключении IAsyncReader исходный фильтр не отправляет уведомление о завершении потока. Это делается нижестоящим фильтром, который обычно является фильтром синтаксического анализа. Средство синтаксического анализа отправляет подчиненный вызов EndOf Stream. Он не отправляет один вышестоящий поток в исходный фильтр.

доставки конца потока