From d4fd21d1977ed01738d45d58c4f0c82b9e43d593 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Thu, 10 Oct 2024 02:38:24 +1100 Subject: [PATCH] rtp2/jitterbuffer: check for event query earlier If a serialized query arrives (e.g. allocation) and the jitterbuffer has never received a packet, then jitterbuffer would never forward the serialized query resulting in a hang. Fix by forwarding queries/events before the conditions that require the first packet to arrive. Also update unit test to check for this scenario. Part-of: --- net/rtp/src/rtpbin2/jitterbuffer.rs | 51 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/net/rtp/src/rtpbin2/jitterbuffer.rs b/net/rtp/src/rtpbin2/jitterbuffer.rs index 78a34282..10f94087 100644 --- a/net/rtp/src/rtpbin2/jitterbuffer.rs +++ b/net/rtp/src/rtpbin2/jitterbuffer.rs @@ -210,17 +210,6 @@ impl JitterBuffer { trace!("Polling at {:?}", now); - let Some((base_instant, base_ts)) = self.base_times else { - return PollResult::Empty; - }; - - let duration_since_base_instant = now - base_instant; - - trace!( - "Duration since base instant {:?}", - duration_since_base_instant - ); - let Some(item) = self.items.first() else { return PollResult::Empty; }; @@ -234,6 +223,17 @@ impl JitterBuffer { }; }; + let Some((base_instant, base_ts)) = self.base_times else { + return PollResult::Empty; + }; + + let duration_since_base_instant = now - base_instant; + + trace!( + "Duration since base instant {:?}", + duration_since_base_instant + ); + let ts = pts.checked_sub(base_ts).unwrap(); let deadline = Duration::from_nanos(ts) + self.latency; @@ -591,20 +591,7 @@ mod tests { unreachable!() }; - let QueueResult::Queued(id_first) = jb.queue_packet(&packet, 0, now) else { - unreachable!() - }; - - let QueueResult::Queued(id_second_serialized_item) = jb.queue_serialized_item() else { - unreachable!() - }; - - let rtp_data = generate_rtp_packet(0x12345678, 1, 0, 4); - let packet = RtpPacket::parse(&rtp_data).unwrap(); - let QueueResult::Queued(id_second) = jb.queue_packet(&packet, 0, now) else { - unreachable!() - }; - + // query should be forwarded immediately assert_eq!( jb.poll(now), PollResult::Forward { @@ -612,6 +599,10 @@ mod tests { discont: false } ); + + let QueueResult::Queued(id_first) = jb.queue_packet(&packet, 0, now) else { + unreachable!() + }; assert_eq!( jb.poll(now), PollResult::Forward { @@ -619,6 +610,10 @@ mod tests { discont: true } ); + + let QueueResult::Queued(id_second_serialized_item) = jb.queue_serialized_item() else { + unreachable!() + }; assert_eq!( jb.poll(now), PollResult::Forward { @@ -626,6 +621,12 @@ mod tests { discont: false } ); + + let rtp_data = generate_rtp_packet(0x12345678, 1, 0, 4); + let packet = RtpPacket::parse(&rtp_data).unwrap(); + let QueueResult::Queued(id_second) = jb.queue_packet(&packet, 0, now) else { + unreachable!() + }; assert_eq!( jb.poll(now), PollResult::Forward {