没有合适的资源?快使用搜索试试~ 我知道了~
深入浅出Directshow Filter培训资料.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 57 浏览量
2023-04-28
12:57:26
上传
评论
收藏 2.11MB PDF 举报
温馨提示
试读
48页
深入浅出Directshow Filter培训资料.pdf
资源推荐
资源详情
资源评论
D i
深 入 浅
e c t s h o w F i t e
出
r l r
精品资料
深入浅出 DirectShow Filter
Filter 概述
Filter 是一个 COM 组件,由一个或多个 Pin 组成。Pin 也是一个 COM 组
件。Filter 文件的扩展名为.ax,但也可以是.dll。Filter 根据其包含 Input pin 或
Output pin 的情况(或在 Filter Graph 的位置),大致可分为三类:Source
Filter(仅有 Output pin)、Transform Filter(同时具有 Input pin 和 Output pin)和
Renderer Filter(仅有 Input pin)。
一般情况下,创建 Filter 使用一个普通的 Win32 DLL 项目。而且,一般
Filter 项目不使用 MFC。这时,应用程序通过 CoCreateInstance 函数 Filter 实
例;Filter 与应用程序在二进制级别的协作。另外一种方法,也可以在 MFC 的
应用程序项目中创建 Filter。这种情况下,Filter 不需注册为 COM 组件,Filter
与应用程序之间的协作是源代码级别的;创建 Filter 实例,不再使用
CoCreateInstance 函数,而是直接 new 出一个 Filter 对象,如下:
m_pFilterObject = new CFilterClass();
// make the initial refcount 1 to match COM creation
m_pFilterObject ->AddRef();
因为 Filter 的基类实现了对象的引用计数,所以即使在第二种情况下,对
创建后的 Filter 对象的操作也完全可以遵循 COM 标准。
Filter 是一个独立功能模块,最好不要将 Filter 依赖于其他第三方的 DLL。
因为 Filter 具有 COM 的位置透明性特点,Filter 文件可以放在硬盘的任何位
置,只要位置移动后重新注册。但此时,如果 Filter 依赖其他 DLL,则 Filter 对
该 DLL 的定位就会出现问题。
仅供学习与交流,如有侵权请联系网站删除 谢谢
2
精品资料
Filter 不能脱离 Filter Graph 单独使用。所以,如果你想绕过 Filter Graph 直
接使用 Filter 实现的模块功能,请将你的 Filter 移植成 DMO(DirectX Media
Object)。
2. Filter 的注册
Filter 是 COM 组件,所以在使用前一定要注册。Filter 的注册程序为
regsvr32.exe。如果带上命令行参数/u,表示注销;如果带上是/s,表示不弹出任
何注册/注销成功与否的提示对话框。如果你想在 Build Filter 项目的时候进行自
动注册,请在 VC 的 Project settings 的 Custom Build 页如下设置:
Description: Register filter
Commands: regsvr32 /s /c $(TargetPath)
echo regsvr32 exe.time > $(TargetDir)\$(TargetName).trg
Outputs: $(TargetDir)\$(TargetName).trg
Filter 的注册信息包括两部分:基本的 COM 信息和 Filter 信息。注册信息
都存放在注册表中。前者的位置为:HKEY_CLASSES_ROOT\CLSID\Filter
Clsid\,后者的位置为:HKEY_CLASSES_ROOT\CLSID\Category\Instance\ Filter
Clsid\。COM 信息标示了 Filter 是一个标准的可以通过 CoCreateInstance 函数创
建的 COM 组件,Filter 信息标示了我们通过 Graphedit 看到的描述这个 Filter 的
信息。如果你不想让 Graphedit 看到(或者让 Filter 枚举器找到)你写的 Filter,
你完全可以不注册 Filter 信息。而且不用担心,你这么做也完全不会影响 Filter
的功能。
屏蔽注册 Filter 信息的方法也很简单。因为 CBaseFilter 实现了
IAMovieSetup 接口的两个函数:Register 和 Unregister。我们只需重载这两个函
数,直接 return S_OK 就行了。(注意:IAMovieSetup 是用以注册 Filter 信息部
仅供学习与交流,如有侵权请联系网站删除 谢谢
3
精品资料
分的接口,但已经废弃,仅在 AMovieDllRegisterServer 和
AMovieDllUnregisterServer 调用才会用到。新写的 Filter 注册函数一般使用
AMovieDllRegisterServer2,这个函数不使用 IAMovieSetup 接口。如果想要不注
册 Filter 信息,最好自己实现 Filter 的两个导出函数:DllRegisterServer 和
DllUnregisterServer,其中只使用 RegisterAllServers 函数注册 Ole Server。)
Filter 的 Merit 值。这个值是微软的“智能连接”函数使用的。在 Graphedit
中,当我们加入一个 Source Filter 后,在它的 pin 上执行“Render”,会自动连上
一些 Filter。Merit 的值参考如下:
MERIT_PREFERRED = 0x800000,
MERIT_NORMAL = 0x600000,
MERIT_UNLIKELY = 0x400000,
MERIT_DO_NOT_USE = 0x200000,
MERIT_SW_COMPRESSOR = 0x100000,
MERIT_HW_COMPRESSOR = 0x100050
Merit 值只有大于 MERIT_DO_NOT_USE 的时候才有可能被“智能连接”使
用;Merit 的值越大,这个 Filter 的机会就越大。
3. Filter 之间 Pin 的连接过程
Filter 只有加入到 Filter Graph 中并且和其它 Filter 连接成完整的链路后,才
会发挥作用。Filter 之间的连接(也就是 Pin 之间的连接),实际上是连接双方
的一个 Media type 的协商过程。连接的方向总是从 Output pin 指向 Input pin。
连接的大致过程为:如果调用连接函数时已经指定了完整的 Media type,则用
这个 Media type 进行连接,成功与否都结束连接过程;如果没有指定或不完全
指定了 Media type,则进入下面的枚举过程。枚举欲连接的 Input pin 上所有的
Media type,逐一用这些 Media type 与 Output pin 进行连接(如果连接函数提供
仅供学习与交流,如有侵权请联系网站删除 谢谢
4
精品资料
了不完全 Media type,则要先将每个枚举出来的 Media type 与它进行匹配检
查),如果 Output pin 也接受这种 Media type,则 Pin 之间的连接宣告成功;如
果所有 Input pin 上枚举的 Media type,Output pin 都不支持,则枚举 Output pin
上的所有 Media type,并逐一用这些 Media type 与 Input pin 进行连接。如果
Input pin 接受其中的一种 Media type,则 Pin 之间的连接到此也宣告成功;如果
Output pin 上的所有 Media type,Input pin 都不支持,则这两个 Pin 之间的连接
过程宣告失败。
每个 Pin 都可以实现 GetMediaType 函数来提供该 Pin 上支持的所有
Preferred Media type(但一般只在 Output pin 上实现,Input pin 主要实现
CheckMediaType 看是否支持当前提供的 Media type 就行了)。连接过程中,
Pin 上枚举得到的所有 Media type 就是这里提供的。
在 CBasePin 类中有一个 protected 的成员变量 m_bTryMyTypesFirst,默认
值为 false。在我们定制 Filter 的 Output pin 中改变这个变量的值为 true,可以定
制我们自己的连接过程(先枚举 Output pin 上的 Media type)。
当 Pin 之间的连接成功后,各自的 pin 上都会调用 CompleteConnect 函数。
我们可以在这里取得一些连接上的 Media type 的信息,以及进行一些计算等。
在 Output pin 的 CompleteConnect 实现中,还有一个重要的任务,就是协商
Filter Graph 运行起来后 Sample 传输使用的内存配置情况。这同样是一个交互过
程:首先要询问一下 Input pin 上的配置要求,如果 Input pin 提供内存管理器
(Allocator),则优先使用 Input pin 上的内存管理器;否则,使用 Output pin
自己生成的内存管理器。我们一般都要实现 DecideBufferSize 来决定存放
仅供学习与交流,如有侵权请联系网站删除 谢谢
5
剩余47页未读,继续阅读
资源评论
hhappy0123456789
- 粉丝: 61
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功