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
This commit is contained in:
Thomas Vander Stichele 2003-06-07 22:36:35 +00:00
parent f3421c7ef8
commit ddd930570b
2 changed files with 24 additions and 5 deletions

View file

@ -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;

View file

@ -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));