指南中使用的是 CTransInPlaceFilter 作为这个Filter的基类(一般情况接收并处理数据,我们选择CTransformFilter,但是这里可以“就地”处理数据,所以我们选择了继承自他的CTransInPlaceFilter),其输入输出Pin上一般使用相同的媒体进行连接,并尽量使用同一个Sample管理器,从而避免了内部从输入Pin到输出Pin的一次内存拷贝。(但如果两端就修改Sample无法达成一致时,Input Pin 和 Output Pin 只有使用各自的Sample)
CTransInPlaceFilter 与CTransformFilter 类似,都不需要重写输入输出Pin,他将Pin上必须实现的函数都“委托”到了Filter上,但如果我们要重写,则同时还需要重写GetPin函数。
CTransInPlaceFilter 类最少需要重写以下两个函数。
(1) CTransformFilter::CheckInputType
(2) CTransInPlaceFilter::Transform
项目配置
- 引用头文件目录 :"$(FrameworkSDKDir)/Samples/Multimedia/DirectShow/BaseClasses"
- Preprocessor definition : WIN32;_DEBUG;_WINDOWS;_USRDLL;TEXTOVERLAYFILTER_EXPORTS
- Runtime Library : Multi-threaded Debug (/MTd)
- Additional Lib Directories : "$(FrameworkSDKDir)Samples/Multimedia/DirectShow/BaseClasses/Debug"
- Dependency : Strmbasd.lib Msvcrtd.lib Winmm.lib
- EntryPoint DllEntryPoint@12
首先 需要处理的是def 和 定义 DLL的入口函数.
<1> XXXX.def:
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
在PostBuild中写入 regsvr32 /s $(SolutionDir)$(ConfigurationName)/TextOverlayFilter.dll
代码编写部分
<5> 框架函数的实现
- CreateInstance :创建Filter对象实例,在gTemplates 中设定,被DirectShow 类厂调用。
- CheckInputType:完成输入Pin上的媒体类型检查。
- Transform:调用控制类,完成字符叠加函数的调用。
- NonDelegatingQueryInterface :暴露出 Filter 所支持的接口。
- CompleteConnect:在输入Pin成功连接后取得媒体类型描述。《指南》代码在这里将 输入数据的格式设置给了应用逻辑控制对象。
- StartStreaming,StopStreaming函数,可以分别调用应用逻辑控制对象的相应函数,进行初始化和反初始化。
<6> Filter属性页
Filter 的属性页就是无法显示,寻找原因中。