一、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配合来完成。
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代码走读三(视频数据处理流程汇总)》相关函数调度关系图