gstelement.h 10.9 KB
Newer Older
1 2 3 4 5
/* GStreamer
 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
 *                    2000 Wim Taymans <wtay@chello.be>
 *
 * gstelement.h: Header for GstElement
Erik Walthinsen's avatar
Erik Walthinsen committed
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */


#ifndef __GST_ELEMENT_H__
#define __GST_ELEMENT_H__

27
#include <parser.h> // NOTE: this is xml-config's fault
28

Richard Boulton's avatar
Richard Boulton committed
29 30 31 32 33 34 35
// Include compatability defines: if libxml hasn't already defined these,
// we have an old version 1.x
#ifndef xmlChildrenNode
#define xmlChildrenNode childs
#define xmlRootNode root
#endif

Erik Walthinsen's avatar
Erik Walthinsen committed
36 37 38
#include <gst/gstobject.h>
#include <gst/gstpad.h>
#include <gst/cothreads.h>
39
#include <gst/gstpluginfeature.h>
40
#include <gst/gstdparammanager.h>
Erik Walthinsen's avatar
Erik Walthinsen committed
41 42 43 44 45 46

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


47
typedef enum {
48
  GST_STATE_VOID_PENDING	= 0,
49 50
  GST_STATE_NULL		= (1 << 0),
  GST_STATE_READY		= (1 << 1),
51 52
  GST_STATE_PAUSED		= (1 << 2),
  GST_STATE_PLAYING		= (1 << 3),
53 54 55
} GstElementState;

typedef enum {
56 57 58
  GST_STATE_FAILURE		= 0,
  GST_STATE_SUCCESS		= 1,
  GST_STATE_ASYNC		= 2,
59 60
} GstElementStateReturn;

Erik Walthinsen's avatar
Erik Walthinsen committed
61

62 63
// NOTE: this probably should be done with an #ifdef to decide whether to safe-cast
// or to just do the non-checking cast.
64 65 66
#define GST_STATE(obj)			(GST_ELEMENT(obj)->current_state)
#define GST_STATE_PENDING(obj)		(GST_ELEMENT(obj)->pending_state)

67 68
// Note: using 8 bit shift mostly "just because", it leaves us enough room to grow <g>
#define GST_STATE_TRANSITION(obj)	((GST_STATE(obj)<<8) | GST_STATE_PENDING(obj))
69
#define GST_STATE_NULL_TO_READY		((GST_STATE_NULL<<8) | GST_STATE_READY)
70
#define GST_STATE_READY_TO_PAUSED	((GST_STATE_READY<<8) | GST_STATE_PAUSED)
71
#define GST_STATE_PAUSED_TO_PLAYING	((GST_STATE_PAUSED<<8) | GST_STATE_PLAYING)
72 73
#define GST_STATE_PLAYING_TO_PAUSED	((GST_STATE_PLAYING<<8) | GST_STATE_PAUSED)
#define GST_STATE_PAUSED_TO_READY	((GST_STATE_PAUSED<<8) | GST_STATE_READY)
74
#define GST_STATE_READY_TO_NULL		((GST_STATE_READY<<8) | GST_STATE_NULL)
75

Erik Walthinsen's avatar
Erik Walthinsen committed
76 77 78
#define GST_TYPE_ELEMENT \
  (gst_element_get_type())
#define GST_ELEMENT(obj) \
79
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENT,GstElement))
Erik Walthinsen's avatar
Erik Walthinsen committed
80
#define GST_ELEMENT_CLASS(klass) \
81
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENT,GstElementClass))
Erik Walthinsen's avatar
Erik Walthinsen committed
82
#define GST_IS_ELEMENT(obj) \
83
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENT))
Wim Taymans's avatar
Wim Taymans committed
84
#define GST_IS_ELEMENT_CLASS(klass) \
85
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENT))
Erik Walthinsen's avatar
Erik Walthinsen committed
86

