原文地址:https://yq.aliyun.com/articles/48113

7.Filter的连接过程

DirectShow提供了多方法来连接Filter,如IFilterGraph::ConectDirect,IGraphBuilder::Connect

Filter的连接过程实际是两个过滤器就媒体类型进行协商的过程。Filter连接的过程其实它们的PIN连接的过程,就是上游的输出PIN与上游的输入PIN连接。我们知道,每一个PIN都有它自己支持的媒体类型,而当两个PIN没有共同支持的媒体类型的时候,它们是不能连接的,所以连接之前要进行协商。

在Conect函数的实现里,可以看到大致过程是这样的:

连接是由输出PIN发出的

Connect Start

IF PIN已连接  THEN EXIT

IF  Filter不是停止状态 THEN EXIT 

//开始协商过程

CALL AgreeMediaType

Connect End

AgreeMediaType Start

在输出PIN或输入PIN媒体类型枚举器mediatypeEnums

调用函数TryMediaTypes,并把枚举器的指针传给它

AgreeMediaType End

TryMediaTypes Start

FOR EACH mediatype IN mediatypEnums

AttempConnection(media)

NEXT

TryMediaTypes End

AttemptConnection Start

CheckMediaType //检查媒体类型是否被支持(输出PIN自己)

IF 支持 THEN

在PIN上保存媒体类型

ELSE 

FAILED

END IF

CALL ReceiveConnect  // 询问输入PIN是否接受当前的媒体类型。

IF SUCCEED THEN

CALL CompleteConnect

ELSE

FAIL

END IF

AttemptConnect End

CompleteConnect的作用是完成连接后的一些后续工作,主要是决定数据传输的时候使用哪一个内存分配器,由谁来创建内存分配器(IMemAllocator)。

注:Filter传输的数据单元叫Sample,它是一个COM组件,封装了一个缓冲区。Sample由内存分配器来管理。内存分配器是实现了IMenAllocator接口的COM组件,互责管理Sample。

智能连接:构造Filter Graph的时候通过一些方法的调用,DirectShow会帮我们构造整个Filter Graph。用到的方法有IGraphBuilder::RenderFile, IGraphBuilder:Render

ICaptureGraphBuilder2::RenderStream

最新文章

  1. jquery中的ajax参数
  2. lightbox图片展示效果
  3. Android 布局
  4. Qt学习 之 Socket通信(世界上最简单的例子了)
  5. jQuery上传插件Uploadify 3.2使用
  6. bzoj1148
  7. SQL Server 性能优化
  8. 新手篇丨Python任意网段Web端口信息探测工具
  9. VS2019 实用操作
  10. Java课程之团队开发(NABCD需求分析)
  11. 管理mysql数据的两条sql tips
  12. 2018-10-19 Chrome插件实现GitHub代码离线翻译v0.0.4
  13. python 历险记(四)— python 中常用的 json 操作
  14. 编写一种递归方法,它返回数N的二进制中表示1的个数。
  15. iPhone投影
  16. Oracle EBS OPM close batch
  17. bzoj2817[ZJOI2012]波浪
  18. CJB的大作
  19. javascript <a> 标签打开相对路径,绝对路径
  20. 搭建lamp或者lnmp环境,本地链接mysql报错解决方法

热门文章

  1. sgu 147. Black-white king 思路 坑 难度:1
  2. centos6.9使用yum安装mysql(简单粗暴,亲测有效)
  3. Xadmin的配置及使用
  4. 关键词提取算法-TextRank
  5. DataReader使用
  6. Python基础知识记录
  7. ubuntu修改分辨率
  8. Linux下下载JDK
  9. Jenkins搭建.NET自动编译发布远程环境
  10. graphql-binding openapi 集成demo