API docs. revived _buffer_ref_by_count fast types for scheduler and bin.
[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 <gst/gstelement.h>
28 #include <gst/gstbin.h>
29
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif /* __cplusplus */
34
35
36 extern GType _gst_schedule_type;
37
38 #define GST_TYPE_SCHEDULE                 (_gst_schedule_type)
39 # define GST_IS_SCHEDULE(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULE))
40 # define GST_IS_SCHEDULE_CLASS(obj)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULE))
41
42 #define GST_SCHEDULE_FAST(obj)            ((GstSchedule*)(obj))
43 #define GST_SCHEDULE_CLASS_FAST(klass)    ((GstScheduleClass*)(klass))
44
45 #ifdef GST_TYPE_PARANOID
46 # define GST_SCHEDULE(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULE, GstSchedule))
47 # define GST_SCHEDULE_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULE, GstScheduleClass))
48 #else
49 # define GST_SCHEDULE                     GST_SCHEDULE_FAST
50 # define GST_SCHEDULE_CLASS               GST_SCHEDULE_CLASS_FAST
51 #endif
52
53
54 #define GST_SCHED_PARENT(sched)         ((sched)->parent)
55
56 //typedef struct _GstSchedule GstSchedule;
57 //typedef struct _GstScheduleClass GstScheduleClass;
58 typedef struct _GstScheduleChain GstScheduleChain;
59
60 struct _GstSchedule {
61   GstObject object;
62
63   GstElement *parent;
64
65   GList *elements;
66   gint num_elements;
67
68   GList *chains;
69   gint num_chains;
70
71   void (*add_element)           (GstSchedule *sched, GstElement *element);
72   void (*remove_element)        (GstSchedule *sched, GstElement *element);
73   void (*enable_element)        (GstSchedule *sched, GstElement *element);
74   void (*disable_element)       (GstSchedule *sched, GstElement *element);
75   void (*lock_element)          (GstSchedule *sched, GstElement *element);
76   void (*unlock_element)        (GstSchedule *sched, GstElement *element);
77   void (*pad_connect)           (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
78   void (*pad_disconnect)        (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
79   void (*pad_select)            (GstSchedule *sched, GList *padlist);
80   gboolean (*iterate)           (GstSchedule *sched);
81 };
82
83 struct _GstScheduleClass {
84   GstObjectClass parent_class;
85 };
86
87 #define GST_SCHEDULE_SAFETY(sched) if (sched)
88 //#define GST_SCHEDULE_SAFETY(sched)
89
90 #define GST_SCHEDULE_ADD_ELEMENT(sched,element) G_STMT_START{ \
91   GST_SCHEDULE_SAFETY(sched) { ((sched)->add_element((sched),(element))); } \
92 }G_STMT_END
93 #define GST_SCHEDULE_REMOVE_ELEMENT(sched,element) G_STMT_START{ \
94   GST_SCHEDULE_SAFETY(sched) { ((sched)->remove_element((sched),(element))); } \
95 }G_STMT_END
96 #define GST_SCHEDULE_ENABLE_ELEMENT(sched,element) G_STMT_START{ \
97   GST_SCHEDULE_SAFETY(sched) { ((sched)->enable_element((sched),(element))); } \
98 }G_STMT_END
99 #define GST_SCHEDULE_DISABLE_ELEMENT(sched,element) G_STMT_START{ \
100   GST_SCHEDULE_SAFETY(sched) { ((sched)->disable_element((sched),(element))); } \
101 }G_STMT_END
102 #define GST_SCHEDULE_LOCK_ELEMENT(sched,element) G_STMT_START{ \
103   GST_SCHEDULE_SAFETY(sched) { if ((sched)->lock_element != NULL) \
104     ((sched)->lock_element((sched),(element))); } \
105 }G_STMT_END
106 #define GST_SCHEDULE_UNLOCK_ELEMENT(sched,element) G_STMT_START{ \
107   GST_SCHEDULE_SAFETY(sched) { if ((sched)->unlock_element != NULL) \
108     ((sched)->unlock_element((sched),(element))); } \
109 }G_STMT_END
110 #define GST_SCHEDULE_PAD_CONNECT(sched,srcpad,sinkpad) G_STMT_START{ \
111   GST_SCHEDULE_SAFETY(sched) { ((sched)->pad_connect((sched),(srcpad),(sinkpad))); } \
112 }G_STMT_END
113 #define GST_SCHEDULE_PAD_DISCONNECT(sched,srcpad,sinkpad) G_STMT_START{ \
114   GST_SCHEDULE_SAFETY(sched) { ((sched)->pad_disconnect((sched),(srcpad),(sinkpad))); } \
115 }G_STMT_END
116 #define GST_SCHEDULE_ITERATE(sched) \
117   ((sched)->iterate((sched)))
118
119
120
121 struct _GstScheduleChain {
122   GstSchedule *sched;
123
124   GList *disabled;
125
126   GList *elements;
127   gint num_elements;
128
129   GstElement *entry;
130
131   gint cothreaded_elements;
132   gboolean schedule;
133 };
134
135
136 GType                   gst_schedule_get_type           (void);
137 GstSchedule*            gst_schedule_new                (GstElement *parent);
138
139 void                    gst_schedule_add_element        (GstSchedule *sched, GstElement *element);
140 void                    gst_schedule_remove_element     (GstSchedule *sched, GstElement *element);
141 void                    gst_schedule_enable_element     (GstSchedule *sched, GstElement *element);
142 void                    gst_schedule_disable_element    (GstSchedule *sched, GstElement *element);
143 void                    gst_schedule_pad_connect        (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
144 void                    gst_schedule_pad_disconnect     (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
145 GstPad*                 gst_schedule_pad_select         (GstSchedule *sched, GList *padlist);
146 gboolean                gst_schedule_iterate            (GstSchedule *sched);
147
148 void                    gst_schedule_show               (GstSchedule *sched);
149
150
151 #ifdef __cplusplus   
152 }
153 #endif /* __cplusplus */
154
155 #endif /* __GST_SCHEDULER_H__ */