From eeb44ebbe942db8f05b9c33fcdb28d195db8b856 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 14 Feb 2022 18:17:02 +0800 Subject: [PATCH 1/6] Version: Ignore the mgmt version --- trunk/src/app/srs_app_latest_version.cpp | 2 -- trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/main/srs_main_server.cpp | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/trunk/src/app/srs_app_latest_version.cpp b/trunk/src/app/srs_app_latest_version.cpp index 45de0034d..58d0e3d6c 100644 --- a/trunk/src/app/srs_app_latest_version.cpp +++ b/trunk/src/app/srs_app_latest_version.cpp @@ -79,8 +79,6 @@ void srs_build_features(stringstream& ss) SRS_CHECK_FEATURE3(!string(region).empty(), "region", region, ss); string source = srs_getenv("SRS_SOURCE"); SRS_CHECK_FEATURE3(!string(source).empty(), "source", source, ss); - string mgmt = srs_getenv("SRS_MGMT"); - SRS_CHECK_FEATURE3(!string(mgmt).empty(), "mgmt", mgmt, ss); int nn_vhosts = 0; bool rtsp = false, forward = false, ingest = false, edge = false, hls = false, dvr = false, flv = false; diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index d2532c342..c1eeab9f8 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 241 +#define VERSION_REVISION 242 #endif diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index fb937fd5a..de43f00f5 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -127,9 +127,9 @@ srs_error_t do_main(int argc, char** argv) srs_trace2(TAG_MAIN, "%s, %s", RTMP_SIG_SRS_SERVER, RTMP_SIG_SRS_LICENSE); srs_trace("authors: %s", RTMP_SIG_SRS_AUTHORS); srs_trace("contributors: %s", SRS_CONSTRIBUTORS); - srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d, pkg: %s, region: %s, source: %s, mgmt: %s", + srs_trace("cwd=%s, work_dir=%s, build: %s, configure: %s, uname: %s, osx: %d, pkg: %s, region: %s, source: %s", _srs_config->cwd().c_str(), cwd.c_str(), SRS_BUILD_DATE, SRS_USER_CONFIGURE, SRS_UNAME, SRS_OSX_BOOL, SRS_PACKAGER, - srs_getenv("SRS_REGION").c_str(), srs_getenv("SRS_SOURCE").c_str(), srs_getenv("SRS_MGMT").c_str()); + srs_getenv("SRS_REGION").c_str(), srs_getenv("SRS_SOURCE").c_str()); srs_trace("configure detail: " SRS_CONFIGURE); #ifdef SRS_EMBEDED_TOOL_CHAIN srs_trace("crossbuild tool chain: " SRS_EMBEDED_TOOL_CHAIN); From 0a848430e916b66ee82e862fc570d0eaaf601038 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 15 Feb 2022 18:35:25 +0800 Subject: [PATCH 2/6] Refine build script for SRT to avoid warnings. v4.0.243 --- trunk/auto/depends.sh | 6 ++++++ trunk/doc/CHANGELOG.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- trunk/src/srt/srt_to_rtmp.hpp | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 4e174310f..c774dd746 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -603,6 +603,12 @@ fi # srtp ##################################################################################### SRTP_OPTIONS="" +# To eliminate warnings, see https://stackoverflow.com/a/34208904/17679565 +# was built for newer macOS version (11.6) than being linked (11.0) +if [[ $SRS_OSX == YES ]]; then + export MACOSX_DEPLOYMENT_TARGET=11.0 + echo "Set MACOSX_DEPLOYMENT_TARGET to avoid warnings" +fi # If use ASM for SRTP, we enable openssl(with ASM). if [[ $SRS_SRTP_ASM == YES ]]; then SRTP_OPTIONS="--enable-openssl" diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index da7e5b596..f898dd45b 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2022-02-15, Refine build script for SRT to avoid warnings. v4.0.243 * v4.0, 2022-02-11, Support new fields for feature query. v4.0.241 * v4.0, 2022-02-09, Mirror docker images in TCR Singapore. v4.0.240 * v4.0, 2022-02-08, Refine the error for WebRTC H5 publisher. v4.0.239 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index c1eeab9f8..a10cfac07 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 242 +#define VERSION_REVISION 243 #endif diff --git a/trunk/src/srt/srt_to_rtmp.hpp b/trunk/src/srt/srt_to_rtmp.hpp index 0cfa15c5a..3bf98e103 100644 --- a/trunk/src/srt/srt_to_rtmp.hpp +++ b/trunk/src/srt/srt_to_rtmp.hpp @@ -69,7 +69,7 @@ private: class rtmp_client : public ts_media_data_callback_I, public std::enable_shared_from_this { public: rtmp_client(std::string key_path); - ~rtmp_client(); + virtual ~rtmp_client(); void receive_ts_data(SRT_DATA_MSG_PTR data_ptr); int64_t get_last_live_ts(); From e8fca60eceb98302d301d77c5432babe681681cb Mon Sep 17 00:00:00 2001 From: loveforever <31402829+zhouxiaojun2008@users.noreply.github.com> Date: Tue, 15 Feb 2022 18:49:17 +0800 Subject: [PATCH 3/6] SRT: Close connection if RTMP failed. (#2917) * SRT: using global variables to pass errors (#2897) * SRT: using global variables to pass errors (#2897) --- trunk/src/srt/srt_handle.cpp | 13 +++++++++++++ trunk/src/srt/srt_to_rtmp.cpp | 33 ++++++++++++++++++++------------- trunk/src/srt/srt_to_rtmp.hpp | 9 ++++++--- trunk/src/srt/ts_demux.cpp | 15 ++++++++------- trunk/src/srt/ts_demux.hpp | 4 ++-- 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/trunk/src/srt/srt_handle.cpp b/trunk/src/srt/srt_handle.cpp index 20547d673..4d4ccd34e 100644 --- a/trunk/src/srt/srt_handle.cpp +++ b/trunk/src/srt/srt_handle.cpp @@ -206,6 +206,19 @@ void srt_handle::handle_push_data(SRT_SOCKSTATUS status, const std::string& subp srt_conn_ptr->update_timestamp(srt_now_ms); srt2rtmp::get_instance()->insert_data_message(data, ret, subpath); + { + std::unique_lock locker(srt2rtmp::_srt_error_mutex); + if (srt2rtmp::_srt_error_map.count(subpath) == 1) { + int err_code = srt2rtmp::_srt_error_map[subpath]; + if (err_code != ERROR_SUCCESS) { + close_push_conn(conn_fd); + srt_log_error("handle_push_data srt to rtmp error:%d, fd:%d", err_code,conn_fd); + //todo: reset to next use, maybe update by srt2rtmp::cycle again + srt2rtmp::_srt_error_map[subpath] = ERROR_SUCCESS; + return; + } + } + } //send data to subscriber(players) //streamid, play map diff --git a/trunk/src/srt/srt_to_rtmp.cpp b/trunk/src/srt/srt_to_rtmp.cpp index 268a1cbf4..ea3922417 100644 --- a/trunk/src/srt/srt_to_rtmp.cpp +++ b/trunk/src/srt/srt_to_rtmp.cpp @@ -16,6 +16,8 @@ #include std::shared_ptr srt2rtmp::s_srt2rtmp_ptr; +std::mutex srt2rtmp::_srt_error_mutex; +std::map srt2rtmp::_srt_error_map; std::shared_ptr srt2rtmp::get_instance() { if (!s_srt2rtmp_ptr) { @@ -153,6 +155,7 @@ void srt2rtmp::handle_close_rtmpsession(const std::string& key_path) { srs_error_t srt2rtmp::cycle() { srs_error_t err = srs_success; _lastcheck_ts = 0; + int err_code = -1; while(true) { SRT_DATA_MSG_PTR msg_ptr = get_data_message(); @@ -163,7 +166,11 @@ srs_error_t srt2rtmp::cycle() { switch (msg_ptr->msg_type()) { case SRT_MSG_DATA_TYPE: { - handle_ts_data(msg_ptr); + err_code = handle_ts_data(msg_ptr); + if (err_code != ERROR_SUCCESS) { + std::unique_lock locker(_srt_error_mutex); + _srt_error_map[msg_ptr->get_path()] = err_code; + } break; } case SRT_MSG_CLOSE_TYPE: @@ -192,7 +199,7 @@ srs_error_t srt2rtmp::cycle() { } } -void srt2rtmp::handle_ts_data(SRT_DATA_MSG_PTR data_ptr) { +int srt2rtmp::handle_ts_data(SRT_DATA_MSG_PTR data_ptr) { RTMP_CLIENT_PTR rtmp_ptr; auto iter = _rtmp_client_map.find(data_ptr->get_path()); if (iter == _rtmp_client_map.end()) { @@ -203,9 +210,7 @@ void srt2rtmp::handle_ts_data(SRT_DATA_MSG_PTR data_ptr) { rtmp_ptr = iter->second; } - rtmp_ptr->receive_ts_data(data_ptr); - - return; + return rtmp_ptr->receive_ts_data(data_ptr); } void srt2rtmp::handle_log_data(SRT_DATA_MSG_PTR data_ptr) { @@ -343,9 +348,8 @@ srs_error_t rtmp_client::connect() { return err; } -void rtmp_client::receive_ts_data(SRT_DATA_MSG_PTR data_ptr) { - _ts_demux_ptr->decode(data_ptr, shared_from_this());//on_data_callback is the decode callback - return; +int rtmp_client::receive_ts_data(SRT_DATA_MSG_PTR data_ptr) { + return _ts_demux_ptr->decode(data_ptr, shared_from_this());//on_data_callback is the decode callback } srs_error_t rtmp_client::write_h264_sps_pps(uint32_t dts, uint32_t pts) { @@ -668,13 +672,13 @@ srs_error_t rtmp_client::on_ts_audio(std::shared_ptr avs_ptr, uint64_ return err; } -void rtmp_client::on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, +int rtmp_client::on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, uint64_t dts, uint64_t pts) { srs_error_t err = srs_success; if (!data_ptr || (data_ptr->get_data() == nullptr) || (data_ptr->data_len() == 0)) { assert(0); - return; + return 0; } auto avs_ptr = std::make_shared((char*)data_ptr->get_data(), data_ptr->data_len()); @@ -685,13 +689,16 @@ void rtmp_client::on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media err = on_ts_audio(avs_ptr, dts, pts); } else { srs_error("mpegts demux unkown stream type:0x%02x, only support h264+aac", media_type); - return; + return 0; } if (err != srs_success) { - srs_error("send media data error:", srs_error_code(err)); + srs_error("send media data error:%s", srs_error_desc(err).c_str()); + int err_code = srs_error_code(err); + srs_freep(err); + return err_code; } - return; + return 0; } rtmp_packet_queue::rtmp_packet_queue():_queue_timeout(QUEUE_DEF_TIMEOUT) diff --git a/trunk/src/srt/srt_to_rtmp.hpp b/trunk/src/srt/srt_to_rtmp.hpp index 3bf98e103..ce50e6149 100644 --- a/trunk/src/srt/srt_to_rtmp.hpp +++ b/trunk/src/srt/srt_to_rtmp.hpp @@ -71,7 +71,7 @@ public: rtmp_client(std::string key_path); virtual ~rtmp_client(); - void receive_ts_data(SRT_DATA_MSG_PTR data_ptr); + int receive_ts_data(SRT_DATA_MSG_PTR data_ptr); int64_t get_last_live_ts(); std::string get_url(); @@ -79,7 +79,7 @@ public: void close(); private: - virtual void on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, uint64_t dts, uint64_t pts); + virtual int on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, uint64_t dts, uint64_t pts); private: srs_error_t on_ts_video(std::shared_ptr avs_ptr, uint64_t dts, uint64_t pts); @@ -140,7 +140,7 @@ public: private: SRT_DATA_MSG_PTR get_data_message(); virtual srs_error_t cycle(); - void handle_ts_data(SRT_DATA_MSG_PTR data_ptr); + int handle_ts_data(SRT_DATA_MSG_PTR data_ptr); void handle_close_rtmpsession(const std::string& key_path); void handle_log_data(SRT_DATA_MSG_PTR data_ptr); void check_rtmp_alive(); @@ -154,6 +154,9 @@ private: std::unordered_map _rtmp_client_map; int64_t _lastcheck_ts; +public: + static std::mutex _srt_error_mutex; + static std::map _srt_error_map; }; #endif diff --git a/trunk/src/srt/ts_demux.cpp b/trunk/src/srt/ts_demux.cpp index 92d055e44..2c25f5e0a 100644 --- a/trunk/src/srt/ts_demux.cpp +++ b/trunk/src/srt/ts_demux.cpp @@ -276,7 +276,9 @@ int ts_demux::decode_unit(unsigned char* data_p, std::string key_path, TS_DATA_C uint64_t pts = 0; //callback last media data in data buffer - on_callback(callback, _last_pid, key_path, _last_dts, _last_pts); + int err_code = on_callback(callback, _last_pid, key_path, _last_dts, _last_pts); + if (err_code != 0) + return err_code; int ret = pes_parse(data_p+npos, npos, &ret_data_p, ret_size, dts, pts); if (ret > 188) { @@ -320,7 +322,7 @@ int ts_demux::decode(SRT_DATA_MSG_PTR data_ptr, TS_DATA_CALLBACK_PTR callback) continue; } ret = decode_unit(data, path, callback); - if (ret < 0) + if (ret != 0) // srs_error_code is positive { break; } @@ -335,15 +337,15 @@ void ts_demux::insert_into_databuf(unsigned char* data_p, size_t data_size, std: return; } -void ts_demux::on_callback(TS_DATA_CALLBACK_PTR callback, unsigned short pid, std::string key_path, +int ts_demux::on_callback(TS_DATA_CALLBACK_PTR callback, unsigned short pid, std::string key_path, uint64_t dts, uint64_t pts) { if ((_data_total <=0 ) || (_data_buffer_vec.empty())) { - return; + return 0; } auto iter = _pmt._pid2steamtype.find(pid); if (iter == _pmt._pid2steamtype.end()) { - return; + return 0; } unsigned char stream_type = iter->second; auto total_data_ptr = std::make_shared(_data_total, key_path); @@ -358,8 +360,7 @@ void ts_demux::on_callback(TS_DATA_CALLBACK_PTR callback, unsigned short pid, st _data_buffer_vec.clear(); _data_total = 0; - callback->on_data_callback(total_data_ptr, stream_type, dts, pts); - return; + return callback->on_data_callback(total_data_ptr, stream_type, dts, pts); } bool ts_demux::is_pmt(unsigned short pid) { diff --git a/trunk/src/srt/ts_demux.hpp b/trunk/src/srt/ts_demux.hpp index bdd7e9221..5a824567f 100644 --- a/trunk/src/srt/ts_demux.hpp +++ b/trunk/src/srt/ts_demux.hpp @@ -74,7 +74,7 @@ Value Description class ts_media_data_callback_I { public: - virtual void on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, uint64_t dts, uint64_t pts) = 0; + virtual int on_data_callback(SRT_DATA_MSG_PTR data_ptr, unsigned int media_type, uint64_t dts, uint64_t pts) = 0; }; typedef std::shared_ptr TS_DATA_CALLBACK_PTR; @@ -227,7 +227,7 @@ private: int pes_parse(unsigned char* p, size_t npos, unsigned char** ret_pp, size_t& ret_size, uint64_t& dts, uint64_t& pts); void insert_into_databuf(unsigned char* data_p, size_t data_size, std::string key_path, unsigned short pid); - void on_callback(TS_DATA_CALLBACK_PTR callback, unsigned short pid, + int on_callback(TS_DATA_CALLBACK_PTR callback, unsigned short pid, std::string key_path, uint64_t dts, uint64_t pts); private: From 37b6b48882273252dff02e23d396a72677decb8a Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 15 Feb 2022 18:51:28 +0800 Subject: [PATCH 4/6] SRT: Close connection if RTMP failed. (#2917). v4.0.244 --- trunk/doc/CHANGELOG.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index f898dd45b..719b698f7 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2022-02-15, Merge [#2917](https://github.com/ossrs/srs/pull/2917): SRT: Close connection if RTMP failed. (#2917). v4.0.244 * v4.0, 2022-02-15, Refine build script for SRT to avoid warnings. v4.0.243 * v4.0, 2022-02-11, Support new fields for feature query. v4.0.241 * v4.0, 2022-02-09, Mirror docker images in TCR Singapore. v4.0.240 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index a10cfac07..6e1391747 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 243 +#define VERSION_REVISION 244 #endif From b94ae922d4be3f7327d4d5460b2996459158a941 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 15 Feb 2022 19:07:37 +0800 Subject: [PATCH 5/6] Fix warnings for uuid. v4.0.245 --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_uuid.cpp | 11 +++++++++-- trunk/src/core/srs_core_version4.hpp | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 719b698f7..e5073aa0f 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 4.0 Changelog +* v4.0, 2022-02-15, Fix warnings for uuid. v4.0.245 * v4.0, 2022-02-15, Merge [#2917](https://github.com/ossrs/srs/pull/2917): SRT: Close connection if RTMP failed. (#2917). v4.0.244 * v4.0, 2022-02-15, Refine build script for SRT to avoid warnings. v4.0.243 * v4.0, 2022-02-11, Support new fields for feature query. v4.0.241 diff --git a/trunk/src/app/srs_app_uuid.cpp b/trunk/src/app/srs_app_uuid.cpp index 721efbf7b..673ed6b1c 100644 --- a/trunk/src/app/srs_app_uuid.cpp +++ b/trunk/src/app/srs_app_uuid.cpp @@ -148,6 +148,7 @@ (type *)( (char *)__mptr - offsetof(type,member) );}) #endif +#if 0 #ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME # ifdef HAVE___PROGNAME extern char *__progname; @@ -181,9 +182,10 @@ prog_inv_sh_nm_from_file(char *f, char stripext) } # endif #endif - +#endif #ifndef HAVE_ERR_H +#if 0 static inline void errmsg(char doexit, int excode, char adderr, const char *fmt, ...) { @@ -202,6 +204,7 @@ errmsg(char doexit, int excode, char adderr, const char *fmt, ...) if (doexit) exit(excode); } +#endif #ifndef HAVE_ERR # define err(E, FMT...) errmsg(1, E, 1, FMT) @@ -221,10 +224,12 @@ errmsg(char doexit, int excode, char adderr, const char *fmt, ...) #endif /* !HAVE_ERR_H */ +#if 0 static inline __attribute__((const)) int is_power_of_2(unsigned long num) { return (num != 0 && ((num & (num - 1)) == 0)); } +#endif #ifndef HAVE_LOFF_T typedef int64_t loff_t; @@ -263,6 +268,7 @@ static inline int dirfd(DIR *d) #define IUTF8 0040000 #endif +#if 0 /* * MAXHOSTNAMELEN replacement */ @@ -282,6 +288,7 @@ static inline size_t get_hostname_max(void) #endif return 64; } +#endif #ifndef HAVE_USLEEP /* @@ -825,7 +832,7 @@ static int get_clock(uint32_t *clock_high, uint32_t *clock_low, rewind(state_f); len = fprintf(state_f, "clock: %04x tv: %016lu %08lu adj: %08d\n", - clock_seq, last.tv_sec, last.tv_usec, adjustment); + clock_seq, last.tv_sec, (unsigned long)last.tv_usec, adjustment); fflush(state_f); if (ftruncate(state_fd, len) < 0) { fprintf(state_f, " \n"); diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 6e1391747..f74cfb24b 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 0 -#define VERSION_REVISION 244 +#define VERSION_REVISION 245 #endif From cd0599baeb615c4f95b0b4016142268a2430c15d Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 15 Feb 2022 19:34:01 +0800 Subject: [PATCH 6/6] Release v4.0-b9, 4.0 beta9, v4.0.245, 144474 lines. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 171746f95..daefeb1b6 100755 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ A big THANK YOU goes to: ## Releases +* 2022-02-15, Release [v4.0-b9](https://github.com/ossrs/srs/releases/tag/v4.0-b9), v4.0-b9, 4.0 beta9, v4.0.245, 144474 lines. * 2022-02-11, Release [v4.0-b8](https://github.com/ossrs/srs/releases/tag/v4.0-b8), v4.0-b8, 4.0 beta8, v4.0.241, 144445 lines. * 2022-02-09, Release [v4.0-b7](https://github.com/ossrs/srs/releases/tag/v4.0-b7), v4.0-b7, 4.0 beta7, v4.0.240, 144437 lines. * 2022-02-04, Release [v4.0-b6](https://github.com/ossrs/srs/releases/tag/v4.0-b6), v4.0-b6, 4.0 beta6, v4.0.238, 144437 lines.