From 463f15cfd5dcc0c8f46377b58a6bc344179df10b Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 22 Nov 2022 12:00:28 +0800 Subject: [PATCH] Live: Limit cached max frames by gop_cache_max_frames. v5.0.93 --- trunk/conf/full.conf | 5 ++--- trunk/conf/srs.conf | 2 +- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_config.hpp | 3 +-- trunk/src/app/srs_app_rtmp_conn.cpp | 10 +++++----- trunk/src/app/srs_app_source.cpp | 14 ++++---------- trunk/src/core/srs_core_version5.hpp | 2 +- 7 files changed, 15 insertions(+), 22 deletions(-) diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 2e975714a21..b7ed2bef2fa 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -1097,9 +1097,8 @@ vhost play.srs.com { # default: on gop_cache off; - # to limit the max gop cache frames - # without this limit, if ingest stream always has no IDR frame, - # it may cause srs run out of memory + # Limit the max frames in gop cache. It might cause OOM if video stream has no IDR frame, so we limit to N + # frames by default. # default: 250 gop_cache_max_frames 250; diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index d02e71143d5..5194fc26204 100644 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -38,6 +38,6 @@ vhost __defaultVhost__ { } play{ - gop_cache_max_frames 100; + gop_cache_max_frames 250; } } diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 1f097bb3715..3f57d733ed7 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-11-22, Merge [#3236](https://github.com/ossrs/srs/pull/3236): Live: Limit cached max frames by gop_cache_max_frames. v5.0.93 * v5.0, 2022-11-22, Asan: Check libasan and show tips. v5.0.92 * v5.0, 2022-11-21, Merge [#3264](https://github.com/ossrs/srs/pull/3264): Asan: Try to fix st_memory_leak for asan check. (#3264). v5.0.91 * v5.0, 2022-11-21, Asan: Fix global ip address leak check. v5.0.90 diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index f54b4674fe5..0863c09a7e2 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -553,8 +553,7 @@ class SrsConfig // @return true when gop_cache is ok; otherwise, false. // @remark, default true. virtual bool get_gop_cache(std::string vhost); - // to set the max frames limit in gop cache - // @return gop cache frames limit + // Get the limit max frames for gop cache. virtual int get_gop_cache_max_frames(std::string vhost); // Whether debug_srs_upnode is enabled of vhost. // debug_srs_upnode is very important feature for tracable log, diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index a9c907c66a4..f8b14b6899b 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -557,12 +557,12 @@ srs_error_t SrsRtmpConn::stream_service_cycle() srs_assert(source != NULL); bool enabled_cache = _srs_config->get_gop_cache(req->vhost); - int gcf = _srs_config->get_gop_cache_max_frames(req->vhost); - - srs_trace("source url=%s, ip=%s, cache=%d, gop_cache_max_frames=%d, is_edge=%d, source_id=%s/%s", - req->get_stream_url().c_str(), ip.c_str(), enabled_cache, gcf, info->edge, source->source_id().c_str(), source->pre_source_id().c_str()); + int gcmf = _srs_config->get_gop_cache_max_frames(req->vhost); + srs_trace("source url=%s, ip=%s, cache=%d/%d, is_edge=%d, source_id=%s/%s", + req->get_stream_url().c_str(), ip.c_str(), enabled_cache, gcmf, info->edge, source->source_id().c_str(), + source->pre_source_id().c_str()); source->set_cache(enabled_cache); - source->set_gop_cache_max_frames(gcf); + source->set_gop_cache_max_frames(gcmf); switch (info->type) { case SrsRtmpConnPlay: { diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index cceb6e73d02..ca64be1525a 100755 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -575,7 +575,7 @@ SrsGopCache::SrsGopCache() cached_video_count = 0; enable_gop_cache = true; audio_after_last_video_count = 0; - gop_cache_max_frames_ = 250; + gop_cache_max_frames_ = 0; } SrsGopCache::~SrsGopCache() @@ -598,7 +598,6 @@ void SrsGopCache::set(bool v) } } - void SrsGopCache::set_gop_cache_max_frames(int v) { gop_cache_max_frames_ = v; @@ -656,16 +655,13 @@ srs_error_t SrsGopCache::cache(SrsSharedPtrMessage* shared_msg) cached_video_count = 1; } - // cache the frame. gop_cache.push_back(msg->copy()); + // Clear gop cache if exceed the max frames. if (gop_cache.size() > (size_t)gop_cache_max_frames_) { - srs_warn("too many frames in the gop cache, %d video frames & %d audio frames dropped, " - "audio_after_last_video_count: %d.", - cached_video_count, - (int)gop_cache.size() - cached_video_count, - audio_after_last_video_count); + srs_warn("Gop cache exceed max frames=%d, total=%d, videos=%d, aalvc=%d", + gop_cache_max_frames_, (int)gop_cache.size(), cached_video_count, audio_after_last_video_count); clear(); } @@ -2103,7 +2099,6 @@ srs_error_t SrsLiveSource::on_reload_vhost_play(string vhost) string url = req->get_stream_url(); srs_trace("vhost %s gop_cache changed to %d, source url=%s", vhost.c_str(), v, url.c_str()); gop_cache->set(v); - gop_cache->set_gop_cache_max_frames(_srs_config->get_gop_cache_max_frames(vhost)); } } @@ -2749,7 +2744,6 @@ void SrsLiveSource::set_gop_cache_max_frames(int v) gop_cache->set_gop_cache_max_frames(v); } - SrsRtmpJitterAlgorithm SrsLiveSource::jitter() { return jitter_algorithm; diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 63d68fa5a67..bb5c81146fb 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 92 +#define VERSION_REVISION 93 #endif