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:
|
# params:
|
||||||
# $SRS_OBJS the objs directory to store the Makefile. ie. ./objs
|
# $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
|
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"
|
||||||
|
|
|
@ -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=""
|
|
||||||
|
|
|
@ -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=""
|
|
||||||
|
|
|
@ -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_MAIN:The source file in src/main directory, optional. (模块的main函数所在的cpp文件,在src/main目录。模块在main的文件。可以为空。)
|
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的文件。可以为空。)
|
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模块加入。可以为空。)
|
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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue