#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 {
};
-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 }; */
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);
}
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);
}
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
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);
}
/**
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);