stabilizer_stream/
loss.rs1use crate::Frame;
2
3#[derive(Clone, Copy, Default)]
4pub struct Loss {
5 received: u64,
6 dropped: u64,
7 seq: Option<u32>,
8}
9
10impl Loss {
11 pub fn update(&mut self, frame: &Frame) {
12 self.received += frame.header.batches as u64;
13 if let Some(seq) = self.seq {
14 let missing = frame.header.seq.wrapping_sub(seq) as u64;
15 self.dropped += missing;
16 if missing > 0 {
17 log::warn!(
18 "Lost {} batches: {:#08X} -> {:#08X}",
19 missing,
20 seq,
21 frame.header.seq,
22 );
23 }
24 }
25 self.seq = Some(frame.header.seq.wrapping_add(frame.header.batches as _));
26 }
27
28 pub fn analyze(&self) {
29 if self.received > 0 {
30 let loss = self.dropped as f32 / (self.received + self.dropped) as f32;
31 log::info!(
32 "Loss: {} % ({} of {})",
33 loss * 100.0,
34 self.dropped,
35 self.received + self.dropped
36 );
37 }
38 }
39}