RenderStream 智能连接Filter
ICaptureGraphBuilder2::RenderStream方法可以同时将两个或者三个filter连接成一个链(chain)。通常情况下,当每个filter只有一个输出pin和一个输入pin时,这个方法就才适用。
我们现在先忽略前两个参数,第三个参数是一个IUnknown指针,指向一个filter或者输出pin。第五,六个参数指向IBaseFilter指针。RenderStream就将三个filter连接成一个链。例如,假设A,B,C 是三个filter,每个filter只有一个输出pin和一个输入pin。
下面的代码可以将B连接到A上,将B连接到C上。
RenderStream(NULL, NULL, A, B, C)
所有的连接都是智能化的,如果是将两个filter相连,你可以将中间的参数设置为NULL:
RenderStream(NULL, NULL, A, NULL, C)
也可以调用两次这个函数创建一个更长的链条。
RenderStream(NULL, NULL, A, B, C)
RenderStream(NULL, NULL, C, D, E)
如果最后的一个参数设置为NULL,这个方法就自动的为graph设置一个renderer filter。如果是视频就设置成Video Renderer,如果是音频就设置为DirectSoundRenderer。因此RenderStream(NULL, NULL, A, NULL, NULL)等价于 RenderStream(NULL, NULL, A, NULL, R)
这里R指的是Render Filter。
如果你在第三个参数指定的是filter,而不是pin,你就要在第一二个参数里指定使用那个输出pin用于连接。
第一个参数只适用于捕捉filter,它指定pin的所属种类的GUID,具体的设置可以参考Pin Property Set.,但是下面的两个种类对于所有的filter都有效。
PIN_CATEGORY_CAPTURE
PIN_CATEGORY_PREVIEW
如果捕捉filter不支持捕捉和预览,RenderStream方法就增加一个Smart Tee来分割数据流。
如果播放文件,要将捕捉filter和一个mux filter连接起来,第二个参数指明了媒体类型:
MEDIATYPE_Audio
MEDIATYPE_Video
MEDIATYPE_Interleaved (DV)
查询filter和pin的接口指针
当你建立一个graph后,也许你需要查询graph中的filter和pin暴露的接口指针。例如,一个捕捉filter也许暴露了IAMDroppedFrames接口,它的输出pin也许暴露了IAMStreamConfig接口。
查询接口最简单地方法就是使用ICaptureGraphBuilder2::FindInterface方法。这个方法遍历整个graph的filter和pin,直到他找到合适的filter。你可以指定开始的filter,然后指定搜索的方向,(向上搜索还是向下搜索)。
下面的代码在一个视频预览pin上搜索IAMStreamConfig接口
IAMStreamConfig *pConfig = NULL;
HRESULT hr = pBuild->FindInterface(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pVCap,IID_IAMStreamConfig,
(void**)&pConfig
);
if (SUCCESSFUL(hr))
{
/* ... */
pConfig->Release();
}