openwrt gstreamer實例學習筆記(七. gstreamer 緩沖區(Buffers)和事件(Events))


1)概述

管道的數據流由一組緩沖區和事件組成,緩沖區包括實際的管道數據,事件包括控制信息,如尋找信息和流的終止信號。所有這些數據流在運行的時候自動的流過管道。

2) 緩沖區(Buffers)

緩沖區包含了你創建的管道里的數據流。通常一個source element會創建一個新的緩沖區,同時element還將會把緩沖區的數據傳遞給下一個element。當使用GStreamer底層構造來創建一個媒體管道的時候,你不需要自己來處理緩沖區,element將會為你處理這些緩沖區。

一個緩沖區主要由以下一個組成:

指向某塊內存的指針

內存的大小

緩沖區的時間戳

一個引用計數,指出了緩沖區所使用的element數。沒有element可引用的時候,這個element將用於銷毀緩沖區。

這里有一個簡單的例子,我們先創建了一個緩沖區,然后為這個緩沖區分配內存,然后將數據存放在緩沖區中,並傳遞至下一個element。該element讀取數據,處理某些事件(像創建一個新的緩沖區並進行解碼),對該緩沖區解引用,這將造成數據空閑,導致緩沖區被銷毀。典型的音頻和視頻解碼器就是這樣工作的。

盡管如此,還有一些更為復雜的設定,element會適當的修改緩沖區,也就是說,不會分配一個新的緩沖區。element也可以寫入硬件內存(如視頻捕獲源)或是使用XShm從X-server分配內存。緩沖區只能讀,等等。

3)事件(Events)

事件是一系列控制粒子,隨着緩沖區被發送到管道的上游和下游。下游事件通知流狀態相同的element,可能的事件包括中斷,flush,流的終止信號等等。在應用程序與element之間的交互以及事件與事件之間的交互中,上游事件被用於改變管道中數據流的狀態,如查找。對於應用程序來說,上游事件非常重要,下游事件則是為了說明獲取更加完善的數據概念上的圖像。

由於大多數應用程序以時間為單位查找,下面的例子實現了同樣的功能:

static void  seek_to_time (GstElement *element,     guint64     time_ns)

{

     GstEvent *event;

     event = gst_event_new_seek (GST_SEEK_METHOD_SET |  GST_FORMAT_TIME,   time_ns);

     gst_element_send_event (element, event);

}

以上代碼主要是說明其具體的工作原理,快捷算法是一個函數 gst_element_seek ()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM