gst-indent run on core
[platform/upstream/gstreamer.git] / gst / gstscheduler.h
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *
5  * gstscheduler.h: Header for default scheduler code
6  *
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.
11  *
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.
16  *
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.
21  */
22
23
24 #ifndef __GST_SCHEDULER_H__
25 #define __GST_SCHEDULER_H__
26
27 #include <glib.h>
28 #include <gst/gstelement.h>
29 #include <gst/gstbin.h>
30
31 G_BEGIN_DECLS
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))
38     typedef enum
39 {
40   /* this scheduler works with a fixed clock */
41   GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST,
42
43   /* padding */
44   GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
45 } GstSchedulerFlags;
46
47 #define GST_SCHEDULER_PARENT(sched)             ((sched)->parent)
48 #define GST_SCHEDULER_STATE(sched)              ((sched)->state)
49
50 /*typedef struct _GstScheduler GstScheduler; */
51 /*typedef struct _GstSchedulerClass GstSchedulerClass; */
52 typedef enum
53 {
54   GST_SCHEDULER_STATE_NONE,
55   GST_SCHEDULER_STATE_RUNNING,
56   GST_SCHEDULER_STATE_STOPPED,
57   GST_SCHEDULER_STATE_ERROR
58 } GstSchedulerState;
59
60 struct _GstScheduler
61 {
62   GstObject object;
63
64   GstElement *parent;
65   GstScheduler *parent_sched;
66
67   GstSchedulerState state;
68   GstClock *clock;
69   GstClock *current_clock;
70
71   GList *clock_providers;
72   GList *clock_receivers;
73
74   GList *schedulers;
75
76   gpointer _gst_reserved[GST_PADDING];
77 };
78
79 struct _GstSchedulerClass
80 {
81   GstObjectClass parent_class;
82
83   /* virtual methods */
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);
104   /* for debugging */
105   void (*show) (GstScheduler * sched);
106
107   /* signals */
108   void (*object_sync) (GstScheduler * sched, GstClock * clock,
109       GstObject * object, GstClockID id);
110
111   gpointer _gst_reserved[GST_PADDING];
112 };
113
114 GType gst_scheduler_get_type (void);
115
116
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,
134     GstPad * sinkpad);
135 void gst_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
136     GstPad * sinkpad);
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);
141
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);
146
147 void gst_scheduler_show (GstScheduler * sched);
148
149 /*
150  * creating schedulers
151  *
152  */
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))
159
160 /* change this to change the default scheduler */
161 #define GST_SCHEDULER_DEFAULT_NAME      "opt"
162
163 typedef struct _GstSchedulerFactory GstSchedulerFactory;
164 typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
165
166 struct _GstSchedulerFactory
167 {
168   GstPluginFeature feature;
169
170   gchar *longdesc;              /* long description of the scheduler (well, don't overdo it..) */
171   GType type;                   /* unique GType of the scheduler */
172
173   gpointer _gst_reserved[GST_PADDING];
174 };
175
176 struct _GstSchedulerFactoryClass
177 {
178   GstPluginFeatureClass parent;
179
180   gpointer _gst_reserved[GST_PADDING];
181 };
182
183 GType gst_scheduler_factory_get_type (void);
184
185 GstSchedulerFactory *gst_scheduler_factory_new (const gchar * name,
186     const gchar * longdesc, GType type);
187 void gst_scheduler_factory_destroy (GstSchedulerFactory * factory);
188
189 GstSchedulerFactory *gst_scheduler_factory_find (const gchar * name);
190
191 GstScheduler *gst_scheduler_factory_create (GstSchedulerFactory * factory,
192     GstElement * parent);
193 GstScheduler *gst_scheduler_factory_make (const gchar * name,
194     GstElement * parent);
195
196 void gst_scheduler_factory_set_default_name (const gchar * name);
197 G_CONST_RETURN gchar *gst_scheduler_factory_get_default_name (void);
198
199
200 G_END_DECLS
201 #endif /* __GST_SCHEDULER_H__ */