diff --git a/.run/srs-stack.run.xml b/.run/srs-stack.run.xml new file mode 100644 index 000000000..720752edf --- /dev/null +++ b/.run/srs-stack.run.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 7060ca71e..88415ab92 100755 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ developers listed below: [![](https://opencollective.com/srs-server/backers.svg?width=800&button=false)](https://opencollective.com/srs-server) We at SRS aim to establish a non-profit, open-source community that assists developers worldwide in creating -their own high-quality streaming and RTC platforms to support your businesses. +your own high-quality streaming and RTC platforms to support your businesses. ## AUTHORS diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 062a8f925..14d6c823e 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 6.0 Changelog +* v6.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v6.0.69 (#3781) * v6.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v6.0.68 (#3768) * v6.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v6.0.67 (#3782) * v6.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v6.0.66 (#3699) @@ -80,6 +81,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v5.0.174 (#3781) * v5.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v5.0.173 (#3768) * v5.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v5.0.172 (#3782) * v5.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v5.0.171 (#3699) diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 8ac72547b..7fa2fc299 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -1136,6 +1136,7 @@ SrsHls::SrsHls() enabled = false; disposable = false; + unpublishing_ = false; async_reload_ = reloading_ = false; last_update_time = 0; hls_dts_directly = false; @@ -1222,7 +1223,7 @@ void SrsHls::dispose() srs_error_t SrsHls::cycle() { srs_error_t err = srs_success; - + if (last_update_time <= 0) { last_update_time = srs_get_system_time(); } @@ -1231,6 +1232,9 @@ srs_error_t SrsHls::cycle() return err; } + // When unpublishing, we must wait for it done. + if (unpublishing_) return err; + // When reloading, we must wait for it done. if (async_reload_) return err; @@ -1243,12 +1247,12 @@ srs_error_t SrsHls::cycle() return err; } last_update_time = srs_get_system_time(); - + if (!disposable) { return err; } disposable = false; - + srs_trace("hls cycle to dispose hls %s, timeout=%dms", req->get_stream_url().c_str(), hls_dispose); dispose(); @@ -1295,6 +1299,8 @@ srs_error_t SrsHls::on_publish() // if enabled, open the muxer. enabled = true; + // Reset the unpublishing state. + unpublishing_ = false; // ok, the hls can be dispose, or need to be dispose. disposable = true; @@ -1310,6 +1316,10 @@ void SrsHls::on_unpublish() if (!enabled) { return; } + + // During unpublishing, there maybe callback that switch to other coroutines. + if (unpublishing_) return; + unpublishing_ = true; if ((err = controller->on_unpublish()) != srs_success) { srs_warn("hls: ignore unpublish failed %s", srs_error_desc(err).c_str()); @@ -1317,6 +1327,7 @@ void SrsHls::on_unpublish() } enabled = false; + unpublishing_ = false; } srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* format) @@ -1324,7 +1335,7 @@ srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma srs_error_t err = srs_success; // If not able to transmux to HLS, ignore. - if (!enabled) return err; + if (!enabled || unpublishing_) return err; if (async_reload_) return reload(); // Ignore if no format->acodec, it means the codec is not parsed, or unknown codec. @@ -1406,7 +1417,7 @@ srs_error_t SrsHls::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* forma srs_error_t err = srs_success; // If not able to transmux to HLS, ignore. - if (!enabled) return err; + if (!enabled || unpublishing_) return err; if (async_reload_) return reload(); // Ignore if no format->vcodec, it means the codec is not parsed, or unknown codec. diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index 7975230e0..e111b68b6 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -279,10 +279,12 @@ private: bool enabled; // Whether the HLS stream is able to be disposed. bool disposable; + // Whether the HLS stream is unpublishing. + bool unpublishing_; // Whether requires HLS to do reload asynchronously. bool async_reload_; bool reloading_; - // To detect heartbeat and dipose it if configured. + // To detect heartbeat and dispose it if configured. srs_utime_t last_update_time; private: // If the diff=dts-previous_audio_dts is about 23, diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 044a8e80d..89715af75 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 173 +#define VERSION_REVISION 174 #endif diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp index 8631d8510..19b1b1920 100644 --- a/trunk/src/core/srs_core_version6.hpp +++ b/trunk/src/core/srs_core_version6.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 -#define VERSION_REVISION 68 +#define VERSION_REVISION 69 #endif