Как правильно создать частный или незарегистрированный фильтр DirectShow (с исходным кодом)?

Я создал push-фильтр с использованием Delphi 6 Pro и библиотеки компонентов DSPACK DirectShow. Я хочу использовать фильтр в частном порядке, поэтому я не буду создавать AX-файл для DLL. Вместо этого я хочу создать фильтр напрямую. Я нашел несколько потоков по этому вопросу, но ни один из них не показывает, как создать частный фильтр с учетом конструктора фильтра:

constructor Create(ObjName: string; Unk: IUnKnown; out hr: HRESULT);
constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override;

Вот некоторые темы, которые я нашел на тему незарегистрированных или частных фильтров DirectShow:

http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm

http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54

Как я могу напрямую встроить фильтр DirectShow Push Source в EXE?

Исходный код фильтра был непосредственно добавлен в мой проект Delphi. Но я не знаю, какой конструктор мне следует использовать при создании фильтра непосредственно из моего основного приложения, и что передать параметрам конструктора. Может кто-нибудь сказать мне, что они должны быть?

Кроме того, мне нужно увеличить счетчик ссылок объекта Filter, как первый поток говорит, что делать выше, а затем вызвать Release() для него позже, когда мое приложение завершается? Если так, каков наилучший способ сделать это? Или я могу просто позвонить в Free on the Filter, когда мое приложение завершит работу?

Наконец, нужно ли мне вызывать CoInitialized() и CoUninitialize() перед использованием моего частного фильтра?

ОБНОВЛЕНИЕ: отслеживая классы и цепочку конструктора иерархии классов для TBCSource, базового класса для производных фильтров DSPACK, выясняется, что параметр ObjName является именем фильтра, а параметр Unk является объектом, которому принадлежит фильтр. Мое текущее предположение состоит в том, что правильный способ создания фильтра непосредственно из источника был бы, учитывая производный класс TBCSource с именем TPushSourceFilter, которому произвольно дают имя фильтра "My Push Source Filter", например, для целей:

TPushSourceFilter.Create('My Push Source Filter', nil, hr);

Первый параметр конструктора - это имя фильтра, которое используется для регистрации фильтра, то есть того, которое вы видите при просмотре фильтров DirectShow в таком инструменте, как GraphEdt. Я считаю, что вторым параметром должен быть NIL, поскольку он разрешается в поле данных владельца (FOwner) в классе предков с именем TBCUnknown. Его единственная цель - перенаправить любые вызовы QueryInterface(), обрабатываемые базовым классом, на объект- владелец, если он не является NIL, вместо того, чтобы применять запрос непосредственно к объекту Filter в случае делегированной ситуации. Я продолжу этот метод строительства и посмотрю, работает ли он.

1 ответ

Все, что вам нужно, это экземпляр объекта TPushSourceFilter.Create и получить IBaseFilter Интерфейс из этого экземпляра. Оттуда вы добавляете его на график точно так же, как вы делаете это с фильтрами, созданными CoCreateInstance, затем подключите контакты и т. д.

Другие вопросы по тегам