DirectShow学习指南之Filter的连接

DirectShow学习指南之Filter的连接,第1张

DirectShow学习指南之Filter的连接,第2张

销的连接

应用程序通过调用筛选器图表管理器的方法连接到筛选器,而不是调用筛选器的函数或pin本身。应用程序可以调用ifiltergraph:: connect direct或igraphbuilder:: connect来指定不同的过滤器直接连接,或者通过IGraphBuilder::RenderFile间接连接。

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

引脚连接的一般过程如下:

1.图表管理器首先在输出引脚上调用IPin::Connect,然后传递一个指向输入引脚的指针。

2.如果输出引脚接受连接邀请,它将调用输入引脚上的IPin::ReceiveConnection。

3.如果您输入pin并接受连接邀请,则连接成功,pin之间的连接正常。

当过滤器处于活动状态时,可以断开和重新连接许多引脚。这种类型的连接称为动态连接。当然,大多数过滤器不支持动态连接。

过滤器通常采用从上游到下游的连接顺序。也就是说,滤波器上的输入引脚总是在输出引脚之前连接。筛选器应该支持此连接顺序。然而,有许多过滤器支持相反的连接顺序。输出引脚先连接,输入引脚后连接。例如,确保在连接多路复用器滤波器的输入引脚之前,将多路复用器滤波器的输出引脚与写入滤波器相连。

当调用pin的Connect或ReceiveConnection方法时,pin必须检查它是否支持此连接。通常,会执行以下检查:

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

2.就内存分配达成一致。

3.为其他引脚请求其他接口。

媒体类型匹配

当过滤器图表管理器调用IPin::Connect方法时,可能有以下媒体类型。

1.完整类型

如果媒体类型的每个部分都定义得很好,那么引脚将严格按照定义的类型连接。如果不匹配,则连接失败。

2.一些媒体类型

如果媒体类型组织中的主要类型、子类型或格式类型的值为GUID_NULL,则该值为通配符。任何类型都可以搭配。

3.无媒体类型

如果过滤图表管理器传递一个空指针,此引脚可以匹配任何类型的媒体类型。

一般在连接过程中有一个完整的媒体类型。图表管理器传输媒体类型以限制连接类型。

一般来说,输出引脚通过调用输入引脚IPin::ReceiveConnection来提供媒体类型。输入pin以拒绝或接受此媒体类型。重复此过程,直到输入引脚接受一种类型,或者输出引脚枚举所有支持的媒体类型,并且连接失败。

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

我们来看看如何搭配媒体类型。

if((PMT-> FORMAT type = = FORMAT _ video info)& &(PMT-> CB FORMAT > sizeof(video info header)& &(Pb FORMAT!= NULL))
{
video info header * pVIH =(video info header *)PMT-> Pb format;
//现在可以解引用pVIH了。
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » DirectShow学习指南之Filter的连接

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情