diff --git a/README.md b/README.md index 95c406ade..512750782 100755 --- a/README.md +++ b/README.md @@ -990,13 +990,13 @@ SRS always use the simplest architecture to solve complex domain problems. ## Modularity Architecture ``` -+------------------------------------------------------+ -| SRS server | Programs in Main or Research | -+------------------------------------------------------+ -| App(For SRS) | Modules(1) | research/librtmp | -+------------------------------------------------------+ -| Service(C/S apps over ST) | Libs(Export librtmp) | -+------------------------------------------------------+ ++----------------+-------------------------------------+ +| SRS/SRT server | Programs in Main or Research | ++----------------+--+------------+---------------------+ +| App(For SRS) | Modules(1) | research/librtmp | ++-------------------+------------+---------------------+ +| Service(C/S apps over ST) | srs-librtmp | ++--------------------------------+---------------------+ | Protocol Stack(RTMP/HTTP/RTSP/JSON/AMF/Format) | +------------------------------------------------------+ | Kernel(File, Codec, Stream, LB services) | diff --git a/trunk/configure b/trunk/configure index faf5ec4c7..afb4dc26e 100755 --- a/trunk/configure +++ b/trunk/configure @@ -245,9 +245,6 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then MODULE_ID="APP" MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL" "SERVICE") ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS_DIR} ${LibSSLRoot}) - if [[ $SRS_SRT == YES ]]; then - ModuleLibIncs+=("${LibSRTRoot[*]}") - fi MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_source" "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http_stream" "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config" diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 1aab1a632..1d33b4983 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -25,18 +25,30 @@ #include #include +#include +#include -SrsHybridServer::SrsHybridServer() +using namespace std; + +ISrsHybridServer::ISrsHybridServer() +{ +} + +ISrsHybridServer::~ISrsHybridServer() +{ +} + +SrsServerAdapter::SrsServerAdapter() { srs = new SrsServer(); } -SrsHybridServer::~SrsHybridServer() +SrsServerAdapter::~SrsServerAdapter() { srs_freep(srs); } -srs_error_t SrsHybridServer::initialize() +srs_error_t SrsServerAdapter::initialize() { srs_error_t err = srs_success; @@ -49,30 +61,10 @@ srs_error_t SrsHybridServer::initialize() return srs_error_wrap(err, "initialize st"); } -#ifdef SRS_AUTO_SRT - if(_srs_config->get_srt_enabled()) { - srs_trace("srt server is enabled..."); - unsigned short srt_port = _srs_config->get_srt_listen_port(); - srs_trace("srt server listen port:%d", srt_port); - err = srt2rtmp::get_instance()->init(); - if (err != srs_success) { - srs_error_wrap(err, "srt start srt2rtmp error"); - return err; - } - - srt_ptr = std::make_shared(srt_port); - if (!srt_ptr) { - srs_error_wrap(err, "srt listen %d", srt_port); - } - } else { - srs_trace("srt server is disabled..."); - } -#endif - return err; } -srs_error_t SrsHybridServer::run() +srs_error_t SrsServerAdapter::run() { srs_error_t err = srs_success; @@ -100,12 +92,6 @@ srs_error_t SrsHybridServer::run() return srs_error_wrap(err, "ingest"); } -#ifdef SRS_AUTO_SRT - if(_srs_config->get_srt_enabled()) { - srt_ptr->start(); - } -#endif - if ((err = srs->cycle()) != srs_success) { return srs_error_wrap(err, "main cycle"); } @@ -113,3 +99,75 @@ srs_error_t SrsHybridServer::run() return err; } +SrsHybridServer::SrsHybridServer() +{ +} + +SrsHybridServer::~SrsHybridServer() +{ + vector::iterator it; + for (it = servers.begin(); it != servers.end(); ++it) { + ISrsHybridServer* server = *it; + srs_freep(server); + } + servers.clear(); +} + +void SrsHybridServer::register_server(ISrsHybridServer* svr) +{ + servers.push_back(svr); +} + +srs_error_t SrsHybridServer::initialize() +{ + srs_error_t err = srs_success; + + // init st + if ((err = srs_st_init()) != srs_success) { + return srs_error_wrap(err, "initialize st failed"); + } + + vector::iterator it; + for (it = servers.begin(); it != servers.end(); ++it) { + ISrsHybridServer* server = *it; + + if ((err = server->initialize()) != srs_success) { + return srs_error_wrap(err, "init server"); + } + } + + return err; +} + +srs_error_t SrsHybridServer::run() +{ + srs_error_t err = srs_success; + + // Run master server in this main thread. + SrsServerAdapter* master_server = NULL; + + vector::iterator it; + for (it = servers.begin(); it != servers.end(); ++it) { + ISrsHybridServer* server = *it; + + if (!master_server) { + master_server = dynamic_cast(server); + if (master_server) { + continue; + } + } + + if ((err = server->run()) != srs_success) { + return srs_error_wrap(err, "run server"); + } + } + + if (master_server) { + return master_server->run(); + } + + return err; +} + +SrsHybridServer* _srs_hybrid = new SrsHybridServer(); + diff --git a/trunk/src/app/srs_app_hybrid.hpp b/trunk/src/app/srs_app_hybrid.hpp index d978b27e9..58aa6dff9 100644 --- a/trunk/src/app/srs_app_hybrid.hpp +++ b/trunk/src/app/srs_app_hybrid.hpp @@ -26,26 +26,46 @@ #include -#ifdef SRS_AUTO_SRT -#include -#include -#endif +#include class SrsServer; -class SrsHybridServer +class ISrsHybridServer +{ +public: + ISrsHybridServer(); + virtual ~ISrsHybridServer(); +public: + virtual srs_error_t initialize() = 0; + virtual srs_error_t run() = 0; +}; + +class SrsServerAdapter : public ISrsHybridServer { private: SrsServer* srs; -#ifdef SRS_AUTO_SRT - SRT_SERVER_PTR srt_ptr; -#endif +public: + SrsServerAdapter(); + virtual ~SrsServerAdapter(); +public: + virtual srs_error_t initialize(); + virtual srs_error_t run(); +}; + +class SrsHybridServer +{ +private: + std::vector servers; public: SrsHybridServer(); virtual ~SrsHybridServer(); +public: + virtual void register_server(ISrsHybridServer* svr); public: virtual srs_error_t initialize(); virtual srs_error_t run(); }; +extern SrsHybridServer* _srs_hybrid; + #endif diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 3bdb5f99a..e5d3bbc9f 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -565,11 +565,6 @@ srs_error_t SrsServer::initialize_st() { srs_error_t err = srs_success; - // init st - if ((err = srs_st_init()) != srs_success) { - return srs_error_wrap(err, "initialize st failed"); - } - // @remark, st alloc segment use mmap, which only support 32757 threads, // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK. // TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine. diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 150339f3d..d3c527761 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -50,6 +50,10 @@ using namespace std; #include #include +#ifdef SRS_AUTO_SRT +#include +#endif + // pre-declare srs_error_t run_directly_or_daemon(); srs_error_t run_hybrid_server(); @@ -411,14 +415,16 @@ srs_error_t run_hybrid_server() { srs_error_t err = srs_success; - SrsHybridServer* svr = new SrsHybridServer(); - SrsAutoFree(SrsHybridServer, svr); + _srs_hybrid->register_server(new SrsServerAdapter()); +#ifdef SRS_AUTO_SRT + _srs_hybrid->register_server(new SrtServerAdapter()); +#endif - if ((err = svr->initialize()) != srs_success) { + if ((err = _srs_hybrid->initialize()) != srs_success) { return srs_error_wrap(err, "hybrid initialize"); } - if ((err = svr->run()) != srs_success) { + if ((err = _srs_hybrid->run()) != srs_success) { return srs_error_wrap(err, "hybrid run"); } diff --git a/trunk/src/srt/srt_server.cpp b/trunk/src/srt/srt_server.cpp index b938f3678..011545ad0 100644 --- a/trunk/src/srt/srt_server.cpp +++ b/trunk/src/srt/srt_server.cpp @@ -199,3 +199,47 @@ void srt_server::on_work() } } } + +SrtServerAdapter::SrtServerAdapter() +{ +} + +SrtServerAdapter::~SrtServerAdapter() +{ +} + +srs_error_t SrtServerAdapter::initialize() +{ + srs_error_t err = srs_success; + + if(_srs_config->get_srt_enabled()) { + srs_trace("srt server is enabled..."); + unsigned short srt_port = _srs_config->get_srt_listen_port(); + srs_trace("srt server listen port:%d", srt_port); + err = srt2rtmp::get_instance()->init(); + if (err != srs_success) { + srs_error_wrap(err, "srt start srt2rtmp error"); + return err; + } + + srt_ptr = std::make_shared(srt_port); + if (!srt_ptr) { + srs_error_wrap(err, "srt listen %d", srt_port); + } + } else { + srs_trace("srt server is disabled..."); + } + + return err; +} + +srs_error_t SrtServerAdapter::run() +{ + srs_error_t err = srs_success; + + if(_srs_config->get_srt_enabled()) { + srt_ptr->start(); + } + + return err; +} diff --git a/trunk/src/srt/srt_server.hpp b/trunk/src/srt/srt_server.hpp index 7201b7263..d235dfad6 100644 --- a/trunk/src/srt/srt_server.hpp +++ b/trunk/src/srt/srt_server.hpp @@ -1,10 +1,13 @@ #ifndef SRT_SERVER_H #define SRT_SERVER_H + #include #include #include +#include + class srt_handle; class srt_server { @@ -34,4 +37,16 @@ private: typedef std::shared_ptr SRT_SERVER_PTR; +class SrtServerAdapter : public ISrsHybridServer +{ +private: + SRT_SERVER_PTR srt_ptr; +public: + SrtServerAdapter(); + virtual ~SrtServerAdapter(); +public: + virtual srs_error_t initialize(); + virtual srs_error_t run(); +}; + #endif//SRT_SERVER_H \ No newline at end of file