webrtcbin: fix check_negotiation computing on caps event
authorMathieu Duponchelle <mathieu@centricular.com>
Tue, 26 Oct 2021 22:20:57 +0000 (00:20 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 28 Oct 2021 19:05:59 +0000 (19:05 +0000)
It seems logical that check_negotiation be true if received_caps
is *not* equal to the new caps.

Also clean up handling of transceivers' ssrc events, as this
patch triggered a leaky code path.

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

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

index bf41b97..4dad466 100644 (file)
@@ -269,10 +269,11 @@ gst_webrtc_bin_pad_update_ssrc_event (GstWebRTCBinPad * wpad)
     WebRTCTransceiver *trans = (WebRTCTransceiver *) wpad->trans;
     GstPad *pad = GST_PAD (wpad);
 
-    trans->ssrc_event =
+    gst_event_take (&trans->ssrc_event,
         gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_STICKY,
-        gst_structure_new ("GstWebRtcBinUpdateTos", "ssrc", G_TYPE_UINT,
-            trans->current_ssrc, NULL));
+            gst_structure_new ("GstWebRtcBinUpdateTos", "ssrc", G_TYPE_UINT,
+                trans->current_ssrc, NULL)));
+
     gst_pad_send_event (pad, gst_event_ref (trans->ssrc_event));
   }
 }
@@ -302,7 +303,7 @@ gst_webrtcbin_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 
     gst_event_parse_caps (event, &caps);
     check_negotiation = (!wpad->received_caps
-        || gst_caps_is_equal (wpad->received_caps, caps));
+        || !gst_caps_is_equal (wpad->received_caps, caps));
     gst_caps_replace (&wpad->received_caps, caps);
 
     GST_DEBUG_OBJECT (parent,
@@ -468,8 +469,7 @@ gst_webrtc_bin_pad_new (const gchar * name, GstPadDirection direction)
 G_DEFINE_TYPE_WITH_CODE (GstWebRTCBin, gst_webrtc_bin, GST_TYPE_BIN,
     G_ADD_PRIVATE (GstWebRTCBin)
     GST_DEBUG_CATEGORY_INIT (gst_webrtc_bin_debug, "webrtcbin", 0,
-        "webrtcbin element");
-    );
+        "webrtcbin element"););
 
 enum
 {
@@ -1489,8 +1489,8 @@ _check_if_negotiation_is_needed (GstWebRTCBin * webrtc)
   /* If connection has created any RTCDataChannel's, and no m= section has
    * been negotiated yet for data, return "true". */
   if (webrtc->priv->data_channels->len > 0) {
-    if (_message_get_datachannel_index (webrtc->
-            current_local_description->sdp) >= G_MAXUINT) {
+    if (_message_get_datachannel_index (webrtc->current_local_description->
+            sdp) >= G_MAXUINT) {
       GST_LOG_OBJECT (webrtc,
           "no data channel media section and have %u " "transports",
           webrtc->priv->data_channels->len);
index aa9f1e2..963dfc6 100644 (file)
@@ -32,7 +32,8 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 G_DEFINE_TYPE_WITH_CODE (WebRTCTransceiver, webrtc_transceiver,
     GST_TYPE_WEBRTC_RTP_TRANSCEIVER,
     GST_DEBUG_CATEGORY_INIT (webrtc_transceiver_debug,
-        "webrtctransceiver", 0, "webrtctransceiver"););
+        "webrtctransceiver", 0, "webrtctransceiver");
+    );
 
 #define DEFAULT_FEC_TYPE GST_WEBRTC_FEC_TYPE_NONE
 #define DEFAULT_DO_NACK FALSE
@@ -157,9 +158,7 @@ webrtc_transceiver_finalize (GObject * object)
 
   gst_caps_replace (&trans->last_configured_caps, NULL);
 
-  if (trans->ssrc_event)
-    gst_event_unref (trans->ssrc_event);
-  trans->ssrc_event = NULL;
+  gst_event_replace (&trans->ssrc_event, NULL);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }