DirectShow学习指南之Filter的连接
销的连接
应用程序通过调用筛选器图表管理器的方法连接到筛选器,而不是调用筛选器的函数或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了。
}
0条评论