diff --git a/README.md b/README.md index 960c085eb..4f3ace3f4 100755 --- a/README.md +++ b/README.md @@ -183,6 +183,20 @@ System Architecture: | All Linux(RHEL,CentOS,Ubuntu,Fedora...) | +------------------------------------------------------+ +Modularity Architecture: +
++------------------------------------------------------+ +| Main(srs/bandwidth/librtmp) | ++------------------------------------------------------+ +| App(Server/Client application) | ++------------------------------------------------------+ +| RTMP(Protocol stack) | ++------------------------------------------------------+ +| Kernel(depends on Core, provides error/log) | ++------------------------------------------------------+ +| Core(depends only on system apis) | ++------------------------------------------------------+ +Stream Architecture:
+---------+ +----------+ diff --git a/trunk/configure b/trunk/configure index 22505c189..84a0642c9 100755 --- a/trunk/configure +++ b/trunk/configure @@ -133,8 +133,8 @@ CORE_OBJS="${MODULE_OBJS[@]}" MODULE_ID="KERNEL" MODULE_DEPENDS=("CORE") ModuleLibIncs=(${SRS_OBJS}) -MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_reload" "srs_kernel_config" - "srs_kernel_stream" "srs_kernel_buffer" "srs_kernel_pithy_print") +MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_reload" "srs_kernel_stream" + "srs_kernel_buffer") MODULE_DIR="src/kernel" . auto/modules.sh KERNEL_OBJS="${MODULE_OBJS[@]}" # @@ -143,7 +143,7 @@ MODULE_ID="RTMP" MODULE_DEPENDS=("CORE" "KERNEL") ModuleLibIncs=(${SRS_OBJS} ${LibSSLRoot}) MODULE_FILES=("srs_protocol_amf0" "srs_protocol_io" "srs_protocol_rtmp_stack" "srs_protocol_rtmp" - "srs_protocol_handshake") + "srs_protocol_handshake" "srs_protocol_utility") MODULE_DIR="src/rtmp" . auto/modules.sh RTMP_OBJS="${MODULE_OBJS[@]}" # @@ -151,14 +151,10 @@ RTMP_OBJS="${MODULE_OBJS[@]}" MODULE_ID="APP" MODULE_DEPENDS=("CORE" "KERNEL" "RTMP") ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS}) -MODULE_FILES=("srs_core_server" - "srs_core_conn" "srs_core_client" - "srs_core_socket" - "srs_core_source" "srs_core_codec" - "srs_core_refer" - "srs_core_hls" "srs_core_forward" "srs_core_encoder" - "srs_core_http" "srs_core_thread" "srs_core_bandwidth" - "srs_core_st" "srs_core_log_context") +MODULE_FILES=("srs_core_server" "srs_core_conn" "srs_core_client" "srs_core_socket" "srs_core_source" + "srs_core_codec" "srs_core_refer" "srs_core_hls" "srs_core_forward" "srs_core_encoder" + "srs_core_http" "srs_core_thread" "srs_core_bandwidth" "srs_core_st" "srs_core_log_context" + "srs_kernel_config" "srs_kernel_pithy_print") MODULE_DIR="src/app" . auto/modules.sh APP_OBJS="${MODULE_OBJS[@]}" # diff --git a/trunk/src/app/srs_core_client.cpp b/trunk/src/app/srs_core_client.cpp index f6a2dbd22..ca49e4d8e 100644 --- a/trunk/src/app/srs_core_client.cpp +++ b/trunk/src/app/srs_core_client.cpp @@ -103,6 +103,24 @@ int SrsClient::do_cycle() } srs_verbose("rtmp connect app success"); + // discovery vhost, resolve the vhost from config + SrsConfDirective* parsed_vhost = config->get_vhost(req->vhost); + if (parsed_vhost) { + req->vhost = parsed_vhost->arg0(); + } + + srs_info("discovery app success. schema=%s, vhost=%s, port=%s, app=%s", + req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str()); + + if (req->schema.empty() || req->vhost.empty() || req->port.empty() || req->app.empty()) { + ret = ERROR_RTMP_REQ_TCURL; + srs_error("discovery tcUrl failed. " + "tcUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, ret=%d", + req->tcUrl.c_str(), req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str(), ret); + return ret; + } + + // check vhost if ((ret = check_vhost()) != ERROR_SUCCESS) { srs_error("check vhost failed. ret=%d", ret); return ret; diff --git a/trunk/src/app/srs_core_forward.cpp b/trunk/src/app/srs_core_forward.cpp index d5c451f62..3e6182455 100644 --- a/trunk/src/app/srs_core_forward.cpp +++ b/trunk/src/app/srs_core_forward.cpp @@ -28,16 +28,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include#include -#include -#include -#include -#include -#include -#include -#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include SrsForwarder::SrsForwarder(SrsSource* _source) { diff --git a/trunk/src/kernel/srs_kernel_config.cpp b/trunk/src/app/srs_kernel_config.cpp similarity index 99% rename from trunk/src/kernel/srs_kernel_config.cpp rename to trunk/src/app/srs_kernel_config.cpp index 764ad5860..2952f43f4 100644 --- a/trunk/src/kernel/srs_kernel_config.cpp +++ b/trunk/src/app/srs_kernel_config.cpp @@ -39,6 +39,7 @@ using namespace std; #include #include +#include #include #define FILE_OFFSET(fd) lseek(fd, 0, SEEK_CUR) diff --git a/trunk/src/kernel/srs_kernel_config.hpp b/trunk/src/app/srs_kernel_config.hpp similarity index 97% rename from trunk/src/kernel/srs_kernel_config.hpp rename to trunk/src/app/srs_kernel_config.hpp index 0f535ced0..12354dc66 100644 --- a/trunk/src/kernel/srs_kernel_config.hpp +++ b/trunk/src/app/srs_kernel_config.hpp @@ -38,8 +38,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define RTMP_VHOST_DEFAULT "__defaultVhost__" #define SRS_LOCALHOST "127.0.0.1" -#define RTMP_DEFAULT_PORT 1935 -#define RTMP_DEFAULT_PORTS "1935" #define SRS_CONF_DEFAULT_HLS_PATH "./objs/nginx/html" #define SRS_CONF_DEFAULT_HLS_FRAGMENT 10 @@ -57,9 +55,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // the interval in seconds for bandwidth check #define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000 -// the default chunk size for system. -#define SRS_CONF_DEFAULT_CHUNK_SIZE 60000 - #define SRS_STAGE_PLAY_USER_INTERVAL_MS 1300 #define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 1100 #define SRS_STAGE_FORWARDER_INTERVAL_MS 2000 diff --git a/trunk/src/kernel/srs_kernel_pithy_print.cpp b/trunk/src/app/srs_kernel_pithy_print.cpp similarity index 100% rename from trunk/src/kernel/srs_kernel_pithy_print.cpp rename to trunk/src/app/srs_kernel_pithy_print.cpp diff --git a/trunk/src/kernel/srs_kernel_pithy_print.hpp b/trunk/src/app/srs_kernel_pithy_print.hpp similarity index 100% rename from trunk/src/kernel/srs_kernel_pithy_print.hpp rename to trunk/src/app/srs_kernel_pithy_print.hpp diff --git a/trunk/src/core/srs_core.cpp b/trunk/src/core/srs_core.cpp index 1099e346e..4574837bb 100644 --- a/trunk/src/core/srs_core.cpp +++ b/trunk/src/core/srs_core.cpp @@ -85,27 +85,3 @@ std::string srs_dns_resolve(std::string host) return ipv4; } -void srs_vhost_resolve(std::string& vhost, std::string& app) -{ - app = srs_replace(app, "...", "?"); - - size_t pos = 0; - 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 - || (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()) { - vhost = query; - } - } -} - diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index f6a4693ad..ddcf5e7ec 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -96,11 +96,6 @@ extern void srs_update_system_time_ms(); extern std::string srs_replace(std::string str, std::string old_str, std::string new_str); // dns resolve utility, return the resolved ip address. extern std::string srs_dns_resolve(std::string host); -// resolve the vhost in query string -// @param app, may contains the vhost in query string format: -// app?vhost=request_vhost -// app...vhost...request_vhost -extern void srs_vhost_resolve(std::string& vhost, std::string& app); /** * disable copy constructor of class diff --git a/trunk/src/rtmp/srs_protocol_rtmp.cpp b/trunk/src/rtmp/srs_protocol_rtmp.cpp index 4c4a5d7c3..65984e0d4 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp @@ -24,13 +24,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include -#include #include #include -#include #include -#include #include +#include +#include +#include using namespace std; @@ -127,27 +127,6 @@ int SrsRequest::discovery_app() srs_vhost_resolve(vhost, app); strip(); - // resolve the vhost from config - SrsConfDirective* parsed_vhost = config->get_vhost(vhost); - if (parsed_vhost) { - vhost = parsed_vhost->arg0(); - } - - // TODO: discovery the params of vhost. - - srs_info("discovery app success. schema=%s, vhost=%s, port=%s, app=%s", - schema.c_str(), vhost.c_str(), port.c_str(), app.c_str()); - - if (schema.empty() || vhost.empty() || port.empty() || app.empty()) { - ret = ERROR_RTMP_REQ_TCURL; - srs_error("discovery tcUrl failed. " - "tcUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, ret=%d", - tcUrl.c_str(), schema.c_str(), vhost.c_str(), port.c_str(), app.c_str(), ret); - return ret; - } - - strip(); - return ret; } diff --git a/trunk/src/rtmp/srs_protocol_utility.cpp b/trunk/src/rtmp/srs_protocol_utility.cpp new file mode 100644 index 000000000..00f60bfa6 --- /dev/null +++ b/trunk/src/rtmp/srs_protocol_utility.cpp @@ -0,0 +1,48 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +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 +the Software without restriction, including without limitation the rights to +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, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +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 +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. +*/ + +#include + +void srs_vhost_resolve(std::string& vhost, std::string& app) +{ + app = srs_replace(app, "...", "?"); + + size_t pos = 0; + 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 + || (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()) { + vhost = query; + } + } +} diff --git a/trunk/src/rtmp/srs_protocol_utility.hpp b/trunk/src/rtmp/srs_protocol_utility.hpp new file mode 100644 index 000000000..e40359bdc --- /dev/null +++ b/trunk/src/rtmp/srs_protocol_utility.hpp @@ -0,0 +1,44 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +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 +the Software without restriction, including without limitation the rights to +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, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +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 +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. +*/ + +#ifndef SRS_RTMP_PROTOCOL_CONSTS_HPP +#define SRS_RTMP_PROTOCOL_CONSTS_HPP + +/* +#include +*/ +#include + +#define RTMP_DEFAULT_PORT 1935 +#define RTMP_DEFAULT_PORTS "1935" + +// the default chunk size for system. +#define SRS_CONF_DEFAULT_CHUNK_SIZE 60000 + +// resolve the vhost in query string +// @param app, may contains the vhost in query string format: +// app?vhost=request_vhost +// app...vhost...request_vhost +extern void srs_vhost_resolve(std::string& vhost, std::string& app); + +#endif diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index da8aea401..eb4db85af 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -12,14 +12,10 @@ file kernel readonly separator, ..\kernel\srs_kernel_buffer.hpp, ..\kernel\srs_kernel_buffer.cpp, - ..\kernel\srs_kernel_config.hpp, - ..\kernel\srs_kernel_config.cpp, ..\kernel\srs_kernel_error.hpp, ..\kernel\srs_kernel_error.cpp, ..\kernel\srs_kernel_log.hpp, ..\kernel\srs_kernel_log.cpp, - ..\kernel\srs_kernel_pithy_print.hpp, - ..\kernel\srs_kernel_pithy_print.cpp, ..\kernel\srs_kernel_reload.hpp, ..\kernel\srs_kernel_reload.cpp, ..\kernel\srs_kernel_stream.hpp, @@ -35,6 +31,8 @@ file ..\rtmp\srs_protocol_rtmp.cpp, ..\rtmp\srs_protocol_rtmp_stack.hpp, ..\rtmp\srs_protocol_rtmp_stack.cpp, + ..\rtmp\srs_protocol_utility.hpp, + ..\rtmp\srs_protocol_utility.cpp, app readonly separator, ..\app\srs_core_bandwidth.hpp, ..\app\srs_core_bandwidth.cpp, @@ -44,6 +42,8 @@ file ..\app\srs_core_codec.cpp, ..\app\srs_core_conn.hpp, ..\app\srs_core_conn.cpp, + ..\app\srs_kernel_config.hpp, + ..\app\srs_kernel_config.cpp, ..\app\srs_core_encoder.hpp, ..\app\srs_core_encoder.cpp, ..\app\srs_core_forward.hpp, @@ -56,6 +56,8 @@ file ..\app\srs_core_log_context.cpp, ..\app\srs_core_refer.hpp, ..\app\srs_core_refer.cpp, + ..\app\srs_kernel_pithy_print.hpp, + ..\app\srs_kernel_pithy_print.cpp, ..\app\srs_core_thread.hpp, ..\app\srs_core_thread.cpp, ..\app\srs_core_server.hpp,