mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
Merge
This commit is contained in:
commit
76c9034f0b
14 changed files with 260 additions and 117 deletions
|
@ -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
|
||||
|
|
7
trunk/auto/reset_module.sh
Normal file
7
trunk/auto/reset_module.sh
Normal 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
33
trunk/configure
vendored
|
@ -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"
|
||||
|
|
|
@ -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=""
|
||||
|
|
|
@ -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=""
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -27,11 +27,22 @@ using namespace std;
|
|||
|
||||
#include <srs_kernel_error.hpp>
|
||||
#include <srs_kernel_log.hpp>
|
||||
#include <srs_kernel_utility.hpp>
|
||||
|
||||
#include <srs_protocol_kbps.hpp>
|
||||
|
||||
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<int, srs_utime_t>::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<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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<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
|
||||
|
|
|
@ -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<ISrsHybridServer*>::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<ISrsHybridServer*>::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()
|
||||
{
|
||||
return timer_;
|
||||
}
|
||||
|
||||
srs_error_t SrsHybridServer::on_timer(srs_utime_t interval, srs_utime_t tick)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
srs_error_t SrsHybridServer::notify(int event, 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.
|
||||
|
|
|
@ -49,11 +49,12 @@ public:
|
|||
};
|
||||
|
||||
// The hybrid server manager.
|
||||
class SrsHybridServer : public ISrsHourGlass
|
||||
class SrsHybridServer : public ISrsFastTimer
|
||||
{
|
||||
private:
|
||||
std::vector<ISrsHybridServer*> 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;
|
||||
|
|
|
@ -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<SrsUdpMuxListener*>::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<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;
|
||||
|
||||
|
|
|
@ -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<SrsUdpMuxListener*> 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.
|
||||
|
|
|
@ -46,6 +46,7 @@ using namespace std;
|
|||
#include <srs_service_http_conn.hpp>
|
||||
#include <srs_service_rtmp_conn.hpp>
|
||||
#include <srs_service_utility.hpp>
|
||||
#include <srs_app_config.hpp>
|
||||
|
||||
// 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.
|
||||
*/
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <srs_kernel_file.hpp>
|
||||
#include <srs_kernel_stream.hpp>
|
||||
#include <srs_core_autofree.hpp>
|
||||
#include <srs_app_config.hpp>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue