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


Подключаемые распространители

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

Подключаемые распространители (PID) — это способ расширения функциональных возможностей диспетчера графов фильтров. Подключаемый распространитель — это COM-объект, который диспетчер графов фильтров агрегирует во время выполнения. Приложения получают доступ к PID через диспетчер графов фильтров.

Когда диспетчеру графов фильтров запрашивается интерфейс, который он не поддерживает, он ищет в реестре ключ в следующей форме:

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID — это строка, содержащая идентификатор интерфейса. Если запись реестра существует, значение записи определяет идентификатор класса (CLSID) PID, поддерживающего интерфейс. Диспетчер графов фильтров агрегирует PID и возвращает указатель интерфейса, тем самым выступая в качестве внешнего IUnknown для PID. Когда приложение вызывает методы в интерфейсе, оно фактически вызывает их для PID. Однако существование PID является прозрачным для приложения.

Термин распространитель проистекает из того факта, что PID может запрашивать свой внешний указатель IUnknown для интерфейсов в диспетчере графов фильтров. Вызывая метод IFilterGraph::EnumFilters , PID может перечислить фильтры в графе и распределить вызовы методов между этими фильтрами. Таким образом, PID может служить единой контрольной точкой для вызова методов в фильтрах приложением.

Когда диспетчер графов фильтров агрегирует PID, он запрашивает у него интерфейс IDistributorNotify . Если PID поддерживает этот интерфейс, диспетчер графов фильтров использует его для уведомления PID об изменениях в графе:

Чтобы реализовать пользовательский PID, создайте COM-объект, поддерживающий агрегирование. Он должен поддерживать интерфейс, который диспетчер графов фильтров еще не поддерживает. При необходимости он может поддерживать интерфейс IDistributorNotify .

Если PID получает какие-либо указатели интерфейса от диспетчера графов фильтров, он должен немедленно освободить их. В противном случае это может создать циклическое число ссылок, что может помешать уничтожению диспетчера графов фильтров. Хранение счетчика ссылок в диспетчере графов фильтров в любом случае не требуется, так как диспетчер графов фильтров управляет временем существования PID.

Так как PID предназначен специально для агрегирования с помощью диспетчера графов фильтров, может потребоваться применить его в методе конструктора PID. Проверьте, имеет ли внешний указатель IUnknownзначение NULL, и если да, верните код ошибки VFW_E_NEED_OWNER. (См. коды ошибок и успешного выполнения.) Кроме того, чтобы другие объекты не могли агрегировать PID, можно запросить внешний указатель IUnknown для интерфейса IGraphBuilder . Возвращает код ошибки, если объект не предоставляет IGraphBuilder.