过程。连接总是输出Pin指向输入Pin的。.PDF

过程。连接总是输出Pin指向输入Pin的。.PDF

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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中,当我们

文档评论(0)

jyf123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6153235235000003

1亿VIP精品文档

相关文档