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。
发布了52 篇原创文章 · 获赞 15 · 访问量 18万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章