mirror of
				https://github.com/kunkundi/crossdesk.git
				synced 2025-10-26 20:25:34 +08:00 
			
		
		
		
	[fix] fix crash due to rtp receivers destroy
This commit is contained in:
		| @@ -6,10 +6,12 @@ | ||||
|  | ||||
| #define RTCP_SR_INTERVAL 1000 | ||||
|  | ||||
| RtpAudioSender::RtpAudioSender() {} | ||||
| RtpAudioSender::RtpAudioSender() { SetPeriod(std::chrono::milliseconds(5)); } | ||||
|  | ||||
| RtpAudioSender::RtpAudioSender(std::shared_ptr<IOStatistics> io_statistics) | ||||
|     : io_statistics_(io_statistics) {} | ||||
|     : io_statistics_(io_statistics) { | ||||
|   SetPeriod(std::chrono::milliseconds(5)); | ||||
| } | ||||
|  | ||||
| RtpAudioSender::~RtpAudioSender() { | ||||
|   if (rtp_statistics_) { | ||||
| @@ -140,6 +142,5 @@ bool RtpAudioSender::Process() { | ||||
|     rtp_statistics_->UpdateSentBytes(last_send_bytes_); | ||||
|   } | ||||
|  | ||||
|   std::this_thread::sleep_for(std::chrono::milliseconds(5)); | ||||
|   return true; | ||||
| } | ||||
| @@ -9,7 +9,9 @@ | ||||
| RtpDataSender::RtpDataSender() {} | ||||
|  | ||||
| RtpDataSender::RtpDataSender(std::shared_ptr<IOStatistics> io_statistics) | ||||
|     : io_statistics_(io_statistics) {} | ||||
|     : io_statistics_(io_statistics) { | ||||
|   SetPeriod(std::chrono::milliseconds(5)); | ||||
| } | ||||
|  | ||||
| RtpDataSender::~RtpDataSender() { | ||||
|   if (rtp_statistics_) { | ||||
| @@ -140,6 +142,5 @@ bool RtpDataSender::Process() { | ||||
|     rtp_statistics_->UpdateSentBytes(last_send_bytes_); | ||||
|   } | ||||
|  | ||||
|   std::this_thread::sleep_for(std::chrono::milliseconds(5)); | ||||
|   return true; | ||||
| } | ||||
| @@ -20,7 +20,10 @@ RtpVideoReceiver::RtpVideoReceiver() | ||||
|           [this](int64_t bitrate_bps, std::vector<uint32_t> ssrcs) { | ||||
|             SendRemb(bitrate_bps, ssrcs); | ||||
|           }), | ||||
|       clock_(Clock::GetRealTimeClockShared()) {} | ||||
|       clock_(Clock::GetRealTimeClockShared()) { | ||||
|   SetPeriod(std::chrono::milliseconds(5)); | ||||
|   // rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this); | ||||
| } | ||||
|  | ||||
| RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<IOStatistics> io_statistics) | ||||
|     : io_statistics_(io_statistics), | ||||
| @@ -34,7 +37,8 @@ RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<IOStatistics> io_statistics) | ||||
|             SendRemb(bitrate_bps, ssrcs); | ||||
|           }), | ||||
|       clock_(Clock::GetRealTimeClockShared()) { | ||||
|   rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this); | ||||
|   SetPeriod(std::chrono::milliseconds(5)); | ||||
|   // rtcp_thread_ = std::thread(&RtpVideoReceiver::RtcpThread, this); | ||||
|  | ||||
| #ifdef SAVE_RTP_RECV_STREAM | ||||
|   file_rtp_recv_ = fopen("rtp_recv_stream.h264", "w+b"); | ||||
| @@ -45,19 +49,18 @@ RtpVideoReceiver::RtpVideoReceiver(std::shared_ptr<IOStatistics> io_statistics) | ||||
| } | ||||
|  | ||||
| RtpVideoReceiver::~RtpVideoReceiver() { | ||||
|   if (rtp_statistics_) { | ||||
|     rtp_statistics_->Stop(); | ||||
|   } | ||||
|  | ||||
|   rtcp_stop_.store(true); | ||||
|   rtcp_cv_.notify_one(); | ||||
|  | ||||
|   rtcp_cv_.notify_all(); | ||||
|   if (rtcp_thread_.joinable()) { | ||||
|     rtcp_thread_.join(); | ||||
|   } | ||||
|  | ||||
|   SSRCManager::Instance().DeleteSsrc(feedback_ssrc_); | ||||
|  | ||||
|   if (rtp_statistics_) { | ||||
|     rtp_statistics_->Stop(); | ||||
|   } | ||||
|  | ||||
| #ifdef SAVE_RTP_RECV_STREAM | ||||
|   if (file_rtp_recv_) { | ||||
|     fflush(file_rtp_recv_); | ||||
| @@ -469,12 +472,11 @@ bool RtpVideoReceiver::Process() { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   std::this_thread::sleep_for(std::chrono::milliseconds(5)); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| void RtpVideoReceiver::RtcpThread() { | ||||
|   while (!rtcp_stop_) { | ||||
|   while (!rtcp_stop_.load()) { | ||||
|     std::unique_lock<std::mutex> lock(rtcp_mtx_); | ||||
|     if (rtcp_cv_.wait_for( | ||||
|             lock, std::chrono::milliseconds(rtcp_tcc_interval_ms_), | ||||
|   | ||||
| @@ -12,6 +12,7 @@ RtpVideoSender::RtpVideoSender() {} | ||||
|  | ||||
| RtpVideoSender::RtpVideoSender(std::shared_ptr<IOStatistics> io_statistics) | ||||
|     : io_statistics_(io_statistics) { | ||||
|   SetPeriod(std::chrono::milliseconds(5)); | ||||
| #ifdef SAVE_RTP_SENT_STREAM | ||||
|   file_rtp_sent_ = fopen("rtp_sent_stream.h264", "w+b"); | ||||
|   if (!file_rtp_sent_) { | ||||
| @@ -162,6 +163,5 @@ bool RtpVideoSender::Process() { | ||||
|     rtp_statistics_->UpdateSentBytes(last_send_bytes_); | ||||
|   } | ||||
|  | ||||
|   std::this_thread::sleep_for(std::chrono::milliseconds(5)); | ||||
|   return true; | ||||
| } | ||||
| @@ -44,7 +44,11 @@ void VideoChannelReceive::Initialize(rtp::PAYLOAD_TYPE payload_type) { | ||||
|   rtp_video_receiver_->Start(); | ||||
| } | ||||
|  | ||||
| void VideoChannelReceive::Destroy() {} | ||||
| void VideoChannelReceive::Destroy() { | ||||
|   if (rtp_video_receiver_) { | ||||
|     rtp_video_receiver_->Stop(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| int VideoChannelReceive::OnReceiveRtpPacket(const char *data, size_t size) { | ||||
|   if (ice_io_statistics_) { | ||||
|   | ||||
| @@ -2,23 +2,34 @@ | ||||
|  | ||||
| #include "log.h" | ||||
|  | ||||
| ThreadBase::ThreadBase() {} | ||||
| ThreadBase::ThreadBase() | ||||
|     : running_(false), pause_(false), period_(std::chrono::milliseconds(100)) {} | ||||
|  | ||||
| ThreadBase::~ThreadBase() { | ||||
|   if (!stop_) { | ||||
|     Stop(); | ||||
|   } | ||||
| } | ||||
| ThreadBase::~ThreadBase() { Stop(); } | ||||
|  | ||||
| void ThreadBase::Start() { | ||||
|   { | ||||
|     std::lock_guard<std::mutex> lock(cv_mtx_); | ||||
|     if (running_) { | ||||
|       return;  // Already running | ||||
|     } | ||||
|     running_ = true; | ||||
|   } | ||||
|  | ||||
|   std::thread t(&ThreadBase::Run, this); | ||||
|   thread_ = std::move(t); | ||||
|   stop_ = false; | ||||
| } | ||||
|  | ||||
| void ThreadBase::Stop() { | ||||
|   { | ||||
|     std::lock_guard<std::mutex> lock(cv_mtx_); | ||||
|     if (!running_) { | ||||
|       return;  // Already stopped | ||||
|     } | ||||
|     running_ = false; | ||||
|   } | ||||
|   cv_.notify_all(); | ||||
|   if (thread_.joinable()) { | ||||
|     stop_ = true; | ||||
|     thread_.join(); | ||||
|   } | ||||
| } | ||||
| @@ -27,7 +38,17 @@ void ThreadBase::Pause() { pause_ = true; } | ||||
|  | ||||
| void ThreadBase::Resume() { pause_ = false; } | ||||
|  | ||||
| void ThreadBase::SetPeriod(std::chrono::milliseconds period) { | ||||
|   std::lock_guard<std::mutex> lock(cv_mtx_); | ||||
|   period_ = period; | ||||
| } | ||||
|  | ||||
| void ThreadBase::Run() { | ||||
|   while (!stop_ && Process()) { | ||||
|   while (running_) { | ||||
|     std::unique_lock<std::mutex> lock(cv_mtx_); | ||||
|     cv_.wait_for(lock, period_, [this] { return !running_; }); | ||||
|     if (running_) { | ||||
|       Process(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -2,6 +2,9 @@ | ||||
| #define _THREAD_BASE_H_ | ||||
|  | ||||
| #include <atomic> | ||||
| #include <chrono> | ||||
| #include <condition_variable> | ||||
| #include <mutex> | ||||
| #include <thread> | ||||
|  | ||||
| class ThreadBase { | ||||
| @@ -16,6 +19,8 @@ class ThreadBase { | ||||
|   void Pause(); | ||||
|   void Resume(); | ||||
|  | ||||
|   void SetPeriod(std::chrono::milliseconds period); | ||||
|  | ||||
|   virtual bool Process() = 0; | ||||
|  | ||||
|  private: | ||||
| @@ -23,9 +28,13 @@ class ThreadBase { | ||||
|  | ||||
|  private: | ||||
|   std::thread thread_; | ||||
|   std::chrono::milliseconds period_; | ||||
|  | ||||
|   std::atomic<bool> stop_{false}; | ||||
|   std::atomic<bool> pause_{false}; | ||||
|   std::condition_variable cv_; | ||||
|   std::mutex cv_mtx_; | ||||
|  | ||||
|   std::atomic<bool> running_; | ||||
|   std::atomic<bool> pause_; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| @@ -423,20 +423,28 @@ int IceTransport::DestroyIceTransmission() { | ||||
|     ice_io_statistics_->Stop(); | ||||
|   } | ||||
|  | ||||
|   if (rtp_video_receiver_) { | ||||
|     rtp_video_receiver_->Stop(); | ||||
|   if (video_channel_send_) { | ||||
|     video_channel_send_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   if (rtp_video_sender_) { | ||||
|     rtp_video_sender_->Stop(); | ||||
|   if (audio_channel_send_) { | ||||
|     audio_channel_send_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   if (rtp_audio_sender_) { | ||||
|     rtp_audio_sender_->Stop(); | ||||
|   if (data_channel_send_) { | ||||
|     data_channel_send_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   if (rtp_data_sender_) { | ||||
|     rtp_data_sender_->Stop(); | ||||
|   if (video_channel_receive_) { | ||||
|     video_channel_receive_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   if (audio_channel_receive_) { | ||||
|     audio_channel_receive_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   if (data_channel_receive_) { | ||||
|     data_channel_receive_->Destroy(); | ||||
|   } | ||||
|  | ||||
|   return ice_agent_->DestroyIceAgent(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user