Various cleanups and leak fixage.
authorWim Taymans <wim.taymans@gmail.com>
Sat, 15 Dec 2001 22:37:35 +0000 (22:37 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Sat, 15 Dec 2001 22:37:35 +0000 (22:37 +0000)
Original commit message from CVS:
Various cleanups and leak fixage.

19 files changed:
gst/elements/gstfakesink.c
gst/elements/gstfakesink.h
gst/elements/gstfakesrc.c
gst/elements/gstfakesrc.h
gst/gst_private.h
gst/gstbin.c
gst/gstelement.c
gst/gstelementfactory.c
gst/gstobject.c
gst/gstpad.c
gst/gstpipeline.c
gst/gstpipeline.h
gst/gstplugin.c
gst/gstscheduler.h
gst/schedulers/gstbasicscheduler.c
plugins/elements/gstfakesink.c
plugins/elements/gstfakesink.h
plugins/elements/gstfakesrc.c
plugins/elements/gstfakesrc.h

index defca17..59a61b9 100644 (file)
@@ -134,8 +134,6 @@ gst_fakesink_init (GstFakeSink *fakesink)
   gst_element_add_pad (GST_ELEMENT (fakesink), pad);
   gst_pad_set_chain_function (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
 
-  fakesink->sinkpads = g_slist_prepend (NULL, pad);
-  fakesink->numsinkpads = 1;
   fakesink->silent = FALSE;
   fakesink->dump = FALSE;
 }
@@ -156,14 +154,11 @@ gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const
 
   fakesink = GST_FAKESINK (element);
 
-  name = g_strdup_printf ("sink%d", fakesink->numsinkpads);
+  name = g_strdup_printf ("sink%d", GST_ELEMENT (fakesink)->numsinkpads);
 
   sinkpad = gst_pad_new_from_template (templ, name);
   gst_element_add_pad (GST_ELEMENT (fakesink), sinkpad);
 
-  fakesink->sinkpads = g_slist_prepend (fakesink->sinkpads, sinkpad);
-  fakesink->numsinkpads++;
-
   return sinkpad;
 }
 
@@ -199,7 +194,7 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
   
   switch (prop_id) {
     case ARG_NUM_SINKS:
-      g_value_set_int (value, sink->numsinkpads);
+      g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
       break;
     case ARG_SILENT:
       g_value_set_boolean (value, sink->silent);
index 85aa9fb..4fea931 100644 (file)
@@ -54,8 +54,6 @@ typedef struct _GstFakeSinkClass GstFakeSinkClass;
 struct _GstFakeSink {
   GstElement element;
 
-  GSList *sinkpads;
-  gint numsinkpads;
   gboolean silent;
   gboolean dump;
 };
index 912157a..1319519 100644 (file)
@@ -256,18 +256,15 @@ gst_fakesrc_init (GstFakeSrc *fakesrc)
 {
   GstPad *pad;
 
-  // set the default number of 
-  fakesrc->numsrcpads = 1;
-
   // create our first output pad
   pad = gst_pad_new ("src", GST_PAD_SRC);
   gst_element_add_pad (GST_ELEMENT (fakesrc), pad);
-  fakesrc->srcpads = g_slist_append (NULL, pad);
 
   fakesrc->loop_based = FALSE;
   gst_fakesrc_update_functions (fakesrc);
 
   fakesrc->num_buffers = -1;
+  fakesrc->rt_num_buffers = -1;
   fakesrc->buffer_count = 0;
   fakesrc->silent = FALSE;
   fakesrc->dump = FALSE;
@@ -298,14 +295,11 @@ gst_fakesrc_request_new_pad (GstElement *element, GstPadTemplate *templ)
 
   fakesrc = GST_FAKESRC (element);
 
-  name = g_strdup_printf ("src%d", fakesrc->numsrcpads);
+  name = g_strdup_printf ("src%d", GST_ELEMENT (fakesrc)->numsrcpads);
 
   srcpad = gst_pad_new_from_template (templ, name);
   gst_element_add_pad (GST_ELEMENT (fakesrc), srcpad);
 
-  fakesrc->srcpads = g_slist_prepend (fakesrc->srcpads, srcpad);
-  fakesrc->numsrcpads++;
-
   return srcpad;
 }
 
@@ -340,7 +334,7 @@ gst_fakesrc_event_handler (GstPad *pad, GstEvent *event)
 static void
 gst_fakesrc_update_functions (GstFakeSrc *src)
 {
-  GSList *pads;
+  GList *pads;
 
   if (src->loop_based) {
     gst_element_set_loop_function (GST_ELEMENT (src), GST_DEBUG_FUNCPTR (gst_fakesrc_loop));
@@ -349,7 +343,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src)
     gst_element_set_loop_function (GST_ELEMENT (src), NULL);
   }
 
-  pads = src->srcpads;
+  pads = GST_ELEMENT (src)->pads;
   while (pads) {
     GstPad *pad = GST_PAD (pads->data);
 
@@ -361,7 +355,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src)
     }
 
     gst_pad_set_event_function (pad, gst_fakesrc_event_handler);
-    pads = g_slist_next (pads);
+    pads = g_list_next (pads);
   }
 }
 
@@ -456,7 +450,7 @@ gst_fakesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamS
    
   switch (prop_id) {
     case ARG_NUM_SOURCES:
-      g_value_set_int (value, src->numsrcpads);
+      g_value_set_int (value, GST_ELEMENT (src)->numsrcpads);
       break;
     case ARG_LOOP_BASED:
       g_value_set_boolean (value, src->loop_based);
@@ -656,14 +650,14 @@ gst_fakesrc_get(GstPad *pad)
     return GST_BUFFER(gst_event_new (GST_EVENT_FLUSH));
   }
 
-  if (src->num_buffers == 0) {
+  if (src->rt_num_buffers == 0) {
     g_print("fakesrc: sending EOS\n");
     gst_element_set_state (GST_ELEMENT (src), GST_STATE_PAUSED);
     return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
   }
   else {
-    if (src->num_buffers > 0)
-      src->num_buffers--;
+    if (src->rt_num_buffers > 0)
+      src->rt_num_buffers--;
   }
 
   if (src->eos) {
@@ -704,20 +698,20 @@ gst_fakesrc_loop(GstElement *element)
   src = GST_FAKESRC (element);
 
   do {
-    GSList *pads;
+    GList *pads;
 
-    pads = src->srcpads;
+    pads = GST_ELEMENT (src)->pads;
 
     while (pads) {
       GstPad *pad = GST_PAD (pads->data);
       GstBuffer *buf;
 
-      if (src->num_buffers == 0) {
+      if (src->rt_num_buffers == 0) {
        src->eos = TRUE;
       }
       else {
-        if (src->num_buffers > 0)
-          src->num_buffers--;
+        if (src->rt_num_buffers > 0)
+          src->rt_num_buffers--;
       }
 
       if (src->eos) {
@@ -737,7 +731,7 @@ gst_fakesrc_loop(GstElement *element)
                        buf, pad);
       gst_pad_push (pad, buf);
 
-      pads = g_slist_next (pads);
+      pads = g_list_next (pads);
     }
   } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element));
 }
@@ -751,14 +745,30 @@ gst_fakesrc_change_state (GstElement *element)
 
   fakesrc = GST_FAKESRC (element);
 
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_PAUSED_TO_READY:
+    case GST_STATE_NULL_TO_READY:
+      fakesrc->buffer_count = 0;
+      fakesrc->pattern_byte = 0x00;
+      fakesrc->need_flush = FALSE;
+      fakesrc->eos = FALSE;
+      fakesrc->rt_num_buffers = fakesrc->num_buffers;
+      if (fakesrc->parent) {
+        gst_buffer_unref (fakesrc->parent);
+        fakesrc->parent = NULL;
+      }
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+    case GST_STATE_PAUSED_TO_PLAYING:
+    case GST_STATE_PLAYING_TO_PAUSED:
+    case GST_STATE_READY_TO_NULL:
+      break;
+    default:
+      g_asset_not_reached ();
+      break;
+  }
+
   if (GST_STATE_PENDING (element) == GST_STATE_READY) {
-    fakesrc->buffer_count = 0;
-    fakesrc->pattern_byte = 0x00;
-    fakesrc->need_flush = FALSE;
-    if (fakesrc->parent) {
-      gst_buffer_unref (fakesrc->parent);
-      fakesrc->parent = NULL;
-    }
   }
 
   if (GST_ELEMENT_CLASS (parent_class)->change_state)
