From c3e26021a4071de0de7aead80295ca13d1320b0c Mon Sep 17 00:00:00 2001 From: Alexander Lussier-Cullen <alexander.lussier-cullen@savoirfairelinux.com> Date: Fri, 29 Sep 2023 09:14:38 -0400 Subject: [PATCH] video_rtp_session: allow socket transmissions for response packets Bitrate adjustment (REMB) packets in video calls are sent back on the same socket pair as the video itself. Video being enabled or disabled should thusly not stop communication on these sockets fully as they could still be needed for these packets. Change-Id: I3789aae44884ad5acfe5e1b014767ff2bf84ba33 --- src/media/video/video_rtp_session.cpp | 32 +++++++++++++++++++-------- src/media/video/video_rtp_session.h | 4 ++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 43d1f1ebf9..aed272babe 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 d053289178..cd96895c01 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; -- GitLab