我的第一个Filter -- Text Overlay

    指南中使用的是 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

 

<2> 入口函数 (可以放在任意的cpp中,比如 dllmain.cpp)
//
// DllEntryPoint
//
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  dwReason, 
                      LPVOID lpReserved)
{
return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}
<3>Filter 注册信息
<a> // {63B7E7F0-9CC7-4b81-A794-007290AD12DB} 可以放入 Guids.h中, 放入接口、组件标识
DEFINE_GUID(CLSID_TextOverlayFilter,
0x63b7e7f0, 0x9cc7, 0x4b81, 0xa7, 0x94, 0x0, 0x72, 0x90, 0xad, 0x12, 0xdb);
<b> 填好用于初始化Filter 的 CFactoryTemplate。 这里为类厂指定了 FilterName, CreateInstance以及 Pin 之类的初始化信息。
        <c> 定义两个导出函数 DllRegisterServer 和 DllUnregisterServer。
<4> 编译后自动注册

        在PostBuild中写入 regsvr32 /s $(SolutionDir)$(ConfigurationName)/TextOverlayFilter.dll

代码编写部分

<5> 框架函数的实现

  • CreateInstance :创建Filter对象实例,在gTemplates 中设定,被DirectShow 类厂调用。
  • CheckInputType:完成输入Pin上的媒体类型检查。
  • Transform:调用控制类,完成字符叠加函数的调用。
  • NonDelegatingQueryInterface :暴露出 Filter 所支持的接口。
  • CompleteConnect:在输入Pin成功连接后取得媒体类型描述。《指南》代码在这里将 输入数据的格式设置给了应用逻辑控制对象。
  • StartStreaming,StopStreaming函数,可以分别调用应用逻辑控制对象的相应函数,进行初始化和反初始化。

<6> Filter属性页

Filter 的属性页就是无法显示,寻找原因中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值