学习写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之间有什么关联呢.

原文地址:https://www.cnblogs.com/pengxinglove/p/1931611.html