summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--gst/selector/gstinputselector.c17
2 files changed, 20 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 1e2eb954..9c6e0d84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2008-03-20 Wim Taymans <wim.taymans@collabora.co.uk>
+ * gst/selector/gstinputselector.c:
+ (gst_input_selector_set_active_pad), (gst_input_selector_switch):
+ Do g_object_notify() only when not holding the lock to get the property
+ because otherwise we run into a deadlock with the deep-notify handlers
+ that are possibly installed.
+
+2008-03-20 Wim Taymans <wim.taymans@collabora.co.uk>
+
* gst/selector/gstinputselector.c: (gst_selector_pad_class_init),
(gst_selector_pad_event), (gst_selector_pad_bufferalloc),
(gst_selector_pad_chain), (gst_input_selector_set_active_pad):
diff --git a/gst/selector/gstinputselector.c b/gst/selector/gstinputselector.c
index 4f169cf6..7c963ad8 100644
--- a/gst/selector/gstinputselector.c
+++ b/gst/selector/gstinputselector.c
@@ -877,8 +877,9 @@ gst_segment_set_start (GstSegment * segment, gint64 running_time)
segment->start += duration;
}
-/* this function must be called with the SELECTOR_LOCK. */
-static void
+/* this function must be called with the SELECTOR_LOCK. It returns TRUE when the
+ * active pad changed. */
+static gboolean
gst_input_selector_set_active_pad (GstInputSelector * self,
GstPad * pad, gint64 stop_time, gint64 start_time)
{
@@ -886,7 +887,7 @@ gst_input_selector_set_active_pad (GstInputSelector * self,
GstPad **active_pad_p;
if (pad == self->active_sinkpad)
- return;
+ return FALSE;
old = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
new = GST_SELECTOR_PAD_CAST (pad);
@@ -925,7 +926,7 @@ gst_input_selector_set_active_pad (GstInputSelector * self,
GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT,
self->active_sinkpad);
- g_object_notify (G_OBJECT (self), "active-pad");
+ return TRUE;
}
static void
@@ -1213,14 +1214,20 @@ static void
gst_input_selector_switch (GstInputSelector * self, GstPad * pad,
gint64 stop_time, gint64 start_time)
{
+ gboolean changed;
+
g_return_if_fail (self->blocked == TRUE);
GST_INPUT_SELECTOR_LOCK (self);
- gst_input_selector_set_active_pad (self, pad, stop_time, start_time);
+ changed =
+ gst_input_selector_set_active_pad (self, pad, stop_time, start_time);
self->blocked = FALSE;
GST_INPUT_SELECTOR_BROADCAST (self);
GST_INPUT_SELECTOR_UNLOCK (self);
+
+ if (changed)
+ g_object_notify (G_OBJECT (self), "active-pad");
}
static gboolean