diff options
Diffstat (limited to 'rtp/src/lib.rs')
-rw-r--r-- | rtp/src/lib.rs | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/rtp/src/lib.rs b/rtp/src/lib.rs index 0c80412..d7d8d6a 100644 --- a/rtp/src/lib.rs +++ b/rtp/src/lib.rs @@ -5,7 +5,8 @@ use std::{ time::{Duration, Instant}, }; -use rtcp::RtcpPacket; +use log::debug; +use rtcp::{RtcpPacket, RtcpPart}; use rtp::SSRC; pub mod rtcp; @@ -24,6 +25,7 @@ pub struct Session { initial: bool, member_table: HashSet<SSRC>, + sender_table: HashSet<SSRC>, } impl Session { @@ -51,6 +53,7 @@ impl Session { 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) } @@ -65,6 +68,7 @@ impl Session { 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 @@ -73,6 +77,48 @@ impl Session { se } - /// RFC 3550, Section 6.3.3 - pub fn on_receive(&mut self, packet: RtcpPacket) {} + 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; + } + } } |