Уведомления об окончании потоковой передачи

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

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

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

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

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

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

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

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

Уведомления об окончании потоковой передачи в режиме вытягивания

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

Доставка конца потока