From 8db2c3d8211751f166b21731e05b0d97456879a8 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 16 Mar 2020 11:39:20 +0800 Subject: [PATCH 01/30] For #1635, refine inotify watch for relative path --- trunk/src/kernel/srs_kernel_utility.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 861be3610..5fe03a129 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -652,15 +652,20 @@ bool srs_path_exists(std::string path) string srs_path_dirname(string path) { std::string dirname = path; + + // No slash, it must be current dir. size_t pos = string::npos; - - if ((pos = dirname.rfind("/")) != string::npos) { - if (pos == 0) { - return "/"; - } - dirname = dirname.substr(0, pos); + if ((pos = dirname.rfind("/")) == string::npos) { + return "./"; } - + + // Path under root. + if (pos == 0) { + return "/"; + } + + // Fetch the directory. + dirname = dirname.substr(0, pos); return dirname; } From a8ddd5afe7e87dddf5119e18df38b64ba00e51e6 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 16 Mar 2020 11:52:31 +0800 Subject: [PATCH 02/30] For #1635, refine inotify watch for relative path --- trunk/src/utest/srs_utest_kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index f0270f9b6..acfdeeff0 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -2565,7 +2565,7 @@ VOID TEST(KernelUtility, BytesUtils) VOID TEST(KernelUtility, PathUtils) { if (true) { - EXPECT_TRUE("" == srs_path_dirname("")); + EXPECT_TRUE("./" == srs_path_dirname("")); EXPECT_TRUE("/" == srs_path_dirname("/")); EXPECT_TRUE("/" == srs_path_dirname("//")); EXPECT_TRUE("/" == srs_path_dirname("/stream")); From 9ba861f42fcd95d3db15bd3bcc6263566cbefb29 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 16 Mar 2020 15:11:34 +0800 Subject: [PATCH 03/30] 3.0release is beta now --- trunk/src/main/srs_main_server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 5ded5d40a..603e0f1e2 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -331,8 +331,8 @@ void show_macro_features() #endif #if VERSION_MAJOR > VERSION_STABLE -#warning "Current branch is unstable." - srs_warn("Develop is unstable, please use branch: git checkout -b %s origin/%s", VERSION_STABLE_BRANCH, VERSION_STABLE_BRANCH); + #warning "Current branch is beta." + srs_warn("%s/%s is beta", RTMP_SIG_SRS_KEY, RTMP_SIG_SRS_VERSION); #endif #if defined(SRS_PERF_SO_SNDBUF_SIZE) && !defined(SRS_PERF_MW_SO_SNDBUF) From aead1a5b74f75fc4f9d1db0b7041f6582c43397e Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 18 Mar 2020 16:33:08 +0800 Subject: [PATCH 04/30] Release 3.0.134, 3.0-b3 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 3ab704f65..962d715db 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-18, [3.0 beta3(3.0.134)][r3.0b3] released. 122509 lines. * v3.0, 2020-03-12, For [#1635][bug #1635], inotify watch ConfigMap for reload. 3.0.134 * v3.0, 2020-03-12, For [#1635][bug #1635], support auto reaload config by inotify. 3.0.129 * v3.0, 2020-03-12, For [#1630][bug #1630], disable cache for stream changing, and drop dup header. 3.0.128 @@ -752,6 +753,7 @@ For previous versions, please read: ## Releases +* 2020-03-18, [Release v3.0-b3][r3.0b3], 3.0 beta3, 3.0.134, 122509 lines. * 2020-03-05, [Release v3.0-b2][r3.0b2], 3.0 beta2, 3.0.123, 122170 lines. * 2020-02-14, [Release v3.0-b1][r3.0b1], 3.0 beta1, 3.0.117, 121964 lines. * 2020-02-02, [Release v3.0-b0][r3.0b0], 3.0 beta0, 3.0.112, 121709 lines. @@ -1674,6 +1676,7 @@ Winlin [exo #828]: https://github.com/google/ExoPlayer/pull/828 +[r3.0b3]: https://github.com/ossrs/srs/releases/tag/v3.0-b3 [r3.0b2]: https://github.com/ossrs/srs/releases/tag/v3.0-b2 [r3.0b1]: https://github.com/ossrs/srs/releases/tag/v3.0-b1 [r3.0b0]: https://github.com/ossrs/srs/releases/tag/v3.0-b0 From bbfb03f98a3bdb32d5e062e74b86d573f5f0a126 Mon Sep 17 00:00:00 2001 From: l Date: Thu, 19 Mar 2020 14:36:56 +0800 Subject: [PATCH 05/30] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dsrs=5Fwrite=5Flarge=5Fi?= =?UTF-8?q?ovs=E4=B8=ADnwrite=E6=9C=AA=E7=B4=AF=E5=8A=A0=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trunk/src/protocol/srs_protocol_utility.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index 28141f625..56294defb 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -342,15 +342,19 @@ srs_error_t srs_write_large_iovs(ISrsProtocolReadWriter* skt, iovec* iovs, int s } return err; } - + // send in multiple times. int cur_iov = 0; + ssize_t nwrite = 0; while (cur_iov < size) { int cur_count = srs_min(limits, size - cur_iov); - if ((err = skt->writev(iovs + cur_iov, cur_count, pnwrite)) != srs_success) { + if ((err = skt->writev(iovs + cur_iov, cur_count, &nwrite)) != srs_success) { return srs_error_wrap(err, "writev"); } cur_iov += cur_count; + if (pnwrite) { + *pnwrite += nwrite; + } } return err; From 83f743645b69cb3bb33fb80b0929e37b187fed0a Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 19 Mar 2020 17:49:37 +0800 Subject: [PATCH 06/30] Release multiple processes for SRS by reuseport --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 962d715db..780a103a8 100755 --- a/README.md +++ b/README.md @@ -853,7 +853,7 @@ Comparing with other media servers, SRS is much better and stronger, for details | Feature | SRS | NGINX | CRTMPD | AMS | WOWZA | | ----------- | ------- | ----- | --------- | -------- | ------ | | Concurrency | 7.5k | 3k | 2k | 2k | 3k | -|MultipleProcess| Experiment| Stable | X | X | X | +|MultipleProcess| [Stable][v3_CN_ReusePort] | Stable | X | X | X | | RTMP Latency| 0.1s | 3s | 3s | 3s | 3s | | HLS Latency | 10s | 30s | X | 30s | 30s | @@ -1355,6 +1355,8 @@ Winlin [v3_CN_LowLatency#merged-write]: https://github.com/ossrs/srs/wiki/v3_CN_LowLatency#merged-write [v3_CN_NgExec]:https://github.com/ossrs/srs/wiki/v3_CN_NgExec [v3_EN_NgExec]:https://github.com/ossrs/srs/wiki/v3_EN_NgExec +[v3_CN_ReusePort]:https://github.com/ossrs/srs/wiki/v3_CN_ReusePort +[v3_EN_ReusePort]:https://github.com/ossrs/srs/wiki/v3_EN_ReusePort [bug #213]: https://github.com/ossrs/srs/issues/213 [bug #194]: https://github.com/ossrs/srs/issues/194 From 737e4bc32da79be5b256d52261d3fdc5e1a1cfe9 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 19 Mar 2020 17:57:23 +0800 Subject: [PATCH 07/30] Update --- README.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 780a103a8..fd4dcfafb 100755 --- a/README.md +++ b/README.md @@ -916,18 +916,18 @@ The data for playing RTMP was benchmarked by [SB][srs-bench]: | Update | SRS | Clients | Type | CPU | Memory | Commit | | ------------- | --------- | ------------- | ------------- | --------- | -------- | ------------ | -| 2013-11-28 | 0.5.0 | 1.8k(1800) | players | 90% | 41M | - | -| 2014-07-12 | 0.9.156 | 1.8k(1800) | players | 68% | 38MB | - | -| 2014-07-12 | 0.9.156 | 2.7k(2700) | players | 89% | 61MB | [code][p6] | -| 2014-11-11 | 1.0.5 | 2.7k(2700) | players | 85% | 66MB | - | -| 2014-11-11 | 2.0.12 | 2.7k(2700) | players | 85% | 66MB | - | -| 2014-11-12 | 2.0.14 | 2.7k(2700) | players | 69% | 59MB | - | -| 2014-11-12 | 2.0.14 | 3.5k(3500) | players | 95% | 78MB | [code][p7] | -| 2014-11-13 | 2.0.15 | 6.0k(6000) | players | 82% | 203MB | [code][p8] | -| 2014-11-22 | 2.0.30 | 7.5k(7500) | players | 87% | 320MB | [code][p9] | -| 2014-12-05 | 2.0.55 | 8.0k(8000) | players | 89% | 360MB | [code][p10] | -| 2014-12-05 | 2.0.57 | 9.0k(9000) | players | 90% | 468MB | [code][p11] | | 2014-12-07 | 2.0.67 | 10k(10000) | players | 95% | 656MB | [code][p12] | +| 2014-12-05 | 2.0.57 | 9.0k(9000) | players | 90% | 468MB | [code][p11] | +| 2014-12-05 | 2.0.55 | 8.0k(8000) | players | 89% | 360MB | [code][p10] | +| 2014-11-22 | 2.0.30 | 7.5k(7500) | players | 87% | 320MB | [code][p9] | +| 2014-11-13 | 2.0.15 | 6.0k(6000) | players | 82% | 203MB | [code][p8] | +| 2014-11-12 | 2.0.14 | 3.5k(3500) | players | 95% | 78MB | [code][p7] | +| 2014-11-12 | 2.0.14 | 2.7k(2700) | players | 69% | 59MB | - | +| 2014-11-11 | 2.0.12 | 2.7k(2700) | players | 85% | 66MB | - | +| 2014-11-11 | 1.0.5 | 2.7k(2700) | players | 85% | 66MB | - | +| 2014-07-12 | 0.9.156 | 2.7k(2700) | players | 89% | 61MB | [code][p6] | +| 2014-07-12 | 0.9.156 | 1.8k(1800) | players | 68% | 38MB | - | +| 2013-11-28 | 0.5.0 | 1.8k(1800) | players | 90% | 41M | - | **Publish RTMP benchmark** @@ -936,15 +936,15 @@ The data for publishing RTMP was benchmarked by [SB][srs-bench]: | Update | SRS | Clients | Type | CPU | Memory | Commit | | ------------- | --------- | ------------- | ------------- | --------- | -------- | ------------ | -| 2014-12-03 | 1.0.10 | 1.2k(1200) | publishers | 96% | 43MB | - | -| 2014-12-03 | 2.0.12 | 1.2k(1200) | publishers | 96% | 43MB | - | -| 2014-12-03 | 2.0.47 | 1.2k(1200) | publishers | 84% | 76MB | [code][p1] | -| 2014-12-03 | 2.0.47 | 1.4k(1400) | publishers | 95% | 140MB | - | -| 2014-12-03 | 2.0.48 | 1.4k(1400) | publishers | 95% | 140MB | [code][p2] | -| 2014-12-04 | 2.0.49 | 1.4k(1400) | publishers | 68% | 144MB | - | -| 2014-12-04 | 2.0.49 | 2.5k(2500) | publishers | 95% | 404MB | [code][p3] | -| 2014-12-04 | 2.0.51 | 2.5k(2500) | publishers | 91% | 259MB | [code][p4] | | 2014-12-04 | 2.0.52 | 4.0k(4000) | publishers | 80% | 331MB | [code][p5] | +| 2014-12-04 | 2.0.51 | 2.5k(2500) | publishers | 91% | 259MB | [code][p4] | +| 2014-12-04 | 2.0.49 | 2.5k(2500) | publishers | 95% | 404MB | [code][p3] | +| 2014-12-04 | 2.0.49 | 1.4k(1400) | publishers | 68% | 144MB | - | +| 2014-12-03 | 2.0.48 | 1.4k(1400) | publishers | 95% | 140MB | [code][p2] | +| 2014-12-03 | 2.0.47 | 1.4k(1400) | publishers | 95% | 140MB | - | +| 2014-12-03 | 2.0.47 | 1.2k(1200) | publishers | 84% | 76MB | [code][p1] | +| 2014-12-03 | 2.0.12 | 1.2k(1200) | publishers | 96% | 43MB | - | +| 2014-12-03 | 1.0.10 | 1.2k(1200) | publishers | 96% | 43MB | - | **Play HTTP FLV benchmark** @@ -954,11 +954,11 @@ The data for playing HTTP FLV was benchmarked by [SB][srs-bench]: | Update | SRS | Clients | Type | CPU | Memory | Commit | | ------------- | --------- | ------------- | ------------- | --------- | -------- | ------------ | -| 2014-05-24 | 2.0.167 | 1.0k(1000) | players | 82% | 86MB | - | -| 2014-05-24 | 2.0.168 | 2.3k(2300) | players | 92% | 276MB | [code][p17] | -| 2014-05-24 | 2.0.169 | 3.0k(3000) | players | 94% | 188MB | [code][p18] | -| 2014-05-24 | 2.0.170 | 3.0k(3000) | players | 89% | 96MB | [code][p19] | | 2014-05-25 | 2.0.171 | 6.0k(6000) | players | 84% | 297MB | [code][p20] | +| 2014-05-24 | 2.0.170 | 3.0k(3000) | players | 89% | 96MB | [code][p19] | +| 2014-05-24 | 2.0.169 | 3.0k(3000) | players | 94% | 188MB | [code][p18] | +| 2014-05-24 | 2.0.168 | 2.3k(2300) | players | 92% | 276MB | [code][p17] | +| 2014-05-24 | 2.0.167 | 1.0k(1000) | players | 82% | 86MB | - | **Latency benchmark** @@ -968,9 +968,9 @@ The latency between encoder and player with realtime config([CN][v3_CN_LowLatenc | Update | SRS | VP6 | H.264 | VP6+MP3 | H.264+MP3 | | ------------- | --------- | --------- | --------- | --------- | -------- | -| 2014-12-03 | 1.0.10 | 0.4s | 0.4s | 0.9s | 1.2s | -| 2014-12-12 | 2.0.70 |[0.1s][p13]|[0.4s][p14]| 1.0s | 0.9s | | 2014-12-16 | 2.0.72 | 0.1s | 0.4s |[0.8s][p15]|[0.6s][p16]| +| 2014-12-12 | 2.0.70 |[0.1s][p13]|[0.4s][p14]| 1.0s | 0.9s | +| 2014-12-03 | 1.0.10 | 0.4s | 0.4s | 0.9s | 1.2s | > 2018-08-05, [c45f72e](https://github.com/ossrs/srs/commit/c45f72ef7bac9c7cf85b9125fc9e3aafd53f396f), Refine HTTP-FLV latency, support realtime mode. 2.0.252 From 2911c814c413cf16c1413970aedcbeb85879cebd Mon Sep 17 00:00:00 2001 From: yanghuiwen Date: Fri, 20 Mar 2020 17:07:16 +0800 Subject: [PATCH 08/30] =?UTF-8?q?=E6=9B=B4=E6=96=B0CMakeLists.txt=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E4=BD=BF=E9=A1=B9=E7=9B=AE=E8=83=BD=E5=9C=A8?= =?UTF-8?q?clion=E7=BC=96=E8=AF=91=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trunk/ide/srs_clion/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/trunk/ide/srs_clion/CMakeLists.txt b/trunk/ide/srs_clion/CMakeLists.txt index 453e81e9b..ed2734e1d 100755 --- a/trunk/ide/srs_clion/CMakeLists.txt +++ b/trunk/ide/srs_clion/CMakeLists.txt @@ -1,15 +1,17 @@ cmake_minimum_required(VERSION 2.6.4) project(srs CXX) -INCLUDE_DIRECTORIES(../../objs - ../../objs/st ../../objs/hp ../../objs/openssl/include - ../../src/core ../../src/kernel ../../src/protocol ../../src/app) +INCLUDE_DIRECTORIES(../../objs + ../../objs/st ../../objs/hp ../../objs/openssl/include + ../../src/core ../../src/kernel ../../src/protocol ../../src/app + ../../src/service) set(SOURCE_FILES ../../src/main/srs_main_server.cpp) AUX_SOURCE_DIRECTORY(../../src/core SOURCE_FILES) AUX_SOURCE_DIRECTORY(../../src/kernel SOURCE_FILES) AUX_SOURCE_DIRECTORY(../../src/protocol SOURCE_FILES) AUX_SOURCE_DIRECTORY(../../src/app SOURCE_FILES) +AUX_SOURCE_DIRECTORY(../../src/service SOURCE_FILES) ADD_DEFINITIONS("-g -O0") @@ -18,7 +20,6 @@ TARGET_LINK_LIBRARIES(srs dl) TARGET_LINK_LIBRARIES(srs ${PROJECT_SOURCE_DIR}/../../objs/st/libst.a) TARGET_LINK_LIBRARIES(srs ${PROJECT_SOURCE_DIR}/../../objs/openssl/lib/libssl.a) TARGET_LINK_LIBRARIES(srs ${PROJECT_SOURCE_DIR}/../../objs/openssl/lib/libcrypto.a) -TARGET_LINK_LIBRARIES(srs ${PROJECT_SOURCE_DIR}/../../objs/hp/libhttp_parser.a) TARGET_LINK_LIBRARIES(srs -ldl) IF(NOT EXISTS ${PROJECT_SOURCE_DIR}/../../objs/st/libst.a) From 5a55cff7ba440eb238a8a2999f813c1c1e5dc599 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 16:30:29 +0800 Subject: [PATCH 09/30] Update mirror --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fd4dcfafb..cde53ea3f 100755 --- a/README.md +++ b/README.md @@ -1121,23 +1121,25 @@ A big THANK YOU goes to: OSChina: [https://gitee.com/winlinvip/srs.oschina][oschina], the GIT usage([CN][v1_CN_Git], [EN][v1_EN_Git]) ``` -git clone https://gitee.com/winlinvip/srs.oschina.git +git clone https://gitee.com/winlinvip/srs.oschina.git srs && +cd srs && git remote set-url origin https://github.com/ossrs/srs.git && git pull ``` > Remark: For users in China, recomment to use mirror from CSDN or OSChina, because they are much faster. +Gitlab: [https://gitlab.com/winlinvip/srs-gitlab][gitlab], the GIT usage([CN][v1_CN_Git], [EN][v1_EN_Git]) + +``` +git clone https://gitlab.com/winlinvip/srs-gitlab.git srs && +cd srs && git remote set-url origin https://github.com/ossrs/srs.git && git pull +``` + Github: [https://github.com/ossrs/srs][srs], the GIT usage([CN][v1_CN_Git], [EN][v1_EN_Git]) ``` git clone https://github.com/ossrs/srs.git ``` -Gitlab: [https://gitlab.com/winlinvip/srs-gitlab][gitlab], the GIT usage([CN][v1_CN_Git], [EN][v1_EN_Git]) - -``` -git clone https://gitlab.com/winlinvip/srs-gitlab.git -``` - | Branch | Cost | Size | CMD | | --- | --- | --- | --- | | 3.0release | 2m19.931s | 262MB | git clone -b 3.0release https://gitee.com/winlinvip/srs.oschina.git | From 75f62dc653465c4f474fe77619b6a9c59de75adb Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 16:34:18 +0800 Subject: [PATCH 10/30] Update mirror --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cde53ea3f..b56e9edaf 100755 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ SRS is a RTMP/HLS/WebRTC/SRT/GB28181 streaming cluster, high efficiency, stable **Step 1:** Get SRS. ``` -git clone https://github.com/ossrs/srs && -cd srs/trunk +git clone https://gitee.com/winlinvip/srs.oschina.git srs && +cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git pull ``` > Note: Repository too large? Please clone from these [mirrors](#mirrors) instead. From b6b52363fbbffdcee926327cc2302a0095562191 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 19:41:59 +0800 Subject: [PATCH 11/30] Update authors --- AUTHORS.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 352376b94..40923bb25 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -55,4 +55,5 @@ CONTRIBUTORS ordered by first contribution. * lam2003 * runner365 * XiaofengWang -* XiaLixin \ No newline at end of file +* XiaLixin +* yanghuiwen From f89b4b3b26bec6b25bd56d7505d7fb831b173b9e Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 20:20:40 +0800 Subject: [PATCH 12/30] For #1651, fix return pnwrite of srs_write_large_iovs. 3.0.135 --- README.md | 2 + trunk/src/core/srs_core_version3.hpp | 2 +- trunk/src/protocol/srs_protocol_utility.cpp | 2 +- trunk/src/utest/srs_utest_protocol.cpp | 64 ++++++++++++++++++++- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b56e9edaf..2cd74f917 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-21, For [#1651][bug #1651], fix return pnwrite of srs_write_large_iovs. 3.0.135 * v3.0, 2020-03-18, [3.0 beta3(3.0.134)][r3.0b3] released. 122509 lines. * v3.0, 2020-03-12, For [#1635][bug #1635], inotify watch ConfigMap for reload. 3.0.134 * v3.0, 2020-03-12, For [#1635][bug #1635], support auto reaload config by inotify. 3.0.129 @@ -1676,6 +1677,7 @@ Winlin [bug #1594]: https://github.com/ossrs/srs/issues/1594 [bug #1630]: https://github.com/ossrs/srs/issues/1630 [bug #1635]: https://github.com/ossrs/srs/issues/1635 +[bug #1651]: https://github.com/ossrs/srs/issues/1651 [bug #yyyyyyyyyyyyy]: https://github.com/ossrs/srs/issues/yyyyyyyyyyyyy [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 5ff02aa5a..85bd342c0 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 134 +#define SRS_VERSION3_REVISION 135 #endif diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index 56294defb..2582a0c1a 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -336,7 +336,7 @@ srs_error_t srs_write_large_iovs(ISrsProtocolReadWriter* skt, iovec* iovs, int s #endif // send in a time. - if (size < limits) { + if (size <= limits) { if ((err = skt->writev(iovs, size, pnwrite)) != srs_success) { return srs_error_wrap(err, "writev"); } diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index 0e952cf68..2535b6fd2 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -230,8 +230,6 @@ srs_error_t MockBufferIO::writev(const iovec *iov, int iov_size, ssize_t* nwrite total += writen; } - sbytes += total; - if (nwrite) { *nwrite = total; } @@ -6412,3 +6410,65 @@ VOID TEST(ProtocolKbpsTest, RAWStatistic) } } +VOID TEST(ProtocolKbpsTest, WriteLargeIOVs) +{ + srs_error_t err; + + if (true) { + iovec iovs[1]; + iovs[0].iov_base = (char*)"Hello"; + iovs[0].iov_len = 5; + + MockBufferIO io; + ssize_t nn = 0; + HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, 1, &nn)); + EXPECT_EQ(5, nn); + EXPECT_EQ(5, io.sbytes); + } + + if (true) { + iovec iovs[1024]; + int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec)); + for (int i = 0; i < nn_iovs; i++) { + iovs[i].iov_base = (char*)"Hello"; + iovs[i].iov_len = 5; + } + + MockBufferIO io; + ssize_t nn = 0; + HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn)); + EXPECT_EQ(5 * nn_iovs, nn); + EXPECT_EQ(5 * nn_iovs, io.sbytes); + } + + if (true) { + iovec iovs[1025]; + int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec)); + for (int i = 0; i < nn_iovs; i++) { + iovs[i].iov_base = (char*)"Hello"; + iovs[i].iov_len = 5; + } + + MockBufferIO io; + ssize_t nn = 0; + HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn)); + EXPECT_EQ(5 * nn_iovs, nn); + EXPECT_EQ(5 * nn_iovs, io.sbytes); + } + + if (true) { + iovec iovs[4096]; + int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec)); + for (int i = 0; i < nn_iovs; i++) { + iovs[i].iov_base = (char*)"Hello"; + iovs[i].iov_len = 5; + } + + MockBufferIO io; + ssize_t nn = 0; + HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn)); + EXPECT_EQ(5 * nn_iovs, nn); + EXPECT_EQ(5 * nn_iovs, io.sbytes); + } +} + From 850a4bbf205c4b603a2c6331e1eb65c4a354f0af Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 20:41:37 +0800 Subject: [PATCH 13/30] Fix #1619, configure without utest by default. 3.0.136 --- .circleci/config.yml | 4 ++-- README.md | 2 ++ trunk/auto/options.sh | 6 +++--- trunk/src/core/srs_core_version3.hpp | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9fa2e06e3..48d678850 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,13 +5,13 @@ jobs: - image: ossrs/srs:dev steps: - checkout - - run: cd trunk && ./configure && make + - run: cd trunk && ./configure --with-utest && make test: docker: - image: ossrs/srs:dev steps: - checkout - - run: cd trunk && ./configure --gcov && make && ./objs/srs_utest && bash auto/coverage.sh + - run: cd trunk && ./configure --with-utest --gcov && make && ./objs/srs_utest && bash auto/coverage.sh workflows: version: 2 build_and_test: diff --git a/README.md b/README.md index 2cd74f917..f25438e0a 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-21, For [#1619][bug #1619], configure without utest by default. 3.0.136 * v3.0, 2020-03-21, For [#1651][bug #1651], fix return pnwrite of srs_write_large_iovs. 3.0.135 * v3.0, 2020-03-18, [3.0 beta3(3.0.134)][r3.0b3] released. 122509 lines. * v3.0, 2020-03-12, For [#1635][bug #1635], inotify watch ConfigMap for reload. 3.0.134 @@ -1678,6 +1679,7 @@ Winlin [bug #1630]: https://github.com/ossrs/srs/issues/1630 [bug #1635]: https://github.com/ossrs/srs/issues/1635 [bug #1651]: https://github.com/ossrs/srs/issues/1651 +[bug #1619]: https://github.com/ossrs/srs/issues/1619 [bug #yyyyyyyyyyyyy]: https://github.com/ossrs/srs/issues/yyyyyyyyyyyyy [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 7bf4f209c..4c6bc58ca 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -20,7 +20,7 @@ SRS_NGINX=NO SRS_FFMPEG_TOOL=NO SRS_LIBRTMP=NO SRS_RESEARCH=NO -SRS_UTEST=YES +SRS_UTEST=NO SRS_GPERF=NO # Performance test: tcmalloc SRS_GPERF_MC=NO # Performance test: gperf memory check SRS_GPERF_MD=NO # Performance test: gperf memory defence @@ -386,7 +386,7 @@ function apply_user_presets() { SRS_HDS=YES SRS_LIBRTMP=YES SRS_RESEARCH=NO - SRS_UTEST=YES + SRS_UTEST=NO SRS_STATIC=NO fi @@ -413,7 +413,7 @@ function apply_user_presets() { SRS_HDS=YES SRS_LIBRTMP=YES SRS_RESEARCH=NO - SRS_UTEST=YES + SRS_UTEST=NO SRS_STATIC=NO fi diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 85bd342c0..e6022c5df 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 135 +#define SRS_VERSION3_REVISION 136 #endif From 0dd6c31487c2d4adc163d0b136d3c5976c7e2a7d Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 21 Mar 2020 22:41:25 +0800 Subject: [PATCH 14/30] Fix #1629, fix kickoff FLV client bug. 3.0.137 --- README.md | 2 ++ trunk/src/app/srs_app_http_conn.cpp | 38 ++++++++++++++++++++------- trunk/src/app/srs_app_http_conn.hpp | 3 +++ trunk/src/app/srs_app_http_stream.cpp | 12 ++++----- trunk/src/core/srs_core_version3.hpp | 2 +- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index f25438e0a..e7b88dcbf 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-21, For [#1629][bug #1629], fix kickoff FLV client bug. 3.0.137 * v3.0, 2020-03-21, For [#1619][bug #1619], configure without utest by default. 3.0.136 * v3.0, 2020-03-21, For [#1651][bug #1651], fix return pnwrite of srs_write_large_iovs. 3.0.135 * v3.0, 2020-03-18, [3.0 beta3(3.0.134)][r3.0b3] released. 122509 lines. @@ -1680,6 +1681,7 @@ Winlin [bug #1635]: https://github.com/ossrs/srs/issues/1635 [bug #1651]: https://github.com/ossrs/srs/issues/1651 [bug #1619]: https://github.com/ossrs/srs/issues/1619 +[bug #1629]: https://github.com/ossrs/srs/issues/1629 [bug #yyyyyyyyyyyyy]: https://github.com/ossrs/srs/issues/yyyyyyyyyyyyy [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index fc1831aa4..8f9429cbc 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -198,19 +198,32 @@ srs_error_t SrsResponseOnlyHttpConn::pop_message(ISrsHttpMessage** preq) srs_error_t err = srs_success; SrsStSocket skt; - + if ((err = skt.initialize(stfd)) != srs_success) { return srs_error_wrap(err, "init socket"); } - - if ((err = parser->parse_message(&skt, preq)) != srs_success) { - return srs_error_wrap(err, "parse message"); + + // Check user interrupt by interval. + skt.set_recv_timeout(3 * SRS_UTIME_SECONDS); + + // drop all request body. + char body[4096]; + while (true) { + if ((err = trd->pull()) != srs_success) { + return srs_error_wrap(err, "timeout"); + } + + if ((err = skt.read(body, 4096, NULL)) != srs_success) { + // Because we use timeout to check trd state, so we should ignore any timeout. + if (srs_error_code(err) == ERROR_SOCKET_TIMEOUT) { + srs_freep(err); + continue; + } + + return srs_error_wrap(err, "read response"); + } } - // Attach owner connection to message. - SrsHttpMessage* hreq = (SrsHttpMessage*)(*preq); - hreq->set_connection(this); - return err; } @@ -219,12 +232,12 @@ srs_error_t SrsResponseOnlyHttpConn::on_got_http_message(ISrsHttpMessage* msg) srs_error_t err = srs_success; ISrsHttpResponseReader* br = msg->body_reader(); - + // when not specified the content length, ignore. if (msg->content_length() == -1) { return err; } - + // drop all request body. char body[4096]; while (!br->eof()) { @@ -236,6 +249,11 @@ srs_error_t SrsResponseOnlyHttpConn::on_got_http_message(ISrsHttpMessage* msg) return err; } +void SrsResponseOnlyHttpConn::expire() +{ + SrsHttpConn::expire(); +} + SrsHttpServer::SrsHttpServer(SrsServer* svr) { server = svr; diff --git a/trunk/src/app/srs_app_http_conn.hpp b/trunk/src/app/srs_app_http_conn.hpp index f3de6659e..7529cfc5b 100644 --- a/trunk/src/app/srs_app_http_conn.hpp +++ b/trunk/src/app/srs_app_http_conn.hpp @@ -101,6 +101,9 @@ public: virtual srs_error_t pop_message(ISrsHttpMessage** preq); public: virtual srs_error_t on_got_http_message(ISrsHttpMessage* msg); +public: + // Set connection to expired. + virtual void expire(); }; // The http server, use http stream or static server to serve requests. diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index fb7bd54b3..815561e1e 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -592,10 +592,15 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess SrsAutoFree(SrsPithyPrint, pprint); SrsMessageArray msgs(SRS_PERF_MW_MSGS); + + // Use receive thread to accept the close event to avoid FD leak. + // @see https://github.com/ossrs/srs/issues/636#issuecomment-298208427 + SrsHttpMessage* hr = dynamic_cast(r); + SrsResponseOnlyHttpConn* hc = dynamic_cast(hr->connection()); // update the statistic when source disconveried. SrsStatistic* stat = SrsStatistic::instance(); - if ((err = stat->on_client(_srs_context->get_id(), req, NULL, SrsRtmpConnPlay)) != srs_success) { + if ((err = stat->on_client(_srs_context->get_id(), req, hc, SrsRtmpConnPlay)) != srs_success) { return srs_error_wrap(err, "stat on client"); } @@ -613,11 +618,6 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess } SrsFlvStreamEncoder* ffe = dynamic_cast(enc); - - // Use receive thread to accept the close event to avoid FD leak. - // @see https://github.com/ossrs/srs/issues/636#issuecomment-298208427 - SrsHttpMessage* hr = dynamic_cast(r); - SrsResponseOnlyHttpConn* hc = dynamic_cast(hr->connection()); // Set the socket options for transport. bool tcp_nodelay = _srs_config->get_tcp_nodelay(req->vhost); diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index e6022c5df..95a9c694d 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 136 +#define SRS_VERSION3_REVISION 137 #endif From b12f0e8c8b2dc270441459dd79baacb8dccbe630 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 24 Mar 2020 13:12:00 +0800 Subject: [PATCH 15/30] Update readme --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e7b88dcbf..d516bbd16 100755 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ git clone https://gitee.com/winlinvip/srs.oschina.git srs && cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git pull ``` -> Note: Repository too large? Please clone from these [mirrors](#mirrors) instead. +> Note: We use [mirrors(gitee)](#mirrors) here, but it's also ok to directly clone by `git clone https://github.com/ossrs/srs.git && cd srs/trunk` **Step 2:** Build SRS. @@ -28,7 +28,7 @@ cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && gi ./configure && make ``` -> Remark: Recommend Centos6 64bits, please read wiki([CN][v3_CN_Build],[EN][v3_EN_Build]). +> Remark: Recommend to use Centos7 64bits, please read wiki([CN][v3_CN_Build],[EN][v3_EN_Build]). > Note: You can also build SRS in docker, please read [docker][docker-dev]. @@ -41,9 +41,12 @@ cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && gi **Whatever**, you can also directly run SRS in [docker][docker-srs3]: ``` -docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3 +docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 \ + registry.cn-hangzhou.aliyuncs.com/ossrs/srs:3 ``` +> Note: Again, we use [ACR](https://cr.console.aliyun.com/) here, you can directly use `docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3` instead. + **From here,** strongly recommend to read bellow wikis: * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP]) From b3b76b0ca6794aafc84537aafaa46c6b82961bd8 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 24 Mar 2020 13:17:05 +0800 Subject: [PATCH 16/30] Update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d516bbd16..2bc259c39 100755 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ SRS is a RTMP/HLS/WebRTC/SRT/GB28181 streaming cluster, high efficiency, stable ## Usage -**Step 1:** Get SRS. +**>>> Step 1:** Get SRS. ``` git clone https://gitee.com/winlinvip/srs.oschina.git srs && @@ -22,7 +22,7 @@ cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && gi > Note: We use [mirrors(gitee)](#mirrors) here, but it's also ok to directly clone by `git clone https://github.com/ossrs/srs.git && cd srs/trunk` -**Step 2:** Build SRS. +**>>> Step 2:** Build SRS. ``` ./configure && make @@ -38,16 +38,16 @@ cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && gi ./objs/srs -c conf/srs.conf ``` -**Whatever**, you can also directly run SRS in [docker][docker-srs3]: +**>>> Whatever**, you can also directly run SRS in [docker][docker-srs3]: ``` docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 \ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:3 ``` -> Note: Again, we use [ACR](https://cr.console.aliyun.com/) here, you can directly use `docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3` instead. +> Note: Again, we use [ACR](https://cr.console.aliyun.com/) here, you can directly run in docker hub by `docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3` -**From here,** strongly recommend to read bellow wikis: +**>>> From here,** strongly recommend to read bellow wikis: * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP]) * Usage: How to delivery RTMP Edge Cluster?([CN][v3_CN_SampleRTMPCluster], [EN][v3_EN_SampleRTMPCluster]) From c339542ce0a341eba8e5ca112b36e0b89b914da6 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 28 Mar 2020 17:20:40 +0800 Subject: [PATCH 17/30] Support macOS OSX --- trunk/3rdparty/st-srs/Makefile | 12 ++- trunk/3rdparty/st-srs/md.h | 32 ++++---- trunk/3rdparty/st-srs/md_darwin.S | 76 +++++++++++++++++++ trunk/auto/auto_headers.sh | 5 ++ trunk/auto/depends.sh | 98 ++++++++++++++++++++++++- trunk/auto/options.sh | 34 ++++----- trunk/src/app/srs_app_server.cpp | 8 +- trunk/src/app/srs_app_utility.cpp | 82 +++++++++++++++++++-- trunk/src/kernel/srs_kernel_utility.cpp | 2 + trunk/src/kernel/srs_kernel_utility.hpp | 6 +- trunk/src/main/srs_main_server.cpp | 4 +- trunk/src/service/srs_service_log.cpp | 2 +- trunk/src/utest/srs_utest_kernel.cpp | 2 + 13 files changed, 312 insertions(+), 51 deletions(-) create mode 100644 trunk/3rdparty/st-srs/md_darwin.S diff --git a/trunk/3rdparty/st-srs/Makefile b/trunk/3rdparty/st-srs/Makefile index 304d44377..601d3e507 100644 --- a/trunk/3rdparty/st-srs/Makefile +++ b/trunk/3rdparty/st-srs/Makefile @@ -128,6 +128,7 @@ OTHER_FLAGS = -Wall endif ifeq ($(OS), DARWIN) +EXTRA_OBJS = $(TARGETDIR)/md_darwin.o LD = cc SFLAGS = -fPIC -fno-common DSO_SUFFIX = dylib @@ -139,8 +140,8 @@ CFLAGS += -arch ppc LDFLAGS += -arch ppc endif ifeq ($(INTEL), yes) -CFLAGS += -arch i386 -arch x86_64 -LDFLAGS += -arch i386 -arch x86_64 +CFLAGS += -arch x86_64 +LDFLAGS += -arch x86_64 endif LDFLAGS += -dynamiclib -install_name /sw/lib/libst.$(MAJOR).$(DSO_SUFFIX) -compatibility_version $(MAJOR) -current_version $(VERSION) OTHER_FLAGS = -Wall @@ -313,7 +314,9 @@ endif # for SRS # disable examples for ubuntu crossbuild failed. # @see https://github.com/winlinvip/simple-rtmp-server/issues/308 +ifeq ($(OS), LINUX) EXAMPLES = +endif ifeq ($(OS), DARWIN) LINKNAME = libst.$(DSO_SUFFIX) @@ -369,10 +372,13 @@ $(HEADER): public.h $(TARGETDIR)/md.o: md.S $(CC) $(CFLAGS) -c $< -o $@ +$(TARGETDIR)/md_darwin.o: md_darwin.S + $(CC) $(CFLAGS) -c $< -o $@ + $(TARGETDIR)/%.o: %.c common.h md.h $(CC) $(CFLAGS) -c $< -o $@ -examples:: +examples: $(SLIBRARY) @echo Making $@ @cd $@; $(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" OS="$(OS)" TARGETDIR="$(TARGETDIR)" diff --git a/trunk/3rdparty/st-srs/md.h b/trunk/3rdparty/st-srs/md.h index dc4ef54c9..8c0a222d6 100644 --- a/trunk/3rdparty/st-srs/md.h +++ b/trunk/3rdparty/st-srs/md.h @@ -120,26 +120,30 @@ #define MD_ALWAYS_UNSERIALIZED_ACCEPT #define MD_HAVE_SOCKLEN_T - #define MD_SETJMP(env) _setjmp(env) - #define MD_LONGJMP(env, val) _longjmp(env, val) + #define MD_USE_BUILTIN_SETJMP - #if defined(__ppc__) - #define MD_JB_SP 0 - #elif defined(__i386__) - #define MD_JB_SP 9 - #elif defined(__x86_64__) - #define MD_JB_SP 4 + #if defined(__amd64__) || defined(__x86_64__) + #define JB_SP 12 + #define MD_GET_SP(_t) *((long *)&((_t)->context[JB_SP])) #else #error Unknown CPU architecture #endif - - #define MD_INIT_CONTEXT(_thread, _sp, _main) \ - ST_BEGIN_MACRO \ - if (MD_SETJMP((_thread)->context)) \ - _main(); \ - *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \ + + #define MD_INIT_CONTEXT(_thread, _sp, _main) \ + ST_BEGIN_MACRO \ + if (MD_SETJMP((_thread)->context)) \ + _main(); \ + MD_GET_SP(_thread) = (long) (_sp); \ ST_END_MACRO + #if defined(MD_USE_BUILTIN_SETJMP) + #define MD_SETJMP(env) _st_md_cxt_save(env) + #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val) + + extern int _st_md_cxt_save(jmp_buf env); + extern void _st_md_cxt_restore(jmp_buf env, int val); + #endif + #define MD_GET_UTIME() \ struct timeval tv; \ (void) gettimeofday(&tv, NULL); \ diff --git a/trunk/3rdparty/st-srs/md_darwin.S b/trunk/3rdparty/st-srs/md_darwin.S new file mode 100644 index 000000000..6cd163d44 --- /dev/null +++ b/trunk/3rdparty/st-srs/md_darwin.S @@ -0,0 +1,76 @@ + +/* If user disable the ASM, such as avoiding bugs in ASM, donot compile it. */ +#if !defined(MD_ST_NO_ASM) + +#if defined(__amd64__) || defined(__x86_64__) + + /****************************************************************/ + + /* + * Internal __jmp_buf layout + */ + #define JB_RBX 0 + #define JB_RBP 1 + #define JB_R12 2 /* Backup IP, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R13 3 /* Backup SP, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R14 4 /* Backup LR, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_R15 5 /* Backup PC, https://www.cnblogs.com/Five100Miles/p/8458561.html */ + #define JB_RSP 6 + #define JB_PC 7 + + .file "md_darwin.S" + .text + + /* _st_md_cxt_save(__jmp_buf env) */ /* The env is rdi, http://blog.chinaunix.net/uid-20157960-id-1974354.html */ + .globl __st_md_cxt_save + .align 16 + __st_md_cxt_save: + /* + * Save registers. + */ + movq %rbx, (JB_RBX*8)(%rdi) /* Save rbx to env[0], *(int64_t*)(rdi+0)=rbx */ + movq %rbp, (JB_RBP*8)(%rdi) /* Save rbp to env[1], *(int64_t*)(rdi+1)=rbp */ + movq %r12, (JB_R12*8)(%rdi) /* Save r12 to env[2], *(int64_t*)(rdi+2)=r12 */ + movq %r13, (JB_R13*8)(%rdi) /* Save r13 to env[3], *(int64_t*)(rdi+3)=r13 */ + movq %r14, (JB_R14*8)(%rdi) /* Save r14 to env[4], *(int64_t*)(rdi+4)=r14 */ + movq %r15, (JB_R15*8)(%rdi) /* Save r15 to env[5], *(int64_t*)(rdi+5)=r15 */ + /* Save SP */ + leaq 8(%rsp), %rdx /* Save *(int64_t*)(rsp+8) to rdx, https://my.oschina.net/guonaihong/blog/508907 */ + movq %rdx, (JB_RSP*8)(%rdi) /* Save rdx(rsp) to env[6], *(int64_t*)(rdi+6)=rdx */ + /* Save PC we are returning to */ + movq (%rsp), %rax /* Save PC(parent function address) %(rsp) to rax */ + movq %rax, (JB_PC*8)(%rdi) /* Save rax(PC) to env[7], *(int64_t*)(rdi+7)=rax */ + xorq %rax, %rax /* Reset rax to 0 */ + ret + + + /****************************************************************/ + + /* _st_md_cxt_restore(__jmp_buf env, int val) */ /* The env is rdi, val is esi/rsi, http://blog.chinaunix.net/uid-20157960-id-1974354.html */ + .globl __st_md_cxt_restore + .align 16 + __st_md_cxt_restore: + /* + * Restore registers. + */ + movq (JB_RBX*8)(%rdi), %rbx /* Load rbx from env[0] */ + movq (JB_RBP*8)(%rdi), %rbp /* Load rbp from env[1] */ + movq (JB_R12*8)(%rdi), %r12 /* Load r12 from env[2] */ + movq (JB_R13*8)(%rdi), %r13 /* Load r13 from env[3] */ + movq (JB_R14*8)(%rdi), %r14 /* Load r14 from env[4] */ + movq (JB_R15*8)(%rdi), %r15 /* Load r15 from env[5] */ + /* Set return value */ /* The esi is param1 val, the eax is return value */ + test %esi, %esi /* if (!val) { */ + mov $01, %eax /* val=1; */ + cmove %eax, %esi /* } */ + mov %esi, %eax /* return val; */ + movq (JB_PC*8)(%rdi), %rdx /* Load rdx(PC) from env[7] */ + movq (JB_RSP*8)(%rdi), %rsp /* Load rsp from env[6] */ + /* Jump to saved PC */ + jmpq *%rdx /* Jump to rdx(PC) */ + + /****************************************************************/ + +#endif + +#endif diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 87720b840..25564d1d2 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -137,6 +137,11 @@ if [ $SRS_CROSS_BUILD = YES ]; then else srs_undefine_macro "SRS_AUTO_CROSSBUILD" $SRS_AUTO_HEADERS_H fi +if [ $SRS_OSX = YES ]; then + srs_define_macro "SRS_AUTO_OSX" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_AUTO_OSX" $SRS_AUTO_HEADERS_H +fi # prefix echo "" >> $SRS_AUTO_HEADERS_H diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index d89749d58..616e6373e 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -109,6 +109,7 @@ function Ubuntu_prepare() if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then Ubuntu_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for ubuntu failed, ret=$ret"; exit $ret; fi fi + ##################################################################################### # for Centos, auto install tools by yum ##################################################################################### @@ -182,14 +183,105 @@ function Centos_prepare() if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then Centos_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "Install tools for CentOS failed, ret=$ret"; exit $ret; fi fi + +##################################################################################### +# For OSX, auto install tools by brew +##################################################################################### +OS_IS_OSX=NO +function OSX_prepare() +{ + uname -s|grep Darwin >/dev/null 2>&1 + ret=$?; if [[ 0 -ne $ret ]]; then + if [ $SRS_OSX = YES ]; then + echo "OSX check failed, actual is `uname -s`" + exit 1; + fi + return 0; + fi + + # cross build for arm, install the cross build tool chain. + if [ $SRS_CROSS_BUILD = YES ]; then + echo "embeded(arm/mips) is invalid for OSX" + return 1 + fi + + OS_IS_OSX=YES + echo "OSX detected, install tools if needed" + # requires the osx when os + if [ $OS_IS_OSX = YES ]; then + if [ $SRS_OSX = NO ]; then + echo "OSX detected, must specifies the --osx" + exit 1 + fi + fi + + brew --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install brew" + echo "ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"" + ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install brew success" + fi + + gcc --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install gcc" + echo "brew install gcc" + brew install gcc; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install gcc success" + fi + + g++ --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install gcc-c++" + echo "brew install gcc-c++" + brew install gcc-c++; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install gcc-c++ success" + fi + + make --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install make" + echo "brew install make" + brew install make; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install make success" + fi + + patch --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install patch" + echo "brew install patch" + brew install patch; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install patch success" + fi + + unzip --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then + echo "install unzip" + echo "brew install unzip" + brew install unzip; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install unzip success" + fi + + echo "OSX install tools success" + return 0 +} +# donot prepare tools, for srs-librtmp depends only gcc and g++. +if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then + OSX_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "OSX prepare failed, ret=$ret"; exit $ret; fi +fi + ##################################################################################### # for Centos, auto install tools by yum ##################################################################################### # We must use a bash function instead of variable. function sed_utility() { - sed -i "$@" + if [ $OS_IS_OSX = YES ]; then + sed -i '' "$@" + else + sed -i "$@" + fi + ret=$?; if [[ $ret -ne 0 ]]; then - echo "sed -i \"$@\"" + if [ $OS_IS_OSX = YES ]; then + echo "sed -i '' \"$@\"" + else + echo "sed -i \"$@\"" + fi return $ret fi } @@ -204,7 +296,7 @@ SED="sed_utility" && echo "SED is $SED" # directly build on arm/mips, for example, pi or cubie, # export srs-librtmp # others is invalid. -if [[ $OS_IS_UBUNTU = NO && $OS_IS_CENTOS = NO && $SRS_EXPORT_LIBRTMP_PROJECT = NO ]]; then +if [[ $OS_IS_UBUNTU = NO && $OS_IS_CENTOS = NO && $OS_IS_OSX = NO && $SRS_EXPORT_LIBRTMP_PROJECT = NO ]]; then if [[ $SRS_PI = NO && $SRS_CUBIE = NO && $SRS_CROSS_BUILD = NO ]]; then echo "Your OS `uname -s` is not supported." exit 1 diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 4c6bc58ca..321288bc3 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -284,18 +284,16 @@ function parse_user_option() { --with-hls) SRS_HLS=YES ;; --with-dvr) SRS_DVR=YES ;; - --without-stream-caster) ;& - --without-ingest) ;& - --without-ssl) ;& - --without-stat) ;& - --without-transcode) ;& - --without-http-callback) ;& - --without-http-server) ;& - --without-http-api) ;& - --without-hls) ;& - --without-dvr) - echo "ignore option \"$option\"" - ;; + --without-stream-caster) echo "ignore option \"$option\"" ;; + --without-ingest) echo "ignore option \"$option\"" ;; + --without-ssl) echo "ignore option \"$option\"" ;; + --without-stat) echo "ignore option \"$option\"" ;; + --without-transcode) echo "ignore option \"$option\"" ;; + --without-http-callback) echo "ignore option \"$option\"" ;; + --without-http-server) echo "ignore option \"$option\"" ;; + --without-http-api) echo "ignore option \"$option\"" ;; + --without-hls) echo "ignore option \"$option\"" ;; + --without-dvr) echo "ignore option \"$option\"" ;; *) echo "$0: error: invalid option \"$option\"" @@ -562,16 +560,16 @@ function check_option_conflicts() { echo "For crossbuild, must not use default toolchain, cc: $SRS_TOOL_CC, cxx: $SRS_TOOL_CXX, ar: $SRS_TOOL_AR"; exit -1 fi - if [ $SRS_OSX = YES ]; then - echo "We don't support OSX, please use docker https://github.com/ossrs/srs-docker"; exit -1 - fi - if [[ $SRS_NGINX == YES ]]; then - echo "Don't support building NGINX, please use docker https://github.com/ossrs/srs-docker"; exit -1 + echo "Don't support building NGINX, please use docker https://github.com/ossrs/srs-docker"; exit -1; fi if [[ $SRS_FFMPEG_TOOL == YES ]]; then - echo "Don't support building FFMPEG, please use docker https://github.com/ossrs/srs-docker"; exit -1 + echo "Don't support building FFMPEG, please use docker https://github.com/ossrs/srs-docker"; exit -1; + fi + + if [[ $SRS_OSX == YES && $SRS_UTEST == YES ]]; then + echo "Mac does not support utest."; exit -1; fi # TODO: FIXME: check more os. diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 39521fbc1..2ca4321ed 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -30,7 +30,9 @@ #include #include #include +#ifndef SRS_AUTO_OSX #include +#endif using namespace std; #include @@ -478,6 +480,7 @@ srs_error_t SrsInotifyWorker::start() { srs_error_t err = srs_success; +#ifndef SRS_AUTO_OSX // Whether enable auto reload config. bool auto_reload = _srs_config->inotify_auto_reload(); if (!auto_reload && _srs_in_docker && _srs_config->auto_reload_for_docker()) { @@ -548,6 +551,7 @@ srs_error_t SrsInotifyWorker::start() if ((err = trd->start()) != srs_success) { return srs_error_wrap(err, "inotify"); } +#endif return err; } @@ -556,6 +560,7 @@ srs_error_t SrsInotifyWorker::cycle() { srs_error_t err = srs_success; +#ifndef SRS_AUTO_OSX string config_path = _srs_config->config(); string config_file = srs_path_basename(config_path); string k8s_file = "..data"; @@ -595,6 +600,7 @@ srs_error_t SrsInotifyWorker::cycle() srs_usleep(3000 * SRS_UTIME_MILLISECONDS); } +#endif return err; } @@ -763,7 +769,7 @@ srs_error_t SrsServer::initialize_st() if ((err = srs_st_init()) != srs_success) { return srs_error_wrap(err, "initialize st failed"); } - + // @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. diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 04ece7184..3a7ab640d 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -35,6 +35,9 @@ #include #include #include +#ifdef SRS_AUTO_OSX +#include +#endif using namespace std; #include @@ -326,6 +329,7 @@ SrsProcSystemStat* srs_get_system_proc_stat() bool get_proc_system_stat(SrsProcSystemStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/stat", "r"); if (f == NULL) { srs_warn("open system cpu stat failed, ignore"); @@ -355,6 +359,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r) } fclose(f); +#endif r.ok = true; @@ -363,6 +368,7 @@ bool get_proc_system_stat(SrsProcSystemStat& r) bool get_proc_self_stat(SrsProcSelfStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/self/stat", "r"); if (f == NULL) { srs_warn("open self cpu stat failed, ignore"); @@ -389,6 +395,7 @@ bool get_proc_self_stat(SrsProcSelfStat& r) &r.guest_time, &r.cguest_time); fclose(f); +#endif r.ok = true; @@ -484,6 +491,7 @@ SrsDiskStat* srs_get_disk_stat() bool srs_get_disk_vmstat_stat(SrsDiskStat& r) { +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/vmstat", "r"); if (f == NULL) { srs_warn("open vmstat failed, ignore"); @@ -503,6 +511,7 @@ bool srs_get_disk_vmstat_stat(SrsDiskStat& r) } fclose(f); +#endif r.ok = true; @@ -513,13 +522,14 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r) { r.ok = true; r.sample_time = srsu2ms(srs_get_system_time()); - + +#ifndef SRS_AUTO_OSX // if disabled, ignore all devices. SrsConfDirective* conf = _srs_config->get_stats_disk_device(); if (conf == NULL) { return true; } - + FILE* f = fopen("/proc/diskstats", "r"); if (f == NULL) { srs_warn("open vmstat failed, ignore"); @@ -584,6 +594,7 @@ bool srs_get_disk_diskstats_stat(SrsDiskStat& r) } fclose(f); +#endif r.ok = true; @@ -675,7 +686,8 @@ SrsMemInfo* srs_get_meminfo() void srs_update_meminfo() { SrsMemInfo& r = _srs_system_meminfo; - + +#ifndef SRS_AUTO_OSX FILE* f = fopen("/proc/meminfo", "r"); if (f == NULL) { srs_warn("open meminfo failed, ignore"); @@ -701,6 +713,7 @@ void srs_update_meminfo() } fclose(f); +#endif r.sample_time = srsu2ms(srs_get_system_time()); r.MemActive = r.MemTotal - r.MemFree; @@ -767,7 +780,8 @@ void srs_update_platform_info() SrsPlatformInfo& r = _srs_system_platform_info; r.srs_startup_time = srsu2ms(srs_get_system_startup_time()); - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/uptime", "r"); if (f == NULL) { @@ -796,7 +810,44 @@ void srs_update_platform_info() fclose(f); } - +#else + // man 3 sysctl + if (true) { + struct timeval tv; + size_t len = sizeof(timeval); + + int mib[2]; + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + if (sysctl(mib, 2, &tv, &len, NULL, 0) < 0) { + srs_warn("sysctl boottime failed, ignore"); + return; + } + + time_t bsec = tv.tv_sec; + time_t csec = ::time(NULL); + r.os_uptime = difftime(csec, bsec); + } + + // man 3 sysctl + if (true) { + struct loadavg la; + size_t len = sizeof(loadavg); + + int mib[2]; + mib[0] = CTL_VM; + mib[1] = VM_LOADAVG; + if (sysctl(mib, 2, &la, &len, NULL, 0) < 0) { + srs_warn("sysctl loadavg failed, ignore"); + return; + } + + r.load_one_minutes = (double)la.ldavg[0] / la.fscale; + r.load_five_minutes = (double)la.ldavg[1] / la.fscale; + r.load_fifteen_minutes = (double)la.ldavg[2] / la.fscale; + } +#endif + r.ok = true; } @@ -842,6 +893,7 @@ int srs_get_network_devices_count() void srs_update_network_devices() { +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/dev", "r"); if (f == NULL) { @@ -878,6 +930,7 @@ void srs_update_network_devices() fclose(f); } +#endif } SrsNetworkRtmpServer::SrsNetworkRtmpServer() @@ -924,7 +977,8 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) int nb_tcp_total = 0; int nb_tcp_mem = 0; int nb_udp4 = 0; - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/sockstat", "r"); if (f == NULL) { @@ -954,9 +1008,20 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) fclose(f); } - +#else + // TODO: FIXME: impelments it. + nb_socks = 0; + nb_tcp4_hashed = 0; + nb_tcp_orphans = 0; + nb_tcp_tws = 0; + nb_tcp_total = 0; + nb_tcp_mem = 0; + nb_udp4 = 0; +#endif + int nb_tcp_estab = 0; - + +#ifndef SRS_AUTO_OSX if (true) { FILE* f = fopen("/proc/net/snmp", "r"); if (f == NULL) { @@ -986,6 +1051,7 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) fclose(f); } +#endif // @see: https://github.com/shemminger/iproute2/blob/master/misc/ss.c // TODO: FIXME: ignore the slabstat, @see: get_slabstat() diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 5fe03a129..1d91b72bd 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -124,7 +124,9 @@ srs_utime_t srs_get_system_startup_time() } // For utest to mock it. +#ifndef SRS_AUTO_OSX _srs_gettimeofday_t _srs_gettimeofday = ::gettimeofday; +#endif srs_utime_t srs_update_system_time() { diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index 04d386298..c63937430 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -166,7 +166,11 @@ extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache, // For utest to mock it. #include -typedef int (*_srs_gettimeofday_t)(struct timeval* tv, struct timezone* tz); +#ifdef SRS_AUTO_OSX + #define _srs_gettimeofday gettimeofday +#else + typedef int (*_srs_gettimeofday_t) (struct timeval* tv, struct timezone* tz); +#endif #endif diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 603e0f1e2..d5cdbd182 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -121,8 +121,8 @@ srs_error_t do_main(int argc, char** argv) // config already applied to log. srs_trace("%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE); srs_trace("contributors: %s", SRS_AUTO_CONSTRIBUTORS); - srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s", - _srs_config->cwd().c_str(), cwd.c_str(), SRS_AUTO_BUILD_DATE, SRS_AUTO_USER_CONFIGURE, SRS_AUTO_UNAME); + srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d", + _srs_config->cwd().c_str(), cwd.c_str(), SRS_AUTO_BUILD_DATE, SRS_AUTO_USER_CONFIGURE, SRS_AUTO_UNAME, SRS_AUTO_OSX_BOOL); srs_trace("configure detail: " SRS_AUTO_CONFIGURE); #ifdef SRS_AUTO_EMBEDED_TOOL_CHAIN srs_trace("crossbuild tool chain: " SRS_AUTO_EMBEDED_TOOL_CHAIN); diff --git a/trunk/src/service/srs_service_log.cpp b/trunk/src/service/srs_service_log.cpp index af5cec2ff..4bc0a0c2e 100644 --- a/trunk/src/service/srs_service_log.cpp +++ b/trunk/src/service/srs_service_log.cpp @@ -46,7 +46,7 @@ int SrsThreadContext::generate_id() static int id = 0; if (id == 0) { - id = (100 + ((int)(int64_t)this)%1000); + id = (100 + ((uint32_t)(int64_t)this)%1000); } int gid = id++; diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index acfdeeff0..9f1c6cf18 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -4208,6 +4208,7 @@ VOID TEST(KernelUtilityTest, CoverBitsBufferAll) } } +#ifndef SRS_AUTO_OSX extern _srs_gettimeofday_t _srs_gettimeofday; int mock_gettimeofday(struct timeval* /*tp*/, struct timezone* /*tzp*/) { return -1; @@ -4238,6 +4239,7 @@ VOID TEST(KernelUtilityTest, CoverTimeSpecial) EXPECT_TRUE(-1 == srs_update_system_time()); } } +#endif extern int64_t _srs_system_time_startup_time; extern int64_t _srs_system_time_us_cache; From 3556da40cea449b9ea0258660daf39d0da4f99c7 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 28 Mar 2020 17:23:11 +0800 Subject: [PATCH 18/30] Fix #1250, Support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 --- README.md | 1 + trunk/src/core/srs_core_version3.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bc259c39..ada4a78bb 100755 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-28, For [#1250][bug #1250], Support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 * v3.0, 2020-03-21, For [#1629][bug #1629], fix kickoff FLV client bug. 3.0.137 * v3.0, 2020-03-21, For [#1619][bug #1619], configure without utest by default. 3.0.136 * v3.0, 2020-03-21, For [#1651][bug #1651], fix return pnwrite of srs_write_large_iovs. 3.0.135 diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 95a9c694d..8e86dfe3d 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 137 +#define SRS_VERSION3_REVISION 138 #endif From 0a030a4ade845c76ba5c92acff9092856060d773 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 28 Mar 2020 17:42:26 +0800 Subject: [PATCH 19/30] Update --- README.md | 2 +- trunk/.gitignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ada4a78bb..21e7d7d39 100755 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ For previous versions, please read: ## V3 changes -* v3.0, 2020-03-28, For [#1250][bug #1250], Support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 +* v3.0, 2020-03-28, For [#1250][bug #1250], support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 * v3.0, 2020-03-21, For [#1629][bug #1629], fix kickoff FLV client bug. 3.0.137 * v3.0, 2020-03-21, For [#1619][bug #1619], configure without utest by default. 3.0.136 * v3.0, 2020-03-21, For [#1651][bug #1651], fix return pnwrite of srs_write_large_iovs. 3.0.135 diff --git a/trunk/.gitignore b/trunk/.gitignore index 4e90c9b49..4431df72c 100644 --- a/trunk/.gitignore +++ b/trunk/.gitignore @@ -40,3 +40,4 @@ srs *.ts *.h264 *.264 +3rdparty/ffmpeg-4.2-fit From 218fe332aace234c3c975b8e574b487711955756 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 28 Mar 2020 18:04:34 +0800 Subject: [PATCH 20/30] For #1250, support osx build --- trunk/auto/depends.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 616e6373e..890e1c609 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -308,10 +308,14 @@ fi ##################################################################################### if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then # check the cross build flag file, if flag changed, need to rebuild the st. - _ST_MAKE=linux-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_EPOLL" + _ST_MAKE=linux-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_EPOLL" && _ST_LD=${SRS_TOOL_LD} if [[ $SRS_VALGRIND == YES ]]; then _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DMD_VALGRIND" fi + # for osx, use darwin for st, donot use epoll. + if [[ $SRS_OSX == YES ]]; then + _ST_MAKE=darwin-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_KQUEUE" && _ST_LD=${SRS_TOOL_CC} + fi # Pass the global extra flags. if [[ $SRS_EXTRA_FLAGS != '' ]]; then _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS $SRS_EXTRA_FLAGS" @@ -325,7 +329,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then rm -rf ${SRS_OBJS}/st-srs && cd ${SRS_OBJS} && ln -sf ../3rdparty/st-srs && cd st-srs && make clean && make ${_ST_MAKE} EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" \ - CC=${SRS_TOOL_CC} AR=${SRS_TOOL_AR} LD=${SRS_TOOL_LD} RANDLIB=${SRS_TOOL_RANDLIB} && + CC=${SRS_TOOL_CC} AR=${SRS_TOOL_AR} LD=${_ST_LD} RANDLIB=${SRS_TOOL_RANDLIB} && cd .. && rm -f st && ln -sf st-srs/obj st ) fi From 98a71954dad140a9a259e4c947fc75a9c6ebd0d7 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 00:09:17 +0800 Subject: [PATCH 21/30] Support multiple OS/Platform build cache. 3.0.139 --- README.md | 1 + trunk/auto/depends.sh | 66 ++++++++++++++++------------ trunk/configure | 35 ++++++++++----- trunk/src/core/srs_core_version3.hpp | 2 +- 4 files changed, 63 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 21e7d7d39..7e3d9cbc6 100755 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-28, Support multiple OS/Platform build cache. 3.0.139 * v3.0, 2020-03-28, For [#1250][bug #1250], support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 * v3.0, 2020-03-21, For [#1629][bug #1629], fix kickoff FLV client bug. 3.0.137 * v3.0, 2020-03-21, For [#1619][bug #1619], configure without utest by default. 3.0.136 diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 890e1c609..03befe882 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -308,33 +308,37 @@ fi ##################################################################################### if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then # check the cross build flag file, if flag changed, need to rebuild the st. - _ST_MAKE=linux-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_EPOLL" && _ST_LD=${SRS_TOOL_LD} + _ST_MAKE=linux-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_EPOLL" && _ST_LD=${SRS_TOOL_LD} && _ST_OBJ="LINUX_*" if [[ $SRS_VALGRIND == YES ]]; then _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DMD_VALGRIND" fi # for osx, use darwin for st, donot use epoll. if [[ $SRS_OSX == YES ]]; then - _ST_MAKE=darwin-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_KQUEUE" && _ST_LD=${SRS_TOOL_CC} + _ST_MAKE=darwin-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_KQUEUE" && _ST_LD=${SRS_TOOL_CC} && _ST_OBJ="DARWIN_*" fi # Pass the global extra flags. if [[ $SRS_EXTRA_FLAGS != '' ]]; then _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS $SRS_EXTRA_FLAGS" fi # Patched ST from https://github.com/ossrs/state-threads/tree/srs - if [[ -f ${SRS_OBJS}/st/libst.a ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/st/libst.a ]]; then echo "The state-threads is ok."; else echo "Building state-threads."; ( - rm -rf ${SRS_OBJS}/st-srs && cd ${SRS_OBJS} && - ln -sf ../3rdparty/st-srs && cd st-srs && - make clean && make ${_ST_MAKE} EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" \ + rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && + cd ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && ln -sf ../../../3rdparty/st-srs .src && + for dir in `(cd .src && find . -type d|grep '\./'|grep -v Linux|grep -v Darwin)`; do mkdir -p $dir; done && + for file in `(cd .src && find . -type f ! -name '*.o' ! -name '*.d'|grep -v '\/\.')`; do ln -sf `pwd`/.src/$file $file; done && + make ${_ST_MAKE} EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" \ CC=${SRS_TOOL_CC} AR=${SRS_TOOL_AR} LD=${_ST_LD} RANDLIB=${SRS_TOOL_RANDLIB} && - cd .. && rm -f st && ln -sf st-srs/obj st + cd .. && rm -f st && ln -sf st-srs/${_ST_OBJ} st ) fi # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build state-threads failed, ret=$ret"; exit $ret; fi + # Always update the links. + (cd ${SRS_OBJS} && rm -f st && ln -sf ${SRS_PLATFORM}/st-srs/${_ST_OBJ} st) if [ ! -f ${SRS_OBJS}/st/libst.a ]; then echo "Build state-threads static lib failed."; exit -1; fi fi @@ -387,19 +391,19 @@ fi # cherrypy for http hooks callback, CherryPy-3.2.4 ##################################################################################### if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then - if [[ -f ${SRS_OBJS}/CherryPy-3.2.4/setup.py ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/CherryPy-3.2.4/setup.py ]]; then echo "CherryPy-3.2.4 is ok."; else echo "Installing CherryPy-3.2.4"; ( - rm -rf ${SRS_OBJS}/CherryPy-3.2.4 && cd ${SRS_OBJS} && - unzip -q ../3rdparty/CherryPy-3.2.4.zip && cd CherryPy-3.2.4 && + rm -rf ${SRS_OBJS}/CherryPy-3.2.4 && cd ${SRS_OBJS}/${SRS_PLATFORM} && + unzip -q ../../3rdparty/CherryPy-3.2.4.zip && cd CherryPy-3.2.4 && python setup.py install --user ) fi # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "build CherryPy-3.2.4 failed, ret=$ret"; exit $ret; fi - if [ ! -f ${SRS_OBJS}/CherryPy-3.2.4/setup.py ]; then echo "build CherryPy-3.2.4 failed."; exit -1; fi + if [ ! -f ${SRS_OBJS}/${SRS_PLATFORM}/CherryPy-3.2.4/setup.py ]; then echo "build CherryPy-3.2.4 failed."; exit -1; fi echo "Link players to cherrypy static-dir" rm -rf research/api-server/static-dir/players && @@ -432,21 +436,26 @@ if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL != YES ]]; then OPENSSL_CONFIG="./Configure linux-armv4" else # If not crossbuild, try to use exists libraries. - if [[ -f /usr/local/lib64/libssl.a && ! -f ${SRS_OBJS}/openssl/lib/libssl.a ]]; then - (mkdir -p ${SRS_OBJS}/openssl/lib && cd ${SRS_OBJS}/openssl/lib && + if [[ -f /usr/local/lib64/libssl.a && ! -f ${SRS_OBJS}/${SRS_PLATFORM}/openssl/lib/libssl.a ]]; then + (mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/openssl/lib && cd ${SRS_OBJS}/${SRS_PLATFORM}/openssl/lib && ln -sf /usr/local/lib64/libssl.a && ln -sf /usr/local/lib64/libcrypto.a) - (mkdir -p ${SRS_OBJS}/openssl/include && cd ${SRS_OBJS}/openssl/include && + (mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/openssl/include && cd ${SRS_OBJS}/${SRS_PLATFORM}/openssl/include && ln -sf /usr/local/include/openssl) fi fi + # Which lib we use. + OPENSSL_LIB="openssl-1.1.0e/_release" + if [[ ! -f ${SRS_OBJS}/${SRS_PLATFORM}/${OPENSSL_LIB}/lib/libssl.a ]]; then + OPENSSL_LIB="openssl" + fi # cross build not specified, if exists flag, need to rebuild for no-arm platform. - if [[ -f ${SRS_OBJS}/openssl/lib/libssl.a ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/openssl/lib/libssl.a ]]; then echo "Openssl-1.1.0e is ok."; else echo "Building openssl-1.1.0e."; ( - rm -rf ${SRS_OBJS}/openssl-1.1.0e && cd ${SRS_OBJS} && - unzip -q ../3rdparty/openssl-1.1.0e.zip && cd openssl-1.1.0e && + rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/openssl-1.1.0e && cd ${SRS_OBJS}/${SRS_PLATFORM} && + unzip -q ../../3rdparty/openssl-1.1.0e.zip && cd openssl-1.1.0e && ${OPENSSL_CONFIG} --prefix=`pwd`/_release $OPENSSL_OPTIONS && make CC=${SRS_TOOL_CC} AR="${SRS_TOOL_AR} -rs" LD=${SRS_TOOL_LD} RANDLIB=${SRS_TOOL_RANDLIB} && make install_sw && cd .. && rm -rf openssl && ln -sf openssl-1.1.0e/_release openssl @@ -454,6 +463,8 @@ if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL != YES ]]; then fi # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build openssl-1.1.0e failed, ret=$ret"; exit $ret; fi + # Always update the links. + (cd ${SRS_OBJS} && rm -f openssl && ln -sf ${SRS_PLATFORM}/${OPENSSL_LIB} openssl) if [ ! -f ${SRS_OBJS}/openssl/lib/libssl.a ]; then echo "Build openssl-1.1.0e failed."; exit -1; fi fi @@ -510,18 +521,20 @@ fi # build utest code ##################################################################################### if [ $SRS_UTEST = YES ]; then - if [[ -f ${SRS_OBJS}/gtest/include/gtest/gtest.h ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/gtest/include/gtest/gtest.h ]]; then echo "The gtest-1.6.0 is ok."; else echo "Build gtest-1.6.0"; ( - rm -rf ${SRS_OBJS}/gtest-1.6.0 && cd ${SRS_OBJS} && - unzip -q ../3rdparty/gtest-1.6.0.zip && + rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/gtest-1.6.0 && cd ${SRS_OBJS}/${SRS_PLATFORM} && + unzip -q ../../3rdparty/gtest-1.6.0.zip && rm -rf gtest && ln -sf gtest-1.6.0 gtest ) fi # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gtest-1.6.0 failed, ret=$ret"; exit $ret; fi + # Always update the links. + (cd ${SRS_OBJS} && rm -f gtest && ln -sf ${SRS_PLATFORM}/gtest-1.6.0 gtest) if [ ! -f ${SRS_OBJS}/gtest/include/gtest/gtest.h ]; then echo "Build gtest-1.6.0 failed."; exit -1; fi fi @@ -529,13 +542,13 @@ fi # build gperf code ##################################################################################### if [ $SRS_GPERF = YES ]; then - if [[ -f ${SRS_OBJS}/gperf/bin/pprof ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/gperf/bin/pprof ]]; then echo "The gperftools-2.1 is ok."; else echo "Build gperftools-2.1"; ( - rm -rf ${SRS_OBJS}/gperftools-2.1 && cd ${SRS_OBJS} && - unzip -q ../3rdparty/gperftools-2.1.zip && cd gperftools-2.1 && + rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/gperftools-2.1 && cd ${SRS_OBJS}/${SRS_PLATFORM} && + unzip -q ../../3rdparty/gperftools-2.1.zip && cd gperftools-2.1 && ./configure --prefix=`pwd`/_release --enable-frame-pointers && make ${SRS_JOBS} && make install && cd .. && rm -rf gperf && ln -sf gperftools-2.1/_release gperf && rm -rf pprof && ln -sf gperf/bin/pprof pprof @@ -543,10 +556,7 @@ if [ $SRS_GPERF = YES ]; then fi # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gperftools-2.1 failed, ret=$ret"; exit $ret; fi + # Always update the links. + (cd ${SRS_OBJS} && rm -f pprof && ln -sf ${SRS_PLATFORM}/gperf/bin/pprof pprof) if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "Build gperftools-2.1 failed."; exit -1; fi fi - -##################################################################################### -# generated the test script -##################################################################################### -rm -rf ${SRS_OBJS}/srs.test && ln -sf `pwd`/scripts/srs.test objs/srs.test diff --git a/trunk/configure b/trunk/configure index a3558009a..810f586cc 100755 --- a/trunk/configure +++ b/trunk/configure @@ -8,6 +8,8 @@ SRS_WORKDIR="." SRS_OBJS_DIR="objs" SRS_OBJS="${SRS_WORKDIR}/${SRS_OBJS_DIR}" SRS_MAKEFILE="Makefile" +SRS_PLATFORM=`uname -s`-`uname -r|awk -F '-' '{print $1}'` +echo "SRS_WORKDIR: ${SRS_WORKDIR}, SRS_OBJS_DIR: ${SRS_OBJS_DIR}, SRS_OBJS: ${SRS_OBJS}, SRS_PLATFORM: ${SRS_PLATFORM}" # linux shell color support. RED="\\033[31m" @@ -26,16 +28,11 @@ BLACK="\\033[0m" # setup variables when options parsed. . auto/setup_variables.sh -# clean the exists, when not export srs-librtmp. -# do this only when the options is ok. -if [[ -f Makefile ]]; then -make clean -fi -# remove makefile +# We don't need to cleanup the exists files. rm -f ${SRS_WORKDIR}/${SRS_MAKEFILE} # create objs -mkdir -p ${SRS_OBJS} +mkdir -p ${SRS_OBJS}/${SRS_PLATFORM} # for export srs-librtmp, change target to it. . auto/generate-srs-librtmp-project.sh @@ -46,6 +43,11 @@ mkdir -p ${SRS_OBJS} # the auto generated variables. . auto/auto_headers.sh +# For src object files on each platform. +echo "Fast cleanup, if need to do full cleanup, please use: make clean" +(cd ${SRS_OBJS_DIR} && rm -rf src srs srs_hls_ingester srs_mp4_parser && +mkdir -p ${SRS_PLATFORM}/src && ln -sf ${SRS_PLATFORM}/src) + ##################################################################################### # generate Makefile. ##################################################################################### @@ -346,7 +348,7 @@ mv ${SRS_WORKDIR}/${SRS_MAKEFILE} ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk # generate phony header cat << END > ${SRS_WORKDIR}/${SRS_MAKEFILE} -.PHONY: default _default install install-api help clean server srs_ingest_hls librtmp utest _prepare_dir $__mphonys +.PHONY: default _default install install-api help clean doclean destroy server srs_ingest_hls librtmp utest _prepare_dir $__mphonys # install prefix. SRS_PREFIX=${SRS_PREFIX} @@ -365,9 +367,10 @@ _default: server srs_ingest_hls librtmp utest __modules $__mdefaults @bash objs/_srs_build_summary.sh help: - @echo "Usage: make |||||||" + @echo "Usage: make ||||||||" @echo " help display this help menu" @echo " clean cleanup project" + @echo " destroy Deep cleanup project and depends" @echo " server build the srs(simple rtmp server) over st(state-threads)" @echo " librtmp build the client publish/play library, and samples" @echo " utest build the utest for srs" @@ -379,13 +382,21 @@ help: @echo " make" @echo " make help" -clean: +doclean: (cd ${SRS_OBJS_DIR} && rm -rf srs srs_utest $__mcleanups) - (cd ${SRS_OBJS_DIR} && rm -rf src include lib) - (cd ${SRS_OBJS_DIR}/utest && rm -rf *.o *.a) + (cd ${SRS_OBJS_DIR} && rm -rf src/* include lib) + (mkdir -p ${SRS_OBJS_DIR}/utest && cd ${SRS_OBJS_DIR}/utest && rm -rf *.o *.a) (cd research/librtmp && make clean) (cd research/api-server/static-dir && rm -rf crossdomain.xml forward live players) +clean: doclean + @echo "You can do full clean by: make destroy" + +destroy: clean + (cd 3rdparty/st-srs && rm -rf Linux_* Darwin_* obj) + (cd 3rdparty/ffmpeg-4.2-fit && rm -rf Linux-* Darwin-*) + (cd ${SRS_OBJS_DIR} && rm -rf Linux-* Darwin-*) + END # for Makefile of all modules. diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 8e86dfe3d..c732e77be 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 138 +#define SRS_VERSION3_REVISION 139 #endif From f674cab84f909561e363a9c498e29fb112a28dba Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 14:00:37 +0800 Subject: [PATCH 22/30] Release 3.0-b4, 3.0.139 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7e3d9cbc6..7624868ea 100755 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-03-29, [3.0 beta4(3.0.139)][r3.0b4] released. 122674 lines. * v3.0, 2020-03-28, Support multiple OS/Platform build cache. 3.0.139 * v3.0, 2020-03-28, For [#1250][bug #1250], support macOS, OSX, MacbookPro, Apple Darwin. 3.0.138 * v3.0, 2020-03-21, For [#1629][bug #1629], fix kickoff FLV client bug. 3.0.137 @@ -761,6 +762,7 @@ For previous versions, please read: ## Releases +* 2020-03-29, [Release v3.0-b3][r3.0b4], 3.0 beta4, 3.0.139, 122674 lines. * 2020-03-18, [Release v3.0-b3][r3.0b3], 3.0 beta3, 3.0.134, 122509 lines. * 2020-03-05, [Release v3.0-b2][r3.0b2], 3.0 beta2, 3.0.123, 122170 lines. * 2020-02-14, [Release v3.0-b1][r3.0b1], 3.0 beta1, 3.0.117, 121964 lines. @@ -1691,6 +1693,7 @@ Winlin [exo #828]: https://github.com/google/ExoPlayer/pull/828 +[r3.0b4]: https://github.com/ossrs/srs/releases/tag/v3.0-b4 [r3.0b3]: https://github.com/ossrs/srs/releases/tag/v3.0-b3 [r3.0b2]: https://github.com/ossrs/srs/releases/tag/v3.0-b2 [r3.0b1]: https://github.com/ossrs/srs/releases/tag/v3.0-b1 From d5339acc57a29599929ef3f55b020cce828471a2 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 14:12:37 +0800 Subject: [PATCH 23/30] Update package script --- trunk/scripts/package.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/trunk/scripts/package.sh b/trunk/scripts/package.sh index 6629bbf6e..ac4928422 100755 --- a/trunk/scripts/package.sh +++ b/trunk/scripts/package.sh @@ -16,6 +16,7 @@ PI=NO MIPS=NO # EMBEDED=NO +JOBS=1 ################################################################################## ################################################################################## @@ -39,6 +40,7 @@ do --mips) MIPS=YES ;; --arm) ARM=YES ;; --pi) PI=YES ;; + --jobs) JOBS=$value ;; *) echo "$0: error: invalid option \"$option\", @see $0 --help" @@ -56,6 +58,7 @@ if [ $help = yes ]; then --mips for mips cross-build platform, configure/make/package. --pi for pi platform, configure/make/package. --x86-64 alias for --x86-x64. + --jobs Set the configure and make jobs. END exit 0 fi @@ -113,26 +116,26 @@ ok_msg "real os is ${os_name}-${os_major_version} ${os_release} ${os_machine}" # build srs # @see https://github.com/ossrs/srs/wiki/v1_CN_Build -ok_msg "start build srs" +ok_msg "start build srs, ARM: $ARM, MIPS: $MIPS, PI: $PI, X86_64: $X86_X64, JOBS: $JOBS" if [ $ARM = YES ]; then ( cd $work_dir && - ./configure --arm --prefix=$INSTALL && make + ./configure --arm --jobs=$JOBS --prefix=$INSTALL && make ) >> $log 2>&1 elif [ $MIPS = YES ]; then ( cd $work_dir && - ./configure --mips --prefix=$INSTALL && make + ./configure --mips --jobs=$JOBS --prefix=$INSTALL && make ) >> $log 2>&1 elif [ $PI = YES ]; then ( cd $work_dir && - ./configure --pi --prefix=$INSTALL && make + ./configure --pi --jobs=$JOBS --prefix=$INSTALL && make ) >> $log 2>&1 elif [ $X86_X64 = YES ]; then ( cd $work_dir && - ./configure --x86-x64 --prefix=$INSTALL && make + ./configure --x86-x64 --jobs=$JOBS --prefix=$INSTALL && make ) >> $log 2>&1 else failed_msg "invalid option, must be --x86-x64/--arm/--mips/--pi, see --help"; exit 1; From c0a8193537c7e88170ed43363ae60aa3794f1d59 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 15:23:40 +0800 Subject: [PATCH 24/30] Update build script --- trunk/auto/depends.sh | 29 +++++++++----------- trunk/auto/options.sh | 5 ++++ trunk/auto/setup_variables.sh | 21 +++++++++++++++ trunk/auto/utest.sh | 2 +- trunk/configure | 50 ++++++++++++++++++++++++----------- trunk/scripts/package.sh | 8 +++--- 6 files changed, 78 insertions(+), 37 deletions(-) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 03befe882..f31f3696c 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -338,7 +338,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build state-threads failed, ret=$ret"; exit $ret; fi # Always update the links. - (cd ${SRS_OBJS} && rm -f st && ln -sf ${SRS_PLATFORM}/st-srs/${_ST_OBJ} st) + (cd ${SRS_OBJS} && rm -rf st && ln -sf ${SRS_PLATFORM}/st-srs/${_ST_OBJ} st) if [ ! -f ${SRS_OBJS}/st/libst.a ]; then echo "Build state-threads static lib failed."; exit -1; fi fi @@ -464,7 +464,7 @@ if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL != YES ]]; then # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build openssl-1.1.0e failed, ret=$ret"; exit $ret; fi # Always update the links. - (cd ${SRS_OBJS} && rm -f openssl && ln -sf ${SRS_PLATFORM}/${OPENSSL_LIB} openssl) + (cd ${SRS_OBJS} && rm -rf openssl && ln -sf ${SRS_PLATFORM}/${OPENSSL_LIB} openssl) if [ ! -f ${SRS_OBJS}/openssl/lib/libssl.a ]; then echo "Build openssl-1.1.0e failed."; exit -1; fi fi @@ -472,24 +472,19 @@ fi # live transcoding, ffmpeg-4.1, x264-core157, lame-3.99.5, libaacplus-2.0.2. ##################################################################################### # Always link the ffmpeg tools if exists. -if [[ -f /usr/local/bin/ffmpeg && ! -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]]; then - mkdir -p ${SRS_OBJS}/ffmpeg/bin && ln -sf /usr/local/bin/ffmpeg ${SRS_OBJS}/ffmpeg/bin/ffmpeg +if [[ -f /usr/local/bin/ffmpeg && ! -f ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg/bin/ffmpeg ]]; then + mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg/bin && + ln -sf /usr/local/bin/ffmpeg ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg/bin/ffmpeg fi if [ $SRS_FFMPEG_TOOL = YES ]; then - if [[ -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]]; then + if [[ -f ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg/bin/ffmpeg ]]; then echo "ffmpeg-4.1 is ok."; else - echo "build ffmpeg-4.1"; - ( - cd ${SRS_OBJS} && pwd_dir=`pwd` && - rm -rf ffmepg.src && mkdir -p ffmpeg.src && cd ffmpeg.src && - rm -f build_ffmpeg.sh && ln -sf ../../auto/build_ffmpeg.sh && . build_ffmpeg.sh && - cd ${pwd_dir} && rm -rf ffmpeg && ln -sf ffmpeg.src/_release ffmpeg - ) + echo "no ffmpeg found, please use srs-docker or --without-ffmpeg"; + exit -1; fi - # check status - ret=$?; if [[ $ret -ne 0 ]]; then echo "build ffmpeg-4.1 failed, ret=$ret"; exit $ret; fi - if [ ! -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]; then echo "build ffmpeg-4.1 failed."; exit -1; fi + # Always update the links. + (cd ${SRS_OBJS} && rm -rf ffmpeg && ln -sf ${SRS_PLATFORM}/ffmpeg) fi ##################################################################################### @@ -534,7 +529,7 @@ if [ $SRS_UTEST = YES ]; then # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gtest-1.6.0 failed, ret=$ret"; exit $ret; fi # Always update the links. - (cd ${SRS_OBJS} && rm -f gtest && ln -sf ${SRS_PLATFORM}/gtest-1.6.0 gtest) + (cd ${SRS_OBJS} && rm -rf gtest && ln -sf ${SRS_PLATFORM}/gtest-1.6.0 gtest) if [ ! -f ${SRS_OBJS}/gtest/include/gtest/gtest.h ]; then echo "Build gtest-1.6.0 failed."; exit -1; fi fi @@ -557,6 +552,6 @@ if [ $SRS_GPERF = YES ]; then # check status ret=$?; if [[ $ret -ne 0 ]]; then echo "Build gperftools-2.1 failed, ret=$ret"; exit $ret; fi # Always update the links. - (cd ${SRS_OBJS} && rm -f pprof && ln -sf ${SRS_PLATFORM}/gperf/bin/pprof pprof) + (cd ${SRS_OBJS} && rm -rf pprof && ln -sf ${SRS_PLATFORM}/gperf/bin/pprof pprof) if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "Build gperftools-2.1 failed."; exit -1; fi fi diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 321288bc3..b3eec6712 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -105,6 +105,8 @@ SRS_TOOL_AR=ar SRS_TOOL_LD=ld SRS_TOOL_RANDLIB=randlib SRS_EXTRA_FLAGS= +# Set the object files tag name. +SRS_BUILD_TAG= ##################################################################################### # menu @@ -171,6 +173,7 @@ Toolchain options: @see https://github.com/ossrs/srs/issues/1547#issuec --ld= Use linker tool LD, default is ld. --randlib= Use randlib tool RANDLIB, default is randlib. --extra-flags= Set EFLAGS as CFLAGS and CXXFLAGS. Also passed to ST as EXTRA_CFLAGS. + --build-tag= Set the build object directory suffix. Conflicts: 1. --with-gmc vs --with-gmp: @@ -254,6 +257,7 @@ function parse_user_option() { --ld) SRS_TOOL_LD=${value} ;; --randlib) SRS_TOOL_RANDLIB=${value} ;; --extra-flags) SRS_EXTRA_FLAGS=${value} ;; + --build-tag) SRS_BUILD_TAG=${value} ;; --x86-x64) SRS_X86_X64=YES ;; --x86-64) SRS_X86_X64=YES ;; @@ -538,6 +542,7 @@ SRS_AUTO_CONFIGURE="--prefix=${SRS_PREFIX}" if [ $SRS_LOG_TRACE = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-trace"; fi if [ $SRS_GCOV = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcov"; fi if [[ $SRS_EXTRA_FLAGS != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --extra-flags=\\\"$SRS_EXTRA_FLAGS\\\""; fi + if [[ $SRS_BUILD_TAG != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --build-tag=\\\"$SRS_BUILD_TAG\\\""; fi if [[ $SRS_TOOL_CC != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cc=$SRS_TOOL_CC"; fi if [[ $SRS_TOOL_CXX != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx=$SRS_TOOL_CXX"; fi if [[ $SRS_TOOL_AR != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ar=$SRS_TOOL_AR"; fi diff --git a/trunk/auto/setup_variables.sh b/trunk/auto/setup_variables.sh index 9d37edbf7..3865f005f 100755 --- a/trunk/auto/setup_variables.sh +++ b/trunk/auto/setup_variables.sh @@ -1,3 +1,24 @@ #!/bin/bash # when options parsed, setup some variables, then build the depends. +OS_KERNEL_NAME=$(uname -s) +OS_KERNRL_RELEASE=$(uname -r|awk -F '-' '{print $1}') +OS_PREFIX="Platform" +SRS_PLATFORM="${OS_PREFIX}-${OS_KERNEL_NAME}-${OS_KERNRL_RELEASE}" +if [[ ${SRS_BUILD_TAG} != "" ]]; then + SRS_PLATFORM="${SRS_PLATFORM}-${SRS_BUILD_TAG}" +fi +echo "SRS_WORKDIR: ${SRS_WORKDIR}, SRS_OBJS_DIR: ${SRS_OBJS_DIR}, SRS_OBJS: ${SRS_OBJS}, SRS_PLATFORM: ${SRS_PLATFORM}" + +# For src object files on each platform. +( + cd ${SRS_OBJS_DIR} && + rm -rf src utest srs research include lib srs_hls_ingester srs_mp4_parser && + mkdir -p ${SRS_PLATFORM}/src && ln -sf ${SRS_PLATFORM}/src && + mkdir -p ${SRS_PLATFORM}/utest && ln -sf ${SRS_PLATFORM}/utest && + mkdir -p ${SRS_PLATFORM}/research && ln -sf ${SRS_PLATFORM}/research && + mkdir -p ${SRS_PLATFORM}/include && ln -sf ${SRS_PLATFORM}/include && + mkdir -p ${SRS_PLATFORM}/lib && ln -sf ${SRS_PLATFORM}/lib +) +echo "Fast cleanup, if need to do full cleanup, please use: make clean" + diff --git a/trunk/auto/utest.sh b/trunk/auto/utest.sh index 1255e35a7..7dcde25af 100755 --- a/trunk/auto/utest.sh +++ b/trunk/auto/utest.sh @@ -16,7 +16,7 @@ mkdir -p ${SRS_OBJS}/utest # the prefix to generate the objs/utest/Makefile # dirs relative to current dir(objs/utest), it's trunk/objs/utest # trunk of srs, which contains the src dir, relative to objs/utest, it's trunk -SRS_TRUNK_PREFIX=../.. +SRS_TRUNK_PREFIX=../../.. # gest dir, relative to objs/utest, it's trunk/objs/gtest GTEST_DIR=${SRS_TRUNK_PREFIX}/${SRS_OBJS_DIR}/gtest diff --git a/trunk/configure b/trunk/configure index 810f586cc..7f9baecde 100755 --- a/trunk/configure +++ b/trunk/configure @@ -8,8 +8,6 @@ SRS_WORKDIR="." SRS_OBJS_DIR="objs" SRS_OBJS="${SRS_WORKDIR}/${SRS_OBJS_DIR}" SRS_MAKEFILE="Makefile" -SRS_PLATFORM=`uname -s`-`uname -r|awk -F '-' '{print $1}'` -echo "SRS_WORKDIR: ${SRS_WORKDIR}, SRS_OBJS_DIR: ${SRS_OBJS_DIR}, SRS_OBJS: ${SRS_OBJS}, SRS_PLATFORM: ${SRS_PLATFORM}" # linux shell color support. RED="\\033[31m" @@ -43,11 +41,6 @@ mkdir -p ${SRS_OBJS}/${SRS_PLATFORM} # the auto generated variables. . auto/auto_headers.sh -# For src object files on each platform. -echo "Fast cleanup, if need to do full cleanup, please use: make clean" -(cd ${SRS_OBJS_DIR} && rm -rf src srs srs_hls_ingester srs_mp4_parser && -mkdir -p ${SRS_PLATFORM}/src && ln -sf ${SRS_PLATFORM}/src) - ##################################################################################### # generate Makefile. ##################################################################################### @@ -348,7 +341,9 @@ mv ${SRS_WORKDIR}/${SRS_MAKEFILE} ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk # generate phony header cat << END > ${SRS_WORKDIR}/${SRS_MAKEFILE} -.PHONY: default _default install install-api help clean doclean destroy server srs_ingest_hls librtmp utest _prepare_dir $__mphonys +.PHONY: default _default install install-api help clean destroy server srs_ingest_hls librtmp utest _prepare_dir $__mphonys +.PHONY: clean_srs clean_modules clean_st clean_openssl clean_ffmpeg clean_nginx clean_cherrypy +.PHONY: st # install prefix. SRS_PREFIX=${SRS_PREFIX} @@ -369,14 +364,18 @@ _default: server srs_ingest_hls librtmp utest __modules $__mdefaults help: @echo "Usage: make ||||||||" @echo " help display this help menu" - @echo " clean cleanup project" - @echo " destroy Deep cleanup project and depends" + @echo " clean cleanup project and all depends" + @echo " destroy Cleanup all files for this platform in ${SRS_OBJS_DIR}/${SRS_PLATFORM}" @echo " server build the srs(simple rtmp server) over st(state-threads)" @echo " librtmp build the client publish/play library, and samples" @echo " utest build the utest for srs" @echo " install install srs to the prefix path" @echo " install-api install srs and api-server to the prefix path" @echo " uninstall uninstall srs from prefix path" + @echo "To clean special module:" + @echo " clean_st Clean depend st-srs in ${SRS_OBJS_DIR}/${SRS_PLATFORM}/st-srs" + @echo " clean_openssl Clean depend openssl in objs" + @echo " clean_ffmpeg Clean depend ffmpeg in objs" @echo "@remark all modules will auto genearted and build" @echo "For example:" @echo " make" @@ -389,13 +388,34 @@ doclean: (cd research/librtmp && make clean) (cd research/api-server/static-dir && rm -rf crossdomain.xml forward live players) -clean: doclean - @echo "You can do full clean by: make destroy" +clean: clean_srs clean_modules clean_st clean_openssl clean_ffmpeg clean_nginx clean_cherrypy + @echo "You can clean each some components, see make help" destroy: clean - (cd 3rdparty/st-srs && rm -rf Linux_* Darwin_* obj) - (cd 3rdparty/ffmpeg-4.2-fit && rm -rf Linux-* Darwin-*) - (cd ${SRS_OBJS_DIR} && rm -rf Linux-* Darwin-*) + (cd ${SRS_OBJS_DIR} && rm -rf ${SRS_PLATFORM}) + +clean_srs: + (cd ${SRS_OBJS_DIR} && rm -rf srs srs_utest) + (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM} && rm -rf include lib utest) + +clean_modules: + (cd ${SRS_OBJS_DIR} && rm -rf $__mdefaults) + +clean_st: + (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM}/st-srs && make clean) + +clean_openssl: + (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM} && rm -rf openssl*) + +clean_ffmpeg: + (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM} && rm -rf ffmpeg) + +clean_nginx: + (cd ${SRS_OBJS_DIR} && rm -rf nginx) + +clean_cherrypy: + (cd research/librtmp && make clean) + (cd research/api-server/static-dir && rm -rf crossdomain.xml forward live players) END diff --git a/trunk/scripts/package.sh b/trunk/scripts/package.sh index ac4928422..6a4fc3bc2 100755 --- a/trunk/scripts/package.sh +++ b/trunk/scripts/package.sh @@ -120,22 +120,22 @@ ok_msg "start build srs, ARM: $ARM, MIPS: $MIPS, PI: $PI, X86_64: $X86_X64, JOBS if [ $ARM = YES ]; then ( cd $work_dir && - ./configure --arm --jobs=$JOBS --prefix=$INSTALL && make + ./configure --arm --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make ) >> $log 2>&1 elif [ $MIPS = YES ]; then ( cd $work_dir && - ./configure --mips --jobs=$JOBS --prefix=$INSTALL && make + ./configure --mips --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make ) >> $log 2>&1 elif [ $PI = YES ]; then ( cd $work_dir && - ./configure --pi --jobs=$JOBS --prefix=$INSTALL && make + ./configure --pi --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make ) >> $log 2>&1 elif [ $X86_X64 = YES ]; then ( cd $work_dir && - ./configure --x86-x64 --jobs=$JOBS --prefix=$INSTALL && make + ./configure --x86-x64 --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make ) >> $log 2>&1 else failed_msg "invalid option, must be --x86-x64/--arm/--mips/--pi, see --help"; exit 1; From 0081525380198d08e40492c378fd9fc6a79dca76 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 15:29:07 +0800 Subject: [PATCH 25/30] Update package script --- trunk/scripts/package.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/trunk/scripts/package.sh b/trunk/scripts/package.sh index 6a4fc3bc2..ecd233450 100755 --- a/trunk/scripts/package.sh +++ b/trunk/scripts/package.sh @@ -120,22 +120,22 @@ ok_msg "start build srs, ARM: $ARM, MIPS: $MIPS, PI: $PI, X86_64: $X86_X64, JOBS if [ $ARM = YES ]; then ( cd $work_dir && - ./configure --arm --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make + ./configure --arm --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_name}${os_major_version} && make ) >> $log 2>&1 elif [ $MIPS = YES ]; then ( cd $work_dir && - ./configure --mips --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make + ./configure --mips --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_name}${os_major_version} && make ) >> $log 2>&1 elif [ $PI = YES ]; then ( cd $work_dir && - ./configure --pi --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make + ./configure --pi --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_name}${os_major_version} && make ) >> $log 2>&1 elif [ $X86_X64 = YES ]; then ( cd $work_dir && - ./configure --x86-x64 --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_machine} && make + ./configure --x86-x64 --jobs=$JOBS --prefix=$INSTALL --build-tag=${os_name}${os_major_version} && make ) >> $log 2>&1 else failed_msg "invalid option, must be --x86-x64/--arm/--mips/--pi, see --help"; exit 1; From f8b0bc122be426bda5764f1c499bc648defeaaac Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 15:48:57 +0800 Subject: [PATCH 26/30] Update build script --- trunk/configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trunk/configure b/trunk/configure index 7f9baecde..d2e366f78 100755 --- a/trunk/configure +++ b/trunk/configure @@ -52,7 +52,7 @@ SrsLibrtmpSampleEntry="nossl" if [ $SRS_SSL = YES ]; then SrsLibrtmpSampleEntry="ssl";fi # utest make entry, (cd utest; make) SrsUtestMakeEntry="@echo -e \"ignore utest for it's disabled\"" -if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/utest; \$(MAKE))"; fi +if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/${SRS_PLATFORM}/utest; \$(MAKE))"; fi ##################################################################################### # finger out modules to install. From b9a3df5c5527b57f9633896ef5841d1c7de8f992 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 16:18:20 +0800 Subject: [PATCH 27/30] Update utest script --- trunk/auto/setup_variables.sh | 2 +- trunk/configure | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/trunk/auto/setup_variables.sh b/trunk/auto/setup_variables.sh index 3865f005f..c144c68f5 100755 --- a/trunk/auto/setup_variables.sh +++ b/trunk/auto/setup_variables.sh @@ -12,7 +12,7 @@ echo "SRS_WORKDIR: ${SRS_WORKDIR}, SRS_OBJS_DIR: ${SRS_OBJS_DIR}, SRS_OBJS: ${SR # For src object files on each platform. ( - cd ${SRS_OBJS_DIR} && + mkdir -p ${SRS_OBJS_DIR} && cd ${SRS_OBJS_DIR} && rm -rf src utest srs research include lib srs_hls_ingester srs_mp4_parser && mkdir -p ${SRS_PLATFORM}/src && ln -sf ${SRS_PLATFORM}/src && mkdir -p ${SRS_PLATFORM}/utest && ln -sf ${SRS_PLATFORM}/utest && diff --git a/trunk/configure b/trunk/configure index d2e366f78..32cd88ea8 100755 --- a/trunk/configure +++ b/trunk/configure @@ -52,7 +52,7 @@ SrsLibrtmpSampleEntry="nossl" if [ $SRS_SSL = YES ]; then SrsLibrtmpSampleEntry="ssl";fi # utest make entry, (cd utest; make) SrsUtestMakeEntry="@echo -e \"ignore utest for it's disabled\"" -if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/${SRS_PLATFORM}/utest; \$(MAKE))"; fi +if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/${SRS_PLATFORM}/utest && \$(MAKE))"; fi ##################################################################################### # finger out modules to install. @@ -545,7 +545,7 @@ librtmp: server @echo "Building the client publish/play library." \$(MAKE) -f ${SRS_OBJS_DIR}/${SRS_MAKEFILE} librtmp @echo "Building the srs-librtmp example." - (cd research/librtmp; \$(MAKE) EXTRA_CXXFLAGS="${SrsGcov}" ${SrsLibrtmpSampleEntry}) + (cd research/librtmp && \$(MAKE) EXTRA_CXXFLAGS="${SrsGcov}" ${SrsLibrtmpSampleEntry}) END else From 2ba8104b37123c023d6b93a44ce28620e062750f Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 16:36:49 +0800 Subject: [PATCH 28/30] Update coverage script --- trunk/auto/coverage.sh | 2 +- trunk/configure | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/auto/coverage.sh b/trunk/auto/coverage.sh index 0196fe9d5..55cb7ce46 100644 --- a/trunk/auto/coverage.sh +++ b/trunk/auto/coverage.sh @@ -17,7 +17,7 @@ mkdir -p $workdir && cd $workdir ret=$?; if [[ $ret -ne 0 ]]; then echo "Enter workdir failed, ret=$ret"; exit $ret; fi # Collect all *.gcno and *.gcda to objs/cover. -cd $workdir && (rm -rf src && cp -R ../../src . && cp -R ../src .) +cd $workdir && (rm -rf src && cp -R ../../src . && cp -R ../src/* src/) ret=$?; if [[ $ret -ne 0 ]]; then echo "Collect *.gcno and *.gcda failed, ret=$ret"; exit $ret; fi # Generate *.gcov for coverage. diff --git a/trunk/configure b/trunk/configure index 32cd88ea8..b8d13c3f3 100755 --- a/trunk/configure +++ b/trunk/configure @@ -391,7 +391,7 @@ doclean: clean: clean_srs clean_modules clean_st clean_openssl clean_ffmpeg clean_nginx clean_cherrypy @echo "You can clean each some components, see make help" -destroy: clean +destroy: (cd ${SRS_OBJS_DIR} && rm -rf ${SRS_PLATFORM}) clean_srs: From 1c659874727719a5097ea6c287b80725d9d6826c Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 16:51:56 +0800 Subject: [PATCH 29/30] Refine links use relative path --- trunk/auto/depends.sh | 15 +++++++++++++-- trunk/configure | 6 +++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index f31f3696c..454990507 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -327,9 +327,20 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then echo "Building state-threads."; ( rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && + # Create a hidden directory .src cd ${SRS_OBJS}/${SRS_PLATFORM}/st-srs && ln -sf ../../../3rdparty/st-srs .src && - for dir in `(cd .src && find . -type d|grep '\./'|grep -v Linux|grep -v Darwin)`; do mkdir -p $dir; done && - for file in `(cd .src && find . -type f ! -name '*.o' ! -name '*.d'|grep -v '\/\.')`; do ln -sf `pwd`/.src/$file $file; done && + # Link source files under .src + for file in `(cd .src && find . -maxdepth 1 -type f ! -name '*.o' ! -name '*.d')`; do + ln -sf .src/$file $file; + done && + # Link source files under .src/xxx, the first child dir. + for dir in `(cd .src && find . -type d|grep '\./'|grep -v Linux|grep -v Darwin)`; do + mkdir -p $dir && + for file in `(cd .src/$dir && find . -maxdepth 1 -type f ! -name '*.o' ! -name '*.d')`; do + ln -sf .src/$dir/$file $dir/$file; + done; + done && + # Build source code. make ${_ST_MAKE} EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" \ CC=${SRS_TOOL_CC} AR=${SRS_TOOL_AR} LD=${_ST_LD} RANDLIB=${SRS_TOOL_RANDLIB} && cd .. && rm -f st && ln -sf st-srs/${_ST_OBJ} st diff --git a/trunk/configure b/trunk/configure index b8d13c3f3..d3750ba8b 100755 --- a/trunk/configure +++ b/trunk/configure @@ -388,15 +388,15 @@ doclean: (cd research/librtmp && make clean) (cd research/api-server/static-dir && rm -rf crossdomain.xml forward live players) -clean: clean_srs clean_modules clean_st clean_openssl clean_ffmpeg clean_nginx clean_cherrypy +clean: clean_srs clean_modules @echo "You can clean each some components, see make help" -destroy: +destroy: clean_st clean_openssl clean_ffmpeg clean_nginx clean_cherrypy (cd ${SRS_OBJS_DIR} && rm -rf ${SRS_PLATFORM}) clean_srs: (cd ${SRS_OBJS_DIR} && rm -rf srs srs_utest) - (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM} && rm -rf include lib utest) + (cd ${SRS_OBJS_DIR}/${SRS_PLATFORM} && rm -rf src include lib utest) clean_modules: (cd ${SRS_OBJS_DIR} && rm -rf $__mdefaults) From 80f315f1ae98bfe5e4c532c27114d8855be669bd Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 29 Mar 2020 17:29:09 +0800 Subject: [PATCH 30/30] Support utest on mac osx --- trunk/auto/depends.sh | 4 ++-- trunk/auto/options.sh | 4 ---- trunk/auto/setup_variables.sh | 2 +- trunk/auto/utest.sh | 3 --- trunk/configure | 5 +++++ 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 454990507..d001a8aa0 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -334,10 +334,10 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then ln -sf .src/$file $file; done && # Link source files under .src/xxx, the first child dir. - for dir in `(cd .src && find . -type d|grep '\./'|grep -v Linux|grep -v Darwin)`; do + for dir in `(cd .src && find . -maxdepth 1 -type d|grep '\./'|grep -v Linux|grep -v Darwin)`; do mkdir -p $dir && for file in `(cd .src/$dir && find . -maxdepth 1 -type f ! -name '*.o' ! -name '*.d')`; do - ln -sf .src/$dir/$file $dir/$file; + ln -sf ../.src/$dir/$file $dir/$file; done; done && # Build source code. diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index b3eec6712..d6a52d83d 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -573,10 +573,6 @@ function check_option_conflicts() { echo "Don't support building FFMPEG, please use docker https://github.com/ossrs/srs-docker"; exit -1; fi - if [[ $SRS_OSX == YES && $SRS_UTEST == YES ]]; then - echo "Mac does not support utest."; exit -1; - fi - # TODO: FIXME: check more os. __check_ok=YES diff --git a/trunk/auto/setup_variables.sh b/trunk/auto/setup_variables.sh index c144c68f5..7a39fd166 100755 --- a/trunk/auto/setup_variables.sh +++ b/trunk/auto/setup_variables.sh @@ -13,7 +13,7 @@ echo "SRS_WORKDIR: ${SRS_WORKDIR}, SRS_OBJS_DIR: ${SRS_OBJS_DIR}, SRS_OBJS: ${SR # For src object files on each platform. ( mkdir -p ${SRS_OBJS_DIR} && cd ${SRS_OBJS_DIR} && - rm -rf src utest srs research include lib srs_hls_ingester srs_mp4_parser && + rm -rf src utest srs srs_utest research include lib srs_hls_ingester srs_mp4_parser && mkdir -p ${SRS_PLATFORM}/src && ln -sf ${SRS_PLATFORM}/src && mkdir -p ${SRS_PLATFORM}/utest && ln -sf ${SRS_PLATFORM}/utest && mkdir -p ${SRS_PLATFORM}/research && ln -sf ${SRS_PLATFORM}/research && diff --git a/trunk/auto/utest.sh b/trunk/auto/utest.sh index 7dcde25af..b359d4211 100755 --- a/trunk/auto/utest.sh +++ b/trunk/auto/utest.sh @@ -20,9 +20,6 @@ SRS_TRUNK_PREFIX=../../.. # gest dir, relative to objs/utest, it's trunk/objs/gtest GTEST_DIR=${SRS_TRUNK_PREFIX}/${SRS_OBJS_DIR}/gtest -# the extra defines to compile utest. -EXTRA_DEFINES="" - cat << END > ${FILE} # user must run make the ${SRS_OBJS_DIR}/utest dir # at the same dir of Makefile. diff --git a/trunk/configure b/trunk/configure index d3750ba8b..3566c7816 100755 --- a/trunk/configure +++ b/trunk/configure @@ -314,6 +314,11 @@ if [ $SRS_LIBRTMP = YES ]; then MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${LIBS_OBJS[@]}" BUILD_KEY="librtmp" LIB_NAME="lib/srs_librtmp" . auto/libs.sh fi +# For utest on mac. +# @see https://github.com/protocolbuffers/protobuf/issues/51#issuecomment-111044468 +if [[ $SRS_OSX == YES ]]; then + EXTRA_DEFINES="-DGTEST_USE_OWN_TR1_TUPLE=1" +fi # # utest, the unit-test cases of srs, base on gtest1.6 if [ $SRS_UTEST = YES ]; then