discoverer: Don't add pads/elements when cleaning up
authorEdward Hervey <edward@centricular.com>
Wed, 15 Nov 2017 09:49:05 +0000 (10:49 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Wed, 15 Nov 2017 09:55:55 +0000 (10:55 +0100)
There is no need to add more pads/elements since we are already done.

gst-libs/gst/pbutils/gstdiscoverer.c

index 68a06bf..576f0e8 100644 (file)
@@ -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) {