From 44bc7976ac60970d24d13bae657db07dfee28b46 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 19 May 2015 18:06:20 +0800 Subject: [PATCH] merge from bravo system, add the rtmfp to bms(commercial srs). 2.0.163. --- README.md | 1 + .../srs_xcode.xcodeproj/project.pbxproj | 8 +- trunk/src/app/srs_app_config.cpp | 14 +- trunk/src/app/srs_app_reload.cpp | 5 + trunk/src/app/srs_app_reload.hpp | 2 + trunk/src/app/srs_app_rtmp_conn.cpp | 28 +-- trunk/src/app/srs_app_server.cpp | 164 ++++++++++-------- trunk/src/app/srs_app_server.hpp | 50 ++++-- trunk/src/core/srs_core.hpp | 2 +- trunk/src/main/srs_main_ingest_hls.cpp | 8 +- trunk/src/main/srs_main_server.cpp | 8 +- trunk/src/protocol/srs_rtmp_sdk.cpp | 30 ---- trunk/src/protocol/srs_rtmp_sdk.hpp | 30 ++++ trunk/src/protocol/srs_rtmp_stack.cpp | 101 ----------- trunk/src/protocol/srs_rtmp_stack.hpp | 104 +++++++++++ trunk/src/protocol/srs_rtmp_utility.cpp | 28 +-- trunk/src/protocol/srs_rtmp_utility.hpp | 4 +- 17 files changed, 317 insertions(+), 270 deletions(-) diff --git a/README.md b/README.md index fab5c9d27..2f136b943 100755 --- a/README.md +++ b/README.md @@ -562,6 +562,7 @@ Supported operating systems and hardware: ### SRS 2.0 history +* v2.0, 2015-05-19, merge from bravo system, add the rtmfp to bms(commercial srs). 2.0.163. * v2.0, 2015-05-10, support push flv stream over HTTP POST to SRS. * v2.0, 2015-04-20, support ingest hls live stream to RTMP. * v2.0, 2015-04-15, for [#383](https://github.com/simple-rtmp-server/srs/issues/383), support mix_correct algorithm. 2.0.161. diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj index 86c640b4c..6daf2f9b7 100644 --- a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj +++ b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj @@ -514,12 +514,12 @@ 3C12324B1AAE81CE00CE8F6C /* app */ = { isa = PBXGroup; children = ( - 3C28EDDD1AF5C43F00A3AEAC /* srs_app_caster_flv.cpp */, - 3C28EDDE1AF5C43F00A3AEAC /* srs_app_caster_flv.hpp */, 3CD88B3D1ACA9C58000359E0 /* srs_app_async_call.cpp */, 3CD88B3E1ACA9C58000359E0 /* srs_app_async_call.hpp */, 3C12324C1AAE81D900CE8F6C /* srs_app_bandwidth.cpp */, 3C12324D1AAE81D900CE8F6C /* srs_app_bandwidth.hpp */, + 3C28EDDD1AF5C43F00A3AEAC /* srs_app_caster_flv.cpp */, + 3C28EDDE1AF5C43F00A3AEAC /* srs_app_caster_flv.hpp */, 3C12324E1AAE81D900CE8F6C /* srs_app_config.cpp */, 3C12324F1AAE81D900CE8F6C /* srs_app_config.hpp */, 3C1232501AAE81D900CE8F6C /* srs_app_conn.cpp */, @@ -536,10 +536,10 @@ 3C12325B1AAE81D900CE8F6C /* srs_app_ffmpeg.hpp */, 3C12325C1AAE81D900CE8F6C /* srs_app_forward.cpp */, 3C12325D1AAE81D900CE8F6C /* srs_app_forward.hpp */, - 3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */, - 3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */, 3C1EE6AC1AB1055800576EE9 /* srs_app_hds.cpp */, 3C1EE6AD1AB1055800576EE9 /* srs_app_hds.hpp */, + 3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */, + 3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */, 3C1232601AAE81D900CE8F6C /* srs_app_hls.cpp */, 3C1232611AAE81D900CE8F6C /* srs_app_hls.hpp */, 3C1232621AAE81D900CE8F6C /* srs_app_http_api.cpp */, diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 59aec4328..356b85bab 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -441,10 +441,22 @@ int SrsConfig::reload_conf(SrsConfig* conf) // daemon // // always support reload without additional code: - // chunk_size, ff_log_dir, max_connections, + // chunk_size, ff_log_dir, // bandcheck, http_hooks, heartbeat, // token_traverse, debug_srs_upnode, // security + + // merge config: max_connections + if (!srs_directive_equals(root->get("max_connections"), old_root->get("max_connections"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_max_conns()) != ERROR_SUCCESS) { + srs_error("notify subscribes reload max_connections failed. ret=%d", ret); + return ret; + } + } + srs_trace("reload max_connections success."); + } // merge config: listen if (!srs_directive_equals(root->get("listen"), old_root->get("listen"))) { diff --git a/trunk/src/app/srs_app_reload.cpp b/trunk/src/app/srs_app_reload.cpp index ffd1868b1..ff856d344 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -40,6 +40,11 @@ int ISrsReloadHandler::on_reload_listen() return ERROR_SUCCESS; } +int ISrsReloadHandler::on_reload_max_conns() +{ + return ERROR_SUCCESS; +} + int ISrsReloadHandler::on_reload_pid() { return ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index 2e9ad3d81..8b6e9e4d8 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -44,6 +44,7 @@ public: ISrsReloadHandler(); virtual ~ISrsReloadHandler(); public: + virtual int on_reload_max_conns(); virtual int on_reload_listen(); virtual int on_reload_pid(); virtual int on_reload_log_tank(); @@ -55,6 +56,7 @@ public: virtual int on_reload_http_stream_enabled(); virtual int on_reload_http_stream_disabled(); virtual int on_reload_http_stream_updated(); +public: virtual int on_reload_vhost_http_updated(); virtual int on_reload_vhost_http_remux_updated(); virtual int on_reload_vhost_added(std::string vhost); diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 6b0583f49..efadfa969 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -1068,24 +1068,24 @@ int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, SrsCommonMessag return ret; } - // pause or other msg. + // pause SrsPausePacket* pause = dynamic_cast(pkt); - if (!pause) { - srs_info("ignore all amf0/amf3 command except pause."); + if (pause) { + if ((ret = rtmp->on_play_client_pause(res->stream_id, pause->is_pause)) != ERROR_SUCCESS) { + srs_error("rtmp process play client pause failed. ret=%d", ret); + return ret; + } + + if ((ret = consumer->on_play_client_pause(pause->is_pause)) != ERROR_SUCCESS) { + srs_error("consumer process play client pause failed. ret=%d", ret); + return ret; + } + srs_info("process pause success, is_pause=%d, time=%d.", pause->is_pause, pause->time_ms); return ret; } - if ((ret = rtmp->on_play_client_pause(res->stream_id, pause->is_pause)) != ERROR_SUCCESS) { - srs_error("rtmp process play client pause failed. ret=%d", ret); - return ret; - } - - if ((ret = consumer->on_play_client_pause(pause->is_pause)) != ERROR_SUCCESS) { - srs_error("consumer process play client pause failed. ret=%d", ret); - return ret; - } - srs_info("process pause success, is_pause=%d, time=%d.", pause->is_pause, pause->time_ms); - + // other msg. + srs_info("ignore all amf0/amf3 command except pause and video control."); return ret; } diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 9b06c8a9d..d91b5101d 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -113,23 +113,23 @@ std::string srs_listener_type2string(SrsListenerType type) } } -SrsListener::SrsListener(SrsServer* server, SrsListenerType type) +SrsListener::SrsListener(SrsServer* svr, SrsListenerType t) { - _port = 0; - _server = server; - _type = type; + port = 0; + server = svr; + type = t; } SrsListener::~SrsListener() { } -SrsListenerType SrsListener::type() +SrsListenerType SrsListener::listen_type() { - return _type; + return type; } -SrsStreamListener::SrsStreamListener(SrsServer* server, SrsListenerType type) : SrsListener(server, type) +SrsStreamListener::SrsStreamListener(SrsServer* svr, SrsListenerType t) : SrsListener(svr, t) { listener = NULL; } @@ -139,12 +139,12 @@ SrsStreamListener::~SrsStreamListener() srs_freep(listener); } -int SrsStreamListener::listen(string ip, int port) +int SrsStreamListener::listen(string i, int p) { int ret = ERROR_SUCCESS; - _ip = ip; - _port = port; + ip = i; + port = p; srs_freep(listener); listener = new SrsTcpListener(this, ip, port); @@ -158,7 +158,7 @@ int SrsStreamListener::listen(string ip, int port) "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", pthread->cid(), _srs_context->get_id(), _port, _type, fd, ip.c_str(), port); - srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(_type).c_str(), ip.c_str(), _port, listener->fd()); + srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); return ret; } @@ -167,7 +167,7 @@ int SrsStreamListener::on_tcp_client(st_netfd_t stfd) { int ret = ERROR_SUCCESS; - if ((ret = _server->accept_client(_type, stfd)) != ERROR_SUCCESS) { + if ((ret = server->accept_client(type, stfd)) != ERROR_SUCCESS) { srs_warn("accept client error. ret=%d", ret); return ret; } @@ -176,14 +176,14 @@ int SrsStreamListener::on_tcp_client(st_netfd_t stfd) } #ifdef SRS_AUTO_STREAM_CASTER -SrsRtspListener::SrsRtspListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c) : SrsListener(server, type) +SrsRtspListener::SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t) { listener = NULL; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerRtsp); - if (_type == SrsListenerRtsp) { + srs_assert(type == SrsListenerRtsp); + if (type == SrsListenerRtsp) { caster = new SrsRtspCaster(c); } } @@ -194,16 +194,16 @@ SrsRtspListener::~SrsRtspListener() srs_freep(listener); } -int SrsRtspListener::listen(string ip, int port) +int SrsRtspListener::listen(string i, int p) { int ret = ERROR_SUCCESS; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerRtsp); + srs_assert(type == SrsListenerRtsp); - _ip = ip; - _port = port; + ip = i; + port = p; srs_freep(listener); listener = new SrsTcpListener(this, ip, port); @@ -215,9 +215,9 @@ int SrsRtspListener::listen(string ip, int port) srs_info("listen thread cid=%d, current_cid=%d, " "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", - pthread->cid(), _srs_context->get_id(), _port, _type, fd, ip.c_str(), port); + pthread->cid(), _srs_context->get_id(), port, type, fd, ip.c_str(), port); - srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(_type).c_str(), ip.c_str(), _port, listener->fd()); + srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); return ret; } @@ -234,14 +234,14 @@ int SrsRtspListener::on_tcp_client(st_netfd_t stfd) return ret; } -SrsHttpFlvListener::SrsHttpFlvListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c) : SrsListener(server, type) +SrsHttpFlvListener::SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t) { listener = NULL; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerFlv); - if (_type == SrsListenerFlv) { + srs_assert(type == SrsListenerFlv); + if (type == SrsListenerFlv) { caster = new SrsAppCasterFlv(c); } } @@ -252,16 +252,16 @@ SrsHttpFlvListener::~SrsHttpFlvListener() srs_freep(listener); } -int SrsHttpFlvListener::listen(string ip, int port) +int SrsHttpFlvListener::listen(string i, int p) { int ret = ERROR_SUCCESS; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerFlv); + srs_assert(type == SrsListenerFlv); - _ip = ip; - _port = port; + ip = i; + port = p; if ((ret = caster->initialize()) != ERROR_SUCCESS) { return ret; @@ -277,9 +277,9 @@ int SrsHttpFlvListener::listen(string ip, int port) srs_info("listen thread cid=%d, current_cid=%d, " "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", - pthread->cid(), _srs_context->get_id(), _port, _type, fd, ip.c_str(), port); + pthread->cid(), _srs_context->get_id(), port, type, fd, ip.c_str(), port); - srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(_type).c_str(), ip.c_str(), _port, listener->fd()); + srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); return ret; } @@ -295,36 +295,29 @@ int SrsHttpFlvListener::on_tcp_client(st_netfd_t stfd) return ret; } +#endif -SrsUdpCasterListener::SrsUdpCasterListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c) : SrsListener(server, type) +SrsUdpStreamListener::SrsUdpStreamListener(SrsServer* svr, SrsListenerType t, ISrsUdpHandler* c) : SrsListener(svr, t) { - _type = type; listener = NULL; - - // the caller already ensure the type is ok, - // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerMpegTsOverUdp); - if (_type == SrsListenerMpegTsOverUdp) { - caster = new SrsMpegtsOverUdp(c); - } + caster = c; } -SrsUdpCasterListener::~SrsUdpCasterListener() +SrsUdpStreamListener::~SrsUdpStreamListener() { - srs_freep(caster); srs_freep(listener); } -int SrsUdpCasterListener::listen(string ip, int port) +int SrsUdpStreamListener::listen(string i, int p) { int ret = ERROR_SUCCESS; // the caller already ensure the type is ok, // we just assert here for unknown stream caster. - srs_assert(_type == SrsListenerMpegTsOverUdp); + srs_assert(type == SrsListenerMpegTsOverUdp); - _ip = ip; - _port = port; + ip = i; + port = p; srs_freep(listener); listener = new SrsUdpListener(caster, ip, port); @@ -336,12 +329,28 @@ int SrsUdpCasterListener::listen(string ip, int port) srs_info("listen thread cid=%d, current_cid=%d, " "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", - pthread->cid(), _srs_context->get_id(), _port, _type, fd, ip.c_str(), port); + pthread->cid(), _srs_context->get_id(), port, type, fd, ip.c_str(), port); - srs_trace("%s listen at udp://%s:%d, fd=%d", srs_listener_type2string(_type).c_str(), ip.c_str(), _port, listener->fd()); + srs_trace("%s listen at udp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); return ret; } + +#ifdef SRS_AUTO_STREAM_CASTER +SrsUdpCasterListener::SrsUdpCasterListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsUdpStreamListener(svr, t, NULL) +{ + // the caller already ensure the type is ok, + // we just assert here for unknown stream caster. + srs_assert(type == SrsListenerMpegTsOverUdp); + if (type == SrsListenerMpegTsOverUdp) { + caster = new SrsMpegtsOverUdp(c); + } +} + +SrsUdpCasterListener::~SrsUdpCasterListener() +{ + srs_freep(caster); +} #endif SrsSignalManager* SrsSignalManager::instance = NULL; @@ -588,6 +597,34 @@ int SrsServer::initialize(ISrsServerCycle* cycle_handler) return ret; } +int SrsServer::initialize_st() +{ + int ret = ERROR_SUCCESS; + + // init st + if ((ret = srs_init_st()) != ERROR_SUCCESS) { + srs_error("init st failed. ret=%d", ret); + return ret; + } + + // @remark, st alloc segment use mmap, which only support 32757 threads, + // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK. + // TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine. + if (_srs_config->get_max_connections() > 32756) { + ret = ERROR_ST_EXCEED_THREADS; + srs_error("st mmap for stack allocation must <= %d threads, " + "@see Makefile of st for MALLOC_STACK, please build st manually by " + "\"make EXTRA_CFLAGS=-DMALLOC_STACK linux-debug\", ret=%d", ret); + return ret; + } + + // set current log id. + _srs_context->generate_id(); + srs_trace("server main cid=%d", _srs_context->get_id()); + + return ret; +} + int SrsServer::initialize_signal() { return signal_manager->initialize(); @@ -669,34 +706,6 @@ int SrsServer::acquire_pid_file() return ret; } -int SrsServer::initialize_st() -{ - int ret = ERROR_SUCCESS; - - // init st - if ((ret = srs_init_st()) != ERROR_SUCCESS) { - srs_error("init st failed. ret=%d", ret); - return ret; - } - - // @remark, st alloc segment use mmap, which only support 32757 threads, - // if need to support more, for instance, 100k threads, define the macro MALLOC_STACK. - // TODO: FIXME: maybe can use "sysctl vm.max_map_count" to refine. - if (_srs_config->get_max_connections() > 32756) { - ret = ERROR_ST_EXCEED_THREADS; - srs_error("st mmap for stack allocation must <= %d threads, " - "@see Makefile of st for MALLOC_STACK, please build st manually by " - "\"make EXTRA_CFLAGS=-DMALLOC_STACK linux-debug\", ret=%d", ret); - return ret; - } - - // set current log id. - _srs_context->generate_id(); - srs_trace("server main cid=%d", _srs_context->get_id()); - - return ret; -} - int SrsServer::listen() { int ret = ERROR_SUCCESS; @@ -959,6 +968,7 @@ int SrsServer::do_cycle() } #endif #endif + srs_info("server main thread loop"); } } @@ -1103,7 +1113,7 @@ void SrsServer::close_listeners(SrsListenerType type) for (it = listeners.begin(); it != listeners.end();) { SrsListener* listener = *it; - if (listener->type() != type) { + if (listener->listen_type() != type) { ++it; continue; } @@ -1264,7 +1274,7 @@ int SrsServer::on_reload_http_stream_enabled() #ifdef SRS_AUTO_HTTP_SERVER ret = listen_http_stream(); #endif - + return ret; } diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 1ff7cee90..76b681484 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -80,17 +80,17 @@ enum SrsListenerType class SrsListener { protected: - SrsListenerType _type; + SrsListenerType type; protected: - std::string _ip; - int _port; - SrsServer* _server; + std::string ip; + int port; + SrsServer* server; public: - SrsListener(SrsServer* server, SrsListenerType type); + SrsListener(SrsServer* svr, SrsListenerType t); virtual ~SrsListener(); public: - virtual SrsListenerType type(); - virtual int listen(std::string ip, int port) = 0; + virtual SrsListenerType listen_type(); + virtual int listen(std::string i, int p) = 0; }; /** @@ -120,10 +120,10 @@ private: SrsTcpListener* listener; ISrsTcpHandler* caster; public: - SrsRtspListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c); + SrsRtspListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); virtual ~SrsRtspListener(); public: - virtual int listen(std::string ip, int port); + virtual int listen(std::string i, int p); // ISrsTcpHandler public: virtual int on_tcp_client(st_netfd_t stfd); @@ -138,28 +138,40 @@ private: SrsTcpListener* listener; SrsAppCasterFlv* caster; public: - SrsHttpFlvListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c); + SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); virtual ~SrsHttpFlvListener(); public: - virtual int listen(std::string ip, int port); + virtual int listen(std::string i, int p); // ISrsTcpHandler public: virtual int on_tcp_client(st_netfd_t stfd); }; +#endif /** -* the udp listener, for udp server. -*/ -class SrsUdpCasterListener : public SrsListener + * the udp listener, for udp server. + */ +class SrsUdpStreamListener : public SrsListener { -private: +protected: SrsUdpListener* listener; ISrsUdpHandler* caster; public: - SrsUdpCasterListener(SrsServer* server, SrsListenerType type, SrsConfDirective* c); - virtual ~SrsUdpCasterListener(); + SrsUdpStreamListener(SrsServer* svr, SrsListenerType t, ISrsUdpHandler* c); + virtual ~SrsUdpStreamListener(); public: - virtual int listen(std::string ip, int port); + virtual int listen(std::string i, int p); +}; + +/** + * the udp listener, for udp stream caster server. + */ +#ifdef SRS_AUTO_STREAM_CASTER +class SrsUdpCasterListener : public SrsUdpStreamListener +{ +public: + SrsUdpCasterListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c); + virtual ~SrsUdpCasterListener(); }; #endif @@ -337,7 +349,7 @@ public: * @param client_stfd, the client fd in st boxed, the underlayer fd. */ virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd); -// interface ISrsThreadHandler. +// interface ISrsReloadHandler. public: virtual int on_reload_listen(); virtual int on_reload_pid(); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 5d39ca714..6fae8ea45 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 162 +#define VERSION_REVISION 163 // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/main/srs_main_ingest_hls.cpp b/trunk/src/main/srs_main_ingest_hls.cpp index e01515470..4de2740ca 100644 --- a/trunk/src/main/srs_main_ingest_hls.cpp +++ b/trunk/src/main/srs_main_ingest_hls.cpp @@ -723,8 +723,8 @@ int SrsIngestSrsOutput::on_ts_message(SrsTsMessage* msg) // because when audio stream_number is 0, the elementary is ADTS(aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 75, 1.A.2.2 ADTS). // about the bytes of PES_packet_data_byte, defined in hls-mpeg-ts-iso13818-1.pdf, page 58 - // PES_packet_data_byte "C PES_packet_data_bytes shall be contiguous bytes of data from the elementary stream - // indicated by the packets stream_id or PID. When the elementary stream data conforms to ITU-T + // PES_packet_data_byte ¨C PES_packet_data_bytes shall be contiguous bytes of data from the elementary stream + // indicated by the packet¡¯s stream_id or PID. When the elementary stream data conforms to ITU-T // Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 13818-3, the PES_packet_data_bytes shall be byte aligned to the bytes of this // Recommendation | International Standard. The byte-order of the elementary stream shall be preserved. The number of // PES_packet_data_bytes, N, is specified by the PES_packet_length field. N shall be equal to the value indicated in the @@ -735,12 +735,12 @@ int SrsIngestSrsOutput::on_ts_message(SrsTsMessage* msg) // PES_packet_data_byte field are user definable and will not be specified by ITU-T | ISO/IEC in the future. // about the bytes of stream_id, define in hls-mpeg-ts-iso13818-1.pdf, page 49 - // stream_id "C In Program Streams, the stream_id specifies the type and number of the elementary stream as defined by the + // stream_id ¨C In Program Streams, the stream_id specifies the type and number of the elementary stream as defined by the // stream_id Table 2-18. In Transport Streams, the stream_id may be set to any valid value which correctly describes the // elementary stream type as defined in Table 2-18. In Transport Streams, the elementary stream type is specified in the // Program Specific Information as specified in 2.4.4. - // about the stream_id table, define in Table 2-18 "C Stream_id assignments, hls-mpeg-ts-iso13818-1.pdf, page 52. + // about the stream_id table, define in Table 2-18 ¨C Stream_id assignments, hls-mpeg-ts-iso13818-1.pdf, page 52. // // 110x xxxx // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index f948adb71..41d8f084f 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -344,6 +344,10 @@ int run_master() { int ret = ERROR_SUCCESS; + if ((ret = _srs_server->initialize_st()) != ERROR_SUCCESS) { + return ret; + } + if ((ret = _srs_server->initialize_signal()) != ERROR_SUCCESS) { return ret; } @@ -352,10 +356,6 @@ int run_master() return ret; } - if ((ret = _srs_server->initialize_st()) != ERROR_SUCCESS) { - return ret; - } - if ((ret = _srs_server->listen()) != ERROR_SUCCESS) { return ret; } diff --git a/trunk/src/protocol/srs_rtmp_sdk.cpp b/trunk/src/protocol/srs_rtmp_sdk.cpp index 2b0ba4200..3ee7ee9bd 100644 --- a/trunk/src/protocol/srs_rtmp_sdk.cpp +++ b/trunk/src/protocol/srs_rtmp_sdk.cpp @@ -38,36 +38,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using namespace std; -/** -* the signature for packets to client. -*/ -#define RTMP_SIG_FMS_VER "3,5,3,888" -#define RTMP_SIG_AMF0_VER 0 -#define RTMP_SIG_CLIENT_ID "ASAICiss" - -/** -* onStatus consts. -*/ -#define StatusLevel "level" -#define StatusCode "code" -#define StatusDescription "description" -#define StatusDetails "details" -#define StatusClientId "clientid" -// status value -#define StatusLevelStatus "status" -// status error -#define StatusLevelError "error" -// code value -#define StatusCodeConnectSuccess "NetConnection.Connect.Success" -#define StatusCodeConnectRejected "NetConnection.Connect.Rejected" -#define StatusCodeStreamReset "NetStream.Play.Reset" -#define StatusCodeStreamStart "NetStream.Play.Start" -#define StatusCodeStreamPause "NetStream.Pause.Notify" -#define StatusCodeStreamUnpause "NetStream.Unpause.Notify" -#define StatusCodePublishStart "NetStream.Publish.Start" -#define StatusCodeDataStart "NetStream.Data.Start" -#define StatusCodeUnpublishSuccess "NetStream.Unpublish.Success" - // FMLE #define RTMP_AMF0_COMMAND_ON_FC_PUBLISH "onFCPublish" #define RTMP_AMF0_COMMAND_ON_FC_UNPUBLISH "onFCUnpublish" diff --git a/trunk/src/protocol/srs_rtmp_sdk.hpp b/trunk/src/protocol/srs_rtmp_sdk.hpp index 0ef5ac731..1baf457b9 100644 --- a/trunk/src/protocol/srs_rtmp_sdk.hpp +++ b/trunk/src/protocol/srs_rtmp_sdk.hpp @@ -48,6 +48,36 @@ class SrsPacket; class SrsAmf0Object; class IMergeReadHandler; +/** + * the signature for packets to client. + */ +#define RTMP_SIG_FMS_VER "3,5,3,888" +#define RTMP_SIG_AMF0_VER 0 +#define RTMP_SIG_CLIENT_ID "ASAICiss" + +/** + * onStatus consts. + */ +#define StatusLevel "level" +#define StatusCode "code" +#define StatusDescription "description" +#define StatusDetails "details" +#define StatusClientId "clientid" +// status value +#define StatusLevelStatus "status" +// status error +#define StatusLevelError "error" +// code value +#define StatusCodeConnectSuccess "NetConnection.Connect.Success" +#define StatusCodeConnectRejected "NetConnection.Connect.Rejected" +#define StatusCodeStreamReset "NetStream.Play.Reset" +#define StatusCodeStreamStart "NetStream.Play.Start" +#define StatusCodeStreamPause "NetStream.Pause.Notify" +#define StatusCodeStreamUnpause "NetStream.Unpause.Notify" +#define StatusCodePublishStart "NetStream.Publish.Start" +#define StatusCodeDataStart "NetStream.Data.Start" +#define StatusCodeUnpublishSuccess "NetStream.Unpublish.Success" + /** * the original request from client. */ diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index 2c9d6098b..359ddc950 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -43,89 +43,6 @@ using namespace std; // increase recv timeout to got an entire message. #define SRS_MIN_RECV_TIMEOUT_US (int64_t)(60*1000*1000LL) -/**************************************************************************** -***************************************************************************** -****************************************************************************/ -/** -5. Protocol Control Messages -RTMP reserves message type IDs 1-7 for protocol control messages. -These messages contain information needed by the RTM Chunk Stream -protocol or RTMP itself. Protocol messages with IDs 1 & 2 are -reserved for usage with RTM Chunk Stream protocol. Protocol messages -with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID -7 is used between edge server and origin server. -*/ -#define RTMP_MSG_SetChunkSize 0x01 -#define RTMP_MSG_AbortMessage 0x02 -#define RTMP_MSG_Acknowledgement 0x03 -#define RTMP_MSG_UserControlMessage 0x04 -#define RTMP_MSG_WindowAcknowledgementSize 0x05 -#define RTMP_MSG_SetPeerBandwidth 0x06 -#define RTMP_MSG_EdgeAndOriginServerCommand 0x07 -/** -3. Types of messages -The server and the client send messages over the network to -communicate with each other. The messages can be of any type which -includes audio messages, video messages, command messages, shared -object messages, data messages, and user control messages. -3.1. Command message -Command messages carry the AMF-encoded commands between the client -and the server. These messages have been assigned message type value -of 20 for AMF0 encoding and message type value of 17 for AMF3 -encoding. These messages are sent to perform some operations like -connect, createStream, publish, play, pause on the peer. Command -messages like onstatus, result etc. are used to inform the sender -about the status of the requested commands. A command message -consists of command name, transaction ID, and command object that -contains related parameters. A client or a server can request Remote -Procedure Calls (RPC) over streams that are communicated using the -command messages to the peer. -*/ -#define RTMP_MSG_AMF3CommandMessage 17 // 0x11 -#define RTMP_MSG_AMF0CommandMessage 20 // 0x14 -/** -3.2. Data message -The client or the server sends this message to send Metadata or any -user data to the peer. Metadata includes details about the -data(audio, video etc.) like creation time, duration, theme and so -on. These messages have been assigned message type value of 18 for -AMF0 and message type value of 15 for AMF3. -*/ -#define RTMP_MSG_AMF0DataMessage 18 // 0x12 -#define RTMP_MSG_AMF3DataMessage 15 // 0x0F -/** -3.3. Shared object message -A shared object is a Flash object (a collection of name value pairs) -that are in synchronization across multiple clients, instances, and -so on. The message types kMsgContainer=19 for AMF0 and -kMsgContainerEx=16 for AMF3 are reserved for shared object events. -Each message can contain multiple events. -*/ -#define RTMP_MSG_AMF3SharedObject 16 // 0x10 -#define RTMP_MSG_AMF0SharedObject 19 // 0x13 -/** -3.4. Audio message -The client or the server sends this message to send audio data to the -peer. The message type value of 8 is reserved for audio messages. -*/ -#define RTMP_MSG_AudioMessage 8 // 0x08 -/* * -3.5. Video message -The client or the server sends this message to send video data to the -peer. The message type value of 9 is reserved for video messages. -These messages are large and can delay the sending of other type of -messages. To avoid such a situation, the video message is assigned -the lowest priority. -*/ -#define RTMP_MSG_VideoMessage 9 // 0x09 -/** -3.6. Aggregate message -An aggregate message is a single message that contains a list of submessages. -The message type value of 22 is reserved for aggregate -messages. -*/ -#define RTMP_MSG_AggregateMessage 22 // 0x16 - /**************************************************************************** ***************************************************************************** ****************************************************************************/ @@ -172,24 +89,6 @@ messages. /**************************************************************************** ***************************************************************************** ****************************************************************************/ -/** -* amf0 command message, command name macros -*/ -#define RTMP_AMF0_COMMAND_CONNECT "connect" -#define RTMP_AMF0_COMMAND_CREATE_STREAM "createStream" -#define RTMP_AMF0_COMMAND_CLOSE_STREAM "closeStream" -#define RTMP_AMF0_COMMAND_PLAY "play" -#define RTMP_AMF0_COMMAND_PAUSE "pause" -#define RTMP_AMF0_COMMAND_ON_BW_DONE "onBWDone" -#define RTMP_AMF0_COMMAND_ON_STATUS "onStatus" -#define RTMP_AMF0_COMMAND_RESULT "_result" -#define RTMP_AMF0_COMMAND_ERROR "_error" -#define RTMP_AMF0_COMMAND_RELEASE_STREAM "releaseStream" -#define RTMP_AMF0_COMMAND_FC_PUBLISH "FCPublish" -#define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish" -#define RTMP_AMF0_COMMAND_PUBLISH "publish" -#define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess" - /** * band width check method name, which will be invoked by client. * band width check mothods use SrsBandwidthPacket as its internal packet type, diff --git a/trunk/src/protocol/srs_rtmp_stack.hpp b/trunk/src/protocol/srs_rtmp_stack.hpp index 8d673e402..c0eb1dfec 100644 --- a/trunk/src/protocol/srs_rtmp_stack.hpp +++ b/trunk/src/protocol/srs_rtmp_stack.hpp @@ -56,6 +56,110 @@ class SrsChunkStream; class SrsSharedPtrMessage; class IMergeReadHandler; +/**************************************************************************** + ***************************************************************************** + ****************************************************************************/ +/** + 5. Protocol Control Messages + RTMP reserves message type IDs 1-7 for protocol control messages. + These messages contain information needed by the RTM Chunk Stream + protocol or RTMP itself. Protocol messages with IDs 1 & 2 are + reserved for usage with RTM Chunk Stream protocol. Protocol messages + with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID + 7 is used between edge server and origin server. + */ +#define RTMP_MSG_SetChunkSize 0x01 +#define RTMP_MSG_AbortMessage 0x02 +#define RTMP_MSG_Acknowledgement 0x03 +#define RTMP_MSG_UserControlMessage 0x04 +#define RTMP_MSG_WindowAcknowledgementSize 0x05 +#define RTMP_MSG_SetPeerBandwidth 0x06 +#define RTMP_MSG_EdgeAndOriginServerCommand 0x07 +/** + 3. Types of messages + The server and the client send messages over the network to + communicate with each other. The messages can be of any type which + includes audio messages, video messages, command messages, shared + object messages, data messages, and user control messages. + 3.1. Command message + Command messages carry the AMF-encoded commands between the client + and the server. These messages have been assigned message type value + of 20 for AMF0 encoding and message type value of 17 for AMF3 + encoding. These messages are sent to perform some operations like + connect, createStream, publish, play, pause on the peer. Command + messages like onstatus, result etc. are used to inform the sender + about the status of the requested commands. A command message + consists of command name, transaction ID, and command object that + contains related parameters. A client or a server can request Remote + Procedure Calls (RPC) over streams that are communicated using the + command messages to the peer. + */ +#define RTMP_MSG_AMF3CommandMessage 17 // 0x11 +#define RTMP_MSG_AMF0CommandMessage 20 // 0x14 +/** + 3.2. Data message + The client or the server sends this message to send Metadata or any + user data to the peer. Metadata includes details about the + data(audio, video etc.) like creation time, duration, theme and so + on. These messages have been assigned message type value of 18 for + AMF0 and message type value of 15 for AMF3. + */ +#define RTMP_MSG_AMF0DataMessage 18 // 0x12 +#define RTMP_MSG_AMF3DataMessage 15 // 0x0F +/** + 3.3. Shared object message + A shared object is a Flash object (a collection of name value pairs) + that are in synchronization across multiple clients, instances, and + so on. The message types kMsgContainer=19 for AMF0 and + kMsgContainerEx=16 for AMF3 are reserved for shared object events. + Each message can contain multiple events. + */ +#define RTMP_MSG_AMF3SharedObject 16 // 0x10 +#define RTMP_MSG_AMF0SharedObject 19 // 0x13 +/** + 3.4. Audio message + The client or the server sends this message to send audio data to the + peer. The message type value of 8 is reserved for audio messages. + */ +#define RTMP_MSG_AudioMessage 8 // 0x08 +/* * + 3.5. Video message + The client or the server sends this message to send video data to the + peer. The message type value of 9 is reserved for video messages. + These messages are large and can delay the sending of other type of + messages. To avoid such a situation, the video message is assigned + the lowest priority. + */ +#define RTMP_MSG_VideoMessage 9 // 0x09 +/** + 3.6. Aggregate message + An aggregate message is a single message that contains a list of submessages. + The message type value of 22 is reserved for aggregate + messages. + */ +#define RTMP_MSG_AggregateMessage 22 // 0x16 + +/**************************************************************************** + ***************************************************************************** + ****************************************************************************/ +/** + * amf0 command message, command name macros + */ +#define RTMP_AMF0_COMMAND_CONNECT "connect" +#define RTMP_AMF0_COMMAND_CREATE_STREAM "createStream" +#define RTMP_AMF0_COMMAND_CLOSE_STREAM "closeStream" +#define RTMP_AMF0_COMMAND_PLAY "play" +#define RTMP_AMF0_COMMAND_PAUSE "pause" +#define RTMP_AMF0_COMMAND_ON_BW_DONE "onBWDone" +#define RTMP_AMF0_COMMAND_ON_STATUS "onStatus" +#define RTMP_AMF0_COMMAND_RESULT "_result" +#define RTMP_AMF0_COMMAND_ERROR "_error" +#define RTMP_AMF0_COMMAND_RELEASE_STREAM "releaseStream" +#define RTMP_AMF0_COMMAND_FC_PUBLISH "FCPublish" +#define RTMP_AMF0_COMMAND_UNPUBLISH "FCUnpublish" +#define RTMP_AMF0_COMMAND_PUBLISH "publish" +#define RTMP_AMF0_DATA_SAMPLE_ACCESS "|RtmpSampleAccess" + /**************************************************************************** ***************************************************************************** ****************************************************************************/ diff --git a/trunk/src/protocol/srs_rtmp_utility.cpp b/trunk/src/protocol/srs_rtmp_utility.cpp index 2ac6b75dd..bb1ed35ef 100644 --- a/trunk/src/protocol/srs_rtmp_utility.cpp +++ b/trunk/src/protocol/srs_rtmp_utility.cpp @@ -78,22 +78,22 @@ void srs_vhost_resolve(string& vhost, string& app, string& param) app = srs_string_replace(app, "&&", "?"); app = srs_string_replace(app, "=", "?"); - if ((pos = app.find("?")) == std::string::npos) { - return; - } - - std::string query = app.substr(pos + 1); - app = app.substr(0, pos); - - if ((pos = query.find("vhost?")) != std::string::npos) { - query = query.substr(pos + 6); - if (!query.empty()) { - vhost = query; - } - if ((pos = vhost.find("?")) != std::string::npos) { - vhost = vhost.substr(0, pos); + if ((pos = app.find("?")) != std::string::npos) { + std::string query = app.substr(pos + 1); + app = app.substr(0, pos); + + if ((pos = query.find("vhost?")) != std::string::npos) { + query = query.substr(pos + 6); + if (!query.empty()) { + vhost = query; + } + if ((pos = vhost.find("?")) != std::string::npos) { + vhost = vhost.substr(0, pos); + } } } + + /* others */ } void srs_random_generate(char* bytes, int size) diff --git a/trunk/src/protocol/srs_rtmp_utility.hpp b/trunk/src/protocol/srs_rtmp_utility.hpp index 0a63d8160..afa02eaa8 100644 --- a/trunk/src/protocol/srs_rtmp_utility.hpp +++ b/trunk/src/protocol/srs_rtmp_utility.hpp @@ -63,7 +63,9 @@ extern void srs_discovery_tc_url( * app...vhost...request_vhost * @param param, the query, for example, ?vhost=xxx */ -extern void srs_vhost_resolve(std::string& vhost, std::string& app, std::string& param); +extern void srs_vhost_resolve( + std::string& vhost, std::string& app, std::string& param +); /** * generate ramdom data for handshake.