刚刚弄明白了Dshow中在pull模式下程序执行的整个流程。整理一下,做个笔记。有些可能没有完全弄透,以后慢慢在补充。
废话少说,直接进入正题。
第一步, 客户程序 取得Filter Graph Manager对象和接口,构建 Filter Graph。 举例,包含一个Source Filter(pSource). 后面是Parse
fielter(pParse, 后面是 Render Filter(pRender); 构建后连接好各个PIN。这里过程不表。
第二步, 客户程序从 Filter Graph Manager 取得IMediaControl 接口,执行 Run(). 程序进入filter
第三步,各个Filter的执行Run().在Run()中判断当前状态,如果是stop,则先 执行pause(),pause()中Filter会调用各个Pin的active()。
Pin的active()中创建并运行Pin的数据线程(CSourceStream::ThreadProc。)
第四步,在ThreadProc中 pSource现在开始在该线程中不断的执行DoBufferProcessingLoop把数据推给下一个Filter. 直到 m_dwParam
为 STOP,m_dwParam 是pSource的变量,pSource通过设置它来通知ThreadProc是否停止。
第五步,DoBufferProcessingLoop怎么把数据推给下一个Filter呢,先得到buffer,填充,然后调用与它连接下一个Filter(pParse)的
inputPin的Receive()方法, inputPin的Receive()中又会调用下一个Filter 的什么方法(没跟下去,应该是这样),直到函数返回。
自此整个数据流就清楚了。具体的要查看dshow的代码了。