summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellet <fabrice@bellet.info>2017-06-14 12:22:32 +0200
committerOlivier CrĂȘte <olivier.crete@collabora.com>2018-10-31 12:24:00 +0000
commit2cbbbca4f1855997b559f2da3d16ad896260407a (patch)
tree463d7d53c45ef77b37f7541f1ecafcd6490d6da7
parenta7de59c359349b47419880699b2e48e132eec5bb (diff)
downloadfarstream-2cbbbca4f1855997b559f2da3d16ad896260407a.tar.gz
rtp: stop the transmitter src before unlinking its funnel
This patch tweaks the order the elements are stopped and unlinked to prevent the transmitter source to fail on a not-linked to any sinkpads error. The pipeline is transmitter-src -> funnel -> rtpbin -> substream. The funnel is stopped, then the transmitter-src, and thereafter the funnel is unlinked. https://bugs.freedesktop.org/show_bug.cgi?id=100586
-rw-r--r--gst/fsrtpconference/fs-rtp-session.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index bcee5909..a9d7c950 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -574,19 +574,27 @@ _stop_transmitter_elem (gpointer key, gpointer value, gpointer elem_name)
}
static void
-stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
+stop_element (GstElement *element)
{
- if (*element == NULL)
+ if (element == NULL)
return;
- gst_element_set_locked_state (*element, TRUE);
- if (gst_element_set_state (*element, GST_STATE_NULL) !=
+ gst_element_set_locked_state (element, TRUE);
+ if (gst_element_set_state (element, GST_STATE_NULL) !=
GST_STATE_CHANGE_SUCCESS)
{
- gchar *elemname = gst_element_get_name (*element);
+ gchar *elemname = gst_element_get_name (element);
GST_WARNING ("Could not set %s to GST_STATE_NULL", elemname);
g_free (elemname);
}
+}
+
+static void
+remove_element (GstBin *conf, GstElement **element, gboolean unref)
+{
+ if (*element == NULL)
+ return;
+
if (!gst_bin_remove (conf, *element))
{
gchar *binname = gst_element_get_name (conf);
@@ -600,6 +608,12 @@ stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
*element = NULL;
}
+static void
+stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
+{
+ stop_element (*element);
+ remove_element (conf, element, unref);
+}
static void
fs_rtp_session_dispose (GObject *obj)
@@ -748,13 +762,16 @@ fs_rtp_session_dispose (GObject *obj)
if (self->priv->rtpbin_recv_rtcp_sink)
gst_pad_set_active (self->priv->rtpbin_recv_rtcp_sink, FALSE);
- stop_and_remove (conferencebin, &self->priv->transmitter_rtp_funnel, TRUE);
- stop_and_remove (conferencebin, &self->priv->transmitter_rtcp_funnel, TRUE);
+ stop_element (self->priv->transmitter_rtp_funnel);
+ stop_element (self->priv->transmitter_rtcp_funnel);
if (self->priv->transmitters)
g_hash_table_foreach (self->priv->transmitters, _stop_transmitter_elem,
"gst-src");
+ remove_element (conferencebin, &self->priv->transmitter_rtp_funnel, TRUE);
+ remove_element (conferencebin, &self->priv->transmitter_rtcp_funnel, TRUE);
+
self->priv->extra_sources =
fs_rtp_special_sources_destroy (self->priv->extra_sources);