网站大量收购独家精品文档,联系QQ:2885784924

DirectShowk中Filter的开发基础.doc

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DirectShowk中Filter的开发基础

DirectShowk中Filter的开发基础 摘要: 关于开发自己的Filter,我以前写过一篇文章,《利用Directshow开发自己的filter》,里面详细介绍了开发filter一些步骤,这里我想介绍一些filter的基础知识,可以让你更好的理解filter。本篇文档主要包括下面一些内容 ·?????? 1filter的连接 2filter间的数据流动 3pin连接时数据格式的动态改变 4Threads and Critical Sections 5质量控制管理 6Directshow和com 1filter的连接 Pin的连接 应用程序通过调用filter 图表管理器的方法来连接filter,并不是来调用filter或者pin本身的函数。应用程序可以调用IFilterGraph::ConnectDirect or IGraphBuilder::Connect来指定不同的filter直接连接,也可以通过IGraphBuilder::RenderFile间接连接。 只有两个filter都在graph里,连接才能成功。应用程序可以通过IFilterGraph::AddFilter将filter 添加graph中,当一个filter被添加到graph中时,filter图表管理器通过IBaseFilter::JoinFilterGraph来通知filter。 Pin连接的大致过程如下: 1图表管理器首先调用输出pin上的IPin::Connect,然后传递一个指针给输入pin。 2如果输出pin接受连接的邀请,它就调用输入pin上的IPin::ReceiveConnection。 3如果输入pin也接受连接邀请,那么连接成功,pin之间的连接ok。 当filter处于活动状态的时候,许多pin可以断开连接和重新连接。这种类型的连接称为动态连接。当然,大多数的filter并不支持动态连接。 Filter通常采用从上游到下游的连接顺序。也就是说filter上的输入pin总是比输出pin先连接。Filter应该支持这种连接顺序。然而有许多filter支持相反的连接顺序,输出pin先连接,输入pin后连接。例如:在连接MUX filter的输入pin之前一定要将MUX filter的输出pin和writer filter连接起来。 当pin的Connect or ReceiveConnection方法被调用的时候,pin必须检查一下自己是否支持这个连接。通常要进行下列检查: 1 检查媒体类型是否匹配。 2 就内存的分配达成一致。 3请求其他pin的其他接口。 媒体类型匹配 当一个filter 图表管理器调用IPin::Connect方法时,可能有下面的几种媒体类型。 1 完整类型 如果媒体类型每一个部分都定义的很完成,那么pin就严格按照定义的类型类型进行连接。如果不匹配,连接失败。 2 部分媒体类型 如果媒体类型的机构中,major type, subtype, or format type的值为GUID_NULL,这个值是一个通配符号。任何类型都可以匹配。 3没有媒体类型 如果filter图表管理器传递过来一个NULL的指针,这个pin就可以和任意的类型的媒体类型匹配。 一般在连接过程中,都有一个完整的媒体类型。图表管理器传递媒体类型的目的是为了限制连接类型。 一般来说,都是输出pin通过调用输入pin IPin::ReceiveConnection提供一个媒体类型。输入pin可以拒绝也可以接受这个媒体类型。这个过程一直重复,直到输入pin接受了一个类型,或者输出pin枚举完了它支持的所有的媒体类型,连接失败。 输出pin通过调用输入pin上的IPin::EnumMediaTypes枚举输入pin所支持的媒体类型。 看看如何匹配媒体类型的吧。 if ((pmt-formattype == FORMAT_VideoInfo) (pmt-cbFormat sizeof(VIDEOINFOHEADER) (pbFormat != NULL)) { VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt-pbFormat; // Now you can dereference pVIH. } Pin连接中的内存分配 当两个pin连接起来后,他们需要一种机制来交换媒体数据。大多数数据交换采用的局部内存交换机制。所有的媒体数据都在主内存中。DirectShow为局部存储器传输定义了两种机制:推模式(push model)和拉模式(pull model)。在推模式中,源过滤器生成数据并提交给下一级过滤器。下一级过滤器被动的接收数据,完成处理后再传送给再下一级过滤器。在拉模式中,源过滤器与一个分析过

文档评论(0)

yaobanwd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档