2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 * 2000 Wim Taymans <wtay@chello.be>
5 * gstscheduler.h: Header for default scheduler code
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
24 #ifndef __GST_SCHEDULER_H__
25 #define __GST_SCHEDULER_H__
28 #include <gst/gstelement.h>
29 #include <gst/gstbin.h>
32 #define GST_TYPE_SCHEDULER (gst_scheduler_get_type ())
33 #define GST_SCHEDULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULER, GstScheduler))
34 #define GST_IS_SCHEDULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULER))
35 #define GST_SCHEDULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULER,GstSchedulerClass))
36 #define GST_IS_SCHEDULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULER))
37 #define GST_SCHEDULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SCHEDULER, GstSchedulerClass))
40 /* this scheduler works with a fixed clock */
41 GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST,
44 GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
48 #define GST_SCHEDULER_PARENT(sched) ((sched)->parent)
49 #define GST_SCHEDULER_STATE(sched) ((sched)->state)
51 /*typedef struct _GstScheduler GstScheduler; */
52 /*typedef struct _GstSchedulerClass GstSchedulerClass; */
55 GST_SCHEDULER_STATE_NONE,
56 GST_SCHEDULER_STATE_RUNNING,
57 GST_SCHEDULER_STATE_STOPPED,
58 GST_SCHEDULER_STATE_ERROR
67 GstScheduler *parent_sched;
69 GstSchedulerState state;
71 GstClock *current_clock;
73 GList *clock_providers;
74 GList *clock_receivers;
78 gpointer _gst_reserved[GST_PADDING];
81 struct _GstSchedulerClass
83 GstObjectClass parent_class;
86 void (*setup) (GstScheduler * sched);
87 void (*reset) (GstScheduler * sched);
88 void (*add_element) (GstScheduler * sched, GstElement * element);
89 void (*remove_element) (GstScheduler * sched, GstElement * element);
90 void (*add_scheduler) (GstScheduler * sched, GstScheduler * sched2);
91 void (*remove_scheduler) (GstScheduler * sched, GstScheduler * sched2);
92 GstElementStateReturn (*state_transition) (GstScheduler * sched,
93 GstElement * element, gint transition);
94 void (*scheduling_change) (GstScheduler * sched, GstElement * element);
95 void (*lock_element) (GstScheduler * sched, GstElement * element);
96 void (*unlock_element) (GstScheduler * sched, GstElement * element);
97 gboolean (*yield) (GstScheduler * sched, GstElement * element);
98 gboolean (*interrupt) (GstScheduler * sched, GstElement * element);
99 void (*error) (GstScheduler * sched, GstElement * element);
100 void (*pad_link) (GstScheduler * sched, GstPad * srcpad, GstPad * sinkpad);
101 void (*pad_unlink) (GstScheduler * sched, GstPad * srcpad, GstPad * sinkpad);
102 void (*pad_select) (GstScheduler * sched, GList * padlist);
103 GstClockReturn (*clock_wait) (GstScheduler * sched, GstElement * element,
104 GstClockID id, GstClockTimeDiff * jitter);
105 GstSchedulerState (*iterate) (GstScheduler * sched);
107 void (*show) (GstScheduler * sched);
110 void (*object_sync) (GstScheduler * sched, GstClock * clock,
111 GstObject * object, GstClockID id);
113 gpointer _gst_reserved[GST_PADDING];
116 GType gst_scheduler_get_type (void);
119 void gst_scheduler_setup (GstScheduler * sched);
120 void gst_scheduler_reset (GstScheduler * sched);
121 void gst_scheduler_add_element (GstScheduler * sched, GstElement * element);
122 void gst_scheduler_remove_element (GstScheduler * sched, GstElement * element);
123 void gst_scheduler_add_scheduler (GstScheduler * sched, GstScheduler * sched2);
124 void gst_scheduler_remove_scheduler (GstScheduler * sched,
125 GstScheduler * sched2);
126 GstElementStateReturn gst_scheduler_state_transition (GstScheduler * sched,
127 GstElement * element, gint transition);
128 void gst_scheduler_scheduling_change (GstScheduler * sched,
129 GstElement * element);
130 void gst_scheduler_lock_element (GstScheduler * sched, GstElement * element);
131 void gst_scheduler_unlock_element (GstScheduler * sched, GstElement * element);
132 gboolean gst_scheduler_yield (GstScheduler * sched, GstElement * element);
133 gboolean gst_scheduler_interrupt (GstScheduler * sched, GstElement * element);
134 void gst_scheduler_error (GstScheduler * sched, GstElement * element);
135 void gst_scheduler_pad_link (GstScheduler * sched, GstPad * srcpad,
137 void gst_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
139 GstPad *gst_scheduler_pad_select (GstScheduler * sched, GList * padlist);
140 GstClockReturn gst_scheduler_clock_wait (GstScheduler * sched,
141 GstElement * element, GstClockID id, GstClockTimeDiff * jitter);
142 gboolean gst_scheduler_iterate (GstScheduler * sched);
144 void gst_scheduler_use_clock (GstScheduler * sched, GstClock * clock);
145 void gst_scheduler_set_clock (GstScheduler * sched, GstClock * clock);
146 GstClock *gst_scheduler_get_clock (GstScheduler * sched);
147 void gst_scheduler_auto_clock (GstScheduler * sched);
149 void gst_scheduler_show (GstScheduler * sched);
152 * creating schedulers
155 #define GST_TYPE_SCHEDULER_FACTORY (gst_scheduler_factory_get_type ())
156 #define GST_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactory))
157 #define GST_IS_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULER_FACTORY))
158 #define GST_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
159 #define GST_IS_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULER_FACTORY))
160 #define GST_SCHEDULER_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
162 /* change this to change the default scheduler */
163 #define GST_SCHEDULER_DEFAULT_NAME "opt"
165 typedef struct _GstSchedulerFactory GstSchedulerFactory;
166 typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
168 struct _GstSchedulerFactory
170 GstPluginFeature feature;
172 gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */
173 GType type; /* unique GType of the scheduler */
175 gpointer _gst_reserved[GST_PADDING];
178 struct _GstSchedulerFactoryClass
180 GstPluginFeatureClass parent;
182 gpointer _gst_reserved[GST_PADDING];
185 GType gst_scheduler_factory_get_type (void);
187 GstSchedulerFactory *gst_scheduler_factory_new (const gchar * name,
188 const gchar * longdesc, GType type);
189 void gst_scheduler_factory_destroy (GstSchedulerFactory * factory);
191 GstSchedulerFactory *gst_scheduler_factory_find (const gchar * name);
193 GstScheduler *gst_scheduler_factory_create (GstSchedulerFactory * factory,
194 GstElement * parent);
195 GstScheduler *gst_scheduler_factory_make (const gchar * name,
196 GstElement * parent);
198 void gst_scheduler_factory_set_default_name (const gchar * name);
199 G_CONST_RETURN gchar *gst_scheduler_factory_get_default_name (void);
203 #endif /* __GST_SCHEDULER_H__ */