From ddd930570b970679015d109e97321512bc9083b1 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sat, 7 Jun 2003 22:36:35 +0000 Subject: [PATCH] fixes #114668 - don't recursively state change on state change failures Original commit message from CVS: fixes #114668 - don't recursively state change on state change failures --- gst/gstbin.c | 17 ++++++++++++++--- gst/gstelement.c | 12 ++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/gst/gstbin.c b/gst/gstbin.c index 7b291cd4d7..721e2e395c 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -628,12 +628,22 @@ gst_bin_change_state (GstElement * element) pending = GST_STATE_PENDING (element); transition = GST_STATE_TRANSITION (element); - GST_INFO_ELEMENT (GST_CAT_STATES, element, "changing childrens' state from %s to %s", - gst_element_state_get_name (old_state), gst_element_state_get_name (pending)); + GST_INFO_ELEMENT (GST_CAT_STATES, element, + "changing childrens' state from %s to %s", + gst_element_state_get_name (old_state), + gst_element_state_get_name (pending)); if (pending == GST_STATE_VOID_PENDING) return GST_STATE_SUCCESS; + if (old_state == pending) + { + GST_INFO_ELEMENT (GST_CAT_STATES, element, + "old and pending state are both %s, returning", + gst_element_state_get_name (pending)); + return GST_STATE_SUCCESS; + } + children = bin->children; while (children) { @@ -655,7 +665,8 @@ gst_bin_change_state (GstElement * element) /* reset to what is was */ GST_STATE_PENDING (element) = old_state; - gst_bin_change_state (element); + /* FIXME: what about the return value ? why recursive ? */ + /* gst_bin_change_state (element); */ /* see if the old state was set */ if (GST_STATE (element) == old_state) return GST_STATE_SUCCESS; diff --git a/gst/gstelement.c b/gst/gstelement.c index ff3a5b4a33..c116ca11b1 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2098,6 +2098,14 @@ gst_element_set_state (GstElement *element, GstElementState state) /* start with the current state */ curpending = GST_STATE(element); + if (state == curpending) + { + GST_DEBUG_ELEMENT (GST_CAT_STATES, element, + "element is already in requested state %s", + gst_element_state_get_name (state)); + return (GST_STATE_SUCCESS); + } + GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "setting state from %s to %s", gst_element_state_get_name (curpending), gst_element_state_get_name (state)); @@ -2141,8 +2149,8 @@ gst_element_set_state (GstElement *element, GstElementState state) * did change the state... */ if (GST_STATE (element) != curpending) { GST_DEBUG_ELEMENT (GST_CAT_STATES, element, - "element claimed state-change success," - "but state didn't change %s, %s <-> %s", + "element claimed state-change success, " + "but state didn't change (now %s, %s <-> %s", gst_element_state_get_name (GST_STATE (element)), gst_element_state_get_name (GST_STATE_PENDING (element)), gst_element_state_get_name (curpending));