github:https://github.com/bigonelby/webrtcUml/tree/master/latest
這個圖展示了webrtc中的應(yīng)用帶寬估算模塊決策出的碼率
這里的起點是RtpTransportControllerSend谓谦,前文已經(jīng)提到,最終的帶寬決策的值,將通過RtpTransportControllerSend的CongestionControlHandler記錄,每次SetTargetRate的時候葫笼,都會更新類成員last_incoming_袒餐,如果有變化,則同時更新last_reported_
RtpTransportControllerSend模塊在更新后姑尺,執(zhí)行UpdateControlStat方法,這個方法蝠猬,將從CongestionControlHandler中取出記錄切蟋,即last_reported_,同時觸發(fā)回調(diào)給observer_榆芦,這個observer就是TargetTransferRateObserver
這個Observer正是Call柄粹,原來Call在EnsureStarted的時候,就把自己注冊給RtpTransportControllerSend了匆绣,理所應(yīng)當(dāng)驻右,Call得到了這些數(shù)據(jù)。
接下來就是碼率分配了犬绒。這里決策出的碼率是帶寬碼率旺入,是所有stream所共享的,因此自然要分配到人凯力。誰來負(fù)責(zé)分配這個工作的茵瘾?就是Call的成員BitrateAllocator,Call會調(diào)用其OnNetworkEstimateChanged方法咐鹤,告知其網(wǎng)絡(luò)發(fā)生改變了拗秘。BitrateAllocator需要重新分配帶寬資源。
分配帶寬資源的主要就是AllocateBitrates方法祈惶。有幾種模式雕旨,如果帶寬不足扮匠,則執(zhí)行LowRateAllocation;正常的是NormalRateAllocation凡涩;如果帶寬非常充裕棒搜,則執(zhí)行MaxRateAllocation,這些分配函數(shù)活箕,會具體的將碼率分配給注冊的AllocatableTrack力麸,為每一個track都構(gòu)建了一個結(jié)構(gòu)體BitrateAllocationUpdate,然后通過BitrateAllocatorObserver將數(shù)據(jù)反饋給上層
究竟誰是observer呢育韩?實際上就是每個VideoSendStreamImpl克蚂,這些stream在其StartupVideoSendStream的時候,通過BitrateAllocator的AddObserver筋讨,將自己注冊至BitrateAllocator模塊中埃叭,每一個對應(yīng)一個AllocatableTrack
至此,VideoSendStreamImpl得到了分配好的碼率悉罕,他需要將這些碼率再進(jìn)行計算交給編碼器赤屋。因為發(fā)送還有overhead的數(shù)據(jù),因此encoder顯然不能獨享這些碼率蛮粮。通過RtpVideoSenderInterface的OnBitrateUpdated益缎,告知發(fā)送模塊碼率發(fā)送了變化,RtpVideoSender會通過所有RtpStreamSender的ModuleRtpRtcpImpl2模塊拿到overhead的數(shù)據(jù)然想,即通過方法ExpectedPerpacketOverhead,最終VideoSendStreamImpl通過RtpVideoSenderInterface得到編碼器應(yīng)分得的碼率欣范,即GetPayloadBitrateBps
最后变泄,就是給encoder設(shè)置了,通過VideoStreamEncoderInterface的OnBitrateUpdated方法進(jìn)行設(shè)置恼琼,在其實現(xiàn)類VideoStreamEncoder中妨蛹,再通過SetEncoderRates將碼率設(shè)置給具體的編碼器