aboutsummaryrefslogtreecommitdiff
path: root/rtp/src/lib.rs
blob: 0c804120b54d803871a3a90977fd51b2d25dee35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#![feature(random)]
use std::{
    collections::HashSet,
    random::random,
    time::{Duration, Instant},
};

use rtcp::RtcpPacket;
use rtp::SSRC;

pub mod rtcp;
pub mod rtp;

pub struct Session {
    tp: Instant,
    tc: Instant,
    tn: Instant,
    pmembers: usize,
    members: usize,
    senders: usize,
    rtcp_bw: f32,
    we_sent: bool,
    avg_rtcp_size: f32,
    initial: bool,

    member_table: HashSet<SSRC>,
}

impl Session {
    /// RFC 3550, Section 6.3.1
    pub fn compute_rtcp_transmission_interval(&self) -> Duration {
        let n;
        let c;
        if self.senders * 4 < self.members {
            if self.we_sent {
                // Senders use a quarter of the bandwidth
                c = self.avg_rtcp_size / (self.rtcp_bw * 0.25);
                n = self.senders;
            } else {
                // Receivers use the remaining three quarters
                c = self.avg_rtcp_size / (self.rtcp_bw * 0.75);
                n = self.members - self.senders
            }
        } else {
            // Equally split between members
            c = self.avg_rtcp_size / self.rtcp_bw;
            n = self.members;
        }

        let tmin = if self.initial { 2.5f32 } else { 5. };
        let td = tmin.max(n as f32 * c);
        let t = td * ((random::<u16>() as f32) / (u16::MAX as f32) + 0.5);
        let t = t / 1.5f32.exp();
        Duration::from_secs_f32(t)
    }

    /// RFC 3550, Section 6.3.2
    pub fn new() -> Self {
        let mut se = Self {
            tp: Instant::now(),
            tc: Instant::now(),
            tn: Instant::now(),
            senders: 0,
            pmembers: 1,
            members: 1,
            we_sent: false,
            initial: true,
            member_table: HashSet::new(), // TODO add own ssrc to members
            rtcp_bw: 1000.,               // TODO set rtcp bandwidth from params
            avg_rtcp_size: 1000.,         // TODO set to next likely rtcp packet size
        };
        se.tn += se.compute_rtcp_transmission_interval();
        se
    }

    /// RFC 3550, Section 6.3.3
    pub fn on_receive(&mut self, packet: RtcpPacket) {}
}