SRS代码目录

news/2025/2/4 15:24:17 标签: srs

代码目录:

src/目录下核心代码:
在这里插入图片描述

  • core:核心功能模块,包括日志、配置、错误处理等;
  • protocol:实现RTMP、HTTP-FLV、HLS等协议的模块;
  • app:应用层的实现,包括流的发布、播放、转码等功能;
  • kernel:底层实现,包括网络I/O、多线程处理等;
  • main:主层序入口

SRS启动:

main:

// src/main/srs_main_server.cpp
main()
{
	do_main();
}

do_main()
{
	// 初始化,new创建各种server和实例
	srs_global_initialize();
	// 启动线程池?
	SrsThreadPool::setup_thread_locals();
	// 加载conf配置
	_srs_config->parse_options(argc, argv);
	// 运行主程序
	run_directly_or_daemon();
}

srs_global_initialize: 初始化各种server

// src/app/srs_app_threads.cpp
srs_global_initialize()
{
	...
	// 全局变量 _srs_hybrid:
	// SrsHybridServer* _srs_hybrid = NULL;
	_srs_hybrid = new SrsHybridServer();
	...
}

run_directly_or_daemon: 开始运行

run_directly_or_daemon()
{
	// 我们没有配置为daemon
	...
	int pid = fork();
	if (pid > 0) {
		// 父进程直接退出
		exit(0);
	}
	// 继续第二次fork()
	pid = fork();
	if (pid > 0) {
		// 父进程退出
		exit(0);
	}

	// 在子进程中开启执行
	run_in_thread_pool();
}

run_in_thread_pool

run_in_thread_pool()
{
	// 初始化线程池
	_srs_thread_pool->initialize();
	// 创建run_hybrid_server 工作线程,用于RTMP、RTC server
	_srs_thread_pool->execute("hybrid", run_hybrid_server, (void*)NULL)
	// 循环执行线程池中的每个线程:
	_srs_thread_pool->run();
}

SRS中的线程:

SrsThreadPool 线程池类:

// src/app/srs_app_threads.hpp
class SrsThreadPool {
	//
	std::vector<SrsThreadEntry*> threads_;
	//
	std::vector<SrsThreadEntry*> hybrids_;
};

// 线程池构造函数中,先指定主线程(primordial thread)
// primordial thread并不是调用pthread_create()单独创建的,而是指向了当前调用线程
SrsThreadPool::SrsThreadPool() {
	entry_ = NULL;
    lock_ = new SrsThreadMutex();
    hybrid_ = NULL;

    // Add primordial thread, current thread itself.
    SrsThreadEntry* entry = new SrsThreadEntry();
    threads_.push_back(entry); // 插入到线程池中
    entry_ = entry;

    entry->pool = this;
    entry->label = "primordial";
    entry->start = NULL;
    entry->arg = NULL;
    entry->num = 1;
    entry->trd = pthread_self(); // 获取当前线程的tid
    entry->tid = gettid();

    char buf[256];
    snprintf(buf, sizeof(buf), "srs-master-%d", entry->num);
    entry->name = buf;

    pid_fd = -1;
}

SrsThreadEntry 线程类:

// src/app/srs_app_threads.hpp
class SrsThreadEntry {
	SrsThreadPool* pool; // 此线程所在的线程池
	pid_t 		tid;
	pthread_t 	trd;
	string		name;
	
	srs_error_t (*start)(void* arg); // 线程入口函数
	void* arg; // 线程入参
};

_srs_thread_pool是一个全局变量,启动时初始化:

SrsThreadPool* _srs_thread_pool = new SrsThreadPool();

SRS中的Server:

hybrid_server:

// 虚基类,为不同的server子类提供接口
// The hyrid server interfaces, we could register many servers.
class ISrsHybridServer {
public:
    ISrsHybridServer();
    virtual ~ISrsHybridServer();
public:
    virtual srs_error_t initialize() = 0;
    virtual srs_error_t run(SrsWaitGroup* wg) = 0;
    virtual void stop() = 0;
};

// 管理hybrid server的类
// The hybrid server manager.
class SrsHybridServer : public ISrsFastTimer {
private:
    std::vector<ISrsHybridServer*> servers; // 管理所有hybrid server
    SrsFastTimer* timer20ms_;
    ...

	virtual void register_server(ISrsHybridServer* svr);
};

SRS中hybrid server类型:

// The SRS server adapter, the master server.
class SrsServerAdapter : public ISrsHybridServer;
// The RTC server adapter.
class RtcServerAdapter : public ISrsHybridServer;
// The srt server adapter, the master server.
class SrsSrtServerAdapter : public ISrsHybridServer;

