gst/gstbin.c: Make sure that the child bin stops after completing the async state...
authorWim Taymans <wim.taymans@gmail.com>
Fri, 25 May 2007 15:36:52 +0000 (15:36 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 25 May 2007 15:36:52 +0000 (15:36 +0000)
Original commit message from CVS:
* gst/gstbin.c: (bin_handle_async_done):
Make sure that the child bin stops after completing the async state
change so that the parent can continue the state change to PLAYING.
Fixes #441159.

ChangeLog
gst/gstbin.c

index e1c62d5..ba26eb5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2007-05-25  Wim Taymans  <wim@fluendo.com>
 
+       * gst/gstbin.c: (bin_handle_async_done):
+       Make sure that the child bin stops after completing the async state
+       change so that the parent can continue the state change to PLAYING.
+       Fixes #441159.
+
+2007-05-25  Wim Taymans  <wim@fluendo.com>
+
        * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
        (unref_data), (gst_collect_pads_remove_pad),
        (gst_collect_pads_check_pads):
index 2499393..4ffc742 100644 (file)
@@ -2481,6 +2481,7 @@ bin_handle_async_done (GstBin * bin, GstMessage ** message)
   GstStateChangeReturn old_ret;
   GstState old_state, old_next;
   GstState current, next;
+  gboolean cont;
 
   old_ret = GST_STATE_RETURN (bin);
   GST_STATE_RETURN (bin) = GST_STATE_CHANGE_SUCCESS;
@@ -2496,8 +2497,14 @@ bin_handle_async_done (GstBin * bin, GstMessage ** message)
   /* update current state */
   current = GST_STATE (bin) = old_next;
 
-  /* see if we reached the final state */
-  if (pending == current)
+  /* see if we need to continue the state change on our own. This happens when
+   * we were asked to do so or when we are the toplevel bin. */
+  cont = bin->priv->asynchandling || (GST_OBJECT_PARENT (bin) == NULL);
+
+  /* see if we reached the final state. If we are not a toplevel bin we also
+   * must stop at this state change, the parent will set us to the required
+   * state eventually. */
+  if (pending == current || !cont)
     goto complete;
 
   next = GST_STATE_GET_NEXT (current, pending);