WebRTC之Module

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/momo0853/article/details/87277472

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;

猜你喜欢

转载自blog.csdn.net/momo0853/article/details/87277472