目標
Pad的Capabilities是一個GStreamer element的基礎,因為framework大部分時間是自動處理的,所以我們幾乎感覺不到它的存在。本教程比較偏向原理,介紹了:
什麼是Pad Capabilities
如何獲得這個東西
什麼時候應該去獲得這個東西
為什麼你需要瞭解他們
介紹
Pads
Pads允許資訊進入或者離開一個element——就像曾經展示過得一樣。這個Capabilities(或者簡單地叫做Caps)就是指定哪些資訊可以通過Pad來傳輸。例如:“”RGB視頻,尺寸為320x200並且每秒30幀“或者”16位的音頻採樣,5.1聲道,每秒採樣44.1k“甚至可以是類似於mp3/h264之類的壓縮格式。
Pads支援多重Capabilities(比如,一個視頻的sink可以支援RGB輸出或者YUV輸出),Capabilities可以指定一個範圍而不必須是一個特定值(比如,一個音頻sink可以支援從1~48000的採樣率)。然而,資料從一個pad流向另一個pad的時候,必須是一個雙方都能支援的格式。某一種資料形式是兩個pad都能支援的,這樣Pads的Capabilities就固定下來(只有一個鐘個數,並且不再是一個資料區間了),這個過程被稱為協商。下面的例子會更清楚的說明這一點。
為了兩個element可以串連,他們必須有一個共同的Capabilities子集(否則它們肯定不能互相串連)。這就是Capabilities存在的主要目的。
作為一個應用開發人員,我們通常都是用串連一個個element的方法來建立pipeline的。在這個例子中,你需要瞭解你使用的element的Pad的Caps。
Pad模板
Pad是由Pad模板建立的,模板裡面會列出一個Pad所有可能的Capabilities。模板對於建立幾個相似的Pad是很有協助的,但也會比較早就判斷出兩個element是否可以相連:如果連兩個Pad的模板都不具備共同的子集的化,就沒必要進行更深層的協商了。
Pad模板檢查是協商流程的第一步。隨著流程的逐步深入,Pad會正式初始化,也會確定他們的Capability(除非協商失敗了)。
Capabilities例子
[plain] view plain copy SINK template: 'sink' Availability: Always Capabilities: audio/x-raw-int signed: true width: 16 depth: 16 rate: [ 1, 2147483647 ] channels: [ 1, 2 ] audio/x-raw-int signed: false width: 8 depth: 8 rate: [ 1, 2147483647 ] channels: [ 1, 2 ] 這是一個element的永久sink pad。它支援2種媒體格式,都是音訊未經處理資料(audio/x-raw-int),16位的符號數和8位的無符號數。方括弧表示一個範圍,例如,頻道(channels)的範圍是1到2.
[plain] view plain copy SRC template: 'src' Availability: Always Capabilities: video/x-raw-yuv width: [ 1, 2147483647 ] height: [ 1, 2147483647 ] framerate: [ 0/1, 2147483647/1 ] format: { I420, NV12, NV21, YV12, YUY2, Y42B, Y444, YUV9, YVU9, Y41B, Y800, Y8 , GREY, Y16 , UYVY, YVYU, IYU1, v308, AYUV, A420 } video/x-raw-yur表示這個source pad用YUV格式輸出視頻。它支援一個很廣的維數和幀率,一系列的YUV格式(用花括弧列出了)。所有這些格式都顯示不同的映像打包和子採樣程度。
最後的總結
你可以使用gst-inspect-0.10這個工具(在後面教程中會介紹)來查看一下element的Caps。
記住有些element會查看底層的硬體來確定支援的格式和能提供的Pad的Caps(通常在進入READY或更後面的狀態)。因此,這個顯示的Caps由於平台的不同是不一樣的,甚至可能在每一次運行都不相同(這種情況很少)。
本教程會建立2個element,顯示它們各自的Pad模板,串連起來並把pipeline設定成PLAY狀態。在每個狀態切換的過程中,sink element的Pad的Capabilities會顯示出來,這樣你就可以觀察到協商過程是如何進行的,最後Pad的Caps是怎麼定下來的。
一個簡單地Pad Capabilities例子
[objc] view plain copy #include <gst/gst.h> /* Functions below print the Capabilities in a human-friendly format */ static gboolean print_field (GQuark field, const GValue * value, gpointer pfx) { gchar *str = gst_value_serialize (value); g_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str); g_free (str); return TRUE; } static void print_caps (const GstCaps * caps, const gchar * pfx) { guint i; g_return_if_fail (caps !=