summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2010-03-19 12:13:07 +0100
committerEdward Hervey <bilboed@bilboed.com>2010-03-19 12:13:07 +0100
commit94127891402a16382eb4242f354f681af6934705 (patch)
treef2c47ec99f6e4722ba8ef213d17a9eacd92639e6
parent930505400466d072b9c5cc7aee6ce7ba503c62fe (diff)
GnlSource: Handle multiple pad_blocked calls.
The pad blocked handler can be called by multiple threads, we therefore need to make sure we only start the ghost_seek_pad handler once.
-rw-r--r--gnl/gnlsource.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/gnl/gnlsource.c b/gnl/gnlsource.c
index 29b9c2a..e9deca6 100644
--- a/gnl/gnlsource.c
+++ b/gnl/gnlsource.c
@@ -62,6 +62,7 @@ struct _GnlSourcePrivate
gulong padaddedid; /* signal handler for element pad-added signal */
gboolean pendingblock; /* We have a pending pad_block */
+ gboolean areblocked; /* We already got blocked */
GstPad *ghostedpad; /* Pad (to be) ghosted */
};
@@ -256,6 +257,7 @@ element_pad_removed_cb (GstElement * element G_GNUC_UNUSED, GstPad * pad,
if (source->priv->ghostpad) {
GST_DEBUG_OBJECT (source, "Clearing up ghostpad");
+ source->priv->areblocked = FALSE;
gst_pad_set_blocked_async (pad, FALSE,
(GstPadBlockCallback) pad_blocked_cb, source);
@@ -336,6 +338,7 @@ ghost_seek_pad (GnlSource * source)
}
GST_DEBUG_OBJECT (source, "about to unblock %s:%s", GST_DEBUG_PAD_NAME (pad));
+ source->priv->areblocked = FALSE;
gst_pad_set_blocked_async (pad, FALSE,
(GstPadBlockCallback) pad_blocked_cb, source);
gst_element_no_more_pads (GST_ELEMENT (source));
@@ -352,9 +355,9 @@ pad_blocked_cb (GstPad * pad, gboolean blocked, GnlSource * source)
GST_DEBUG_OBJECT (source, "blocked:%d pad:%s:%s",
blocked, GST_DEBUG_PAD_NAME (pad));
- if (!(source->priv->ghostpad)) {
- if (blocked)
- g_thread_create ((GThreadFunc) ghost_seek_pad, source, FALSE, NULL);
+ if (blocked && !(source->priv->ghostpad) && !(source->priv->areblocked)) {
+ source->priv->areblocked = TRUE;
+ g_thread_create ((GThreadFunc) ghost_seek_pad, source, FALSE, NULL);
}
}
@@ -580,6 +583,7 @@ gnl_source_change_state (GstElement * element, GstStateChange transition)
source->priv->ghostpad);
source->priv->ghostpad = NULL;
source->priv->ghostedpad = NULL;
+ source->priv->areblocked = FALSE;
source->priv->pendingblock = FALSE;
}
default: