mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
[feat] enable to save ice io stream into local files
This commit is contained in:
@@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
#define SAVE_IO_STREAM
|
||||||
|
|
||||||
IceAgent::IceAgent(bool offer_peer, bool use_trickle_ice, bool use_reliable_ice,
|
IceAgent::IceAgent(bool offer_peer, bool use_trickle_ice, bool use_reliable_ice,
|
||||||
bool enable_turn, bool force_turn, std::string &stun_ip,
|
bool enable_turn, bool force_turn, std::string &stun_ip,
|
||||||
uint16_t stun_port, std::string &turn_ip, uint16_t turn_port,
|
uint16_t stun_port, std::string &turn_ip, uint16_t turn_port,
|
||||||
@@ -30,6 +32,20 @@ IceAgent::~IceAgent() {
|
|||||||
g_object_unref(agent_);
|
g_object_unref(agent_);
|
||||||
g_free(ice_ufrag_);
|
g_free(ice_ufrag_);
|
||||||
g_free(ice_password_);
|
g_free(ice_password_);
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
if (file_in_) {
|
||||||
|
fflush(file_in_);
|
||||||
|
fclose(file_in_);
|
||||||
|
file_in_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_out_) {
|
||||||
|
fflush(file_out_);
|
||||||
|
fclose(file_out_);
|
||||||
|
file_out_ = nullptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
||||||
@@ -44,7 +60,13 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
|
|
||||||
on_gathering_done_ = on_gathering_done;
|
on_gathering_done_ = on_gathering_done;
|
||||||
on_recv_ = on_recv;
|
on_recv_ = on_recv;
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
user_prt_st_.user_ptr_1_ = this;
|
||||||
|
user_prt_st_.user_ptr_2_ = user_ptr;
|
||||||
|
#else
|
||||||
user_ptr_ = user_ptr;
|
user_ptr_ = user_ptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
g_networking_init();
|
g_networking_init();
|
||||||
|
|
||||||
@@ -75,6 +97,17 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
g_object_set(agent_, "stun-server-port", stun_port_, nullptr);
|
g_object_set(agent_, "stun-server-port", stun_port_, nullptr);
|
||||||
g_object_set(agent_, "controlling-mode", controlling_, nullptr);
|
g_object_set(agent_, "controlling-mode", controlling_, nullptr);
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
g_signal_connect(agent_, "candidate-gathering-done",
|
||||||
|
G_CALLBACK(on_gathering_done_), user_prt_st_.user_ptr_2_);
|
||||||
|
g_signal_connect(agent_, "new-selected-pair",
|
||||||
|
G_CALLBACK(on_new_selected_pair_),
|
||||||
|
user_prt_st_.user_ptr_2_);
|
||||||
|
g_signal_connect(agent_, "new-candidate", G_CALLBACK(on_new_candidate_),
|
||||||
|
user_prt_st_.user_ptr_2_);
|
||||||
|
g_signal_connect(agent_, "component-state-changed",
|
||||||
|
G_CALLBACK(on_state_changed_), user_prt_st_.user_ptr_2_);
|
||||||
|
#else
|
||||||
g_signal_connect(agent_, "candidate-gathering-done",
|
g_signal_connect(agent_, "candidate-gathering-done",
|
||||||
G_CALLBACK(on_gathering_done_), user_ptr_);
|
G_CALLBACK(on_gathering_done_), user_ptr_);
|
||||||
g_signal_connect(agent_, "new-selected-pair",
|
g_signal_connect(agent_, "new-selected-pair",
|
||||||
@@ -83,6 +116,7 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
user_ptr_);
|
user_ptr_);
|
||||||
g_signal_connect(agent_, "component-state-changed",
|
g_signal_connect(agent_, "component-state-changed",
|
||||||
G_CALLBACK(on_state_changed_), user_ptr_);
|
G_CALLBACK(on_state_changed_), user_ptr_);
|
||||||
|
#endif
|
||||||
|
|
||||||
stream_id_ = nice_agent_add_stream(agent_, n_components_);
|
stream_id_ = nice_agent_add_stream(agent_, n_components_);
|
||||||
if (stream_id_ == 0) {
|
if (stream_id_ == 0) {
|
||||||
@@ -104,9 +138,26 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
g_object_set(agent_, "force-relay", true, NULL);
|
g_object_set(agent_, "force-relay", true, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
nice_agent_attach_recv(
|
||||||
|
agent_, stream_id_, NICE_COMPONENT_TYPE_RTP,
|
||||||
|
g_main_loop_get_context(gloop_),
|
||||||
|
[](NiceAgent *agent, guint stream_id, guint component_id, guint size,
|
||||||
|
gchar *buffer, gpointer data) -> void {
|
||||||
|
if (data) {
|
||||||
|
UserPtrSt *user_prt_st = (UserPtrSt *)data;
|
||||||
|
IceAgent *ice_agent = (IceAgent *)(user_prt_st->user_ptr_1_);
|
||||||
|
ice_agent->on_recv_(agent, stream_id, component_id, size, buffer,
|
||||||
|
user_prt_st->user_ptr_2_);
|
||||||
|
fwrite(buffer, 1, size, ice_agent->file_in_);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(void *)&user_prt_st_);
|
||||||
|
#else
|
||||||
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_,
|
||||||
user_ptr_);
|
user_ptr_);
|
||||||
|
#endif
|
||||||
|
|
||||||
nice_inited_ = true;
|
nice_inited_ = true;
|
||||||
g_main_loop_run(gloop_);
|
g_main_loop_run(gloop_);
|
||||||
@@ -117,6 +168,23 @@ int IceAgent::CreateIceAgent(nice_cb_state_changed_t on_state_changed,
|
|||||||
g_usleep(1000);
|
g_usleep(1000);
|
||||||
} while (!nice_inited_);
|
} while (!nice_inited_);
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
std::string in_file_name =
|
||||||
|
"ice_in_" + std::to_string(reinterpret_cast<std::uintptr_t>(this)) +
|
||||||
|
".rtp";
|
||||||
|
std::string out_file_name =
|
||||||
|
"ice_out_" + std::to_string(reinterpret_cast<std::uintptr_t>(this)) +
|
||||||
|
".rtp";
|
||||||
|
file_in_ = fopen(in_file_name.c_str(), "w+b");
|
||||||
|
if (!file_in_) {
|
||||||
|
LOG_WARN("Fail to open ice_in.rtp");
|
||||||
|
}
|
||||||
|
file_out_ = fopen(out_file_name.c_str(), "w+b");
|
||||||
|
if (!file_in_) {
|
||||||
|
LOG_WARN("Fail to open ice_out.rtp");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
LOG_INFO("Nice agent init finish");
|
LOG_INFO("Nice agent init finish");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -317,5 +385,10 @@ int IceAgent::Send(const char *data, size_t size) {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
int ret = nice_agent_send(agent_, stream_id_, 1, size, data);
|
int ret = nice_agent_send(agent_, stream_id_, 1, size, data);
|
||||||
|
|
||||||
|
#ifdef SAVE_IO_STREAM
|
||||||
|
fwrite(data, 1, size, file_out_);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,11 @@ typedef void (*nice_cb_recv_t)(NiceAgent* agent, guint stream_id,
|
|||||||
guint component_id, guint size, gchar* buffer,
|
guint component_id, guint size, gchar* buffer,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void* user_ptr_1_;
|
||||||
|
void* user_ptr_2_;
|
||||||
|
} UserPtrSt;
|
||||||
|
|
||||||
class IceAgent {
|
class IceAgent {
|
||||||
public:
|
public:
|
||||||
IceAgent(bool offer_peer, bool use_trickle_ice, bool use_reliable_ice,
|
IceAgent(bool offer_peer, bool use_trickle_ice, bool use_reliable_ice,
|
||||||
@@ -104,6 +109,11 @@ class IceAgent {
|
|||||||
nice_cb_gathering_done_t on_gathering_done_;
|
nice_cb_gathering_done_t on_gathering_done_;
|
||||||
nice_cb_recv_t on_recv_;
|
nice_cb_recv_t on_recv_;
|
||||||
void* user_ptr_;
|
void* user_ptr_;
|
||||||
|
|
||||||
|
UserPtrSt user_prt_st_;
|
||||||
|
|
||||||
|
FILE* file_in_ = nullptr;
|
||||||
|
FILE* file_out_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user