原文地址:https://yq.aliyun.com/articles/48113
7.Filter的连接过程
DirectShow提供了多方法来连接Filter,如IFilterGraph::ConectDirect,IGraphBuilder::Connect
Filter的连接过程实际是两个过滤器就媒体类型进行协商的过程。Filter连接的过程其实它们的PIN连接的过程,就是上游的输出PIN与上游的输入PIN连接。我们知道,每一个PIN都有它自己支持的媒体类型,而当两个PIN没有共同支持的媒体类型的时候,它们是不能连接的,所以连接之前要进行协商。
在Conect函数的实现里,可以看到大致过程是这样的:
连接是由输出PIN发出的
Connect Start
IF PIN已连接 THEN EXIT
IF Filter不是停止状态 THEN EXIT
//开始协商过程
CALL AgreeMediaType
Connect End
AgreeMediaType Start
在输出PIN或输入PIN媒体类型枚举器mediatypeEnums
调用函数TryMediaTypes,并把枚举器的指针传给它
AgreeMediaType End
TryMediaTypes Start
FOR EACH mediatype IN mediatypEnums
AttempConnection(media)
NEXT
TryMediaTypes End
AttemptConnection Start
CheckMediaType //检查媒体类型是否被支持(输出PIN自己)
IF 支持 THEN
在PIN上保存媒体类型
ELSE
FAILED
END IF
CALL ReceiveConnect // 询问输入PIN是否接受当前的媒体类型。
IF SUCCEED THEN
CALL CompleteConnect
ELSE
FAIL
END IF
AttemptConnect End
CompleteConnect的作用是完成连接后的一些后续工作,主要是决定数据传输的时候使用哪一个内存分配器,由谁来创建内存分配器(IMemAllocator)。
注:Filter传输的数据单元叫Sample,它是一个COM组件,封装了一个缓冲区。Sample由内存分配器来管理。内存分配器是实现了IMenAllocator接口的COM组件,互责管理Sample。
智能连接:构造Filter Graph的时候通过一些方法的调用,DirectShow会帮我们构造整个Filter Graph。用到的方法有IGraphBuilder::RenderFile, IGraphBuilder:Render
ICaptureGraphBuilder2::RenderStream