SRS对StateThreads的封装—SRS源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
SRS 对 StateThreads
的封装都在 srs_app_st.hpp
、srs_app_st.cpp
里面,这个文件里面的 class 类结构之间的关系如下:
SrsSTCoroutine
可以说就是 SRS 封装 StateThreads
之后提供的外部接口类。
如果你想创建一个协程服务,首先,你需要让你的类继承 ISrsCoroutineHandler,然后实现自己的 cycle()
方法,他内部最终会创建一个协程来运行你的 cycle()
方法。
以 SrsSignalManager
信号处理模块为例,他的类定义如下:
class SrsSignalManager : public ISrsCoroutineHandler
SrsSignalManager
的 cycle
函数如下:
不过需要注意的是 SrsSignalManager
并没有继承 SrsSTCoroutine
,SrsSTCoroutine
是作为 trd
变量在 SrsSignalManager
里面存在的,如下:
//创建协程
trd = new SrsSTCoroutine("signal", this, _srs_context->get_id());
//启动协程
trd->start();
上面的 this
就是 SrsSignalManager
本身,这样就把 SrsSignalManager
作为一个 handler
绑定到 SrsFastCoroutine
里面了,最后会启动一个协程执行 this
里面的 cycle()
函数,流程图如下:
SrsSignalManager 是一个比较好的示例模块,代码比较短,如果你想创建一个新的模块,可以把 SrsSignalManager
复制一份来修改。
本文的第一张图片里面有一个 SrsDummyCoroutine
类,SrsDummyCoroutine
的设计有点不太好理解,其实他使用的是 empty object 设计模式,就是一个空的对象,里面的 start()
、stop()
等函数都是空的。
以 HTTP API 模块为例,他的用法如下:
其实跟之前的区别就是, new SrsDummyCoroutine
变成了 new SrsSTCoroutine
。但是这个 SrsDummyCoroutine
实例最后是会被释放的,然后重新用 SrsSTCoroutine
实例来替代的,如下:
SrsDummyCoroutine
应该是在某些动态创建协程的场景有用,这部分内容后面再继续补充。