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 */
34 * @GST_STATE_VOID_PENDING : no pending state.
35 * @GST_STATE_NULL : the NULL state or initial state of an element
36 * @GST_STATE_READY : the element is ready to go to PAUSED
37 * @GST_STATE_PAUSED : the element is PAUSED
38 * @GST_STATE_PLAYING : the element is PLAYING
40 * The posible states an element can be in.
43 GST_STATE_VOID_PENDING = 0,
51 #include <gst/gstconfig.h>
52 #include <gst/gstobject.h>
53 #include <gst/gstpad.h>
54 #include <gst/gstbus.h>
55 #include <gst/gstclock.h>
56 #include <gst/gstelementfactory.h>
57 #include <gst/gstplugin.h>
58 #include <gst/gstpluginfeature.h>
59 #include <gst/gstindex.h>
60 #include <gst/gstindexfactory.h>
61 #include <gst/gstiterator.h>
62 #include <gst/gstmessage.h>
63 #include <gst/gsttaglist.h>
67 #define GST_TYPE_ELEMENT (gst_element_get_type ())
68 #define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
69 #define GST_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
70 #define GST_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass))
71 #define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
72 #define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
73 #define GST_ELEMENT_CAST(obj) ((GstElement*)(obj))
76 * GstStateChangeReturn:
77 * @GST_STATE_CHANGE_FAILURE : the state change failed
78 * @GST_STATE_CHANGE_SUCCESS : the state change succeeded
79 * @GST_STATE_CHANGE_ASYNC : the state change will happen asynchronously
80 * @GST_STATE_CHANGE_NO_PREROLL: the state change cannot be prerolled
82 * the possible return values from a state change function.
85 GST_STATE_CHANGE_FAILURE = 0,
86 GST_STATE_CHANGE_SUCCESS = 1,
87 GST_STATE_CHANGE_ASYNC = 2,
88 GST_STATE_CHANGE_NO_PREROLL = 3
89 } GstStateChangeReturn;
91 /* NOTE: this probably should be done with an #ifdef to decide
92 * whether to safe-cast or to just do the non-checking cast.
97 * @elem: a #GstElement to return state for.
99 * This macro returns the current #GstState of the element.
101 #define GST_STATE(elem) (GST_ELEMENT_CAST(elem)->current_state)
105 * @elem: a #GstElement to return the next state for.
107 * This macro returns the next #GstState of the element.
109 #define GST_STATE_NEXT(elem) (GST_ELEMENT_CAST(elem)->next_state)
113 * @elem: a #GstElement to return the pending state for.
115 * This macro returns the currently pending #GstState of the element.
117 #define GST_STATE_PENDING(elem) (GST_ELEMENT_CAST(elem)->pending_state)
121 * @elem: a #GstElement to return the last state result for.
123 * This macro returns the last #GstStateChangeReturn value.
125 #define GST_STATE_RETURN(elem) (GST_ELEMENT_CAST(elem)->last_return)
127 #define __GST_SIGN(val) ((val) < 0 ? -1 : ((val) > 0 ? 1 : 0))
129 * GST_STATE_GET_NEXT:
130 * @cur: A starting #GstState
131 * @pending: A target #GstState
133 * Given a current state @cur and a target state @pending, calculate the next (intermediate)
136 #define GST_STATE_GET_NEXT(cur,pending) ((cur) + __GST_SIGN ((gint)(pending) - (gint)(cur)))
138 * GST_STATE_TRANSITION:
139 * @cur: A current state
140 * @next: A next state
142 * Given a current state @cur and a next state @next, calculate the associated
143 * #GstStateChange transition.
145 #define GST_STATE_TRANSITION(cur,next) (((cur)<<3)|(next))
147 * GST_STATE_TRANSITION_CURRENT:
148 * @trans: A #GstStateChange
150 * Given a state transition @trans, extract the current #GstState.
152 #define GST_STATE_TRANSITION_CURRENT(trans) ((trans)>>3)
154 * GST_STATE_TRANSITION_NEXT:
155 * @trans: A #GstStateChange
157 * Given a state transition @trans, extract the next #GstState.
159 #define GST_STATE_TRANSITION_NEXT(trans) ((trans)&0x7)
163 * @GST_STATE_CHANGE_NULL_TO_READY : state change from NULL to READY
164 * @GST_STATE_CHANGE_READY_TO_PAUSED : state change from READY to PAUSED
165 * @GST_STATE_CHANGE_PAUSED_TO_PLAYING: state change from PAUSED to PLAYING
166 * @GST_STATE_CHANGE_PLAYING_TO_PAUSED: state change from PLAYING to PAUSED
167 * @GST_STATE_CHANGE_PAUSED_TO_READY : state change from PAUSED to READY
168 * @GST_STATE_CHANGE_READY_TO_NULL : state change from READY to NULL
170 * The different (interesting) state changes that are passed to the
171 * state change functions of elements.
173 typedef enum /*< flags=0 >*/
175 GST_STATE_CHANGE_NULL_TO_READY = (GST_STATE_NULL<<3) | GST_STATE_READY,
176 GST_STATE_CHANGE_READY_TO_PAUSED = (GST_STATE_READY<<3) | GST_STATE_PAUSED,
177 GST_STATE_CHANGE_PAUSED_TO_PLAYING = (GST_STATE_PAUSED<<3) | GST_STATE_PLAYING,
178 GST_STATE_CHANGE_PLAYING_TO_PAUSED = (GST_STATE_PLAYING<<3) | GST_STATE_PAUSED,
179 GST_STATE_CHANGE_PAUSED_TO_READY = (GST_STATE_PAUSED<<3) | GST_STATE_READY,
180 GST_STATE_CHANGE_READY_TO_NULL = (GST_STATE_READY<<3) | GST_STATE_NULL
185 * @GST_ELEMENT_LOCKED_STATE: ignore state changes from parent
186 * @GST_ELEMENT_IS_SINK: the element is a sink
187 * @GST_ELEMENT_UNPARENTING: Child is being removed from the parent bin.
188 * gst_bin_remove() on a child already being removed immediately returns FALSE
189 * @GST_ELEMENT_FLAG_LAST: offset to define more flags
191 * The standard flags that an element may have.
195 GST_ELEMENT_LOCKED_STATE = (GST_OBJECT_FLAG_LAST << 0),
196 GST_ELEMENT_IS_SINK = (GST_OBJECT_FLAG_LAST << 1),
197 GST_ELEMENT_UNPARENTING = (GST_OBJECT_FLAG_LAST << 2),
199 GST_ELEMENT_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 16)
203 * GST_ELEMENT_IS_LOCKED_STATE:
204 * @elem: A #GstElement to query
206 * Check if the element is in the locked state and therefore will ignore state
207 * changes from its parent object.
209 #define GST_ELEMENT_IS_LOCKED_STATE(elem) (GST_OBJECT_FLAG_IS_SET(elem,GST_ELEMENT_LOCKED_STATE))
213 * @elem: A #GstElement to query
215 * Gets the name of this element. Use only in core as this is not
216 * ABI-compatible. Others use gst_element_get_name()
218 #define GST_ELEMENT_NAME(elem) (GST_OBJECT_NAME(elem))
221 * GST_ELEMENT_PARENT:
222 * @elem: A #GstElement to query
224 * Get the parent object of this element.
226 #define GST_ELEMENT_PARENT(elem) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(elem)))
230 * @elem: A #GstElement to query
232 * Get the message bus of this element.
234 #define GST_ELEMENT_BUS(elem) (GST_ELEMENT_CAST(elem)->bus)
238 * @elem: A #GstElement to query
240 * Get the clock of this element
242 #define GST_ELEMENT_CLOCK(elem) (GST_ELEMENT_CAST(elem)->clock)
246 * @elem: A #GstElement to query
248 * Get the pads of this elements.
250 #define GST_ELEMENT_PADS(elem) (GST_ELEMENT_CAST(elem)->pads)
254 * @el: the element that throws the error
255 * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #GstGError)
256 * @code: error code defined for that domain (see #GstGError)
257 * @text: the message to display (format string and args enclosed in
259 * @debug: debugging information for the message (format string and args
260 enclosed in parentheses)
262 * Utility function that elements can use in case they encountered a fatal
263 * data processing error. The pipeline will throw an error signal and the
264 * application will be requested to stop further media processing.
266 #define GST_ELEMENT_ERROR(el, domain, code, text, debug) \
268 gchar *__txt = _gst_element_error_printf text; \
269 gchar *__dbg = _gst_element_error_printf debug; \
271 GST_WARNING_OBJECT (el, "error: %s", __txt); \
273 GST_WARNING_OBJECT (el, "error: %s", __dbg); \
274 gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_ERROR, \
275 GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
276 __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
280 * GST_ELEMENT_WARNING:
281 * @el: the element that throws the error
282 * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #GstGError)
283 * @code: error code defined for that domain (see #GstGError)
284 * @text: the message to display (format string and args enclosed in
286 * @debug: debugging information for the message (format string and args
287 enclosed in parentheses)
289 * Utility function that elements can use in case they encountered a non-fatal
290 * data processing problem. The pipeline will throw a warning signal and the
291 * application will be informed.
293 #define GST_ELEMENT_WARNING(el, domain, code, text, debug) \
295 gchar *__txt = _gst_element_error_printf text; \
296 gchar *__dbg = _gst_element_error_printf debug; \
298 GST_WARNING_OBJECT (el, "warning: %s", __txt); \
300 GST_WARNING_OBJECT (el, "warning: %s", __dbg); \
301 gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_WARNING, \
302 GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
303 __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
306 /* the state change mutexes and conds */
308 * GST_STATE_GET_LOCK:
309 * @elem: a #GstElement
311 * Get a reference to the state lock of @elem.
312 * This lock is used by the core. It is taken while getting or setting
313 * the state, during state changes, and while finalizing.
315 #define GST_STATE_GET_LOCK(elem) (GST_ELEMENT_CAST(elem)->state_lock)
317 * GST_STATE_GET_COND:
318 * @elem: a #GstElement
320 * Get the conditional used to signal the completion of a state change.
322 #define GST_STATE_GET_COND(elem) (GST_ELEMENT_CAST(elem)->state_cond)
324 #define GST_STATE_LOCK(elem) g_static_rec_mutex_lock(GST_STATE_GET_LOCK(elem))
325 #define GST_STATE_TRYLOCK(elem) g_static_rec_mutex_trylock(GST_STATE_GET_LOCK(elem))
326 #define GST_STATE_UNLOCK(elem) g_static_rec_mutex_unlock(GST_STATE_GET_LOCK(elem))
327 #define GST_STATE_UNLOCK_FULL(elem) g_static_rec_mutex_unlock_full(GST_STATE_GET_LOCK(elem))
328 #define GST_STATE_LOCK_FULL(elem,t) g_static_rec_mutex_lock_full(GST_STATE_GET_LOCK(elem), t)
329 #define GST_STATE_WAIT(elem) g_cond_wait (GST_STATE_GET_COND (elem), \
330 GST_OBJECT_GET_LOCK (elem))
331 #define GST_STATE_TIMED_WAIT(elem, timeval) g_cond_timed_wait (GST_STATE_GET_COND (elem), \
332 GST_OBJECT_GET_LOCK (elem), timeval)
333 #define GST_STATE_SIGNAL(elem) g_cond_signal (GST_STATE_GET_COND (elem));
334 #define GST_STATE_BROADCAST(elem) g_cond_broadcast (GST_STATE_GET_COND (elem));
338 * @state_lock: Used to serialize execution of gst_element_set_state()
339 * @state_cond: Used to signal completion of a state change
340 * @state_cookie: Used to detect concurrent execution of
341 * gst_element_set_state() and gst_element_get_state()
342 * @current_state: the current state of an element
343 * @next_state: the next state of an element, can be #GST_STATE_VOID_PENDING if
344 * the element is in the correct state.
345 * @pending_state: the final state the element should go to, can be
346 * #GST_STATE_VOID_PENDING if the element is in the correct state
347 * @last_return: the last return value of an element state change
348 * @bus: the bus of the element. This bus is provided to the element by the
349 * parent element or the application. A #GstPipeline has a bus of its own.
350 * @clock: the clock of the element. This clock is usually provided by to the
351 * element by the toplevel #GstPipeline.
352 * @base_time: the time of the clock right before the element is set to
353 * PLAYING. Subtracting @base_time from the current clock time in the PLAYING
354 * state will yield the stream time.
355 * @numpads: number of pads of the element, includes both source and sink pads.
356 * @pads: list of pads
357 * @numsrcpads: number of source pads of the element.
358 * @srcpads: list of source pads
359 * @numsinkpads: number of sink pads of the element.
360 * @sinkpads: list of sink pads
361 * @pads_cookie: updated whenever the a pad is added or removed
363 * GStreamer element abstract base class.
369 /*< public >*/ /* with LOCK */
370 GStaticRecMutex *state_lock;
374 guint32 state_cookie;
375 GstState current_state;
377 GstState pending_state;
378 GstStateChangeReturn last_return;
382 /* allocated clock */
384 GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
386 /* element pads, these lists can only be iterated while holding
387 * the LOCK or checking the cookie after each LOCK. */
397 gpointer _gst_reserved[GST_PADDING];
402 * @parent_class: the parent class structure
403 * @details: #GstElementDetails for elements of this class
404 * @elementfactory: the #GstElementFactory that creates these elements
405 * @padtemplates: a #GList of #GstPadTemplate
406 * @numpadtemplates: the number of padtemplates
407 * @pad_templ_cookie: changed whenever the padtemplates change
408 * @request_new_pad: called when a new pad is requested
409 * @release_pad: called when a request pad is to be released
410 * @get_state: get the state of the element
411 * @set_state: set a new state on the element
412 * @change_state: called by @set_state to perform an incremental state change
413 * @set_bus: set a #GstBus on the element
414 * @provide_clock: gets the #GstClock provided by the element
415 * @set_clock: set the #GstClock on the element
416 * @get_index: set a #GstIndex on the element
417 * @set_index: get the #GstIndex of an element
418 * @send_event: send a #GstEvent to the element
419 * @get_query_types: get the supported #GstQueryType of this element
420 * @query: perform a #GstQuery on the element
422 * GStreamer element class. Override the vmethods to implement the element
425 struct _GstElementClass
427 GstObjectClass parent_class;
430 /* the element details */
431 GstElementDetails details;
433 /* factory that the element was created from */
434 GstElementFactory *elementfactory;
436 /* templates for our pads */
438 gint numpadtemplates;
439 guint32 pad_templ_cookie;
442 /* signal callbacks */
443 void (*pad_added) (GstElement *element, GstPad *pad);
444 void (*pad_removed) (GstElement *element, GstPad *pad);
445 void (*no_more_pads) (GstElement *element);
448 /* virtual methods for subclasses */
450 /* request/release pads */
451 GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name);
452 void (*release_pad) (GstElement *element, GstPad *pad);
455 GstStateChangeReturn (*get_state) (GstElement * element, GstState * state,
456 GstState * pending, GstClockTime timeout);
457 GstStateChangeReturn (*set_state) (GstElement *element, GstState state);
458 GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition);
461 void (*set_bus) (GstElement * element, GstBus * bus);
464 GstClock* (*provide_clock) (GstElement *element);
465 gboolean (*set_clock) (GstElement *element, GstClock *clock);
468 GstIndex* (*get_index) (GstElement *element);
469 void (*set_index) (GstElement *element, GstIndex *index);
471 /* query functions */
472 gboolean (*send_event) (GstElement *element, GstEvent *event);
474 const GstQueryType* (*get_query_types) (GstElement *element);
475 gboolean (*query) (GstElement *element, GstQuery *query);
478 gpointer _gst_reserved[GST_PADDING];
481 /* element class pad templates */
482 void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
483 GstPadTemplate* gst_element_class_get_pad_template (GstElementClass *element_class, const gchar *name);
484 GList* gst_element_class_get_pad_template_list (GstElementClass *element_class);
485 void gst_element_class_set_details (GstElementClass *klass,
486 const GstElementDetails *details);
488 /* element instance */
489 GType gst_element_get_type (void);
491 /* basic name and parentage stuff from GstObject */
494 * gst_element_get_name:
495 * @elem: a #GstElement to set the name of.
497 * Gets the name of the element.
499 #define gst_element_get_name(elem) gst_object_get_name(GST_OBJECT_CAST(elem))
502 * gst_element_set_name:
503 * @elem: a #GstElement to set the name of.
504 * @name: the new name
506 * Sets the name of the element, getting rid of the old name if there was one.
508 #define gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT_CAST(elem),name)
511 * gst_element_get_parent:
512 * @elem: a #GstElement to get the parent of.
514 * Gets the parent of an element.
516 #define gst_element_get_parent(elem) gst_object_get_parent(GST_OBJECT_CAST(elem))
519 * gst_element_set_parent:
520 * @elem: a #GstElement to set the parent of.
521 * @parent: the new parent #GstObject of the element.
523 * Sets the parent of an element.
525 #define gst_element_set_parent(elem,parent) gst_object_set_parent(GST_OBJECT_CAST(elem),parent)
528 gboolean gst_element_requires_clock (GstElement *element);
529 gboolean gst_element_provides_clock (GstElement *element);
530 GstClock* gst_element_provide_clock (GstElement *element);
531 GstClock* gst_element_get_clock (GstElement *element);
532 gboolean gst_element_set_clock (GstElement *element, GstClock *clock);
533 void gst_element_set_base_time (GstElement *element, GstClockTime time);
534 GstClockTime gst_element_get_base_time (GstElement *element);
537 gboolean gst_element_is_indexable (GstElement *element);
538 void gst_element_set_index (GstElement *element, GstIndex *index);
539 GstIndex* gst_element_get_index (GstElement *element);
542 void gst_element_set_bus (GstElement * element, GstBus * bus);
543 GstBus * gst_element_get_bus (GstElement * element);
546 gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
547 gboolean gst_element_remove_pad (GstElement *element, GstPad *pad);
548 void gst_element_no_more_pads (GstElement *element);
550 GstPad* gst_element_get_pad (GstElement *element, const gchar *name);
551 GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name);
552 GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name);
553 void gst_element_release_request_pad (GstElement *element, GstPad *pad);
555 GstIterator * gst_element_iterate_pads (GstElement * element);
556 GstIterator * gst_element_iterate_src_pads (GstElement * element);
557 GstIterator * gst_element_iterate_sink_pads (GstElement * element);
559 /* event/query/format stuff */
560 gboolean gst_element_send_event (GstElement *element, GstEvent *event);
561 gboolean gst_element_seek (GstElement *element, gdouble rate,
562 GstFormat format, GstSeekFlags flags,
563 GstSeekType cur_type, gint64 cur,
564 GstSeekType stop_type, gint64 stop);
565 G_CONST_RETURN GstQueryType*
566 gst_element_get_query_types (GstElement *element);
567 gboolean gst_element_query (GstElement *element, GstQuery *query);
570 gboolean gst_element_post_message (GstElement * element, GstMessage * message);
573 gchar * _gst_element_error_printf (const gchar *format, ...);
574 void gst_element_message_full (GstElement * element, GstMessageType type,
575 GQuark domain, gint code, gchar * text,
576 gchar * debug, const gchar * file,
577 const gchar * function, gint line);
579 /* state management */
580 gboolean gst_element_is_locked_state (GstElement *element);
581 gboolean gst_element_set_locked_state (GstElement *element, gboolean locked_state);
582 gboolean gst_element_sync_state_with_parent (GstElement *element);
584 GstStateChangeReturn gst_element_get_state (GstElement * element,
587 GstClockTime timeout);
588 GstStateChangeReturn gst_element_set_state (GstElement *element, GstState state);
590 void gst_element_abort_state (GstElement * element);
591 GstStateChangeReturn gst_element_continue_state (GstElement * element,
592 GstStateChangeReturn ret);
593 void gst_element_lost_state (GstElement * element);
595 /* factory management */
596 GstElementFactory* gst_element_get_factory (GstElement *element);
600 #endif /* __GST_ELEMENT_H__ */