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# 自定义安装包
    怕忘记了。记录一下要采购的元件1
    计划没有变化快啊
    一天三练有点累啊
    nRF24L01无线模块使用1电平转换
    好几年没参加IC公司的研讨会了
    变化
  • 原文地址:https://www.cnblogs.com/wainiwann/p/7911799.html
Copyright © 2011-2022 走看看