diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 43d1f1ebf9f9fb2047a2e586bdf46521486e8ea2..aed272babeb28712406c3bcb2419f389f2e24c08 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -218,6 +218,9 @@ VideoRtpSession::startSender() rtcpCheckerThread_.start(); else if (not autoQuality and rtcpCheckerThread_.isRunning()) rtcpCheckerThread_.join(); + // Block reads to received feedback packets + if(socketPair_) + socketPair_->setReadBlockingMode(true); } } @@ -239,7 +242,7 @@ VideoRtpSession::restartSender() } void -VideoRtpSession::stopSender() +VideoRtpSession::stopSender(bool forceStopSocket) { // Concurrency protection must be done by caller. @@ -256,8 +259,13 @@ VideoRtpSession::stopSender() sender_.reset(); } - if (socketPair_) - socketPair_->stopSendOp(); + if (socketPair_) { + bool const isReceivingVideo = receive_.enabled && !receive_.onHold; + if(forceStopSocket || !isReceivingVideo) { + socketPair_->stopSendOp(); + socketPair_->setReadBlockingMode(false); + } + } } void @@ -316,7 +324,7 @@ VideoRtpSession::startReceiver() } void -VideoRtpSession::stopReceiver() +VideoRtpSession::stopReceiver(bool forceStopSocket) { // Concurrency protection must be done by caller. @@ -338,8 +346,13 @@ VideoRtpSession::stopReceiver() // We need to disable the read operation, otherwise the // receiver thread will block since the peer stopped sending // RTP packets. - if (socketPair_) - socketPair_->setReadBlockingMode(false); + bool const isSendingVideo = send_.enabled && !send_.onHold; + if (socketPair_) { + if (forceStopSocket || !isSendingVideo) { + socketPair_->setReadBlockingMode(false); + socketPair_->stopSendOp(); + } + } auto ms = receiveThread_->getInfo(); if (auto ob = recorder_->getStream(ms.name)) { @@ -347,7 +360,8 @@ VideoRtpSession::stopReceiver() recorder_->removeStream(ms); } - receiveThread_->stopLoop(); + if(forceStopSocket || !isSendingVideo) + receiveThread_->stopLoop(); receiveThread_->stopSink(); } @@ -413,8 +427,8 @@ VideoRtpSession::stop() { std::lock_guard<std::recursive_mutex> lock(mutex_); - stopSender(); - stopReceiver(); + stopSender(true); + stopReceiver(true); if (socketPair_) socketPair_->interrupt(); diff --git a/src/media/video/video_rtp_session.h b/src/media/video/video_rtp_session.h index d0532891788192363af587df1ca79c377516bc7d..cd96895c01bdb20be390d6b9325059ff3ed9be78 100644 --- a/src/media/video/video_rtp_session.h +++ b/src/media/video/video_rtp_session.h @@ -117,9 +117,9 @@ private: void setupConferenceVideoPipeline(Conference& conference, Direction dir); void setupVideoPipeline(); void startSender(); - void stopSender(); + void stopSender(bool forceStopSocket = false); void startReceiver(); - void stopReceiver(); + void stopReceiver(bool forceStopSocket = false); using clock = std::chrono::steady_clock; using time_point = clock::time_point;