gst/switch/gstswitch.c: Cleaning the sinkpads correctly on state change, mostly the...
authorJulien Moutte <julien@moutte.net>
Sun, 15 Feb 2004 18:05:04 +0000 (18:05 +0000)
committerJulien Moutte <julien@moutte.net>
Sun, 15 Feb 2004 18:05:04 +0000 (18:05 +0000)
Original commit message from CVS:
2004-02-15  Julien MOUTTE  <julien@moutte.net>

* gst/switch/gstswitch.c: (gst_switch_change_state),
(gst_switch_class_init): Cleaning the sinkpads correctly on state
change, mostly the EOS flag.

ChangeLog
gst/switch/gstswitch.c

index 9e88dce3190a95a70f70ffd783e89df4ce0adf69..2bc150773e81de4adbaab0fe82b0ef03e6e8e701 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-02-15  Julien MOUTTE  <julien@moutte.net>
+
+       * gst/switch/gstswitch.c: (gst_switch_change_state),
+       (gst_switch_class_init): Cleaning the sinkpads correctly on state
+       change, mostly the EOS flag.
+
 2004-02-15  Julien MOUTTE  <julien@moutte.net>
 
        * examples/gstplay/player.c: (got_eos), (main): Adding some 
index 67b14ff49138fc328a419f46592d9202a15e8bc1..1b1c88a489285ec184736eb72d2e94e246a4b8b3 100644 (file)
@@ -271,6 +271,54 @@ gst_switch_loop (GstElement *element)
   }
 }
 
+static GstElementStateReturn
+gst_switch_change_state (GstElement *element)
+{
+  GstSwitch *gstswitch;
+
+  gstswitch = GST_SWITCH (element);
+
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_NULL_TO_READY:
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+      break;
+    case GST_STATE_PAUSED_TO_PLAYING:
+      break;
+    case GST_STATE_PLAYING_TO_PAUSED:
+      {
+        GList *sinkpads = NULL;
+        
+        sinkpads = gstswitch->sinkpads;
+        
+        while (sinkpads) {
+          GstSwitchPad *switchpad = sinkpads->data;
+          
+          /* If a data is still stored in our structure we unref it */
+          if (switchpad->data) {
+            gst_data_unref (switchpad->data);
+            switchpad->data = NULL;
+          }
+          
+          switchpad->forwarded = FALSE;
+          switchpad->eos = FALSE;
+          
+          sinkpads = g_list_next (sinkpads);
+        }
+      }
+      break;
+    case GST_STATE_PAUSED_TO_READY:
+      break;
+    case GST_STATE_READY_TO_NULL:
+      break;
+  }
+
+  if (GST_ELEMENT_CLASS (parent_class)->change_state)
+    return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+  else 
+    return GST_STATE_SUCCESS;
+}
+
 /* =========================================== */
 /*                                             */
 /*                 Properties                  */
@@ -416,8 +464,8 @@ gst_switch_class_init (GstSwitchClass *klass)
   gobject_class->dispose = gst_switch_dispose;
   gobject_class->set_property = gst_switch_set_property;
   gobject_class->get_property = gst_switch_get_property;
-  /* FIXME: implement change state to unref all data from our sinkpad list on 
-     READY */
+  
+  gstelement_class->change_state = gst_switch_change_state;
   gstelement_class->request_new_pad = gst_switch_request_new_pad;
   gstelement_class->release_pad = gst_switch_release_pad;
 }