diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index c09b5f355163311088ba50e985958cf297cb14fb..d00944e8da0b1d7782a370532657f36b33fa2243 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -375,6 +375,7 @@ VideoRtpSession::adaptQualityAndBitrate() if (rtcpLongCheckTimer.count() >= RTCP_LONG_CHECKING_INTERVAL) { needToCheckQuality = true; + hasReachMaxQuality_ = false; lastLongRTCPCheck_ = std::chrono::system_clock::now(); // we force iterative bitrate adaptation videoBitrateInfo_.cptBitrateChecking = 0; @@ -415,12 +416,15 @@ VideoRtpSession::adaptQualityAndBitrate() if (((videoBitrateInfo_.videoQualityCurrent != SystemCodecInfo::DEFAULT_NO_QUALITY) && (videoBitrateInfo_.videoQualityCurrent != (histoQuality_.empty() ? 0 : histoQuality_.back()))) || ((videoBitrateInfo_.videoQualityCurrent == SystemCodecInfo::DEFAULT_NO_QUALITY) && - (videoBitrateInfo_.videoBitrateCurrent != (histoBitrate_.empty() ? 0 : histoBitrate_.back())))) + (videoBitrateInfo_.videoBitrateCurrent != (histoBitrate_.empty() ? 0 : histoBitrate_.back())))) { mediaRestartNeeded = true; + hasReachMaxQuality_ = true; + } // no packet lost: increase quality and bitrate - } else if (videoBitrateInfo_.cptBitrateChecking <= videoBitrateInfo_.maxBitrateChecking) { + } else if ((videoBitrateInfo_.cptBitrateChecking <= videoBitrateInfo_.maxBitrateChecking) + and not hasReachMaxQuality_) { // calculate new quality by dichotomie videoBitrateInfo_.videoQualityCurrent = diff --git a/src/media/video/video_rtp_session.h b/src/media/video/video_rtp_session.h index 5010cb62f46d9c2ebab71a21237b9ce399fb7faa..8d8c4f6ae77c3d392e9d1b621539c4f92b9e5a44 100644 --- a/src/media/video/video_rtp_session.h +++ b/src/media/video/video_rtp_session.h @@ -117,9 +117,10 @@ private: static constexpr unsigned MAX_SIZE_HISTO_QUALITY_ {30}; static constexpr unsigned MAX_SIZE_HISTO_BITRATE_ {100}; - //5 tries in a row + // 5 tries in a row static constexpr unsigned MAX_ADAPTATIVE_BITRATE_ITERATION {5}; - //packet loss threshold + bool hasReachMaxQuality_ {false}; + // packet loss threshold static constexpr float PACKET_LOSS_THRESHOLD {1.0}; InterruptedThreadLoop rtcpCheckerThread_;