WebRTC中存在一些需要定時且重複的任務,所以就抽象出了Module
這個任務類和ProcessThread
這個定時執行任務的線程封裝類。
用到定時任務的模塊有(不完全列舉)
NackModule 視頻nack處理模塊
Pacer 平滑發送模塊
RtpRtcp rtprtcp模塊
BitrateController 碼率控制模塊
VideoSender 視頻發送模塊
VideoReceiver 視頻接收模塊
VideoCodingModule 視頻編解碼模塊
Module
Module類抽象了三個接口
virtual int64_t TimeUntilNextProcess() = 0;
virtual void Process() = 0;
virtual void ProcessThreadAttached(ProcessThread* process_thread) {}
-
TimeUntilNextProcess
返回下一次執行Process
函數的時間,單位是毫秒 -
Process
任務執行函數 -
ProcessThreadAttached
綁定或者解綁ProcessThread
到當前模塊。實際上只有平滑發送模塊(PacedSender)才使用到這個接口,PacedSender暫停和恢復的時候會調用ProcessThread的WakeUp接口激活PacedSender模塊
ProcessThread
ProcessThread提供的接口就是下面這幾個。它的實現主要依賴兩個類PlatformThread
(線程)和EventWrapper
(定時器)
- 調用Start創建一個新的線程,並啓動線程執行定時任務
- 調用Stop停止線程,並銷燬線程
- 通過RegisterModule接口註冊需要定時執行的模塊,ProcessThread把模塊加入到模塊列表中(modules_),並調用ProcessThreadAttached註冊此線程到新加入模塊
- 通過,DeRegisterModule接口移除不再需要定時執行的模塊,ProcessThread把模塊從模塊列表中移除,並調用ProcessThreadAttached取消註冊此線程到移除模塊
- 線程啓動以後會循環執行
ProcessThreadImpl::Process
,它會從模塊列表中找到當前需要執行的模塊,並找出最近一次需要執行的最小時間,把這個時間給定時器 - 如果某個模塊需要立馬被執行可以調用WakeUp函數,它會中斷定時器,馬上執行指定模塊
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;