diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a44c21fb9..adfb1648fa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,15 +6,17 @@ jobs: steps: - checkout - run: | - cd trunk && ./configure --without-rtc --without-utest && make && - ./configure --with-rtc --with-utest && make clean && make + cd trunk && + ./configure --without-rtc --without-gb28181 --without-utest && make && + ./configure --with-rtc --with-gb28181 --with-utest && make clean && make test: docker: - image: ossrs/srs:dev steps: - checkout - run: | - cd trunk && ./configure --with-utest --gcov && make && + cd trunk && + ./configure --with-rtc --with-gb28181 --with-utest --gcov && make && ./objs/srs_utest && bash auto/coverage.sh workflows: version: 2 diff --git a/README.md b/README.md index 59814182d4..5215917345 100755 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ For previous versions, please read: - [x] [Experimental] Support HTTP RAW API, please read [#459][bug #459], [#470][bug #470], [#319][bug #319]. - [x] [Experimental] Support SRT server, read [#1147][bug #1147]. - [x] [Experimental] Support playing stream by WebRTC, [#307][bug #307]. +- [x] [Experimental] Support push stream by GB28181, [#1500][bug #1500]. - [x] [Deprecated] Support Adobe HDS(f4m), please read wiki([CN][v2_CN_DeliveryHDS], [EN][v2_EN_DeliveryHDS]) and [#1535][bug #1535]. - [x] [Deprecated] Support bandwidth testing([CN][v1_CN_BandwidthTestTool], [EN][v1_EN_BandwidthTestTool]), please read [#1535][bug #1535]. - [x] [Deprecated] Support Adobe FMS/AMS token traverse([CN][v3_CN_DRM2], [EN][v3_EN_DRM2]) authentication, please read [#1535][bug #1535]. @@ -157,6 +158,7 @@ For previous versions, please read: ## V4 changes +* v4.0, 2020-03-31, For [#1500][bug #1500], support push stream by GB28181. 4.0.18 * v4.0, 2020-03-31, Play stream by WebRTC on iOS/Android/PC browser. 4.0.17 * v4.0, 2020-03-28, Support multiple OS/Platform build cache. 4.0.16 * v4.0, 2020-03-28, For [#1250][bug #1250], support macOS, OSX, MacbookPro, Apple Darwin. @@ -1154,6 +1156,7 @@ Maintainers of SRS project: * [Runner365](https://github.com/runner365): The focus of his work is on the [SRT](https://github.com/simple-rtmp-server/srs/wiki/v4_CN_SRTWiki) module. * [John](https://github.com/xiaozhihong): Focus on [WebRTC](https://github.com/simple-rtmp-server/srs/wiki/v4_CN_RTCWiki) module. * [B.P.Y(Bepartofyou)](https://github.com/Bepartofyou): Focus on [WebRTC](https://github.com/simple-rtmp-server/srs/wiki/v4_CN_RTCWiki) module. +* [Lixin](https://github.com/xialixin): Focus on [GB28181](https://github.com/ossrs/srs/issues/1500) module. A big THANK YOU goes to: diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 3c4c77ea3a..73249d1b2b 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -79,6 +79,12 @@ else srs_undefine_macro "SRS_AUTO_RTC" $SRS_AUTO_HEADERS_H fi +if [ $SRS_GB28181 = YES ]; then + srs_define_macro "SRS_AUTO_GB28181" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_AUTO_GB28181" $SRS_AUTO_HEADERS_H +fi + if [ $SRS_MEM_WATCH = YES ]; then srs_define_macro "SRS_AUTO_MEM_WATCH" $SRS_AUTO_HEADERS_H else diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 81b47cdd51..c0300172be 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -18,6 +18,7 @@ help=no SRS_HDS=NO SRS_SRT=NO SRS_RTC=YES +SRS_GB28181=NO SRS_NASM=YES SRS_NGINX=NO SRS_FFMPEG_TOOL=NO @@ -136,16 +137,18 @@ Features: --with-utest Build the utest for SRS. --with-srt Build the SRT support for SRS. --with-rtc Build the WebRTC support for SRS. + --with-gb28181 Build the GB28181 support for SRS. --without-ssl Disable rtmp complex handshake. --without-hds Disable hds, the adobe http dynamic streaming. --without-stream-caster Disable stream caster, only listen and serve RTMP/HTTP. --without-stat Disable the data statistic feature. --without-librtmp Disable srs-librtmp, library for client. - --without-research Do not build the research tools. - --without-utest Do not build the utest for SRS. - --without-srt Do not build the SRT support for SRS. - --without-rtc Do not build the WebRTC support for SRS. + --without-research Disable the research tools. + --without-utest Disable the utest for SRS. + --without-srt Disable the SRT support for SRS. + --without-rtc Disable the WebRTC support for SRS. + --without-gb28181 Disable the GB28181 support for SRS. --prefix= The absolute installation path for srs. Default: $SRS_PREFIX --static Whether add '-static' to link options. @@ -231,6 +234,7 @@ function parse_user_option() { --with-utest) SRS_UTEST=YES ;; --with-srt) SRS_SRT=YES ;; --with-rtc) SRS_RTC=YES ;; + --with-gb28181) SRS_GB28181=YES ;; --with-nasm) SRS_NASM=YES ;; --with-gperf) SRS_GPERF=YES ;; --with-gmc) SRS_GPERF_MC=YES ;; @@ -249,6 +253,7 @@ function parse_user_option() { --without-utest) SRS_UTEST=NO ;; --without-srt) SRS_SRT=NO ;; --without-rtc) SRS_RTC=NO ;; + --without-gb28181) SRS_GB28181=NO ;; --without-nasm) SRS_NASM=NO ;; --without-gperf) SRS_GPERF=NO ;; --without-gmc) SRS_GPERF_MC=NO ;; @@ -550,6 +555,7 @@ function regenerate_options() { if [ $SRS_UTEST = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-utest"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-utest"; fi if [ $SRS_SRT = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-srt"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-srt"; fi if [ $SRS_RTC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-rtc"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-rtc"; fi + if [ $SRS_GB28181 = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-gb28181"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-gb28181"; fi if [ $SRS_NASM = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-nasm"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-nasm"; fi if [ $SRS_GPERF = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-gperf"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-gperf"; fi if [ $SRS_GPERF_MC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --with-gmc"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --without-gmc"; fi diff --git a/trunk/configure b/trunk/configure index 6d67ac5b56..28ab18db6f 100755 --- a/trunk/configure +++ b/trunk/configure @@ -277,10 +277,13 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then "srs_app_mpegts_udp" "srs_app_rtsp" "srs_app_listener" "srs_app_async_call" "srs_app_caster_flv" "srs_app_process" "srs_app_ng_exec" "srs_app_hourglass" "srs_app_dash" "srs_app_fragment" "srs_app_dvr" - "srs_app_coworkers" "srs_app_hybrid" "srs_app_gb28181" "srs_app_gb28181_sip") + "srs_app_coworkers" "srs_app_hybrid") if [[ $SRS_RTC == YES ]]; then MODULE_FILES+=("srs_app_rtc" "srs_app_rtc_conn" "srs_app_dtls" "srs_app_audio_recode" "srs_app_sdp") fi + if [[ $SRS_GB28181 == YES ]]; then + MODULE_FILES+=("srs_app_gb28181" "srs_app_gb28181_sip") + fi DEFINES="" # add each modules for app for SRS_MODULE in ${SRS_MODULES[*]}; do diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 92094bffc7..35fac11cdf 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -1578,6 +1578,8 @@ srs_error_t SrsGoApiError::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage return srs_api_response_code(w, r, 100); } +#ifdef SRS_AUTO_GB28181 + SrsGoApiGb28181::SrsGoApiGb28181() { } @@ -1703,8 +1705,10 @@ srs_error_t SrsGoApiGb28181::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa } } +#endif + SrsHttpApi::SrsHttpApi(IConnectionManager* cm, srs_netfd_t fd, SrsHttpServeMux* m, string cip) -: SrsConnection(cm, fd, cip) + : SrsConnection(cm, fd, cip) { mux = m; cors = new SrsHttpCorsMux(); diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index cf085f4994..758beaba1b 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -233,6 +233,8 @@ class SrsGoApiError : public ISrsHttpHandler }; +#ifdef SRS_AUTO_GB28181 + class SrsGoApiGb28181 : public ISrsHttpHandler { public: @@ -242,6 +244,8 @@ class SrsGoApiGb28181 : public ISrsHttpHandler virtual srs_error_t serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r); }; +#endif + class SrsHttpApi : virtual public SrsConnection, virtual public ISrsReloadHandler { private: diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index efd4ac8e1b..20fbed740c 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -349,6 +349,7 @@ SrsUdpCasterListener::~SrsUdpCasterListener() srs_freep(caster); } +#ifdef SRS_AUTO_GB28181 SrsGb28181Listener::SrsGb28181Listener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsUdpStreamListener(svr, t, NULL) { @@ -369,6 +370,8 @@ SrsGb28181Listener::~SrsGb28181Listener() srs_freep(caster); } +#endif + SrsSignalManager* SrsSignalManager::instance = NULL; SrsSignalManager::SrsSignalManager(SrsServer* s) @@ -692,8 +695,10 @@ void SrsServer::destroy() srs_freep(signal_manager); srs_freep(conn_manager); +#ifdef SRS_AUTO_GB28181 //free global gb28281 manager srs_freep(_srs_gb28181); +#endif } void SrsServer::dispose() @@ -984,10 +989,11 @@ srs_error_t SrsServer::http_handle() if ((err = http_api_mux->handle("/api/v1/clusters", new SrsGoApiClusters())) != srs_success) { return srs_error_wrap(err, "handle raw"); } - +#ifdef SRS_AUTO_GB28181 if ((err = http_api_mux->handle("/api/v1/gb28181", new SrsGoApiGb28181())) != srs_success) { return srs_error_wrap(err, "handle raw"); } +#endif // test the request info. if ((err = http_api_mux->handle("/api/v1/tests/requests", new SrsGoApiRequests())) != srs_success) { @@ -1342,6 +1348,7 @@ srs_error_t SrsServer::listen_http_stream() return err; } +#ifdef SRS_AUTO_GB28181 srs_error_t SrsServer::listen_gb28281_sip(SrsConfDirective* stream_caster) { srs_error_t err = srs_success; @@ -1365,6 +1372,7 @@ srs_error_t SrsServer::listen_gb28281_sip(SrsConfDirective* stream_caster) return err; } +#endif srs_error_t SrsServer::listen_stream_caster() { @@ -1391,6 +1399,7 @@ srs_error_t SrsServer::listen_stream_caster() } else if (srs_stream_caster_is_flv(caster)) { listener = new SrsHttpFlvListener(this, SrsListenerFlv, stream_caster); } else if (srs_stream_caster_is_gb28181(caster)) { +#ifdef SRS_AUTO_GB28181 //init global gb28281 manger if (_srs_gb28181 == NULL){ _srs_gb28181 = new SrsGb28181Manger(stream_caster); @@ -1408,6 +1417,10 @@ srs_error_t SrsServer::listen_stream_caster() //gb28281 stream listener listener = new SrsGb28181Listener(this, SrsListenerGb28181RtpMux, stream_caster); +#else + srs_warn("gb28181 is disabled, please enable it by: ./configure --with-gb28181"); + continue; +#endif } else { return srs_error_new(ERROR_STREAM_CASTER_ENGINE, "invalid caster %s", caster.c_str()); } diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index dd014d2109..0010929f5f 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -164,6 +164,8 @@ class SrsUdpCasterListener : public SrsUdpStreamListener virtual ~SrsUdpCasterListener(); }; +#ifdef SRS_AUTO_GB28181 + // A UDP gb28181 listener, for sip and rtp stream mux server. class SrsGb28181Listener : public SrsUdpStreamListener { @@ -172,6 +174,8 @@ class SrsGb28181Listener : public SrsUdpStreamListener virtual ~SrsGb28181Listener(); }; +#endif + // Convert signal to io, // @see: st-1.9/docs/notes.html class SrsSignalManager : public ISrsCoroutineHandler @@ -319,7 +323,9 @@ class SrsServer : virtual public ISrsReloadHandler, virtual public ISrsSourceHan virtual srs_error_t listen_http_api(); virtual srs_error_t listen_http_stream(); virtual srs_error_t listen_stream_caster(); +#ifdef SRS_AUTO_GB28181 virtual srs_error_t listen_gb28281_sip(SrsConfDirective* c); +#endif // Close the listeners for specified type, // Remove the listen object from manager. virtual void close_listeners(SrsListenerType type); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index d8c3ff8e14..7bf4c70967 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -43,7 +43,7 @@ #define RTMP_SIG_SRS_CODE "Leo" #define RTMP_SIG_SRS_URL "https://github.com/ossrs/srs" #define RTMP_SIG_SRS_LICENSE "MIT" -#define RTMP_SIG_SRS_AUTHORS "Winlin,Wenjie,Runner365,John,B.P.Y" +#define RTMP_SIG_SRS_AUTHORS "Winlin,Wenjie,Runner365,John,B.P.Y,Lixin" #define RTMP_SIG_SRS_VERSION SRS_XSTR(VERSION_MAJOR) "." SRS_XSTR(VERSION_MINOR) "." SRS_XSTR(VERSION_REVISION) #define RTMP_SIG_SRS_SERVER RTMP_SIG_SRS_KEY "/" RTMP_SIG_SRS_VERSION "(" RTMP_SIG_SRS_CODE ")" diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 210565f1ee..ddc59887fc 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION4_HPP #define SRS_CORE_VERSION4_HPP -#define SRS_VERSION4_REVISION 17 +#define SRS_VERSION4_REVISION 18 #endif