fix doc build fix autogen
[platform/upstream/gstreamer.git] / gst / gstpipeline.c
index f967add..aa55d91 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 "gstinfo.h"
 #include "gstscheduler.h"
 
-
-GstElementDetails gst_pipeline_details = {
+static GstElementDetails gst_pipeline_details = GST_ELEMENT_DETAILS (
   "Pipeline object",
-  "Bin",
+  "Generic/Bin",
   "Complete pipeline object",
-  VERSION,
-  "Erik Walthinsen <omega@cse.ogi.edu>",
-  "(C) 1999",
-};
+  "Erik Walthinsen <omega@cse.ogi.edu>"
+);
 
 /* Pipeline signals and args */
 enum {
@@ -52,60 +45,94 @@ enum {
 };
 
 
-static void                    gst_pipeline_class_init         (GstPipelineClass *klass);
-static void                    gst_pipeline_init               (GstPipeline *pipeline);
+static void                    gst_pipeline_base_init          (gpointer       g_class);
+static void                    gst_pipeline_class_init         (gpointer       g_class, 
+                                                                gpointer       class_data);
+static void                    gst_pipeline_init               (GTypeInstance *instance, 
+                                                                gpointer       g_class);
 
-static GstElementStateReturn   gst_pipeline_change_state       (GstElement *element);
-
-static void                    gst_pipeline_prepare            (GstPipeline *pipeline);
+static void                     gst_pipeline_dispose           (GObject *      object);
 
+static GstElementStateReturn   gst_pipeline_change_state       (GstElement *   element);
 
 static GstBinClass *parent_class = NULL;
-//static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 };
+/* static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 }; */
 
-GtkType
+GType
 gst_pipeline_get_type (void) {
-  static GtkType pipeline_type = 0;
+  static GType pipeline_type = 0;
 
   if (!pipeline_type) {
-    static const GtkTypeInfo pipeline_info = {
-      "GstPipeline",
-      sizeof(GstPipeline),
+    static const GTypeInfo pipeline_info = {
       sizeof(GstPipelineClass),
-      (GtkClassInitFunc)gst_pipeline_class_init,
-      (GtkObjectInitFunc)gst_pipeline_init,
-      (GtkArgSetFunc)NULL,
-      (GtkArgGetFunc)NULL,
-      (GtkClassInitFunc)NULL,
+      gst_pipeline_base_init,
+      NULL,
+      (GClassInitFunc)gst_pipeline_class_init,
+      NULL,
+      NULL,
+      sizeof(GstPipeline),
+      0,
+      gst_pipeline_init,
+      NULL
     };
-    pipeline_type = gtk_type_unique (gst_bin_get_type (), &pipeline_info);
+    pipeline_type = g_type_register_static (GST_TYPE_BIN, "GstPipeline", &pipeline_info, 0);
   }
   return pipeline_type;
 }
 
 static void
-gst_pipeline_class_init (GstPipelineClass *klass)
+gst_pipeline_base_init (gpointer g_class)
 {
-  GstElementClass *gstelement_class;
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+  
+  gst_element_class_set_details (gstelement_class, &gst_pipeline_details);
+}
 
-  gstelement_class = (GstElementClass*)klass;
+static void
+gst_pipeline_class_init (gpointer g_class, gpointer class_data)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+  GstPipelineClass *klass = GST_PIPELINE_CLASS (g_class);
 
-  parent_class = gtk_type_class(gst_bin_get_type());
+  parent_class = g_type_class_peek_parent (klass);
 
-  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
-gst_pipeline_init (GstPipeline *pipeline)
+gst_pipeline_init (GTypeInstance *instance, gpointer g_class)
 {
-  // we're a manager by default
+  GstScheduler *scheduler;
+  GstPipeline *pipeline = GST_PIPELINE (instance);
+  
+  /* pipelines are managing bins */
   GST_FLAG_SET (pipeline, GST_BIN_FLAG_MANAGER);
 
-  GST_ELEMENT_SCHED(pipeline) = gst_schedule_new(GST_ELEMENT(pipeline));
-  GST_DEBUG(GST_CAT_PIPELINE, "pipeline's scheduler is %p\n",GST_ELEMENT_SCHED(pipeline));
-//  gst_element_set_manager(GST_ELEMENT(pipeline),GST_ELEMENT(pipeline));
+  /* get an instance of the default scheduler */
+  scheduler = gst_scheduler_factory_make (NULL, GST_ELEMENT (pipeline));
+
+  /* FIXME need better error handling */
+  if (scheduler == NULL) {
+    const gchar *name = gst_scheduler_factory_get_default_name ();
+
+    g_error ("Critical error: could not get scheduler \"%s\"\n"
+            "Are you sure you have a registry ?\n"
+            "Run gst-register as root if you haven't done so yet.", name);
+  }
 }
 
+static void
+gst_pipeline_dispose (GObject *object)
+{
+  GstPipeline *pipeline = GST_PIPELINE (object);
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+
+  gst_object_replace ((GstObject **)&GST_ELEMENT_SCHED (pipeline), NULL);
+}
 
 /**
  * gst_pipeline_new:
@@ -116,33 +143,31 @@ gst_pipeline_init (GstPipeline *pipeline)
  * Returns: newly created GstPipeline
  */
 GstElement*
-gst_pipeline_new (const guchar *name) 
+gst_pipeline_new (const gchar *name) 
 {
-  return gst_elementfactory_make ("pipeline", name);
-}
-
-static void 
-gst_pipeline_prepare (GstPipeline *pipeline) 
-{
-  GST_DEBUG (GST_CAT_PIPELINE,"preparing pipeline \"%s\" for playing (DEPRACATED!!)\n",
-             GST_ELEMENT_NAME(GST_ELEMENT(pipeline)));
+  return gst_element_factory_make ("pipeline", name);
 }
 
 static GstElementStateReturn
 gst_pipeline_change_state (GstElement *element)
 {
-  GstPipeline *pipeline;
-
-  g_return_val_if_fail (GST_IS_PIPELINE (element), FALSE);
-
-  pipeline = GST_PIPELINE (element);
-
-  switch (GST_STATE_TRANSITION (pipeline)) {
+  switch (GST_STATE_TRANSITION (element)) {
     case GST_STATE_NULL_TO_READY:
-      // we need to set up internal state
-      gst_pipeline_prepare (pipeline);
+      gst_scheduler_setup (GST_ELEMENT_SCHED (element));
+      break;
+    case GST_STATE_READY_TO_PAUSED:
+    case GST_STATE_PAUSED_TO_PLAYING:
+    case GST_STATE_PLAYING_TO_PAUSED:
+    case GST_STATE_PAUSED_TO_READY:
       break;
-    default:
+    case GST_STATE_READY_TO_NULL:
+      /* FIXME: calling gst_scheduler_reset() here is bad, since we
+       * might not be in cothread 0 */
+#if 0
+      if (GST_ELEMENT_SCHED (element)) {
+        gst_scheduler_reset (GST_ELEMENT_SCHED (element));
+      }
+#endif
       break;
   }
 
@@ -152,15 +177,3 @@ gst_pipeline_change_state (GstElement *element)
   return GST_STATE_SUCCESS;
 }
 
-/**
- * gst_pipeline_iterate:
- * @pipeline: #GstPipeline to iterate
- *
- * Cause the pipeline's contents to be run through one full 'iteration'.
- */
-void
-gst_pipeline_iterate (GstPipeline *pipeline)
-{
-  g_return_if_fail (pipeline != NULL);
-  g_return_if_fail (GST_IS_PIPELINE(pipeline));
-}