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;