diff --git a/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-media.c b/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-media.c index 0b303c94b4..de938b5594 100644 --- a/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-media.c +++ b/subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-media.c @@ -1086,6 +1086,7 @@ gst_rtsp_media_take_pipeline (GstRTSPMedia * media, GstPipeline * pipeline) g_return_if_fail (GST_IS_PIPELINE (pipeline)); priv = media->priv; + GST_DEBUG_OBJECT (media, "Taking pipeline %" GST_PTR_FORMAT, pipeline); g_mutex_lock (&priv->lock); old = priv->pipeline; @@ -2616,31 +2617,53 @@ gst_rtsp_media_create_stream (GstRTSPMedia * media, GstElement * payloader, GstElement *appsink, *appsrc; GstPad *sinkpad, *srcpad; - appsink = gst_element_factory_make ("appsink", NULL); - appsrc = gst_element_factory_make ("appsrc", NULL); + GST_DEBUG_OBJECT (media, + "Using appsrc+appsink to break loops for stream %u", idx); + + gchar *appsink_name = g_strdup_printf ("appsink_stream_%u", idx); + appsink = gst_element_factory_make ("appsink", appsink_name); + g_free (appsink_name); + + gchar *appsrc_name = g_strdup_printf ("appsrc_stream_%u", idx); + appsrc = gst_element_factory_make ("appsrc", appsrc_name); + g_free (appsrc_name); if (GST_PAD_IS_SINK (pad)) { srcpad = gst_element_get_static_pad (appsrc, "src"); gst_bin_add (GST_BIN (priv->element), appsrc); - gst_pad_link (srcpad, pad); + GstPadLinkReturn pad_link = gst_pad_link (srcpad, pad); + g_assert (pad_link == GST_PAD_LINK_OK); + gst_object_unref (srcpad); streampad = gst_element_get_static_pad (appsink, "sink"); - priv->pending_pipeline_elements = - g_list_prepend (priv->pending_pipeline_elements, appsink); + if (priv->pipeline != NULL) { + gst_bin_add (GST_BIN_CAST (priv->pipeline), appsink); + } else { + priv->pending_pipeline_elements = + g_list_prepend (priv->pending_pipeline_elements, appsink); + } } else { sinkpad = gst_element_get_static_pad (appsink, "sink"); - gst_pad_link (pad, sinkpad); + gst_bin_add (GST_BIN (priv->element), appsink); + + GstPadLinkReturn pad_link = gst_pad_link (pad, sinkpad); + g_assert (pad_link == GST_PAD_LINK_OK); + gst_object_unref (sinkpad); streampad = gst_element_get_static_pad (appsrc, "src"); - priv->pending_pipeline_elements = - g_list_prepend (priv->pending_pipeline_elements, appsrc); + if (priv->pipeline != NULL) { + gst_bin_add (GST_BIN_CAST (priv->pipeline), appsrc); + } else { + priv->pending_pipeline_elements = + g_list_prepend (priv->pending_pipeline_elements, appsrc); + } } g_object_set (appsrc, "block", TRUE, "format", GST_FORMAT_TIME, "is-live",