开发Filter的一般过程以及Filter Graph的构建

来源:百度文库 编辑:神马文学网 时间:2024/04/27 20:32:17
开发Filter的一般过程如下:
(一)首先选择一个正确的父类
对开发一个H.263编码器来说,主要的工作是设计一个Transform Filter,所以Filter类要继承自CSource类,输入Pin要继承自CBaseInputPin类,输出Pin要继承自CSourceStream类。
(二)具体的程序设计工作
1,注册Filter
首先,运行GuidGen.exe生成该Filter的GUID,定义二个导出函数DllRegisterServer和DllUnregisterServer,并注意将输出文件名改为.ax.
设置AMOVIESETUP_MEDIATYPE(媒体类型),AMOVIESETUP_PIN(输入输出Pin的数目), AMOVIESETUP_FILTER(Filter的注册信息)这些数据。实现CreateInstance函数以创建Filter对象(用CFactoryTemplate函数实现),实现NonDelegatingQueryInterface来暴露Filter支持的接口。
2, 类型检查
在输入,输出Pin上重写CheckMedia, GetMediaType函数。
输出Pin上调用IPin::Connect,然后输出Pin上调用IPin::ReceiveConnection函数。
3,内存分配
在输入Pin上重写Receive函数(推模式),并重写IPin接口上的EndOfStream,(表示没有数据到达)BeginFlush和EndFlush这些函数。在输出Pin上重写DecideBufferSize和FillBuffer函数。
4,根据特殊的要求,可以加进Notify函数进行质量控制,或是自定义接口等。
 
FilterGraph的创建过程:
1,先写一个控制类。在控制类中用CoCreateInstance创建一个Filter Graph Manager组件
2,创建一条完整的Filter链路。根据Filter的CLSID,使用AddFilter函数将该Filter加入到Filter Graph中;再通过枚举的方法取得Filter上未连接的Pin;利用ConnectDirect函数将上一级的Filter的输出Pin连接到下一级输入Pin上
3,利用Disconnect函数将连接的两个Pin断开;利用RemoveFilter将Filter从Filter Graph中除去