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