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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章