webrtc发送端-pacing入队列

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

webrtc-new-发送端-pacing入队列.drawio.png
  1. 这张图介绍了pacing过程中的入队列情况

  2. 既然提到了pacing,显然会把之前的RtpPacketToSend缓存在某个队列里,然后再以某种方式从队列里取出数据然后发送到网络中。这里介绍的就是缓存入队列的过程

  3. probe并不是这张图的重点,这里先不介绍,后面再具体研究

  4. 之前已经知道数据流是如何从编码器产生并最终送到了pacing模块,因此这里主要关注的是PacingController的packet_queue_,也就是RoundRobinPacketQueue

  5. 这个packet_queue_可不一般,因为这里的入队列情况一定是有优先级只说的,packet的发送也不是简单的先进先出的,而是按照优先级来的,即优先级最高的那些包,会被最先发送到网络中去。因此首先看看优先级,优先级从大到小的顺序为audio > retransmission > video > fec > padding

  6. 来看看RoundRobinPacketQueue的基本结构。这个RoundRobinPacketQueue是由Stream构成的,key为ssrc,即每个ssrc对应一个Stream,Stream有个成员packet_queue,为PriorityPacketQueue,这个结构体是继承自std::priority_queue的,因此这个Queue的入栈会根据优先级排序,优先级高的在前面,优先级低的在后面。优先级之前已经介绍了,这里补充一点,当优先级相同时,重传包的优先级最高;如果都不是重传包或都是重传包,则根据入队列的次序决定优先级,入队列的次序即为每个包所对应的packet_counter_

  7. PriorityPacketQueue这个按照优先级大小入队列的结构体,其成员为QueuedPacket,此结构体的成员owned_packet_即为之前打包好的RtpPacketToSend

  8. 梳理一下RtpPacketToSend的入队列的过程:首先从RoundRobinPacketQueue的streams中找到对应的Stream,然后按照优先级插入到Stream的成员PriorityPacketQueue中,这个Queue中的每个成员QueuedPacket中的owned_packet_即为RtpPacketToSend

  9. 最后看看RtpPacketToSend的出队列的过程。我们需要找到优先级最高的Stream,然后从这个Stream中Pop优先级最高的那个RtpPacketToSend。从指定的Stream中找到优先级最高的RtpPacketToSend并非难事。因为本身,PriorityPacketQueue即为有序的容器,因此其top()元素,即为优先级最高。因此要解决的问题是如何找到优先级最高的Stream。

  10. 比较容易想到的方案就是遍历所有的streams,然后找到每个PriorityPacketQueue的top(),比较其优先级值,从而得到优先级最高的Stream。但是这个操作过于繁琐。由于每个RtpPacketToSend在出队列时均要进行这个操作,因此考虑用空间换时间。因此在RoundRobinPacketQueue中还维护着另一个有序容器,即StreamPrioKey,这个有序容器是std::multimap,其中key为StreamPrioKey,值为ssrc。我们知道std::multimap是有序容器,其元素在入队列时,会根据key值进行排序,由此结构体,我们就可以找到优先级最高的ssrc,也就是stream_priorities_.begin(),而值ssrc,就是我们要找的优先级最高的那个ssrc。我们通过这个ssrc,就可以在streams中找到所对应的Stream了,这样就非常快速的找到了当前优先级最高的Stream

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容