From 810bfec6565048684493aa2bc74026ae00bf8eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 31 Dec 2011 13:46:53 +0100 Subject: [PATCH] audio: Add "layout" field to the raw audio caps This can be used to differentiate between interleaved and non-interleaved audio and whatever comes in the future. --- gst-libs/gst/audio/audio.c | 29 +++++++++++++++++++++++++++++ gst-libs/gst/audio/audio.h | 15 +++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/gst-libs/gst/audio/audio.c b/gst-libs/gst/audio/audio.c index e8c62bab74..e8ba262d9e 100644 --- a/gst-libs/gst/audio/audio.c +++ b/gst-libs/gst/audio/audio.c @@ -470,6 +470,7 @@ gst_audio_info_set_format (GstAudioInfo * info, GstAudioFormat format, finfo = &formats[format]; info->flags = 0; + info->layout = GST_AUDIO_LAYOUT_INTERLEAVED; info->finfo = finfo; info->rate = rate; info->channels = channels; @@ -530,6 +531,15 @@ gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps) if (format == GST_AUDIO_FORMAT_UNKNOWN) goto unknown_format; + if (!(s = gst_structure_get_string (str, "layout"))) + goto no_layout; + if (g_str_equal (s, "interleaved")) + info->layout = GST_AUDIO_LAYOUT_INTERLEAVED; + else if (g_str_equal (s, "non-interleaved")) + info->layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED; + else + goto unknown_layout; + if (!gst_structure_get_int (str, "rate", &rate)) goto no_rate; if (!gst_structure_get_int (str, "channels", &channels)) @@ -585,6 +595,16 @@ unknown_format: GST_ERROR ("unknown format given"); return FALSE; } +no_layout: + { + GST_ERROR ("no layout given"); + return FALSE; + } +unknown_layout: + { + GST_ERROR ("unknown layout given"); + return FALSE; + } no_rate: { GST_ERROR ("no rate property given"); @@ -622,6 +642,7 @@ gst_audio_info_to_caps (const GstAudioInfo * info) { GstCaps *caps; const gchar *format; + const gchar *layout; g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (info->finfo != NULL, NULL); @@ -630,8 +651,16 @@ gst_audio_info_to_caps (const GstAudioInfo * info) format = gst_audio_format_to_string (info->finfo->format); g_return_val_if_fail (format != NULL, NULL); + if (info->layout == GST_AUDIO_LAYOUT_INTERLEAVED) + layout = "interleaved"; + else if (info->layout == GST_AUDIO_LAYOUT_NON_INTERLEAVED) + layout = "non-interleaved"; + else + g_return_val_if_reached (NULL); + caps = gst_caps_new_simple ("audio/x-raw", "format", G_TYPE_STRING, format, + "layout", G_TYPE_STRING, layout, "rate", G_TYPE_INT, info->rate, "channels", G_TYPE_INT, info->channels, NULL); diff --git a/gst-libs/gst/audio/audio.h b/gst-libs/gst/audio/audio.h index f2e45224f5..283d0ac3cd 100644 --- a/gst-libs/gst/audio/audio.h +++ b/gst-libs/gst/audio/audio.h @@ -367,10 +367,23 @@ typedef enum { GST_AUDIO_FLAG_UNPOSITIONED = (1 << 0) } GstAudioFlags; +/** + * GstAudioLayout: + * @GST_AUDIO_LAYOUT_INTERLEAVED: interleaved audio + * @GST_AUDIO_LAYOUT_NON_INTERLEAVED: non-interleaved audio + * + * Layout of the audio samples for the different channels. + */ +typedef enum { + GST_AUDIO_LAYOUT_INTERLEAVED = 0, + GST_AUDIO_LAYOUT_NON_INTERLEAVED +} GstAudioLayout; + /** * GstAudioInfo: * @finfo: the format info of the audio * @flags: additional audio flags + * @layout: audio layout * @rate: the audio sample rate * @channels: the number of channels * @bpf: the number of bytes for one frame, this is the size of one @@ -385,6 +398,7 @@ typedef enum { struct _GstAudioInfo { const GstAudioFormatInfo *finfo; GstAudioFlags flags; + GstAudioLayout layout; gint rate; gint channels; gint bpf; @@ -414,6 +428,7 @@ GType gst_audio_info_get_type (void); #define GST_AUDIO_INFO_FLAGS(info) ((info)->flags) #define GST_AUDIO_INFO_IS_UNPOSITIONED(info) ((info)->flags & GST_AUDIO_FLAG_UNPOSITIONED) +#define GST_AUDIO_INFO_LAYOUT(info) ((info)->layout) #define GST_AUDIO_INFO_RATE(info) ((info)->rate) #define GST_AUDIO_INFO_CHANNELS(info) ((info)->channels)