87
typedef enum {
Wim Taymans's avatar
Wim Taymans committed
88
  /* element is complex (for some def.) and generally require a cothread */
89
  GST_ELEMENT_COMPLEX		= GST_OBJECT_FLAG_LAST,
Wim Taymans's avatar
Wim Taymans committed
90 91
  /* input and output pads aren't directly coupled to each other
     examples: queues, multi-output async readers, etc. */
92
  GST_ELEMENT_DECOUPLED,
Wim Taymans's avatar
Wim Taymans committed
93
  /* this element should be placed in a thread if at all possible */
94
  GST_ELEMENT_THREAD_SUGGESTED,
Wim Taymans's avatar
Wim Taymans committed
95
  /* this element is incable of seeking (FIXME: does this apply to filters?) */
96
  GST_ELEMENT_NO_SEEK,
97

98 99
  /***** !!!!! need to have a flag that says that an element must
    *not* be an entry into a scheduling chain !!!!! *****/
100 101 102
  /* this element for some reason doesn't obey COTHREAD_STOPPING, or
     has some other reason why it can't be the entry */
  GST_ELEMENT_NO_ENTRY,
103

Wim Taymans's avatar
Wim Taymans committed
104
  /* there is a new loopfunction ready for placement */
105
  GST_ELEMENT_NEW_LOOPFUNC,
Wim Taymans's avatar
Wim Taymans committed
106
  /* the cothread holding this element needs to be stopped */
107
  GST_ELEMENT_COTHREAD_STOPPING,
Wim Taymans's avatar
Wim Taymans committed
108
  /* the element has to be scheduled as a cothread for any sanity */
109
  GST_ELEMENT_USE_COTHREAD,
110

Wim Taymans's avatar
Wim Taymans committed
111
  /* if this element is in EOS */
112 113
  GST_ELEMENT_EOS,

114
  /* use some padding for future expansion */
115
  GST_ELEMENT_FLAG_LAST		= GST_OBJECT_FLAG_LAST + 12,
116 117
} GstElementFlags;

118 119
#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj)	(GST_FLAG_IS_SET(obj,GST_ELEMENT_THREAD_SUGGESTED))
#define GST_ELEMENT_IS_COTHREAD_STOPPING(obj)	(GST_FLAG_IS_SET(obj,GST_ELEMENT_COTHREAD_STOPPING))
120
#define GST_ELEMENT_IS_EOS(obj)			(GST_FLAG_IS_SET(obj,GST_ELEMENT_EOS))
121

122 123
#define GST_ELEMENT_NAME(obj)			(GST_OBJECT_NAME(obj))
#define GST_ELEMENT_PARENT(obj)			(GST_OBJECT_PARENT(obj))
124 125
#define GST_ELEMENT_MANAGER(obj)		(((GstElement*)(obj))->manager)
#define GST_ELEMENT_SCHED(obj)			(((GstElement*)(obj))->sched)
Wim Taymans's avatar
Wim Taymans committed
126
#define GST_ELEMENT_PADS(obj)			((obj)->pads)
127
#define GST_ELEMENT_DPARAM_MANAGER(obj)			((obj)->dpman)
128

129 130
//typedef struct _GstElement GstElement;
//typedef struct _GstElementClass GstElementClass;
Erik Walthinsen's avatar
Erik Walthinsen committed
131
typedef struct _GstElementFactory GstElementFactory;
132
typedef struct _GstElementFactoryClass GstElementFactoryClass;
Erik Walthinsen's avatar
Erik Walthinsen committed
133 134 135 136 137 138

typedef void (*GstElementLoopFunction) (GstElement *element);

struct _GstElement {
  GstObject object;

139 140
  guint8 current_state;
  guint8 pending_state;
Erik Walthinsen's avatar
Erik Walthinsen committed
141 142 143

  GstElementLoopFunction loopfunc;
  cothread_state *threadstate;
144
  GstPad *select_pad;
Erik Walthinsen's avatar
Erik Walthinsen committed
145 146

  guint16 numpads;
147 148
  guint16 numsrcpads;
  guint16 numsinkpads;
Erik Walthinsen's avatar
Erik Walthinsen committed
149 150 151
  GList *pads;

  GstElement *manager;
152
  GstSchedule *sched;
153
  GstDParamManager *dpman;
Erik Walthinsen's avatar
Erik Walthinsen committed
154 155 156 157 158 159 160
};

struct _GstElementClass {
  GstObjectClass parent_class;

  /* the elementfactory that created us */
  GstElementFactory *elementfactory;
161 162 163 164
  /* templates for our pads */
  GList *padtemplates;
  gint numpadtemplates;
  
Erik Walthinsen's avatar
Erik Walthinsen committed
165
  /* signal callbacks */
166 167 168 169 170 171 172 173 174
  void (*state_change)		(GstElement *element,GstElementState state);
  void (*new_pad)		(GstElement *element,GstPad *pad);
  void (*pad_removed)		(GstElement *element,GstPad *pad);
  void (*new_ghost_pad) 	(GstElement *element,GstPad *pad);
  void (*ghost_pad_removed)	(GstElement *element,GstPad *pad);
  void (*error)			(GstElement *element,gchar *error);
  void (*eos)			(GstElement *element);

  /* local pointers for get/set */
175 176
  void (*set_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
  void (*get_property) (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
Erik Walthinsen's avatar
Erik Walthinsen committed
177 178

  /* change the element state */
179
  GstElementStateReturn (*change_state)		(GstElement *element);
180
  /* request a new pad */
181
  GstPad*		(*request_new_pad)	(GstElement *element, GstPadTemplate *templ);
Erik Walthinsen's avatar
Erik Walthinsen committed
182 183
};

184 185
void			gst_element_class_add_padtemplate	(GstElementClass *element, GstPadTemplate *templ);

186
GType			gst_element_get_type		(void);
Wim Taymans's avatar
Wim Taymans committed
187
#define			gst_element_destroy(element)	gst_object_destroy (GST_OBJECT (element))
Erik Walthinsen's avatar
Erik Walthinsen committed
188

Wim Taymans's avatar
Wim Taymans committed
189 190
void			gst_element_set_loop_function	(GstElement *element,
							 GstElementLoopFunction loop);
Erik Walthinsen's avatar
Erik Walthinsen committed
191

192 193 194 195 196
void                    gst_element_set_name            (GstElement *element, const gchar *name);
const gchar*            gst_element_get_name            (GstElement *element);

void                    gst_element_set_parent          (GstElement *element, GstObject *parent);
GstObject*              gst_element_get_parent          (GstElement *element);
Erik Walthinsen's avatar
Erik Walthinsen committed
197

198 199
void			gst_element_set_sched		(GstElement *element, GstSchedule *sched);
GstSchedule*		gst_element_get_sched		(GstElement *element);
Erik Walthinsen's avatar
Erik Walthinsen committed
200

Wim Taymans's avatar
Wim Taymans committed
201
void			gst_element_add_pad		(GstElement *element, GstPad *pad);
202
void			gst_element_remove_pad		(GstElement *element, GstPad *pad);
Wim Taymans's avatar
Wim Taymans committed
203
GstPad*			gst_element_get_pad		(GstElement *element, const gchar *name);
204
GList*			gst_element_get_pad_list	(GstElement *element);
Wim Taymans's avatar
Wim Taymans committed
205
GList*			gst_element_get_padtemplate_list	(GstElement *element);
206
GstPadTemplate*		gst_element_get_padtemplate_by_name	(GstElement *element, const guchar *name);
207
void			gst_element_add_ghost_pad	(GstElement *element, GstPad *pad, gchar *name);
208
void			gst_element_remove_ghost_pad	(GstElement *element, GstPad *pad);
Erik Walthinsen's avatar
Erik Walthinsen committed
209

210
GstPad*			gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ);
211 212
GstPad*			gst_element_request_pad_by_name	(GstElement *element, const gchar *name);

Wim Taymans's avatar
Wim Taymans committed
213 214 215 216
void			gst_element_connect		(GstElement *src, const gchar *srcpadname,
							 GstElement *dest, const gchar *destpadname);
void			gst_element_disconnect		(GstElement *src, const gchar *srcpadname,
							 GstElement *dest, const gchar *destpadname);
Erik Walthinsen's avatar
Erik Walthinsen committed
217

218 219 220
void			gst_element_signal_eos		(GstElement *element);


Erik Walthinsen's avatar
Erik Walthinsen committed
221
/* called by the app to set the state of the element */
Wim Taymans's avatar
Wim Taymans committed
222
gint			gst_element_set_state		(GstElement *element, GstElementState state);
223
const gchar *		gst_element_statename		(GstElementState state);
Erik Walthinsen's avatar
Erik Walthinsen committed
224

Wim Taymans's avatar
Wim Taymans committed
225
void			gst_element_error		(GstElement *element, const gchar *error);
Erik Walthinsen's avatar
Erik Walthinsen committed
226

227
GstElementFactory*	gst_element_get_factory		(GstElement *element);
Erik Walthinsen's avatar
Erik Walthinsen committed
228 229

/* XML write and read */
230
GstElement*		gst_element_restore_thyself	(xmlNodePtr self, GstObject *parent);
Erik Walthinsen's avatar
Erik Walthinsen committed
231 232


Wim Taymans's avatar
Wim Taymans committed
233
/*
234 235 236 237
 *
 * factories stuff
 *
 **/
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
typedef struct _GstElementDetails GstElementDetails;

struct _GstElementDetails {
  gchar *longname;              /* long, english name */
  gchar *klass;                 /* type of element, as hierarchy */
  gchar *description;           /* insights of one form or another */
  gchar *version;               /* version of the element */
  gchar *author;                /* who wrote this thing? */
  gchar *copyright;             /* copyright details (year, etc.) */
};

#define GST_TYPE_ELEMENTFACTORY \
  (gst_elementfactory_get_type())
#define GST_ELEMENTFACTORY(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENTFACTORY,GstElementFactory))
#define GST_ELEMENTFACTORY_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENTFACTORY,GstElementFactoryClass))
#define GST_IS_ELEMENTFACTORY(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENTFACTORY))
#define GST_IS_ELEMENTFACTORY_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENTFACTORY))

struct _GstElementFactory {
  GstPluginFeature feature;

  GType type;			/* unique GType of element */

  GstElementDetails *details;	/* pointer to details struct */

  GList *padtemplates;
  guint16 numpadtemplates;
};

struct _GstElementFactoryClass {
  GstPluginFeatureClass parent_class;
};

GType 			gst_elementfactory_get_type 		(void);

277
GstElementFactory*	gst_elementfactory_new			(const gchar *name,GType type,
Wim Taymans's avatar
Wim Taymans committed
278
                                                                 GstElementDetails *details);
279

Wim Taymans's avatar
Wim Taymans committed
280
GstElementFactory*	gst_elementfactory_find			(const gchar *name);
281
const GList*		gst_elementfactory_get_list		(void);
Erik Walthinsen's avatar
Erik Walthinsen committed
282

283 284
void			gst_elementfactory_add_padtemplate	(GstElementFactory *elementfactory,
								 GstPadTemplate *templ);
285

Wim Taymans's avatar
Wim Taymans committed
286 287 288 289
gboolean		gst_elementfactory_can_src_caps		(GstElementFactory *factory,
								 GstCaps *caps);
gboolean		gst_elementfactory_can_sink_caps	(GstElementFactory *factory,
								 GstCaps *caps);
Erik Walthinsen's avatar
Erik Walthinsen committed
290

291
GstElement*		gst_elementfactory_create		(GstElementFactory *factory,
292
								 const gchar *name);
Wim Taymans's avatar
Wim Taymans committed
293
/* FIXME this name is wrong, probably so is the one above it */
Wim Taymans's avatar
Wim Taymans committed
294
GstElement*		gst_elementfactory_make			(const gchar *factoryname, const gchar *name);
295

296

Erik Walthinsen's avatar
Erik Walthinsen committed
297 298 299 300 301
#ifdef __cplusplus
}
#endif /* __cplusplus */


302
#endif /* __GST_ELEMENT_H__ */
Erik Walthinsen's avatar
Erik Walthinsen committed
303