From c5c85f0785fb1130fed58d3933959fc573f38750 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 18 Nov 2024 17:32:42 +0800 Subject: [PATCH] [feat] net traffic stats supported --- src/interface/x.h | 18 ++++++++++--- src/pc/peer_connection.cpp | 39 ++++++++++++++++++++++----- src/pc/peer_connection.h | 7 ++--- src/transmission/ice_transmission.cpp | 27 ++++++++++--------- src/transmission/ice_transmission.h | 12 ++++++--- 5 files changed, 72 insertions(+), 31 deletions(-) diff --git a/src/interface/x.h b/src/interface/x.h index 83ad59e..e435e6d 100644 --- a/src/interface/x.h +++ b/src/interface/x.h @@ -42,10 +42,21 @@ extern "C" { typedef struct { const char* data; size_t size; - unsigned int width; - unsigned int height; + uint32_t width; + uint32_t height; } 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 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*); typedef void (*NetStatusReport)(const char*, const size_t, TraversalMode, - const unsigned short, const unsigned short, - void*); + const XNetTrafficStats*, void*); typedef struct { bool use_cfg_file; diff --git a/src/pc/peer_connection.cpp b/src/pc/peer_connection.cpp index 9d6cbee..68a0b9d 100644 --- a/src/pc/peer_connection.cpp +++ b/src/pc/peer_connection.cpp @@ -234,13 +234,27 @@ int PeerConnection::Init(PeerConnectionParams params, } }; - on_net_status_report_ = [this](const std::string &user_id, - IceTransmission::TraversalType mode, - const unsigned short send, - const unsigned short receive, void *user_ptr) { + on_net_status_report_ = [this]( + const std::string &user_id, + IceTransmission::TraversalType mode, + 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_) { + 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), - send, receive, user_data_); + &net_traffic_stats, user_data_); } }; @@ -623,8 +637,20 @@ void PeerConnection::ProcessSignal(const std::string &signal) { case "login"_H: { if (j["status"].get() == "success") { user_id_ = j["user_id"].get(); + + 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(), - TraversalMode::UnknownMode, 0, 0, user_data_); + TraversalMode::UnknownMode, &net_traffic_stats, + user_data_); LOG_INFO("Login success with id [{}]", user_id_); signal_status_ = SignalStatus::SignalConnected; on_signal_status_(SignalStatus::SignalConnected, user_data_); @@ -967,7 +993,6 @@ void PeerConnection::ProcessIceWorkMsg(const IceWorkMsg &msg) { } case IceWorkMsg::Type::Destroy: { for (auto &user_id_it : ice_transmission_list_) { - LOG_ERROR("Destroy transmission"); user_id_it.second->DestroyIceTransmission(); } ice_transmission_list_.clear(); diff --git a/src/pc/peer_connection.h b/src/pc/peer_connection.h index f822e32..87b1c65 100644 --- a/src/pc/peer_connection.h +++ b/src/pc/peer_connection.h @@ -25,8 +25,7 @@ typedef void (*OnConnectionStatus)(ConnectionStatus, const char *, const size_t, void *); typedef void (*NetStatusReport)(const char *, const size_t, TraversalMode, - const unsigned short, const unsigned short, - void *); + const XNetTrafficStats *, void *); typedef struct { bool use_cfg_file; @@ -178,7 +177,9 @@ class PeerConnection { std::function on_ice_status_change_ = nullptr; std::function + 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; bool ice_ready_ = false; diff --git a/src/transmission/ice_transmission.cpp b/src/transmission/ice_transmission.cpp index 3afc248..943920c 100644 --- a/src/transmission/ice_transmission.cpp +++ b/src/transmission/ice_transmission.cpp @@ -43,18 +43,18 @@ int IceTransmission::InitIceTransmission( std::string &turn_username, std::string &turn_password, RtpPacket::PAYLOAD_TYPE video_codec_payload_type) { ice_io_statistics_ = std::make_unique( - [](uint32_t video_inbound_bitrate, uint32_t video_outbound_bitrate, - uint32_t audio_inbound_bitrate, uint32_t audio_outbound_bitrate, - uint32_t data_inbound_bitrate, uint32_t data_outbound_bitrate, - uint32_t total_inbound_bitrate, uint32_t total_outbound_bitrate) { - // LOG_ERROR( - // "video in: [{}] kbps, video out: [{}] kbps, audio in: [{}] kbps, - // " "audio out: [{}] kbps, data in: [{}] kbps, data out: [{}] kbps, - // " "total in: [{}] kbps, total out: [{}] kbps", - // video_inbound_bitrate / 1000, video_outbound_bitrate / 1000, - // audio_inbound_bitrate / 1000, audio_outbound_bitrate / 1000, - // data_inbound_bitrate / 1000, data_outbound_bitrate / 1000, - // total_inbound_bitrate / 1000, total_outbound_bitrate / 1000); + [this](uint32_t video_inbound_bitrate, uint32_t video_outbound_bitrate, + uint32_t audio_inbound_bitrate, uint32_t audio_outbound_bitrate, + uint32_t data_inbound_bitrate, uint32_t data_outbound_bitrate, + uint32_t total_inbound_bitrate, uint32_t total_outbound_bitrate) { + if (on_receive_net_status_report_) { + on_receive_net_status_report_( + transmission_id_, traversal_type_, video_inbound_bitrate, + video_outbound_bitrate, audio_inbound_bitrate, + audio_outbound_bitrate, data_inbound_bitrate, + data_outbound_bitrate, total_inbound_bitrate, + total_outbound_bitrate, nullptr); + } }); 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->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, diff --git a/src/transmission/ice_transmission.h b/src/transmission/ice_transmission.h index 773baf2..fec5bc3 100644 --- a/src/transmission/ice_transmission.h +++ b/src/transmission/ice_transmission.h @@ -75,8 +75,10 @@ class IceTransmission { } void SetOnReceiveNetStatusReportFunc( - std::function + std::function 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; std::function on_ice_status_change_ = nullptr; - std::function + std::function on_receive_net_status_report_ = nullptr; private: