fix doc build fix autogen
[platform/upstream/gstreamer.git] / gst / gstpipeline.c
index 972c712..aa55d91 100644 (file)
 #include "gst_private.h"
 
 #include "gstpipeline.h"
-#include "gstlog.h"
+#include "gstinfo.h"
 #include "gstscheduler.h"
 
-GstElementDetails gst_pipeline_details = {
+static GstElementDetails gst_pipeline_details = GST_ELEMENT_DETAILS (
   "Pipeline object",
   "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 {
@@ -47,12 +45,15 @@ 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 void                     gst_pipeline_dispose           (GObject *object);
+static void                     gst_pipeline_dispose           (GObject *      object);
 
-static GstElementStateReturn   gst_pipeline_change_state       (GstElement *element);
+static GstElementStateReturn   gst_pipeline_change_state       (GstElement *   element);
 
 static GstBinClass *parent_class = NULL;
 /* static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 }; */
@@ -64,14 +65,14 @@ gst_pipeline_get_type (void) {
   if (!pipeline_type) {
     static const GTypeInfo pipeline_info = {
       sizeof(GstPipelineClass),
-      NULL,
+      gst_pipeline_base_init,
       NULL,
       (GClassInitFunc)gst_pipeline_class_init,
       NULL,
       NULL,
       sizeof(GstPipeline),
       0,
-      (GInstanceInitFunc)gst_pipeline_init,
+      gst_pipeline_init,
       NULL
     };
     pipeline_type = g_type_register_static (GST_TYPE_BIN, "GstPipeline", &pipeline_info, 0);
@@ -80,15 +81,21 @@ gst_pipeline_get_type (void) {
 }
 
 static void
-gst_pipeline_class_init (GstPipelineClass *klass)
+gst_pipeline_base_init (gpointer g_class)
 {
-  GObjectClass *gobject_class;
-  GstElementClass *gstelement_class;
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+  
+  gst_element_class_set_details (gstelement_class, &gst_pipeline_details);
+}
 
-  gobject_class = (GObjectClass *)klass;
-  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 = g_type_class_ref (gst_bin_get_type ());
+  parent_class = g_type_class_peek_parent (klass);
 
   gobject_class->dispose               = GST_DEBUG_FUNCPTR (gst_pipeline_dispose);
 
@@ -96,19 +103,25 @@ gst_pipeline_class_init (GstPipelineClass *klass)
 }
 
 static void
-gst_pipeline_init (GstPipeline *pipeline)
+gst_pipeline_init (GTypeInstance *instance, gpointer g_class)
 {
   GstScheduler *scheduler;
-
+  GstPipeline *pipeline = GST_PIPELINE (instance);
+  
   /* pipelines are managing bins */
   GST_FLAG_SET (pipeline, GST_BIN_FLAG_MANAGER);
 
   /* get an instance of the default scheduler */
   scheduler = gst_scheduler_factory_make (NULL, GST_ELEMENT (pipeline));
+
   /* FIXME need better error handling */
-  g_return_if_fail (scheduler != NULL);
-         
-  gst_scheduler_setup (scheduler);
+  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
@@ -118,11 +131,7 @@ gst_pipeline_dispose (GObject *object)
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 
-  if (GST_ELEMENT_SCHED (pipeline)) {
-    gst_scheduler_reset (GST_ELEMENT_SCHED (pipeline));
-    gst_object_unref (GST_OBJECT (GST_ELEMENT_SCHED (pipeline)));
-    GST_ELEMENT_SCHED (pipeline) = NULL;
-  }
+  gst_object_replace ((GstObject **)&GST_ELEMENT_SCHED (pipeline), NULL);
 }
 
 /**
@@ -142,6 +151,26 @@ gst_pipeline_new (const gchar *name)
 static GstElementStateReturn
 gst_pipeline_change_state (GstElement *element)
 {
+  switch (GST_STATE_TRANSITION (element)) {
+    case GST_STATE_NULL_TO_READY:
+      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;
+    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;
+  }
+
   if (GST_ELEMENT_CLASS (parent_class)->change_state)
     return GST_ELEMENT_CLASS (parent_class)->change_state (element);