2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 * 2000,2004 Wim Taymans <wim@fluendo.com>
5 * gstelement.h: Header for GstElement
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_ELEMENT_H__
25 #define __GST_ELEMENT_H__
27 /* gstelement.h and gstelementfactory.h include eachother */
28 typedef struct _GstElement GstElement;
29 typedef struct _GstElementClass GstElementClass;
31 /* gstmessage.h needs State */
33 GST_STATE_VOID_PENDING = 0, /* used for GstElement->pending_state when
34 there is no pending state */
42 #include <gst/gstconfig.h>
43 #include <gst/gstobject.h>
44 #include <gst/gstpad.h>
45 #include <gst/gstbus.h>
46 #include <gst/gstclock.h>
47 #include <gst/gstelementfactory.h>
48 #include <gst/gstplugin.h>
49 #include <gst/gstpluginfeature.h>
50 #include <gst/gstindex.h>
51 #include <gst/gstiterator.h>
52 #include <gst/gstmessage.h>
53 #include <gst/gsttaglist.h>
57 GST_EXPORT GType _gst_element_type;
59 #define GST_TYPE_ELEMENT (_gst_element_type)
60 #define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
61 #define GST_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
62 #define GST_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass))
63 #define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
64 #define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
65 #define GST_ELEMENT_CAST(obj) ((GstElement*)(obj))
68 GST_STATE_CHANGE_FAILURE = 0,
69 GST_STATE_CHANGE_SUCCESS = 1,
70 GST_STATE_CHANGE_ASYNC = 2,
71 GST_STATE_CHANGE_NO_PREROLL = 3
72 } GstStateChangeReturn;
74 /* NOTE: this probably should be done with an #ifdef to decide
75 * whether to safe-cast or to just do the non-checking cast.
77 #define GST_STATE(obj) (GST_ELEMENT(obj)->current_state)
78 #define GST_STATE_PENDING(obj) (GST_ELEMENT(obj)->pending_state)
79 #define GST_STATE_FINAL(obj) (GST_ELEMENT(obj)->final_state)
80 #define GST_STATE_ERROR(obj) (GST_ELEMENT(obj)->state_error)
81 #define GST_STATE_NO_PREROLL(obj) (GST_ELEMENT(obj)->no_preroll)
83 #ifndef GST_DEBUG_STATE_CHANGE
84 #define GST_STATE_CHANGE(obj) ((1<<(GST_STATE(obj)+8)) | 1<<GST_STATE_PENDING(obj))
87 _gst_element_get_state_change (GstElement *e)
89 if (e->state < GST_STATE_NULL || e->state > GST_STATE_PLAYING)
90 g_assert_not_reached ();
91 if (e->pending_state < GST_STATE_NULL || e->pending_state > GST_STATE_PLAYING)
92 g_assert_not_reached ();
93 if (e->state - e->pending_state != 1 && e->pending_state - e->state != 1)
94 g_assert_not_reached ();
95 return (1<<(GST_STATE(obj)+8)) | 1<<GST_STATE_PENDING(obj);
97 #define GST_STATE_CHANGE(obj) _gst_element_get_state_change(obj)
100 /* FIXME: How to deal with lost_state ? */
101 typedef enum /*< flags=0 >*/
103 GST_STATE_CHANGE_NULL_TO_READY = 1<<(GST_STATE_NULL+8) | 1<<GST_STATE_READY,
104 GST_STATE_CHANGE_READY_TO_PAUSED = 1<<(GST_STATE_READY+8) | 1<<GST_STATE_PAUSED,
105 GST_STATE_CHANGE_PAUSED_TO_PLAYING = 1<<(GST_STATE_PAUSED+8) | 1<<GST_STATE_PLAYING,
106 GST_STATE_CHANGE_PLAYING_TO_PAUSED = 1<<(GST_STATE_PLAYING+8) | 1<<GST_STATE_PAUSED,
107 GST_STATE_CHANGE_PAUSED_TO_READY = 1<<(GST_STATE_PAUSED+8) | 1<<GST_STATE_READY,
108 GST_STATE_CHANGE_READY_TO_NULL = 1<<(GST_STATE_READY+8) | 1<<GST_STATE_NULL
113 /* ignore state changes from parent */
114 GST_ELEMENT_LOCKED_STATE,
116 /* the element is a sink */
119 /* Child is being removed from the parent bin. gst_bin_remove on a
120 * child already being removed immediately returns FALSE */
121 GST_ELEMENT_UNPARENTING,
123 /* use some padding for future expansion */
124 GST_ELEMENT_FLAG_LAST = GST_OBJECT_FLAG_LAST + 16
127 #define GST_ELEMENT_IS_LOCKED_STATE(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_LOCKED_STATE))
129 #define GST_ELEMENT_NAME(obj) (GST_OBJECT_NAME(obj))
130 #define GST_ELEMENT_PARENT(obj) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(obj)))
131 #define GST_ELEMENT_BUS(obj) (GST_ELEMENT_CAST(obj)->bus)
132 #define GST_ELEMENT_CLOCK(obj) (GST_ELEMENT_CAST(obj)->clock)
133 #define GST_ELEMENT_PADS(obj) (GST_ELEMENT_CAST(obj)->pads)
137 * @el: the element that throws the error
138 * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #GstError)
139 * @code: error code defined for that domain (see #GstError)
140 * @text: the message to display (format string and args enclosed in
142 * @debug: debugging information for the message (format string and args
143 enclosed in parentheses)
145 * Utility function that elements can use in case they encountered a fatal
146 * data processing error. The pipeline will throw an error signal and the
147 * application will be requested to stop further media processing.
149 #define GST_ELEMENT_ERROR(el, domain, code, text, debug) \
151 gchar *__txt = _gst_element_error_printf text; \
152 gchar *__dbg = _gst_element_error_printf debug; \
154 GST_WARNING_OBJECT (el, "error: %s", __txt); \
156 GST_WARNING_OBJECT (el, "error: %s", __dbg); \
157 gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_ERROR, \
158 GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
159 __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
162 /* log a (non-fatal) warning message and post it on the bus */
163 #define GST_ELEMENT_WARNING(el, domain, code, text, debug) \
165 gchar *__txt = _gst_element_error_printf text; \
166 gchar *__dbg = _gst_element_error_printf debug; \
168 GST_WARNING_OBJECT (el, "warning: %s", __txt); \
170 GST_WARNING_OBJECT (el, "warning: %s", __dbg); \
171 gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_WARNING, \
172 GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
173 __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
176 /* the state change mutexes and conds */
177 #define GST_STATE_GET_LOCK(elem) (GST_ELEMENT_CAST(elem)->state_lock)
178 #define GST_STATE_LOCK(elem) g_mutex_lock(GST_STATE_GET_LOCK(elem))
179 #define GST_STATE_TRYLOCK(elem) g_mutex_trylock(GST_STATE_GET_LOCK(elem))
180 #define GST_STATE_UNLOCK(elem) g_mutex_unlock(GST_STATE_GET_LOCK(elem))
181 #define GST_STATE_GET_COND(elem) (GST_ELEMENT_CAST(elem)->state_cond)
182 #define GST_STATE_WAIT(elem) g_cond_wait (GST_STATE_GET_COND (elem), GST_STATE_GET_LOCK (elem))
183 #define GST_STATE_TIMED_WAIT(elem, timeval) g_cond_timed_wait (GST_STATE_GET_COND (elem), GST_STATE_GET_LOCK (elem),\
185 #define GST_STATE_SIGNAL(elem) g_cond_signal (GST_STATE_GET_COND (elem));
186 #define GST_STATE_BROADCAST(elem) g_cond_broadcast (GST_STATE_GET_COND (elem));
192 /*< public >*/ /* with STATE_LOCK */
196 guint8 current_state;
197 guint8 pending_state;
199 gboolean state_error; /* flag is set when the element has an error in the last state
200 change. it is cleared when doing another state change. */
201 gboolean no_preroll; /* flag is set when the element cannot preroll */
202 /*< public >*/ /* with LOCK */
205 /* allocated clock */
207 GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
209 /* element pads, these lists can only be iterated while holding
210 * the LOCK or checking the cookie after each LOCK. */
220 gpointer _gst_reserved[GST_PADDING];
223 struct _GstElementClass
225 GstObjectClass parent_class;
228 /* the element details */
229 GstElementDetails details;
231 /* factory that the element was created from */
232 GstElementFactory *elementfactory;
234 /* templates for our pads */
236 gint numpadtemplates;
237 guint32 pad_templ_cookie;
240 /* signal callbacks */
241 void (*state_changed) (GstElement *element, GstState old, GstState state);
242 void (*pad_added) (GstElement *element, GstPad *pad);
243 void (*pad_removed) (GstElement *element, GstPad *pad);
244 void (*no_more_pads) (GstElement *element);
247 /* virtual methods for subclasses */
249 /* request/release pads */
250 GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name);
251 void (*release_pad) (GstElement *element, GstPad *pad);
254 GstStateChangeReturn (*get_state) (GstElement * element, GstState * state,
255 GstState * pending, GTimeVal * timeout);
256 GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition);
259 void (*set_bus) (GstElement * element, GstBus * bus);
262 GstClock* (*get_clock) (GstElement *element);
263 void (*set_clock) (GstElement *element, GstClock *clock);
266 GstIndex* (*get_index) (GstElement *element);
267 void (*set_index) (GstElement *element, GstIndex *index);
269 /* query functions */
270 gboolean (*send_event) (GstElement *element, GstEvent *event);
272 const GstQueryType* (*get_query_types) (GstElement *element);
273 gboolean (*query) (GstElement *element, GstQuery *query);
276 gpointer _gst_reserved[GST_PADDING];
279 /* element class pad templates */
280 void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
281 GstPadTemplate* gst_element_class_get_pad_template (GstElementClass *element_class, const gchar *name);
282 GList* gst_element_class_get_pad_template_list (GstElementClass *element_class);
283 void gst_element_class_set_details (GstElementClass *klass,
284 const GstElementDetails *details);
286 /* element instance */
287 GType gst_element_get_type (void);
289 /* basic name and parentage stuff from GstObject */
290 #define gst_element_get_name(elem) gst_object_get_name(GST_OBJECT(elem))
291 #define gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT(elem),name)
292 #define gst_element_get_parent(elem) gst_object_get_parent(GST_OBJECT(elem))
293 #define gst_element_set_parent(elem,parent) gst_object_set_parent(GST_OBJECT(elem),parent)
296 gboolean gst_element_requires_clock (GstElement *element);
297 gboolean gst_element_provides_clock (GstElement *element);
298 GstClock* gst_element_get_clock (GstElement *element);
299 void gst_element_set_clock (GstElement *element, GstClock *clock);
300 void gst_element_set_base_time (GstElement *element, GstClockTime time);
301 GstClockTime gst_element_get_base_time (GstElement *element);
304 gboolean gst_element_is_indexable (GstElement *element);
305 void gst_element_set_index (GstElement *element, GstIndex *index);
306 GstIndex* gst_element_get_index (GstElement *element);
309 void gst_element_set_bus (GstElement * element, GstBus * bus);
310 GstBus * gst_element_get_bus (GstElement * element);
313 gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
314 gboolean gst_element_remove_pad (GstElement *element, GstPad *pad);
315 void gst_element_no_more_pads (GstElement *element);
317 GstPad* gst_element_get_pad (GstElement *element, const gchar *name);
318 GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name);
319 GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name);
320 void gst_element_release_request_pad (GstElement *element, GstPad *pad);
322 GstIterator * gst_element_iterate_pads (GstElement * element);
323 GstIterator * gst_element_iterate_src_pads (GstElement * element);
324 GstIterator * gst_element_iterate_sink_pads (GstElement * element);
326 /* event/query/format stuff */
327 gboolean gst_element_send_event (GstElement *element, GstEvent *event);
328 gboolean gst_element_seek (GstElement *element, gdouble rate,
329 GstFormat format, GstSeekFlags flags,
330 GstSeekType cur_type, gint64 cur,
331 GstSeekType stop_type, gint64 stop);
332 G_CONST_RETURN GstQueryType*
333 gst_element_get_query_types (GstElement *element);
334 gboolean gst_element_query (GstElement *element, GstQuery *query);
337 gboolean gst_element_post_message (GstElement * element, GstMessage * message);
340 gchar * _gst_element_error_printf (const gchar *format, ...);
341 void gst_element_message_full (GstElement * element, GstMessageType type,
342 GQuark domain, gint code, gchar * text,
343 gchar * debug, const gchar * file,
344 const gchar * function, gint line);
346 /* state management */
347 gboolean gst_element_is_locked_state (GstElement *element);
348 gboolean gst_element_set_locked_state (GstElement *element, gboolean locked_state);
349 gboolean gst_element_sync_state_with_parent (GstElement *element);
351 GstStateChangeReturn gst_element_get_state (GstElement * element,
355 GstStateChangeReturn gst_element_set_state (GstElement *element, GstState state);
357 void gst_element_abort_state (GstElement * element);
358 void gst_element_commit_state (GstElement * element);
359 void gst_element_lost_state (GstElement * element);
361 /* factory management */
362 GstElementFactory* gst_element_get_factory (GstElement *element);
366 #endif /* __GST_ELEMENT_H__ */