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
(定时器)
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;
调用Start创建一个新的线程,并启动线程执行定时任务
调用Stop停止线程,并销毁线程
通过RegisterModule接口注册需要定时执行的模块,ProcessThread把模块加入到模块列表中(modules_),并调用ProcessThreadAttached注册此线程到新加入模块
通过,DeRegisterModule接口移除不再需要定时执行的模块,ProcessThread把模块从模块列表中移除,并调用ProcessThreadAttached取消注册此线程到移除模块
线程启动以后会循环执行
ProcessThreadImpl::Process
,它会从模块列表中找到当前需要执行的模块,并找出最近一次需要执行的最小时间,把这个时间给定时器如果某个模块需要立马被执行可以调用WakeUp函数,它会中断定时器,马上执行指定模块