mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Merge branch 'develop' into min
This commit is contained in:
commit
7f0b3afc99
14 changed files with 143 additions and 37 deletions
|
@ -153,6 +153,9 @@ For previous versions, please read:
|
||||||
|
|
||||||
## V4 changes
|
## V4 changes
|
||||||
|
|
||||||
|
* v4.0, 2020-02-25, For [#1615][bug #1615], support default app(live) for vmix SRT. 4.0.9
|
||||||
|
* v4.0, 2020-02-21, For [#1598][bug #1598], support SLB health checking by TCP. 4.0.8
|
||||||
|
* v4.0, 2020-02-19, For [#1579][bug #1579], support rolling update of k8s. 4.0.7
|
||||||
* v4.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 4.0.6
|
* v4.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 4.0.6
|
||||||
* v4.0, 2020-02-18, For [#1579][bug #1579], support gracefully quit and force to. 4.0.5
|
* v4.0, 2020-02-18, For [#1579][bug #1579], support gracefully quit and force to. 4.0.5
|
||||||
* v4.0, 2020-02-13, SRT supports detail config for [DynamicEncoding](https://github.com/runner365/srt_encoder). 4.0.4
|
* v4.0, 2020-02-13, SRT supports detail config for [DynamicEncoding](https://github.com/runner365/srt_encoder). 4.0.4
|
||||||
|
@ -162,6 +165,8 @@ For previous versions, please read:
|
||||||
|
|
||||||
## V3 changes
|
## V3 changes
|
||||||
|
|
||||||
|
* v3.0, 2020-02-21, For [#1598][bug #1598], support SLB health checking by TCP. 3.0.123
|
||||||
|
* v3.0, 2020-02-21, Fix bug for librtmp client ipv4/ipv6 socket. 3.0.122
|
||||||
* v3.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 3.0.121
|
* v3.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 3.0.121
|
||||||
* v3.0, 2020-02-18, For [#1579][bug #1579], support force gracefully quit. 3.0.120
|
* v3.0, 2020-02-18, For [#1579][bug #1579], support force gracefully quit. 3.0.120
|
||||||
* v3.0, 2020-02-18, For [#1579][bug #1579], support gracefully quit. 3.0.119
|
* v3.0, 2020-02-18, For [#1579][bug #1579], support gracefully quit. 3.0.119
|
||||||
|
@ -1680,6 +1685,8 @@ Winlin
|
||||||
[bug #1595]: https://github.com/ossrs/srs/issues/1595
|
[bug #1595]: https://github.com/ossrs/srs/issues/1595
|
||||||
[bug #1601]: https://github.com/ossrs/srs/issues/1601
|
[bug #1601]: https://github.com/ossrs/srs/issues/1601
|
||||||
[bug #1579]: https://github.com/ossrs/srs/issues/1579
|
[bug #1579]: https://github.com/ossrs/srs/issues/1579
|
||||||
|
[bug #1598]: https://github.com/ossrs/srs/issues/1598
|
||||||
|
[bug #1615]: https://github.com/ossrs/srs/issues/1615
|
||||||
[bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx
|
[bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx
|
||||||
|
|
||||||
[exo #828]: https://github.com/google/ExoPlayer/pull/828
|
[exo #828]: https://github.com/google/ExoPlayer/pull/828
|
||||||
|
|
|
@ -72,6 +72,10 @@ work_dir ./;
|
||||||
# @reamrk do not support reload.
|
# @reamrk do not support reload.
|
||||||
# default: off
|
# default: off
|
||||||
asprocess off;
|
asprocess off;
|
||||||
|
# Whether client empty IP is ok, for example, health checking by SLB.
|
||||||
|
# If ok(on), we will ignore this connection without warnings or errors.
|
||||||
|
# default: on
|
||||||
|
empty_ip_ok on;
|
||||||
|
|
||||||
# For gracefully quit, wait for a while then close listeners,
|
# For gracefully quit, wait for a while then close listeners,
|
||||||
# because K8S notify SRS with SIGQUIT and update Service simultaneously,
|
# because K8S notify SRS with SIGQUIT and update Service simultaneously,
|
||||||
|
@ -286,6 +290,9 @@ srt_server {
|
||||||
connect_timeout 4000;
|
connect_timeout 4000;
|
||||||
peerlatency 300;
|
peerlatency 300;
|
||||||
recvlatency 300;
|
recvlatency 300;
|
||||||
|
# Default app for vmix, see https://github.com/ossrs/srs/pull/1615
|
||||||
|
# default: live
|
||||||
|
default_app live;
|
||||||
}
|
}
|
||||||
|
|
||||||
#############################################################################################
|
#############################################################################################
|
||||||
|
|
|
@ -76,8 +76,12 @@ srs_error_t SrsAppCasterFlv::initialize()
|
||||||
srs_error_t SrsAppCasterFlv::on_tcp_client(srs_netfd_t stfd)
|
srs_error_t SrsAppCasterFlv::on_tcp_client(srs_netfd_t stfd)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
string ip = srs_get_peer_ip(srs_netfd_fileno(stfd));
|
string ip = srs_get_peer_ip(srs_netfd_fileno(stfd));
|
||||||
|
if (ip.empty() && !_srs_config->empty_ip_ok()) {
|
||||||
|
srs_warn("empty ip for fd=%d", srs_netfd_fileno(stfd));
|
||||||
|
}
|
||||||
|
|
||||||
SrsHttpConn* conn = new SrsDynamicHttpConn(this, stfd, http_mux, ip);
|
SrsHttpConn* conn = new SrsDynamicHttpConn(this, stfd, http_mux, ip);
|
||||||
conns.push_back(conn);
|
conns.push_back(conn);
|
||||||
|
|
||||||
|
|
|
@ -3489,7 +3489,7 @@ srs_error_t SrsConfig::check_normal_config()
|
||||||
&& n != "http_server" && n != "stream_caster" && n != "srt_server"
|
&& n != "http_server" && n != "stream_caster" && n != "srt_server"
|
||||||
&& n != "utc_time" && n != "work_dir" && n != "asprocess"
|
&& n != "utc_time" && n != "work_dir" && n != "asprocess"
|
||||||
&& n != "ff_log_level" && n != "grace_final_wait" && n != "force_grace_quit"
|
&& n != "ff_log_level" && n != "grace_final_wait" && n != "force_grace_quit"
|
||||||
&& n != "grace_start_wait"
|
&& n != "grace_start_wait" && n != "empty_ip_ok"
|
||||||
) {
|
) {
|
||||||
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str());
|
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str());
|
||||||
}
|
}
|
||||||
|
@ -3529,7 +3529,8 @@ srs_error_t SrsConfig::check_normal_config()
|
||||||
if (n != "enabled" && n != "listen" && n != "maxbw"
|
if (n != "enabled" && n != "listen" && n != "maxbw"
|
||||||
&& n != "mss" && n != "latency" && n != "recvlatency"
|
&& n != "mss" && n != "latency" && n != "recvlatency"
|
||||||
&& n != "peerlatency" && n != "tlpkdrop" && n != "connect_timeout"
|
&& n != "peerlatency" && n != "tlpkdrop" && n != "connect_timeout"
|
||||||
&& n != "sendbuf" && n != "recvbuf" && n != "payloadsize") {
|
&& n != "sendbuf" && n != "recvbuf" && n != "payloadsize"
|
||||||
|
&& n != "default_app") {
|
||||||
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal srt_stream.%s", n.c_str());
|
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal srt_stream.%s", n.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4065,6 +4066,18 @@ bool SrsConfig::get_asprocess()
|
||||||
return SRS_CONF_PERFER_FALSE(conf->arg0());
|
return SRS_CONF_PERFER_FALSE(conf->arg0());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SrsConfig::empty_ip_ok()
|
||||||
|
{
|
||||||
|
static bool DEFAULT = true;
|
||||||
|
|
||||||
|
SrsConfDirective* conf = root->get("empty_ip_ok");
|
||||||
|
if (!conf || conf->arg0().empty()) {
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SRS_CONF_PERFER_TRUE(conf->arg0());
|
||||||
|
}
|
||||||
|
|
||||||
srs_utime_t SrsConfig::get_grace_start_wait()
|
srs_utime_t SrsConfig::get_grace_start_wait()
|
||||||
{
|
{
|
||||||
static srs_utime_t DEFAULT = 2300 * SRS_UTIME_MILLISECONDS;
|
static srs_utime_t DEFAULT = 2300 * SRS_UTIME_MILLISECONDS;
|
||||||
|
@ -6881,6 +6894,20 @@ int SrsConfig::get_srto_payloadsize() {
|
||||||
return atoi(conf->arg0().c_str());
|
return atoi(conf->arg0().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string SrsConfig::get_default_app_name() {
|
||||||
|
static string DEFAULT = "live";
|
||||||
|
SrsConfDirective* conf = root->get("srt_server");
|
||||||
|
if (!conf) {
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf = conf->get("default_app");
|
||||||
|
if (!conf || conf->arg0().empty()) {
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
return conf->arg0();
|
||||||
|
}
|
||||||
|
|
||||||
bool SrsConfig::get_http_stream_enabled()
|
bool SrsConfig::get_http_stream_enabled()
|
||||||
{
|
{
|
||||||
SrsConfDirective* conf = root->get("http_server");
|
SrsConfDirective* conf = root->get("http_server");
|
||||||
|
|
|
@ -468,6 +468,8 @@ public:
|
||||||
virtual std::string get_work_dir();
|
virtual std::string get_work_dir();
|
||||||
// Whether use asprocess mode.
|
// Whether use asprocess mode.
|
||||||
virtual bool get_asprocess();
|
virtual bool get_asprocess();
|
||||||
|
// Whether empty client IP is ok.
|
||||||
|
virtual bool empty_ip_ok();
|
||||||
// Get the start wait in ms for gracefully quit.
|
// Get the start wait in ms for gracefully quit.
|
||||||
virtual srs_utime_t get_grace_start_wait();
|
virtual srs_utime_t get_grace_start_wait();
|
||||||
// Get the final wait in ms for gracefully quit.
|
// Get the final wait in ms for gracefully quit.
|
||||||
|
@ -621,6 +623,8 @@ public:
|
||||||
virtual int get_srto_recvbuf();
|
virtual int get_srto_recvbuf();
|
||||||
// SRTO_PAYLOADSIZE
|
// SRTO_PAYLOADSIZE
|
||||||
virtual int get_srto_payloadsize();
|
virtual int get_srto_payloadsize();
|
||||||
|
// Get the default app.
|
||||||
|
virtual std::string get_default_app_name();
|
||||||
|
|
||||||
// http_hooks section
|
// http_hooks section
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -246,6 +246,9 @@ srs_error_t SrsRtspConn::do_cycle()
|
||||||
|
|
||||||
// retrieve ip of client.
|
// retrieve ip of client.
|
||||||
std::string ip = srs_get_peer_ip(srs_netfd_fileno(stfd));
|
std::string ip = srs_get_peer_ip(srs_netfd_fileno(stfd));
|
||||||
|
if (ip.empty() && !_srs_config->empty_ip_ok()) {
|
||||||
|
srs_warn("empty ip for fd=%d", srs_netfd_fileno(stfd));
|
||||||
|
}
|
||||||
srs_trace("rtsp: serve %s", ip.c_str());
|
srs_trace("rtsp: serve %s", ip.c_str());
|
||||||
|
|
||||||
// consume all rtsp messages.
|
// consume all rtsp messages.
|
||||||
|
|
|
@ -1232,6 +1232,10 @@ srs_error_t SrsServer::accept_client(SrsListenerType type, srs_netfd_t stfd)
|
||||||
SrsConnection* conn = NULL;
|
SrsConnection* conn = NULL;
|
||||||
|
|
||||||
if ((err = fd2conn(type, stfd, &conn)) != srs_success) {
|
if ((err = fd2conn(type, stfd, &conn)) != srs_success) {
|
||||||
|
if (srs_error_code(err) == ERROR_SOCKET_GET_PEER_IP && _srs_config->empty_ip_ok()) {
|
||||||
|
srs_close_stfd(stfd); srs_error_reset(err);
|
||||||
|
return srs_success;
|
||||||
|
}
|
||||||
return srs_error_wrap(err, "fd2conn");
|
return srs_error_wrap(err, "fd2conn");
|
||||||
}
|
}
|
||||||
srs_assert(conn);
|
srs_assert(conn);
|
||||||
|
|
|
@ -74,7 +74,7 @@ void srs_memory_report()
|
||||||
std::map<void*, SrsMemoryObject*>::iterator it;
|
std::map<void*, SrsMemoryObject*>::iterator it;
|
||||||
for (it = _srs_ptrs.begin(); it != _srs_ptrs.end(); ++it) {
|
for (it = _srs_ptrs.begin(); it != _srs_ptrs.end(); ++it) {
|
||||||
SrsMemoryObject* obj = it->second;
|
SrsMemoryObject* obj = it->second;
|
||||||
printf(" %s: %#"PRIx64", %dB\n", obj->category.c_str(), (int64_t)obj->ptr, obj->size);
|
printf(" %s: %#" PRIx64 ", %dB\n", obj->category.c_str(), (int64_t)obj->ptr, obj->size);
|
||||||
total += obj->size;
|
total += obj->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
#ifndef SRS_CORE_VERSION3_HPP
|
#ifndef SRS_CORE_VERSION3_HPP
|
||||||
#define SRS_CORE_VERSION3_HPP
|
#define SRS_CORE_VERSION3_HPP
|
||||||
|
|
||||||
#define SRS_VERSION3_REVISION 121
|
#define SRS_VERSION3_REVISION 123
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
#ifndef SRS_CORE_VERSION4_HPP
|
#ifndef SRS_CORE_VERSION4_HPP
|
||||||
#define SRS_CORE_VERSION4_HPP
|
#define SRS_CORE_VERSION4_HPP
|
||||||
|
|
||||||
#define SRS_VERSION4_REVISION 6
|
#define SRS_VERSION4_REVISION 9
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,8 +77,11 @@
|
||||||
#ifndef SRS_HIJACK_IO
|
#ifndef SRS_HIJACK_IO
|
||||||
struct SrsBlockSyncSocket
|
struct SrsBlockSyncSocket
|
||||||
{
|
{
|
||||||
|
int family;
|
||||||
SOCKET fd;
|
SOCKET fd;
|
||||||
int family;
|
SOCKET fdv4;
|
||||||
|
SOCKET fdv6;
|
||||||
|
// Bytes transmit.
|
||||||
int64_t rbytes;
|
int64_t rbytes;
|
||||||
int64_t sbytes;
|
int64_t sbytes;
|
||||||
// The send/recv timeout in ms.
|
// The send/recv timeout in ms.
|
||||||
|
@ -86,15 +89,26 @@ struct SrsBlockSyncSocket
|
||||||
int64_t stm;
|
int64_t stm;
|
||||||
|
|
||||||
SrsBlockSyncSocket() {
|
SrsBlockSyncSocket() {
|
||||||
|
family = AF_UNSPEC;
|
||||||
stm = rtm = SRS_UTIME_NO_TIMEOUT;
|
stm = rtm = SRS_UTIME_NO_TIMEOUT;
|
||||||
rbytes = sbytes = 0;
|
rbytes = sbytes = 0;
|
||||||
|
|
||||||
SOCKET_RESET(fd);
|
SOCKET_RESET(fd);
|
||||||
|
SOCKET_RESET(fdv4);
|
||||||
|
SOCKET_RESET(fdv6);
|
||||||
SOCKET_SETUP();
|
SOCKET_SETUP();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~SrsBlockSyncSocket() {
|
virtual ~SrsBlockSyncSocket() {
|
||||||
SOCKET_CLOSE(fd);
|
if (SOCKET_VALID(fd)) {
|
||||||
|
SOCKET_CLOSE(fd);
|
||||||
|
}
|
||||||
|
if (SOCKET_VALID(fdv4)) {
|
||||||
|
SOCKET_CLOSE(fdv4);
|
||||||
|
}
|
||||||
|
if (SOCKET_VALID(fdv6)) {
|
||||||
|
SOCKET_CLOSE(fdv6);
|
||||||
|
}
|
||||||
SOCKET_CLEANUP();
|
SOCKET_CLEANUP();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -112,19 +126,17 @@ int srs_hijack_io_create_socket(srs_hijack_io_t ctx, srs_rtmp_t owner)
|
||||||
{
|
{
|
||||||
SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
|
SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
|
||||||
|
|
||||||
skt->family = AF_INET6;
|
skt->family = AF_UNSPEC;
|
||||||
skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv6 first.
|
skt->fdv4 = ::socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if (!SOCKET_VALID(skt->fd)) {
|
skt->fdv6 = ::socket(AF_INET6, SOCK_STREAM, 0);
|
||||||
skt->family = AF_INET;
|
if (!SOCKET_VALID(skt->fdv4) && !SOCKET_VALID(skt->fdv4)) {
|
||||||
skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv4 instead, if IPv6 fails.
|
|
||||||
}
|
|
||||||
if (!SOCKET_VALID(skt->fd)) {
|
|
||||||
return ERROR_SOCKET_CREATE;
|
return ERROR_SOCKET_CREATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No TCP cache.
|
// No TCP cache.
|
||||||
int v = 1;
|
int v = 1;
|
||||||
setsockopt(skt->fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
|
setsockopt(skt->fdv4, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
|
||||||
|
setsockopt(skt->fdv6, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -137,7 +149,7 @@ int srs_hijack_io_connect(srs_hijack_io_t ctx, const char* server_ip, int port)
|
||||||
|
|
||||||
addrinfo hints;
|
addrinfo hints;
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = skt->family;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
addrinfo* r = NULL;
|
addrinfo* r = NULL;
|
||||||
|
@ -145,7 +157,16 @@ int srs_hijack_io_connect(srs_hijack_io_t ctx, const char* server_ip, int port)
|
||||||
if(getaddrinfo(server_ip, sport, (const addrinfo*)&hints, &r)) {
|
if(getaddrinfo(server_ip, sport, (const addrinfo*)&hints, &r)) {
|
||||||
return ERROR_SOCKET_CONNECT;
|
return ERROR_SOCKET_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skt->family = r->ai_family;
|
||||||
|
if (r->ai_family == AF_INET6) {
|
||||||
|
skt->fd = skt->fdv6;
|
||||||
|
SOCKET_RESET(skt->fdv6);
|
||||||
|
} else {
|
||||||
|
skt->fd = skt->fdv4;
|
||||||
|
SOCKET_RESET(skt->fdv4);
|
||||||
|
}
|
||||||
|
|
||||||
if(::connect(skt->fd, r->ai_addr, r->ai_addrlen) < 0){
|
if(::connect(skt->fd, r->ai_addr, r->ai_addrlen) < 0){
|
||||||
return ERROR_SOCKET_CONNECT;
|
return ERROR_SOCKET_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,7 @@ void srs_discovery_tc_url(string tcUrl, string& schema, string& host, string& vh
|
||||||
srs_vhost_resolve(vhost, stream, param);
|
srs_vhost_resolve(vhost, stream, param);
|
||||||
|
|
||||||
// Ignore when the param only contains the default vhost.
|
// Ignore when the param only contains the default vhost.
|
||||||
if (param == "?vhost="SRS_CONSTS_RTMP_DEFAULT_VHOST) {
|
if (param == "?vhost=" SRS_CONSTS_RTMP_DEFAULT_VHOST) {
|
||||||
param = "";
|
param = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,29 +3,46 @@
|
||||||
#include "stringex.hpp"
|
#include "stringex.hpp"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <srs_app_config.hpp>
|
||||||
|
|
||||||
bool is_streamid_valid(const std::string& streamid) {
|
bool is_streamid_valid(const std::string& streamid) {
|
||||||
int mode = ERR_SRT_MODE;
|
if (streamid.empty()) {
|
||||||
std::string url_subpash;
|
|
||||||
|
|
||||||
bool ret = get_streamid_info(streamid, mode, url_subpash);
|
|
||||||
if (!ret) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((mode != PULL_SRT_MODE) && (mode != PUSH_SRT_MODE)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (url_subpash.empty()) {
|
size_t pos = streamid.find(" ");
|
||||||
|
if (pos != streamid.npos) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mode;
|
||||||
|
std::string subpath;
|
||||||
|
|
||||||
|
bool ret = get_streamid_info(streamid, mode, subpath);
|
||||||
|
if (!ret) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mode != PUSH_SRT_MODE) && (mode != PULL_SRT_MODE)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> info_vec;
|
std::vector<std::string> info_vec;
|
||||||
string_split(url_subpash, "/", info_vec);
|
string_split(subpath, "/", info_vec);
|
||||||
if (info_vec.size() < 2) {
|
|
||||||
|
if (info_vec.size() < 2) {//it must be appname/stream at least.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto item : info_vec) {
|
||||||
|
if (item.empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pos = item.find(" ");
|
||||||
|
if (pos != item.npos) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,13 +63,21 @@ bool get_key_value(const std::string& info, std::string& key, std::string& value
|
||||||
}
|
}
|
||||||
|
|
||||||
//eg. streamid=#!::h:live/livestream,m:publish
|
//eg. streamid=#!::h:live/livestream,m:publish
|
||||||
bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_subpash) {
|
bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_subpath) {
|
||||||
std::vector<std::string> info_vec;
|
std::vector<std::string> info_vec;
|
||||||
std::string real_streamid;
|
std::string real_streamid;
|
||||||
|
|
||||||
size_t pos = streamid.find("#!::h");
|
mode = PUSH_SRT_MODE;
|
||||||
|
|
||||||
|
size_t pos = streamid.find("#!::");
|
||||||
if (pos != 0) {
|
if (pos != 0) {
|
||||||
return false;
|
pos = streamid.find("/");
|
||||||
|
if (pos == streamid.npos) {
|
||||||
|
url_subpath = _srs_config->get_default_app_name() + "/" + streamid;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
url_subpath = streamid;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
real_streamid = streamid.substr(4);
|
real_streamid = streamid.substr(4);
|
||||||
|
|
||||||
|
@ -71,7 +96,7 @@ bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key == "h") {
|
if (key == "h") {
|
||||||
url_subpash = value;//eg. h=live/stream
|
url_subpath = value;//eg. h=live/stream
|
||||||
} else if (key == "m") {
|
} else if (key == "m") {
|
||||||
std::string mode_str = string_lower(value);//m=publish or m=request
|
std::string mode_str = string_lower(value);//m=publish or m=request
|
||||||
if (mode_str == "publish") {
|
if (mode_str == "publish") {
|
||||||
|
@ -79,8 +104,7 @@ bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_
|
||||||
} else if (mode_str == "request") {
|
} else if (mode_str == "request") {
|
||||||
mode = PULL_SRT_MODE;
|
mode = PULL_SRT_MODE;
|
||||||
} else {
|
} else {
|
||||||
mode = ERR_SRT_MODE;
|
mode = PUSH_SRT_MODE;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} else {//not suport
|
} else {//not suport
|
||||||
continue;
|
continue;
|
||||||
|
@ -93,6 +117,7 @@ bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_
|
||||||
srt_conn::srt_conn(SRTSOCKET conn_fd, const std::string& streamid):_conn_fd(conn_fd),
|
srt_conn::srt_conn(SRTSOCKET conn_fd, const std::string& streamid):_conn_fd(conn_fd),
|
||||||
_streamid(streamid) {
|
_streamid(streamid) {
|
||||||
get_streamid_info(streamid, _mode, _url_subpath);
|
get_streamid_info(streamid, _mode, _url_subpath);
|
||||||
|
|
||||||
_update_timestamp = now_ms();
|
_update_timestamp = now_ms();
|
||||||
|
|
||||||
std::vector<std::string> path_vec;
|
std::vector<std::string> path_vec;
|
||||||
|
|
|
@ -256,7 +256,11 @@ void srt_server::on_work()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @see 2020-01-28 https://github.com/Haivision/srt/commit/b8c70ec801a56bea151ecce9c09c4ebb720c2f68#diff-fb66028e8746fea578788532533a296bR786
|
||||||
|
#if SRT_VERSION_MAJOR > 1 || SRT_VERSION_MINOR > 4 || SRT_VERSION_PATCH > 1
|
||||||
srt_epoll_clear_usocks(_pollid);
|
srt_epoll_clear_usocks(_pollid);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
SrtServerAdapter::SrtServerAdapter()
|
SrtServerAdapter::SrtServerAdapter()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue