source: trunk/third/gstreamer/gst/gstelement.h @ 21005

Revision 21005, 19.8 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21004, which included commits to RCS files with non-trunk default branches.
Line 
1/* GStreamer
2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 *                    2000 Wim Taymans <wtay@chello.be>
4 *
5 * gstelement.h: Header for GstElement
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_ELEMENT_H__
25#define __GST_ELEMENT_H__
26
27#include <gst/gstconfig.h>
28#include <gst/gsttypes.h>
29#include <gst/gstobject.h>
30#include <gst/gstpad.h>
31#include <gst/gstclock.h>
32#include <gst/gstplugin.h>
33#include <gst/gstpluginfeature.h>
34#include <gst/gstindex.h>
35#include <gst/gsttag.h>
36
37G_BEGIN_DECLS
38
39typedef struct _GstElementDetails GstElementDetails;
40
41/* FIXME: need translatable stuff in here (how handle in registry)? */
42struct _GstElementDetails {
43  gchar *longname;              /* long, english name */
44  gchar *klass;                 /* type of element, as hierarchy */
45  gchar *description;           /* insights of one form or another */
46  gchar *author;                /* who wrote this thing? */
47
48  gpointer _gst_reserved[GST_PADDING];
49};
50#define GST_ELEMENT_DETAILS(longname,klass,description,author)          \
51  { longname, klass, description, author, GST_PADDING_INIT }
52#define GST_IS_ELEMENT_DETAILS(details) (                                       \
53  (details) && ((details)->longname != NULL) && ((details)->klass != NULL)      \
54  && ((details)->description != NULL) && ((details)->author != NULL))
55
56#define GST_NUM_STATES 4
57
58/* NOTE: this probably should be done with an #ifdef to decide
59 * whether to safe-cast or to just do the non-checking cast.
60 */
61#define GST_STATE(obj)                  (GST_ELEMENT(obj)->current_state)
62#define GST_STATE_PENDING(obj)          (GST_ELEMENT(obj)->pending_state)
63
64/* Note: using 8 bit shift mostly "just because", it leaves us enough room to grow <g> */
65#define GST_STATE_TRANSITION(obj)       ((GST_STATE(obj)<<8) | GST_STATE_PENDING(obj))
66#define GST_STATE_NULL_TO_READY         ((GST_STATE_NULL<<8) | GST_STATE_READY)
67#define GST_STATE_READY_TO_PAUSED       ((GST_STATE_READY<<8) | GST_STATE_PAUSED)
68#define GST_STATE_PAUSED_TO_PLAYING     ((GST_STATE_PAUSED<<8) | GST_STATE_PLAYING)
69#define GST_STATE_PLAYING_TO_PAUSED     ((GST_STATE_PLAYING<<8) | GST_STATE_PAUSED)
70#define GST_STATE_PAUSED_TO_READY       ((GST_STATE_PAUSED<<8) | GST_STATE_READY)
71#define GST_STATE_READY_TO_NULL         ((GST_STATE_READY<<8) | GST_STATE_NULL)
72
73GST_EXPORT GType _gst_element_type;
74
75#define GST_TYPE_ELEMENT                (_gst_element_type)
76#define GST_IS_ELEMENT(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
77#define GST_IS_ELEMENT_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
78#define GST_ELEMENT_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass))
79#define GST_ELEMENT(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
80#define GST_ELEMENT_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
81
82/* convenience functions */
83#ifndef GST_DISABLE_DEPRECATED
84#ifdef G_HAVE_ISO_VARARGS
85#define GST_ELEMENT_QUERY_TYPE_FUNCTION(functionname, ...) \
86        GST_QUERY_TYPE_FUNCTION (GstElement*, functionname, __VA_ARGS__);
87#define GST_ELEMENT_FORMATS_FUNCTION(functionname, ...)    \
88        GST_FORMATS_FUNCTION (GstElement*, functionname, __VA_ARGS__);
89#define GST_ELEMENT_EVENT_MASK_FUNCTION(functionname, ...) \
90        GST_EVENT_MASK_FUNCTION (GstElement*, functionname, __VA_ARGS__);
91#elif defined(G_HAVE_GNUC_VARARGS)
92#define GST_ELEMENT_QUERY_TYPE_FUNCTION(functionname, a...) \
93        GST_QUERY_TYPE_FUNCTION (GstElement*, functionname, a);
94#define GST_ELEMENT_FORMATS_FUNCTION(functionname, a...)    \
95        GST_FORMATS_FUNCTION (GstElement*, functionname, a);
96#define GST_ELEMENT_EVENT_MASK_FUNCTION(functionname, a...) \
97        GST_EVENT_MASK_FUNCTION (GstElement*, functionname, a);
98#endif
99#endif
100
101typedef enum {
102  /* element is complex (for some def.) and generally require a cothread */
103  GST_ELEMENT_COMPLEX           = GST_OBJECT_FLAG_LAST,
104  /* input and output pads aren't directly coupled to each other
105     examples: queues, multi-output async readers, etc. */
106  GST_ELEMENT_DECOUPLED,
107  /* this element should be placed in a thread if at all possible */
108  GST_ELEMENT_THREAD_SUGGESTED,
109  /* this element, for some reason, has a loop function that performs
110   * an infinite loop without calls to gst_element_yield () */
111  GST_ELEMENT_INFINITE_LOOP,
112  /* there is a new loopfunction ready for placement */
113  GST_ELEMENT_NEW_LOOPFUNC,
114  /* if this element can handle events */
115  GST_ELEMENT_EVENT_AWARE,
116  /* use threadsafe property get/set implementation */
117  GST_ELEMENT_USE_THREADSAFE_PROPERTIES,
118
119  /* private flags that can be used by the scheduler */
120  GST_ELEMENT_SCHEDULER_PRIVATE1,
121  GST_ELEMENT_SCHEDULER_PRIVATE2,
122
123  /* ignore state changes from parent */
124  GST_ELEMENT_LOCKED_STATE,
125
126  /* element is in error */
127  GST_ELEMENT_IN_ERROR,
128
129  /* use some padding for future expansion */
130  GST_ELEMENT_FLAG_LAST         = GST_OBJECT_FLAG_LAST + 16
131} GstElementFlags;
132
133#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj)    (GST_FLAG_IS_SET(obj,GST_ELEMENT_THREAD_SUGGESTED))
134#define GST_ELEMENT_IS_EVENT_AWARE(obj)         (GST_FLAG_IS_SET(obj,GST_ELEMENT_EVENT_AWARE))
135#define GST_ELEMENT_IS_DECOUPLED(obj)           (GST_FLAG_IS_SET(obj,GST_ELEMENT_DECOUPLED))
136
137#define GST_ELEMENT_NAME(obj)                   (GST_OBJECT_NAME(obj))
138#define GST_ELEMENT_PARENT(obj)                 (GST_OBJECT_PARENT(obj))
139#define GST_ELEMENT_SCHED(obj)                  (((GstElement*)(obj))->sched)
140#define GST_ELEMENT_CLOCK(obj)                  (((GstElement*)(obj))->clock)
141#define GST_ELEMENT_PADS(obj)                   ((obj)->pads)
142
143#define GST_ELEMENT_ERROR(el, domain, code, message, debug) G_STMT_START { \
144  gchar *__msg = _gst_element_error_printf message; \
145  gchar *__dbg = _gst_element_error_printf debug; \
146  if (__msg) \
147    GST_ERROR_OBJECT (el, "%s", __msg); \
148  if (__dbg) \
149  GST_ERROR_OBJECT (el, "%s", __dbg); \
150  gst_element_error_full (GST_ELEMENT(el), \
151  GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
152  __msg, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
153} G_STMT_END
154
155typedef struct _GstElementFactory GstElementFactory;
156typedef struct _GstElementFactoryClass GstElementFactoryClass;
157
158typedef void            (*GstElementLoopFunction)       (GstElement *element);
159typedef void            (*GstElementPreRunFunction)     (GstElement *element);
160typedef void            (*GstElementPostRunFunction)    (GstElement *element);
161
162struct _GstElement {
163  GstObject             object;
164
165  /* element state  and scheduling */
166  guint8                current_state;
167  guint8                pending_state;
168  GstElementLoopFunction loopfunc;
169
170  GstScheduler          *sched;
171  gpointer              sched_private;
172
173  /* allocated clock */
174  GstClock              *clock;
175  GstClockTimeDiff      base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
176
177  /* element pads */
178  guint16               numpads;
179  guint16               numsrcpads;
180  guint16               numsinkpads;
181  GList                 *pads;
182
183  GMutex                *state_mutex;
184  GCond                 *state_cond;
185
186  GstElementPreRunFunction  pre_run_func;
187  GstElementPostRunFunction post_run_func;
188  GAsyncQueue           *prop_value_queue;
189  GMutex                *property_mutex;
190
191  gpointer _gst_reserved[GST_PADDING];
192};
193
194struct _GstElementClass {
195  GstObjectClass        parent_class;
196
197  /* the element details */
198  GstElementDetails     details;
199
200  /* factory that the element was created from */
201  GstElementFactory     *elementfactory;
202
203  /* templates for our pads */
204  GList                 *padtemplates;
205  gint                  numpadtemplates;
206 
207  /* signal callbacks */
208  void (*state_change)  (GstElement *element, GstElementState old, GstElementState state);
209  void (*new_pad)       (GstElement *element, GstPad *pad);
210  void (*pad_removed)   (GstElement *element, GstPad *pad);
211  void (*error)         (GstElement *element, GstElement *source, GError *error, gchar *debug);
212  void (*eos)           (GstElement *element);
213  void (*found_tag)     (GstElement *element, GstElement *source, const GstTagList *tag_list);
214
215  /* local pointers for get/set */
216  void (*set_property)  (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
217  void (*get_property)  (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
218
219  /* vtable*/
220  gboolean              (*release_locks)        (GstElement *element);
221
222  /* query/convert/events functions */
223  const GstEventMask*   (*get_event_masks)      (GstElement *element);
224  gboolean              (*send_event)           (GstElement *element, GstEvent *event);
225  const GstFormat*      (*get_formats)          (GstElement *element);
226  gboolean              (*convert)              (GstElement *element,
227                                                 GstFormat  src_format,  gint64  src_value,
228                                                 GstFormat *dest_format, gint64 *dest_value);
229  const GstQueryType*   (*get_query_types)      (GstElement *element);
230  gboolean              (*query)                (GstElement *element, GstQueryType type,
231                                                 GstFormat *format, gint64 *value);
232
233  /* change the element state */
234  GstElementStateReturn (*change_state)         (GstElement *element);
235
236  /* request/release pads */
237  GstPad*               (*request_new_pad)      (GstElement *element, GstPadTemplate *templ, const gchar* name);
238  void                  (*release_pad)          (GstElement *element, GstPad *pad);
239
240  /* set/get clocks */
241  GstClock*             (*get_clock)            (GstElement *element);
242  void                  (*set_clock)            (GstElement *element, GstClock *clock);
243
244  /* index */
245  GstIndex*             (*get_index)            (GstElement *element);
246  void                  (*set_index)            (GstElement *element, GstIndex *index);
247
248  GstElementStateReturn (*set_state)            (GstElement *element, GstElementState state);
249
250  /* FIXME 0.9: move up to signals */
251  void                  (*no_more_pads)         (GstElement *element);
252 
253  gpointer _gst_reserved[GST_PADDING - 1];
254};
255
256void                    gst_element_class_add_pad_template      (GstElementClass *klass, GstPadTemplate *templ);
257void                    gst_element_class_install_std_props     (GstElementClass *klass,
258                                                                 const gchar      *first_name, ...);
259void                    gst_element_class_set_details           (GstElementClass *klass,
260                                                                 const GstElementDetails *details);
261
262#define                 gst_element_default_deep_notify         gst_object_default_deep_notify
263
264void                    gst_element_default_error               (GObject *object, GstObject *orig, GError *error, gchar *debug);
265
266GType                   gst_element_get_type            (void);
267void                    gst_element_set_loop_function   (GstElement *element,
268                                                         GstElementLoopFunction loop);
269
270#define                 gst_element_get_name(elem)      gst_object_get_name(GST_OBJECT(elem))
271#define                 gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT(elem),name)
272#define                 gst_element_get_parent(elem)    gst_object_get_parent(GST_OBJECT(elem))
273#define                 gst_element_set_parent(elem,parent)     gst_object_set_parent(GST_OBJECT(elem),parent)
274
275/* threadsafe versions of their g_object_* counterparts */
276void                    gst_element_set                 (GstElement *element, const gchar *first_property_name, ...);
277void                    gst_element_get                 (GstElement *element, const gchar *first_property_name, ...);
278void                    gst_element_set_valist          (GstElement *element, const gchar *first_property_name,
279                                                         va_list var_args);
280void                    gst_element_get_valist          (GstElement *element, const gchar *first_property_name,
281                                                         va_list var_args);
282void                    gst_element_set_property        (GstElement *element, const gchar *property_name,
283                                                         const GValue   *value);
284void                    gst_element_get_property        (GstElement *element, const gchar *property_name,
285                                                         GValue *value);
286
287void                    gst_element_enable_threadsafe_properties        (GstElement *element);
288void                    gst_element_disable_threadsafe_properties       (GstElement *element);
289void                    gst_element_set_pending_properties              (GstElement *element);
290
291/* clocking */
292gboolean                gst_element_requires_clock      (GstElement *element);
293gboolean                gst_element_provides_clock      (GstElement *element);
294GstClock*               gst_element_get_clock           (GstElement *element);
295void                    gst_element_set_clock           (GstElement *element, GstClock *clock);
296GstClockReturn          gst_element_clock_wait          (GstElement *element,
297                                                         GstClockID id, GstClockTimeDiff *jitter);
298GstClockTime            gst_element_get_time            (GstElement *element);
299gboolean                gst_element_wait                (GstElement *element, GstClockTime timestamp);
300void                    gst_element_set_time            (GstElement *element, GstClockTime time);
301void                    gst_element_set_time_delay      (GstElement *element, GstClockTime time, GstClockTime delay);
302
303void                    gst_element_adjust_time         (GstElement *element, GstClockTimeDiff diff);
304 
305/* indexs */
306gboolean                gst_element_is_indexable        (GstElement *element);
307void                    gst_element_set_index           (GstElement *element, GstIndex *index);
308GstIndex*               gst_element_get_index           (GstElement *element);
309
310
311gboolean                gst_element_release_locks       (GstElement *element);
312
313void                    gst_element_yield               (GstElement *element);
314gboolean                gst_element_interrupt           (GstElement *element);
315void                    gst_element_set_scheduler       (GstElement *element, GstScheduler *sched);
316GstScheduler*           gst_element_get_scheduler       (GstElement *element);
317
318void                    gst_element_add_pad             (GstElement *element, GstPad *pad);
319void                    gst_element_remove_pad          (GstElement *element, GstPad *pad);
320GstPad *                gst_element_add_ghost_pad       (GstElement *element, GstPad *pad, const gchar *name);
321#ifndef GST_DISABLE_DEPRECATED
322void                    gst_element_remove_ghost_pad    (GstElement *element, GstPad *pad);
323#endif
324void                    gst_element_no_more_pads        (GstElement *element);
325
326GstPad*                 gst_element_get_pad             (GstElement *element, const gchar *name);
327GstPad*                 gst_element_get_static_pad      (GstElement *element, const gchar *name);
328GstPad*                 gst_element_get_request_pad     (GstElement *element, const gchar *name);
329void                    gst_element_release_request_pad (GstElement *element, GstPad *pad);
330
331G_CONST_RETURN GList*
332                        gst_element_get_pad_list        (GstElement *element);
333GstPad*                 gst_element_get_compatible_pad  (GstElement *element, GstPad *pad);
334GstPad*                 gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad,
335                                                         const GstCaps *filtercaps);
336
337GstPadTemplate*         gst_element_class_get_pad_template      (GstElementClass *element_class, const gchar *name);
338GList*                  gst_element_class_get_pad_template_list (GstElementClass *element_class);
339GstPadTemplate*         gst_element_get_pad_template            (GstElement *element, const gchar *name);
340GList*                  gst_element_get_pad_template_list       (GstElement *element);
341GstPadTemplate*         gst_element_get_compatible_pad_template (GstElement *element, GstPadTemplate *compattempl);
342
343gboolean                gst_element_link                (GstElement *src, GstElement *dest);
344gboolean                gst_element_link_many           (GstElement *element_1,
345                                                         GstElement *element_2, ...);
346gboolean                gst_element_link_filtered       (GstElement *src, GstElement *dest,
347                                                         const GstCaps *filtercaps);
348void                    gst_element_unlink              (GstElement *src, GstElement *dest);
349void                    gst_element_unlink_many         (GstElement *element_1,
350                                                         GstElement *element_2, ...);
351
352gboolean                gst_element_link_pads           (GstElement *src, const gchar *srcpadname,
353                                                         GstElement *dest, const gchar *destpadname);
354gboolean                gst_element_link_pads_filtered  (GstElement *src, const gchar *srcpadname,
355                                                         GstElement *dest, const gchar *destpadname,
356                                                         const GstCaps *filtercaps);
357void                    gst_element_unlink_pads         (GstElement *src, const gchar *srcpadname,
358                                                         GstElement *dest, const gchar *destpadname);
359
360G_CONST_RETURN GstEventMask*
361                        gst_element_get_event_masks     (GstElement *element);
362gboolean                gst_element_send_event          (GstElement *element, GstEvent *event);
363gboolean                gst_element_seek                (GstElement *element, GstSeekType seek_type,
364                                                         guint64 offset);
365G_CONST_RETURN GstQueryType*
366                        gst_element_get_query_types     (GstElement *element);
367gboolean                gst_element_query               (GstElement *element, GstQueryType type,
368                                                         GstFormat *format, gint64 *value);
369G_CONST_RETURN GstFormat*
370                        gst_element_get_formats         (GstElement *element);
371gboolean                gst_element_convert             (GstElement *element,
372                                                         GstFormat  src_format,  gint64  src_value,
373                                                         GstFormat *dest_format, gint64 *dest_value);
374
375void                    gst_element_found_tags          (GstElement *element, const GstTagList *tag_list);
376void                    gst_element_found_tags_for_pad  (GstElement *element, GstPad *pad, GstClockTime timestamp,
377                                                         GstTagList *list);
378
379void                    gst_element_set_eos             (GstElement *element);
380
381gchar *                 _gst_element_error_printf       (const gchar *format, ...);
382void                    gst_element_error_full          (GstElement *element, GQuark domain, gint code,
383                                                         gchar *message, gchar *debug,
384                                                         const gchar *file, const gchar *function, gint line);
385
386gboolean                gst_element_is_locked_state     (GstElement *element);
387void                    gst_element_set_locked_state    (GstElement *element, gboolean locked_state);
388gboolean                gst_element_sync_state_with_parent (GstElement *element);
389
390GstElementState         gst_element_get_state           (GstElement *element);
391GstElementStateReturn   gst_element_set_state           (GstElement *element, GstElementState state);
392
393void                    gst_element_wait_state_change   (GstElement *element);
394       
395G_CONST_RETURN gchar*   gst_element_state_get_name      (GstElementState state);
396
397GstElementFactory*      gst_element_get_factory         (GstElement *element);
398
399GstBin*                 gst_element_get_managing_bin    (GstElement *element);
400
401
402/*
403 *
404 * factories stuff
405 *
406 **/
407
408#define GST_TYPE_ELEMENT_FACTORY                (gst_element_factory_get_type())
409#define GST_ELEMENT_FACTORY(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENT_FACTORY,\
410                                                 GstElementFactory))
411#define GST_ELEMENT_FACTORY_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENT_FACTORY,\
412                                                 GstElementFactoryClass))
413#define GST_IS_ELEMENT_FACTORY(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENT_FACTORY))
414#define GST_IS_ELEMENT_FACTORY_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENT_FACTORY))
415
416struct _GstElementFactory {
417  GstPluginFeature      parent;
418
419  GType                 type;                   /* unique GType of element or 0 if not loaded */
420
421  GstElementDetails     details;
422
423  GList *               padtemplates;
424  guint                 numpadtemplates;
425
426  /* URI interface stuff */
427  guint                 uri_type;
428  gchar **              uri_protocols;
429 
430  GList *               interfaces;             /* interfaces this element implements */
431
432  gpointer _gst_reserved[GST_PADDING];
433};
434
435struct _GstElementFactoryClass {
436  GstPluginFeatureClass parent_class;
437
438  gpointer _gst_reserved[GST_PADDING];
439};
440
441GType                   gst_element_factory_get_type            (void);
442
443gboolean                gst_element_register                    (GstPlugin *plugin,
444                                                                 const gchar *name,
445                                                                 guint rank,
446                                                                 GType type);
447
448GstElementFactory *     gst_element_factory_find                (const gchar *name);
449GType                   gst_element_factory_get_element_type    (GstElementFactory *factory);
450G_CONST_RETURN gchar *  gst_element_factory_get_longname        (GstElementFactory *factory);
451G_CONST_RETURN gchar *  gst_element_factory_get_klass           (GstElementFactory *factory);
452G_CONST_RETURN gchar *  gst_element_factory_get_description     (GstElementFactory *factory);
453G_CONST_RETURN gchar *  gst_element_factory_get_author          (GstElementFactory *factory);
454guint                   gst_element_factory_get_num_pad_templates (GstElementFactory *factory);
455G_CONST_RETURN GList *  gst_element_factory_get_pad_templates   (GstElementFactory *factory);
456guint                   gst_element_factory_get_uri_type        (GstElementFactory *factory);           
457gchar **                gst_element_factory_get_uri_protocols   (GstElementFactory *factory);           
458
459GstElement*             gst_element_factory_create              (GstElementFactory *factory,
460                                                                 const gchar *name);
461GstElement*             gst_element_factory_make                (const gchar *factoryname, const gchar *name);
462
463gboolean                gst_element_factory_can_src_caps        (GstElementFactory *factory,
464                                                                 const GstCaps *caps);
465gboolean                gst_element_factory_can_sink_caps       (GstElementFactory *factory,
466                                                                 const GstCaps *caps);
467
468void                    __gst_element_factory_add_pad_template  (GstElementFactory *elementfactory,
469                                                                 GstPadTemplate *templ);
470void                    __gst_element_factory_add_interface     (GstElementFactory *elementfactory,
471                                                                 const gchar *interfacename);
472
473
474G_END_DECLS
475
476
477#endif /* __GST_ELEMENT_H__ */
478
Note: See TracBrowser for help on using the repository browser.