From e5a3b3f338598e8b87e408275f059c1db092bfc7 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 20 Jul 2004 19:54:20 +0000 Subject: [PATCH] gst/gstelement.c: use correct sinkpad, if only sinkpad is specified, but not srcpad (fixes #147889) Original commit message from CVS: * gst/gstelement.c: (gst_element_link_pads_filtered): use correct sinkpad, if only sinkpad is specified, but not srcpad (fixes #147889) * gst/gstelement.c: (gst_element_set_state_func), (gst_element_change_state): ref/unref the element, signal handlers could get rid of the element otherwise --- ChangeLog | 9 +++++++++ gst/gstelement.c | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index a88c9d5..25aa9aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-07-20 Benjamin Otte + + * gst/gstelement.c: (gst_element_link_pads_filtered): + use correct sinkpad, if only sinkpad is specified, but not srcpad + (fixes #147889) + * gst/gstelement.c: (gst_element_set_state_func), + (gst_element_change_state): ref/unref the element, signal handlers + could get rid of the element otherwise + 2004-07-20 Ronald Bultje * docs/random/ds/0.9-suggested-changes: diff --git a/gst/gstelement.c b/gst/gstelement.c index cc84127..e2131ab 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -1891,7 +1891,8 @@ gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname, GST_DEBUG_PAD_NAME (srcpad)); if ((GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC) && (GST_PAD_PEER (srcpad) == NULL)) { - GstPad *temp = gst_element_get_compatible_pad_filtered (dest, srcpad, + GstPad *temp = destpadname ? destpad : + gst_element_get_compatible_pad_filtered (dest, srcpad, filtercaps); if (temp && gst_pad_link_filtered (srcpad, temp, filtercaps)) { @@ -2753,6 +2754,8 @@ gst_element_set_state_func (GstElement * element, GstElementState state) return GST_STATE_SUCCESS; } + /* reentrancy issues with signals in change_state) */ + gst_object_ref (GST_OBJECT (element)); GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "setting state from %s to %s", gst_element_state_get_name (curpending), gst_element_state_get_name (state)); @@ -2817,6 +2820,7 @@ gst_element_set_state_func (GstElement * element, GstElementState state) } exit: + gst_object_unref (GST_OBJECT (element)); return return_val; } @@ -2945,6 +2949,9 @@ gst_element_change_state (GstElement * element) return GST_STATE_SUCCESS; } + /* we need to ref the object because of reentrancy issues with the signal + * handlers (including those in pads and gst_bin_child_state_change */ + gst_object_ref (GST_OBJECT (element)); GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "default handler tries setting state from %s to %s (%04x)", gst_element_state_get_name (old_state), @@ -3036,12 +3043,14 @@ gst_element_change_state (GstElement * element) g_cond_signal (element->state_cond); g_mutex_unlock (element->state_mutex); + gst_object_unref (GST_OBJECT (element)); return GST_STATE_SUCCESS; failure: /* undo the state change */ GST_STATE (element) = old_state; GST_STATE_PENDING (element) = old_pending; + gst_object_unref (GST_OBJECT (element)); return GST_STATE_FAILURE; } -- 2.7.4