aboutsummaryrefslogtreecommitdiff
path: root/rtp/src/lib.rs
blob: d7d8d6aea3edd871ac377e9a1df564cffbb10196 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#![feature(random)]
use std::{
    collections::HashSet,
    random::random,
    time::{Duration, Instant},
};

use log::debug;
use rtcp::{RtcpPacket, RtcpPart};
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>,
    sender_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();
        debug!("RTCP transmission interval is {t:.02}s");
        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,
            sender_table: HashSet::new(),
            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
    }

    pub fn tt_expire(&mut self) {
        let t = self.compute_rtcp_transmission_interval();
        if self.tp + t < self.tc {
            self.send_rtcp();
            self.tp = self.tc;
            let t = self.compute_rtcp_transmission_interval();
            self.tn = self.tc + t;
            if self.tp + t > self.tc {
                self.tn = self.tp + t;
            }
            self.pmembers = self.members;
        }
    }

    pub fn send_rtcp(&mut self) {
        
    }

    /// RFC 3550, Section 6.3.3 / 6.3.4
    pub fn on_receive(&mut self, packet_raw: &[u8]) {
        let packet = RtcpPacket::parse(packet_raw).unwrap(); // TODO

        let bye = packet.parts.iter().find_map(|p| match p {
            RtcpPart::Bye(b) => Some(b),
            _ => None,
        });
        if let Some(bye) = bye {
            for s in &bye.ssrcs {
                if self.member_table.remove(s) {
                    self.members -= 1;
                }
                if self.sender_table.remove(s) {
                    self.senders -= 1;
                }
            }
            let f_mem = self.members as f32 / self.pmembers as f32;
            self.tn = self.tc + (self.tn - self.tc).mul_f32(f_mem);
            self.tp = self.tc - (self.tc - self.tp).mul_f32(f_mem);
            self.pmembers = self.members
        } else {
            self.avg_rtcp_size =
                (1. / 16.) * packet_raw.len() as f32 + (15. / 16.) * self.avg_rtcp_size;
        }
    }
}