1 /* GStreamer
2  * Copyright (C) 2014 Collabora
3  *   Author: Olivier Crete <olivier.crete@collabora.com>
4  *
5  * gstaudioaggregator.h:
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., 51 Franklin St, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef __GST_AUDIO_AGGREGATOR_H__
24 #define __GST_AUDIO_AGGREGATOR_H__
25 
26 #include <gst/gst.h>
27 #include <gst/base/gstaggregator.h>
28 #include <gst/audio/audio.h>
29 
30 G_BEGIN_DECLS
31 
32 /*******************************
33  * GstAudioAggregator Structs  *
34  *******************************/
35 
36 typedef struct _GstAudioAggregator GstAudioAggregator;
37 typedef struct _GstAudioAggregatorPrivate GstAudioAggregatorPrivate;
38 typedef struct _GstAudioAggregatorClass GstAudioAggregatorClass;
39 
40 
41 /************************
42  * GstAudioAggregatorPad API *
43  ***********************/
44 
45 #define GST_TYPE_AUDIO_AGGREGATOR_PAD            (gst_audio_aggregator_pad_get_type())
46 #define GST_AUDIO_AGGREGATOR_PAD(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_AGGREGATOR_PAD, GstAudioAggregatorPad))
47 #define GST_AUDIO_AGGREGATOR_PAD_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_AGGREGATOR_PAD, GstAudioAggregatorPadClass))
48 #define GST_AUDIO_AGGREGATOR_PAD_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_AUDIO_AGGREGATOR_PAD, GstAudioAggregatorPadClass))
49 #define GST_IS_AUDIO_AGGREGATOR_PAD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_AGGREGATOR_PAD))
50 #define GST_IS_AUDIO_AGGREGATOR_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_AGGREGATOR_PAD))
51 
52 /****************************
53  * GstAudioAggregatorPad Structs *
54  ***************************/
55 
56 typedef struct _GstAudioAggregatorPad GstAudioAggregatorPad;
57 typedef struct _GstAudioAggregatorPadClass GstAudioAggregatorPadClass;
58 typedef struct _GstAudioAggregatorPadPrivate GstAudioAggregatorPadPrivate;
59 
60 /**
61  * GstAudioAggregatorPad:
62  * @info: The audio info for this pad set from the incoming caps
63  *
64  * The default implementation of GstPad used with #GstAudioAggregator
65  *
66  * Since: 1.14
67  */
68 struct _GstAudioAggregatorPad
69 {
70   GstAggregatorPad                  parent;
71 
72   /*< public >*/
73   /* read-only, with OBJECT_LOCK */
74   GstAudioInfo                      info;
75 
76   /*< private >*/
77   GstAudioAggregatorPadPrivate     *priv;
78 
79   gpointer _gst_reserved[GST_PADDING];
80 };
81 
82 /**
83  * GstAudioAggregatorPadClass:
84  * @convert_buffer: Convert a buffer from one format to another.
85  * @update_conversion_info: Called when either the input or output
86  *  formats have changed.
87  *
88  * Since: 1.14
89  */
90 struct _GstAudioAggregatorPadClass
91   {
92   GstAggregatorPadClass   parent_class;
93 
94   GstBuffer * (* convert_buffer) (GstAudioAggregatorPad * pad,
95                                   GstAudioInfo *in_info,
96                                   GstAudioInfo *out_info,
97                                   GstBuffer * buffer);
98 
99   void        (* update_conversion_info) (GstAudioAggregatorPad *pad);
100 
101   /*< private >*/
102   gpointer      _gst_reserved[GST_PADDING_LARGE];
103 };
104 
105 GST_AUDIO_API
106 GType gst_audio_aggregator_pad_get_type           (void);
107 
108 #define GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD            (gst_audio_aggregator_convert_pad_get_type())
109 #define GST_AUDIO_AGGREGATOR_CONVERT_PAD(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD, GstAudioAggregatorConvertPad))
110 #define GST_AUDIO_AGGREGATOR_CONVERT_PAD_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD, GstAudioAggregatorConvertPadClass))
111 #define GST_AUDIO_AGGREGATOR_CONVERT_PAD_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD, GstAudioAggregatorConvertPadClass))
112 #define GST_IS_AUDIO_AGGREGATOR_CONVERT_PAD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD))
113 #define GST_IS_AUDIO_AGGREGATOR_CONVERT_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_AGGREGATOR_CONVERT_PAD))
114 
115 /****************************
116  * GstAudioAggregatorPad Structs *
117  ***************************/
118 
119 typedef struct _GstAudioAggregatorConvertPad GstAudioAggregatorConvertPad;
120 typedef struct _GstAudioAggregatorConvertPadClass GstAudioAggregatorConvertPadClass;
121 typedef struct _GstAudioAggregatorConvertPadPrivate GstAudioAggregatorConvertPadPrivate;
122 
123 /**
124  * GstAudioAggregatorConvertPad:
125  *
126  * An implementation of GstPad that can be used with #GstAudioAggregator.
127  *
128  * See #GstAudioAggregator for more details.
129  *
130  * Since: 1.14
131  */
132 struct _GstAudioAggregatorConvertPad
133 {
134   /*< private >*/
135   GstAudioAggregatorPad                  parent;
136 
137   GstAudioAggregatorConvertPadPrivate   *priv;
138 
139   gpointer _gst_reserved[GST_PADDING];
140 };
141 
142 /**
143  * GstAudioAggregatorConvertPadClass:
144  *
145  * Since: 1.14
146  */
147 struct _GstAudioAggregatorConvertPadClass
148 {
149   GstAudioAggregatorPadClass   parent_class;
150 
151   /*< private >*/
152   gpointer      _gst_reserved[GST_PADDING];
153 };
154 
155 GST_AUDIO_API
156 GType gst_audio_aggregator_convert_pad_get_type           (void);
157 
158 /**************************
159  * GstAudioAggregator API *
160  **************************/
161 
162 #define GST_TYPE_AUDIO_AGGREGATOR            (gst_audio_aggregator_get_type())
163 #define GST_AUDIO_AGGREGATOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_AGGREGATOR,GstAudioAggregator))
164 #define GST_AUDIO_AGGREGATOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_AGGREGATOR,GstAudioAggregatorClass))
165 #define GST_AUDIO_AGGREGATOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_AUDIO_AGGREGATOR,GstAudioAggregatorClass))
166 #define GST_IS_AUDIO_AGGREGATOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_AGGREGATOR))
167 #define GST_IS_AUDIO_AGGREGATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_AGGREGATOR))
168 
169 /**
170  * GstAudioAggregator:
171  * @current_caps: The caps set by the subclass
172  *
173  * GstAudioAggregator object
174  *
175  * Since: 1.14
176  */
177 struct _GstAudioAggregator
178 {
179   GstAggregator              parent;
180 
181   /*< public >*/
182   GstCaps                   *current_caps;
183 
184   /*< private >*/
185   GstAudioAggregatorPrivate *priv;
186 
187   gpointer                  _gst_reserved[GST_PADDING];
188 };
189 
190 /**
191  * GstAudioAggregatorClass:
192  * @create_output_buffer: Create a new output buffer contains num_frames frames.
193  * @aggregate_one_buffer: Aggregates one input buffer to the output
194  *  buffer.  The in_offset and out_offset are in "frames", which is
195  *  the size of a sample times the number of channels. Returns TRUE if
196  *  any non-silence was added to the buffer
197  *
198  * Since: 1.14
199  */
200 struct _GstAudioAggregatorClass {
201   GstAggregatorClass   parent_class;
202 
203   /*< public >*/
204   GstBuffer * (* create_output_buffer) (GstAudioAggregator * aagg,
205       guint num_frames);
206   gboolean (* aggregate_one_buffer) (GstAudioAggregator * aagg,
207       GstAudioAggregatorPad * pad, GstBuffer * inbuf, guint in_offset,
208       GstBuffer * outbuf, guint out_offset, guint num_frames);
209 
210   /*< private >*/
211   gpointer          _gst_reserved[GST_PADDING_LARGE];
212 };
213 
214 /*************************
215  * GstAggregator methods *
216  ************************/
217 
218 GST_AUDIO_API
219 GType gst_audio_aggregator_get_type(void);
220 
221 GST_AUDIO_API
222 void  gst_audio_aggregator_set_sink_caps (GstAudioAggregator    * aagg,
223                                           GstAudioAggregatorPad * pad,
224                                           GstCaps               * caps);
225 
226 G_END_DECLS
227 
228 #endif /* __GST_AUDIO_AGGREGATOR_H__ */
229