github:https://github.com/bigonelby/webrtcUml/tree/master/latest
這張圖介紹了pacing過程中的入隊列情況
既然提到了pacing蜡镶,顯然會把之前的RtpPacketToSend緩存在某個隊列里携御,然后再以某種方式從隊列里取出數(shù)據(jù)然后發(fā)送到網(wǎng)絡(luò)中。這里介紹的就是緩存入隊列的過程
probe并不是這張圖的重點,這里先不介紹婚脱,后面再具體研究
之前已經(jīng)知道數(shù)據(jù)流是如何從編碼器產(chǎn)生并最終送到了pacing模塊,因此這里主要關(guān)注的是PacingController的packet_queue_冻押,也就是RoundRobinPacketQueue
這個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
來看看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_
PriorityPacketQueue這個按照優(yōu)先級大小入隊列的結(jié)構(gòu)體尚镰,其成員為QueuedPacket阀圾,此結(jié)構(gòu)體的成員owned_packet_即為之前打包好的RtpPacketToSend
梳理一下RtpPacketToSend的入隊列的過程:首先從RoundRobinPacketQueue的streams中找到對應(yīng)的Stream,然后按照優(yōu)先級插入到Stream的成員PriorityPacketQueue中狗唉,這個Queue中的每個成員QueuedPacket中的owned_packet_即為RtpPacketToSend
最后看看RtpPacketToSend的出隊列的過程初烘。我們需要找到優(yōu)先級最高的Stream,然后從這個Stream中Pop優(yōu)先級最高的那個RtpPacketToSend分俯。從指定的Stream中找到優(yōu)先級最高的RtpPacketToSend并非難事肾筐。因為本身,PriorityPacketQueue即為有序的容器缸剪,因此其top()元素吗铐,即為優(yōu)先級最高。因此要解決的問題是如何找到優(yōu)先級最高的Stream杏节。
比較容易想到的方案就是遍歷所有的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