*.h: Revert indentation changes.
[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 }
46 GstSchedulerFlags;
47
48 #define GST_SCHEDULER_PARENT(sched)             ((sched)->parent)
49 #define GST_SCHEDULER_STATE(sched)              ((sched)->state)
50
51 /*typedef struct _GstScheduler GstScheduler; */
52 /*typedef struct _GstSchedulerClass GstSchedulerClass; */
53 typedef enum
54 {
55   GST_SCHEDULER_STATE_NONE,
56   GST_SCHEDULER_STATE_RUNNING,
57   GST_SCHEDULER_STATE_STOPPED,
58   GST_SCHEDULER_STATE_ERROR
59 }
60 GstSchedulerState;
61
62 struct _GstScheduler
63 {
64   GstObject object;
65
66   GstElement *parent;
67   GstScheduler *parent_sched;
68
69   GstSchedulerState state;
70   GstClock *clock;
71   GstClock *current_clock;
72
73   GList *clock_providers;
74   GList *clock_receivers;
75
76   GList *schedulers;
77
78   gpointer _gst_reserved[GST_PADDING];
79 };
80
81 struct _GstSchedulerClass
82 {
83   GstObjectClass parent_class;
84
85   /* virtual methods */
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);
106   /* for debugging */
107   void (*show) (GstScheduler * sched);
108
109   /* signals */
110   void (*object_sync) (GstScheduler * sched, GstClock * clock,
111       GstObject * object, GstClockID id);
112
113   gpointer _gst_reserved[GST_PADDING];
114 };
115
116 GType gst_scheduler_get_type (void);
117
118
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,
136     GstPad * sinkpad);
137 void gst_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad,
138     GstPad * sinkpad);
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);
143
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);
148
149 void gst_scheduler_show (GstScheduler * sched);
150
151 /*
152  * creating schedulers
153  *
154  */
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))
161
162 /* change this to change the default scheduler */
163 #define GST_SCHEDULER_DEFAULT_NAME      "opt"
164
165 typedef struct _GstSchedulerFactory GstSchedulerFactory;
166 typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
167
168 struct _GstSchedulerFactory
169 {
170   GstPluginFeature feature;
171
172   gchar *longdesc;              /* long description of the scheduler (well, don't overdo it..) */
173   GType type;                   /* unique GType of the scheduler */
174
175   gpointer _gst_reserved[GST_PADDING];
176 };
177
178 struct _GstSchedulerFactoryClass
179 {
180   GstPluginFeatureClass parent;
181
182   gpointer _gst_reserved[GST_PADDING];
183 };
184
185 GType gst_scheduler_factory_get_type (void);
186
187 GstSchedulerFactory *gst_scheduler_factory_new (const gchar * name,
188     const gchar * longdesc, GType type);
189 void gst_scheduler_factory_destroy (GstSchedulerFactory * factory);
190
191 GstSchedulerFactory *gst_scheduler_factory_find (const gchar * name);
192
193 GstScheduler *gst_scheduler_factory_create (GstSchedulerFactory * factory,
194     GstElement * parent);
195 GstScheduler *gst_scheduler_factory_make (const gchar * name,
196     GstElement * parent);
197
198 void gst_scheduler_factory_set_default_name (const gchar * name);
199 G_CONST_RETURN gchar *gst_scheduler_factory_get_default_name (void);
200
201
202 G_END_DECLS
203 #endif /* __GST_SCHEDULER_H__ */