diff --git a/trunk/auto/modules.sh b/trunk/auto/modules.sh index 66607f5c3..cffc0d9ba 100755 --- a/trunk/auto/modules.sh +++ b/trunk/auto/modules.sh @@ -1,4 +1,5 @@ -# generate the module info to Makefile +# +# Generate the module(in src, not modules) info to Makefile # # params: # $SRS_OBJS the objs directory to store the Makefile. ie. ./objs diff --git a/trunk/auto/reset_module.sh b/trunk/auto/reset_module.sh new file mode 100644 index 000000000..bc443040b --- /dev/null +++ b/trunk/auto/reset_module.sh @@ -0,0 +1,7 @@ + +# Reset all variables for config of modules. +SRS_MODULE_NAME=() +SRS_MODULE_MAIN=() +SRS_MODULE_APP=() +SRS_MODULE_DEFINES="" + diff --git a/trunk/configure b/trunk/configure index c4ebeb7cf..6d6ca4a11 100755 --- a/trunk/configure +++ b/trunk/configure @@ -57,14 +57,11 @@ __mfiles=`find modules -name "config"` && for __mfile in $__mfiles; do done # variables for makefile for all modules. -__mphonys="" && __mdefaults="" && __mcleanups="" && __makefiles="" +__mphonys="" && __mdefaults="" && __mcleanups="" # add each modules for application for SRS_MODULE in ${SRS_MODULES[*]}; do echo "install module at: $SRS_MODULE" - . $SRS_MODULE/config - if [[ $SRS_MODULE_MAKEFILE != "" ]]; then - __makefiles="$__makefiles $SRS_MODULE_MAKEFILE" - fi + . auto/reset_module.sh && . $SRS_MODULE/config if [[ 0 -ne ${#SRS_MODULE_MAIN[@]} ]]; then __mphonys="$__mphonys $SRS_MODULE_NAME" __mdefaults="$__mdefaults $SRS_MODULE_NAME" @@ -299,7 +296,7 @@ fi DEFINES="" # add each modules for app for SRS_MODULE in ${SRS_MODULES[*]}; do - . $SRS_MODULE/config + . auto/reset_module.sh && . $SRS_MODULE/config MODULE_FILES+=("${SRS_MODULE_APP[*]}") DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}" done @@ -328,7 +325,7 @@ SERVER_OBJS="${MODULE_OBJS[@]}" # #Main Module, for app from modules. MODULE_ID="MAIN" -MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL") +MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL" "APP") ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibGperfRoot} ${LibSSLRoot}) if [[ $SRS_RTC == YES ]]; then ModuleLibIncs+=(${LibSrtpRoot}) @@ -340,7 +337,7 @@ MODULE_FILES=() DEFINES="" # add each modules for main for SRS_MODULE in ${SRS_MODULES[*]}; do - . $SRS_MODULE/config + . auto/reset_module.sh && . $SRS_MODULE/config MODULE_FILES+=("${SRS_MODULE_MAIN[*]}") DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}" done @@ -354,7 +351,7 @@ MAIN_OBJS="${MODULE_OBJS[@]}" # all main entrances MAIN_ENTRANCES=("srs_main_server") for SRS_MODULE in ${SRS_MODULES[*]}; do - . $SRS_MODULE/config + . auto/reset_module.sh && . $SRS_MODULE/config MAIN_ENTRANCES+=("${SRS_MODULE_MAIN[*]}") done # @@ -389,8 +386,8 @@ LINK_OPTIONS="${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}" # srs: srs(simple rtmp server) over st(state-threads) BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh # -# For modules, without the app module. -MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${MAIN_OBJS[@]}" +# For modules, with the app module. +MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}" ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibGperfFile}) if [[ $SRS_RTC == YES ]]; then ModuleLibFiles+=(${LibSrtpFile}) @@ -400,7 +397,7 @@ if [[ $SRS_FFMPEG_FIT == YES ]]; then fi # for SRS_MODULE in ${SRS_MODULES[*]}; do - . $SRS_MODULE/config + . auto/reset_module.sh && . $SRS_MODULE/config # no SRS_MODULE_MAIN if [[ 0 -eq ${#SRS_MODULE_MAIN[@]} ]]; then continue; fi BUILD_KEY="$SRS_MODULE_NAME" APP_MAIN="${SRS_MODULE_MAIN[0]}" APP_NAME="$SRS_MODULE_NAME" . auto/apps.sh @@ -473,7 +470,7 @@ END # the real entry for all platform: cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE} -_default: server srs_ingest_hls utest __modules $__mdefaults +_default: server srs_ingest_hls utest $__mdefaults @bash objs/_srs_build_summary.sh help: @@ -556,14 +553,6 @@ ffmpeg: END -# for Makefile of all modules. -# depends on server, for some modules maybe use srs files. -echo "__modules: server" >> ${SRS_WORKDIR}/${SRS_MAKEFILE} -for MMF in ${__makefiles[*]}; do - echo " \$(MAKE) -f $MMF" >> ${SRS_WORKDIR}/${SRS_MAKEFILE} -done -echo "" >> ${SRS_WORKDIR}/${SRS_MAKEFILE} - cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE} server: _prepare_dir @echo "Build the SRS server" @@ -572,7 +561,7 @@ server: _prepare_dir END # generate all modules entry for SRS_MODULE in ${SRS_MODULES[*]}; do - . $SRS_MODULE/config + . auto/reset_module.sh && . $SRS_MODULE/config cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE} $SRS_MODULE_NAME: _prepare_dir server @echo "Build the $SRS_MODULE_NAME over SRS" diff --git a/trunk/modules/hls-ingester/config b/trunk/modules/hls-ingester/config index eda6a1363..57c803ba8 100644 --- a/trunk/modules/hls-ingester/config +++ b/trunk/modules/hls-ingester/config @@ -4,4 +4,3 @@ SRS_MODULE_NAME=("srs_hls_ingester") SRS_MODULE_MAIN=("srs_main_ingest_hls") SRS_MODULE_APP=() SRS_MODULE_DEFINES="" -SRS_MODULE_MAKEFILE="" diff --git a/trunk/modules/mp4-parser/config b/trunk/modules/mp4-parser/config index 7f9adfd66..5b2719545 100644 --- a/trunk/modules/mp4-parser/config +++ b/trunk/modules/mp4-parser/config @@ -4,4 +4,3 @@ SRS_MODULE_NAME=("srs_mp4_parser") SRS_MODULE_MAIN=("srs_main_mp4_parser") SRS_MODULE_APP=() SRS_MODULE_DEFINES="" -SRS_MODULE_MAKEFILE="" diff --git a/trunk/modules/readme.txt b/trunk/modules/readme.txt index 32d7891f0..b0f161ab6 100644 --- a/trunk/modules/readme.txt +++ b/trunk/modules/readme.txt @@ -1,5 +1,6 @@ -SRS Module Rules(SRS模块规则) -1. Each module in its seperate home directory(一个模块一个目录). + +SRS Application Module Rules(SRS应用模块规则) +1. Each module in its isolate home directory(一个模块一个目录). 2. There is a config file in home(目录下放一个config文件). 3. All variables in configure are available(所有的configure中的变量模块中可以使用). @@ -8,20 +9,12 @@ The Variables in config(模块中需要定义变量,例如): 2. SRS_MODULE_MAIN:The source file in src/main directory, optional. (模块的main函数所在的cpp文件,在src/main目录。模块在main的文件。可以为空。) 3. SRS_MODULE_APP:The source file in src/app directory, optional. (模块在src/app目录的源文件列表。模块在app的文件。可以为空。) 4. SRS_MODULE_DEFINES: The extra defined macros, optional. (模块编译时的额外宏定义。在app和main模块加入。可以为空。) -5. SRS_MODULE_MAKEFILE: The specified Makefile, optional. (模块的Makefile。在make时会执行这个Makefile。可以为空。) -Reset all Variables at the beginning(在配置开头必须清空这些变量): -SRS_MODULE_NAME=() -SRS_MODULE_MAIN=() -SRS_MODULE_APP=() -SRS_MODULE_DEFINES="" -SRS_MODULE_MAKEFILE="" - -For example(下面是一个实例): +For example(下面是一个RTMFP服务器实例): SRS_MODULE_NAME=("srs_rtmfpd") SRS_MODULE_MAIN=("srs_main_rtmfpd") SRS_MODULE_APP=("srs_app_rtfmpd") SRS_MODULE_DEFINES="-DRTMFPD" -SRS_MODULE_MAKEFILE="modules/rtmfpd/Makefile" -winlin, 2015.3 +Winlin, 2015.3 + diff --git a/trunk/src/app/srs_app_hourglass.cpp b/trunk/src/app/srs_app_hourglass.cpp index 5ebadd1ec..95ccfdd40 100644 --- a/trunk/src/app/srs_app_hourglass.cpp +++ b/trunk/src/app/srs_app_hourglass.cpp @@ -27,11 +27,22 @@ using namespace std; #include #include +#include #include SrsPps* _srs_pps_timer = new SrsPps(); +extern SrsPps* _srs_pps_clock_15ms; +extern SrsPps* _srs_pps_clock_20ms; +extern SrsPps* _srs_pps_clock_25ms; +extern SrsPps* _srs_pps_clock_30ms; +extern SrsPps* _srs_pps_clock_35ms; +extern SrsPps* _srs_pps_clock_40ms; +extern SrsPps* _srs_pps_clock_80ms; +extern SrsPps* _srs_pps_clock_160ms; +extern SrsPps* _srs_pps_timer_s; + ISrsHourGlass::ISrsHourGlass() { } @@ -89,6 +100,14 @@ srs_error_t SrsHourGlass::tick(int event, srs_utime_t interval) return err; } +void SrsHourGlass::untick(int event) +{ + map::iterator it = ticks.find(event); + if (it != ticks.end()) { + ticks.erase(it); + } +} + srs_error_t SrsHourGlass::cycle() { srs_error_t err = srs_success; @@ -119,3 +138,128 @@ srs_error_t SrsHourGlass::cycle() return err; } + +ISrsFastTimer::ISrsFastTimer() +{ +} + +ISrsFastTimer::~ISrsFastTimer() +{ +} + +SrsFastTimer::SrsFastTimer(std::string label, srs_utime_t resolution) +{ + timer_ = new SrsHourGlass(label, this, resolution); +} + +SrsFastTimer::~SrsFastTimer() +{ + srs_freep(timer_); +} + +srs_error_t SrsFastTimer::start() +{ + srs_error_t err = srs_success; + + if ((err = timer_->start()) != srs_success) { + return srs_error_wrap(err, "start timer"); + } + + return err; +} + +void SrsFastTimer::subscribe(srs_utime_t interval, ISrsFastTimer* timer) +{ + static int g_event = 0; + + int event = g_event++; + + // TODO: FIXME: Error leak. Change tick to void in future. + timer_->tick(event, interval); + + handlers_[event] = timer; +} + +void SrsFastTimer::unsubscribe(ISrsFastTimer* timer) +{ + for (map::iterator it = handlers_.begin(); it != handlers_.end();) { + if (it->second != timer) { + ++it; + continue; + } + + handlers_.erase(it++); + + int event = it->first; + timer_->untick(event); + } +} + +srs_error_t SrsFastTimer::notify(int event, srs_utime_t interval, srs_utime_t tick) +{ + srs_error_t err = srs_success; + + for (map::iterator it = handlers_.begin(); it != handlers_.end(); ++it) { + ISrsFastTimer* timer = it->second; + + if (event != it->first) { + continue; + } + + if ((err = timer->on_timer(interval, tick)) != srs_success) { + return srs_error_wrap(err, "tick for event=%d, interval=%dms, tick=%dms", + event, srsu2msi(interval), srsu2msi(tick)); + } + + break; + } + + return err; +} + +SrsClockWallMonitor::SrsClockWallMonitor() +{ +} + +SrsClockWallMonitor::~SrsClockWallMonitor() +{ +} + +srs_error_t SrsClockWallMonitor::on_timer(srs_utime_t interval, srs_utime_t tick) +{ + srs_error_t err = srs_success; + + static srs_utime_t clock = 0; + + srs_utime_t now = srs_update_system_time(); + if (!clock) { + clock = now; + return err; + } + + srs_utime_t elapsed = now - clock; + clock = now; + + if (elapsed <= 15 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_15ms->sugar; + } else if (elapsed <= 21 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_20ms->sugar; + } else if (elapsed <= 25 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_25ms->sugar; + } else if (elapsed <= 30 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_30ms->sugar; + } else if (elapsed <= 35 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_35ms->sugar; + } else if (elapsed <= 40 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_40ms->sugar; + } else if (elapsed <= 80 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_80ms->sugar; + } else if (elapsed <= 160 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_160ms->sugar; + } else { + ++_srs_pps_timer_s->sugar; + } + + return err; +} + diff --git a/trunk/src/app/srs_app_hourglass.hpp b/trunk/src/app/srs_app_hourglass.hpp index 82b3ccf8f..d0b11c024 100644 --- a/trunk/src/app/srs_app_hourglass.hpp +++ b/trunk/src/app/srs_app_hourglass.hpp @@ -68,7 +68,7 @@ public: // // // The hg will create a thread for timer. // hg->start(); -class SrsHourGlass : virtual public ISrsCoroutineHandler +class SrsHourGlass : public ISrsCoroutineHandler { private: std::string label_; @@ -97,10 +97,55 @@ public: // @param interval the interval in srs_utime_t of tick. virtual srs_error_t tick(srs_utime_t interval); virtual srs_error_t tick(int event, srs_utime_t interval); + // Remove the tick by event. + void untick(int event); public: // Cycle the hourglass, which will sleep resolution every time. // and call handler when ticked. virtual srs_error_t cycle(); }; +// The handler for fast timer. +class ISrsFastTimer +{ +public: + ISrsFastTimer(); + virtual ~ISrsFastTimer(); +public: + // Tick when timer is active. + virtual srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick) = 0; +}; + +// The fast timer, shared by objects, for high performance. +// For example, we should never start a timer for each connection or publisher or player, +// instead, we should start only one fast timer in server. +class SrsFastTimer : public ISrsHourGlass +{ +private: + SrsHourGlass* timer_; + std::map handlers_; +public: + SrsFastTimer(std::string label, srs_utime_t resolution); + virtual ~SrsFastTimer(); +public: + srs_error_t start(); +public: + void subscribe(srs_utime_t interval, ISrsFastTimer* timer); + void unsubscribe(ISrsFastTimer* timer); +// Interface ISrsHourGlass +private: + virtual srs_error_t notify(int event, srs_utime_t interval, srs_utime_t tick); +}; + +// To monitor the system wall clock timer deviation. +class SrsClockWallMonitor : public ISrsFastTimer +{ +public: + SrsClockWallMonitor(); + virtual ~SrsClockWallMonitor(); +// interface ISrsFastTimer +private: + srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick); +}; + #endif diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 6569d3f0b..7d691448e 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -139,11 +139,18 @@ ISrsHybridServer::~ISrsHybridServer() SrsHybridServer::SrsHybridServer() { + // Note that the timer depends on other global variables, + // so we MUST never create it in constructor. timer_ = NULL; + + clock_monitor_ = new SrsClockWallMonitor(); } SrsHybridServer::~SrsHybridServer() { + srs_freep(clock_monitor_); + srs_freep(timer_); + vector::iterator it; for (it = servers.begin(); it != servers.end(); ++it) { ISrsHybridServer* server = *it; @@ -166,10 +173,20 @@ srs_error_t SrsHybridServer::initialize() return srs_error_wrap(err, "initialize st failed"); } - if ((err = setup_ticks()) != srs_success) { - return srs_error_wrap(err, "tick"); + // Create global shared timer. + timer_ = new SrsFastTimer("hybrid", 20 * SRS_UTIME_MILLISECONDS); + + // Start the timer first. + if ((err = timer_->start()) != srs_success) { + return srs_error_wrap(err, "start timer"); } + // The hybrid server start a timer, do routines of hybrid server. + timer_->subscribe(5 * SRS_UTIME_SECONDS, this); + + // A monitor to check the clock wall deviation, per clock tick. + timer_->subscribe(20 * SRS_UTIME_MILLISECONDS, clock_monitor_); + vector::iterator it; for (it = servers.begin(); it != servers.end(); ++it) { ISrsHybridServer* server = *it; @@ -220,67 +237,15 @@ SrsServerAdapter* SrsHybridServer::srs() return NULL; } -srs_error_t SrsHybridServer::setup_ticks() +SrsFastTimer* SrsHybridServer::timer() { - srs_error_t err = srs_success; - - // Start timer for system global works. - timer_ = new SrsHourGlass("hybrid", this, 20 * SRS_UTIME_MILLISECONDS); - - if ((err = timer_->tick(1, 20 * SRS_UTIME_MILLISECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - - if ((err = timer_->tick(2, 5 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - - if ((err = timer_->start()) != srs_success) { - return srs_error_wrap(err, "start"); - } - - return err; + return timer_; } -srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t tick) +srs_error_t SrsHybridServer::on_timer(srs_utime_t interval, srs_utime_t tick) { srs_error_t err = srs_success; - // Update system wall clock. - if (event == 1) { - static srs_utime_t clock = 0; - - srs_utime_t now = srs_update_system_time(); - if (!clock) { - clock = now; - return err; - } - - srs_utime_t elapsed = now - clock; - clock = now; - - if (elapsed <= 15 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_15ms->sugar; - } else if (elapsed <= 21 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_20ms->sugar; - } else if (elapsed <= 25 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_25ms->sugar; - } else if (elapsed <= 30 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_30ms->sugar; - } else if (elapsed <= 35 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_35ms->sugar; - } else if (elapsed <= 40 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_40ms->sugar; - } else if (elapsed <= 80 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_80ms->sugar; - } else if (elapsed <= 160 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_160ms->sugar; - } else { - ++_srs_pps_timer_s->sugar; - } - return err; - } - // Show statistics for RTC server. SrsProcSelfStat* u = srs_get_self_proc_stat(); // Resident Set Size: number of pages the process has in real memory. diff --git a/trunk/src/app/srs_app_hybrid.hpp b/trunk/src/app/srs_app_hybrid.hpp index 88241622b..77b774b6c 100644 --- a/trunk/src/app/srs_app_hybrid.hpp +++ b/trunk/src/app/srs_app_hybrid.hpp @@ -49,11 +49,12 @@ public: }; // The hybrid server manager. -class SrsHybridServer : public ISrsHourGlass +class SrsHybridServer : public ISrsFastTimer { private: std::vector servers; - SrsHourGlass* timer_; + SrsFastTimer* timer_; + SrsClockWallMonitor* clock_monitor_; public: SrsHybridServer(); virtual ~SrsHybridServer(); @@ -65,10 +66,10 @@ public: virtual void stop(); public: virtual SrsServerAdapter* srs(); -// interface ISrsHourGlass + SrsFastTimer* timer(); +// interface ISrsFastTimer private: - virtual srs_error_t setup_ticks(); - virtual srs_error_t notify(int event, srs_utime_t interval, srs_utime_t tick); + srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick); }; extern SrsHybridServer* _srs_hybrid; diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index 311da5050..4ba4e6ff4 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -247,7 +247,6 @@ SrsRtcServer::SrsRtcServer() { handler = NULL; hijacker = NULL; - timer = new SrsHourGlass("server", this, 1 * SRS_UTIME_SECONDS); _srs_config->subscribe(this); } @@ -256,8 +255,6 @@ SrsRtcServer::~SrsRtcServer() { _srs_config->unsubscribe(this); - srs_freep(timer); - if (true) { vector::iterator it; for (it = listeners.begin(); it != listeners.end(); ++it) { @@ -271,14 +268,10 @@ srs_error_t SrsRtcServer::initialize() { srs_error_t err = srs_success; - if ((err = timer->tick(5 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "hourglass tick"); - } - - if ((err = timer->start()) != srs_success) { - return srs_error_wrap(err, "start timer"); - } + // The RTC server start a timer, do routines of RTC server. + _srs_hybrid->timer()->subscribe(5 * SRS_UTIME_SECONDS, this); + // Initialize the black hole. if ((err = _srs_blackhole->initialize()) != srs_success) { return srs_error_wrap(err, "black hole"); } @@ -630,7 +623,7 @@ SrsRtcConnection* SrsRtcServer::find_session_by_username(const std::string& user return dynamic_cast(conn); } -srs_error_t SrsRtcServer::notify(int type, srs_utime_t interval, srs_utime_t tick) +srs_error_t SrsRtcServer::on_timer(srs_utime_t interval, srs_utime_t tick) { srs_error_t err = srs_success; diff --git a/trunk/src/app/srs_app_rtc_server.hpp b/trunk/src/app/srs_app_rtc_server.hpp index 16aa12857..075b9d1ed 100644 --- a/trunk/src/app/srs_app_rtc_server.hpp +++ b/trunk/src/app/srs_app_rtc_server.hpp @@ -85,10 +85,9 @@ public: }; // The RTC server instance, listen UDP port, handle UDP packet, manage RTC connections. -class SrsRtcServer : virtual public ISrsUdpMuxHandler, virtual public ISrsHourGlass, virtual public ISrsReloadHandler +class SrsRtcServer : public ISrsUdpMuxHandler, public ISrsFastTimer, public ISrsReloadHandler { private: - SrsHourGlass* timer; std::vector listeners; ISrsRtcServerHandler* handler; ISrsRtcServerHijacker* hijacker; @@ -124,9 +123,9 @@ private: ); public: SrsRtcConnection* find_session_by_username(const std::string& ufrag); -// interface ISrsHourGlass -public: - virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick); +// interface ISrsFastTimer +private: + srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick); }; // The RTC server adapter. diff --git a/trunk/src/main/srs_main_ingest_hls.cpp b/trunk/src/main/srs_main_ingest_hls.cpp index 8bacabb45..cbc69119b 100644 --- a/trunk/src/main/srs_main_ingest_hls.cpp +++ b/trunk/src/main/srs_main_ingest_hls.cpp @@ -46,6 +46,7 @@ using namespace std; #include #include #include +#include // pre-declare srs_error_t proxy_hls2rtmp(std::string hls, std::string rtmp); @@ -54,6 +55,9 @@ srs_error_t proxy_hls2rtmp(std::string hls, std::string rtmp); ISrsLog* _srs_log = new SrsConsoleLog(SrsLogLevelTrace, false); ISrsContext* _srs_context = new SrsThreadContext(); +// @global config object for app module. +SrsConfig* _srs_config = new SrsConfig(); + /** * main entrance. */ diff --git a/trunk/src/main/srs_main_mp4_parser.cpp b/trunk/src/main/srs_main_mp4_parser.cpp index 5ce205fb5..d9ecc36e5 100644 --- a/trunk/src/main/srs_main_mp4_parser.cpp +++ b/trunk/src/main/srs_main_mp4_parser.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,9 @@ using namespace std; ISrsLog* _srs_log = new SrsConsoleLog(SrsLogLevelTrace, false); ISrsContext* _srs_context = new SrsThreadContext(); +// @global config object for app module. +SrsConfig* _srs_config = new SrsConfig(); + srs_error_t parse(std::string mp4_file, bool verbose) { srs_error_t err = srs_success;