webrtc代码走读十九(webrtc线程汇总)

一、webrtc线程汇总

在windows环境下,导出demo的dump文件,分析webrtc创建的线程

这里仅记录了webrtc创建的线程,h264编解码线程没有在这里整理。

线程类型 线程名称 全局变量 功能 所属模块
Thread signaling_thread signaling_thread_ 信令线程,主要负责事件和状态 消息处理
Thread worker_thread worker_thread_ 工作者线程,主要跟各种数据流相关 消息处理
Thread network_thread network_thread_ 网络线程,处理接收网络报文 网络
PlatformThread PacerThread pacer_thread_ pacer平滑发送报文 网络
PlatformThread VoiceProcessThread _moduleProcessThreadPtr 好像是VOD检测?还是会场混音算法? 待确认
PlatformThread call_worker_queue worker_queue_ 音视频网络状态检测 资源管理
PlatformThread ModuleProcessThread module_process_thread_ 挂载定时调用函数 资源管理
PlatformThread EncoderQueue encoder_queue_ 视频编码 视频
PlatformThread DecodingThread decode_thread_ 视频解码(kHighestPriority) 视频
PlatformThread IncomingVideoStream incoming_render_queue_ 视频渲染(HIGH) 视频
PlatformThread AudioEncoderQueue encoder_queue_ 音频编码 音频
CreateThread   _hRecThread 音频采集 音频
CreateThread   _hPlayThread 音频渲染(解码和渲染在一个线程里) 音频
CreateThread   _hGetCaptureVolumeThread 获取音量参数 音频
CreateThread   _hSetCaptureVolumeThread 配置音频参数 音频
PlatformThread rtc-low-prio low_priority_worker_queue_ 音频录制维护功能(LOW) 维护
PlatformThread AudioDeviceBufferTimer task_queue_ 周期调用LogStats 维护
PlatformThread rtc_event_log task_queue_ 维护功能 维护

二、webrtc线程介绍

1、thread

rtc::Thread及ThreadManager、MessageQueue,Runnable一起提供了如下基础功能:

1)线程管理:通过ThreadManager单例对象,可以管理所有的Thread实例。

2)线程基本功能:rtc::Thread提供创建线程对象,设置线程名称,启动线程等接口。

3)消息循环、投递:rtc::Thread通过继承MessageQueue类,提供消息内部循环,线程间异步,同步投递功能。

4)跨线程执行方法:提供了跨线程执行方法,并返回执行结果的功能。

5)多路分离器:通过持有SocketServer对象,实现了多路分离器的功能,能处理网络IO;

webrtc的signaling_thread、worker_thread、network_thread使用了thread线程。代码中经常看到invoke、send、post实现的就是垮线程发送消息功能。

2、ProcessThread

webrtc中有定时任务的需求,比方说要定时发送RTCP报文,定时pacer平滑发送音视频数据等。这部分可以使用Module、ProcessThreadImpl、ProcessThread配合来完成。

扫描二维码关注公众号,回复: 11361643 查看本文章

TimeUntilNextProcess定义定时调用时间;Process定义定时调用处理函数;ProcessThreadAttached定义绑定的线程。

class Module {
 public:
  virtual int64_t TimeUntilNextProcess() = 0;
  virtual void Process() = 0;
  virtual void ProcessThreadAttached(ProcessThread* process_thread) {}

 protected:
  virtual ~Module() {}
};

3、PlatformThread

还有一些编码器、解码等线程,虽然不是定时调度,但是要求尽力最快处理的任务。在platform Thread里面实现。

该线程创建及调度的路径如下:

1)创建路径

TaskQueue::TaskQueue
->TaskQueue::Impl::Impl
->WorkerThread::WorkerThread
->PlatformThread::PlatformThread

2)调度路径

PlatformThread::StartThread
->PlatformThread::Run
->TaskQueue::Impl::ThreadMain
->TaskQueue::Impl::ThreadState::RunThreadMain
->TaskQueue::Impl::RunPendingTasks//该函数可以下挂多个任务,比如编码任务、渲染任务等

这部分可以参考《webrtc代码走读三(视频数据处理流程汇总)》相关函数调度关系图

猜你喜欢

转载自blog.csdn.net/CrystalShaw/article/details/106812248