Gstreamer的PAD激活机制

Gstreamer的PAD激活机制(翻译自part-activation.txt)

激活
    当状态改变时,PIPELINE将按照从sink->source的顺序设置它的元素的状态。当元素从READY -> PAUSED状态转变时,它们的PAD将被激活来准备处理数据流,一些PAD将开始驱动数据流。
    一个元素按照source pad -> sink pad的顺序来激活它的pad,这将保证当sink pad被激活正准备接收数据时,source pad就已经准备就绪向下游传输数据流。
    pad可以有2种被激活的模式:PUSH和PULL。PUSH是默认的模式,souce pad通过调用sink pad的gst_pad_push来传输数据;PULL模式下,sink pad通过调用source pad的gst_pad_pull_range来请求数据。
    为了激活pad,核心将调用gst_pad_set_active(TRUE)来激活pad。如果pad已经激活,不论是PUSH还是PULL模式,gst_pad_set_active将直接返回,什么也不处理;否则将调用pad的激活处理函数。
    因为核心不知道按照什么模式(PUSH还是PULL)来激活pad,核心委托pad的激活函数activate()来完成这个功能。pad的activate()函数选择按照PUSH还是PULL模式来工作。默认地,activate()函数将调用activate_push()来激活,因为它是默认的数据流传输方式。sink pad如果调用check_get_range()返回TRUE,将调用activate_pull()来激活;否则调用activate_push()来激活pad。
    例如管道:fakesrc ! fakesink,fakesink是按照PULL模式工作的,该管道的状态改变将从最下游的fakesink元素开始,核心将激活fakesink元素的sink pad。由于fakesink是工作在PULL模式,它将实现一个自定义的activate()函数,调用activate_pull()来激活sink pad。activate_pull()负责启动从fakesrc的src pad获取数据的任务。很明显,fakesrc需要被通知将从它的的src pad上获取数据,即使PIPELINE还没有改变fakesrc的状态。由于这个原因,activate_pull()在启动拉数据的任务之前必须先调用fakesrc的src pad的activate_pull()函数。
    简而言之,在调用了它们source pad的activate_pull()函数后,上游的工作在PULL模式的元素在READY状态就准备产生数据;也就是说,activate_pull()函数的效果将传播到gst_pad_pull()能够到达每一个pad。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值