1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  * Library       <2001> Thomas Vander Stichele <thomas@apestaart.org>
4  *               <2011> Wim Taymans <wim.taymans@gmail.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 
22 #ifndef __GST_AUDIO_AUDIO_H__
23 #include <gst/audio/audio.h>
24 #endif
25 
26 #ifndef __GST_AUDIO_FORMAT_H__
27 #define __GST_AUDIO_FORMAT_H__
28 
29 G_BEGIN_DECLS
30 
31 #if G_BYTE_ORDER == G_BIG_ENDIAN
32 #define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## BE
33 #define _GST_AUDIO_FORMAT_OE(fmt) GST_AUDIO_FORMAT_ ## fmt ## LE
34 #elif G_BYTE_ORDER == G_LITTLE_ENDIAN
35 #define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## LE
36 #define _GST_AUDIO_FORMAT_OE(fmt) GST_AUDIO_FORMAT_ ## fmt ## BE
37 #endif
38 
39 /**
40  * GstAudioFormat:
41  * @GST_AUDIO_FORMAT_UNKNOWN: unknown or unset audio format
42  * @GST_AUDIO_FORMAT_ENCODED: encoded audio format
43  * @GST_AUDIO_FORMAT_S8: 8 bits in 8 bits, signed
44  * @GST_AUDIO_FORMAT_U8: 8 bits in 8 bits, unsigned
45  * @GST_AUDIO_FORMAT_S16LE: 16 bits in 16 bits, signed, little endian
46  * @GST_AUDIO_FORMAT_S16BE: 16 bits in 16 bits, signed, big endian
47  * @GST_AUDIO_FORMAT_U16LE: 16 bits in 16 bits, unsigned, little endian
48  * @GST_AUDIO_FORMAT_U16BE: 16 bits in 16 bits, unsigned, big endian
49  * @GST_AUDIO_FORMAT_S24_32LE: 24 bits in 32 bits, signed, little endian
50  * @GST_AUDIO_FORMAT_S24_32BE: 24 bits in 32 bits, signed, big endian
51  * @GST_AUDIO_FORMAT_U24_32LE: 24 bits in 32 bits, unsigned, little endian
52  * @GST_AUDIO_FORMAT_U24_32BE: 24 bits in 32 bits, unsigned, big endian
53  * @GST_AUDIO_FORMAT_S32LE: 32 bits in 32 bits, signed, little endian
54  * @GST_AUDIO_FORMAT_S32BE: 32 bits in 32 bits, signed, big endian
55  * @GST_AUDIO_FORMAT_U32LE: 32 bits in 32 bits, unsigned, little endian
56  * @GST_AUDIO_FORMAT_U32BE: 32 bits in 32 bits, unsigned, big endian
57  * @GST_AUDIO_FORMAT_S24LE: 24 bits in 24 bits, signed, little endian
58  * @GST_AUDIO_FORMAT_S24BE: 24 bits in 24 bits, signed, big endian
59  * @GST_AUDIO_FORMAT_U24LE: 24 bits in 24 bits, unsigned, little endian
60  * @GST_AUDIO_FORMAT_U24BE: 24 bits in 24 bits, unsigned, big endian
61  * @GST_AUDIO_FORMAT_S20LE: 20 bits in 24 bits, signed, little endian
62  * @GST_AUDIO_FORMAT_S20BE: 20 bits in 24 bits, signed, big endian
63  * @GST_AUDIO_FORMAT_U20LE: 20 bits in 24 bits, unsigned, little endian
64  * @GST_AUDIO_FORMAT_U20BE: 20 bits in 24 bits, unsigned, big endian
65  * @GST_AUDIO_FORMAT_S18LE: 18 bits in 24 bits, signed, little endian
66  * @GST_AUDIO_FORMAT_S18BE: 18 bits in 24 bits, signed, big endian
67  * @GST_AUDIO_FORMAT_U18LE: 18 bits in 24 bits, unsigned, little endian
68  * @GST_AUDIO_FORMAT_U18BE: 18 bits in 24 bits, unsigned, big endian
69  * @GST_AUDIO_FORMAT_F32LE: 32-bit floating point samples, little endian
70  * @GST_AUDIO_FORMAT_F32BE: 32-bit floating point samples, big endian
71  * @GST_AUDIO_FORMAT_F64LE: 64-bit floating point samples, little endian
72  * @GST_AUDIO_FORMAT_F64BE: 64-bit floating point samples, big endian
73  * @GST_AUDIO_FORMAT_S16: 16 bits in 16 bits, signed, native endianness
74  * @GST_AUDIO_FORMAT_U16: 16 bits in 16 bits, unsigned, native endianness
75  * @GST_AUDIO_FORMAT_S24_32: 24 bits in 32 bits, signed, native endianness
76  * @GST_AUDIO_FORMAT_U24_32: 24 bits in 32 bits, unsigned, native endianness
77  * @GST_AUDIO_FORMAT_S32: 32 bits in 32 bits, signed, native endianness
78  * @GST_AUDIO_FORMAT_U32: 32 bits in 32 bits, unsigned, native endianness
79  * @GST_AUDIO_FORMAT_S24: 24 bits in 24 bits, signed, native endianness
80  * @GST_AUDIO_FORMAT_U24: 24 bits in 24 bits, unsigned, native endianness
81  * @GST_AUDIO_FORMAT_S20: 20 bits in 24 bits, signed, native endianness
82  * @GST_AUDIO_FORMAT_U20: 20 bits in 24 bits, unsigned, native endianness
83  * @GST_AUDIO_FORMAT_S18: 18 bits in 24 bits, signed, native endianness
84  * @GST_AUDIO_FORMAT_U18: 18 bits in 24 bits, unsigned, native endianness
85  * @GST_AUDIO_FORMAT_F32: 32-bit floating point samples, native endianness
86  * @GST_AUDIO_FORMAT_F64: 64-bit floating point samples, native endianness
87  *
88  * Enum value describing the most common audio formats.
89  */
90 typedef enum {
91   GST_AUDIO_FORMAT_UNKNOWN,
92   GST_AUDIO_FORMAT_ENCODED,
93   /* 8 bit */
94   GST_AUDIO_FORMAT_S8,
95   GST_AUDIO_FORMAT_U8,
96   /* 16 bit */
97   GST_AUDIO_FORMAT_S16LE,
98   GST_AUDIO_FORMAT_S16BE,
99   GST_AUDIO_FORMAT_U16LE,
100   GST_AUDIO_FORMAT_U16BE,
101   /* 24 bit in low 3 bytes of 32 bits*/
102   GST_AUDIO_FORMAT_S24_32LE,
103   GST_AUDIO_FORMAT_S24_32BE,
104   GST_AUDIO_FORMAT_U24_32LE,
105   GST_AUDIO_FORMAT_U24_32BE,
106   /* 32 bit */
107   GST_AUDIO_FORMAT_S32LE,
108   GST_AUDIO_FORMAT_S32BE,
109   GST_AUDIO_FORMAT_U32LE,
110   GST_AUDIO_FORMAT_U32BE,
111   /* 24 bit in 3 bytes*/
112   GST_AUDIO_FORMAT_S24LE,
113   GST_AUDIO_FORMAT_S24BE,
114   GST_AUDIO_FORMAT_U24LE,
115   GST_AUDIO_FORMAT_U24BE,
116   /* 20 bit in 3 bytes*/
117   GST_AUDIO_FORMAT_S20LE,
118   GST_AUDIO_FORMAT_S20BE,
119   GST_AUDIO_FORMAT_U20LE,
120   GST_AUDIO_FORMAT_U20BE,
121   /* 18 bit in 3 bytes*/
122   GST_AUDIO_FORMAT_S18LE,
123   GST_AUDIO_FORMAT_S18BE,
124   GST_AUDIO_FORMAT_U18LE,
125   GST_AUDIO_FORMAT_U18BE,
126   /* float */
127   GST_AUDIO_FORMAT_F32LE,
128   GST_AUDIO_FORMAT_F32BE,
129   GST_AUDIO_FORMAT_F64LE,
130   GST_AUDIO_FORMAT_F64BE,
131   /* native endianness equivalents */
132   GST_AUDIO_FORMAT_S16 = _GST_AUDIO_FORMAT_NE(S16),
133   GST_AUDIO_FORMAT_U16 = _GST_AUDIO_FORMAT_NE(U16),
134   GST_AUDIO_FORMAT_S24_32 = _GST_AUDIO_FORMAT_NE(S24_32),
135   GST_AUDIO_FORMAT_U24_32 = _GST_AUDIO_FORMAT_NE(U24_32),
136   GST_AUDIO_FORMAT_S32 = _GST_AUDIO_FORMAT_NE(S32),
137   GST_AUDIO_FORMAT_U32 = _GST_AUDIO_FORMAT_NE(U32),
138   GST_AUDIO_FORMAT_S24 = _GST_AUDIO_FORMAT_NE(S24),
139   GST_AUDIO_FORMAT_U24 = _GST_AUDIO_FORMAT_NE(U24),
140   GST_AUDIO_FORMAT_S20 = _GST_AUDIO_FORMAT_NE(S20),
141   GST_AUDIO_FORMAT_U20 = _GST_AUDIO_FORMAT_NE(U20),
142   GST_AUDIO_FORMAT_S18 = _GST_AUDIO_FORMAT_NE(S18),
143   GST_AUDIO_FORMAT_U18 = _GST_AUDIO_FORMAT_NE(U18),
144   GST_AUDIO_FORMAT_F32 = _GST_AUDIO_FORMAT_NE(F32),
145   GST_AUDIO_FORMAT_F64 = _GST_AUDIO_FORMAT_NE(F64)
146 } GstAudioFormat;
147 
148 
149 typedef struct _GstAudioFormatInfo GstAudioFormatInfo;
150 
151 /**
152  * GstAudioFormatFlags:
153  * @GST_AUDIO_FORMAT_FLAG_INTEGER: integer samples
154  * @GST_AUDIO_FORMAT_FLAG_FLOAT: float samples
155  * @GST_AUDIO_FORMAT_FLAG_SIGNED: signed samples
156  * @GST_AUDIO_FORMAT_FLAG_COMPLEX: complex layout
157  * @GST_AUDIO_FORMAT_FLAG_UNPACK: the format can be used in
158  * #GstAudioFormatUnpack and #GstAudioFormatPack functions
159  *
160  * The different audio flags that a format info can have.
161  */
162 typedef enum
163 {
164   GST_AUDIO_FORMAT_FLAG_INTEGER  = (1 << 0),
165   GST_AUDIO_FORMAT_FLAG_FLOAT    = (1 << 1),
166   GST_AUDIO_FORMAT_FLAG_SIGNED   = (1 << 2),
167   GST_AUDIO_FORMAT_FLAG_COMPLEX  = (1 << 4),
168   GST_AUDIO_FORMAT_FLAG_UNPACK   = (1 << 5)
169 } GstAudioFormatFlags;
170 
171 /**
172  * GstAudioPackFlags:
173  * @GST_AUDIO_PACK_FLAG_NONE: No flag
174  * @GST_AUDIO_PACK_FLAG_TRUNCATE_RANGE: When the source has a smaller depth
175  *   than the target format, set the least significant bits of the target
176  *   to 0. This is likely sightly faster but less accurate. When this flag
177  *   is not specified, the most significant bits of the source are duplicated
178  *   in the least significant bits of the destination.
179  *
180  * The different flags that can be used when packing and unpacking.
181  */
182 typedef enum
183 {
184   GST_AUDIO_PACK_FLAG_NONE             = 0,
185   GST_AUDIO_PACK_FLAG_TRUNCATE_RANGE   = (1 << 0)
186 } GstAudioPackFlags;
187 
188 /**
189  * GstAudioFormatUnpack:
190  * @info: a #GstAudioFormatInfo
191  * @flags: #GstAudioPackFlags
192  * @dest: (array) (element-type guint8): a destination array
193  * @data: (array) (element-type guint8): pointer to the audio data
194  * @length: the amount of samples to unpack.
195  *
196  * Unpacks @length samples from the given data of format @info.
197  * The samples will be unpacked into @dest which each channel
198  * interleaved. @dest should at least be big enough to hold @length *
199  * channels * size(unpack_format) bytes.
200  */
201 typedef void (*GstAudioFormatUnpack)         (const GstAudioFormatInfo *info,
202                                               GstAudioPackFlags flags, gpointer dest,
203                                               gconstpointer data, gint length);
204 /**
205  * GstAudioFormatPack:
206  * @info: a #GstAudioFormatInfo
207  * @flags: #GstAudioPackFlags
208  * @src: (array) (element-type guint8): a source array
209  * @data: (array) (element-type guint8): pointer to the destination
210  *   data
211  * @length: the amount of samples to pack.
212  *
213  * Packs @length samples from @src to the data array in format @info.
214  * The samples from source have each channel interleaved
215  * and will be packed into @data.
216  */
217 typedef void (*GstAudioFormatPack)           (const GstAudioFormatInfo *info,
218                                               GstAudioPackFlags flags, gconstpointer src,
219                                               gpointer data, gint length);
220 
221 /**
222  * GstAudioFormatInfo:
223  * @format: #GstAudioFormat
224  * @name: string representation of the format
225  * @description: user readable description of the format
226  * @flags: #GstAudioFormatFlags
227  * @endianness: the endianness
228  * @width: amount of bits used for one sample
229  * @depth: amount of valid bits in @width
230  * @silence: @width/8 bytes with 1 silent sample
231  * @unpack_format: the format of the unpacked samples
232  * @unpack_func: function to unpack samples
233  * @pack_func: function to pack samples
234  *
235  * Information for an audio format.
236  */
237 struct _GstAudioFormatInfo {
238   /*< public >*/
239   GstAudioFormat format;
240   const gchar *name;
241   const gchar *description;
242   GstAudioFormatFlags flags;
243   gint endianness;
244   gint width;
245   gint depth;
246   guint8 silence[8];
247 
248   GstAudioFormat unpack_format;
249   GstAudioFormatUnpack unpack_func;
250   GstAudioFormatPack pack_func;
251 
252   /*< private >*/
253   gpointer _gst_reserved[GST_PADDING];
254 };
255 
256 GST_AUDIO_API
257 GType gst_audio_format_info_get_type (void);
258 
259 #define GST_AUDIO_FORMAT_INFO_FORMAT(info)           ((info)->format)
260 #define GST_AUDIO_FORMAT_INFO_NAME(info)             ((info)->name)
261 #define GST_AUDIO_FORMAT_INFO_FLAGS(info)            ((info)->flags)
262 
263 #define GST_AUDIO_FORMAT_INFO_IS_INTEGER(info)       !!((info)->flags & GST_AUDIO_FORMAT_FLAG_INTEGER)
264 #define GST_AUDIO_FORMAT_INFO_IS_FLOAT(info)         !!((info)->flags & GST_AUDIO_FORMAT_FLAG_FLOAT)
265 #define GST_AUDIO_FORMAT_INFO_IS_SIGNED(info)        !!((info)->flags & GST_AUDIO_FORMAT_FLAG_SIGNED)
266 
267 #define GST_AUDIO_FORMAT_INFO_ENDIANNESS(info)       ((info)->endianness)
268 #define GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN(info) ((info)->endianness == G_LITTLE_ENDIAN)
269 #define GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN(info)    ((info)->endianness == G_BIG_ENDIAN)
270 #define GST_AUDIO_FORMAT_INFO_WIDTH(info)            ((info)->width)
271 #define GST_AUDIO_FORMAT_INFO_DEPTH(info)            ((info)->depth)
272 
273 
274 GST_AUDIO_API
275 GstAudioFormat gst_audio_format_build_integer    (gboolean sign, gint endianness,
276                                                   gint width, gint depth) G_GNUC_CONST;
277 
278 GST_AUDIO_API
279 GstAudioFormat gst_audio_format_from_string      (const gchar *format) G_GNUC_CONST;
280 
281 GST_AUDIO_API
282 const gchar *  gst_audio_format_to_string        (GstAudioFormat format) G_GNUC_CONST;
283 
284 GST_AUDIO_API
285 const GstAudioFormatInfo *
286                gst_audio_format_get_info         (GstAudioFormat format) G_GNUC_CONST;
287 
288 GST_AUDIO_API
289 void           gst_audio_format_fill_silence     (const GstAudioFormatInfo *info,
290                                                   gpointer dest, gsize length);
291 
292 /**
293  * GST_AUDIO_RATE_RANGE:
294  *
295  * Maximum range of allowed sample rates, for use in template caps strings.
296  */
297 #define GST_AUDIO_RATE_RANGE "(int) [ 1, max ]"
298 /**
299  * GST_AUDIO_CHANNELS_RANGE:
300  *
301  * Maximum range of allowed channels, for use in template caps strings.
302  */
303 #define GST_AUDIO_CHANNELS_RANGE "(int) [ 1, max ]"
304 
305 /**
306  * GST_AUDIO_NE:
307  * @s: format string without endianness marker
308  *
309  * Turns audio format string @s into the format string for native endianness.
310  */
311 /**
312  * GST_AUDIO_OE:
313  * @s: format string without endianness marker
314  *
315  * Turns audio format string @s into the format string for other endianness.
316  */
317 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
318 # define GST_AUDIO_NE(s) G_STRINGIFY(s)"LE"
319 # define GST_AUDIO_OE(s) G_STRINGIFY(s)"BE"
320 #else
321 # define GST_AUDIO_NE(s) G_STRINGIFY(s)"BE"
322 # define GST_AUDIO_OE(s) G_STRINGIFY(s)"LE"
323 #endif
324 
325 /**
326  * GST_AUDIO_FORMATS_ALL:
327  *
328  * List of all audio formats, for use in template caps strings.
329  */
330 #define GST_AUDIO_FORMATS_ALL " { S8, U8, " \
331     "S16LE, S16BE, U16LE, U16BE, " \
332     "S24_32LE, S24_32BE, U24_32LE, U24_32BE, " \
333     "S32LE, S32BE, U32LE, U32BE, " \
334     "S24LE, S24BE, U24LE, U24BE, " \
335     "S20LE, S20BE, U20LE, U20BE, " \
336     "S18LE, S18BE, U18LE, U18BE, " \
337     "F32LE, F32BE, F64LE, F64BE }"
338 
339 /**
340  * GST_AUDIO_CAPS_MAKE:
341  * @format: string format that describes the sample layout, as string
342  *     (e.g. "S16LE", "S8", etc.)
343  *
344  * Generic caps string for audio, for use in pad templates.
345  */
346 #define GST_AUDIO_CAPS_MAKE(format)                                    \
347     "audio/x-raw, "                                                    \
348     "format = (string) " format ", "                                   \
349     "rate = " GST_AUDIO_RATE_RANGE ", "                                \
350     "channels = " GST_AUDIO_CHANNELS_RANGE
351 
352 /**
353  * GST_AUDIO_DEF_RATE:
354  *
355  * Standard sampling rate used in consumer audio.
356  */
357 #define GST_AUDIO_DEF_RATE 44100
358 /**
359  * GST_AUDIO_DEF_CHANNELS:
360  *
361  * Standard number of channels used in consumer audio.
362  */
363 #define GST_AUDIO_DEF_CHANNELS 2
364 /**
365  * GST_AUDIO_DEF_FORMAT:
366  *
367  * Standard format used in consumer audio.
368  */
369 #define GST_AUDIO_DEF_FORMAT "S16LE"
370 
371 G_END_DECLS
372 
373 #endif /* __GST_AUDIO_FORMAT_H__ */
374