WebRTC之Module

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章