s/gst_element_install_std_props/gst_element_class_install_std_props/ -- it just makes...
[platform/upstream/gstreamer.git] / gst / gstbin.h
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *
5  * gstbin.h: Header for GstBin container object
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_BIN_H__
25 #define __GST_BIN_H__
26
27 #include <gst/gstelement.h>
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif /* __cplusplus */
32
33 extern GstElementDetails gst_bin_details;
34 extern GType _gst_bin_type;
35
36 #define GST_TYPE_BIN                 (_gst_bin_type)
37 # define GST_IS_BIN(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BIN))
38 # define GST_IS_BIN_CLASS(obj)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BIN))
39
40 #define GST_BIN_CAST(obj)            ((GstBin*)(obj))
41 #define GST_BIN_CLASS_CAST(klass)    ((GstBinClass*)(klass))
42
43 #ifdef GST_TYPE_PARANOID
44 # define GST_BIN(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BIN, GstBin))
45 # define GST_BIN_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BIN, GstBinClass))
46 #else
47 # define GST_BIN                     GST_BIN_CAST
48 # define GST_BIN_CLASS               GST_BIN_CLASS_CAST
49 #endif
50
51 #define GST_BIN_CLOCK_PROVIDERS(bin)    (GST_BIN(bin)->clock_providers)
52 #define GST_BIN_CLOCK_RECEIVERS(bin)    (GST_BIN(bin)->clock_receivers)
53 #define GST_BIN_CLOCK(bin)              (GST_BIN(bin)->clock)
54
55 typedef enum {
56   /* this bin is a manager of child elements, i.e. a pipeline or thread */
57   GST_BIN_FLAG_MANAGER          = GST_ELEMENT_FLAG_LAST,
58   /* this bin is actually a meta-bin, and may need to be scheduled */
59   GST_BIN_SELF_SCHEDULABLE,
60
61   /* we prefer to have cothreads when its an option, over chain-based */
62   GST_BIN_FLAG_PREFER_COTHREADS,
63
64   GST_BIN_FLAG_FIXED_CLOCK,
65
66   /* bin iterates itself, like a bin with a jack element in it */
67   GST_BIN_SELF_ITERATING,
68
69   /* padding */
70   GST_BIN_FLAG_LAST             = GST_ELEMENT_FLAG_LAST + 5,
71 } GstBinFlags;
72
73 /*typedef struct _GstBin GstBin; */
74 /*typedef struct _GstBinClass GstBinClass; */
75
76 struct _GstBin {
77   GstElement     element;
78
79   /* our children */
80   gint           numchildren;
81   GList         *children;
82
83   GstElementState child_states[GST_NUM_STATES];
84
85   GstClock      *clock;
86   
87   gpointer       sched_private;
88 };
89
90 struct _GstBinClass {
91   GstElementClass parent_class;
92
93   /* signals */
94   void          (*object_added)         (GstObject *object, GstObject *child);
95   void          (*object_removed)       (GstObject *object, GstObject *child);
96
97   /* change the state of elements of the given type */
98   gboolean      (*change_state_type)    (GstBin *bin,
99                                          GstElementState state,
100                                          GType type);
101   /* run a full iteration of operation */
102   gboolean      (*iterate)              (GstBin *bin);
103 };
104
105 GType           gst_bin_get_type                (void);
106 GstElement*     gst_bin_new                     (const gchar *name);
107 #define         gst_bin_destroy(bin)            gst_object_destroy(GST_OBJECT(bin))
108
109 /* add and remove elements from the bin */
110 void            gst_bin_add                     (GstBin *bin, GstElement *element);
111 void            gst_bin_add_many                (GstBin *bin, GstElement *element_1, ...);
112 void            gst_bin_remove                  (GstBin *bin, GstElement *element);
113
114 /* retrieve a single element or the list of children */
115 GstElement*     gst_bin_get_by_name             (GstBin *bin, const gchar *name);
116 GstElement*     gst_bin_get_by_name_recurse_up  (GstBin *bin, const gchar *name);
117 GList*          gst_bin_get_list                (GstBin *bin);
118
119 gboolean        gst_bin_set_state_type          (GstBin *bin, GstElementState state, GType type);
120
121 gboolean        gst_bin_iterate                 (GstBin *bin);
122
123 void            gst_bin_use_clock               (GstBin *bin, GstClock *clock);
124 GstClock*       gst_bin_get_clock               (GstBin *bin);
125 void            gst_bin_auto_clock              (GstBin *bin);
126
127 /* internal */
128 /* one of our childs signaled a state change */
129 void            gst_bin_child_state_change      (GstBin *bin, GstElementState oldstate, 
130                                                  GstElementState newstate, GstElement *child);
131 /* one of our childs signaled an error */
132 void            gst_bin_child_error             (GstBin *bin, GstElement *child);
133
134
135 #ifdef __cplusplus
136 }
137 #endif /* __cplusplus */
138
139
140 #endif /* __GST_BIN_H__ */
141