Повторное подключение контактов

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

Во время соединения с закреплением фильтр может отключить и повторно подключить один из других контактов следующим образом:

  1. Фильтр вызывает IPin::QueryAccept для закрепления другого фильтра и задает новый тип носителя.
  2. Если QueryAccept возвращает S_OK, фильтр вызывает IFilterGraph2::ReconnectEx для повторного подключения контактов.

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

  • Фильтры тройника. Фильтр тройника разделяет входной поток на несколько выходов без изменения данных в потоке. Фильтр тройника может принимать различные типы мультимедиа, но типы должны соответствовать всем соединениям с закреплением. Поэтому, когда входной контакт подключается, фильтру может потребоваться пересматривать все существующие подключения на выходных контактах, и наоборот. Пример см. в примере фильтра InfTee.
  • Транс-на месте фильтров. Фильтр trans-in-place изменяет входные данные в исходном буфере вместо копирования данных в отдельный выходной буфер. Фильтр trans-in-place должен использовать один и тот же распределител для вышестоящий и подчиненных подключений. Первый контакт для подключения (входные или выходные данные) согласовывает распределителя обычным способом. Однако при подключении другого контакта первый распределителя может оказаться неприемлемым. В этом случае второй контакт выбирает другой распределителя, а первый контакт повторно подключается с помощью нового распределителя. Пример реализации см. в разделе Класс CTransInPlaceFilter .

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