static gchar * format_channel_mask (GstDiscovererAudioInfo * ainfo) { GString *s = g_string_sized_new (32); GstAudioChannelPosition position[64]; guint channels = gst_discoverer_audio_info_get_channels (ainfo); GEnumClass *enum_class = g_type_class_ref (GST_TYPE_AUDIO_CHANNEL_POSITION); guint i; guint64 channel_mask; if (channels == 0) goto done; channel_mask = gst_discoverer_audio_info_get_channel_mask (ainfo); if (channel_mask != 0) { gst_audio_channel_positions_from_mask (channels, channel_mask, position); for (i = 0; i < channels; i++) { GEnumValue *value = g_enum_get_value (enum_class, position[i]); my_g_string_append_printf (s, 0, "%s%s", value->value_nick, i + 1 == channels ? "" : ", "); } } else { g_string_append (s, "unknown layout"); } g_type_class_unref (enum_class); done: return g_string_free (s, FALSE); }
static gboolean gst_raw_audio_parse_set_config_channels (GstRawAudioParseConfig * config, guint num_channels, guint64 channel_mask, gboolean set_positions) { g_assert (num_channels > 0); config->num_channels = num_channels; /* Setting this to FALSE, since initially, after setting the channels, * the default GStreamer channel ordering is used. */ config->needs_channel_reordering = FALSE; /* Set the channel positions based on the given channel mask if set_positions * is set to TRUE. A channel mask of 0 signifies that a fallback mask should be * used for the given number of channels. */ if (set_positions) { if (channel_mask == 0) channel_mask = gst_audio_channel_get_fallback_mask (config->num_channels); return gst_audio_channel_positions_from_mask (config->num_channels, channel_mask, config->channel_positions); } else { return TRUE; } }
/** * gst_audio_info_from_caps: * @info: a #GstAudioInfo * @caps: a #GstCaps * * Parse @caps and update @info. * * Returns: TRUE if @caps could be parsed */ gboolean gst_audio_info_from_caps (GstAudioInfo * info, const GstCaps * caps) { GstStructure *str; const gchar *s; GstAudioFormat format; gint rate, channels; guint64 channel_mask; gint i; GstAudioChannelPosition position[64]; GstAudioFlags flags; GstAudioLayout layout; g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (caps != NULL, FALSE); g_return_val_if_fail (gst_caps_is_fixed (caps), FALSE); GST_DEBUG ("parsing caps %" GST_PTR_FORMAT, caps); flags = 0; str = gst_caps_get_structure (caps, 0); if (!gst_structure_has_name (str, "audio/x-raw")) goto wrong_name; 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; 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)) goto no_rate; if (!gst_structure_get_int (str, "channels", &channels)) goto no_channels; if (!gst_structure_get (str, "channel-mask", GST_TYPE_BITMASK, &channel_mask, NULL)) { if (channels == 1) { position[0] = GST_AUDIO_CHANNEL_POSITION_MONO; } else if (channels == 2) { position[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; position[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; } else { goto no_channel_mask; } } else if (channel_mask == 0) { flags |= GST_AUDIO_FLAG_UNPOSITIONED; for (i = 0; i < MIN (64, channels); i++) position[i] = GST_AUDIO_CHANNEL_POSITION_NONE; } else { if (!gst_audio_channel_positions_from_mask (channels, channel_mask, position)) goto invalid_channel_mask; } gst_audio_info_set_format (info, format, rate, channels, (channels > 64) ? NULL : position); info->flags = flags; info->layout = layout; return TRUE; /* ERROR */ wrong_name: { GST_ERROR ("wrong name, expected audio/x-raw"); return FALSE; } no_format: { GST_ERROR ("no format given"); return FALSE; } 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"); return FALSE; } no_channels: { GST_ERROR ("no channels property given"); return FALSE; } no_channel_mask: { GST_ERROR ("no channel-mask property given"); return FALSE; } invalid_channel_mask: { GST_ERROR ("Invalid channel mask 0x%016" G_GINT64_MODIFIER "x for %d channels", channel_mask, channels); return FALSE; } }