diff options
author | Fabrice Bellet <fabrice@bellet.info> | 2017-06-14 12:22:32 +0200 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2018-10-31 12:24:00 +0000 |
commit | 2cbbbca4f1855997b559f2da3d16ad896260407a (patch) | |
tree | 463d7d53c45ef77b37f7541f1ecafcd6490d6da7 | |
parent | a7de59c359349b47419880699b2e48e132eec5bb (diff) | |
download | farstream-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.c | 31 |
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); |