- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
过程。连接总是输出Pin指向输入Pin的。
对于Filter的把握,一般认为要掌握以下三方面的内容:Filter 之间Pin 的连接、Filter
之间的数据传输以及流媒体的随机访问(或者说流的定位)。下面就开始分别进行阐述。
所谓的Filter Pin 之间的连接,实际上是Pin 之间MediaType(媒体类型)的一个协商
过程。连接总是从输出Pin指向输入Pin的。
要想深入了解具体的连接过程,就必须认真研读 SDK 的基类源代码(位于
BaseClasses\amfilter.cpp,类CBasePin的Connect方法)。
连接的大致过程为,枚举欲连接的输入Pin上所有的媒体类型,逐一用这些媒体类型与
输出Pin进行连接,如果输出Pin也接受这种媒体类型,则Pin之间的连接宣告成功;如果
所有输入Pin上枚举的媒体类型输出Pin都不支持,则枚举输出Pin上的所有媒体类型,并
逐一用这些媒体类型与输入Pin 进行连接。如果输入Pin 接受其中的一种媒体类型,则Pin
之间的连接到此也宣告成功;如果输出Pin上的所有媒体类型,输入Pin都不支持,则这两
个Pin之间的连接过程宣告失败。
有一点需要注意的是,上述的输入Pin 与输出Pin 一般不属于同一个Filter,典型的是
上一级Filter(也叫UpstreamFilter)的输出Pin连向下一级Filter(也叫DownstreamFilter)
的输入Pin。
当Filter的Pin之间连接完成,也就是说,连接双方通过协商取得了一种大家都支持的
媒体类型之后,即开始为数据传输做准备。这些准备工作中,最重要的是Pin上的内存分配
器的协商,一般也是由输出Pin发起。在DirectShowFilter之间,数据是通过一个一个数据
包传送的,这个数据包叫做Sample。Sample本身是一个COM 对象,拥有一段内存用以装
载数据,Sample就由内存分配器(Allocator)来统一管理。已成功连接的一对输出、输入Pin
使用同一个内存分配器,所以数据从输出Pin传送到输入Pin上是无需内存拷贝的。而典型
的数据拷贝,一般发生在Filter内部,从Filter的输入Pin 上读取数据后,进行一定意图的
处理,然后在Filter的输出Pin上填充数据,然后继续往下传输。
下面,我们就具体阐述一下Filter之间的数据传送。
首先,大家要区分一下Filter的两种主要的数据传输模式:推模式(PushModel)和拉
模式(PullModel)。
所谓推模式,即源Filter(SourceFilter)自己能够产生数据,并且一般在它的输出Pin
上有独立的子线程负责将数据发送出去,常见的情况如代表WDM 模型的采集卡的Live
SourceFilter;
所谓拉模式,即源Filter不具有把自己的数据送出去的能力,这种情况下,一般源Filter
后紧跟着接一个ParserFilter或SplitterFilter,这种Filter一般在输入Pin上有个独立的子线
程,负责不断地从源Filter索取数据,然后经过处理后将数据传送下去,常见的情况如文件
源。推模式下,源Filter是主动的;拉模式下,源Filter是被动的。而事实上,如果将上图
拉模式中的源Filter和SplitterFilter看成另一个虚拟的源Filter,则后面的Filter之间的数据
传输也与推模式完全相同。
数据到底是怎么通过连接着的Pin传输的呢?
首先来看推模式。在源Filter后面的Filter输入Pin上,一定实现了一个IMemInputPin
接口,数据正是通过上一级Filter调用这个接口的Receive方法进行传输的。值得注意的是
(上面已经提到过),数据从输出Pin通过Receive方法调用传输到输入Pin上,并没有进行
内存拷贝,它只是一个相当于数据到达的“通知”。
再看一下拉模式。拉模式下的源Filter的输出Pin上,一定实现了一个IAsyncReader接
口;其后面的SplitterFilter,就是通过调用这个接口的Request方法或者SyncRead方法来获
得数据。SplitterFilter然后像推模式一样,调用下一级Filter输入Pin上的IMemInputPin接
口Receive方法实现数据的往下传送。
研读SDK的基类源代码(BaseClasses\source.cpp和pullpin.cpp)。
下面,我们来讲一下流的定位(MediaSeeking)。在 GraphEdit中,当我们
您可能关注的文档
- 编号SSHPB201506-0105.doc
- 翻转课堂在免疫教学中的探索与实践.PDF
- 股份公司本部办楼无线网络建设项目询.PDF
- 股价走势与基本日趋背离,整个板块已到建仓时.PDF
- 背光及照明用LD驱动IC技术市场分析.PDF
- 背包问题九讲20alpha1.PDF
- 背景-新通用顶域名(gTLD)计划.PDF
- 背景介绍BacgroundIntroduction.PDF
- 背景设计解缘家文章梳理语文老师.doc
- 背负高位扩张压,复苏之路曲折艰辛.PDF
- 北师大版小学数学三年级上册《寄书》教学设计.docx
- 统编版(部编版)语文二年级上册《雪孩子》教学设计.docx
- 统编版(部编版)语文二年级上册《八角楼上》教学设计.docx
- 北师大版小学数学三年级上册《长方形周长》教学设计.docx
- 北师大版小学数学三年级上册《丰收了》教学设计.docx
- 统编版(部编版)语文二年级上册《夜宿山寺》教学设计.docx
- 统编版(部编版)语文二年级上册《风娃娃》教学设计.docx
- 统编版(部编版)语文二年级上册《朱德的扁担》教学设计.docx
- 统编版(部编版)语文二年级上册《难忘的泼水节》教学设计.docx
- 统编版(部编版)语文二年级上册《纸船和风筝》教学设计.docx
文档评论(0)