GStreamer 媒體能力協(xié)商一

Abstract GStreamer 媒體能力協(xié)商
Authors Walter Fan
Category learning note
Status v1.0
Updated 2023-12-10
License CC-BY-NC-ND 4.0

概述

在 GStreamer 中晶通, 媒體能力協(xié)商 Capabilities negotiation (縮寫為 Caps negotiation) 是一個決策的過程绒极,用來決定在 GStreamer 管道中數(shù)據(jù)流采用何種合適的媒體格式查库。

GStreamer 的文檔 Negotiation 中對這一塊有詳細(xì)的解釋, 在此我做些翻譯和記錄

有些元件有相對固定的媒體能力凿蒜,有些元件則比較靈活宾袜,有些則不那么靈活叉谜。理想情況下错敢,媒體能力協(xié)商(Capabilities negotiation) 信息將從管道中具有媒體能力的那些元件践樱,傳送到管道中相對靈活的那部分元件中厂画,并受到管道中并不靈活的那部分元件的約束。

基本規(guī)則

以下的基本規(guī)則需要遵守

  1. 下游元件建議格式
  2. 上游元件決定格式

在 caps negotiation 中有四種 queries/events

  1. GST_QUERY_CAPS: 獲取可能的 Caps
  2. GST_QUERY_ACCEPT_CAPS: 檢查 Caps 是否可行
  3. GST_EVENT_CAPS: 配置 Caps(下游)
  4. GST_EVENT_RECONFIGURE: 通知上游可用的新 Caps

查詢 Queries

一個 pad 可以詢問其所連接的 pad 它是不是支持某種格式 GstCaps, 這就是 CAPS query拷邢。 支持的 caps 列表可用于為數(shù)據(jù)傳輸選擇合適的 GstCaps袱院。

CAPS 查詢以遞歸方式工作,元件在構(gòu)建可能的 caps 時應(yīng)考慮其對等元件瞭稼。 由于結(jié)果 caps 可能非常大忽洛,因此可以使用過濾器 capsfilter 來限制 caps。 只有與過濾器匹配的 caps 才會作為結(jié)果 caps 返回环肘。 過濾器caps 的順序的按照調(diào)用者的優(yōu)先順序給出欲虚,并考慮下游元件所返回的 caps。

  • filter(in)GST_TYPE_CAPS(默認(rèn)為 NULL):- 用于過濾結(jié)果的GstCaps
  • caps (out) GST_TYPE_CAPS(默認(rèn) NULL): - 查詢到的 Caps 結(jié)果

pad 可以詢問對等 pad 是否支持給定的 caps 悔雹。 它通過 ACCEPT_CAPS 查詢來執(zhí)行此操作复哆, 這個返回的Caps 是固定。 “ACCEPT_CAPS”查詢不需要遞歸地工作腌零,如果具有這些 caps 的后續(xù) CAPS 事件返回成功梯找,它可以簡單地返回 TRUE。

  • caps(in)GST_TYPE_CAPS:- 要檢查的GstCaps益涧,它是固定的值
  • result (out)G_TYPE_BOOLEAN(默認(rèn) FALSE): - 如果 Caps 被接受 則為 TRUE

事件 Events

當(dāng)一個媒體格式協(xié)商成功锈锤,對端的元件就會以 CAPS 事件發(fā)送通知, 此 Caps 是固定的

  • caps GST_TYPE_CAPS: - 協(xié)商的 GstCaps, 它必須是固定的

操作 Operation

GStreamer 的兩種調(diào)度模式(推模式和拉模式)適用于不同的機(jī)制來實現(xiàn)此目標(biāo)。 由于推模式更常見久免,我們先描述推模式協(xié)商 Push-mode negotiation浅辙。

Push-mode negotiation

當(dāng)一個元件想要推送緩沖區(qū)并且需要決定媒體格式時,就會發(fā)生推送模式協(xié)商妄壶。 這稱為下游協(xié)商 (downstream negotiation)摔握,因為上游元件決定下游元件的格式寄狼。 這是最常見的情況丁寄。

當(dāng)下游元件想要從上游元件接收另一種數(shù)據(jù)格式時,也可能發(fā)生協(xié)商泊愧。 這稱為上游協(xié)商伊磺。

協(xié)商的基本過程如下:

  • GstCaps (see caps) are refcounted before they are pushed as an event to describe the contents of the following buffer.
    GstCaps 用來描述媒體數(shù)據(jù)的內(nèi)容 ,它會作為一個事件重新進(jìn)行引用計數(shù)删咱,然后發(fā)送給相連的元件

  • 一個元件在處理數(shù)據(jù)緩沖之前收到 CAPS 事件屑埋,它可以重新更改 (reconfigure) 自己的配置為新的媒體格式。如果這個 caps 事件的數(shù)據(jù)類型不可接受痰滋,此元件可以拒絕這個 caps 事件摘能,它同時也會拒絕接下來的數(shù)據(jù)緩沖,方法是在 chain 函數(shù)中返回 GST_FLOW_NOT_NEGOTIATED

  • 下游的元件可通過發(fā)送 GST_FLOW_NOT_NEGOTIATED 事件給上游的元件要求媒體流的格式更改

