1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

fix bug of core

This commit is contained in:
winlin 2013-12-01 17:42:09 +08:00
parent 6af0794bab
commit 2695e4d0c6
2 changed files with 134 additions and 133 deletions

View file

@ -20,7 +20,7 @@ vhost __defaultVhost__ {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine ld{ engine ld {
enabled on; enabled on;
vfilter { vfilter {
vf 'drawtext=text=SimpleRtmpServer(SRS):x=10:y=10:fontcolor=#cccccc:fontfile=./doc/FreeSerifBold.ttf'; vf 'drawtext=text=SimpleRtmpServer(SRS):x=10:y=10:fontcolor=#cccccc:fontfile=./doc/FreeSerifBold.ttf';
@ -43,7 +43,7 @@ vhost __defaultVhost__ {
} }
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
engine sd{ engine sd {
enabled on; enabled on;
vfilter { vfilter {
vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2'; vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2';
@ -76,11 +76,11 @@ vhost dev {
hls_path ./objs/nginx/html; hls_path ./objs/nginx/html;
hls_fragment 5; hls_fragment 5;
hls_window 30; hls_window 30;
forward 127.0.0.1:19350?vhost=dev; forward 127.0.0.1:19350;
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine dev{ engine dev {
enabled on; enabled on;
vfilter { vfilter {
} }
@ -109,7 +109,7 @@ vhost mirror.transcode.vhost.com {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine mirror{ engine mirror {
enabled on; enabled on;
vfilter { vfilter {
vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2'; vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2';
@ -139,7 +139,7 @@ vhost drawtext.transcode.vhost.com {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine drawtext{ engine drawtext {
enabled on; enabled on;
vfilter { vfilter {
vf 'drawtext=text=SimpleRtmpServer(SRS):x=10:y=10:fontcolor=#cccccc:fontfile=./doc/FreeSerifBold.ttf'; vf 'drawtext=text=SimpleRtmpServer(SRS):x=10:y=10:fontcolor=#cccccc:fontfile=./doc/FreeSerifBold.ttf';
@ -169,7 +169,7 @@ vhost crop.transcode.vhost.com {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine crop{ engine crop {
enabled on; enabled on;
vfilter { vfilter {
vf 'crop=in_w-20:in_h-160:10:80'; vf 'crop=in_w-20:in_h-160:10:80';
@ -199,7 +199,7 @@ vhost logo.transcode.vhost.com {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine logo{ engine logo {
enabled on; enabled on;
vfilter { vfilter {
vf 'crop=200:100:10:10'; vf 'crop=200:100:10:10';
@ -237,7 +237,7 @@ vhost all.transcode.vhost.com {
# the transcode engine for matched stream. # the transcode engine for matched stream.
# all matched stream will transcoded to the following stream. # all matched stream will transcoded to the following stream.
# the transcode set name(ie. hd) is optional and not used. # the transcode set name(ie. hd) is optional and not used.
engine ffsuper{ engine ffsuper {
# whether the engine is enabled # whether the engine is enabled
# default: off. # default: off.
enabled on; enabled on;
@ -300,7 +300,7 @@ vhost all.transcode.vhost.com {
# [engine] the tanscode engine name. # [engine] the tanscode engine name.
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine]; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
engine ffhd{ engine ffhd {
enabled on; enabled on;
vcodec libx264; vcodec libx264;
vbitrate 1200; vbitrate 1200;
@ -318,9 +318,9 @@ vhost all.transcode.vhost.com {
achannels 2; achannels 2;
aparams { aparams {
} }
output rtmp://[vhost]:[port]/[app]/[stream]_ffhd; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
engine ffsd{ engine ffsd {
enabled on; enabled on;
vcodec libx264; vcodec libx264;
vbitrate 800; vbitrate 800;
@ -338,9 +338,9 @@ vhost all.transcode.vhost.com {
achannels 2; achannels 2;
aparams { aparams {
} }
output rtmp://[vhost]:[port]/[app]/[stream]_ffsd; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
engine fffast{ engine fffast {
enabled on; enabled on;
vcodec libx264; vcodec libx264;
vbitrate 300; vbitrate 300;
@ -358,7 +358,7 @@ vhost all.transcode.vhost.com {
achannels 2; achannels 2;
aparams { aparams {
} }
output rtmp://[vhost]:[port]/[app]/[stream]_fffast; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
} }
} }
@ -367,7 +367,7 @@ vhost ffempty.transcode.vhost.com {
transcode { transcode {
enabled on; enabled on;
ffmpeg ./research/ffempty/ffempty; ffmpeg ./research/ffempty/ffempty;
engine empty{ engine empty {
enabled on; enabled on;
vcodec libx264; vcodec libx264;
vbitrate 300; vbitrate 300;
@ -385,7 +385,7 @@ vhost ffempty.transcode.vhost.com {
achannels 2; achannels 2;
aparams { aparams {
} }
output rtmp://[vhost]:[port]/[app]/[stream]_empty; output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
} }
} }
} }
@ -396,7 +396,7 @@ vhost app.transcode.vhost.com {
transcode live { transcode live {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine fd{ engine {
enabled off; enabled off;
} }
} }
@ -408,13 +408,13 @@ vhost stream.transcode.vhost.com {
transcode live/livestream { transcode live/livestream {
enabled on; enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine fd{ engine {
enabled off; enabled off;
} }
} }
} }
# the vhost which forward publish streams. # the vhost which forward publish streams.
vhost forward.vhost.com { vhost same.vhost.forward.vhost.com {
# forward all publish stream to the specified server. # forward all publish stream to the specified server.
# this used to split/forward the current stream for cluster active-standby, # this used to split/forward the current stream for cluster active-standby,
# active-active for cdn to build high available fault tolerance system. # active-active for cdn to build high available fault tolerance system.
@ -425,7 +425,7 @@ vhost forward.vhost.com {
forward 127.0.0.1:1936 127.0.0.1:1937; forward 127.0.0.1:1936 127.0.0.1:1937;
} }
# the vhost which forward publish streams to other vhosts. # the vhost which forward publish streams to other vhosts.
vhost forward1.vhost.com { vhost change.vhost.forward.vhost.com {
forward 127.0.0.1:1936?vhost=forward2.vhost.com 127.0.0.1:1937?vhost=forward3.vhost.com; forward 127.0.0.1:1936?vhost=forward2.vhost.com 127.0.0.1:1937?vhost=forward3.vhost.com;
} }
# the vhost disabled. # the vhost disabled.

225
trunk/src/core/srs_core.cpp Normal file → Executable file
View file

@ -1,112 +1,113 @@
/* /*
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013 winlin Copyright (c) 2013 winlin
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so, the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions: subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include <srs_core.hpp> #include <srs_core.hpp>
#include <sys/time.h> #include <sys/time.h>
#include <netdb.h> #include <netdb.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <srs_core_log.hpp> #include <srs_core_log.hpp>
static int64_t _srs_system_time_us_cache = 0; static int64_t _srs_system_time_us_cache = 0;
int64_t srs_get_system_time_ms() int64_t srs_get_system_time_ms()
{ {
return _srs_system_time_us_cache / 1000; return _srs_system_time_us_cache / 1000;
} }
void srs_update_system_time_ms() void srs_update_system_time_ms()
{ {
timeval now; timeval now;
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
// we must convert the tv_sec/tv_usec to int64_t. // we must convert the tv_sec/tv_usec to int64_t.
_srs_system_time_us_cache = now.tv_sec * 1000 * 1000 + now.tv_usec; _srs_system_time_us_cache = now.tv_sec * 1000 * 1000 + now.tv_usec;
_srs_system_time_us_cache = srs_max(0, _srs_system_time_us_cache); _srs_system_time_us_cache = srs_max(0, _srs_system_time_us_cache);
} }
std::string srs_replace(std::string str, std::string old_str, std::string new_str) std::string srs_replace(std::string str, std::string old_str, std::string new_str)
{ {
std::string ret = str; std::string ret = str;
if (old_str == new_str) { if (old_str == new_str) {
return ret; return ret;
} }
size_t pos = 0; size_t pos = 0;
while ((pos = ret.find(old_str, pos)) != std::string::npos) { while ((pos = ret.find(old_str, pos)) != std::string::npos) {
ret = ret.replace(pos, old_str.length(), new_str); ret = ret.replace(pos, old_str.length(), new_str);
pos += new_str.length(); pos += new_str.length();
} }
return ret; return ret;
} }
std::string srs_dns_resolve(std::string host) std::string srs_dns_resolve(std::string host)
{ {
if (inet_addr(host.c_str()) != INADDR_NONE) { if (inet_addr(host.c_str()) != INADDR_NONE) {
return host; return host;
} }
hostent* answer = gethostbyname(host.c_str()); hostent* answer = gethostbyname(host.c_str());
if (answer == NULL) { if (answer == NULL) {
srs_error("dns resolve host %s error.", host.c_str()); srs_error("dns resolve host %s error.", host.c_str());
return ""; return "";
} }
char ipv4[16]; char ipv4[16];
memset(ipv4, 0, sizeof(ipv4)); memset(ipv4, 0, sizeof(ipv4));
for (int i = 0; i < answer->h_length; i++) { for (int i = 0; i < answer->h_length; i++) {
inet_ntop(AF_INET, answer->h_addr_list[i], ipv4, sizeof(ipv4)); inet_ntop(AF_INET, answer->h_addr_list[i], ipv4, sizeof(ipv4));
srs_info("dns resolve host %s to %s.", host.c_str(), ipv4); srs_info("dns resolve host %s to %s.", host.c_str(), ipv4);
break; break;
} }
return ipv4; return ipv4;
} }
void srs_vhost_resolve(std::string& vhost, std::string& app) void srs_vhost_resolve(std::string& vhost, std::string& app)
{ {
app = srs_replace(app, "...", "?"); app = srs_replace(app, "...", "?");
if ((pos = app.find("?")) == std::string::npos) { size_t pos = 0;
return; if ((pos = app.find("?")) == std::string::npos) {
} return;
}
std::string query = app.substr(pos + 1);
app = app.substr(0, pos); std::string query = app.substr(pos + 1);
app = app.substr(0, pos);
if ((pos = query.find("vhost?")) != std::string::npos
|| (pos = query.find("vhost=")) != std::string::npos if ((pos = query.find("vhost?")) != std::string::npos
|| (pos = query.find("Vhost?")) != std::string::npos || (pos = query.find("vhost=")) != std::string::npos
|| (pos = query.find("Vhost=")) != std::string::npos || (pos = query.find("Vhost?")) != std::string::npos
) { || (pos = query.find("Vhost=")) != std::string::npos
query = query.substr(pos + 6); ) {
if (!query.empty()) { query = query.substr(pos + 6);
vhost = query; if (!query.empty()) {
} vhost = query;
} }
} }
}