1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00
This commit is contained in:
winlin 2021-04-24 21:39:37 +08:00
commit 76c9034f0b
14 changed files with 260 additions and 117 deletions

View file

@ -1,4 +1,5 @@
# generate the module info to Makefile #
# Generate the module(in src, not modules) info to Makefile
# #
# params: # params:
# $SRS_OBJS the objs directory to store the Makefile. ie. ./objs # $SRS_OBJS the objs directory to store the Makefile. ie. ./objs

View file

@ -0,0 +1,7 @@
# Reset all variables for config of modules.
SRS_MODULE_NAME=()
SRS_MODULE_MAIN=()
SRS_MODULE_APP=()
SRS_MODULE_DEFINES=""

33
trunk/configure vendored
View file

@ -57,14 +57,11 @@ __mfiles=`find modules -name "config"` && for __mfile in $__mfiles; do
done done
# variables for makefile for all modules. # variables for makefile for all modules.
__mphonys="" && __mdefaults="" && __mcleanups="" && __makefiles="" __mphonys="" && __mdefaults="" && __mcleanups=""
# add each modules for application # add each modules for application
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
echo "install module at: $SRS_MODULE" echo "install module at: $SRS_MODULE"
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
if [[ $SRS_MODULE_MAKEFILE != "" ]]; then
__makefiles="$__makefiles $SRS_MODULE_MAKEFILE"
fi
if [[ 0 -ne ${#SRS_MODULE_MAIN[@]} ]]; then if [[ 0 -ne ${#SRS_MODULE_MAIN[@]} ]]; then
__mphonys="$__mphonys $SRS_MODULE_NAME" __mphonys="$__mphonys $SRS_MODULE_NAME"
__mdefaults="$__mdefaults $SRS_MODULE_NAME" __mdefaults="$__mdefaults $SRS_MODULE_NAME"
@ -299,7 +296,7 @@ fi
DEFINES="" DEFINES=""
# add each modules for app # add each modules for app
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
MODULE_FILES+=("${SRS_MODULE_APP[*]}") MODULE_FILES+=("${SRS_MODULE_APP[*]}")
DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}" DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}"
done done
@ -328,7 +325,7 @@ SERVER_OBJS="${MODULE_OBJS[@]}"
# #
#Main Module, for app from modules. #Main Module, for app from modules.
MODULE_ID="MAIN" MODULE_ID="MAIN"
MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL") MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL" "APP")
ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibGperfRoot} ${LibSSLRoot}) ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibGperfRoot} ${LibSSLRoot})
if [[ $SRS_RTC == YES ]]; then if [[ $SRS_RTC == YES ]]; then
ModuleLibIncs+=(${LibSrtpRoot}) ModuleLibIncs+=(${LibSrtpRoot})
@ -340,7 +337,7 @@ MODULE_FILES=()
DEFINES="" DEFINES=""
# add each modules for main # add each modules for main
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
MODULE_FILES+=("${SRS_MODULE_MAIN[*]}") MODULE_FILES+=("${SRS_MODULE_MAIN[*]}")
DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}" DEFINES="${DEFINES} ${SRS_MODULE_DEFINES}"
done done
@ -354,7 +351,7 @@ MAIN_OBJS="${MODULE_OBJS[@]}"
# all main entrances # all main entrances
MAIN_ENTRANCES=("srs_main_server") MAIN_ENTRANCES=("srs_main_server")
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
MAIN_ENTRANCES+=("${SRS_MODULE_MAIN[*]}") MAIN_ENTRANCES+=("${SRS_MODULE_MAIN[*]}")
done done
# #
@ -389,8 +386,8 @@ LINK_OPTIONS="${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}"
# srs: srs(simple rtmp server) over st(state-threads) # srs: srs(simple rtmp server) over st(state-threads)
BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh
# #
# For modules, without the app module. # For modules, with the app module.
MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${MAIN_OBJS[@]}" MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}"
ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibGperfFile}) ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibGperfFile})
if [[ $SRS_RTC == YES ]]; then if [[ $SRS_RTC == YES ]]; then
ModuleLibFiles+=(${LibSrtpFile}) ModuleLibFiles+=(${LibSrtpFile})
@ -400,7 +397,7 @@ if [[ $SRS_FFMPEG_FIT == YES ]]; then
fi fi
# #
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
# no SRS_MODULE_MAIN # no SRS_MODULE_MAIN
if [[ 0 -eq ${#SRS_MODULE_MAIN[@]} ]]; then continue; fi 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 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: # the real entry for all platform:
cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE} 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 @bash objs/_srs_build_summary.sh
help: help:
@ -556,14 +553,6 @@ ffmpeg:
END 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} cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
server: _prepare_dir server: _prepare_dir
@echo "Build the SRS server" @echo "Build the SRS server"
@ -572,7 +561,7 @@ server: _prepare_dir
END END
# generate all modules entry # generate all modules entry
for SRS_MODULE in ${SRS_MODULES[*]}; do for SRS_MODULE in ${SRS_MODULES[*]}; do
. $SRS_MODULE/config . auto/reset_module.sh && . $SRS_MODULE/config
cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE} cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
$SRS_MODULE_NAME: _prepare_dir server $SRS_MODULE_NAME: _prepare_dir server
@echo "Build the $SRS_MODULE_NAME over SRS" @echo "Build the $SRS_MODULE_NAME over SRS"

View file

@ -4,4 +4,3 @@ SRS_MODULE_NAME=("srs_hls_ingester")
SRS_MODULE_MAIN=("srs_main_ingest_hls") SRS_MODULE_MAIN=("srs_main_ingest_hls")
SRS_MODULE_APP=() SRS_MODULE_APP=()
SRS_MODULE_DEFINES="" SRS_MODULE_DEFINES=""
SRS_MODULE_MAKEFILE=""

View file

@ -4,4 +4,3 @@ SRS_MODULE_NAME=("srs_mp4_parser")
SRS_MODULE_MAIN=("srs_main_mp4_parser") SRS_MODULE_MAIN=("srs_main_mp4_parser")
SRS_MODULE_APP=() SRS_MODULE_APP=()
SRS_MODULE_DEFINES="" SRS_MODULE_DEFINES=""
SRS_MODULE_MAKEFILE=""

View file

@ -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文件). 2. There is a config file in home(目录下放一个config文件).
3. All variables in configure are available(所有的configure中的变量模块中可以使用). 3. All variables in configure are available(所有的configure中的变量模块中可以使用).
@ -8,20 +9,12 @@ The Variables in config(模块中需要定义变量,例如):
2. SRS_MODULE_MAINThe source file in src/main directory, optional. (模块的main函数所在的cpp文件在src/main目录。模块在main的文件。可以为空。) 2. SRS_MODULE_MAINThe source file in src/main directory, optional. (模块的main函数所在的cpp文件在src/main目录。模块在main的文件。可以为空。)
3. SRS_MODULE_APPThe source file in src/app directory, optional. (模块在src/app目录的源文件列表。模块在app的文件。可以为空。) 3. SRS_MODULE_APPThe source file in src/app directory, optional. (模块在src/app目录的源文件列表。模块在app的文件。可以为空。)
4. SRS_MODULE_DEFINES: The extra defined macros, optional. (模块编译时的额外宏定义。在app和main模块加入。可以为空。) 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(在配置开头必须清空这些变量): For example(下面是一个RTMFP服务器实例):
SRS_MODULE_NAME=()
SRS_MODULE_MAIN=()
SRS_MODULE_APP=()
SRS_MODULE_DEFINES=""
SRS_MODULE_MAKEFILE=""
For example(下面是一个实例):
SRS_MODULE_NAME=("srs_rtmfpd") SRS_MODULE_NAME=("srs_rtmfpd")
SRS_MODULE_MAIN=("srs_main_rtmfpd") SRS_MODULE_MAIN=("srs_main_rtmfpd")
SRS_MODULE_APP=("srs_app_rtfmpd") SRS_MODULE_APP=("srs_app_rtfmpd")
SRS_MODULE_DEFINES="-DRTMFPD" SRS_MODULE_DEFINES="-DRTMFPD"
SRS_MODULE_MAKEFILE="modules/rtmfpd/Makefile"
winlin, 2015.3 Winlin, 2015.3

View file

@ -27,11 +27,22 @@ using namespace std;
#include <srs_kernel_error.hpp> #include <srs_kernel_error.hpp>
#include <srs_kernel_log.hpp> #include <srs_kernel_log.hpp>
#include <srs_kernel_utility.hpp>
#include <srs_protocol_kbps.hpp> #include <srs_protocol_kbps.hpp>
SrsPps* _srs_pps_timer = new SrsPps(); 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() ISrsHourGlass::ISrsHourGlass()
{ {
} }
@ -89,6 +100,14 @@ srs_error_t SrsHourGlass::tick(int event, srs_utime_t interval)
return err; return err;
} }
void SrsHourGlass::untick(int event)
{
map<int, srs_utime_t>::iterator it = ticks.find(event);
if (it != ticks.end()) {
ticks.erase(it);
}
}
srs_error_t SrsHourGlass::cycle() srs_error_t SrsHourGlass::cycle()
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -119,3 +138,128 @@ srs_error_t SrsHourGlass::cycle()
return err; 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<int, ISrsFastTimer*>::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<int, ISrsFastTimer*>::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;
}

View file

@ -68,7 +68,7 @@ public:
// //
// // The hg will create a thread for timer. // // The hg will create a thread for timer.
// hg->start(); // hg->start();
class SrsHourGlass : virtual public ISrsCoroutineHandler class SrsHourGlass : public ISrsCoroutineHandler
{ {
private: private:
std::string label_; std::string label_;
@ -97,10 +97,55 @@ public:
// @param interval the interval in srs_utime_t of tick. // @param interval the interval in srs_utime_t of tick.
virtual srs_error_t tick(srs_utime_t interval); virtual srs_error_t tick(srs_utime_t interval);
virtual srs_error_t tick(int event, 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: public:
// Cycle the hourglass, which will sleep resolution every time. // Cycle the hourglass, which will sleep resolution every time.
// and call handler when ticked. // and call handler when ticked.
virtual srs_error_t cycle(); 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<int, ISrsFastTimer*> 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 #endif

View file

@ -139,11 +139,18 @@ ISrsHybridServer::~ISrsHybridServer()
SrsHybridServer::SrsHybridServer() SrsHybridServer::SrsHybridServer()
{ {
// Note that the timer depends on other global variables,
// so we MUST never create it in constructor.
timer_ = NULL; timer_ = NULL;
clock_monitor_ = new SrsClockWallMonitor();
} }
SrsHybridServer::~SrsHybridServer() SrsHybridServer::~SrsHybridServer()
{ {
srs_freep(clock_monitor_);
srs_freep(timer_);
vector<ISrsHybridServer*>::iterator it; vector<ISrsHybridServer*>::iterator it;
for (it = servers.begin(); it != servers.end(); ++it) { for (it = servers.begin(); it != servers.end(); ++it) {
ISrsHybridServer* server = *it; ISrsHybridServer* server = *it;
@ -166,10 +173,20 @@ srs_error_t SrsHybridServer::initialize()
return srs_error_wrap(err, "initialize st failed"); return srs_error_wrap(err, "initialize st failed");
} }
if ((err = setup_ticks()) != srs_success) { // Create global shared timer.
return srs_error_wrap(err, "tick"); 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<ISrsHybridServer*>::iterator it; vector<ISrsHybridServer*>::iterator it;
for (it = servers.begin(); it != servers.end(); ++it) { for (it = servers.begin(); it != servers.end(); ++it) {
ISrsHybridServer* server = *it; ISrsHybridServer* server = *it;
@ -220,67 +237,15 @@ SrsServerAdapter* SrsHybridServer::srs()
return NULL; return NULL;
} }
srs_error_t SrsHybridServer::setup_ticks() SrsFastTimer* SrsHybridServer::timer()
{ {
srs_error_t err = srs_success; return timer_;
// 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;
} }
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; 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. // Show statistics for RTC server.
SrsProcSelfStat* u = srs_get_self_proc_stat(); SrsProcSelfStat* u = srs_get_self_proc_stat();
// Resident Set Size: number of pages the process has in real memory. // Resident Set Size: number of pages the process has in real memory.

View file

@ -49,11 +49,12 @@ public:
}; };
// The hybrid server manager. // The hybrid server manager.
class SrsHybridServer : public ISrsHourGlass class SrsHybridServer : public ISrsFastTimer
{ {
private: private:
std::vector<ISrsHybridServer*> servers; std::vector<ISrsHybridServer*> servers;
SrsHourGlass* timer_; SrsFastTimer* timer_;
SrsClockWallMonitor* clock_monitor_;
public: public:
SrsHybridServer(); SrsHybridServer();
virtual ~SrsHybridServer(); virtual ~SrsHybridServer();
@ -65,10 +66,10 @@ public:
virtual void stop(); virtual void stop();
public: public:
virtual SrsServerAdapter* srs(); virtual SrsServerAdapter* srs();
// interface ISrsHourGlass SrsFastTimer* timer();
// interface ISrsFastTimer
private: private:
virtual srs_error_t setup_ticks(); srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick);
virtual srs_error_t notify(int event, srs_utime_t interval, srs_utime_t tick);
}; };
extern SrsHybridServer* _srs_hybrid; extern SrsHybridServer* _srs_hybrid;

View file

@ -247,7 +247,6 @@ SrsRtcServer::SrsRtcServer()
{ {
handler = NULL; handler = NULL;
hijacker = NULL; hijacker = NULL;
timer = new SrsHourGlass("server", this, 1 * SRS_UTIME_SECONDS);
_srs_config->subscribe(this); _srs_config->subscribe(this);
} }
@ -256,8 +255,6 @@ SrsRtcServer::~SrsRtcServer()
{ {
_srs_config->unsubscribe(this); _srs_config->unsubscribe(this);
srs_freep(timer);
if (true) { if (true) {
vector<SrsUdpMuxListener*>::iterator it; vector<SrsUdpMuxListener*>::iterator it;
for (it = listeners.begin(); it != listeners.end(); ++it) { for (it = listeners.begin(); it != listeners.end(); ++it) {
@ -271,14 +268,10 @@ srs_error_t SrsRtcServer::initialize()
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
if ((err = timer->tick(5 * SRS_UTIME_SECONDS)) != srs_success) { // The RTC server start a timer, do routines of RTC server.
return srs_error_wrap(err, "hourglass tick"); _srs_hybrid->timer()->subscribe(5 * SRS_UTIME_SECONDS, this);
}
if ((err = timer->start()) != srs_success) {
return srs_error_wrap(err, "start timer");
}
// Initialize the black hole.
if ((err = _srs_blackhole->initialize()) != srs_success) { if ((err = _srs_blackhole->initialize()) != srs_success) {
return srs_error_wrap(err, "black hole"); return srs_error_wrap(err, "black hole");
} }
@ -630,7 +623,7 @@ SrsRtcConnection* SrsRtcServer::find_session_by_username(const std::string& user
return dynamic_cast<SrsRtcConnection*>(conn); return dynamic_cast<SrsRtcConnection*>(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; srs_error_t err = srs_success;

View file

@ -85,10 +85,9 @@ public:
}; };
// The RTC server instance, listen UDP port, handle UDP packet, manage RTC connections. // 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: private:
SrsHourGlass* timer;
std::vector<SrsUdpMuxListener*> listeners; std::vector<SrsUdpMuxListener*> listeners;
ISrsRtcServerHandler* handler; ISrsRtcServerHandler* handler;
ISrsRtcServerHijacker* hijacker; ISrsRtcServerHijacker* hijacker;
@ -124,9 +123,9 @@ private:
); );
public: public:
SrsRtcConnection* find_session_by_username(const std::string& ufrag); SrsRtcConnection* find_session_by_username(const std::string& ufrag);
// interface ISrsHourGlass // interface ISrsFastTimer
public: private:
virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick); srs_error_t on_timer(srs_utime_t interval, srs_utime_t tick);
}; };
// The RTC server adapter. // The RTC server adapter.

View file

@ -46,6 +46,7 @@ using namespace std;
#include <srs_service_http_conn.hpp> #include <srs_service_http_conn.hpp>
#include <srs_service_rtmp_conn.hpp> #include <srs_service_rtmp_conn.hpp>
#include <srs_service_utility.hpp> #include <srs_service_utility.hpp>
#include <srs_app_config.hpp>
// pre-declare // pre-declare
srs_error_t proxy_hls2rtmp(std::string hls, std::string rtmp); 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); ISrsLog* _srs_log = new SrsConsoleLog(SrsLogLevelTrace, false);
ISrsContext* _srs_context = new SrsThreadContext(); ISrsContext* _srs_context = new SrsThreadContext();
// @global config object for app module.
SrsConfig* _srs_config = new SrsConfig();
/** /**
* main entrance. * main entrance.
*/ */

View file

@ -29,6 +29,7 @@
#include <srs_kernel_file.hpp> #include <srs_kernel_file.hpp>
#include <srs_kernel_stream.hpp> #include <srs_kernel_stream.hpp>
#include <srs_core_autofree.hpp> #include <srs_core_autofree.hpp>
#include <srs_app_config.hpp>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -40,6 +41,9 @@ using namespace std;
ISrsLog* _srs_log = new SrsConsoleLog(SrsLogLevelTrace, false); ISrsLog* _srs_log = new SrsConsoleLog(SrsLogLevelTrace, false);
ISrsContext* _srs_context = new SrsThreadContext(); 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 parse(std::string mp4_file, bool verbose)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;