mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
[feat] add callback to notify the travsesal mode
This commit is contained in:
@@ -83,9 +83,7 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
turn_username_.c_str(), turn_password_.c_str(),
|
turn_username_.c_str(), turn_password_.c_str(),
|
||||||
NICE_RELAY_TYPE_TURN_UDP);
|
NICE_RELAY_TYPE_TURN_UDP);
|
||||||
|
|
||||||
// g_object_set(agent_, "ice-tcp", false, "ice-udp", true, "force-relay",
|
// g_object_set(agent_, "force-relay", true, NULL);
|
||||||
// true,
|
|
||||||
// NULL);
|
|
||||||
|
|
||||||
nice_agent_attach_recv(agent_, stream_id_, NICE_COMPONENT_TYPE_RTP,
|
nice_agent_attach_recv(agent_, stream_id_, NICE_COMPONENT_TYPE_RTP,
|
||||||
g_main_loop_get_context(gloop_), on_recv_,
|
g_main_loop_get_context(gloop_), on_recv_,
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ enum SignalStatus {
|
|||||||
SignalReconnecting
|
SignalReconnecting
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum TraversalMode { P2P = 0, Relay };
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -44,8 +46,8 @@ typedef void (*OnSignalStatus)(SignalStatus, void*);
|
|||||||
|
|
||||||
typedef void (*OnConnectionStatus)(ConnectionStatus, void*);
|
typedef void (*OnConnectionStatus)(ConnectionStatus, void*);
|
||||||
|
|
||||||
typedef void (*NetStatusReport)(const unsigned short, const unsigned short,
|
typedef void (*NetStatusReport)(TraversalMode mode, const unsigned short,
|
||||||
void*);
|
const unsigned short, void*);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool use_cfg_file;
|
bool use_cfg_file;
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ int PeerConnection::Init(PeerConnectionParams params,
|
|||||||
on_receive_data_buffer_ = params.on_receive_data_buffer;
|
on_receive_data_buffer_ = params.on_receive_data_buffer;
|
||||||
on_signal_status_ = params.on_signal_status;
|
on_signal_status_ = params.on_signal_status;
|
||||||
on_connection_status_ = params.on_connection_status;
|
on_connection_status_ = params.on_connection_status;
|
||||||
|
net_status_report_ = params.net_status_report;
|
||||||
user_data_ = params.user_data;
|
user_data_ = params.user_data;
|
||||||
|
|
||||||
on_receive_ws_msg_ = [this](const std::string &msg) { ProcessSignal(msg); };
|
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_ =
|
ws_transport_ =
|
||||||
std::make_shared<WsTransmission>(on_receive_ws_msg_, on_ws_status_);
|
std::make_shared<WsTransmission>(on_receive_ws_msg_, on_ws_status_);
|
||||||
uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_;
|
uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_;
|
||||||
@@ -435,6 +444,8 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
|||||||
on_receive_audio_);
|
on_receive_audio_);
|
||||||
ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc(
|
ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc(
|
||||||
on_receive_data_);
|
on_receive_data_);
|
||||||
|
ice_transmission_list_[remote_user_id]
|
||||||
|
->SetOnReceiveNetStatusReportFunc(on_net_status_report_);
|
||||||
|
|
||||||
ice_transmission_list_[remote_user_id]->InitIceTransmission(
|
ice_transmission_list_[remote_user_id]->InitIceTransmission(
|
||||||
cfg_stun_server_ip_, stun_server_port_, cfg_turn_server_ip_,
|
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_);
|
on_receive_audio_);
|
||||||
ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc(
|
ice_transmission_list_[remote_user_id]->SetOnReceiveDataFunc(
|
||||||
on_receive_data_);
|
on_receive_data_);
|
||||||
|
ice_transmission_list_[remote_user_id]->SetOnReceiveNetStatusReportFunc(
|
||||||
|
on_net_status_report_);
|
||||||
|
|
||||||
ice_transmission_list_[remote_user_id]->InitIceTransmission(
|
ice_transmission_list_[remote_user_id]->InitIceTransmission(
|
||||||
cfg_stun_server_ip_, stun_server_port_, cfg_turn_server_ip_,
|
cfg_stun_server_ip_, stun_server_port_, cfg_turn_server_ip_,
|
||||||
turn_server_port_, cfg_turn_server_username_,
|
turn_server_port_, cfg_turn_server_username_,
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ typedef void (*OnSignalStatus)(SignalStatus status, void *);
|
|||||||
|
|
||||||
typedef void (*OnConnectionStatus)(ConnectionStatus status, void *);
|
typedef void (*OnConnectionStatus)(ConnectionStatus status, void *);
|
||||||
|
|
||||||
typedef void (*NetStatusReport)(const unsigned short, const unsigned short,
|
typedef void (*NetStatusReport)(TraversalMode mode, const unsigned short,
|
||||||
void *);
|
const unsigned short, void *);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool use_cfg_file;
|
bool use_cfg_file;
|
||||||
@@ -98,6 +98,7 @@ class PeerConnection {
|
|||||||
bool hardware_acceleration_ = false;
|
bool hardware_acceleration_ = false;
|
||||||
bool av1_encoding_ = false;
|
bool av1_encoding_ = false;
|
||||||
bool trickle_ice_ = true;
|
bool trickle_ice_ = true;
|
||||||
|
TraversalMode mode_ = TraversalMode::P2P;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<WsTransmission> ws_transport_ = nullptr;
|
std::shared_ptr<WsTransmission> ws_transport_ = nullptr;
|
||||||
@@ -122,6 +123,9 @@ class PeerConnection {
|
|||||||
std::function<void(const char *, size_t, const char *, size_t)>
|
std::function<void(const char *, size_t, const char *, size_t)>
|
||||||
on_receive_data_ = nullptr;
|
on_receive_data_ = nullptr;
|
||||||
std::function<void(std::string)> on_ice_status_change_ = nullptr;
|
std::function<void(std::string)> on_ice_status_change_ = nullptr;
|
||||||
|
std::function<void(IceTransmission::TraversalType, const unsigned short,
|
||||||
|
const unsigned short, void *)>
|
||||||
|
on_net_status_report_ = nullptr;
|
||||||
bool ice_ready_ = false;
|
bool ice_ready_ = false;
|
||||||
|
|
||||||
OnReceiveBuffer on_receive_video_buffer_;
|
OnReceiveBuffer on_receive_video_buffer_;
|
||||||
@@ -129,6 +133,7 @@ class PeerConnection {
|
|||||||
OnReceiveBuffer on_receive_data_buffer_;
|
OnReceiveBuffer on_receive_data_buffer_;
|
||||||
OnSignalStatus on_signal_status_;
|
OnSignalStatus on_signal_status_;
|
||||||
OnConnectionStatus on_connection_status_;
|
OnConnectionStatus on_connection_status_;
|
||||||
|
NetStatusReport net_status_report_;
|
||||||
void *user_data_;
|
void *user_data_;
|
||||||
|
|
||||||
char *nv12_data_ = nullptr;
|
char *nv12_data_ = nullptr;
|
||||||
|
|||||||
@@ -222,6 +222,24 @@ int IceTransmission::InitIceTransmission(
|
|||||||
[](NiceAgent *agent, guint stream_id, guint component_id,
|
[](NiceAgent *agent, guint stream_id, guint component_id,
|
||||||
const char *lfoundation, const char *rfoundation, gpointer user_ptr) {
|
const char *lfoundation, const char *rfoundation, gpointer user_ptr) {
|
||||||
LOG_INFO("new selected pair: [{}] [{}]", lfoundation, rfoundation);
|
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<IceTransmission *>(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,
|
[](NiceAgent *agent, guint stream_id, guint component_id, guint size,
|
||||||
gchar *buffer, gpointer user_ptr) {
|
gchar *buffer, gpointer user_ptr) {
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ class IceTransmission {
|
|||||||
kVideoFrameDelta = 4,
|
kVideoFrameDelta = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum TraversalType { TP2P = 0, TRelay = 1 };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IceTransmission(bool trickle_ice, bool offer_peer,
|
IceTransmission(bool trickle_ice, bool offer_peer,
|
||||||
std::string &transmission_id, std::string &user_id,
|
std::string &transmission_id, std::string &user_id,
|
||||||
@@ -66,6 +68,13 @@ class IceTransmission {
|
|||||||
on_receive_data_ = on_receive_data;
|
on_receive_data_ = on_receive_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetOnReceiveNetStatusReportFunc(
|
||||||
|
std::function<void(TraversalType, const unsigned short,
|
||||||
|
const unsigned short, void *)>
|
||||||
|
on_receive_net_status_report) {
|
||||||
|
on_receive_net_status_report_ = on_receive_net_status_report;
|
||||||
|
}
|
||||||
|
|
||||||
int JoinTransmission();
|
int JoinTransmission();
|
||||||
|
|
||||||
int SetTransmissionId(const std::string &transmission_id);
|
int SetTransmissionId(const std::string &transmission_id);
|
||||||
@@ -109,6 +118,7 @@ class IceTransmission {
|
|||||||
std::string remote_user_id_;
|
std::string remote_user_id_;
|
||||||
std::string remote_ice_username_ = "";
|
std::string remote_ice_username_ = "";
|
||||||
NiceComponentState state_ = NICE_COMPONENT_STATE_DISCONNECTED;
|
NiceComponentState state_ = NICE_COMPONENT_STATE_DISCONNECTED;
|
||||||
|
TraversalType traversal_type_ = TraversalType::TP2P;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<IceAgent> ice_agent_ = nullptr;
|
std::unique_ptr<IceAgent> ice_agent_ = nullptr;
|
||||||
@@ -121,6 +131,9 @@ class IceTransmission {
|
|||||||
std::function<void(const char *, size_t, const char *, size_t)>
|
std::function<void(const char *, size_t, const char *, size_t)>
|
||||||
on_receive_data_ = nullptr;
|
on_receive_data_ = nullptr;
|
||||||
std::function<void(std::string)> on_ice_status_change_ = nullptr;
|
std::function<void(std::string)> on_ice_status_change_ = nullptr;
|
||||||
|
std::function<void(TraversalType, const unsigned short, const unsigned short,
|
||||||
|
void *)>
|
||||||
|
on_receive_net_status_report_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<RtpCodec> video_rtp_codec_ = nullptr;
|
std::unique_ptr<RtpCodec> video_rtp_codec_ = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user