stabilizer_stream/
loss.rs

1use 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}