• 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

  • 相关阅读:
    HDU4112
    HDU1059 二进制拆分优化多重背包
    HDU1087
    HDU1978How Many Ways 记忆化dfs+dp
    HDU1160FatMouse's Speed
    HDU1503Advanced Fruits
    CF337C
    337BRoutine Problem
    【★★★★★模板专区★★★★★】
    【水】Jam计数法
  • 原文地址:https://www.cnblogs.com/wainiwann/p/7911799.html
Copyright © 2020-2023  润新知