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


Метод IGraphConfig::Reconnect (strmif.h)

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

Метод Reconnect выполняет динамическое повторное соединение между двумя контактами.

Синтаксис

HRESULT Reconnect(
  [in] IPin                *pOutputPin,
  [in] IPin                *pInputPin,
  [in] const AM_MEDIA_TYPE *pmtFirstConnection,
  [in] IBaseFilter         *pUsingFilter,
  [in] HANDLE              hAbortEvent,
  [in] DWORD               dwFlags
);

Параметры

[in] pOutputPin

Указатель на интерфейс IPin выходного контакта. Может иметь значение NULL, в этом случае pInputPin не должно иметь значение NULL.

[in] pInputPin

Указатель интерфейса IPin на входной контакт. Может иметь значение NULL, в этом случае pOutputPin не должен иметь значение NULL.

[in] pmtFirstConnection

Указатель на структуру AM_MEDIA_TYPE , указывающую тип носителя для первого соединения контактов, выполненного во время повторного подключения. Если этот параметр имеет значение NULL, первое соединение может иметь любой тип носителя.

[in] pUsingFilter

Указатель на необязательный фильтр, используемый при повторном подключении. Фильтр должен уже находиться в графе. Может иметь значение NULL.

[in] hAbortEvent

Дескриптор события. Если вызывающий объект является фильтром, вызывающим в одном из потоков обработки данных, этот параметр должен быть дескриптором события, которое будет показано при переводе фильтра в остановленное состояние. В противном случае этот параметр может иметь значение NULL. Дополнительные сведения см. в подразделе "Примечания".

[in] dwFlags

Сочетание флагов из перечисления AM_GRAPH_CONFIG_RECONNECT_FLAGS , указывающее способ повторного подключения.

Возвращаемое значение

В случае успешного выполнения возвращает S_OK. В противном случае возвращает код ошибки, который может быть одним из следующих значений или другими значениями, не указанными в списке.

Код возврата Описание
E_INVALIDARG
Недопустимый аргумент. (Например, pInputPin и pOutputPin имеют значение NULL.)
E_NOINTERFACE
Входной контакт не поддерживает IPinConnection.
VFW_E_CANNOT_CONNECT
Не удалось подключить фильтр.
VFW_E_STATE_CHANGED
Состояние фильтра изменилось. Не удается завершить операцию.

Комментарии

Если указать только один контакт, метод выполнит поиск другого контакта. Однако по умолчанию поиск завершается ошибкой, если достигает фильтра, добавленного в граф с помощью метода IFilterGraph::AddFilter . Чтобы переопределить это поведение, вызовите IGraphConfig::SetFilterFlags и установите флаг AM_FILTER_FLAGS_REMOVABLE для фильтра.

Процесс повторного подключения состоит из нескольких этапов, большинство из них обрабатываются в этом методе:

  1. Во-первых, перед вызовом метода обязательно заблокируйте поток данных по перенастроенному пути. Для этого приложения должны вызывать метод IPinFlowControl::Block . Если вызывающий объект является фильтром, а не приложением, возможно, фильтр может управлять потоком данных внутри системы.
  2. Указанные выходные и входные контакты определяют начальную и конечную точки повторного подключения. Входной контакт должен поддерживать интерфейс IPinConnection . Если оставить один из этих контактов не указанным (передав параметр NULL ), метод выполняет поиск в графе фильтра, чтобы найти потенциальный контакт для повторного подключения. (Чтобы найти контакт ввода, он выполняет поиск нижестоящего из выходного контакта; чтобы найти выходной контакт, он выполняет поиск вышестоящий из входного контакта.)
  3. Метод отправляет все ожидающие данные через граф фильтра (через внутренний вызов IGraphConfig::P ushThroughData).
  4. Если вы указали фильтр для вставки в граф, метод подключает начальный выходной контакт к входному контакту фильтра и подключает выходной контакт фильтра к окончательному входному контакту. Если фильтр не указан, метод просто подключает выходной контакт к контакту ввода. В любом случае метод вставляет все фильтры преобразования, необходимые для завершения соединений. (Однако это поведение можно переопределить, установив соответствующий флаг. Дополнительные сведения см. в описании параметра dwFlags .)
  5. Наконец, метод переводит новые фильтры в состояние выполнения. Вызывающий объект может перезапустить поток данных. Приложения могут сделать это, вызывая IPinFlowControl::Block без флагов.
Если фильтр вызывает этот метод в одном из собственных потоков обработки данных, это создает вероятность взаимоблокировки. Метод получает блокировку графа фильтра, которая может блокировать остановку фильтра при получении вызова IMediaFilter::Stop. Чтобы избежать этой ситуации, метод принимает дескриптор объекта события, предоставленного фильтром. Фильтр должен сигнализировать о событии, если он получает вызов метода Stop .

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header strmif.h (включая Dshow.h)
Библиотека Strmiids.lib

См. также раздел

Коды ошибок и успешного выполнения

Интерфейс IGraphConfig