From 9c4b3b1ee748cd63fd17273e2acfb08fdc4c240e Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 15 Nov 2017 10:49:05 +0100 Subject: [PATCH] discoverer: Don't add pads/elements when cleaning up There is no need to add more pads/elements since we are already done. --- gst-libs/gst/pbutils/gstdiscoverer.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c index 68a06bf..576f0e8 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer.c +++ b/gst-libs/gst/pbutils/gstdiscoverer.c @@ -89,6 +89,8 @@ struct _GstDiscovererPrivate GList *pending_uris; GMutex lock; + /* TRUE if cleaning up discoverer */ + gboolean cleanup; /* TRUE if processing a URI */ gboolean processing; @@ -614,6 +616,17 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad, GST_DEBUG_OBJECT (dc, "pad %s:%s", GST_DEBUG_PAD_NAME (pad)); + DISCO_LOCK (dc); + if (dc->priv->cleanup) { + GST_WARNING_OBJECT (dc, "Cleanup, not adding pad"); + DISCO_UNLOCK (dc); + return; + } + if (dc->priv->current_error) { + GST_WARNING_OBJECT (dc, "Ongoing error, not adding more pads"); + DISCO_UNLOCK (dc); + return; + } ps = g_slice_new0 (PrivateStream); ps->dc = dc; @@ -646,9 +659,7 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad, gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM, (GstPadProbeCallback) got_subtitle_data, dc, NULL); g_object_set (ps->sink, "async", FALSE, NULL); - DISCO_LOCK (dc); dc->priv->pending_subtitle_pads++; - DISCO_UNLOCK (dc); } gst_caps_unref (caps); @@ -672,7 +683,6 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad, gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, (GstPadProbeCallback) _event_probe, ps, NULL); - DISCO_LOCK (dc); dc->priv->streams = g_list_append (dc->priv->streams, ps); DISCO_UNLOCK (dc); @@ -689,6 +699,7 @@ error: if (ps->sink) gst_object_unref (ps->sink); g_slice_free (PrivateStream, ps); + DISCO_UNLOCK (dc); return; } @@ -1696,6 +1707,10 @@ discoverer_cleanup (GstDiscoverer * dc) { GST_DEBUG ("Cleaning up"); + DISCO_LOCK (dc); + dc->priv->cleanup = TRUE; + DISCO_UNLOCK (dc); + gst_bus_set_flushing (dc->priv->bus, TRUE); DISCO_LOCK (dc); @@ -1724,6 +1739,8 @@ discoverer_cleanup (GstDiscoverer * dc) dc->priv->current_state = GST_STATE_NULL; dc->priv->target_state = GST_STATE_NULL; dc->priv->no_more_pads = FALSE; + dc->priv->cleanup = FALSE; + /* Try popping the next uri */ if (dc->priv->async) { -- 2.7.4