Gstreamer時鐘

時鐘 翻譯自part-clocks.txt

Clocks
-----------
    GstClock用_get_time()返回單調遞增的時間,它的精度和base time取決於時鐘實現,但總是以納秒爲單位。既然時鐘的基線沒有被定義,時鐘返回的值本身毫無意義,只有兩個時鐘之間的差值纔有意義。
    GstClock返回的時間值被稱爲absolute_time。

Clock Selection
~~~~~~~~~~~~~~~
    爲了同步不同的元素,GstPipeline負責爲所有的元素選擇並指定一個全局的時鐘。無論什麼時候pipeline變成PLAYING狀態時,該選擇將會發生;無論什麼時候,一個元素添加到或者刪除從pipeline,該選擇將會再下次變成PLAYING狀態時發生。添加一個能夠提供時鐘的元素時將觸發GST_MESSAGE_CLOCK_PROVIDE消息,該消息將導致時鐘重新被選擇。
    當一個時鐘被選擇,NEW_CLOCK消息被post到bus上,告知應用程序。
    當提供時鐘的元素從pipeline上刪除了,CLOCK_LOST消息被post到bus上。應用程序必須設置pipeline爲PAUSED,然後再設置成PLAYING狀態,目的是讓pipeline重新選定時鐘。

Clock features
~~~~~~~~~~~~~~
    gstreamer支持週期時鐘和計數器時鐘,首先用_clock_new_single_shot_id()和_clock_new_periodic_id()分別創建計數器時鐘和週期時鐘的實例(GstClockID)。
    爲了執行一段阻塞時間的等待,調用gst_clock_id_wait();爲了執行一個異步的時間等待,時間到後能夠執行指定的回調函數,需要調用gst_clock_id_wait_async()。這個兩個調用都可以用gst_clock_id_unschedule()中斷。如果沒有阻塞的等待被調度,GST_CLOCK_UNSCHEDULED被返回。可以從任何線程執行異步的調用。
    可以從多個線程在同一個GstClockID的ID執行阻塞等待,但是異步調用確實不行的,回調函數將只被調用一次。
    沒有任何等待操作將unref GstClockID,GstClockID的擁有者應該自行unref。原因是GstClockID的擁有者必須保留GstClockID來取消在FLUSHING event上的阻塞等。如果自動unref,GstClockID的jID可能是無效的。
    這些時鐘操作不能應用到stream time。當不是PLAYING狀態時,回調函數可能被觸發如果時鐘還是在繼續運行。但是有一些時鐘的提供者,在不是PLAYING狀態是,時鐘是不運行的,這個時候回調函數將不會被觸發。

Clock implementations
~~~~~~~~~~~~~~~~~~~~~
    GStreamer核心提供了一個基於系統時鐘的GstSystemClock,異步回調函數能夠在內部線程被調用。時鐘實現被鼓勵繼承自這個系統時鐘,因爲他已經實現了異步通知機制。
    子類也可以覆蓋所有的重要方法來實現他們自己的異步回調功能和同步阻塞功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章