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
47 #define GST_SCHEDULER_PARENT(sched) ((sched)->parent)
48 #define GST_SCHEDULER_STATE(sched) ((sched)->state)
50 /*typedef struct _GstScheduler GstScheduler; */
51 /*typedef struct _GstSchedulerClass GstSchedulerClass; */
54 GST_SCHEDULER_STATE_NONE,
55 GST_SCHEDULER_STATE_RUNNING,
56 GST_SCHEDULER_STATE_STOPPED,
57 GST_SCHEDULER_STATE_ERROR
65 GstScheduler *parent_sched;
67 GstSchedulerState state;
69 GstClock *current_clock;
71 GList *clock_providers;
72 GList *clock_receivers;
76 gpointer _gst_reserved[GST_PADDING];
79 struct _GstSchedulerClass
81 GstObjectClass parent_class;
84 void (*setup) (GstScheduler * sched);
85 void (*reset) (GstScheduler * sched);
86 void (*add_element) (GstScheduler * sched, GstElement * element);
87 void (*remove_element) (GstScheduler * sched, GstElement * element);
88 void (*add_scheduler) (GstScheduler * sched, GstScheduler * sched2);
89 void (*remove_scheduler) (GstScheduler * sched, GstScheduler * sched2);
90 GstElementStateReturn (*state_transition) (GstScheduler * sched,
91 GstElement * element, gint transition);
92 void (*scheduling_change) (GstScheduler * sched, GstElement * element);
93 void (*lock_element) (GstScheduler * sched, GstElement * element);
94 void (*unlock_element) (GstScheduler * sched, GstElement * element);
95 gboolean (*yield) (GstScheduler * sched, GstElement * element);
96 gboolean (*interrupt) (GstScheduler * sched, GstElement * element);
97 void (*error) (GstScheduler * sched, GstElement * element);
98 void (*pad_link) (GstScheduler * sched, GstPad * srcpad, GstPad * sinkpad);
99 void (*pad_unlink) (GstScheduler * sched, GstPad * srcpad, GstPad * sinkpad);
100 void (*pad_select) (GstScheduler * sched, GList * padlist);
101 GstClockReturn (*clock_wait) (GstScheduler * sched, GstElement * element,
102 GstClockID id, GstClockTimeDiff * jitter);
103 GstSchedulerState (*iterate) (GstScheduler * sched);
105 void (*show) (GstScheduler * sched);
108 void (*object_sync) (GstScheduler * sched, GstClock * clock,
109 GstObject * object, GstClockID id);
111 gpointer _gst_reserved[GST_PADDING];
114 GType gst_scheduler_get_type (void);
117 void gst_scheduler_setup (GstScheduler * sched);
118 void gst_scheduler_reset (GstScheduler * sched);
119 void gst_scheduler_add_element (GstScheduler * sched, GstElement * element);
120 void gst_scheduler_remove_element (GstScheduler * sched, GstElement * element);
121 void gst_scheduler_add_scheduler (GstScheduler * sched, GstScheduler * sched2);
122 void gst_scheduler_remove_scheduler (GstScheduler * sched,
123 GstScheduler * sched2);
124 GstElementStateReturn gst_scheduler_state_transition (GstScheduler * sched,
125 GstElement * element, gint transition);
126 void gst_scheduler_scheduling_change (GstScheduler * sched,
127 GstElement * element);
128 void gst_scheduler_lock_element (GstScheduler * sched, GstElement * element);
129 void gst_scheduler_unlock_element (GstScheduler * sched, GstElement * element);
130 gboolean gst_scheduler_yield (GstScheduler * sched, GstElement * element);
131 gboolean gst_scheduler_interrupt (GstScheduler * sched, GstElement * element);
132 void gst_scheduler_error (GstScheduler * sched, GstElement * element);
133 void gst_scheduler_pad_link (GstScheduler * sched, GstPad * srcpad,
135 void gst_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
137 GstPad *gst_scheduler_pad_select (GstScheduler * sched, GList * padlist);
138 GstClockReturn gst_scheduler_clock_wait (GstScheduler * sched,
139 GstElement * element, GstClockID id, GstClockTimeDiff * jitter);
140 gboolean gst_scheduler_iterate (GstScheduler * sched);
142 void gst_scheduler_use_clock (GstScheduler * sched, GstClock * clock);
143 void gst_scheduler_set_clock (GstScheduler * sched, GstClock * clock);
144 GstClock *gst_scheduler_get_clock (GstScheduler * sched);
145 void gst_scheduler_auto_clock (GstScheduler * sched);
147 void gst_scheduler_show (GstScheduler * sched);
150 * creating schedulers
153 #define GST_TYPE_SCHEDULER_FACTORY (gst_scheduler_factory_get_type ())
154 #define GST_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactory))
155 #define GST_IS_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULER_FACTORY))
156 #define GST_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
157 #define GST_IS_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULER_FACTORY))
158 #define GST_SCHEDULER_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
160 /* change this to change the default scheduler */
161 #define GST_SCHEDULER_DEFAULT_NAME "opt"
163 typedef struct _GstSchedulerFactory GstSchedulerFactory;
164 typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
166 struct _GstSchedulerFactory
168 GstPluginFeature feature;
170 gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */
171 GType type; /* unique GType of the scheduler */
173 gpointer _gst_reserved[GST_PADDING];
176 struct _GstSchedulerFactoryClass
178 GstPluginFeatureClass parent;
180 gpointer _gst_reserved[GST_PADDING];
183 GType gst_scheduler_factory_get_type (void);
185 GstSchedulerFactory *gst_scheduler_factory_new (const gchar * name,
186 const gchar * longdesc, GType type);
187 void gst_scheduler_factory_destroy (GstSchedulerFactory * factory);
189 GstSchedulerFactory *gst_scheduler_factory_find (const gchar * name);
191 GstScheduler *gst_scheduler_factory_create (GstSchedulerFactory * factory,
192 GstElement * parent);
193 GstScheduler *gst_scheduler_factory_make (const gchar * name,
194 GstElement * parent);
196 void gst_scheduler_factory_set_default_name (const gchar * name);
197 G_CONST_RETURN gchar *gst_scheduler_factory_get_default_name (void);
201 #endif /* __GST_SCHEDULER_H__ */