diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 3b5a8c0..6b90649 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -594,7 +594,7 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) { LOG_INFO("]"); for (auto &remote_user_id : user_id_list) { - ice_transport_list_[remote_user_id] = std::make_unique( + ice_transport_list_[remote_user_id] = std::make_shared( true, transmission_id, user_id_, remote_user_id, ws_transport_, on_ice_status_change_, user_data_); @@ -641,7 +641,7 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) { if (ice_transport_list_.end() == ice_transport_list_.find(remote_user_id)) { // Enable TURN for answer peer by default - ice_transport_list_[remote_user_id] = std::make_unique( + ice_transport_list_[remote_user_id] = std::make_shared( false, transmission_id, user_id_, remote_user_id, ws_transport_, on_ice_status_change_, user_data_); diff --git a/src/pc/peer_connection.h b/src/pc/peer_connection.h index ad81bf4..9299a41 100644 --- a/src/pc/peer_connection.h +++ b/src/pc/peer_connection.h @@ -169,7 +169,7 @@ class PeerConnection { std::string sdp_without_cands_ = ""; private: - std::map> ice_transport_list_; + std::map> ice_transport_list_; std::map is_ice_transport_ready_; std::function on_ice_status_change_ = diff --git a/src/transport/ice_transport.cpp b/src/transport/ice_transport.cpp index ba2c38f..2787dc8 100644 --- a/src/transport/ice_transport.cpp +++ b/src/transport/ice_transport.cpp @@ -130,18 +130,29 @@ void IceTransport::InitializeChannels( audio_channel_send_->Initialize(rtp::PAYLOAD_TYPE::OPUS); data_channel_send_->Initialize(rtp::PAYLOAD_TYPE::DATA); + std::weak_ptr weak_self = shared_from_this(); video_channel_receive_ = std::make_unique( ice_agent_, ice_io_statistics_, - [this](VideoFrame &video_frame) { OnReceiveCompleteFrame(video_frame); }); + [this, weak_self](VideoFrame &video_frame) { + if (auto self = weak_self.lock()) { + OnReceiveCompleteFrame(video_frame); + } + }); audio_channel_receive_ = std::make_unique( - ice_agent_, ice_io_statistics_, [this](const char *data, size_t size) { - OnReceiveCompleteAudio(data, size); + ice_agent_, ice_io_statistics_, + [this, weak_self](const char *data, size_t size) { + if (auto self = weak_self.lock()) { + OnReceiveCompleteAudio(data, size); + } }); data_channel_receive_ = std::make_unique( - ice_agent_, ice_io_statistics_, [this](const char *data, size_t size) { - OnReceiveCompleteData(data, size); + ice_agent_, ice_io_statistics_, + [this, weak_self](const char *data, size_t size) { + if (auto self = weak_self.lock()) { + OnReceiveCompleteData(data, size); + } }); video_channel_receive_->Initialize(video_codec_payload_type_); diff --git a/src/transport/ice_transport.h b/src/transport/ice_transport.h index 4680285..7e39580 100644 --- a/src/transport/ice_transport.h +++ b/src/transport/ice_transport.h @@ -33,7 +33,7 @@ #include "video_encoder_factory.h" #include "ws_client.h" -class IceTransport { +class IceTransport : public std::enable_shared_from_this { public: typedef enum { VIDEO = 96, AUDIO = 97, DATA = 127 } DATA_TYPE; typedef enum { H264 = 96, AV1 = 99 } VIDEO_TYPE;