一個 source pad 開始協(xié)商的一般流程如下, 看起來頗有點做生意的討價還價流程

            src              sink
             |                 |
             |  querycaps?     |
             |---------------->|
             |     caps        |
select caps  |< - - - - - - - -|
from the     |                 |
candidates   |                 |
             |                 |-.
             |  accepts?       | |
 type A      |---------------->| | optional
             |      yes        | |
             |< - - - - - - - -| |
             |                 |-'
             |  send_event()   |
send CAPS    |---------------->| Receive type A, reconfigure to
event A      |                 | process type A.
             |                 |
             |  push           |
push buffer  |---------------->| Process buffer of type A
             |                 |

可能的偽代碼實現(xiàn)如下

[element wants to create a buffer]
if not format
  # see what we can do
  ourcaps = gst_pad_query_caps (srcpad)
  # see what the peer can do filtered against our caps
  candidates = gst_pad_peer_query_caps (srcpad, ourcaps)

  foreach candidate in candidates
    # make sure the caps is fixed
    fixedcaps = gst_pad_fixate_caps (srcpad, candidate)

    # see if the peer accepts it
    if gst_pad_peer_accept_caps (srcpad, fixedcaps)
      # store the caps as the negotiated caps, this will
      # call the setcaps function on the pad
      gst_pad_push_event (srcpad, gst_event_new_caps (fixedcaps))
      break
    endif
  done
endif

一個 sink pad 開始重新協(xié)商的一般流程如下,還是討價還價敲街, 只不過這回發(fā)起的是買方(sink pad)

            src              sink
             |                 |
             |  accepts?       |
             |<----------------| type B
             |      yes        |
             |- - - - - - - - >|-.
             |                 | | suggest B caps next
             |                 |<'
             |                 |
             |   push_event()  |
 mark      .-|<----------------| send RECONFIGURE event
renegotiate| |                 |
           '>|                 |
             |  querycaps()    |
renegotiate  |---------------->|
             |  suggest B      |
             |< - - - - - - - -|
             |                 |
             |  send_event()   |
send CAPS    |---------------->| Receive type B, reconfigure to
event B      |                 | process type B.
             |                 |
             |  push           |
push buffer  |---------------->| Process buffer of type B
             |                 |

參考資料



本作品采用知識共享署名-非商業(yè)性使用-禁止演繹 4.0 國際許可協(xié)議進(jìn)行許可团搞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市多艇,隨后出現(xiàn)的幾起案子逻恐,更是在濱河造成了極大的恐慌,老刑警劉巖峻黍,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复隆,死亡現(xiàn)場離奇詭異,居然都是意外死亡姆涩,警方通過查閱死者的電腦和手機(jī)挽拂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骨饿,“玉大人亏栈,你說我怎么就攤上這事⊙ⅲ” “怎么了仑扑?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長置鼻。 經(jīng)常有香客問我镇饮,道長,這世上最難降的妖魔是什么箕母? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任储藐,我火速辦了婚禮俱济,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钙勃。我一直安慰自己蛛碌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布辖源。 她就那樣靜靜地躺著蔚携,像睡著了一般。 火紅的嫁衣襯著肌膚如雪克饶。 梳的紋絲不亂的頭發(fā)上酝蜒,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音矾湃,去河邊找鬼亡脑。 笑死,一個胖子當(dāng)著我的面吹牛邀跃,可吹牛的內(nèi)容都是我干的霉咨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拍屑,長吁一口氣:“原來是場噩夢啊……” “哼途戒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丽涩,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤棺滞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矢渊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體继准,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年矮男,在試婚紗的時候發(fā)現(xiàn)自己被綠了移必。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡毡鉴,死狀恐怖崔泵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猪瞬,我是刑警寧澤憎瘸,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站陈瘦,受9級特大地震影響幌甘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一锅风、第九天 我趴在偏房一處隱蔽的房頂上張望酥诽。 院中可真熱鬧,春花似錦皱埠、人聲如沸肮帐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训枢。三九已至,卻和暖如春饰抒,著一層夾襖步出監(jiān)牢的瞬間肮砾,已是汗流浹背诀黍。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工袋坑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眯勾。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓枣宫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吃环。 傳聞我的和親對象是個殘疾皇子也颤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容