ext/gconf/gstswitchsink.c: Fix up the dispose logic so it doesn't leak, and fix setti...
authorJan Schmidt <thaytan@mad.scientist.com>
Tue, 6 Mar 2007 14:53:04 +0000 (14:53 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Tue, 6 Mar 2007 14:53:04 +0000 (14:53 +0000)
Original commit message from CVS:
* ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose),
(gst_switch_commit_new_kid):
Fix up the dispose logic so it doesn't leak, and fix setting of
the child state so that we don't set a child to our current state
just as we are changing it to something else.

ChangeLog
ext/gconf/gstswitchsink.c

index d6e9639..444c24f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-03-06  Jan Schmidt  <thaytan@mad.scientist.com>
+
+       * ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose),
+       (gst_switch_commit_new_kid):
+       Fix up the dispose logic so it doesn't leak, and fix setting of 
+       the child state so that we don't set a child to our current state 
+       just as we are changing it to something else.
+
 2007-03-06  Wim Taymans  <wim@fluendo.com>
 
        * gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer),
index bd6715e..a39d6e1 100644 (file)
@@ -100,19 +100,19 @@ static void
 gst_switch_sink_dispose (GObject * object)
 {
   GstSwitchSink *sink = GST_SWITCH_SINK (object);
-  GstElement **p_kid;
+  GstObject *new_kid, *kid;
 
   GST_OBJECT_LOCK (sink);
-  p_kid = &sink->new_kid;
-  gst_object_replace ((GstObject **) p_kid, NULL);
+  new_kid = GST_OBJECT_CAST (sink->new_kid);
+  sink->new_kid = NULL;
 
-  if (sink->new_kid) {
-    p_kid = &sink->kid;
-    gst_element_set_state (sink->kid, GST_STATE_NULL);
-    gst_object_replace ((GstObject **) p_kid, NULL);
-  }
+  kid = GST_OBJECT_CAST (sink->kid);
+  sink->kid = NULL;
   GST_OBJECT_UNLOCK (sink);
 
+  gst_object_replace (&new_kid, NULL);
+  gst_object_replace (&kid, NULL);
+
   GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
 }
 
@@ -120,13 +120,20 @@ gboolean
 gst_switch_commit_new_kid (GstSwitchSink * sink)
 {
   GstPad *targetpad;
-  GstState cur_state;
+  GstState kid_state;
   GstElement *new_kid, *old_kid;
   gboolean is_fakesink = FALSE;
 
   /* need locking around member accesses */
   GST_OBJECT_LOCK (sink);
-  cur_state = GST_STATE (sink);
+  /* If we're currently changing state, set the child to the next state
+   * we're transitioning too, rather than our current state which is 
+   * about to change */
+  if (GST_STATE_NEXT (sink) != GST_STATE_VOID_PENDING)
+    kid_state = GST_STATE_NEXT (sink);
+  else
+    kid_state = GST_STATE (sink);
+
   new_kid = sink->new_kid;
   sink->new_kid = NULL;
   GST_OBJECT_UNLOCK (sink);
@@ -143,7 +150,7 @@ gst_switch_commit_new_kid (GstSwitchSink * sink)
     GST_DEBUG_OBJECT (sink, "Setting new kid");
   }
 
-  if (gst_element_set_state (new_kid, cur_state) == GST_STATE_CHANGE_FAILURE) {
+  if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) {
     GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL),
         ("Failed to set state on new child."));
     gst_object_unref (new_kid);