WebRTC中存在一些需要定時且重復(fù)的任務(wù),所以就抽象出了Module
這個任務(wù)類和ProcessThread
這個定時執(zhí)行任務(wù)的線程封裝類。
用到定時任務(wù)的模塊有(不完全列舉)
NackModule 視頻nack處理模塊
Pacer 平滑發(fā)送模塊
RtpRtcp rtprtcp模塊
BitrateController 碼率控制模塊
VideoSender 視頻發(fā)送模塊
VideoReceiver 視頻接收模塊
VideoCodingModule 視頻編解碼模塊
Module
Module類抽象了三個接口
virtual int64_t TimeUntilNextProcess() = 0;
virtual void Process() = 0;
virtual void ProcessThreadAttached(ProcessThread* process_thread) {}
- TimeUntilNextProcess
返回下一次執(zhí)行Process
函數(shù)的時間,單位是毫秒
- Process
任務(wù)執(zhí)行函數(shù)
- ProcessThreadAttached
綁定或者解綁ProcessThread
到當前模塊。實際上只有平滑發(fā)送模塊(PacedSender)才使用到這個接口,PacedSender暫停和恢復(fù)的時候會調(diào)用ProcessThread的WakeUp接口激活PacedSender模塊
ProcessThread
ProcessThread提供的接口就是下面這幾個厘肮。它的實現(xiàn)主要依賴兩個類PlatformThread
(線程)和EventWrapper
(定時器)
static std::unique_ptr<ProcessThread> Create(const char* thread_name);
virtual void Start() = 0;
virtual void Stop() = 0;
virtual void WakeUp(Module* module) = 0;
virtual void PostTask(std::unique_ptr<rtc::QueuedTask> task) = 0;
virtual void RegisterModule(Module* module, const rtc::Location& from) = 0;
virtual void DeRegisterModule(Module* module) = 0;
調(diào)用Start創(chuàng)建一個新的線程,并啟動線程執(zhí)行定時任務(wù)
調(diào)用Stop停止線程宙址,并銷毀線程
通過RegisterModule接口注冊需要定時執(zhí)行的模塊轴脐,ProcessThread把模塊加入到模塊列表中(modules_)调卑,并調(diào)用ProcessThreadAttached注冊此線程到新加入模塊
通過抡砂,DeRegisterModule接口移除不再需要定時執(zhí)行的模塊,ProcessThread把模塊從模塊列表中移除恬涧,并調(diào)用ProcessThreadAttached取消注冊此線程到移除模塊
線程啟動以后會循環(huán)執(zhí)行
ProcessThreadImpl::Process
注益,它會從模塊列表中找到當前需要執(zhí)行的模塊,并找出最近一次需要執(zhí)行的最小時間溯捆,把這個時間給定時器如果某個模塊需要立馬被執(zhí)行可以調(diào)用WakeUp函數(shù)丑搔,它會中斷定時器,馬上執(zhí)行指定模塊