正如其类名中的“Adapter”所示,这些类是适配类,核心类型是其中真正的server,如SrsServerAdapter中的SrsServer成员、RtcServerAdapter中的SrsRtcServer成员。

SrsServer:

class SrsServerAdapter : public ISrsHybridServer {
private:
	SrsServer* srs;
public:
    SrsServerAdapter();	// new创建SrsServer
    virtual ~SrsServerAdapter();
public:
    virtual srs_error_t initialize();
    // 调用SrsServer中的initialize等函数完成初始化,并调用SrsServer->start()
    virtual srs_error_t run(SrsWaitGroup* wg); 
    virtual void stop();
public:
    virtual SrsServer* instance();
}; 

SrsServerAdapter::SrsServerAdapter()
{
    srs = new SrsServer();
}

SrsServer:

class SrsServer : public ISrsReloadHandler, public ISrsLiveSourceHandler, public ISrsTcpHandler
    , public ISrsResourceManager, public ISrsCoroutineHandler, public ISrsHourGlass
{
private:
	SrsHttpServer* http_server; // SrsServer中包含一个HttpServer
	SrsTcpListener* api_listener_;
	SrsTcpListener* http_listener_;
	SrsTcpListener* webrtc_listener_;
	...
};

SrsRtcServer:

class RtcServerAdapter : public ISrsHybridServer {
private:
	SrsRtcServer* rtc;
};

gdb:

使用 GDB 调试程序并传递命令行参数:

gdb --args ./objs/srs -c conf/srs.conf

禁用 LeakSanitizer(设置环境变量):

export LSAN_OPTIONS=detect_leaks=0

gdb与fork:

当程序中调用for()创建子进程时,gdb默认只会继续调试父进程,而会“分离”或忽略子进程。
这是因为gdb通常只调试一个进程。
如果需要控制gdb调试指定父进程或子进程,需要通过特定的调试设置来改变这一行为:

(gdb) set follow-fork-mode child  # 调试子进程
(gdb) set follow-fork-mode parent  # 调试父进程

查看当前follow-fork-mode的值:

(gdb) show follow-fork-mode

常用gdb命令:

c:continue,跳到下一个断点
n:next,调到下一个函数(不进入函数内部)
s:step,进入函数内部
finish:完成函数

r:从头开始

info threads: 查看当前有多少个线程
info inferiors: 查看当前有多少个进程


http://www.niftyadmin.cn/n/5841648.html

相关文章

25.2.3 【洛谷】作为栈的复习不错(学习记录)

今天学习的东西不算多&#xff0c;放了一个星期假&#xff0c;感觉不少东西都没那么清楚&#xff0c;得复习一下才行。今天搞个栈题写&#xff0c;把栈复习一下&#xff0c;明天进入正轨&#xff0c;边复习边学习新东西&#xff0c;应该会有二叉树的学习等等... 【洛谷】P1449 …

【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)

【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…

订单状态监控实战:基于 SQL 的状态机分析与异常检测

目录 1. 背景与问题 2. 数据准备 2.1 表结构设计 3. 场景分析与实现 3.1 场景 1&#xff1a;检测非法状态转换 目标 实现 输出结果 3.2 场景 2&#xff1a;计算状态停留时长 目标 实现 输出结果&#xff08;片段&#xff09; 3.3 场景 3&#xff1a;跟踪完整状态路…

NoSQL、时序、搜索……Lindorm 如何一站式搞定多模数据?

在当今的大数据时代&#xff0c;数据类型越来越丰富&#xff0c;传统数据库架构已经难以满足复杂业务的需求。无论是高并发的 NoSQL 数据存储、时序数据的实时分析&#xff0c;还是全文搜索引擎的智能查询&#xff0c;都需要一个强大而灵活的数据库来支撑。阿里云云原生多模数据…

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

一文读懂 RAG:LLM 借助检索打开思路

一、引言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;随着深度学习技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;展现出了强大的语言理解和生成能力。然而&#xff0c;LLMs也存在一些局限性&#xff0c;如容易产生幻觉、知识更新不及时…

Rust中的结构体(Struct):数据组织的基石

结构体&#xff08;struct&#xff09;是Rust中定义自定义数据类型的基础工具&#xff0c;它允许你将多个相关的值组合成一个有意义的整体。通过结构体&#xff0c;我们可以创建出高度结构化、类型安全且易于维护的代码。本文将通过具体示例&#xff0c;详细介绍Rust结构体的核…