From bdfb24abbd4beb46469d6bac063c7083263857a2 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Tue, 14 Apr 2020 20:53:01 +0200 Subject: [PATCH] jitterbuffer: release state lock when requesting pt map This is similar to what the standard jitterbuffer does, and is necessary to avoid deadlocks with the rtpbin session lock, if the user calls onto any API that requires us to take the state lock at the wrong time (eg setting the latency property, clearing the pt map) --- .../src/jitterbuffer/jitterbuffer.rs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/generic/threadshare/src/jitterbuffer/jitterbuffer.rs b/generic/threadshare/src/jitterbuffer/jitterbuffer.rs index 07ece795..273cba42 100644 --- a/generic/threadshare/src/jitterbuffer/jitterbuffer.rs +++ b/generic/threadshare/src/jitterbuffer/jitterbuffer.rs @@ -450,16 +450,23 @@ impl SinkHandler { } } - if state.clock_rate.is_none() { - let caps = element - .emit("request-pt-map", &[&(pt as u32)]) - .map_err(|_| gst::FlowError::Error)? - .ok_or(gst::FlowError::Error)? - .get::() - .map_err(|_| gst::FlowError::Error)? - .ok_or(gst::FlowError::Error)?; - self.parse_caps(inner, &mut state, element, &caps, pt)?; - } + let mut state = { + if state.clock_rate.is_none() { + drop(state); + let caps = element + .emit("request-pt-map", &[&(pt as u32)]) + .map_err(|_| gst::FlowError::Error)? + .ok_or(gst::FlowError::Error)? + .get::() + .map_err(|_| gst::FlowError::Error)? + .ok_or(gst::FlowError::Error)?; + let mut state = jb.state.lock().unwrap(); + self.parse_caps(inner, &mut state, element, &caps, pt)?; + state + } else { + state + } + }; inner.packet_rate_ctx.update(seq, rtptime);