From 49d63071544421ad45f7b764eb9cabd8290fe42c Mon Sep 17 00:00:00 2001 From: dijunkun Date: Sun, 1 Dec 2024 17:00:20 +0800 Subject: [PATCH] [fix] fix loss rate calculation --- src/statistics/io_statistics.cpp | 101 ++++++++++++++----------------- src/statistics/io_statistics.h | 28 ++++----- 2 files changed, 58 insertions(+), 71 deletions(-) diff --git a/src/statistics/io_statistics.cpp b/src/statistics/io_statistics.cpp index a5667a7..fde5f97 100644 --- a/src/statistics/io_statistics.cpp +++ b/src/statistics/io_statistics.cpp @@ -124,30 +124,6 @@ void IOStatistics::Process() { video_outbound_rtp_pkt_cnt_ + audio_outbound_rtp_pkt_cnt_ + data_outbound_rtp_pkt_cnt_; - LOG_ERROR( - "[{} {} {}] | [{} {}] | [{} {} {}] | [{} {}] | [{} {} {}] | [{} " - "{}] | [{} {} {}] | [{} {}]", - net_traffic_stats.video_inbound_stats.bitrate, - net_traffic_stats.video_inbound_stats.loss_rate, - net_traffic_stats.video_inbound_stats.rtp_packet_count, - net_traffic_stats.video_outbound_stats.bitrate, - net_traffic_stats.video_outbound_stats.rtp_packet_count, - net_traffic_stats.audio_inbound_stats.bitrate, - net_traffic_stats.audio_inbound_stats.loss_rate, - net_traffic_stats.audio_inbound_stats.rtp_packet_count, - net_traffic_stats.audio_outbound_stats.bitrate, - net_traffic_stats.audio_outbound_stats.rtp_packet_count, - net_traffic_stats.data_inbound_stats.bitrate, - net_traffic_stats.data_inbound_stats.loss_rate, - net_traffic_stats.data_inbound_stats.rtp_packet_count, - net_traffic_stats.data_outbound_stats.bitrate, - net_traffic_stats.data_outbound_stats.rtp_packet_count, - net_traffic_stats.total_inbound_stats.bitrate, - net_traffic_stats.total_inbound_stats.loss_rate, - net_traffic_stats.total_inbound_stats.rtp_packet_count, - net_traffic_stats.total_outbound_stats.bitrate, - net_traffic_stats.total_outbound_stats.rtp_packet_count); - io_report_callback_(net_traffic_stats); } } @@ -169,106 +145,117 @@ void IOStatistics::Stop() { } void IOStatistics::UpdateVideoInboundBytes(uint32_t bytes) { - video_inbound_bytes_ += bytes; + video_inbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateVideoOutboundBytes(uint32_t bytes) { - video_outbound_bytes_ += bytes; + video_outbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateVideoPacketLossCount(uint16_t seq_num) { if (last_received_video_rtp_pkt_seq_ != 0) { if (last_received_video_rtp_pkt_seq_ < seq_num) { if (seq_num - last_received_video_rtp_pkt_seq_ > 0x8000) { - expected_video_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_video_rtp_pkt_seq_ + seq_num + 1; + expected_video_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_video_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } else { - expected_video_inbound_rtp_pkt_cnt_ += - seq_num - last_received_video_rtp_pkt_seq_; + expected_video_inbound_rtp_pkt_cnt_.fetch_add( + seq_num - last_received_video_rtp_pkt_seq_, + std::memory_order_relaxed); } } else if (last_received_video_rtp_pkt_seq_ > seq_num) { - expected_video_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_video_rtp_pkt_seq_ + seq_num + 1; + expected_video_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_video_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } + } else { + expected_video_inbound_rtp_pkt_cnt_.fetch_add(1, std::memory_order_relaxed); } last_received_video_rtp_pkt_seq_ = seq_num; } void IOStatistics::UpdateAudioInboundBytes(uint32_t bytes) { - audio_inbound_bytes_ += bytes; + audio_inbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateAudioOutboundBytes(uint32_t bytes) { - audio_outbound_bytes_ += bytes; + audio_outbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateAudioPacketLossCount(uint16_t seq_num) { if (last_received_audio_rtp_pkt_seq_ != 0) { if (last_received_audio_rtp_pkt_seq_ < seq_num) { if (seq_num - last_received_audio_rtp_pkt_seq_ > 0x8000) { - expected_audio_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_audio_rtp_pkt_seq_ + seq_num + 1; + expected_audio_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_audio_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } else { - expected_audio_inbound_rtp_pkt_cnt_ += - seq_num - last_received_audio_rtp_pkt_seq_; + expected_audio_inbound_rtp_pkt_cnt_.fetch_add( + seq_num - last_received_audio_rtp_pkt_seq_, + std::memory_order_relaxed); } } else if (last_received_audio_rtp_pkt_seq_ > seq_num) { - expected_audio_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_audio_rtp_pkt_seq_ + seq_num + 1; + expected_audio_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_audio_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } } last_received_audio_rtp_pkt_seq_ = seq_num; } void IOStatistics::UpdateDataInboundBytes(uint32_t bytes) { - data_inbound_bytes_ += bytes; + data_inbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateDataOutboundBytes(uint32_t bytes) { - data_outbound_bytes_ += bytes; + data_outbound_bytes_.fetch_add(bytes, std::memory_order_relaxed); } void IOStatistics::UpdateDataPacketLossCount(uint16_t seq_num) { if (last_received_data_rtp_pkt_seq_ != 0) { if (last_received_data_rtp_pkt_seq_ < seq_num) { if (seq_num - last_received_data_rtp_pkt_seq_ > 0x8000) { - expected_data_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_data_rtp_pkt_seq_ + seq_num + 1; + expected_data_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_data_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } else { - expected_data_inbound_rtp_pkt_cnt_ += - seq_num - last_received_data_rtp_pkt_seq_; + expected_data_inbound_rtp_pkt_cnt_.fetch_add( + seq_num - last_received_data_rtp_pkt_seq_, + std::memory_order_relaxed); } } else if (last_received_data_rtp_pkt_seq_ > seq_num) { - expected_data_inbound_rtp_pkt_cnt_ += - 0xffff - last_received_data_rtp_pkt_seq_ + seq_num + 1; + expected_data_inbound_rtp_pkt_cnt_.fetch_add( + 0xffff - last_received_data_rtp_pkt_seq_ + seq_num + 1, + std::memory_order_relaxed); } } last_received_data_rtp_pkt_seq_ = seq_num; } void IOStatistics::IncrementVideoInboundRtpPacketCount() { - video_inbound_rtp_pkt_cnt_++; - video_inbound_rtp_pkt_cnt_tmp_++; + ++video_inbound_rtp_pkt_cnt_; + ++video_inbound_rtp_pkt_cnt_tmp_; } void IOStatistics::IncrementVideoOutboundRtpPacketCount() { - video_outbound_rtp_pkt_cnt_++; + ++video_outbound_rtp_pkt_cnt_; } void IOStatistics::IncrementAudioInboundRtpPacketCount() { - audio_inbound_rtp_pkt_cnt_++; - audio_inbound_rtp_pkt_cnt_tmp_++; + ++audio_inbound_rtp_pkt_cnt_; + ++audio_inbound_rtp_pkt_cnt_tmp_; } void IOStatistics::IncrementAudioOutboundRtpPacketCount() { - audio_outbound_rtp_pkt_cnt_++; + ++audio_outbound_rtp_pkt_cnt_; } void IOStatistics::IncrementDataInboundRtpPacketCount() { - data_inbound_rtp_pkt_cnt_++; - data_inbound_rtp_pkt_cnt_tmp_++; + ++data_inbound_rtp_pkt_cnt_; + ++data_inbound_rtp_pkt_cnt_tmp_; } void IOStatistics::IncrementDataOutboundRtpPacketCount() { - data_outbound_rtp_pkt_cnt_++; + ++data_outbound_rtp_pkt_cnt_; } \ No newline at end of file diff --git a/src/statistics/io_statistics.h b/src/statistics/io_statistics.h index 660078e..04ea09a 100644 --- a/src/statistics/io_statistics.h +++ b/src/statistics/io_statistics.h @@ -79,13 +79,13 @@ class IOStatistics { std::atomic video_inbound_bytes_ = 0; std::atomic video_outbound_bytes_ = 0; - std::atomic last_received_video_rtp_pkt_seq_ = 0; + uint16_t last_received_video_rtp_pkt_seq_ = 0; std::atomic audio_inbound_bytes_ = 0; std::atomic audio_outbound_bytes_ = 0; - std::atomic last_received_audio_rtp_pkt_seq_ = 0; + uint16_t last_received_audio_rtp_pkt_seq_ = 0; std::atomic data_inbound_bytes_ = 0; std::atomic data_outbound_bytes_ = 0; - std::atomic last_received_data_rtp_pkt_seq_ = 0; + uint16_t last_received_data_rtp_pkt_seq_ = 0; std::atomic total_inbound_bytes_ = 0; std::atomic total_outbound_bytes_ = 0; @@ -104,18 +104,18 @@ class IOStatistics { std::atomic expected_video_inbound_rtp_pkt_cnt_ = 0; std::atomic expected_audio_inbound_rtp_pkt_cnt_ = 0; std::atomic expected_data_inbound_rtp_pkt_cnt_ = 0; - std::atomic video_rtp_pkt_loss_cnt_ = 0; - std::atomic audio_rtp_pkt_loss_cnt_ = 0; - std::atomic data_rtp_pkt_loss_cnt_ = 0; + int32_t video_rtp_pkt_loss_cnt_ = 0; + int32_t audio_rtp_pkt_loss_cnt_ = 0; + int32_t data_rtp_pkt_loss_cnt_ = 0; - std::atomic video_inbound_bitrate_ = 0; - std::atomic video_outbound_bitrate_ = 0; - std::atomic audio_inbound_bitrate_ = 0; - std::atomic audio_outbound_bitrate_ = 0; - std::atomic data_inbound_bitrate_ = 0; - std::atomic data_outbound_bitrate_ = 0; - std::atomic total_inbound_bitrate_ = 0; - std::atomic total_outbound_bitrate_ = 0; + uint32_t video_inbound_bitrate_ = 0; + uint32_t video_outbound_bitrate_ = 0; + uint32_t audio_inbound_bitrate_ = 0; + uint32_t audio_outbound_bitrate_ = 0; + uint32_t data_inbound_bitrate_ = 0; + uint32_t data_outbound_bitrate_ = 0; + uint32_t total_inbound_bitrate_ = 0; + uint32_t total_outbound_bitrate_ = 0; float video_rtp_pkt_loss_rate_ = 0; float audio_rtp_pkt_loss_rate_ = 0;