DirectShow学习指南之Filter的连接

文章作者 100test 发表时间 2007:10:10 12:27:56
来源 100Test.Com百考试题网


Pin的连接

  应用程序通过调用filter 图表管理器的方法来连接filter,并不是来调用filter或者pin本身的函数。应用程序可以调用IFilterGraph::ConnectDirect or IGraphBuilder::Connect来指定不同的filter直接连接,也可以通过IGraphBuilder::RenderFile间接连接。

  只有两个filter都在graph里,连接才能成功。应用程序可以通过IFilterGraph::AddFilter将filter 添加graph中,当一个filter被添加到graph中时,filter图表管理器通过IBaseFilter::JoinFilterGraph来通知filter。

  Pin连接的大致过程如下:

  1、图表管理器首先调用输出pin上的IPin::Connect,然后传递一个指针给输入pin。

  2、如果输出pin接受连接的邀请,它就调用输入pin上的IPin::ReceiveConnection。

  3、如果输入pin也接受连接邀请,那么连接成功,pin之间的连接ok。

  当filter处于活动状态的时候,许多pin可以断开连接和重新连接。这种类型的连接称为动态连接。当然,大多数的filter并不支持动态连接。

  Filter通常采用从上游到下游的连接顺序。也就是说filter上的输入pin总是比输出pin先连接。Filter应该支持这种连接顺序。然而有许多filter支持相反的连接顺序,输出pin先连接,输入pin后连接。例如:在连接MUX filter的输入pin之前一定要将MUX filter的输出pin和writer filter连接起来。

  当pin的Connect or ReceiveConnection方法被调用的时候,pin必须检查一下自己是否支持这个连接。通常要进行下列检查:

  1、检查媒体类型是否匹配。

  2、就内存的分配达成一致。

  3、请求其他pin的其他接口。

  媒体类型匹配

  当一个filter 图表管理器调用IPin::Connect方法时,可能有下面的几种媒体类型。

  1、完整类型

  如果媒体类型每一个部分都定义的很完成,那么pin就严格按照定义的类型类型进行连接。如果不匹配,连接失败。

  2、部分媒体类型

  如果媒体类型的机构中,major type, subtype, or format type的值为GUID_NULL,这个值是一个通配符号。任何类型都可以匹配。

  3、没有媒体类型

  如果filter图表管理器传递过来一个NULL的指针,这个pin就可以和任意的类型的媒体类型匹配。

  一般在连接过程中,都有一个完整的媒体类型。图表管理器传递媒体类型的目的是为了限制连接类型。

  一般来说,都是输出pin通过调用输入pin IPin::ReceiveConnection提供一个媒体类型。输入pin可以拒绝也可以接受这个媒体类型。这个过程一直重复,直到输入pin接受了一个类型,或者输出pin枚举完了它支持的所有的媒体类型,连接失败。

  输出pin通过调用输入pin上的IPin::EnumMediaTypes枚举输入pin所支持的媒体类型。

  看看如何匹配媒体类型的吧。

if ((pmt->formattype == FORMAT_VideoInfo) &.&.(pmt->cbFormat > sizeof(VIDEOINFOHEADER) &.&.(PBFormat != NULL))
{
 VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat.
 // Now you can dereference pVIH.
}


相关文章


DirectSound学习指南之设备性能
DirectShow学习指南之Filter的连接
DirectSound学习指南之枚举声音设备
利用VisualC 制作应用程序启动画面
DirectSound学习指南之协作级别
用VC获取其它程序的命令行参数
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