webrtcbin: fix deadlock when setting up FEC encoder
authorMathieu Duponchelle <mathieu@centricular.com>
Tue, 15 Mar 2022 23:05:19 +0000 (00:05 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 16 Mar 2022 06:06:39 +0000 (06:06 +0000)
We bind transceivers' fec_percentage property to the FEC encoder
percentage property, and with the binding bidirectional a deadlock
was introduced by the latest changes from !1762:

We take hold of the transceiver's object lock, then add the binding
and set the property to its initial value on the encoder, which causes
set_property to deadlock in the transceiver when the binding kicks in.

Changing the binding type to DEFAULT (source to target) is enough
to address the deadlock and still serves the original intent.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1967>

subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c

index a28d852..22f7704 100644 (file)
@@ -4463,7 +4463,7 @@ _build_fec_encoder (GstWebRTCBin * webrtc, WebRTCTransceiver * trans)
   sinkpad = gst_element_get_static_pad (trans->ulpfecenc, "sink");
 
   g_object_bind_property (rtp_trans, "fec-percentage", trans->ulpfecenc,
-      "percentage", G_BINDING_BIDIRECTIONAL);
+      "percentage", G_BINDING_DEFAULT);
 
   trans->redenc = gst_element_factory_make ("rtpredenc", NULL);
   gst_object_ref_sink (trans->redenc);