srt_protocol/protocol/time/
rtt.rs

1use std::{convert::TryInto, time::Duration};
2
3use crate::packet::TimeSpan;
4
5#[derive(Debug, Eq, PartialEq, Clone, Copy)]
6pub struct Rtt {
7    mean: TimeSpan,
8    variance: TimeSpan,
9}
10
11impl Default for Rtt {
12    fn default() -> Self {
13        Self {
14            mean: TimeSpan::from_micros(10_000),
15            variance: TimeSpan::from_micros(1_000),
16        }
17    }
18}
19
20impl Rtt {
21    pub fn new(mean: TimeSpan, variance: TimeSpan) -> Self {
22        Self { mean, variance }
23    }
24
25    pub fn update(&mut self, rtt: TimeSpan) {
26        self.mean = TimeSpan::from_micros(
27            ((self.mean.as_micros() as i64 * 7 + rtt.as_micros() as i64) / 8) as i32,
28        );
29        self.variance = TimeSpan::from_micros(
30            ((self.variance.as_micros() as i64 * 3
31                + (self.mean.as_micros() as i64 - rtt.as_micros() as i64).abs())
32                / 4) as i32,
33        );
34    }
35
36    pub fn mean(&self) -> TimeSpan {
37        self.mean
38    }
39
40    pub fn variance(&self) -> TimeSpan {
41        self.variance
42    }
43
44    pub fn mean_as_duration(&self) -> Duration {
45        Duration::from_micros(self.mean.as_micros().try_into().unwrap())
46    }
47
48    pub fn variance_as_duration(&self) -> Duration {
49        Duration::from_micros(self.variance.as_micros().try_into().unwrap())
50    }
51}