aboutsummaryrefslogtreecommitdiff
path: root/rtp/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rtp/src/lib.rs')
-rw-r--r--rtp/src/lib.rs52
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;
+ }
+ }
}