diff --git a/net/webrtc/src/webrtcsink/imp.rs b/net/webrtc/src/webrtcsink/imp.rs index 3e9d70c7..b7394f5c 100644 --- a/net/webrtc/src/webrtcsink/imp.rs +++ b/net/webrtc/src/webrtcsink/imp.rs @@ -2192,21 +2192,24 @@ impl BaseWebRTCSink { if session.congestion_controller.is_some() { let session_id_str = session_id.to_string(); rtpbin.connect_closure("on-new-ssrc", true, - glib::closure!(@weak-allow-none element, @weak-allow-none webrtcbin + glib::closure!(@weak-allow-none element, => move |rtpbin: gst::Object, session_id: u32, _src: u32| { let rtp_session = rtpbin.emit_by_name::("get-session", &[&session_id]); let element = element.expect("on-new-ssrc emitted when webrtcsink has been disposed?"); - let webrtcbin = webrtcbin.unwrap(); let mut state = element.imp().state.lock().unwrap(); if let Some(session) = state.sessions.get_mut(&session_id_str) { if session.stats_sigid.is_none() { + let session_id_str = session_id_str.clone(); + let element = element.downgrade(); session.stats_sigid = Some(rtp_session.connect_notify(Some("twcc-stats"), - glib::clone!(@strong session_id_str, @weak webrtcbin, @weak element => @default-return (), move |sess, pspec| { - // Run the Loss-based control algorithm on new peer TWCC feedbacks - element.imp().process_loss_stats(&element, &session_id_str, &sess.property::(pspec.name())); - }) + move |sess, pspec| { + if let Some(element) = element.upgrade() { + // Run the Loss-based control algorithm on new peer TWCC feedbacks + element.imp().process_loss_stats(&element, &session_id_str, &sess.property::(pspec.name())); + } + } )); } }