diff --git a/trunk/configure b/trunk/configure index 5b8cd4b0f..faf5ec4c7 100755 --- a/trunk/configure +++ b/trunk/configure @@ -258,7 +258,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then "srs_app_mpegts_udp" "srs_app_rtsp" "srs_app_listener" "srs_app_async_call" "srs_app_caster_flv" "srs_app_process" "srs_app_ng_exec" "srs_app_hourglass" "srs_app_dash" "srs_app_fragment" "srs_app_dvr" - "srs_app_coworkers") + "srs_app_coworkers" "srs_app_hybrid") DEFINES="" # add each modules for app for SRS_MODULE in ${SRS_MODULES[*]}; do diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp new file mode 100644 index 000000000..1aab1a632 --- /dev/null +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -0,0 +1,115 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2013-2020 Winlin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#include +#include + +SrsHybridServer::SrsHybridServer() +{ + srs = new SrsServer(); +} + +SrsHybridServer::~SrsHybridServer() +{ + srs_freep(srs); +} + +srs_error_t SrsHybridServer::initialize() +{ + srs_error_t err = srs_success; + + // Initialize the whole system, set hooks to handle server level events. + if ((err = srs->initialize(NULL)) != srs_success) { + return srs_error_wrap(err, "server initialize"); + } + + if ((err = srs->initialize_st()) != srs_success) { + 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 err = srs_success; + + if ((err = srs->initialize_signal()) != srs_success) { + return srs_error_wrap(err, "initialize signal"); + } + + if ((err = srs->acquire_pid_file()) != srs_success) { + return srs_error_wrap(err, "acquire pid file"); + } + + if ((err = srs->listen()) != srs_success) { + return srs_error_wrap(err, "listen"); + } + + if ((err = srs->register_signal()) != srs_success) { + return srs_error_wrap(err, "register signal"); + } + + if ((err = srs->http_handle()) != srs_success) { + return srs_error_wrap(err, "http handle"); + } + + if ((err = srs->ingest()) != srs_success) { + 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"); + } + + return err; +} + diff --git a/trunk/src/app/srs_app_hybrid.hpp b/trunk/src/app/srs_app_hybrid.hpp new file mode 100644 index 000000000..d978b27e9 --- /dev/null +++ b/trunk/src/app/srs_app_hybrid.hpp @@ -0,0 +1,51 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2013-2020 Winlin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SRS_APP_HYBRID_HPP +#define SRS_APP_HYBRID_HPP + +#include + +#ifdef SRS_AUTO_SRT +#include +#include +#endif + +class SrsServer; + +class SrsHybridServer +{ +private: + SrsServer* srs; +#ifdef SRS_AUTO_SRT + SRT_SERVER_PTR srt_ptr; +#endif +public: + SrsHybridServer(); + virtual ~SrsHybridServer(); +public: + virtual srs_error_t initialize(); + virtual srs_error_t run(); +}; + +#endif diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index c85930da3..3bdb5f99a 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -688,11 +688,6 @@ srs_error_t SrsServer::listen() if ((err = conn_manager->start()) != srs_success) { return srs_error_wrap(err, "connection manager"); } -#ifdef SRS_AUTO_SRT - if ((err = listen_srt()) != srs_success) { - return srs_error_wrap(err, "srt listen"); - } -#endif return err; } @@ -1009,32 +1004,6 @@ srs_error_t SrsServer::do_cycle() return err; } -#ifdef SRS_AUTO_SRT -srs_error_t SrsServer::listen_srt() { - 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); - } - srt_ptr->start(); - } else { - srs_trace("srt server is disabled..."); - } - return err; -} -#endif - srs_error_t SrsServer::listen_rtmp() { srs_error_t err = srs_success; diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index e08a5f8d9..fd8cbe3ad 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -36,10 +36,6 @@ #include #include #include -#ifdef SRS_AUTO_SRT -#include -#include -#endif class SrsServer; class SrsConnection; @@ -213,10 +209,6 @@ private: SrsHttpHeartbeat* http_heartbeat; SrsIngester* ingester; SrsCoroutineManager* conn_manager; -#ifdef SRS_AUTO_SRT - // srt server - SRT_SERVER_PTR srt_ptr; -#endif private: // The pid file fd, lock the file write when server is running. // @remark the init.d script should cleanup the pid file, when stop service, @@ -287,10 +279,6 @@ private: virtual srs_error_t listen_http_api(); virtual srs_error_t listen_http_stream(); virtual srs_error_t listen_stream_caster(); -#ifdef SRS_AUTO_SRT - //start listen srt udp port - virtual srs_error_t listen_srt(); -#endif // Close the listeners for specified type, // Remove the listen object from manager. virtual void close_listeners(SrsListenerType type); diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 33009d9d4..150339f3d 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -48,6 +48,7 @@ using namespace std; #include #include #include +#include // pre-declare srs_error_t run_directly_or_daemon(); @@ -410,46 +411,17 @@ srs_error_t run_hybrid_server() { srs_error_t err = srs_success; - SrsServer* svr = new SrsServer(); - SrsAutoFree(SrsServer, svr); + SrsHybridServer* svr = new SrsHybridServer(); + SrsAutoFree(SrsHybridServer, svr); - // Initialize the whole system, set hooks to handle server level events. - if ((err = svr->initialize(NULL)) != srs_success) { - return srs_error_wrap(err, "server initialize"); - } - - if ((err = svr->initialize_st()) != srs_success) { - return srs_error_wrap(err, "initialize st"); - } - - if ((err = svr->initialize_signal()) != srs_success) { - return srs_error_wrap(err, "initialize signal"); - } - - if ((err = svr->acquire_pid_file()) != srs_success) { - return srs_error_wrap(err, "acquire pid file"); - } - - if ((err = svr->listen()) != srs_success) { - return srs_error_wrap(err, "listen"); - } - - if ((err = svr->register_signal()) != srs_success) { - return srs_error_wrap(err, "register signal"); - } - - if ((err = svr->http_handle()) != srs_success) { - return srs_error_wrap(err, "http handle"); - } - - if ((err = svr->ingest()) != srs_success) { - return srs_error_wrap(err, "ingest"); + if ((err = svr->initialize()) != srs_success) { + return srs_error_wrap(err, "hybrid initialize"); } - if ((err = svr->cycle()) != srs_success) { - return srs_error_wrap(err, "main cycle"); + if ((err = svr->run()) != srs_success) { + return srs_error_wrap(err, "hybrid run"); } - + return err; }