/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Library <2001> Thomas Vander Stichele * <2011> Wim Taymans * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #ifndef __GST_AUDIO_FORMAT_H__ #define __GST_AUDIO_FORMAT_H__ G_BEGIN_DECLS #include #if G_BYTE_ORDER == G_BIG_ENDIAN #define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## BE #define _GST_AUDIO_FORMAT_OE(fmt) GST_AUDIO_FORMAT_ ## fmt ## LE #elif G_BYTE_ORDER == G_LITTLE_ENDIAN #define _GST_AUDIO_FORMAT_NE(fmt) GST_AUDIO_FORMAT_ ## fmt ## LE #define _GST_AUDIO_FORMAT_OE(fmt) GST_AUDIO_FORMAT_ ## fmt ## BE #endif /** * GstAudioFormat: * @GST_AUDIO_FORMAT_UNKNOWN: unknown or unset audio format * @GST_AUDIO_FORMAT_ENCODED: encoded audio format * @GST_AUDIO_FORMAT_S8: 8 bits in 8 bits, signed * @GST_AUDIO_FORMAT_U8: 8 bits in 8 bits, unsigned * @GST_AUDIO_FORMAT_S16LE: 16 bits in 16 bits, signed, little endian * @GST_AUDIO_FORMAT_S16BE: 16 bits in 16 bits, signed, big endian * @GST_AUDIO_FORMAT_U16LE: 16 bits in 16 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U16BE: 16 bits in 16 bits, unsigned, big endian * @GST_AUDIO_FORMAT_S24_32LE: 24 bits in 32 bits, signed, little endian * @GST_AUDIO_FORMAT_S24_32BE: 24 bits in 32 bits, signed, big endian * @GST_AUDIO_FORMAT_U24_32LE: 24 bits in 32 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U24_32BE: 24 bits in 32 bits, unsigned, big endian * @GST_AUDIO_FORMAT_S32LE: 32 bits in 32 bits, signed, little endian * @GST_AUDIO_FORMAT_S32BE: 32 bits in 32 bits, signed, big endian * @GST_AUDIO_FORMAT_U32LE: 32 bits in 32 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U32BE: 32 bits in 32 bits, unsigned, big endian * @GST_AUDIO_FORMAT_S24LE: 24 bits in 24 bits, signed, little endian * @GST_AUDIO_FORMAT_S24BE: 24 bits in 24 bits, signed, big endian * @GST_AUDIO_FORMAT_U24LE: 24 bits in 24 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U24BE: 24 bits in 24 bits, unsigned, big endian * @GST_AUDIO_FORMAT_S20LE: 20 bits in 24 bits, signed, little endian * @GST_AUDIO_FORMAT_S20BE: 20 bits in 24 bits, signed, big endian * @GST_AUDIO_FORMAT_U20LE: 20 bits in 24 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U20BE: 20 bits in 24 bits, unsigned, big endian * @GST_AUDIO_FORMAT_S18LE: 18 bits in 24 bits, signed, little endian * @GST_AUDIO_FORMAT_S18BE: 18 bits in 24 bits, signed, big endian * @GST_AUDIO_FORMAT_U18LE: 18 bits in 24 bits, unsigned, little endian * @GST_AUDIO_FORMAT_U18BE: 18 bits in 24 bits, unsigned, big endian * @GST_AUDIO_FORMAT_F32LE: 32-bit floating point samples, little endian * @GST_AUDIO_FORMAT_F32BE: 32-bit floating point samples, big endian * @GST_AUDIO_FORMAT_F64LE: 64-bit floating point samples, little endian * @GST_AUDIO_FORMAT_F64BE: 64-bit floating point samples, big endian * @GST_AUDIO_FORMAT_S16: 16 bits in 16 bits, signed, native endianness * @GST_AUDIO_FORMAT_U16: 16 bits in 16 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_S24_32: 24 bits in 32 bits, signed, native endianness * @GST_AUDIO_FORMAT_U24_32: 24 bits in 32 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_S32: 32 bits in 32 bits, signed, native endianness * @GST_AUDIO_FORMAT_U32: 32 bits in 32 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_S24: 24 bits in 24 bits, signed, native endianness * @GST_AUDIO_FORMAT_U24: 24 bits in 24 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_S20: 20 bits in 24 bits, signed, native endianness * @GST_AUDIO_FORMAT_U20: 20 bits in 24 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_S18: 18 bits in 24 bits, signed, native endianness * @GST_AUDIO_FORMAT_U18: 18 bits in 24 bits, unsigned, native endianness * @GST_AUDIO_FORMAT_F32: 32-bit floating point samples, native endianness * @GST_AUDIO_FORMAT_F64: 64-bit floating point samples, native endianness * * Enum value describing the most common audio formats. */ typedef enum { GST_AUDIO_FORMAT_UNKNOWN, GST_AUDIO_FORMAT_ENCODED, /* 8 bit */ GST_AUDIO_FORMAT_S8, GST_AUDIO_FORMAT_U8, /* 16 bit */ GST_AUDIO_FORMAT_S16LE, GST_AUDIO_FORMAT_S16BE, GST_AUDIO_FORMAT_U16LE, GST_AUDIO_FORMAT_U16BE, /* 24 bit in low 3 bytes of 32 bits*/ GST_AUDIO_FORMAT_S24_32LE, GST_AUDIO_FORMAT_S24_32BE, GST_AUDIO_FORMAT_U24_32LE, GST_AUDIO_FORMAT_U24_32BE, /* 32 bit */ GST_AUDIO_FORMAT_S32LE, GST_AUDIO_FORMAT_S32BE, GST_AUDIO_FORMAT_U32LE, GST_AUDIO_FORMAT_U32BE, /* 24 bit in 3 bytes*/ GST_AUDIO_FORMAT_S24LE, GST_AUDIO_FORMAT_S24BE, GST_AUDIO_FORMAT_U24LE, GST_AUDIO_FORMAT_U24BE, /* 20 bit in 3 bytes*/ GST_AUDIO_FORMAT_S20LE, GST_AUDIO_FORMAT_S20BE, GST_AUDIO_FORMAT_U20LE, GST_AUDIO_FORMAT_U20BE, /* 18 bit in 3 bytes*/ GST_AUDIO_FORMAT_S18LE, GST_AUDIO_FORMAT_S18BE, GST_AUDIO_FORMAT_U18LE, GST_AUDIO_FORMAT_U18BE, /* float */ GST_AUDIO_FORMAT_F32LE, GST_AUDIO_FORMAT_F32BE, GST_AUDIO_FORMAT_F64LE, GST_AUDIO_FORMAT_F64BE, /* native endianness equivalents */ GST_AUDIO_FORMAT_S16 = _GST_AUDIO_FORMAT_NE(S16), GST_AUDIO_FORMAT_U16 = _GST_AUDIO_FORMAT_NE(U16), GST_AUDIO_FORMAT_S24_32 = _GST_AUDIO_FORMAT_NE(S24_32), GST_AUDIO_FORMAT_U24_32 = _GST_AUDIO_FORMAT_NE(U24_32), GST_AUDIO_FORMAT_S32 = _GST_AUDIO_FORMAT_NE(S32), GST_AUDIO_FORMAT_U32 = _GST_AUDIO_FORMAT_NE(U32), GST_AUDIO_FORMAT_S24 = _GST_AUDIO_FORMAT_NE(S24), GST_AUDIO_FORMAT_U24 = _GST_AUDIO_FORMAT_NE(U24), GST_AUDIO_FORMAT_S20 = _GST_AUDIO_FORMAT_NE(S20), GST_AUDIO_FORMAT_U20 = _GST_AUDIO_FORMAT_NE(U20), GST_AUDIO_FORMAT_S18 = _GST_AUDIO_FORMAT_NE(S18), GST_AUDIO_FORMAT_U18 = _GST_AUDIO_FORMAT_NE(U18), GST_AUDIO_FORMAT_F32 = _GST_AUDIO_FORMAT_NE(F32), GST_AUDIO_FORMAT_F64 = _GST_AUDIO_FORMAT_NE(F64) } GstAudioFormat; typedef struct _GstAudioFormatInfo GstAudioFormatInfo; /** * GstAudioFormatFlags: * @GST_AUDIO_FORMAT_FLAG_INTEGER: integer samples * @GST_AUDIO_FORMAT_FLAG_FLOAT: float samples * @GST_AUDIO_FORMAT_FLAG_SIGNED: signed samples * @GST_AUDIO_FORMAT_FLAG_COMPLEX: complex layout * @GST_AUDIO_FORMAT_FLAG_UNPACK: the format can be used in * #GstAudioFormatUnpack and #GstAudioFormatPack functions * * The different audio flags that a format info can have. */ typedef enum { GST_AUDIO_FORMAT_FLAG_INTEGER = (1 << 0), GST_AUDIO_FORMAT_FLAG_FLOAT = (1 << 1), GST_AUDIO_FORMAT_FLAG_SIGNED = (1 << 2), GST_AUDIO_FORMAT_FLAG_COMPLEX = (1 << 4), GST_AUDIO_FORMAT_FLAG_UNPACK = (1 << 5) } GstAudioFormatFlags; /** * GstAudioPackFlags: * @GST_AUDIO_PACK_FLAG_NONE: No flag * * The different flags that can be used when packing and unpacking. */ typedef enum { GST_AUDIO_PACK_FLAG_NONE = 0 } GstAudioPackFlags; /** * GstAudioFormatUnpack: * @info: a #GstAudioFormatInfo * @dest: (array) (element-type guint8): a destination array * @data: (array) (element-type guint8): pointer to the audio data * @length: the amount of samples to unpack. * * Unpacks @length samples from the given data of format @info. * The samples will be unpacked into @dest which each channel * interleaved. @dest should at least be big enough to hold @length * * channels * size(unpack_format) bytes. */ typedef void (*GstAudioFormatUnpack) (const GstAudioFormatInfo *info, GstAudioPackFlags flags, gpointer dest, const gpointer data, gint length); /** * GstAudioFormatPack: * @info: a #GstAudioFormatInfo * @src: (array) (element-type guint8): a source array * @data: (array) (element-type guint8): pointer to the destination * data * @length: the amount of samples to pack. * * Packs @length samples from @src to the data array in format @info. * The samples from source have each channel interleaved * and will be packed into @data. */ typedef void (*GstAudioFormatPack) (const GstAudioFormatInfo *info, GstAudioPackFlags flags, const gpointer src, gpointer data, gint length); /** * GstAudioFormatInfo: * @format: #GstAudioFormat * @name: string representation of the format * @description: user readable description of the format * @flags: #GstAudioFormatFlags * @endianness: the endianness * @width: amount of bits used for one sample * @depth: amount of valid bits in @width * @silence: @width/8 bytes with 1 silent sample * @unpack_format: the format of the unpacked samples * @unpack_func: function to unpack samples * @pack_func: function to pack samples * * Information for an audio format. */ struct _GstAudioFormatInfo { GstAudioFormat format; const gchar *name; const gchar *description; GstAudioFormatFlags flags; gint endianness; gint width; gint depth; guint8 silence[8]; GstAudioFormat unpack_format; GstAudioFormatUnpack unpack_func; GstAudioFormatPack pack_func; /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; GType gst_audio_format_info_get_type (void); #define GST_AUDIO_FORMAT_INFO_FORMAT(info) ((info)->format) #define GST_AUDIO_FORMAT_INFO_NAME(info) ((info)->name) #define GST_AUDIO_FORMAT_INFO_FLAGS(info) ((info)->flags) #define GST_AUDIO_FORMAT_INFO_IS_INTEGER(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_INTEGER) #define GST_AUDIO_FORMAT_INFO_IS_FLOAT(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_FLOAT) #define GST_AUDIO_FORMAT_INFO_IS_SIGNED(info) !!((info)->flags & GST_AUDIO_FORMAT_FLAG_SIGNED) #define GST_AUDIO_FORMAT_INFO_ENDIANNESS(info) ((info)->endianness) #define GST_AUDIO_FORMAT_INFO_IS_LITTLE_ENDIAN(info) ((info)->endianness == G_LITTLE_ENDIAN) #define GST_AUDIO_FORMAT_INFO_IS_BIG_ENDIAN(info) ((info)->endianness == G_BIG_ENDIAN) #define GST_AUDIO_FORMAT_INFO_WIDTH(info) ((info)->width) #define GST_AUDIO_FORMAT_INFO_DEPTH(info) ((info)->depth) GstAudioFormat gst_audio_format_build_integer (gboolean sign, gint endianness, gint width, gint depth) G_GNUC_CONST; GstAudioFormat gst_audio_format_from_string (const gchar *format) G_GNUC_CONST; const gchar * gst_audio_format_to_string (GstAudioFormat format) G_GNUC_CONST; const GstAudioFormatInfo * gst_audio_format_get_info (GstAudioFormat format) G_GNUC_CONST; void gst_audio_format_fill_silence (const GstAudioFormatInfo *info, gpointer dest, gsize length); #define GST_AUDIO_RATE_RANGE "(int) [ 1, max ]" #define GST_AUDIO_CHANNELS_RANGE "(int) [ 1, max ]" #if G_BYTE_ORDER == G_LITTLE_ENDIAN # define GST_AUDIO_NE(s) G_STRINGIFY(s)"LE" # define GST_AUDIO_OE(s) G_STRINGIFY(s)"BE" #else # define GST_AUDIO_NE(s) G_STRINGIFY(s)"BE" # define GST_AUDIO_OE(s) G_STRINGIFY(s)"LE" #endif #define GST_AUDIO_FORMATS_ALL " { S8, U8, " \ "S16LE, S16BE, U16LE, U16BE, " \ "S24_32LE, S24_32BE, U24_32LE, U24_32BE, " \ "S32LE, S32BE, U32LE, U32BE, " \ "S24LE, S24BE, U24LE, U24BE, " \ "S20LE, S20BE, U20LE, U20BE, " \ "S18LE, S18BE, U18LE, U18BE, " \ "F32LE, F32BE, F64LE, F64BE }" /** * GST_AUDIO_CAPS_MAKE: * @format: string format that describes the sample layout, as string * (e.g. "S16LE", "S8", etc.) * * Generic caps string for audio, for use in pad templates. */ #define GST_AUDIO_CAPS_MAKE(format) \ "audio/x-raw, " \ "format = (string) " format ", " \ "rate = " GST_AUDIO_RATE_RANGE ", " \ "channels = " GST_AUDIO_CHANNELS_RANGE /** * GST_AUDIO_DEF_RATE: * * Standard sampling rate used in consumer audio. */ #define GST_AUDIO_DEF_RATE 44100 /** * GST_AUDIO_DEF_CHANNELS: * * Standard number of channels used in consumer audio. */ #define GST_AUDIO_DEF_CHANNELS 2 /** * GST_AUDIO_DEF_FORMAT: * * Standard format used in consumer audio. */ #define GST_AUDIO_DEF_FORMAT "S16LE" G_END_DECLS #endif /* __GST_AUDIO_FORMAT_H__ */