您的位置:首页 > 其它

DirectShow-Filter原理

2006-12-27 09:01 337 查看
11Filter原理——概述
Filter 是DirectShow中最基本的概念。DirectShow使用Filter Graph来管理Filter(管理者叫做Filter Graph Manager)。Filter Graph是Filter的“容器“,而Filter是Filter Graph中的最小功能模块。
Filter是一种COM组件。为了实现在Filter Graph中的统一操作,每个Filter上都至少实现了IBaseFilter接口。IBaseFilter继承自IMediaFilter。Filter Graph Manager正是通过IMediaFilter的接口方法来控制Filter Graph的状态(运行、暂停、停止)转换。
Filter的类别:
Source Filters主要负责获取数据,数据源可以是文件也可以是设备。只有输出Pin。
Transform Filters主要负责数据的格式转换,例如数据流分离/合成、编码/解码等,然后将数据继续往下传输。既有输入Pin又有输出Pin。
Rendering Filters主要负责数据的最终去向,送达设备或文件。只有输出Pin。

12Filter原理——注册
实现Filter的文件一般是一个DLL,扩展名可以是.dll,但更多的时候是.ax。一般一个Filter项目都会包含一个.def文件,用于定义4个导出函数。
既然Filter是一种COM组件,使用前就必须先注册。Filter的注册信息一般包括两部分:基本的COM信息和Filter特有信息。在.def文件定义的4个导出函数:DllGetClassObject在创建Filter对象的时候被调用,根据CLSID返回对应的类工厂对象;DllCanUnloadNow用于判断是否可以从内存中卸载Filter DLL,即DLL中实现的所有COM对象是否都已经释放;DllRegisterServer和DllUnregisterServer调用AMovieDllRegisterServer2函数完成COM组件的自注册功能。

13Filter原理——连接
Filter一般由一个或多个Pin组成,Filter之间通过Pin相互连接,构成一条顺序的链路。
Filter的连接实际上也是Filter上Pin的连接,Pin的连接实际上是连接双方使用的媒体类型的一个“协商”过程。试图连接的两个Filter必须处在同一个Filter Graph中,可以调用接口方法IFilterGraph::AddFilter将指定的Filter加入到Filter Graph。
整个连接过程的步骤大致如下:
A、Filter Graph Manager在输出Pin上调用IPin::Connect;
B、如果输出Pin接受连接,则调用输入Pin上的IPin::ReceiveConnection;
C、如果输入Pin也接受这次连接,则双方连接成功。

14Filter原理——动态重建技术
由于一些原因,我们需要对已有的Filter Graph进行修改。通常的做法是,先将Filter Graph停止,进行修改之后,在重新启动。另外还能够在保持Filter Graph运行状态的同时实现动态重建。Filter Graph的重建包括如下几种情形:
A、仅仅改变Filter之间连接的媒体类型;
B、增加或删除Filter,重新进行相关Filter之间的连接;
C、对一条Filter链路(Filter Chain)进行操作。

15Filter原理——数据传送
每个Pin上都实现了IPin接口,这个接口主要用于Pin的连接,而不是数据传送。真正用于数据传送的一般是输入Pin上实现的IMemInputPin接口和输出Pin上实现的IAsyncReader接口。Filter之间的成功连接为数据传送做好了准备。Filter之间是以Sample的形式传送数据的,Sample是一个封装了一定大小数据内存的COM组件。Samplle是由分配器(Allicator,也是一个COM组件)来管理的。连接双方的Pin必须使用同一个分配器,但是这个分配器到底由哪个Pin来创建也需要协商。
数据传送主要有两种模式:推模式(Push Model)和拉模式(Pull Model)。
DirectShow总是使用专门的线程来传送数据。所以,DirectShow应用程序至少包含两条线程,一条应用程序主线程以及至少一条数据传送子线程。

16Filter原理——状态转换
Filter有3种状态:停止(Stopped)、暂停(Paused)和运行(Running)。其中,暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。作为一种中间状态,暂停也是停止与运行之间切换所必经的一种状态。

