diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 72b7f97e1c2eb461859df3eadf519be3eed7c20a..852850eca2aac5ccf6f1b1ab4e7ec5ff20504989 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -55,6 +55,9 @@ VideoRtpSession::VideoRtpSession(const string &callID, , rtcpCheckerThread_(std::bind(&VideoRtpSession::setupRtcpChecker, this), std::bind(&VideoRtpSession::processRtcpChecker, this), std::bind(&VideoRtpSession::cleanupRtcpChecker, this)) + , receiverRestartThread_([]{ return true; }, + [this]{ processReceiverRestart(); }, + []{}) {} VideoRtpSession::~VideoRtpSession() @@ -141,10 +144,12 @@ void VideoRtpSession::startReceiver() * we decided so to disable them for the moment receiveThread_->setRequestKeyFrameCallback(&SIPVoIPLink::enqueueKeyframeRequest); */ + receiverRestartThread_.start(); receiveThread_->addIOContext(*socketPair_); receiveThread_->startLoop(); } else { RING_DBG("Video receiving disabled"); + receiverRestartThread_.join(); if (receiveThread_) receiveThread_->detach(videoMixer_.get()); receiveThread_.reset(); @@ -200,6 +205,7 @@ void VideoRtpSession::stop() { std::lock_guard<std::recursive_mutex> lock(mutex_); rtcpCheckerThread_.join(); + receiverRestartThread_.join(); if (videoLocal_) videoLocal_->detach(sender_.get()); @@ -558,7 +564,6 @@ VideoRtpSession::checkReceiver() void VideoRtpSession::processRtcpChecker() { - checkReceiver(); adaptQualityAndBitrate(); rtcpCheckerThread_.wait_for(std::chrono::seconds(RTCP_CHECKING_INTERVAL)); } @@ -567,4 +572,11 @@ void VideoRtpSession::cleanupRtcpChecker() {} +void +VideoRtpSession::processReceiverRestart() +{ + checkReceiver(); + receiverRestartThread_.wait_for(std::chrono::seconds(RECEIVER_RESTART_INTERVAL)); +} + }} // namespace ring::video diff --git a/src/media/video/video_rtp_session.h b/src/media/video/video_rtp_session.h index 407b5da78cc340cbe0262a15a72066ac13d1b9c0..fb4681cb5ed5ea4b6a8f6c31c6596d03a7ceadad 100644 --- a/src/media/video/video_rtp_session.h +++ b/src/media/video/video_rtp_session.h @@ -118,6 +118,8 @@ private: // max size of quality and bitrate historic static constexpr unsigned MAX_SIZE_HISTO_QUALITY_ {30}; static constexpr unsigned MAX_SIZE_HISTO_BITRATE_ {100}; + // how long (in seconds) to wait before rechecking if the receiver needs to restart + const unsigned RECEIVER_RESTART_INTERVAL {4}; // 5 tries in a row static constexpr unsigned MAX_ADAPTATIVE_BITRATE_ITERATION {5}; @@ -129,6 +131,9 @@ private: bool setupRtcpChecker(); void processRtcpChecker(); void cleanupRtcpChecker(); + + InterruptedThreadLoop receiverRestartThread_; + void processReceiverRestart(); }; }} // namespace ring::video