From 54179722e5628835f389664d498cf8cb1444ca9e Mon Sep 17 00:00:00 2001 From: dijunkun Date: Tue, 30 Jul 2024 17:31:44 +0800 Subject: [PATCH] [feat] add callback to notify the travsesal mode --- src/ice/ice_agent.cpp | 4 +--- src/interface/x.h | 6 ++++-- src/pc/peer_connection.cpp | 14 ++++++++++++++ src/pc/peer_connection.h | 9 +++++++-- src/transmission/ice_transmission.cpp | 18 ++++++++++++++++++ src/transmission/ice_transmission.h | 13 +++++++++++++ 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/ice/ice_agent.cpp b/src/ice/ice_agent.cpp index 147f484..d03dcdd 100644 --- a/src/ice/ice_agent.cpp +++ b/src/ice/ice_agent.cpp @@ -83,9 +83,7 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed, turn_username_.c_str(), turn_password_.c_str(), NICE_RELAY_TYPE_TURN_UDP); - // g_object_set(agent_, "ice-tcp", false, "ice-udp", true, "force-relay", - // true, - // NULL); + // g_object_set(agent_, "force-relay", true, NULL); nice_agent_attach_recv(agent_, stream_id_, NICE_COMPONENT_TYPE_RTP, g_main_loop_get_context(gloop_), on_recv_, diff --git a/src/interface/x.h b/src/interface/x.h index 5017a6b..c2dc0f1 100644 --- a/src/interface/x.h +++ b/src/interface/x.h @@ -31,6 +31,8 @@ enum SignalStatus { SignalReconnecting }; +enum TraversalMode { P2P = 0, Relay }; + #ifdef __cplusplus extern "C" { #endif @@ -44,8 +46,8 @@ typedef void (*OnSignalStatus)(SignalStatus, void*); typedef void (*OnConnectionStatus)(ConnectionStatus, void*); -typedef void (*NetStatusReport)(const unsigned short, const unsigned short, - void*); +typedef void (*NetStatusReport)(TraversalMode mode, const unsigned short, + const unsigned short, void*); typedef struct { bool use_cfg_file; diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 486b46b..c044bc3 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -96,6 +96,7 @@ int PeerConnection::Init(PeerConnectionParams params, on_receive_data_buffer_ = params.on_receive_data_buffer; on_signal_status_ = params.on_signal_status; on_connection_status_ = params.on_connection_status; + net_status_report_ = params.net_status_report; user_data_ = params.user_data; on_receive_ws_msg_ = [this](const std::string &msg) { ProcessSignal(msg); }; @@ -170,6 +171,14 @@ int PeerConnection::Init(PeerConnectionParams params, } }; + on_net_status_report_ = [this](IceTransmission::TraversalType mode, + const unsigned short send, + const unsigned short receive, void *user_ptr) { + if (net_status_report_) { + net_status_report_(TraversalMode(mode), send, receive, user_ptr); + } + }; + ws_transport_ = std::make_shared(on_receive_ws_msg_, on_ws_status_); uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_; @@ -435,6 +444,8 @@ void PeerConnection::ProcessSignal(const std::string &signal) { on_receive_audio_); ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc( on_receive_data_); + ice_transmission_list_[remote_user_id] + ->SetOnReceiveNetStatusReportFunc(on_net_status_report_); ice_transmission_list_[remote_user_id]->InitIceTransmission( cfg_stun_server_ip_, stun_server_port_, cfg_turn_server_ip_, @@ -486,6 +497,9 @@ void PeerConnection::ProcessSignal(const std::string &signal) { on_receive_audio_); ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc( on_receive_data_); + ice_transmission_list_[remote_user_id]->SetOnReceiveNetStatusReportFunc( + on_net_status_report_); + ice_transmission_list_[remote_user_id]->InitIceTransmission( cfg_stun_server_ip_, stun_server_port_, cfg_turn_server_ip_, turn_server_port_, cfg_turn_server_username_, diff --git a/src/pc/peer_connection.h b/src/pc/peer_connection.h index 3e32eb8..94e35e1 100644 --- a/src/pc/peer_connection.h +++ b/src/pc/peer_connection.h @@ -20,8 +20,8 @@ typedef void (*OnSignalStatus)(SignalStatus status, void *); typedef void (*OnConnectionStatus)(ConnectionStatus status, void *); -typedef void (*NetStatusReport)(const unsigned short, const unsigned short, - void *); +typedef void (*NetStatusReport)(TraversalMode mode, const unsigned short, + const unsigned short, void *); typedef struct { bool use_cfg_file; @@ -98,6 +98,7 @@ class PeerConnection { bool hardware_acceleration_ = false; bool av1_encoding_ = false; bool trickle_ice_ = true; + TraversalMode mode_ = TraversalMode::P2P; private: std::shared_ptr ws_transport_ = nullptr; @@ -122,6 +123,9 @@ class PeerConnection { std::function on_receive_data_ = nullptr; std::function on_ice_status_change_ = nullptr; + std::function + on_net_status_report_ = nullptr; bool ice_ready_ = false; OnReceiveBuffer on_receive_video_buffer_; @@ -129,6 +133,7 @@ class PeerConnection { OnReceiveBuffer on_receive_data_buffer_; OnSignalStatus on_signal_status_; OnConnectionStatus on_connection_status_; + NetStatusReport net_status_report_; void *user_data_; char *nv12_data_ = nullptr; diff --git a/src/transmission/ice_transmission.cpp b/src/transmission/ice_transmission.cpp index 634ed94..f4bea8c 100644 --- a/src/transmission/ice_transmission.cpp +++ b/src/transmission/ice_transmission.cpp @@ -222,6 +222,24 @@ int IceTransmission::InitIceTransmission( [](NiceAgent *agent, guint stream_id, guint component_id, const char *lfoundation, const char *rfoundation, gpointer user_ptr) { LOG_INFO("new selected pair: [{}] [{}]", lfoundation, rfoundation); + NiceCandidate *local = nullptr; + NiceCandidate *remote = nullptr; + nice_agent_get_selected_pair(agent, stream_id, component_id, &local, + &remote); + if (user_ptr) { + IceTransmission *ice_transmission_obj = + static_cast(user_ptr); + if (local->type == NICE_CANDIDATE_TYPE_RELAYED && + remote->type == NICE_CANDIDATE_TYPE_RELAYED) { + LOG_INFO("Traversal using relay server"); + ice_transmission_obj->traversal_type_ = TraversalType::TRelay; + } else { + LOG_INFO("Traversal using p2p"); + ice_transmission_obj->traversal_type_ = TraversalType::TP2P; + } + ice_transmission_obj->on_receive_net_status_report_( + ice_transmission_obj->traversal_type_, 0, 0, nullptr); + } }, [](NiceAgent *agent, guint stream_id, guint component_id, guint size, gchar *buffer, gpointer user_ptr) { diff --git a/src/transmission/ice_transmission.h b/src/transmission/ice_transmission.h index c301101..6cdcf0a 100644 --- a/src/transmission/ice_transmission.h +++ b/src/transmission/ice_transmission.h @@ -31,6 +31,8 @@ class IceTransmission { kVideoFrameDelta = 4, }; + enum TraversalType { TP2P = 0, TRelay = 1 }; + public: IceTransmission(bool trickle_ice, bool offer_peer, std::string &transmission_id, std::string &user_id, @@ -66,6 +68,13 @@ class IceTransmission { on_receive_data_ = on_receive_data; } + void SetOnReceiveNetStatusReportFunc( + std::function + on_receive_net_status_report) { + on_receive_net_status_report_ = on_receive_net_status_report; + } + int JoinTransmission(); int SetTransmissionId(const std::string &transmission_id); @@ -109,6 +118,7 @@ class IceTransmission { std::string remote_user_id_; std::string remote_ice_username_ = ""; NiceComponentState state_ = NICE_COMPONENT_STATE_DISCONNECTED; + TraversalType traversal_type_ = TraversalType::TP2P; private: std::unique_ptr ice_agent_ = nullptr; @@ -121,6 +131,9 @@ class IceTransmission { std::function on_receive_data_ = nullptr; std::function on_ice_status_change_ = nullptr; + std::function + on_receive_net_status_report_ = nullptr; private: std::unique_ptr video_rtp_codec_ = nullptr;