17Filter原理——媒体定位的实现
应用程序可以通过Filter Graph Manager上获得的IMediaSeeking接口,实现对流媒体的随机定位(Seeking)和调整媒体文件的回放速率。实际上,IMediaSeeking接口的真正实现在Filter上。
用于媒体定位的还有另外一个接口IMediaPosition,这是一个支持自动化(Automation)的接口,是为那些弱类型编程语言(如VB)开发DirectShow应用程序而设计的。对于Filter开发人员来说,并不要求实现IMediaPosition。Filter Graph Manager会自动将IMediaPosition的接口方法调用转换为IMediaSeeking的接口方法调用。

18Filter原理——质量控制的实现
数据线程是通过一种“压迫式”方式往下传送数据的。虽然Video Renderer接收到Sample后,会根据Sample上的时间戳来正确安排显示时机,但仅仅这样是不够的,它并不能改善Filter Graph运行时的性能。因此,DirectShow另外设计了一种“自适应”的反馈机制:质量控制(Quality Control)。质量控制通过IQualityControl接口来实现。具体质量控制策略的实现取决于具体的Filter实现,可能调整发送速度,也可能是丢失部分数据。

19Filter原理——音视频同步解决方案
在任何系统设计中,最关键的都是系统框架以及控制部分。DirectShow也不例外,这个重要的部分就是Filter Graph Manager,它向下直接控制Filter Graph中的所有Filter,向上对应用程序提供编程接口。可惜的是,微软公司并没有提供这些功能控制的源代码。
DirectShow的音视频同步解决方案就是为Filter Graph选择一个公共的参考时钟(Reference Clock),并且要求传送到Renderer Filter的每个Sample都打上时间戳(Time Stamp);Video Renderer或Audio Renderer根据Sample的时间戳以及参考时钟当前的参考时间,来正确安排Sample的播放时机。

20Filter原理——对硬件的支持
为了提高系统的稳定性,Windows对硬件操作进行了隔离,应用程序一般不能直接访问硬件。DirectShowFilter工作在用户模式下,而硬件工作在内核模式下,它们之间如何协同工作呢?DirectShow的解决方案是为这些硬件提供包装(Wrapper)Filter,这种Filter能够工作在用户模式下,其外观和控制方法与普通Filter一样,而包装Filter在内部完成与硬件功能的交互。

21Filter原理——VMR-9的发布
VMR(Video Mixing Renderer)是DirectShow的新一代Video Renderer。VMR有两个版本:VMR-7和VMR-9。前者采用了DirectDraw 7技术,仅仅在Windows XP操作系统下可以获得,并且是XP上默认的用于视频显示的Renderer(代替传统的Video Renderer);后者采用了Direct3D 9的技术,是随DirectX9.0一起发布的,但任何时候都不是默认的Renderer。
安装了DirectX9.0以后,就有4个Video Renderer可供选择使用:传统的Video Renderer、Overlay Mixer、VMR-7和CMR-9。
VMR主要利用了显卡专有的图形处理能力(VMR做视频的合成和显示时并不占用系统的CPU资源),它能够表现的性能对于硬件的依赖性很高。

22Filter原理——Filter Graph的构建方法
(1)IFilterGraph::AddFilter:该参数提供一个Filter对象,将其加入到Filter Graph中。
(2)IFilterGraph::ConnectDirect:该参数提供输出Pin、输入Pin以及媒体类型,进行直接的连接。
(3)IGraphBuilder::AddSourceFilter:该参数提供源文件名,自动将一个Source Filter加载到Filter Graph中。
(4)IGraphBuilder::Connect:该参数提供输出Pin和输入Pin进行连接,如果连接失败,自动尝试在中间插入必要的格式转换Filter。
(5)IGraphBuilder::Render:该参数提供输出Pin,自动加入必要的Filter完成剩下部分Filter Graph的构建(直到连接到Rendering Filter)。
(6)IGraphBuilder::RnderFile:该参数提供源文件名,自动加入必要的Filter完成这个文件的回放Filter Graph的构建。
Filter通过Pin这样的连接,就能“串联”起来,从而构建完整的Filter Graph。后四种构建方法都有“自动”的功能,这种机制称为智能连接(Intelligent Connect)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: