From e1393b8d1a235247caa5bf417d59ca96d9207974 Mon Sep 17 00:00:00 2001 From: Eloi BAIL <eloi.bail@savoirfairelinux.com> Date: Thu, 26 Nov 2015 19:19:59 -0500 Subject: [PATCH] media/video: avoid quality toggling Based on RTCP information. Video quality was often toggling. To avoid that, we only allow to decrease quality if a higher quality was already calculated in of the 5 previous tries. Tuleap: #158 Change-Id: I9a42a87f7958e4477dbebecc4c24c6a3d000b835 --- src/media/video/video_rtp_session.cpp | 8 ++++++-- src/media/video/video_rtp_session.h | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index c09b5f3551..d00944e8da 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 5010cb62f4..8d8c4f6ae7 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_; -- GitLab