index 550015b..76503de 100644 (file)
@@ -85,8 +85,6 @@ struct _GstFakeSrc {
 
   gboolean     loop_based;
   gboolean     eos;
-  gint                 numsrcpads;
-  GSList       *srcpads;
 
   GstFakeSrcOutputType output;
   GstFakeSrcDataType data;
@@ -102,6 +100,7 @@ struct _GstFakeSrc {
   gchar        *pattern;
   GList        *patternlist;
   gint                 num_buffers;
+  gint                 rt_num_buffers; /* we are going to change this at runtime */
   guint64      buffer_count;
   gboolean     silent;
   gboolean     dump;
index 47deb53..446e42b 100644 (file)
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 
-/***** until we have gettext set up properly, don't even try this
-#ifdef ENABLE_NLS
-#include <libintl.h>
-#define _(String) dgettext(PACKAGE,String)
-#ifdef gettext_noop
-#define N_(String) gettext_noop(String)
-#else // gettext_noop 
-#define N_(String) (String)
-#endif // gettext_noop 
-#else // ENABLE_NLS 
-#define _(String) (String)
-#define N_(String) (String)
-#define textdomain(String) (String)
-#define gettext(String) (String)
-#define dgettext(Domain,String) (String)
-#define dcgettext(Domain,String,Type) (String)
-#define bindtextdomain(Domain,Directory) (Domain)
-#endif // ENABLE_NLS 
-*****/
+/***** until we have gettext set up properly, don't even try this*/
+#if 0
+# ifdef ENABLE_NLS
+#  include <libintl.h>
+#  define _(String) dgettext(PACKAGE,String)
+#  ifdef gettext_noop
+#   define N_(String) gettext_noop(String)
+#  else /* gettext_noop */
+#   define N_(String) (String)
+#  endif /* gettext_noop */
+# else /* ENABLE_NLS */
+#  define _(String) (String)
+#  define N_(String) (String)
+#  define textdomain(String) (String)
+#  define gettext(String) (String)
+#  define dgettext(Domain,String) (String)
+#  define dcgettext(Domain,String,Type) (String)
+#  define bindtextdomain(Domain,Directory) (Domain)
+# endif /* ENABLE_NLS */
+#endif
 
 #endif /* HAVE_CONFIG_H */
 
index 836404d..5d89c9c 100644 (file)
@@ -38,38 +38,36 @@ GstElementDetails gst_bin_details = {
 
 GType _gst_bin_type = 0;
 
-static void                    gst_bin_dispose         (GObject *object);
+static void                    gst_bin_dispose                 (GObject * object);
 
-static GstElementStateReturn   gst_bin_change_state            (GstElement *element);
-static GstElementStateReturn   gst_bin_change_state_norecurse  (GstBin *bin);
-static gboolean                        gst_bin_change_state_type       (GstBin *bin,
-                                                                GstElementState state,
-                                                                GType type);
-static void                    gst_bin_child_state_change      (GstBin *bin, GstElementState old, 
-                                                                GstElementState new, GstElement *child);
+static GstElementStateReturn   gst_bin_change_state            (GstElement * element);
+static GstElementStateReturn   gst_bin_change_state_norecurse  (GstBin * bin);
+static gboolean                gst_bin_change_state_type       (GstBin * bin, GstElementState state, GType type);
+static void                    gst_bin_child_state_change      (GstBin * bin, GstElementState old,
+                                                                GstElementState new, GstElement * element);
 
-static gboolean                        gst_bin_iterate_func            (GstBin *bin);
+static gboolean                gst_bin_iterate_func            (GstBin * bin);
 
 #ifndef GST_DISABLE_LOADSAVE
-static xmlNodePtr              gst_bin_save_thyself            (GstObject *object, xmlNodePtr parent);
-static void                    gst_bin_restore_thyself         (GstObject *object, xmlNodePtr self);
+static xmlNodePtr              gst_bin_save_thyself            (GstObject * object, xmlNodePtr parent);
+static void                    gst_bin_restore_thyself         (GstObject * object, xmlNodePtr self);
 #endif
 
 /* Bin signals and args */
-enum {
+enum
+{
   OBJECT_ADDED,
   LAST_SIGNAL
 };
 
-enum {
+enum
+{
   ARG_0,
   /* FILL ME */
 };
 
-
-static void gst_bin_class_init (GstBinClass *klass);
-static void gst_bin_init       (GstBin *bin);
-
+static void                    gst_bin_class_init              (GstBinClass * klass);
+static void                    gst_bin_init                    (GstBin * bin);
 
 static GstElementClass *parent_class = NULL;
 static guint gst_bin_signals[LAST_SIGNAL] = { 0 };
@@ -79,56 +77,55 @@ gst_bin_get_type (void)
 {
   if (!_gst_bin_type) {
     static const GTypeInfo bin_info = {
-      sizeof(GstBinClass),
+      sizeof (GstBinClass),
       NULL,
       NULL,
-      (GClassInitFunc)gst_bin_class_init,
+      (GClassInitFunc) gst_bin_class_init,
       NULL,
       NULL,
-      sizeof(GstBin),
+      sizeof (GstBin),
       8,
-      (GInstanceInitFunc)gst_bin_init,
+      (GInstanceInitFunc) gst_bin_init,
       NULL
     };
+
     _gst_bin_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBin", &bin_info, 0);
   }
   return _gst_bin_type;
 }
 
 static void
-gst_bin_class_init (GstBinClass *klass)
+gst_bin_class_init (GstBinClass * klass)
 {
   GObjectClass *gobject_class;
   GstObjectClass *gstobject_class;
   GstElementClass *gstelement_class;
 
-  gobject_class = (GObjectClass*)klass;
-  gstobject_class = (GstObjectClass*)klass;
-  gstelement_class = (GstElementClass*)klass;
+  gobject_class = (GObjectClass *) klass;
+  gstobject_class = (GstObjectClass *) klass;
+  gstelement_class = (GstElementClass *) klass;
 
   parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
 
   gst_bin_signals[OBJECT_ADDED] =
-    g_signal_new ("object_added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST,
-                    G_STRUCT_OFFSET (GstBinClass, object_added), NULL, NULL,
-                    gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1,
-                    GST_TYPE_ELEMENT);
-
-  klass->change_state_type =           GST_DEBUG_FUNCPTR (gst_bin_change_state_type);
-  klass->iterate =                     GST_DEBUG_FUNCPTR (gst_bin_iterate_func);
+    g_signal_new ("object_added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+                 G_STRUCT_OFFSET (GstBinClass, object_added), NULL, NULL,
+                 gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
 
+  gobject_class->dispose               = GST_DEBUG_FUNCPTR (gst_bin_dispose);
 #ifndef GST_DISABLE_LOADSAVE
-  gstobject_class->save_thyself =      GST_DEBUG_FUNCPTR (gst_bin_save_thyself);
-  gstobject_class->restore_thyself =   GST_DEBUG_FUNCPTR (gst_bin_restore_thyself);
+  gstobject_class->save_thyself        = GST_DEBUG_FUNCPTR (gst_bin_save_thyself);
+  gstobject_class->restore_thyself     = GST_DEBUG_FUNCPTR (gst_bin_restore_thyself);
 #endif
 
-  gstelement_class->change_state =     GST_DEBUG_FUNCPTR (gst_bin_change_state);
+  gstelement_class->change_state       = GST_DEBUG_FUNCPTR (gst_bin_change_state);
 
-  gobject_class->dispose =             GST_DEBUG_FUNCPTR (gst_bin_dispose);
+  klass->change_state_type             = GST_DEBUG_FUNCPTR (gst_bin_change_state_type);
+  klass->iterate                       = GST_DEBUG_FUNCPTR (gst_bin_iterate_func);
 }
 
 static void
-gst_bin_init (GstBin *bin)
+gst_bin_init (GstBin * bin)
 {
   /* in general, we prefer to use cothreads for most things */
   GST_FLAG_SET (bin, GST_BIN_FLAG_PREFER_COTHREADS);
@@ -146,36 +143,36 @@ gst_bin_init (GstBin *bin)
  *
  * Returns: new bin
  */
-GstElement*
-gst_bin_new (const gchar *name)
+GstElement *
+gst_bin_new (const gchar * name)
 {
   return gst_elementfactory_make ("bin", name);
 }
 
 static inline void
-gst_bin_reset_element_sched (GstElement *element, GstScheduler *sched)
+gst_bin_reset_element_sched (GstElement * element, GstScheduler * sched)
 {
   GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "resetting element's scheduler");
 
-  gst_element_set_sched (element,sched);
+  gst_element_set_sched (element, sched);
 }
 
 static void
-gst_bin_set_element_sched (GstElement *element,GstScheduler *sched)
+gst_bin_set_element_sched (GstElement * element, GstScheduler * sched)
 {
   GList *children;
   GstElement *child;
 
   g_return_if_fail (element != NULL);
-  g_return_if_fail (GST_IS_ELEMENT(element));
+  g_return_if_fail (GST_IS_ELEMENT (element));
   g_return_if_fail (sched != NULL);
-  g_return_if_fail (GST_IS_SCHEDULER(sched));
+  g_return_if_fail (GST_IS_SCHEDULER (sched));
 
-  GST_INFO (GST_CAT_SCHEDULING, "setting element \"%s\" sched to %p",GST_ELEMENT_NAME(element),
-            sched);
+  GST_INFO (GST_CAT_SCHEDULING, "setting element \"%s\" sched to %p", GST_ELEMENT_NAME (element),
+           sched);
 
   /* if it's actually a Bin */
-  if (GST_IS_BIN(element)) {
+  if (GST_IS_BIN (element)) {
     if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
       GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not resetting");
       return;
@@ -185,59 +182,58 @@ gst_bin_set_element_sched (GstElement *element,GstScheduler *sched)
     gst_scheduler_add_element (sched, element);
 
     /* set the children's schedule */
-    children = GST_BIN(element)->children;
+    children = GST_BIN (element)->children;
     while (children) {
       child = GST_ELEMENT (children->data);
-      children = g_list_next(children);
+      children = g_list_next (children);
 
       gst_bin_set_element_sched (child, sched);
     }
 
+  }
   /* otherwise, if it's just a regular old element */
-  else {
+  else {
     gst_scheduler_add_element (sched, element);
   }
 }
 
 
 static void
-gst_bin_unset_element_sched (GstElement *element)
+gst_bin_unset_element_sched (GstElement * element)
 {
   GList *children;
   GstElement *child;
 
   g_return_if_fail (element != NULL);
-  g_return_if_fail (GST_IS_ELEMENT(element));
+  g_return_if_fail (GST_IS_ELEMENT (element));
 
   GST_INFO (GST_CAT_SCHEDULING, "removing element \"%s\" from it sched %p",
-            GST_ELEMENT_NAME(element),GST_ELEMENT_SCHED(element));
+           GST_ELEMENT_NAME (element), GST_ELEMENT_SCHED (element));
 
   /* if it's actually a Bin */
-  if (GST_IS_BIN(element)) {
+  if (GST_IS_BIN (element)) {
 
-    if (GST_FLAG_IS_SET(element,GST_BIN_FLAG_MANAGER)) {
-      GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not unsetting sched");
+    if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
+      GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element,
+                       "child is already a manager, not unsetting sched");
       return;
     }
 
-    /* FIXME this check should be irrelevant */
-    if (GST_ELEMENT_SCHED (element))
-      gst_scheduler_remove_element (GST_ELEMENT_SCHED(element), element);
+    gst_scheduler_remove_element (GST_ELEMENT_SCHED (element), element);
 
     /* for each child, remove them from their schedule */
-    children = GST_BIN(element)->children;
+    children = GST_BIN (element)->children;
     while (children) {
       child = GST_ELEMENT (children->data);
-      children = g_list_next(children);
+      children = g_list_next (children);
 
       gst_bin_unset_element_sched (child);
     }
 
+  }
   /* otherwise, if it's just a regular old element */
-  } else {
-    /* FIXME this check should be irrelevant */
-    if (GST_ELEMENT_SCHED (element))
-      gst_scheduler_remove_element (GST_ELEMENT_SCHED(element), element);
+  else {
+    gst_scheduler_remove_element (GST_ELEMENT_SCHED (element), element);
   }
 }
 
@@ -251,8 +247,7 @@ gst_bin_unset_element_sched (GstElement *element)
  * add a reference.
  */
 void
-gst_bin_add (GstBin *bin,
-            GstElement *element)
+gst_bin_add (GstBin * bin, GstElement * element)
 {
   gint state_idx = 0;
   GstElementState state;
@@ -263,7 +258,7 @@ gst_bin_add (GstBin *bin,
   g_return_if_fail (GST_IS_ELEMENT (element));
 
   GST_DEBUG (GST_CAT_PARENTAGE, "adding element \"%s\" to bin \"%s\"\n",
-             GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin));
+            GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin));
 
   /* must be not be in PLAYING state in order to modify bin */
   g_return_if_fail (GST_STATE (bin) != GST_STATE_PLAYING);
@@ -272,24 +267,26 @@ gst_bin_add (GstBin *bin,
   g_return_if_fail (GST_ELEMENT_PARENT (element) == NULL);
 
   /* then check to see if the element's name is already taken in the bin */
-  g_return_if_fail (gst_object_check_uniqueness (bin->children, GST_ELEMENT_NAME (element)) == TRUE);
+  g_return_if_fail (gst_object_check_uniqueness (bin->children, GST_ELEMENT_NAME (element)) ==
+                   TRUE);
 
   /* set the element's parent and add the element to the bin's list of children */
   gst_object_set_parent (GST_OBJECT (element), GST_OBJECT (bin));
-  g_signal_connect_swapped (G_OBJECT (element), "state_change", gst_bin_child_state_change, G_OBJECT (bin));
+  g_signal_connect_swapped (G_OBJECT (element), "state_change",
+                           G_CALLBACK (gst_bin_child_state_change), G_OBJECT (bin));
 
   bin->children = g_list_append (bin->children, element);
   bin->numchildren++;
 
   /* bump our internal state counter */
   state = GST_STATE (element);
-  while (state>>=1) state_idx++;
+  while (state >>= 1) state_idx++;
   bin->child_states[state_idx]++;
 
-  /* now we have to deal with manager stuff */
-  /* we can only do this if there's a scheduler: */
-  /* if we're not a manager, and aren't attached to anything, we have no sched (yet) */
-  if (GST_IS_BIN(element) && GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
+  /* now we have to deal with manager stuff 
+   * we can only do this if there's a scheduler: 
+   * if we're not a manager, and aren't attached to anything, we have no sched (yet) */
+  if (GST_IS_BIN (element) && GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
     GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is a manager");
   }
   else if (GST_ELEMENT_SCHED (bin) != NULL) {
@@ -309,11 +306,11 @@ gst_bin_add (GstBin *bin,
  * Remove the element from its associated bin, unparenting as well.
  */
 void
-gst_bin_remove (GstBin *bin,
-               GstElement *element)
+gst_bin_remove (GstBin * bin, GstElement * element)
 {
   gint state_idx = 0;
   GstElementState state;
+  gint sig;
 
   g_return_if_fail (bin != NULL);
   g_return_if_fail (GST_IS_BIN (bin));
@@ -325,14 +322,17 @@ gst_bin_remove (GstBin *bin,
   g_return_if_fail (GST_STATE (bin) != GST_STATE_PLAYING);
 
   /* the element must have its parent set to the current bin */
-  g_return_if_fail (GST_ELEMENT_PARENT(element) == (GstObject *)bin);
+  g_return_if_fail (GST_ELEMENT_PARENT (element) == (GstObject *) bin);
 
   /* the element must be in the bin's list of children */
-  if (g_list_find(bin->children, element) == NULL) {
-    /* FIXME this should be a warning!!! */
-    GST_ERROR_OBJECT(bin,element,"no such element in bin");
+  if (g_list_find (bin->children, element) == NULL) {
+    g_warning ("no element \"%s\" in bin \"%s\"\n", GST_ELEMENT_NAME (element),
+              GST_ELEMENT_NAME (bin));
     return;
   }
+  sig = g_signal_handlers_disconnect_matched (G_OBJECT (element),
+                                             G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL,
+                                             gst_bin_child_state_change, bin);
 
   /* remove this element from the list of managed elements */
   gst_bin_unset_element_sched (element);
@@ -343,7 +343,7 @@ gst_bin_remove (GstBin *bin,
 
   /* bump our internal state counter */
   state = GST_STATE (element);
-  while (state>>=1) state_idx++;
+  while (state >>= 1) state_idx++;
   bin->child_states[state_idx]--;
 
   GST_INFO_ELEMENT (GST_CAT_PARENTAGE, bin, "removed child %s", GST_ELEMENT_NAME (element));
@@ -356,38 +356,39 @@ gst_bin_remove (GstBin *bin,
 }
 
 static void
-gst_bin_child_state_change (GstBin *bin, GstElementState old, GstElementState new, GstElement *child)
+gst_bin_child_state_change (GstBin * bin, GstElementState old, GstElementState new,
+                           GstElement * child)
 {
   gint old_idx = 0, new_idx = 0, i;
 
-  GST_INFO (GST_CAT_STATES, "child %s changed state in bin %s from %s to %s", 
-                 GST_ELEMENT_NAME (child), GST_ELEMENT_NAME (bin),
-                 gst_element_statename (old), gst_element_statename (new));
+  GST_INFO (GST_CAT_STATES, "child %s changed state in bin %s from %s to %s",
+           GST_ELEMENT_NAME (child), GST_ELEMENT_NAME (bin),
+           gst_element_statename (old), gst_element_statename (new));
 
-  while (old>>=1) old_idx++;
-  while (new>>=1) new_idx++;
+  while (old >>= 1) old_idx++;
+  while (new >>= 1) new_idx++;
 
   GST_LOCK (bin);
   bin->child_states[old_idx]--;
   bin->child_states[new_idx]++;
 
-  for (i = GST_NUM_STATES-1; i >= 0; i--) {
+  for (i = GST_NUM_STATES - 1; i >= 0; i--) {
     if (bin->child_states[i] != 0) {
       if (GST_STATE (bin) != (1 << i)) {
-        GST_INFO (GST_CAT_STATES, "bin %s need state change to %s", 
-                       GST_ELEMENT_NAME (bin), gst_element_statename (1<<i));
-        GST_STATE_PENDING (bin) = (1<<i);
+       GST_INFO (GST_CAT_STATES, "bin %s need state change to %s",
+                 GST_ELEMENT_NAME (bin), gst_element_statename (1 << i));
+       GST_STATE_PENDING (bin) = (1 << i);
        gst_bin_change_state_norecurse (bin);
       }
       break;
     }
   }
-         
+
   GST_UNLOCK (bin);
 }
 
 static GstElementStateReturn
-gst_bin_change_state (GstElement *element)
+gst_bin_change_state (GstElement * element)
 {
   GstBin *bin;
   GList *children;
@@ -404,8 +405,7 @@ gst_bin_change_state (GstElement *element)
   pending = GST_STATE_PENDING (element);
 
   GST_INFO_ELEMENT (GST_CAT_STATES, element, "changing childrens' state from %s to %s",
-                gst_element_statename (old_state),
-                gst_element_statename (pending));
+                   gst_element_statename (old_state), gst_element_statename (pending));
 
   children = bin->children;
   while (children) {
@@ -414,25 +414,25 @@ gst_bin_change_state (GstElement *element)
 
     switch (gst_element_set_state (child, pending)) {
       case GST_STATE_FAILURE:
-        GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
-        GST_DEBUG (GST_CAT_STATES,"child '%s' failed to go to state %d(%s)\n", GST_ELEMENT_NAME (child),
-              pending, gst_element_statename (pending));
+       GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
+       GST_DEBUG (GST_CAT_STATES, "child '%s' failed to go to state %d(%s)\n",
+                  GST_ELEMENT_NAME (child), pending, gst_element_statename (pending));
 
        gst_element_set_state (child, old_state);
        if (GST_ELEMENT_SCHED (child) == GST_ELEMENT_SCHED (element)) {
-          return GST_STATE_FAILURE;
+         return GST_STATE_FAILURE;
        }
-        break;
+       break;
       case GST_STATE_ASYNC:
-        GST_DEBUG (GST_CAT_STATES,"child '%s' is changing state asynchronously\n", GST_ELEMENT_NAME (child));
+       GST_DEBUG (GST_CAT_STATES, "child '%s' is changing state asynchronously\n",
+                  GST_ELEMENT_NAME (child));
        have_async = TRUE;
-        break;
+       break;
     }
   }
 
   GST_INFO_ELEMENT (GST_CAT_STATES, element, "done changing bin's state from %s to %s",
-                gst_element_statename (old_state),
-                gst_element_statename (pending));
+                   gst_element_statename (old_state), gst_element_statename (pending));
 
   if (have_async)
     ret = GST_STATE_ASYNC;
@@ -444,19 +444,18 @@ gst_bin_change_state (GstElement *element)
 
 
 static GstElementStateReturn
-gst_bin_change_state_norecurse (GstBin *bin)
+gst_bin_change_state_norecurse (GstBin * bin)
 {
   if (GST_ELEMENT_CLASS (parent_class)->change_state) {
     GST_DEBUG_ELEMENT (GST_CAT_STATES, bin, "setting bin's own state\n");
     return GST_ELEMENT_CLASS (parent_class)->change_state (GST_ELEMENT (bin));
-  } else
+  }
+  else
     return GST_STATE_FAILURE;
 }
 
 static gboolean
-gst_bin_change_state_type (GstBin *bin,
-                           GstElementState state,
-                           GType type)
+gst_bin_change_state_type (GstBin * bin, GstElementState state, GType type)
 {
   GList *children;
   GstElement *child;
@@ -468,11 +467,12 @@ gst_bin_change_state_type (GstBin *bin,
   while (children) {
     child = GST_ELEMENT (children->data);
     if (GST_IS_BIN (child)) {
-      if (!gst_bin_set_state_type (GST_BIN (child), state,type))
-        return FALSE;
-    } else if (G_TYPE_CHECK_INSTANCE_TYPE (child,type)) {
-      if (!gst_element_set_state (child,state))
-        return FALSE;
+      if (!gst_bin_set_state_type (GST_BIN (child), state, type))
+       return FALSE;
+    }
+    else if (G_TYPE_CHECK_INSTANCE_TYPE (child, type)) {
+      if (!gst_element_set_state (child, state))
+       return FALSE;
     }
     children = g_list_next (children);
   }
@@ -493,45 +493,41 @@ gst_bin_change_state_type (GstBin *bin,
  * Returns: indication if the state change was successfull
  */
 gboolean
-gst_bin_set_state_type (GstBin *bin,
-                        GstElementState state,
-                        GType type)
+gst_bin_set_state_type (GstBin * bin, GstElementState state, GType type)
 {
   GstBinClass *oclass;
 
-  GST_DEBUG (GST_CAT_STATES,"gst_bin_set_state_type(\"%s\",%d,%d)\n",
-          GST_ELEMENT_NAME (bin), state,type);
+  GST_DEBUG (GST_CAT_STATES, "gst_bin_set_state_type(\"%s\",%d,%d)\n",
+            GST_ELEMENT_NAME (bin), state, type);
 
   g_return_val_if_fail (bin != NULL, FALSE);
   g_return_val_if_fail (GST_IS_BIN (bin), FALSE);
 
-  oclass = GST_BIN_CLASS (G_OBJECT_GET_CLASS(bin));
+  oclass = GST_BIN_CLASS (G_OBJECT_GET_CLASS (bin));
 
   if (oclass->change_state_type)
-    (oclass->change_state_type) (bin,state,type);
+    (oclass->change_state_type) (bin, state, type);
   return TRUE;
 }
 
 static void
-gst_bin_dispose (GObject *object)
+gst_bin_dispose (GObject * object)
 {
   GstBin *bin = GST_BIN (object);
   GList *children, *orig;
   GstElement *child;
 
-  GST_DEBUG (GST_CAT_REFCOUNTING,"dispose\n");
+  GST_DEBUG (GST_CAT_REFCOUNTING, "dispose\n");
 
   if (bin->children) {
     orig = children = g_list_copy (bin->children);
     while (children) {
       child = GST_ELEMENT (children->data);
-      /* gst_object_unref (GST_OBJECT (child)); */
-      /* gst_object_unparent (GST_OBJECT (child)); */
       gst_bin_remove (bin, child);
       children = g_list_next (children);
     }
-    g_list_free (orig);
     g_list_free (bin->children);
+    g_list_free (orig);
   }
   bin->children = NULL;
   bin->numchildren = 0;
@@ -550,9 +546,8 @@ gst_bin_dispose (GObject *object)
  *
  * Returns: the element with the given name
  */
-GstElement*
-gst_bin_get_by_name (GstBin *bin,
-                    const gchar *name)
+GstElement *
+gst_bin_get_by_name (GstBin * bin, const gchar * name)
 {
   GList *children;
   GstElement *child;
@@ -566,12 +561,13 @@ gst_bin_get_by_name (GstBin *bin,
   children = bin->children;
   while (children) {
     child = GST_ELEMENT (children->data);
-    if (!strcmp (GST_OBJECT_NAME(child),name))
+    if (!strcmp (GST_OBJECT_NAME (child), name))
       return child;
     if (GST_IS_BIN (child)) {
       GstElement *res = gst_bin_get_by_name (GST_BIN (child), name);
+
       if (res)
-        return res;
+       return res;
     }
     children = g_list_next (children);
   }
@@ -589,9 +585,8 @@ gst_bin_get_by_name (GstBin *bin,
  *
  * Returns: the element with the given name
  */
-GstElement*
-gst_bin_get_by_name_recurse_up (GstBin *bin,
-                               const gchar *name)
+GstElement *
+gst_bin_get_by_name_recurse_up (GstBin * bin, const gchar * name)
 {
   GstElement *result = NULL;
   GstObject *parent;
@@ -602,13 +597,12 @@ gst_bin_get_by_name_recurse_up (GstBin *bin,
 
   result = gst_bin_get_by_name (bin, name);
 
-  if (result)
-    return result;
-
-  parent = gst_object_get_parent (GST_OBJECT (bin));
+  if (!result) {
+    parent = gst_object_get_parent (GST_OBJECT (bin));
 
-  if (parent && GST_IS_BIN (parent)) {
-    result = gst_bin_get_by_name_recurse_up (GST_BIN (parent), name);
+    if (parent && GST_IS_BIN (parent)) {
+      result = gst_bin_get_by_name_recurse_up (GST_BIN (parent), name);
+    }
   }
 
   return result;
@@ -622,8 +616,8 @@ gst_bin_get_by_name_recurse_up (GstBin *bin,
  *
  * Returns: a GList of elements
  */
-GList*
-gst_bin_get_list (GstBin *bin)
+GList *
+gst_bin_get_list (GstBin * bin)
 {
   g_return_val_if_fail (bin != NULL, NULL);
   g_return_val_if_fail (GST_IS_BIN (bin), NULL);
@@ -633,8 +627,7 @@ gst_bin_get_list (GstBin *bin)
 
 #ifndef GST_DISABLE_LOADSAVE
 static xmlNodePtr
-gst_bin_save_thyself (GstObject *object,
-                     xmlNodePtr parent)
+gst_bin_save_thyself (GstObject * object, xmlNodePtr parent)
 {
   GstBin *bin = GST_BIN (object);
   xmlNodePtr childlist, elementnode;
@@ -659,8 +652,7 @@ gst_bin_save_thyself (GstObject *object,
 }
 
 static void
-gst_bin_restore_thyself (GstObject *object,
-                        xmlNodePtr self)
+gst_bin_restore_thyself (GstObject * object, xmlNodePtr self)
 {
   GstBin *bin = GST_BIN (object);
   xmlNodePtr field = self->xmlChildrenNode;
@@ -671,12 +663,12 @@ gst_bin_restore_thyself (GstObject *object,
       GST_INFO_ELEMENT (GST_CAT_XML, GST_ELEMENT (object), "loading children");
       childlist = field->xmlChildrenNode;
       while (childlist) {
-        if (!strcmp (childlist->name, "element")) {
-          GstElement *element = gst_element_restore_thyself (childlist, GST_OBJECT (bin));
+       if (!strcmp (childlist->name, "element")) {
+         GstElement *element = gst_element_restore_thyself (childlist, GST_OBJECT (bin));
 
          gst_bin_add (bin, element);
        }
-        childlist = childlist->next;
+       childlist = childlist->next;
       }
     }
 
@@ -686,12 +678,13 @@ gst_bin_restore_thyself (GstObject *object,
 #endif /* GST_DISABLE_LOADSAVE */
 
 static gboolean
-gst_bin_iterate_func (GstBin *bin)
+gst_bin_iterate_func (GstBin * bin)
 {
   /* only iterate if this is the manager bin */
-  if (GST_ELEMENT_SCHED(bin)->parent == GST_ELEMENT (bin)) {
-    return gst_scheduler_iterate (GST_ELEMENT_SCHED(bin));
-  } else {
+  if (GST_ELEMENT_SCHED (bin)->parent == GST_ELEMENT (bin)) {
+    return gst_scheduler_iterate (GST_ELEMENT_SCHED (bin));
+  }
+  else {
     g_warning ("bin \"%d\" can't be iterated on!\n", GST_ELEMENT_NAME (bin));
   }
 
@@ -708,24 +701,24 @@ gst_bin_iterate_func (GstBin *bin)
  *          can be used to determine it the bin is in EOS.
  */
 gboolean
-gst_bin_iterate (GstBin *bin)
+gst_bin_iterate (GstBin * bin)
 {
   GstBinClass *oclass;
   gboolean running = TRUE;
 
-  GST_DEBUG_ENTER("(\"%s\")",GST_ELEMENT_NAME (bin));
+  GST_DEBUG_ENTER ("(\"%s\")", GST_ELEMENT_NAME (bin));
 
-  oclass = GST_BIN_CLASS (G_OBJECT_GET_CLASS(bin));
+  oclass = GST_BIN_CLASS (G_OBJECT_GET_CLASS (bin));
 
   if (oclass->iterate)
     running = (oclass->iterate) (bin);
 
-  GST_DEBUG_LEAVE("(\"%s\") %d",GST_ELEMENT_NAME (bin), running);
+  GST_DEBUG_LEAVE ("(\"%s\") %d", GST_ELEMENT_NAME (bin), running);
 
   if (!running) {
     if (GST_STATE (bin) == GST_STATE_PLAYING && GST_STATE_PENDING (bin) == GST_STATE_VOID_PENDING) {
-      GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, bin, "waiting for child shutdown after useless iteration\n");
-      /* gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED); */
+      GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, bin,
+                        "waiting for child shutdown after useless iteration\n");
       gst_element_wait_state_change (GST_ELEMENT (bin));
       GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, bin, "child shutdown\n");
     }
@@ -733,4 +726,3 @@ gst_bin_iterate (GstBin *bin)
 
   return running;
 }
-
index 6d3d4e1..028a809 100644 (file)
@@ -327,7 +327,9 @@ gst_element_remove_pad (GstElement *element, GstPad *pad)
 
   g_signal_emit (G_OBJECT (element), gst_element_signals[PAD_REMOVED], 0, pad);
 
+  //gst_object_ref (GST_OBJECT (pad));
   gst_object_unparent (GST_OBJECT (pad));
+  //gst_object_unref (GST_OBJECT (pad));
 }
 
 /**
@@ -970,22 +972,19 @@ static void
 gst_element_dispose (GObject *object)
 {
   GstElement *element = GST_ELEMENT (object);
-  GList *pads;
+  GList *pads, *test;
   GstPad *pad;
+  gint i;
   
   GST_DEBUG_ELEMENT (GST_CAT_REFCOUNTING, element, "dispose\n");
 
-  if (GST_IS_BIN (GST_OBJECT_PARENT (element)))
-    gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (element)), element);
-
-
+  /* first we break all our connections with the ouside */
   if (element->pads) {
     GList *orig;
     orig = pads = g_list_copy (element->pads);
     while (pads) {
       pad = GST_PAD (pads->data);
-      /* the gst_object_unparent will do the unreffing */
-      gst_element_remove_pad(element, pad);
+      gst_object_destroy (GST_OBJECT (pad));
       pads = g_list_next (pads);
     }
     g_list_free (orig);
@@ -995,6 +994,7 @@ gst_element_dispose (GObject *object)
 
   element->numsrcpads = 0;
   element->numsinkpads = 0;
+  element->numpads = 0;
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
index 08ab2e6..03c4517 100644 (file)
@@ -250,12 +250,12 @@ gst_elementfactory_create (GstElementFactory *factory,
   if (oclass->elementfactory == NULL) {
     GST_DEBUG (GST_CAT_ELEMENTFACTORY,"class %s\n", GST_OBJECT_NAME (factory));
     oclass->elementfactory = factory;
+
+    // copy pad template pointers to the element class
+    oclass->padtemplates = g_list_copy(factory->padtemplates);
+    oclass->numpadtemplates = factory->numpadtemplates;
   }
   
-  /* copy pad template pointers to the element class */
-  oclass->padtemplates = g_list_copy(factory->padtemplates);
-  oclass->numpadtemplates = factory->numpadtemplates;
-  
   gst_object_set_name (GST_OBJECT (element),name);
 
   return element;
index 7d6ae43..f7a34a0 100644 (file)
@@ -218,9 +218,7 @@ gst_object_destroy (GstObject *object)
     /* need to hold a reference count around all class method
      * invocations.
      */
-    gst_object_ref (object);
-    G_OBJECT_GET_CLASS (object)->dispose (G_OBJECT (object));
-    gst_object_unref (object);
+    g_object_run_dispose (G_OBJECT (object));
   }
 }
 
@@ -238,12 +236,12 @@ gst_object_dispose (GObject *object)
 static void
 gst_object_finalize (GObject *object)
 {
-  GstObject *gstobject;
-
-  gstobject = GST_OBJECT (object);
+  GstObject *gstobject = GST_OBJECT (object);
 
   GST_DEBUG (GST_CAT_REFCOUNTING, "finalize '%s'\n",GST_OBJECT_NAME(object));
 
+  g_signal_handlers_destroy (object);
+
   if (gstobject->name != NULL)
     g_free (gstobject->name);
 
index 9a21bbb..f2d3191 100644 (file)
@@ -533,14 +533,14 @@ gst_pad_disconnect (GstPad *srcpad,
   GST_RPAD_PEER(realsrc) = NULL;
   GST_RPAD_PEER(realsink) = NULL;
 
+  // now tell the scheduler
+  if (realsrc->sched)
+    gst_scheduler_pad_disconnect (realsrc->sched, (GstPad *)realsrc, (GstPad *)realsink);
+
   /* fire off a signal to each of the pads telling them that they've been disconnected */
   g_signal_emit(G_OBJECT(realsrc), gst_real_pad_signals[REAL_DISCONNECTED], 0, realsink);
   g_signal_emit(G_OBJECT(realsink), gst_real_pad_signals[REAL_DISCONNECTED], 0, realsrc);
 
-  /* now tell the scheduler */
-  if (realsrc->sched)
-    gst_scheduler_pad_connect (realsrc->sched, (GstPad *)realsrc, (GstPad *)realsink);
-
   GST_INFO (GST_CAT_ELEMENT_PADS, "disconnected %s:%s and %s:%s",
             GST_DEBUG_PAD_NAME(srcpad), GST_DEBUG_PAD_NAME(sinkpad));
 }
@@ -853,7 +853,7 @@ gst_pad_set_caps (GstPad *pad,
   if (!gst_caps_check_compatibility (caps, gst_pad_get_padtemplate_caps (pad))) {
     g_warning ("pad %s:%s tried to set caps incompatible with its padtemplate\n",
                    GST_DEBUG_PAD_NAME (pad));
-    /* return FALSE; */
+    return FALSE;
   }
   
   oldcaps = GST_PAD_CAPS (pad);
index 3cbd335..0a70f22 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-/* #define GST_DEBUG_ENABLED */
 #include "gst_private.h"
 
 #include "gstpipeline.h"
-#include "gstthread.h"
-#include "gstutils.h"
-#include "gsttype.h"
-#include "gstautoplug.h"
 #include "gstscheduler.h"
 
-
 GstElementDetails gst_pipeline_details = {
   "Pipeline object",
   "Bin",
@@ -55,6 +49,8 @@ enum {
 static void                    gst_pipeline_class_init         (GstPipelineClass *klass);
 static void                    gst_pipeline_init               (GstPipeline *pipeline);
 
+static void                     gst_pipeline_dispose           (GObject *object);
+
 static GstElementStateReturn   gst_pipeline_change_state       (GstElement *element);
 
 static GstBinClass *parent_class = NULL;
@@ -85,13 +81,17 @@ gst_pipeline_get_type (void) {
 static void
 gst_pipeline_class_init (GstPipelineClass *klass)
 {
+  GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
 
+  gobject_class = (GObjectClass *)klass;
   gstelement_class = (GstElementClass*)klass;
 
   parent_class = g_type_class_ref (gst_bin_get_type ());
 
-  gstelement_class->change_state = gst_pipeline_change_state;
+  gobject_class->dispose               = GST_DEBUG_FUNCPTR (gst_pipeline_dispose);
+
+  gstelement_class->change_state       = GST_DEBUG_FUNCPTR (gst_pipeline_change_state);
 }
 
 static void
@@ -101,9 +101,22 @@ gst_pipeline_init (GstPipeline *pipeline)
   GST_FLAG_SET (pipeline, GST_BIN_FLAG_MANAGER);
 
   GST_ELEMENT_SCHED (pipeline) = gst_schedulerfactory_make ("basic", GST_ELEMENT (pipeline));
+
+  gst_object_ref (GST_OBJECT (GST_ELEMENT_SCHED (pipeline)));
+  gst_object_sink (GST_OBJECT (GST_ELEMENT_SCHED (pipeline)));
+
   GST_DEBUG (GST_CAT_PIPELINE, "pipeline's scheduler is %p\n", GST_ELEMENT_SCHED (pipeline));
 }
 
+static void
+gst_pipeline_dispose (GObject *object)
+{
+  GstPipeline *pipeline = GST_PIPELINE (object);
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+
+  gst_object_unref (GST_OBJECT (GST_ELEMENT_SCHED (pipeline)));
+}
 
 /**
  * gst_pipeline_new:
index 04a4170..3c0dbf0 100644 (file)
 
 #include <gst/gstbin.h>
 
-
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
 
 extern GstElementDetails gst_pipeline_details;
 
-
 #define GST_TYPE_PIPELINE \
   (gst_pipeline_get_type())
 #define GST_PIPELINE(obj) \
index c582a25..664770d 100644 (file)
@@ -63,6 +63,7 @@ _gst_plugin_initialize (void)
 {
 #ifndef GST_DISABLE_REGISTRY
   xmlDocPtr doc;
+  xmlNodePtr root;
 #endif
 
   main_module =  g_module_open (NULL, G_MODULE_BIND_LAZY);
index 955ee58..e9a5f35 100644 (file)
@@ -82,6 +82,8 @@ struct _GstSchedulerClass {
 
 GType                  gst_scheduler_get_type          (void);
 
+#define                gst_scheduler_destroy(sched)    gst_object_destroy(GST_OBJECT(sched))
+
 void                   gst_scheduler_add_element       (GstScheduler *sched, GstElement *element);
 void                   gst_scheduler_remove_element    (GstScheduler *sched, GstElement *element);
 void                   gst_scheduler_enable_element    (GstScheduler *sched, GstElement *element);
index dc10e4a..4cb0b88 100644 (file)
@@ -44,6 +44,8 @@ static GType _gst_basic_scheduler_type = 0;
 static void    gst_basic_scheduler_class_init          (GstSchedulerClass * klass);
 static void    gst_basic_scheduler_init                (GstScheduler * scheduler);
 
+static void    gst_basic_scheduler_dispose             (GObject *object);
+
 static void    gst_basic_scheduler_add_element         (GstScheduler *sched, GstElement *element);
 static void     gst_basic_scheduler_remove_element     (GstScheduler *sched, GstElement *element);
 static void     gst_basic_scheduler_enable_element     (GstScheduler *sched, GstElement *element);
@@ -92,6 +94,8 @@ gst_basic_scheduler_class_init (GstSchedulerClass * klass)
 
   parent_class = g_type_class_ref (GST_TYPE_SCHEDULER);
 
+  gobject_class->dispose       = GST_DEBUG_FUNCPTR (gst_basic_scheduler_dispose);
+
   klass->add_element           = GST_DEBUG_FUNCPTR (gst_basic_scheduler_add_element);
   klass->remove_element        = GST_DEBUG_FUNCPTR (gst_basic_scheduler_remove_element);
   klass->enable_element        = GST_DEBUG_FUNCPTR (gst_basic_scheduler_enable_element);
@@ -109,6 +113,12 @@ gst_basic_scheduler_init (GstScheduler *scheduler)
 {
 }
 
+static void
+gst_basic_scheduler_dispose (GObject *object)
+{
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
 static gboolean
 plugin_init (GModule *module, GstPlugin *plugin)
 {
@@ -551,16 +561,17 @@ gst_basic_scheduler_chain_destroy (GstSchedulerChain * chain)
   GstScheduler *sched = chain->sched;
 
   // remove the chain from the schedulers' list of chains
-  chain->sched->chains = g_list_remove (chain->sched->chains, chain);
-  chain->sched->num_chains--;
+  sched->chains = g_list_remove (sched->chains, chain);
+  sched->num_chains--;
 
   // destroy the chain
   g_list_free (chain->disabled);       // should be empty...
   g_list_free (chain->elements);       // ditto
-  g_free (chain);
 
   GST_INFO (GST_CAT_SCHEDULING, "destroyed chain %p, now are %d chains in sched %p", chain,
            sched->num_chains, sched);
+
+  g_free (chain);
 }
 
 static void
@@ -946,11 +957,11 @@ gst_basic_scheduler_pad_disconnect (GstScheduler * sched, GstPad * srcpad, GstPa
   if (chain) {
     GST_INFO (GST_CAT_SCHEDULING, "destroying chain");
     gst_basic_scheduler_chain_destroy (chain);
-  }
 
-  // now create a new chain to hold element1 and build it from scratch
-  chain1 = gst_basic_scheduler_chain_new (sched);
-  gst_basic_scheduler_chain_recursive_add (chain1, element1);
+    // now create a new chain to hold element1 and build it from scratch
+    chain1 = gst_basic_scheduler_chain_new (sched);
+    gst_basic_scheduler_chain_recursive_add (chain1, element1);
+  }
 
   // check the other element to see if it landed in the newly created chain
   if (gst_basic_scheduler_find_chain (sched, element2) == NULL) {
index defca17..59a61b9 100644 (file)
@@ -134,8 +134,6 @@ gst_fakesink_init (GstFakeSink *fakesink)
   gst_element_add_pad (GST_ELEMENT (fakesink), pad);
   gst_pad_set_chain_function (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
 
-  fakesink->sinkpads = g_slist_prepend (NULL, pad);
-  fakesink->numsinkpads = 1;
   fakesink->silent = FALSE;
   fakesink->dump = FALSE;
 }
@@ -156,14 +154,11 @@ gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const
 
   fakesink = GST_FAKESINK (element);
 
-  name = g_strdup_printf ("sink%d", fakesink->numsinkpads);
+  name = g_strdup_printf ("sink%d", GST_ELEMENT (fakesink)->numsinkpads);
 
   sinkpad = gst_pad_new_from_template (templ, name);
   gst_element_add_pad (GST_ELEMENT (fakesink), sinkpad);
 
-  fakesink->sinkpads = g_slist_prepend (fakesink->sinkpads, sinkpad);
-  fakesink->numsinkpads++;
-
   return sinkpad;
 }
 
@@ -199,7 +194,7 @@ gst_fakesink_get_property (GObject *object, guint prop_id, GValue *value, GParam
   
   switch (prop_id) {
     case ARG_NUM_SINKS:
-      g_value_set_int (value, sink->numsinkpads);
+      g_value_set_int (value, GST_ELEMENT (sink)->numsinkpads);
       break;
     case ARG_SILENT:
       g_value_set_boolean (value, sink->silent);
index 85aa9fb..4fea931 100644 (file)
@@ -54,8 +54,6 @@ typedef struct _GstFakeSinkClass GstFakeSinkClass;
 struct _GstFakeSink {
   GstElement element;
 
-  GSList *sinkpads;
-  gint numsinkpads;
   gboolean silent;
   gboolean dump;
 };
index 912157a..1319519 100644 (file)
@@ -256,18 +256,15 @@ gst_fakesrc_init (GstFakeSrc *fakesrc)
 {
   GstPad *pad;
 
-  // set the default number of 
-  fakesrc->numsrcpads = 1;
-
   // create our first output pad
   pad = gst_pad_new ("src", GST_PAD_SRC);
   gst_element_add_pad (GST_ELEMENT (fakesrc), pad);
-  fakesrc->srcpads = g_slist_append (NULL, pad);
 
   fakesrc->loop_based = FALSE;
   gst_fakesrc_update_functions (fakesrc);
 
   fakesrc->num_buffers = -1;
+  fakesrc->rt_num_buffers = -1;
   fakesrc->buffer_count = 0;
   fakesrc->silent = FALSE;
   fakesrc->dump = FALSE;
@@ -298,14 +295,11 @@ gst_fakesrc_request_new_pad (GstElement *element, GstPadTemplate *templ)
 
   fakesrc = GST_FAKESRC (element);
 
-  name = g_strdup_printf ("src%d", fakesrc->numsrcpads);
+  name = g_strdup_printf ("src%d", GST_ELEMENT (fakesrc)->numsrcpads);
 
   srcpad = gst_pad_new_from_template (templ, name);
   gst_element_add_pad (GST_ELEMENT (fakesrc), srcpad);
 
-  fakesrc->srcpads = g_slist_prepend (fakesrc->srcpads, srcpad);
-  fakesrc->numsrcpads++;
-
   return srcpad;
 }
 
@@ -340,7 +334,7 @@ gst_fakesrc_event_handler (GstPad *pad, GstEvent *event)
 static void
 gst_fakesrc_update_functions (GstFakeSrc *src)
 {
-  GSList *pads;
+  GList *pads;
 
   if (src->loop_based) {
     gst_element_set_loop_function (GST_ELEMENT (src), GST_DEBUG_FUNCPTR (gst_fakesrc_loop));
@@ -349,7 +343,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src)
     gst_element_set_loop_function (GST_ELEMENT (src), NULL);
   }
 
-  pads = src->srcpads;
+  pads = GST_ELEMENT (src)->pads;
   while (pads) {
     GstPad *pad = GST_PAD (pads->data);
 
@@ -361,7 +355,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src)
     }
 
     gst_pad_set_event_function (pad, gst_fakesrc_event_handler);
-    pads = g_slist_next (pads);
+    pads = g_list_next (pads);
   }
 }
 
@@ -456,7 +450,7 @@ gst_fakesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamS
    
   switch (prop_id) {
     case ARG_NUM_SOURCES:
-      g_value_set_int (value, src->numsrcpads);
+      g_value_set_int (value, GST_ELEMENT (src)->numsrcpads);
       break;
     case ARG_LOOP_BASED:
       g_value_set_boolean (value, src->loop_based);
@@ -656,14 +650,14 @@ gst_fakesrc_get(GstPad *pad)
     return GST_BUFFER(gst_event_new (GST_EVENT_FLUSH));
   }
 
-  if (src->num_buffers == 0) {
+  if (src->rt_num_buffers == 0) {
     g_print("fakesrc: sending EOS\n");
     gst_element_set_state (GST_ELEMENT (src), GST_STATE_PAUSED);
     return GST_BUFFER(gst_event_new (GST_EVENT_EOS));
   }
   else {
-    if (src->num_buffers > 0)
-      src->num_buffers--;
+    if (src->rt_num_buffers > 0)
+      src->rt_num_buffers--;
   }
 
   if (src->eos) {
@@ -704,20 +698,20 @@ gst_fakesrc_loop(GstElement *element)
   src = GST_FAKESRC (element);
 
   do {
-    GSList *pads;
+    GList *pads;
 
-    pads = src->srcpads;
+    pads = GST_ELEMENT (src)->pads;
 
     while (pads) {
       GstPad *pad = GST_PAD (pads->data);
       GstBuffer *buf;
 
-      if (src->num_buffers == 0) {
+      if (src->rt_num_buffers == 0) {
        src->eos = TRUE;
       }
       else {
-        if (src->num_buffers > 0)
-          src->num_buffers--;
+        if (src->rt_num_buffers > 0)
+          src->rt_num_buffers--;
       }
 
       if (src->eos) {
@@ -737,7 +731,7 @@ gst_fakesrc_loop(GstElement *element)
                        buf, pad);
       gst_pad_push (pad, buf);
 
-      pads = g_slist_next (pads);
+      pads = g_list_next (pads);
     }
   } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element));
 }
@@ -751,14 +745,30 @@ gst_fakesrc_change_state (GstElement *element)
 
   fakesrc = GST_FAKESRC (element);
 
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_PAUSED_TO_READY:
+    case GST_STATE_NULL_TO_READY:
+      fakesrc->buffer_count = 0;
+      fakesrc->pattern_byte = 0x00;
+      fakesrc->need_flush = FALSE;
+      fakesrc->eos = FALSE;
+      fakesrc->rt_num_buffers = fakesrc->num_buffers;
+      if (fakesrc->parent) {
+        gst_buffer_unref (fakesrc->parent);
+        fakesrc->parent = NULL;
+      }
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+    case GST_STATE_PAUSED_TO_PLAYING:
+    case GST_STATE_PLAYING_TO_PAUSED:
+    case GST_STATE_READY_TO_NULL:
+      break;
+    default:
+      g_asset_not_reached ();
+      break;
+  }
+
   if (GST_STATE_PENDING (element) == GST_STATE_READY) {
-    fakesrc->buffer_count = 0;
-    fakesrc->pattern_byte = 0x00;
-    fakesrc->need_flush = FALSE;
-    if (fakesrc->parent) {
-      gst_buffer_unref (fakesrc->parent);
-      fakesrc->parent = NULL;
-    }
   }
 
   if (GST_ELEMENT_CLASS (parent_class)->change_state)
index 550015b..76503de 100644 (file)
@@ -85,8 +85,6 @@ struct _GstFakeSrc {
 
   gboolean     loop_based;
   gboolean     eos;
-  gint                 numsrcpads;
-  GSList       *srcpads;
 
   GstFakeSrcOutputType output;
   GstFakeSrcDataType data;
@@ -102,6 +100,7 @@ struct _GstFakeSrc {
   gchar        *pattern;
   GList        *patternlist;
   gint                 num_buffers;
+  gint                 rt_num_buffers; /* we are going to change this at runtime */
   guint64      buffer_count;
   gboolean     silent;
   gboolean     dump;