Как правильно создать частный или незарегистрированный фильтр DirectShow (с исходным кодом)? - PullRequest
2 голосов
/ 28 октября 2011

Я создал фильтр 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 на фильтре, когда мое приложение завершает работу?

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

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

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

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

1 Ответ

1 голос
/ 28 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...