Подключаемые распространители
[Функция, связанная с этой страницей 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 об изменениях в графе:
- Когда граф фильтров переключается между состояниями выполнения, приостановки и остановки, он вызывает IDistributorNotify::Run, IDistributorNotify::P ause или IDistributorNotify::Stop.
- При установке ссылочных часов диспетчер графов фильтров вызывает IDistributorNotify::SetSyncSource.
- При добавлении или удалении фильтров или изменении соединений закрепления диспетчер графа фильтров вызывает IDistributorNotify::NotifyGraphChange.
Чтобы реализовать пользовательский PID, создайте COM-объект, поддерживающий агрегирование. Он должен поддерживать интерфейс, который диспетчер графов фильтров еще не поддерживает. При необходимости он может поддерживать интерфейс IDistributorNotify .
Если PID получает какие-либо указатели интерфейса от диспетчера графов фильтров, он должен немедленно освободить их. В противном случае это может создать циклическое число ссылок, что может помешать уничтожению диспетчера графов фильтров. Хранение счетчика ссылок в диспетчере графов фильтров в любом случае не требуется, так как диспетчер графов фильтров управляет временем существования PID.
Так как PID предназначен специально для агрегирования с помощью диспетчера графов фильтров, может потребоваться применить его в методе конструктора PID. Проверьте, имеет ли внешний указатель IUnknownзначение NULL, и если да, верните код ошибки VFW_E_NEED_OWNER. (См. коды ошибок и успешного выполнения.) Кроме того, чтобы другие объекты не могли агрегировать PID, можно запросить внешний указатель IUnknown для интерфейса IGraphBuilder . Возвращает код ошибки, если объект не предоставляет IGraphBuilder.