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 slightly 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_info_fill_silence (const GstAudioFormatInfo *info, 290 gpointer dest, gsize length); 291 GST_AUDIO_API G_DEPRECATED_FOR(gst_audio_format_info_fill_silence) 292 void gst_audio_format_fill_silence (const GstAudioFormatInfo *info, 293 gpointer dest, gsize length); 294 295 /** 296 * GST_AUDIO_RATE_RANGE: 297 * 298 * Maximum range of allowed sample rates, for use in template caps strings. 299 */ 300 #define GST_AUDIO_RATE_RANGE "(int) [ 1, max ]" 301 /** 302 * GST_AUDIO_CHANNELS_RANGE: 303 * 304 * Maximum range of allowed channels, for use in template caps strings. 305 */ 306 #define GST_AUDIO_CHANNELS_RANGE "(int) [ 1, max ]" 307 308 /** 309 * GST_AUDIO_NE: 310 * @s: format string without endianness marker 311 * 312 * Turns audio format string @s into the format string for native endianness. 313 */ 314 /** 315 * GST_AUDIO_OE: 316 * @s: format string without endianness marker 317 * 318 * Turns audio format string @s into the format string for other endianness. 319 */ 320 #if G_BYTE_ORDER == G_LITTLE_ENDIAN 321 # define GST_AUDIO_NE(s) G_STRINGIFY(s)"LE" 322 # define GST_AUDIO_OE(s) G_STRINGIFY(s)"BE" 323 #else 324 # define GST_AUDIO_NE(s) G_STRINGIFY(s)"BE" 325 # define GST_AUDIO_OE(s) G_STRINGIFY(s)"LE" 326 #endif 327 328 /** 329 * GST_AUDIO_FORMATS_ALL: 330 * 331 * List of all audio formats, for use in template caps strings. 332 * 333 * Formats are sorted by decreasing "quality", using these criteria by priority: 334 * - depth 335 * - width 336 * - Float > Signed > Unsigned 337 * - native endianness preferred 338 */ 339 #if G_BYTE_ORDER == G_BIG_ENDIAN 340 #define GST_AUDIO_FORMATS_ALL "{ F64BE, F64LE, " \ 341 "F32BE, F32LE, S32BE, S32LE, U32BE, U32LE, " \ 342 "S24_32BE, S24_32LE, U24_32BE, U24_32LE, " \ 343 "S24BE, S24LE, U24BE, U24LE, " \ 344 "S20BE, S20LE, U20BE, U20LE, " \ 345 "S18BE, S18LE, U18BE, U18LE, " \ 346 "S16BE, S16LE, U16BE, U16LE, " \ 347 "S8, U8 }" 348 #elif G_BYTE_ORDER == G_LITTLE_ENDIAN 349 #define GST_AUDIO_FORMATS_ALL "{ F64LE, F64BE, " \ 350 "F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, " \ 351 "S24_32LE, S24_32BE, U24_32LE, U24_32BE, " \ 352 "S24LE, S24BE, U24LE, U24BE, " \ 353 "S20LE, S20BE, U20LE, U20BE, " \ 354 "S18LE, S18BE, U18LE, U18BE, " \ 355 "S16LE, S16BE, U16LE, U16BE, " \ 356 "S8, U8 }" 357 #endif 358 359 GST_AUDIO_API 360 const GstAudioFormat * gst_audio_formats_raw (guint * len); 361 362 /** 363 * GST_AUDIO_CAPS_MAKE: 364 * @format: string format that describes the sample layout, as string 365 * (e.g. "S16LE", "S8", etc.) 366 * 367 * Generic caps string for audio, for use in pad templates. 368 */ 369 #define GST_AUDIO_CAPS_MAKE(format) \ 370 "audio/x-raw, " \ 371 "format = (string) " format ", " \ 372 "rate = " GST_AUDIO_RATE_RANGE ", " \ 373 "channels = " GST_AUDIO_CHANNELS_RANGE 374 375 /** 376 * GST_AUDIO_DEF_RATE: 377 * 378 * Standard sampling rate used in consumer audio. 379 */ 380 #define GST_AUDIO_DEF_RATE 44100 381 /** 382 * GST_AUDIO_DEF_CHANNELS: 383 * 384 * Standard number of channels used in consumer audio. 385 */ 386 #define GST_AUDIO_DEF_CHANNELS 2 387 /** 388 * GST_AUDIO_DEF_FORMAT: 389 * 390 * Standard format used in consumer audio. 391 */ 392 #define GST_AUDIO_DEF_FORMAT "S16LE" 393 394 /** 395 * GstAudioLayout: 396 * @GST_AUDIO_LAYOUT_INTERLEAVED: interleaved audio 397 * @GST_AUDIO_LAYOUT_NON_INTERLEAVED: non-interleaved audio 398 * 399 * Layout of the audio samples for the different channels. 400 */ 401 typedef enum { 402 GST_AUDIO_LAYOUT_INTERLEAVED = 0, 403 GST_AUDIO_LAYOUT_NON_INTERLEAVED 404 } GstAudioLayout; 405 406 GST_AUDIO_API 407 GstCaps * gst_audio_make_raw_caps (const GstAudioFormat formats[], guint len, 408 GstAudioLayout layout); 409 410 G_END_DECLS 411 412 #endif /* __GST_AUDIO_FORMAT_H__ */ 413