`
jgsj
  • 浏览: 960628 次
文章分类
社区版块
存档分类
最新评论

DirectShow 视频捕获(4) 过滤器连接过程概述

 
阅读更多

Overview of the Filter Connection Process

原文地址:http://msdn.microsoft.com/en-us/library/ms899482.aspx

在两个过滤器连接之前,他们必须增加到过滤器图表中。当使用智能连接(例如,调用IMediaControl::RenderFile)的方式创建一个过滤器图表,过滤器图表管理器基于通过render传入文件了的媒体类型增加相应过滤器到图表中。Graph Builder对象通过预先选择的过滤器种类创建特定的图标。应用程序也可以通过指导过滤器图标管理器增加特定的过滤器来手动创建图标。在任何一种情况下,过滤器都是通过IFilterGraph::AddFilter方法增加的,并且通过调用IBaseFilter::JoinFilterGraph方法通知一个过滤器已经增加到图表中。增加的过滤器后面就可以连接到上游或者下游的过滤器。为了开始连接过程,过滤器图表管理器对每一个要连接的过滤器要求枚举自己的引脚,通过调用IPin::Connect方法请求一个输出引脚连接到输入引脚。所有的细节都由两个引脚在连接的范围内协商。

就两个过滤器已经连接的意思是它们就它们交互数据的媒体类型共享数据的大小和位置达成一致。连接的类型和传输的类型紧密相关。传输类型有好几种,这决定于数据是以”推”还是“拉”的形式传输,或者数据的缓冲区在主存还是在硬件设备上。

连接/传输类型有一个IMemInputPin连接,这连接的缓冲区在主存中,并且数据是从上游的引脚以“推”的方式传输的。基类能够处理很多这样连接机制。然而,当自己写一个过滤器时理解连接的过程非常重要,以便你可以确定哪些方法需要重写和滤器能够实现什么。在两个连接的过滤器准备传输媒体数据之前,必须按顺序实现下面的连接和协商过程。

1. 初始化连接引脚

2. 输出引脚的一个过滤器需要获取已连接的输入引脚的接口

3. 两个引脚协商一个共同的媒体类型

4. 两个引脚协商一个适合的传输来传递媒体。

第一步,Filter Graph Manger 通知上游过滤器的输出引脚去连接指定的下游过滤器的输入引脚。这样就相互交换IPin接口指针。过滤器就不能再次连接其他过滤器了。Filter Graph Manger 必须一致是它们的代理,开始一个连接,否则就肯能会产生死锁。一个过滤器或者应用程序可以指导Filter Graph Manger去连接两个引脚,或者当通过使用IGraphBuilder::Render或者IGraphBuilder::RenderFile方法去渲染一个过滤器时决定去连接过滤器。

第二步,输出引脚可能从输入引脚请求IMemInputPin接口。这为第四步做准备,那步输出引脚会使用IMemInputPin从输入引脚获取一个内存分频器。如果输出引脚已经有一个内存分配器(或者一起其他的传输在硬件过滤器),将会跳过这步,或者在专有的设计中请求其他一些接口。

第三步,尝试媒体类型,直到找到一个两个引脚都适合或者全部尝试完(这导致连接失败)。首先,输出引脚向输入引脚建议它自己支持的媒体类型。如果没有一个媒体类型适合输出引脚,输出引脚就建议自己的类型。

第四步,输入引脚向输入引脚所要内存分配器对象的接口。在基类中,这些对象继承于CBaseAllocator和CMemAllocator.。这些对象创建媒体采样和它们关联的两个引脚都可以访问的用来传输多媒体数据的数据缓冲区。如果输出引脚不能访问输入引脚的分配器(由下面讨论的原因),它会建议使用自己的分配器。无论哪种情况都需要告诉输入引脚选择的方式。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics