diff --git a/trunk/configure b/trunk/configure index 67d9bc464..47265e6fb 100755 --- a/trunk/configure +++ b/trunk/configure @@ -389,7 +389,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks" "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge" "srs_app_kbps" "srs_app_heartbeat" "srs_app_empty" "srs_app_http_client" "srs_app_avc_aac" - "srs_app_recv_thread" "srs_app_security") + "srs_app_recv_thread" "srs_app_security" "srs_app_statistic") APP_INCS="src/app"; MODULE_DIR=${APP_INCS} . auto/modules.sh APP_OBJS="${MODULE_OBJS[@]}" fi diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 3958fd838..41c752dde 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -35,6 +35,8 @@ using namespace std; #include #include #include +#include +#include SrsApiRoot::SrsApiRoot() { @@ -122,6 +124,8 @@ SrsApiV1::SrsApiV1() handlers.push_back(new SrsApiMemInfos()); handlers.push_back(new SrsApiAuthors()); handlers.push_back(new SrsApiRequests()); + handlers.push_back(new SrsApiVhosts()); + handlers.push_back(new SrsApiStreams()); } SrsApiV1::~SrsApiV1() @@ -147,7 +151,9 @@ int SrsApiV1::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) << __SRS_JFIELD_STR("system_proc_stats", "the system process stats") << __SRS_JFIELD_CONT << __SRS_JFIELD_STR("meminfos", "the meminfo of system") << __SRS_JFIELD_CONT << __SRS_JFIELD_STR("authors", "the primary authors and contributors") << __SRS_JFIELD_CONT - << __SRS_JFIELD_STR("requests", "the request itself, for http debug") + << __SRS_JFIELD_STR("requests", "the request itself, for http debug") << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("vhosts", "dumps vhost to json") << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("streams", "dumps streams to json") << __SRS_JOBJECT_END << __SRS_JOBJECT_END; @@ -500,6 +506,70 @@ int SrsApiAuthors::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) return res_json(skt, req, ss.str()); } +SrsApiVhosts::SrsApiVhosts() +{ +} + +SrsApiVhosts::~SrsApiVhosts() +{ +} + +bool SrsApiVhosts::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/vhosts", path, length); +} + +int SrsApiVhosts::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) +{ + std::stringstream data; + SrsStatistic* stat = SrsStatistic::instance(); + int ret = stat->dumps_vhosts(data); + + std::stringstream ss; + + ss << __SRS_JOBJECT_START + << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("vhosts", __SRS_JARRAY_START) + << data.str() + << __SRS_JARRAY_END + << __SRS_JOBJECT_END; + + return res_json(skt, req, ss.str()); +} + +SrsApiStreams::SrsApiStreams() +{ +} + +SrsApiStreams::~SrsApiStreams() +{ +} + +bool SrsApiStreams::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/streams", path, length); +} + +int SrsApiStreams::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) +{ + std::stringstream data; + SrsStatistic* stat = SrsStatistic::instance(); + int ret = stat->dumps_streams(data); + + std::stringstream ss; + + ss << __SRS_JOBJECT_START + << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("streams", __SRS_JARRAY_START) + << data.str() + << __SRS_JARRAY_END + << __SRS_JOBJECT_END; + + return res_json(skt, req, ss.str()); +} + SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) : SrsConnection(srs_server, client_stfd) { diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index ea12ffcf1..a29e46066 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -164,6 +164,28 @@ protected: virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); }; +class SrsApiVhosts : public SrsHttpHandler +{ +public: + SrsApiVhosts(); + virtual ~SrsApiVhosts(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); +}; + +class SrsApiStreams : public SrsHttpHandler +{ +public: + SrsApiStreams(); + virtual ~SrsApiStreams(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsStSocket* skt, SrsHttpMessage* req); +}; + class SrsHttpApi : public SrsConnection { private: diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 0c81446c1..b7bb4d815 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -52,6 +52,7 @@ using namespace std; #include #include #include +#include // when stream is busy, for example, streaming is already // publishing, when a new client to request to publish, @@ -395,6 +396,13 @@ int SrsRtmpConn::stream_service_cycle() } srs_assert(source != NULL); + // update the statistic when source disconveried. + SrsStatistic* stat = SrsStatistic::instance(); + if ((ret = stat->on_client(_srs_context->get_id(), req)) != ERROR_SUCCESS) { + srs_error("stat client failed. ret=%d", ret); + return ret; + } + // check ASAP, to fail it faster if invalid. if (type != SrsRtmpConnPlay && !vhost_is_edge) { // check publish available diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 6003c8883..a7cbea204 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1807,4 +1807,3 @@ void SrsSource::destroy_forwarders() forwarders.clear(); } - diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp new file mode 100644 index 000000000..45e0019c7 --- /dev/null +++ b/trunk/src/app/srs_app_statistic.cpp @@ -0,0 +1,164 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2015 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 + +#include +#include +using namespace std; + +#include +#include + +int64_t __srs_gvid = getpid(); + +int64_t __srs_generate_id() +{ + return __srs_gvid++; +} + +SrsStatisticVhost::SrsStatisticVhost() +{ + id = __srs_generate_id(); +} + +SrsStatisticVhost::~SrsStatisticVhost() +{ +} + +SrsStatisticStream::SrsStatisticStream() +{ + id = __srs_generate_id(); + vhost = NULL; +} + +SrsStatisticStream::~SrsStatisticStream() +{ +} + +SrsStatistic* SrsStatistic::_instance = new SrsStatistic(); + +SrsStatistic::SrsStatistic() +{ + _server_id = __srs_generate_id(); +} + +SrsStatistic::~SrsStatistic() +{ + if (true) { + std::map::iterator it; + for (it = vhosts.begin(); it != vhosts.end(); it++) { + SrsStatisticVhost* vhost = it->second; + srs_freep(vhost); + } + } + if (true) { + std::map::iterator it; + for (it = streams.begin(); it != streams.end(); it++) { + SrsStatisticStream* stream = it->second; + srs_freep(stream); + } + } + if (true) { + std::map::iterator it; + for (it = clients.begin(); it != clients.end(); it++) { + SrsStatisticClient* client = it->second; + srs_freep(client); + } + } +} + +SrsStatistic* SrsStatistic::instance() +{ + return _instance; +} + +int SrsStatistic::on_client(int id, SrsRequest* req) +{ + int ret = ERROR_SUCCESS; + + // create vhost if not exists. + SrsStatisticVhost* vhost = NULL; + if (vhosts.find(req->vhost) == vhosts.end()) { + vhost = new SrsStatisticVhost(); + vhost->vhost = req->vhost; + vhosts[req->vhost] = vhost; + } else { + vhost = vhosts[req->vhost]; + } + + // the url to identify the stream. + std::string url = req->get_stream_url(); + + // create stream if not exists. + SrsStatisticStream* stream = NULL; + if (streams.find(url) == streams.end()) { + stream = new SrsStatisticStream(); + stream->vhost = vhost; + stream->stream = req->stream; + stream->url = url; + streams[url] = stream; + } else { + stream = streams[url]; + } + + return ret; +} + +int64_t SrsStatistic::server_id() +{ + return _server_id; +} + +int SrsStatistic::dumps_vhosts(stringstream& ss) +{ + int ret = ERROR_SUCCESS; + + std::map::iterator it; + for (it = vhosts.begin(); it != vhosts.end(); it++) { + SrsStatisticVhost* vhost = it->second; + ss << __SRS_JOBJECT_START + << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("name", vhost->vhost) + << __SRS_JOBJECT_END; + } + + return ret; +} + +int SrsStatistic::dumps_streams(stringstream& ss) +{ + int ret = ERROR_SUCCESS; + + std::map::iterator it; + for (it = streams.begin(); it != streams.end(); it++) { + SrsStatisticStream* stream = it->second; + ss << __SRS_JOBJECT_START + << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT + << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("vhost", stream->vhost->id) + << __SRS_JOBJECT_END; + } + + return ret; +} diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp new file mode 100644 index 000000000..f261962ea --- /dev/null +++ b/trunk/src/app/srs_app_statistic.hpp @@ -0,0 +1,108 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2015 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_APP_STATISTIC_HPP +#define SRS_APP_STATISTIC_HPP + +/* +#include +*/ + +#include + +#include +#include + +class SrsRequest; + +struct SrsStatisticVhost +{ +public: + int64_t id; + std::string vhost; +public: + SrsStatisticVhost(); + virtual ~SrsStatisticVhost(); +}; + +struct SrsStatisticStream +{ +public: + int64_t id; + SrsStatisticVhost* vhost; + std::string app; + std::string stream; + std::string url; +public: + SrsStatisticStream(); + virtual ~SrsStatisticStream(); +}; + +struct SrsStatisticClient +{ +public: + SrsStatisticStream* stream; + int id; +}; + +class SrsStatistic +{ +private: + static SrsStatistic *_instance; + // the id to identify the sever. + int64_t _server_id; + // key: vhost name, value: vhost object. + std::map vhosts; + // key: stream name, value: stream object. + std::map streams; + // key: client id, value: stream object. + std::map clients; +private: + SrsStatistic(); + virtual ~SrsStatistic(); +public: + static SrsStatistic* instance(); +public: + /** + * when got a client to publish/play stream, + * @param id, the client srs id. + * @param req, the client request object. + */ + virtual int on_client(int id, SrsRequest* req); +public: + /** + * get the server id, used to identify the server. + * for example, when restart, the server id must changed. + */ + virtual int64_t server_id(); + /** + * dumps the vhosts to sstream in json. + */ + virtual int dumps_vhosts(std::stringstream& ss); + /** + * dumps the streams to sstream in json. + */ + virtual int dumps_streams(std::stringstream& ss); +}; + +#endif diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index b6712314a..b267c032a 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -1,153 +1,155 @@ file - main readonly separator, - ..\main\srs_main_server.cpp, - auto readonly separator, - ..\..\objs\srs_auto_headers.hpp, - libs readonly separator, - ..\libs\srs_librtmp.hpp, - ..\libs\srs_librtmp.cpp, - ..\libs\srs_lib_bandwidth.hpp, - ..\libs\srs_lib_bandwidth.cpp, - ..\libs\srs_lib_simple_socket.hpp, - ..\libs\srs_lib_simple_socket.cpp, - core readonly separator, - ..\core\srs_core.hpp, - ..\core\srs_core.cpp, - ..\core\srs_core_autofree.hpp, - ..\core\srs_core_autofree.cpp, - ..\core\srs_core_performance.hpp, - ..\core\srs_core_performance.cpp, - kernel readonly separator, - ..\kernel\srs_kernel_codec.hpp, - ..\kernel\srs_kernel_codec.cpp, - ..\kernel\srs_kernel_consts.hpp, - ..\kernel\srs_kernel_consts.cpp, - ..\kernel\srs_kernel_error.hpp, - ..\kernel\srs_kernel_error.cpp, - ..\kernel\srs_kernel_file.hpp, - ..\kernel\srs_kernel_file.cpp, - ..\kernel\srs_kernel_flv.hpp, - ..\kernel\srs_kernel_flv.cpp, - ..\kernel\srs_kernel_log.hpp, - ..\kernel\srs_kernel_log.cpp, - ..\kernel\srs_kernel_stream.hpp, - ..\kernel\srs_kernel_stream.cpp, - ..\kernel\srs_kernel_utility.hpp, - ..\kernel\srs_kernel_utility.cpp, - rtmp-protocol readonly separator, - ..\rtmp\srs_protocol_amf0.hpp, - ..\rtmp\srs_protocol_amf0.cpp, - ..\rtmp\srs_protocol_buffer.hpp, - ..\rtmp\srs_protocol_buffer.cpp, - ..\rtmp\srs_protocol_handshake.hpp, - ..\rtmp\srs_protocol_handshake.cpp, - ..\rtmp\srs_protocol_io.hpp, - ..\rtmp\srs_protocol_io.cpp, - ..\rtmp\srs_protocol_msg_array.hpp, - ..\rtmp\srs_protocol_msg_array.cpp, - ..\rtmp\srs_protocol_rtmp.hpp, - ..\rtmp\srs_protocol_rtmp.cpp, - ..\rtmp\srs_protocol_stack.hpp, - ..\rtmp\srs_protocol_stack.cpp, - ..\rtmp\srs_protocol_utility.hpp, - ..\rtmp\srs_protocol_utility.cpp, - app readonly separator, - ..\app\srs_app_avc_aac.hpp, - ..\app\srs_app_avc_aac.cpp, - ..\app\srs_app_bandwidth.hpp, - ..\app\srs_app_bandwidth.cpp, - ..\app\srs_app_conn.hpp, - ..\app\srs_app_conn.cpp, - ..\app\srs_app_config.hpp, - ..\app\srs_app_config.cpp, - ..\app\srs_app_dvr.hpp, - ..\app\srs_app_dvr.cpp, - ..\app\srs_app_edge.hpp, - ..\app\srs_app_edge.cpp, - ..\app\srs_app_empty.hpp, - ..\app\srs_app_empty.cpp, - ..\app\srs_app_encoder.hpp, - ..\app\srs_app_encoder.cpp, - ..\app\srs_app_ffmpeg.hpp, - ..\app\srs_app_ffmpeg.cpp, - ..\app\srs_app_forward.hpp, - ..\app\srs_app_forward.cpp, - ..\app\srs_app_heartbeat.hpp, - ..\app\srs_app_heartbeat.cpp, - ..\app\srs_app_hls.hpp, - ..\app\srs_app_hls.cpp, - ..\app\srs_app_http.hpp, - ..\app\srs_app_http.cpp, - ..\app\srs_app_http_api.hpp, - ..\app\srs_app_http_api.cpp, - ..\app\srs_app_http_client.hpp, - ..\app\srs_app_http_client.cpp, - ..\app\srs_app_http_conn.hpp, - ..\app\srs_app_http_conn.cpp, - ..\app\srs_app_http_hooks.hpp, - ..\app\srs_app_http_hooks.cpp, - ..\app\srs_app_ingest.hpp, - ..\app\srs_app_ingest.cpp, - ..\app\srs_app_json.hpp, - ..\app\srs_app_json.cpp, - ..\app\srs_app_kbps.hpp, - ..\app\srs_app_kbps.cpp, - ..\app\srs_app_log.hpp, - ..\app\srs_app_log.cpp, - ..\app\srs_app_recv_thread.hpp, - ..\app\srs_app_recv_thread.cpp, - ..\app\srs_app_refer.hpp, - ..\app\srs_app_refer.cpp, - ..\app\srs_app_reload.hpp, - ..\app\srs_app_reload.cpp, - ..\app\srs_app_rtmp_conn.hpp, - ..\app\srs_app_rtmp_conn.cpp, - ..\app\srs_app_pithy_print.hpp, - ..\app\srs_app_pithy_print.cpp, - ..\app\srs_app_security.hpp, - ..\app\srs_app_security.cpp, - ..\app\srs_app_server.hpp, - ..\app\srs_app_server.cpp, - ..\app\srs_app_st.hpp, - ..\app\srs_app_st.cpp, - ..\app\srs_app_st_socket.hpp, - ..\app\srs_app_st_socket.cpp, - ..\app\srs_app_source.hpp, - ..\app\srs_app_source.cpp, - ..\app\srs_app_thread.hpp, - ..\app\srs_app_thread.cpp, - ..\app\srs_app_utility.hpp, - ..\app\srs_app_utility.cpp, - utest readonly separator, - ..\utest\srs_utest.hpp, - ..\utest\srs_utest.cpp, - ..\utest\srs_utest_amf0.hpp, - ..\utest\srs_utest_amf0.cpp, - ..\utest\srs_utest_config.hpp, - ..\utest\srs_utest_config.cpp, - ..\utest\srs_utest_core.hpp, - ..\utest\srs_utest_core.cpp, - ..\utest\srs_utest_kernel.hpp, - ..\utest\srs_utest_kernel.cpp, - ..\utest\srs_utest_protocol.hpp, - ..\utest\srs_utest_protocol.cpp, - ..\utest\srs_utest_reload.hpp, - ..\utest\srs_utest_reload.cpp, - research readonly separator, - ..\..\research\librtmp\srs_aac_raw_publish.c, - ..\..\research\librtmp\srs_audio_raw_publish.c, - ..\..\research\librtmp\srs_bandwidth_check.c, - ..\..\research\librtmp\srs_detect_rtmp.c, - ..\..\research\librtmp\srs_flv_injecter.c, - ..\..\research\librtmp\srs_flv_parser.c, - ..\..\research\librtmp\srs_h264_raw_publish.c, - ..\..\research\librtmp\srs_ingest_flv.c, - ..\..\research\librtmp\srs_ingest_rtmp.c, - ..\..\research\librtmp\srs_play.c, - ..\..\research\librtmp\srs_publish.c, - ..\..\research\librtmp\srs_rtmp_dump.c, - ..\..\research\hls\ts_info.cc; + main readonly separator, + ..\main\srs_main_server.cpp, + auto readonly separator, + ..\..\objs\srs_auto_headers.hpp, + libs readonly separator, + ..\libs\srs_librtmp.hpp, + ..\libs\srs_librtmp.cpp, + ..\libs\srs_lib_bandwidth.hpp, + ..\libs\srs_lib_bandwidth.cpp, + ..\libs\srs_lib_simple_socket.hpp, + ..\libs\srs_lib_simple_socket.cpp, + core readonly separator, + ..\core\srs_core.hpp, + ..\core\srs_core.cpp, + ..\core\srs_core_autofree.hpp, + ..\core\srs_core_autofree.cpp, + ..\core\srs_core_performance.hpp, + ..\core\srs_core_performance.cpp, + kernel readonly separator, + ..\kernel\srs_kernel_codec.hpp, + ..\kernel\srs_kernel_codec.cpp, + ..\kernel\srs_kernel_consts.hpp, + ..\kernel\srs_kernel_consts.cpp, + ..\kernel\srs_kernel_error.hpp, + ..\kernel\srs_kernel_error.cpp, + ..\kernel\srs_kernel_file.hpp, + ..\kernel\srs_kernel_file.cpp, + ..\kernel\srs_kernel_flv.hpp, + ..\kernel\srs_kernel_flv.cpp, + ..\kernel\srs_kernel_log.hpp, + ..\kernel\srs_kernel_log.cpp, + ..\kernel\srs_kernel_stream.hpp, + ..\kernel\srs_kernel_stream.cpp, + ..\kernel\srs_kernel_utility.hpp, + ..\kernel\srs_kernel_utility.cpp, + rtmp-protocol readonly separator, + ..\rtmp\srs_protocol_amf0.hpp, + ..\rtmp\srs_protocol_amf0.cpp, + ..\rtmp\srs_protocol_buffer.hpp, + ..\rtmp\srs_protocol_buffer.cpp, + ..\rtmp\srs_protocol_handshake.hpp, + ..\rtmp\srs_protocol_handshake.cpp, + ..\rtmp\srs_protocol_io.hpp, + ..\rtmp\srs_protocol_io.cpp, + ..\rtmp\srs_protocol_msg_array.hpp, + ..\rtmp\srs_protocol_msg_array.cpp, + ..\rtmp\srs_protocol_rtmp.hpp, + ..\rtmp\srs_protocol_rtmp.cpp, + ..\rtmp\srs_protocol_stack.hpp, + ..\rtmp\srs_protocol_stack.cpp, + ..\rtmp\srs_protocol_utility.hpp, + ..\rtmp\srs_protocol_utility.cpp, + app readonly separator, + ..\app\srs_app_avc_aac.hpp, + ..\app\srs_app_avc_aac.cpp, + ..\app\srs_app_bandwidth.hpp, + ..\app\srs_app_bandwidth.cpp, + ..\app\srs_app_conn.hpp, + ..\app\srs_app_conn.cpp, + ..\app\srs_app_config.hpp, + ..\app\srs_app_config.cpp, + ..\app\srs_app_dvr.hpp, + ..\app\srs_app_dvr.cpp, + ..\app\srs_app_edge.hpp, + ..\app\srs_app_edge.cpp, + ..\app\srs_app_empty.hpp, + ..\app\srs_app_empty.cpp, + ..\app\srs_app_encoder.hpp, + ..\app\srs_app_encoder.cpp, + ..\app\srs_app_ffmpeg.hpp, + ..\app\srs_app_ffmpeg.cpp, + ..\app\srs_app_forward.hpp, + ..\app\srs_app_forward.cpp, + ..\app\srs_app_heartbeat.hpp, + ..\app\srs_app_heartbeat.cpp, + ..\app\srs_app_hls.hpp, + ..\app\srs_app_hls.cpp, + ..\app\srs_app_http.hpp, + ..\app\srs_app_http.cpp, + ..\app\srs_app_http_api.hpp, + ..\app\srs_app_http_api.cpp, + ..\app\srs_app_http_client.hpp, + ..\app\srs_app_http_client.cpp, + ..\app\srs_app_http_conn.hpp, + ..\app\srs_app_http_conn.cpp, + ..\app\srs_app_http_hooks.hpp, + ..\app\srs_app_http_hooks.cpp, + ..\app\srs_app_ingest.hpp, + ..\app\srs_app_ingest.cpp, + ..\app\srs_app_json.hpp, + ..\app\srs_app_json.cpp, + ..\app\srs_app_kbps.hpp, + ..\app\srs_app_kbps.cpp, + ..\app\srs_app_log.hpp, + ..\app\srs_app_log.cpp, + ..\app\srs_app_recv_thread.hpp, + ..\app\srs_app_recv_thread.cpp, + ..\app\srs_app_refer.hpp, + ..\app\srs_app_refer.cpp, + ..\app\srs_app_reload.hpp, + ..\app\srs_app_reload.cpp, + ..\app\srs_app_rtmp_conn.hpp, + ..\app\srs_app_rtmp_conn.cpp, + ..\app\srs_app_pithy_print.hpp, + ..\app\srs_app_pithy_print.cpp, + ..\app\srs_app_security.hpp, + ..\app\srs_app_security.cpp, + ..\app\srs_app_server.hpp, + ..\app\srs_app_server.cpp, + ..\app\srs_app_st.hpp, + ..\app\srs_app_st.cpp, + ..\app\srs_app_st_socket.hpp, + ..\app\srs_app_st_socket.cpp, + ..\app\srs_app_statistic.hpp, + ..\app\srs_app_statistic.cpp, + ..\app\srs_app_source.hpp, + ..\app\srs_app_source.cpp, + ..\app\srs_app_thread.hpp, + ..\app\srs_app_thread.cpp, + ..\app\srs_app_utility.hpp, + ..\app\srs_app_utility.cpp, + utest readonly separator, + ..\utest\srs_utest.hpp, + ..\utest\srs_utest.cpp, + ..\utest\srs_utest_amf0.hpp, + ..\utest\srs_utest_amf0.cpp, + ..\utest\srs_utest_config.hpp, + ..\utest\srs_utest_config.cpp, + ..\utest\srs_utest_core.hpp, + ..\utest\srs_utest_core.cpp, + ..\utest\srs_utest_kernel.hpp, + ..\utest\srs_utest_kernel.cpp, + ..\utest\srs_utest_protocol.hpp, + ..\utest\srs_utest_protocol.cpp, + ..\utest\srs_utest_reload.hpp, + ..\utest\srs_utest_reload.cpp, + research readonly separator, + ..\..\research\librtmp\srs_aac_raw_publish.c, + ..\..\research\librtmp\srs_audio_raw_publish.c, + ..\..\research\librtmp\srs_bandwidth_check.c, + ..\..\research\librtmp\srs_detect_rtmp.c, + ..\..\research\librtmp\srs_flv_injecter.c, + ..\..\research\librtmp\srs_flv_parser.c, + ..\..\research\librtmp\srs_h264_raw_publish.c, + ..\..\research\librtmp\srs_ingest_flv.c, + ..\..\research\librtmp\srs_ingest_rtmp.c, + ..\..\research\librtmp\srs_play.c, + ..\..\research\librtmp\srs_publish.c, + ..\..\research\librtmp\srs_rtmp_dump.c, + ..\..\research\hls\ts_info.cc; mainconfig - "" = "MAIN"; + "" = "MAIN";