Merged from INCSCHED on 200505251!!!
[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 #define GST_TYPE_SCHEDULE \
37   (gst_schedule_get_type())
38 #define GST_SCHEDULE(obj) \
39   (GTK_CHECK_CAST((obj),GST_TYPE_SCHEDULE,GstSchedule))
40 #define GST_SCHEDULE_CLASS(klass) \
41   (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_SCHEDULE,GstScheduleClass))
42 #define GST_IS_SCHEDULE(obj) \
43   (GTK_CHECK_TYPE((obj),GST_TYPE_SCHEDULE))
44 #define GST_IS_SCHEDULE_CLASS(klass) \
45   (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_SCHEDULE))
46
47
48 #define GST_SCHED_PARENT(sched)         ((sched)->parent)
49
50 //typedef struct _GstSchedule GstSchedule;
51 //typedef struct _GstScheduleClass GstScheduleClass;
52 typedef struct _GstScheduleChain GstScheduleChain;
53
54 struct _GstSchedule {
55   GstObject object;
56
57   GstElement *parent;
58
59   GList *elements;
60   gint num_elements;
61
62   GList *chains;
63   gint num_chains;
64
65   void (*add_element)           (GstSchedule *sched, GstElement *element);
66   void (*remove_element)        (GstSchedule *sched, GstElement *element);
67   void (*enable_element)        (GstSchedule *sched, GstElement *element);
68   void (*disable_element)       (GstSchedule *sched, GstElement *element);
69   void (*lock_element)          (GstSchedule *sched, GstElement *element);
70   void (*unlock_element)        (GstSchedule *sched, GstElement *element);
71   void (*pad_connect)           (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
72   void (*pad_disconnect)        (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
73   gboolean (*iterate)           (GstSchedule *sched);
74 };
75
76 struct _GstScheduleClass {
77   GstObjectClass parent_class;
78 };
79
80 //#define GST_SCHEDULE_SAFETY if (sched)
81 #define GST_SCHEDULE_SAFETY
82
83 #define GST_SCHEDULE_ADD_ELEMENT(sched,element) \
84   GST_SCHEDULE_SAFETY ((sched)->add_element((sched),(element)))
85 #define GST_SCHEDULE_REMOVE_ELEMENT(sched,element) \
86   GST_SCHEDULE_SAFETY ((sched)->remove_element((sched),(element)))
87 #define GST_SCHEDULE_ENABLE_ELEMENT(sched,element) \
88   GST_SCHEDULE_SAFETY ((sched)->enable_element((sched),(element)))
89 #define GST_SCHEDULE_DISABLE_ELEMENT(sched,element) \
90   GST_SCHEDULE_SAFETY ((sched)->disable_element((sched),(element)))
91 #define GST_SCHEDULE_LOCK_ELEMENT(sched,element) \
92   GST_SCHEDULE_SAFETY if ((sched)->lock_element != NULL) \
93     ((sched)->lock_element((sched),(element)))
94 #define GST_SCHEDULE_UNLOCK_ELEMENT(sched,element) \
95   GST_SCHEDULE_SAFETY if ((sched)->unlock_element != NULL) \
96     ((sched)->unlock_element((sched),(element)))
97 #define GST_SCHEDULE_PAD_CONNECT(sched,srcpad,sinkpad) \
98   GST_SCHEDULE_SAFETY ((sched)->pad_connect((sched),(srcpad),(sinkpad)))
99 #define GST_SCHEDULE_PAD_DISCONNECT(sched,srcpad,sinkpad) \
100   GST_SCHEDULE_SAFETY ((sched)->pad_disconnect((sched),(srcpad),(sinkpad)))
101 #define GST_SCHEDULE_ITERATE(sched) \
102   ((sched)->iterate((sched)))
103
104
105
106 struct _GstScheduleChain {
107   GstSchedule *sched;
108
109   GList *disabled;
110
111   GList *elements;
112   gint num_elements;
113
114   GstElement *entry;
115
116   gint cothreaded_elements;
117   gboolean schedule;
118 };
119
120
121 void gst_bin_schedule_func(GstBin *bin);
122
123 GtkType         gst_schedule_get_type           (void);
124 GstSchedule *   gst_schedule_new                (GstElement *parent);
125
126 void    gst_schedule_add_element        (GstSchedule *sched, GstElement *element);
127 void    gst_schedule_remove_element     (GstSchedule *sched, GstElement *element);
128 void    gst_schedule_enable_element     (GstSchedule *sched, GstElement *element);
129 void    gst_schedule_disable_element    (GstSchedule *sched, GstElement *element);
130 void    gst_schedule_pad_connect        (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
131 void    gst_schedule_pad_disconnect     (GstSchedule *sched, GstPad *srcpad, GstPad *sinkpad);
132 gboolean        gst_schedule_iterate    (GstSchedule *sched);
133
134 void    gst_schedule_show               (GstSchedule *sched);
135
136
137 #ifdef __cplusplus   
138 }
139 #endif /* __cplusplus */
140
141 #endif /* __GST_SCHEDULER_H__ */