Skip to content
Snippets Groups Projects
Commit c3e26021 authored by Alexander Lussier-Cullen's avatar Alexander Lussier-Cullen Committed by Adrien Béraud
Browse files

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
parent 23646698
No related branches found
No related tags found
No related merge requests found
...@@ -218,6 +218,9 @@ VideoRtpSession::startSender() ...@@ -218,6 +218,9 @@ VideoRtpSession::startSender()
rtcpCheckerThread_.start(); rtcpCheckerThread_.start();
else if (not autoQuality and rtcpCheckerThread_.isRunning()) else if (not autoQuality and rtcpCheckerThread_.isRunning())
rtcpCheckerThread_.join(); rtcpCheckerThread_.join();
// Block reads to received feedback packets
if(socketPair_)
socketPair_->setReadBlockingMode(true);
} }
} }
...@@ -239,7 +242,7 @@ VideoRtpSession::restartSender() ...@@ -239,7 +242,7 @@ VideoRtpSession::restartSender()
} }
void void
VideoRtpSession::stopSender() VideoRtpSession::stopSender(bool forceStopSocket)
{ {
// Concurrency protection must be done by caller. // Concurrency protection must be done by caller.
...@@ -256,8 +259,13 @@ VideoRtpSession::stopSender() ...@@ -256,8 +259,13 @@ VideoRtpSession::stopSender()
sender_.reset(); sender_.reset();
} }
if (socketPair_) if (socketPair_) {
bool const isReceivingVideo = receive_.enabled && !receive_.onHold;
if(forceStopSocket || !isReceivingVideo) {
socketPair_->stopSendOp(); socketPair_->stopSendOp();
socketPair_->setReadBlockingMode(false);
}
}
} }
void void
...@@ -316,7 +324,7 @@ VideoRtpSession::startReceiver() ...@@ -316,7 +324,7 @@ VideoRtpSession::startReceiver()
} }
void void
VideoRtpSession::stopReceiver() VideoRtpSession::stopReceiver(bool forceStopSocket)
{ {
// Concurrency protection must be done by caller. // Concurrency protection must be done by caller.
...@@ -338,8 +346,13 @@ VideoRtpSession::stopReceiver() ...@@ -338,8 +346,13 @@ VideoRtpSession::stopReceiver()
// We need to disable the read operation, otherwise the // We need to disable the read operation, otherwise the
// receiver thread will block since the peer stopped sending // receiver thread will block since the peer stopped sending
// RTP packets. // RTP packets.
if (socketPair_) bool const isSendingVideo = send_.enabled && !send_.onHold;
if (socketPair_) {
if (forceStopSocket || !isSendingVideo) {
socketPair_->setReadBlockingMode(false); socketPair_->setReadBlockingMode(false);
socketPair_->stopSendOp();
}
}
auto ms = receiveThread_->getInfo(); auto ms = receiveThread_->getInfo();
if (auto ob = recorder_->getStream(ms.name)) { if (auto ob = recorder_->getStream(ms.name)) {
...@@ -347,6 +360,7 @@ VideoRtpSession::stopReceiver() ...@@ -347,6 +360,7 @@ VideoRtpSession::stopReceiver()
recorder_->removeStream(ms); recorder_->removeStream(ms);
} }
if(forceStopSocket || !isSendingVideo)
receiveThread_->stopLoop(); receiveThread_->stopLoop();
receiveThread_->stopSink(); receiveThread_->stopSink();
} }
...@@ -413,8 +427,8 @@ VideoRtpSession::stop() ...@@ -413,8 +427,8 @@ VideoRtpSession::stop()
{ {
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
stopSender(); stopSender(true);
stopReceiver(); stopReceiver(true);
if (socketPair_) if (socketPair_)
socketPair_->interrupt(); socketPair_->interrupt();
......
...@@ -117,9 +117,9 @@ private: ...@@ -117,9 +117,9 @@ private:
void setupConferenceVideoPipeline(Conference& conference, Direction dir); void setupConferenceVideoPipeline(Conference& conference, Direction dir);
void setupVideoPipeline(); void setupVideoPipeline();
void startSender(); void startSender();
void stopSender(); void stopSender(bool forceStopSocket = false);
void startReceiver(); void startReceiver();
void stopReceiver(); void stopReceiver(bool forceStopSocket = false);
using clock = std::chrono::steady_clock; using clock = std::chrono::steady_clock;
using time_point = clock::time_point; using time_point = clock::time_point;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment