webrtc發(fā)送端-pacing入隊列

github:https://github.com/bigonelby/webrtcUml/tree/master/latest

webrtc-new-發(fā)送端-pacing入隊列.drawio.png
  1. 這張圖介紹了pacing過程中的入隊列情況

  2. 既然提到了pacing蜡镶,顯然會把之前的RtpPacketToSend緩存在某個隊列里携御,然后再以某種方式從隊列里取出數(shù)據(jù)然后發(fā)送到網(wǎng)絡(luò)中。這里介紹的就是緩存入隊列的過程

  3. probe并不是這張圖的重點,這里先不介紹婚脱,后面再具體研究

  4. 之前已經(jīng)知道數(shù)據(jù)流是如何從編碼器產(chǎn)生并最終送到了pacing模塊,因此這里主要關(guān)注的是PacingController的packet_queue_冻押,也就是RoundRobinPacketQueue

  5. 這個packet_queue_可不一般鬓椭,因為這里的入隊列情況一定是有優(yōu)先級只說的,packet的發(fā)送也不是簡單的先進(jìn)先出的娜饵,而是按照優(yōu)先級來的坡贺,即優(yōu)先級最高的那些包,會被最先發(fā)送到網(wǎng)絡(luò)中去。因此首先看看優(yōu)先級遍坟,優(yōu)先級從大到小的順序為audio > retransmission > video > fec > padding

  6. 來看看RoundRobinPacketQueue的基本結(jié)構(gòu)拳亿。這個RoundRobinPacketQueue是由Stream構(gòu)成的,key為ssrc愿伴,即每個ssrc對應(yīng)一個Stream肺魁,Stream有個成員packet_queue,為PriorityPacketQueue隔节,這個結(jié)構(gòu)體是繼承自std::priority_queue的鹅经,因此這個Queue的入棧會根據(jù)優(yōu)先級排序,優(yōu)先級高的在前面官帘,優(yōu)先級低的在后面。優(yōu)先級之前已經(jīng)介紹了昧谊,這里補(bǔ)充一點刽虹,當(dāng)優(yōu)先級相同時,重傳包的優(yōu)先級最高呢诬;如果都不是重傳包或都是重傳包涌哲,則根據(jù)入隊列的次序決定優(yōu)先級,入隊列的次序即為每個包所對應(yīng)的packet_counter_

  7. PriorityPacketQueue這個按照優(yōu)先級大小入隊列的結(jié)構(gòu)體尚镰,其成員為QueuedPacket阀圾,此結(jié)構(gòu)體的成員owned_packet_即為之前打包好的RtpPacketToSend

  8. 梳理一下RtpPacketToSend的入隊列的過程:首先從RoundRobinPacketQueue的streams中找到對應(yīng)的Stream,然后按照優(yōu)先級插入到Stream的成員PriorityPacketQueue中狗唉,這個Queue中的每個成員QueuedPacket中的owned_packet_即為RtpPacketToSend

  9. 最后看看RtpPacketToSend的出隊列的過程初烘。我們需要找到優(yōu)先級最高的Stream,然后從這個Stream中Pop優(yōu)先級最高的那個RtpPacketToSend分俯。從指定的Stream中找到優(yōu)先級最高的RtpPacketToSend并非難事肾筐。因為本身,PriorityPacketQueue即為有序的容器缸剪,因此其top()元素吗铐,即為優(yōu)先級最高。因此要解決的問題是如何找到優(yōu)先級最高的Stream杏节。

  10. 比較容易想到的方案就是遍歷所有的streams唬渗,然后找到每個PriorityPacketQueue的top(),比較其優(yōu)先級值奋渔,從而得到優(yōu)先級最高的Stream镊逝。但是這個操作過于繁瑣。由于每個RtpPacketToSend在出隊列時均要進(jìn)行這個操作嫉鲸,因此考慮用空間換時間蹋半。因此在RoundRobinPacketQueue中還維護(hù)著另一個有序容器,即StreamPrioKey,這個有序容器是std::multimap减江,其中key為StreamPrioKey染突,值為ssrc。我們知道std::multimap是有序容器辈灼,其元素在入隊列時份企,會根據(jù)key值進(jìn)行排序,由此結(jié)構(gòu)體巡莹,我們就可以找到優(yōu)先級最高的ssrc司志,也就是stream_priorities_.begin(),而值ssrc降宅,就是我們要找的優(yōu)先級最高的那個ssrc骂远。我們通過這個ssrc,就可以在streams中找到所對應(yīng)的Stream了腰根,這樣就非臣げ牛快速的找到了當(dāng)前優(yōu)先級最高的Stream

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市额嘿,隨后出現(xiàn)的幾起案子瘸恼,更是在濱河造成了極大的恐慌,老刑警劉巖册养,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件东帅,死亡現(xiàn)場離奇詭異,居然都是意外死亡球拦,警方通過查閱死者的電腦和手機(jī)靠闭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坎炼,“玉大人阎毅,你說我怎么就攤上這事〉阃洌” “怎么了扇调?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抢肛。 經(jīng)常有香客問我狼钮,道長,這世上最難降的妖魔是什么捡絮? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任熬芜,我火速辦了婚禮,結(jié)果婚禮上福稳,老公的妹妹穿的比我還像新娘涎拉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布鼓拧。 她就那樣靜靜地躺著半火,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季俩。 梳的紋絲不亂的頭發(fā)上钮糖,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音酌住,去河邊找鬼店归。 笑死,一個胖子當(dāng)著我的面吹牛酪我,可吹牛的內(nèi)容都是我干的消痛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼都哭,長吁一口氣:“原來是場噩夢啊……” “哼秩伞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起质涛,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤稠歉,失蹤者是張志新(化名)和其女友劉穎掰担,沒想到半個月后汇陆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡带饱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年毡代,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勺疼。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡教寂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出执庐,到底是詐尸還是另有隱情酪耕,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布轨淌,位于F島的核電站迂烁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏递鹉。R本人自食惡果不足惜盟步,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躏结。 院中可真熱鬧却盘,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旬陡,卻和暖如春拓颓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背描孟。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工驶睦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匿醒。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓场航,卻偏偏與公主長得像,于是被迫代替她去往敵國和親廉羔。 傳聞我的和親對象是個殘疾皇子溉痢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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