DirectShow技术介绍(长篇)-9

 

3.8. 插件发布者(Plug-in Distributors

 

    Plug-in Distributors(PIDs)是扩展filter graph manager的一种方法。一个PIDfilter graph manager在运行时聚合的一个COM对象。应用程序通过filter graph manager来进入PID

     filter graph manager被要求查询一个它不支持的接口时,它会搜索注册表项:

        HKEY_CLASSES_ROOT/Interface/IID/Distributor

    IID是接口的GUID,如果注册项存在,那么键值便是支持该接口的PID类标识(CLSID)filter graph manager聚合了PID并返回接口指针,应用程序调用这个指针时实际上就是在调用PID,但是这对于应用程序来说是透明的,对于应用程序来说,它就象是在filter graph manager上调用这个接口一样。

    PID为应用程序提供了一种简单的控制filter的方法,如通过调用IFilterGraph::EnumFilters方法,PID可以枚举graph中的所有filter并调用这些filter上的方法。

    filter graph manager聚合了一个PID时,它查询PIDIDistributorNotify接口,如果PID支持这个接口,filter graph manager用它来通知PID有关graph的状态变化:

* filter graphrunpausestop状态之间切换时,它调用IDistributorNotify::Run, IDistributorNotify::PauseIDistributorNotify::Stop

* 如果调置了参考时钟,filter graph manager调用IDistributorNotify::SetSyncSource

* 当有filter添加或移除,或pin连接有变化时,filter graph manager调用IDistributorNotify::NotifyGraphChange

 

    当自己定制PID时,自己所创建的COM对象必须支持聚合,并且它所支持的接口是filter graph manager本身所没有的。IDistributorNotify接口是可选的。

    如果PIDfilter graph manager上获得一个接口,那它必须立即release这个接口,否则会在COM对象上出现循环引用的参考计数,使得filter graph manager无法被销毁。在filter graph manager上保持一个参考计数是多余的,因为PID的生命期是由filter graph manager控制的。

    因为PID是明确指定是被filter graph manager聚合使用的,因此你应该在PID的构造函数中强行检查IUnknown指针是否为NULL,如果为NULL,则返回错误码VFW_E_NEED_OWNER。同时,为了防止其它对象聚合PID,你可以在IUnknown上查询IGraphBuilder接口,如果不行则返回错误。

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值