`
jgsj
  • 浏览: 961375 次
文章分类
社区版块
存档分类
最新评论

DirectShow 视频捕获(9) 生成新的采样

 
阅读更多

Generating New Samples

生成新的采样

网址:http://msdn.microsoft.com/en-us/library/ms899448.aspx

这部分描述源过滤器如何生成新的采样

推模式

在推模式,源过滤器启动过程,步骤如下:

  • 源过滤器调用IMemAllocator::GetBuffer获取一个空的媒体采样
  • 源过滤器填充这个采样。如何填充完全决定于来源的性质。
  • 源过滤器调用下游输入引脚的IMemInputPin::Receive,传递一个指向采样的IMediaSample接口的指针。
  • 下游过滤器不是在Receive返回之前处理采样就是保留采样后面再处理。如果下游过滤器保留采样,需要调用采样对象的IUnknown::AddRef方法。

在这个时候,下游的过滤器也许保留采样的计数,所以源过滤器不能简单的重复使用采样。为传递下一个采样,它必须下步骤1一样再次调用IMemAlloctor::GetBuffer。

注意:为传递多个采样,在步骤3源过滤器可以调用IMemInputPin::ReceiveMultiple

拉模式

在拉模式,解析过滤器向源过滤器请求数据。解析过滤器使用源过滤器输出引脚上的IAsyncReader接口,步骤如下:

1. 解析过滤器调用IMemAllocator::GetBuffer获取一个空的媒体采样。

2. 它调用IAsyncReader::Request方法向源过滤器请求数据。

3. 源数据在获取数据的过程中,解析器调用IAsyncReader::WaitForNext。直到步骤2的请求完成。

4. 解析过滤器处理数据(可能调用自己输入引脚的IMemInputPin::Receive方法)并传递到下游。

步骤2和3执行异步读操作。解析器可以通过使用IAsyncReader::SyncRead或者IAsyncReader::SyncReadAligned方法,请求一个同步读操作。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics