From 2f89c3aff1bba99de7b17c48b236ee6b7ecdc2ab Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 25 Oct 2019 12:05:54 +0900 Subject: [PATCH] audio-info: Allow from_caps() with encoded audio format Similar to gst_video_info_from_caps() which allows encoded video format, don't error gst_audio_info_from_caps() with encoded audio format. Because gst_audio_info_set_format() supports encoded format, current behavior does not seem to be consistent. --- gst-libs/gst/audio/audio-info.c | 54 +++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/gst-libs/gst/audio/audio-info.c b/gst-libs/gst/audio/audio-info.c index f64c9ddacf..b18c2d9325 100644 --- a/gst-libs/gst/audio/audio-info.c +++ b/gst-libs/gst/audio/audio-info.c @@ -193,13 +193,14 @@ gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps) { GstStructure *str; const gchar *s; - GstAudioFormat format; - gint rate, channels; - guint64 channel_mask; + GstAudioFormat format = GST_AUDIO_FORMAT_UNKNOWN; + gint rate = 0; + gint channels = 0; + guint64 channel_mask = 0; gint i; GstAudioChannelPosition position[64]; GstAudioFlags flags; - GstAudioLayout layout; + GstAudioLayout layout = GST_AUDIO_LAYOUT_INTERLEAVED; g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (caps != NULL, FALSE); @@ -211,28 +212,35 @@ gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps) str = gst_caps_get_structure (caps, 0); - if (!gst_structure_has_name (str, "audio/x-raw")) + if (gst_structure_has_name (str, "audio/x-raw")) { + if (!(s = gst_structure_get_string (str, "format"))) + goto no_format; + + format = gst_audio_format_from_string (s); + if (format == GST_AUDIO_FORMAT_UNKNOWN) + goto unknown_format; + } else if (g_str_has_prefix (gst_structure_get_name (str), "audio/")) { + format = GST_AUDIO_FORMAT_ENCODED; + } else { goto wrong_name; + } - if (!(s = gst_structure_get_string (str, "format"))) - goto no_format; + if (format != GST_AUDIO_FORMAT_ENCODED) { + if (!(s = gst_structure_get_string (str, "layout"))) + goto no_layout; + if (g_str_equal (s, "interleaved")) + layout = GST_AUDIO_LAYOUT_INTERLEAVED; + else if (g_str_equal (s, "non-interleaved")) + layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED; + else + goto unknown_layout; + } - format = gst_audio_format_from_string (s); - 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")) - layout = GST_AUDIO_LAYOUT_INTERLEAVED; - else if (g_str_equal (s, "non-interleaved")) - layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED; - else - goto unknown_layout; - - if (!gst_structure_get_int (str, "rate", &rate)) + if (!gst_structure_get_int (str, "rate", &rate) && + format != GST_AUDIO_FORMAT_ENCODED) goto no_rate; - if (!gst_structure_get_int (str, "channels", &channels)) + if (!gst_structure_get_int (str, "channels", &channels) && + format != GST_AUDIO_FORMAT_ENCODED) goto no_channels; if (!gst_structure_get (str, "channel-mask", GST_TYPE_BITMASK, &channel_mask, @@ -242,7 +250,7 @@ gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps) } else if (channels == 2) { position[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; position[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; - } else { + } else if (format != GST_AUDIO_FORMAT_ENCODED) { goto no_channel_mask; } } else if (channel_mask == 0) {