srt_protocol/protocol/time/
rtt.rs1use 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}