From 902e40cae280b9747c0f98e435217931e680050b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Fri, 26 Mar 2021 15:19:09 -0400 Subject: [PATCH] webrtcbin: Reject pad request for a specific m-line if it already exists This way, the app developer is in control. Part-of: --- ext/webrtc/gstwebrtcbin.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c index 8c12d67904..e1dcaeeffe 100644 --- a/ext/webrtc/gstwebrtcbin.c +++ b/ext/webrtc/gstwebrtcbin.c @@ -6194,10 +6194,10 @@ gst_webrtc_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name, const GstCaps * caps) { GstWebRTCBin *webrtc = GST_WEBRTC_BIN (element); - GstWebRTCRTPTransceiver *trans; + GstWebRTCRTPTransceiver *trans = NULL; GstWebRTCBinPad *pad = NULL; - GstWebRTCBinPad *pad2; guint serial; + gboolean lock_mline = FALSE; if (!_have_nice_elements (webrtc) || !_have_dtls_elements (webrtc)) return NULL; @@ -6215,19 +6215,26 @@ gst_webrtc_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, } else { /* parse serial number from requested padname */ serial = g_ascii_strtoull (&name[5], NULL, 10); - if (serial > webrtc->priv->max_sink_pad_serial) - webrtc->priv->max_sink_pad_serial = serial; + lock_mline = TRUE; } GST_OBJECT_UNLOCK (webrtc); - trans = _find_transceiver_for_mline (webrtc, serial); + if (lock_mline) { + GstWebRTCBinPad *pad2; - /* Ignore transceivers that already have a pad allocated */ - pad2 = _find_pad_for_transceiver (webrtc, GST_PAD_SINK, trans); - if (pad2) { - serial = -1; - trans = NULL; - gst_object_unref (pad2); + trans = _find_transceiver_for_mline (webrtc, serial); + + if (trans) { + /* Ignore transceivers that already have a pad allocated */ + pad2 = _find_pad_for_transceiver (webrtc, GST_PAD_SINK, trans); + if (pad2) { + GST_ERROR_OBJECT (element, "Trying to request pad %s for m-line %d, " + " but the transceiver associated with this m-line already has pad" + " %s", name, serial, GST_PAD_NAME (pad2)); + gst_object_unref (pad2); + return NULL; + } + } } if (!trans) {