zoukankan      html  css  js  c++  java
  • Filter的连接过程《转》

    原文地址: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

  • 相关阅读:
    C# winform 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误
    C# 邮件发送系统
    IIS配置网站(WebServices),局域网都能访问
    C# 遍历窗体控件顺序问题
    zynqmp(zcu102rev1.0)系列---1---安装 xsdk
    linux 系统中将数据写入文档不能立即保存问题的解决方法
    virtualbox ubuntu16.04 自动挂载共享文件夹
    linux c 读写 ini 配置文件
    指针与 const --- 指针常量与常量指针
    Linux SD卡建立两个分区
  • 原文地址:https://www.cnblogs.com/wainiwann/p/7911799.html
Copyright © 2011-2022 走看看