学习写DSHOW框架下的FILTER之三
时间:8:24 2011-1-7
总结与计划
8:30 --- 9:00
TRANSFORM FILTER的编写
其是使用两个特点:
1. DSHOW框架+ COM框架
DSHOW框架:其是包括FILTER与PIN
COM框架: 其主要是业务逻辑的编写.
2. 编写FILTER的两种方式
1. 继承基类( FILTER,PIN)
2. 继承source, translate , render 性质的FILTER.
[ 使用编写FILTER的业务流程来看待FILTER的编写]
[ DSHOW,FILTER的创建向导,连接向导]
其所说明的问题.
1. DSHOW其是可以流程化的. 所以我们要去掌握其的流程
1. FILTER创建流程
1. 各种FILTER其的流程,与创建方式
2. FILTER 使用流程
2. 向导,模块其的最终目标: 让用户直接地编写业务逻辑就可以了.
1. 哪些是流程
2. 哪些是业务逻辑
3. 流程与业务逻辑之间是怎么样结合的
[ FILTER 的初始业务流程]
准备:
创建一个DLL性质的工程.因为DSHOW其是管理FILTER的,以FILTER为单位的.在编写实现的时候,FILTER其是以DLL的形式实现的, 因为DSHOW其只是一个工具,其 是APP的来调用使用.其以DLL的形式加载到APP的进程空间当中.
中间:
0. 确定功能,
1.确定此FILTER的性质:( source filter, translate filter, render filter)
2.确定用户对于此FILTER的操作接口
3.对于DSHOW流程实现方式的确定: 标准的( 继承FILTER,PIN的基类),简化( 继承SOURCE, TRANSLATE,RENDER 类)
4.对于子类当中的有关方法进行重载 [ 这一点的要求很好的掌握]
重载方法当中的核心业务逻辑其是由COM类完成
实现:
在COM类当中编写业务逻辑
后期:
使用工具将此FILTER的信息注册到注册表当中.
实施:
用户的APP其通过DSHOW的FILTER GRAPHER MANAGER来管理,对于用户而言其只是知道 有这样一个功能的FILTER,与此FILTER的接口与接口的IID_IXXX,FILTER 的CLSID.
流程的优化:
准备,中间过程,其是可以自动生成的.
让FILTER的编写人员其可以直接地面向业务逻辑的编写
DSHOW其对于用户而言是使用了统一的方式.
1. 这样我们也是可以自动生成代码的.
2. PC机与WINCE上所使用的代码其是可以相同的.
1. DSHOW 创建FILTER GRAPH ,控制FILTER GRAPH
2. FILTER的编写其也是可以相同的
==>
我所希望的直接地编写业务逻辑, 或许 FILTER其的简化版本其就是这样的目标
看来关键还是一点半
一点:
核心业务逻辑的编写
半点:
流程当中的第四点, 需要花点时间
解法:
1. 对于三种FILTER的DEMO要进行分析:
1. 其是使用哪一种方式:标准还是简化( 附思考:如果是标准,那简化怎么要样写,反之)
2. 在各种方式下其重载了哪些方法
解法:
首先全局地掌握其的业务流程
然后:了解半点的知识
最后: 尽情地编写最后一点
在FILTER 编写当中,其有
SOURCE ,TRANSLATE , RENDER,
Stream
baseFilter
PIN
其各自之间的关系是什么呢
[ 分析EZRGB24 FILTER SAMPLE ]
其是包括: 简化的方式来进行的编写的.
个人觉得标准的写法只是适合初始学者, 或者说: 简化的方式其是只是合适一些特殊场合.
如:
我们使用标准的写法完成了一个FILTER, 那么其已经满足了DSHOW框架的流程,其可以变化的方面,就是业务逻辑方法.所以我们可以去继承此FILTER的COM类,然后重载其的一些业务逻辑的方式.
[ 问题]
1>ezrgb24.def : error LNK2001: 无法解析的外部符号 DllCanUnloadNow
1>ezrgb24.def : error LNK2001: 无法解析的外部符号 DllGetClassObject
其要添加:
#pragma comment( lib,"strmbase.lib")
#pragma comment( lib,"strmiids.lib")
[ FILTER当中的COM部分]
1. 创建COM对象
2. 查找接口
其是创建FILTER的载体类, COM类,查找接口( DSHOW接口,用户自定义接口)
所以其是要求重载的
[FILTER 属性包]
FILTER的属性包其也是 DSHOW框架当中一部分,其对于用户而言,其只是响应事件就可以了,
[ FILTER其必须实现的三个接口]
1.IBaseFilter
2.IMediaFilter
3.IPersist
这三个接口
[ PIN 必然实现基本接口]
IPin
IQualityControl
发送PIN其还要实现
IMediaPosition
IMediaSeeking
接收PIN其还要实现
IMemInputPin
属于SOURCE 性质的FILTE的PIN其还要实现
IAsyncReader
属于RENDER性质的FILTER的PIN其还要实现
IPinConnection
[ FILTER其必须实现的三个接口 的分析]
1.IBaseFilter
2.IMediaFilter
3.IPersist
其类其实现这三个接口其说明了什么.
我们要从DSHOW框架的设计说起.
DSHOW其是以为FILTER GRAPH来实现 多媒体文件的操作的.
操作的多媒体文件其不同的.其的FILTER GRAPH也是不同的.
但其对于 APP用户而言是一样的.如,想播放文件,其还是使用RUN, 暂停还是PAUSE, 停止STOP.
DSHOW其封装几个接口,来让方便用户操作,使用用户不会因为FILTER GRAPH不同,而发生不同的操作.
DSHOW 其对于FILTER GRAPH 管理,也是相当的方便,灵活.
针对于不同的多媒体场合其是使用不同的 FILTER GRAPH ,
也就是采用不同的策略, 想到了策略模式.
策略模式其的本质特点:
统一接口,对于接口的不同实现
如:
如人都有脑袋,但每一个人的脑袋里面所装的东西是不同的.
我们要写FILTER要想被DSHOW所认识,控制,其就必须实现 DSHOW所规定的接口.
那DSHOW其哪些接口,其为什么会有这些接口呢.
我们以播放一个视频文件为例来说明.
需要了解的知识:
1. DSHOW做任何一件其均是以FILTER GRAPH为操作对象的,而FILTER GRAPH 其是由FILTER所组合的.
2. 播放视频其本质是播放一张张图片,
3. 在播放文件的时候,我们可以暂停,停止,快进,后退.
根据 第一点所产生的需求:
创建FILTER, 得到FILTER的信息(版本),FILTER有几个PIN, 将FILTER添加到FILTER GRAPH当中.
可以归结为FILTER的基本信息管理包括:
FindPin
EnumPins
QueryFilterInfo
JionFilterGraph
==>这些信息其是放置在IBaseFilter 当中
( 而创建FILTER, 其是属于COM 框架的部分.)
==> DSHOW其使用上面的方式就可以将FILTER连接起来.
根据 第二,三点所产生的需求:
用户点击 播放,DSHOW其就要控制FILTER GRAPH 从静止到运动的状态改变.
数据其就开始在FILTER GRAPH当中开始流动了,就像打开自来水龙头一样.
我们要以流(stream)的角度来看DSHOW通过FILTER GRAPH来操作数据.
水管当中的称为水流.
FILTER GRAPH当中称为数据流( dshow当中专称为 sample)
水流的状态表现为 水龙头的状态,水龙头的打开,关闭,
同样数据流的状态也是通过FILITER的状态表示的.
FILTER其会有哪些状态呢.用户的状态操作无非是: RUN,PAUSE,STOP,所以FILTER其的状态也只有这三种,
既然有状态,就要方法来操作这些状态.
Stop
Pause
Run
GetState
SetState 等
==> 其是在IMediaFilter当中.
FILTER其是一些对象,其就涉及到对象的 序列化, 保存与创建.
此过程当中所涉及到的操作
保存对象的信息:CLSID, 这是很基本的也是很关键的.
GetClassID // 看来CLSID其只能得到,不能修改
IPersist.
其它信息: FILTER的状态,其是在其它接口当中实现
FILTER其当中数据: stream,也是要保存的.
==> FILTER的信息访问,状态控制, 保存与创建,其均是由DSHOW来管理,DSHOW然后其封装一个接口,用户通过此接口就可以很方 便地完成对于整个FILTER GRAPH的管理.
===>
小结:
FILTER其必须要实现的三个接口: IBaseFilter, IMediaFilter ,IPersist
每写一个FILTER其是必须实现的三个接口, 但MS为了方便FILTER开发,其提供了CBaseFilter ,
CBaseFilter 其实现了这三个接口,
一个问题:
用户在播放的时候,其快进了一下,其的一般逻辑:
1. FILTER PAUSE
2. FILTER GRAPH当中的数据 清空 []
3. 得到快进之处的数据
4. FILTER RUN
==> 2,3 当中的作用其不是由FILTER来管理的,而是由PIN管理,PIN其的管理对象是 STREAM. stream 与SAMPLE之间有什么关联呢.