From 1a8abde88416a0e332e8b6c6262156566a7a8f2d Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 11 Jan 2023 16:04:45 +0100 Subject: [PATCH] webrtcsink: fix panic on pre-bwe request error We dispose of consumer pipelines asynchronously, potentially after the session objects have been disposed of. As session objects are the owner of the cc element, it is entirely possible for the bwe-request signal to get emitted after cc has been disposed of, as the closure only takes a weak reference to it. Fix by simply checking if cc is None Part-of: --- net/webrtc/src/webrtcsink/imp.rs | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/net/webrtc/src/webrtcsink/imp.rs b/net/webrtc/src/webrtcsink/imp.rs index e1e7c745..db6dd9c4 100644 --- a/net/webrtc/src/webrtcsink/imp.rs +++ b/net/webrtc/src/webrtcsink/imp.rs @@ -1443,26 +1443,26 @@ impl WebRTCSink { false, glib::closure!(@watch element, @strong session_id, @weak-allow-none cc => move |_webrtcbin: gst::Element, _transport: gst::Object| { + if let Some(ref cc) = cc { + let settings = element.imp().settings.lock().unwrap(); - let cc = cc.unwrap(); - let settings = element.imp().settings.lock().unwrap(); + // TODO: Bind properties with @element's + cc.set_properties(&[ + ("min-bitrate", &settings.cc_info.min_bitrate), + ("estimated-bitrate", &settings.cc_info.start_bitrate), + ("max-bitrate", &settings.cc_info.max_bitrate), + ]); - // TODO: Bind properties with @element's - cc.set_properties(&[ - ("min-bitrate", &settings.cc_info.min_bitrate), - ("estimated-bitrate", &settings.cc_info.start_bitrate), - ("max-bitrate", &settings.cc_info.max_bitrate), - ]); + cc.connect_notify(Some("estimated-bitrate"), + glib::clone!(@weak element, @strong session_id + => move |bwe, pspec| { + element.imp().set_bitrate(&element, &session_id, + bwe.property::(pspec.name())); + } + )); + } - cc.connect_notify(Some("estimated-bitrate"), - glib::clone!(@weak element, @strong session_id - => move |bwe, pspec| { - element.imp().set_bitrate(&element, &session_id, - bwe.property::(pspec.name())); - } - )); - - Some(cc) + cc }), );