[fix] fix loss rate calculation

This commit is contained in:
dijunkun
2024-12-01 17:00:20 +08:00
parent b0fdcd9193
commit 49d6307154
2 changed files with 58 additions and 71 deletions

View File

@@ -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_;
}

View File

@@ -79,13 +79,13 @@ class IOStatistics {
std::atomic<uint32_t> video_inbound_bytes_ = 0;
std::atomic<uint32_t> video_outbound_bytes_ = 0;
std::atomic<uint16_t> last_received_video_rtp_pkt_seq_ = 0;
uint16_t last_received_video_rtp_pkt_seq_ = 0;
std::atomic<uint32_t> audio_inbound_bytes_ = 0;
std::atomic<uint32_t> audio_outbound_bytes_ = 0;
std::atomic<uint16_t> last_received_audio_rtp_pkt_seq_ = 0;
uint16_t last_received_audio_rtp_pkt_seq_ = 0;
std::atomic<uint32_t> data_inbound_bytes_ = 0;
std::atomic<uint32_t> data_outbound_bytes_ = 0;
std::atomic<uint16_t> last_received_data_rtp_pkt_seq_ = 0;
uint16_t last_received_data_rtp_pkt_seq_ = 0;
std::atomic<uint32_t> total_inbound_bytes_ = 0;
std::atomic<uint32_t> total_outbound_bytes_ = 0;
@@ -104,18 +104,18 @@ class IOStatistics {
std::atomic<uint32_t> expected_video_inbound_rtp_pkt_cnt_ = 0;
std::atomic<uint32_t> expected_audio_inbound_rtp_pkt_cnt_ = 0;
std::atomic<uint32_t> expected_data_inbound_rtp_pkt_cnt_ = 0;
std::atomic<uint32_t> video_rtp_pkt_loss_cnt_ = 0;
std::atomic<uint32_t> audio_rtp_pkt_loss_cnt_ = 0;
std::atomic<uint32_t> 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<uint32_t> video_inbound_bitrate_ = 0;
std::atomic<uint32_t> video_outbound_bitrate_ = 0;
std::atomic<uint32_t> audio_inbound_bitrate_ = 0;
std::atomic<uint32_t> audio_outbound_bitrate_ = 0;
std::atomic<uint32_t> data_inbound_bitrate_ = 0;
std::atomic<uint32_t> data_outbound_bitrate_ = 0;
std::atomic<uint32_t> total_inbound_bitrate_ = 0;
std::atomic<uint32_t> 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;