directshow中filter开发基础

directshow中filter开发基础

ID:32865128

大小:111.50 KB

页数:25页

时间:2019-02-16

directshow中filter开发基础_第1页
directshow中filter开发基础_第2页
directshow中filter开发基础_第3页
directshow中filter开发基础_第4页
directshow中filter开发基础_第5页
资源描述:

《directshow中filter开发基础》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Directshow中Filter开发基础摘要:关于开发自己的Filter,我以前写过一篇文章,《利用Directshow开发自己的filter》,里面详细介绍了开发filter一些步骤,这里我想介绍一些filter的基础知识,可以让你更好的理解filter。本篇文档主要包括下面一些内容·1filter的连接2filter间的数据流动3pin连接时数据格式的动态改变4ThreadsandCriticalSections5质量控制管理6Directshow和com1filter的连接Pin的连接应用程序通过调用filter图表管理器的方法来连接filter,并

2、不是来调用filter或者pin本身的函数。应用程序可以调用IFilterGraph::ConnectDirectorIGraphBuilder::Connect来指定不同的filter直接连接,也可以通过IGraphBuilder::RenderFile间接连接。只有两个filter都在graph里,连接才能成功。应用程序可以通过IFilterGraph::AddFilter将filter添加graph中,当一个filter被添加到graph中时,filter图表管理器通过IBaseFilter::JoinFilterGraph来通知filter。Pin连

3、接的大致过程如下:1图表管理器首先调用输出pin上的IPin::Connect,然后传递一个指针给输入pin。2如果输出pin接受连接的邀请,它就调用输入pin上的IPin::ReceiveConnection。3如果输入pin也接受连接邀请,那么连接成功,pin之间的连接ok。当filter处于活动状态的时候,许多pin可以断开连接和重新连接。这种类型的连接称为动态连接。当然,大多数的filter并不支持动态连接。Filter通常采用从上游到下游的连接顺序。也就是说filter上的输入pin总是比输出pin先连接。Filter应该支持这种连接顺序。然而有许

4、多filter支持相反的连接顺序,输出pin先连接,输入pin后连接。例如:在连接MUXfilter的输入pin之前一定要将MUXfilter的输出pin和writerfilter连接起来。当pin的ConnectorReceiveConnection方法被调用的时候,pin必须检查一下自己是否支持这个连接。通常要进行下列检查:1检查媒体类型是否匹配。2就内存的分配达成一致。3请求其他pin的其他接口。媒体类型匹配当一个filter图表管理器调用IPin::Connect方法时,可能有下面的几种媒体类型。1完整类型如果媒体类型每一个部分都定义的很完成,那么p

5、in就严格按照定义的类型类型进行连接。如果不匹配,连接失败。2部分媒体类型如果媒体类型的机构中,majortype,subtype,orformattype的值为GUID_NULL,这个值是一个通配符号。任何类型都可以匹配。3没有媒体类型如果filter图表管理器传递过来一个NULL的指针,这个pin就可以和任意的类型的媒体类型匹配。一般在连接过程中,都有一个完整的媒体类型。图表管理器传递媒体类型的目的是为了限制连接类型。一般来说,都是输出pin通过调用输入pinIPin::ReceiveConnection提供一个媒体类型。输入pin可以拒绝也可以接受这个

6、媒体类型。这个过程一直重复,直到输入pin接受了一个类型,或者输出pin枚举完了它支持的所有的媒体类型,连接失败。输出pin通过调用输入pin上的IPin::EnumMediaTypes枚举输入pin所支持的媒体类型。看看如何匹配媒体类型的吧。if((pmt->formattype==FORMAT_VideoInfo)&&(pmt->cbFormat>sizeof(VIDEOINFOHEADER)&&(pbFormat!=NULL)){VIDEOINFOHEADER*pVIH=(VIDEOINFOHEADER*)pmt->pbFormat;//Nowyouc

7、andereferencepVIH.}Pin连接中的内存分配当两个pin连接起来后,他们需要一种机制来交换媒体数据。大多数数据交换采用的局部内存交换机制。所有的媒体数据都在主内存中。DirectShow为局部存储器传输定义了两种机制:推模式(pushmodel)和拉模式(pullmodel)。在推模式中,源过滤器生成数据并提交给下一级过滤器。下一级过滤器被动的接收数据,完成处理后再传送给再下一级过滤器。在拉模式中,源过滤器与一个分析过滤器相连。分析过滤器向源过滤器请求数据后,源过滤器才传送数据以响应请求。推模式使用的是IMemInputPin接口,拉模式使用

8、IAsyncReader接口,推模式比拉模式要更常用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。