1use std::sync::atomic::{AtomicU64, Ordering};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
11pub struct MediaDiscardCounts {
12 pub opus_encode_failures: u64,
14 pub opus_decode_failures: u64,
16 pub srtp_unprotect_failures: u64,
18 pub srtcp_unprotect_failures: u64,
20 pub foreign_ssrc: u64,
22 pub dtmf_delivery_failures: u64,
24 pub unknown_payload_type: u64,
26 pub playback_completion_unobserved: u64,
28 pub ice_driver_queue_refusals: u64,
30 pub ice_data_sent_queue_refusals: u64,
32 pub ice_renegotiation_reply_unobserved: u64,
34 pub ice_send_failures: u64,
36 pub ice_redundant_candidates: u64,
38 pub ice_gathering_foreign_datagrams: u64,
40}
41
42impl MediaDiscardCounts {
43 #[must_use]
45 pub fn any(self) -> bool {
46 self.total() > 0
47 }
48
49 #[must_use]
51 pub fn total(self) -> u64 {
52 [
53 self.opus_encode_failures,
54 self.opus_decode_failures,
55 self.srtp_unprotect_failures,
56 self.srtcp_unprotect_failures,
57 self.foreign_ssrc,
58 self.dtmf_delivery_failures,
59 self.unknown_payload_type,
60 self.playback_completion_unobserved,
61 self.ice_driver_queue_refusals,
62 self.ice_data_sent_queue_refusals,
63 self.ice_renegotiation_reply_unobserved,
64 self.ice_send_failures,
65 self.ice_redundant_candidates,
66 self.ice_gathering_foreign_datagrams,
67 ]
68 .into_iter()
69 .fold(0, u64::saturating_add)
70 }
71}
72
73#[derive(Debug, Default)]
75pub(crate) struct DiscardMeters {
76 pub(crate) opus_encode_failures: AtomicU64,
77 pub(crate) opus_decode_failures: AtomicU64,
78 pub(crate) srtp_unprotect_failures: AtomicU64,
79 pub(crate) srtcp_unprotect_failures: AtomicU64,
80 pub(crate) foreign_ssrc: AtomicU64,
81 pub(crate) dtmf_delivery_failures: AtomicU64,
82 pub(crate) unknown_payload_type: AtomicU64,
83 pub(crate) playback_completion_unobserved: AtomicU64,
84 pub(crate) ice_driver_queue_refusals: AtomicU64,
85 pub(crate) ice_data_sent_queue_refusals: AtomicU64,
86 pub(crate) ice_renegotiation_reply_unobserved: AtomicU64,
87 pub(crate) ice_send_failures: AtomicU64,
88 pub(crate) ice_redundant_candidates: AtomicU64,
89 pub(crate) ice_gathering_foreign_datagrams: AtomicU64,
90}
91
92impl DiscardMeters {
93 pub(crate) fn snapshot(&self) -> MediaDiscardCounts {
94 MediaDiscardCounts {
95 opus_encode_failures: self.opus_encode_failures.load(Ordering::Relaxed),
96 opus_decode_failures: self.opus_decode_failures.load(Ordering::Relaxed),
97 srtp_unprotect_failures: self.srtp_unprotect_failures.load(Ordering::Relaxed),
98 srtcp_unprotect_failures: self.srtcp_unprotect_failures.load(Ordering::Relaxed),
99 foreign_ssrc: self.foreign_ssrc.load(Ordering::Relaxed),
100 dtmf_delivery_failures: self.dtmf_delivery_failures.load(Ordering::Relaxed),
101 unknown_payload_type: self.unknown_payload_type.load(Ordering::Relaxed),
102 playback_completion_unobserved: self
103 .playback_completion_unobserved
104 .load(Ordering::Relaxed),
105 ice_driver_queue_refusals: self.ice_driver_queue_refusals.load(Ordering::Relaxed),
106 ice_data_sent_queue_refusals: self.ice_data_sent_queue_refusals.load(Ordering::Relaxed),
107 ice_renegotiation_reply_unobserved: self
108 .ice_renegotiation_reply_unobserved
109 .load(Ordering::Relaxed),
110 ice_send_failures: self.ice_send_failures.load(Ordering::Relaxed),
111 ice_redundant_candidates: self.ice_redundant_candidates.load(Ordering::Relaxed),
112 ice_gathering_foreign_datagrams: self
113 .ice_gathering_foreign_datagrams
114 .load(Ordering::Relaxed),
115 }
116 }
117}