[feat] net traffic stats supported

This commit is contained in:
dijunkun
2024-11-18 17:32:42 +08:00
parent 9d2e6f0c2a
commit c5c85f0785
5 changed files with 72 additions and 31 deletions

View File

@@ -42,10 +42,21 @@ extern "C" {
typedef struct { typedef struct {
const char* data; const char* data;
size_t size; size_t size;
unsigned int width; uint32_t width;
unsigned int height; uint32_t height;
} XVideoFrame; } XVideoFrame;
typedef struct {
uint64_t video_in;
uint64_t video_out;
uint64_t audio_in;
uint64_t audio_out;
uint64_t data_in;
uint64_t data_out;
uint64_t total_in;
uint64_t total_out;
} XNetTrafficStats;
typedef struct Peer PeerPtr; typedef struct Peer PeerPtr;
typedef void (*OnReceiveBuffer)(const char*, size_t, const char*, const size_t, typedef void (*OnReceiveBuffer)(const char*, size_t, const char*, const size_t,
@@ -60,8 +71,7 @@ typedef void (*OnConnectionStatus)(ConnectionStatus, const char*, const size_t,
void*); void*);
typedef void (*NetStatusReport)(const char*, const size_t, TraversalMode, typedef void (*NetStatusReport)(const char*, const size_t, TraversalMode,
const unsigned short, const unsigned short, const XNetTrafficStats*, void*);
void*);
typedef struct { typedef struct {
bool use_cfg_file; bool use_cfg_file;

View File

@@ -234,13 +234,27 @@ int PeerConnection::Init(PeerConnectionParams params,
} }
}; };
on_net_status_report_ = [this](const std::string &user_id, on_net_status_report_ = [this](
IceTransmission::TraversalType mode, const std::string &user_id,
const unsigned short send, IceTransmission::TraversalType mode,
const unsigned short receive, void *user_ptr) { const uint64_t video_in, const uint64_t video_out,
const uint64_t audio_in, const uint64_t audio_out,
const uint64_t data_in, const uint64_t data_out,
const uint64_t total_in, const uint64_t total_out,
void *user_ptr) {
if (net_status_report_) { if (net_status_report_) {
XNetTrafficStats net_traffic_stats;
net_traffic_stats.video_in = video_in;
net_traffic_stats.video_out = video_out;
net_traffic_stats.audio_in = audio_in;
net_traffic_stats.audio_out = audio_out;
net_traffic_stats.data_in = data_in;
net_traffic_stats.data_out = data_out;
net_traffic_stats.total_in = total_in;
net_traffic_stats.total_out = total_out;
net_status_report_(user_id.data(), user_id.size(), TraversalMode(mode), net_status_report_(user_id.data(), user_id.size(), TraversalMode(mode),
send, receive, user_data_); &net_traffic_stats, user_data_);
} }
}; };
@@ -623,8 +637,20 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
case "login"_H: { case "login"_H: {
if (j["status"].get<std::string>() == "success") { if (j["status"].get<std::string>() == "success") {
user_id_ = j["user_id"].get<std::string>(); user_id_ = j["user_id"].get<std::string>();
XNetTrafficStats net_traffic_stats;
net_traffic_stats.video_in = 0;
net_traffic_stats.video_out = 0;
net_traffic_stats.audio_in = 0;
net_traffic_stats.audio_out = 0;
net_traffic_stats.data_in = 0;
net_traffic_stats.data_out = 0;
net_traffic_stats.total_in = 0;
net_traffic_stats.total_out = 0;
net_status_report_(user_id_.data(), user_id_.size(), net_status_report_(user_id_.data(), user_id_.size(),
TraversalMode::UnknownMode, 0, 0, user_data_); TraversalMode::UnknownMode, &net_traffic_stats,
user_data_);
LOG_INFO("Login success with id [{}]", user_id_); LOG_INFO("Login success with id [{}]", user_id_);
signal_status_ = SignalStatus::SignalConnected; signal_status_ = SignalStatus::SignalConnected;
on_signal_status_(SignalStatus::SignalConnected, user_data_); on_signal_status_(SignalStatus::SignalConnected, user_data_);
@@ -967,7 +993,6 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) {
} }
case IceWorkMsg::Type::Destroy: { case IceWorkMsg::Type::Destroy: {
for (auto &user_id_it : ice_transmission_list_) { for (auto &user_id_it : ice_transmission_list_) {
LOG_ERROR("Destroy transmission");
user_id_it.second->DestroyIceTransmission(); user_id_it.second->DestroyIceTransmission();
} }
ice_transmission_list_.clear(); ice_transmission_list_.clear();

View File

@@ -25,8 +25,7 @@ typedef void (*OnConnectionStatus)(ConnectionStatus, const char *, const size_t,
void *); void *);
typedef void (*NetStatusReport)(const char *, const size_t, TraversalMode, typedef void (*NetStatusReport)(const char *, const size_t, TraversalMode,
const unsigned short, const unsigned short, const XNetTrafficStats *, void *);
void *);
typedef struct { typedef struct {
bool use_cfg_file; bool use_cfg_file;
@@ -178,7 +177,9 @@ class PeerConnection {
std::function<void(std::string, const std::string &)> on_ice_status_change_ = std::function<void(std::string, const std::string &)> on_ice_status_change_ =
nullptr; nullptr;
std::function<void(const std::string &, IceTransmission::TraversalType, std::function<void(const std::string &, IceTransmission::TraversalType,
const unsigned short, const unsigned short, void *)> const uint64_t, const uint64_t, const uint64_t,
const uint64_t, const uint64_t, const uint64_t,
const uint64_t, const uint64_t, void *)>
on_net_status_report_ = nullptr; on_net_status_report_ = nullptr;
bool ice_ready_ = false; bool ice_ready_ = false;

View File

@@ -43,18 +43,18 @@ int IceTransmission::InitIceTransmission(
std::string &turn_username, std::string &turn_password, std::string &turn_username, std::string &turn_password,
RtpPacket::PAYLOAD_TYPE video_codec_payload_type) { RtpPacket::PAYLOAD_TYPE video_codec_payload_type) {
ice_io_statistics_ = std::make_unique<IOStatistics>( ice_io_statistics_ = std::make_unique<IOStatistics>(
[](uint32_t video_inbound_bitrate, uint32_t video_outbound_bitrate, [this](uint32_t video_inbound_bitrate, uint32_t video_outbound_bitrate,
uint32_t audio_inbound_bitrate, uint32_t audio_outbound_bitrate, uint32_t audio_inbound_bitrate, uint32_t audio_outbound_bitrate,
uint32_t data_inbound_bitrate, uint32_t data_outbound_bitrate, uint32_t data_inbound_bitrate, uint32_t data_outbound_bitrate,
uint32_t total_inbound_bitrate, uint32_t total_outbound_bitrate) { uint32_t total_inbound_bitrate, uint32_t total_outbound_bitrate) {
// LOG_ERROR( if (on_receive_net_status_report_) {
// "video in: [{}] kbps, video out: [{}] kbps, audio in: [{}] kbps, on_receive_net_status_report_(
// " "audio out: [{}] kbps, data in: [{}] kbps, data out: [{}] kbps, transmission_id_, traversal_type_, video_inbound_bitrate,
// " "total in: [{}] kbps, total out: [{}] kbps", video_outbound_bitrate, audio_inbound_bitrate,
// video_inbound_bitrate / 1000, video_outbound_bitrate / 1000, audio_outbound_bitrate, data_inbound_bitrate,
// audio_inbound_bitrate / 1000, audio_outbound_bitrate / 1000, data_outbound_bitrate, total_inbound_bitrate,
// data_inbound_bitrate / 1000, data_outbound_bitrate / 1000, total_outbound_bitrate, nullptr);
// total_inbound_bitrate / 1000, total_outbound_bitrate / 1000); }
}); });
video_codec_payload_type_ = video_codec_payload_type; video_codec_payload_type_ = video_codec_payload_type;
@@ -301,7 +301,8 @@ int IceTransmission::InitIceTransmission(
} }
ice_transmission_obj->on_receive_net_status_report_( ice_transmission_obj->on_receive_net_status_report_(
ice_transmission_obj->transmission_id_, ice_transmission_obj->transmission_id_,
ice_transmission_obj->traversal_type_, 0, 0, nullptr); ice_transmission_obj->traversal_type_, 0, 0, 0, 0, 0, 0, 0, 0,
nullptr);
} }
}, },
[](NiceAgent *agent, guint stream_id, guint component_id, guint size, [](NiceAgent *agent, guint stream_id, guint component_id, guint size,

View File

@@ -75,8 +75,10 @@ class IceTransmission {
} }
void SetOnReceiveNetStatusReportFunc( void SetOnReceiveNetStatusReportFunc(
std::function<void(const std::string &, TraversalType, std::function<void(const std::string &, TraversalType, const uint64_t,
const unsigned short, const unsigned short, void *)> const uint64_t, const uint64_t, const uint64_t,
const uint64_t, const uint64_t, const uint64_t,
const uint64_t, void *)>
on_receive_net_status_report) { on_receive_net_status_report) {
on_receive_net_status_report_ = on_receive_net_status_report; on_receive_net_status_report_ = on_receive_net_status_report;
} }
@@ -159,8 +161,10 @@ class IceTransmission {
on_receive_data_ = nullptr; on_receive_data_ = nullptr;
std::function<void(std::string, const std::string &)> on_ice_status_change_ = std::function<void(std::string, const std::string &)> on_ice_status_change_ =
nullptr; nullptr;
std::function<void(const std::string &, TraversalType, const unsigned short, std::function<void(const std::string &, TraversalType, const uint64_t,
const unsigned short, void *)> const uint64_t, const uint64_t, const uint64_t,
const uint64_t, const uint64_t, const uint64_t,
const uint64_t, void *)>
on_receive_net_status_report_ = nullptr; on_receive_net_status_report_ = nullptr;
private: private: