mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
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.
This commit is contained in:
parent
e2c6b8ec4d
commit
810bfec656
2 changed files with 44 additions and 0 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue