1. 创建filter,可以从ms提供的filter类库中继承,filter类库中的基类为CBaseFilter。
2. 创建pin,可以继承,基类为CBasePin,也可以从CBasePin的子类继承。
3. 连接pin,如果想让两个pin可以连接,那么就要符合一定的规范,主要有3个:
a) 传输机制要相同,可以为“推”模式的,也可以为“拉”模式的,但outpin和inpin的模式要一样。
b) 媒体类型要相同。
c) 分配器,Sample缓存的分配约定,要约定好哪个pin提供分配器,分配的缓存的大小、数量以及其他的属性。
4. 传输和处理数据
5. 支持com
使filter自动注册
列出filter的key
a) 注册com服务:
HKEY_CLASSES_ROOT
CLSID
Filter CLSID
REG_SZ: (Default) = Friendly name
InprocServer32
REG_SZ: (Default) = File name of the DLL
REG_SZ: ThreadingModel = Both
b)
注册filter目录
HKEY_CLASSES_ROOT
CLSID
Category
Instance
Filter CLSID
REG_SZ: CLSID = Filter CLSID
REG_BINARY: FilterData = Filter information
REG_SZ: FriendlyName = Friendly name
1.声明filter信息
Structure
|
Description
|
Describes a filter.
| |
Describes a pin.
| |
Describes a media type.
|
AMOVIESETUP_FILTER中包含有一个AMOVIESETUP_PIN数组指针,每个AMOVIESETUP_PIN中又包含一个AMOVIESETUP_MEDIATYPE数组指针。
可以使用IFilterMapper2接口定位一个filter。
2.声明Factory Template
在dll中声明一个CFactoryTemplate对象的全局数组,其中的每个对象对应一个filter或者一个com组件,这个数组的名字必须是g_Templates。
3.实现DllRegisterServer
包含com组件的dll必须包含这个函数,这个函数在filter被注册的时候调用。这是这个函数的一个最小实现:
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
AMovieDllRegisterServer2()函数为g_Templates数组中的每个组件创建注册入口。
4.注销filter
在DllUnregisterServer()函数中实现filter的注销,在此函数中调用AMovieDllRegisterServer2()函数并传传入FALSE参数就可以了。