Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.3181 diff -u -p -u -p -r1.3181 ChangeLog --- ChangeLog 27 Apr 2007 07:34:10 -0000 1.3181 +++ ChangeLog 27 Apr 2007 08:10:00 -0000 @@ -1,5 +1,13 @@ 2007-04-27 Sebastian Dröge + * gst/gsturi.c: (get_element_names_from_uri_protocol), + (gst_uri_protocol_is_supported), (gst_element_make_from_uri): + * gst/gsturi.h: + API: Add gst_uri_protocol_is_supported(), which checks if an sink + or src that supports a given URI protocol exists. + +2007-04-27 Sebastian Dröge + * plugins/elements/gstfilesink.c: (gst_file_sink_uri_set_uri): * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri): Set the location to NULL if "file://" is set as URI. Otherwise Index: gst/gsturi.c =================================================================== RCS file: /cvs/gstreamer/gstreamer/gst/gsturi.c,v retrieving revision 1.36 diff -u -p -u -p -r1.36 gsturi.c --- gst/gsturi.c 6 Nov 2006 15:18:57 -0000 1.36 +++ gst/gsturi.c 27 Apr 2007 08:10:00 -0000 @@ -502,6 +502,52 @@ sort_by_rank (gconstpointer a, gconstpoi gst_plugin_feature_get_rank (first); } +static GList * +get_element_names_from_uri_protocol (const GstURIType type, + const gchar *protocol) +{ + GList *possibilities; + SearchEntry entry; + + g_return_val_if_fail (protocol, NULL); + + entry.type = type; + entry.protocol = g_strdup (protocol); + possibilities = gst_registry_feature_filter (gst_registry_get_default (), + search_by_entry, FALSE, &entry); + + g_free (entry.protocol); + + return possibilities; +} + +/** + * gst_uri_protocol_is_supported: + * @type: Wether to check for a source or a sink + * @protocol: Protocol that should be checkd for. + * + * Checks if an element exists that supports the given URI protocol. + * + * Returns: TRUE + * + * Since: 0.10.13 +*/ +gboolean gst_uri_protocol_is_supported (const GstURIType type, + const gchar *protocol) +{ + GList *possibilities; + + g_return_val_if_fail (protocol, FALSE); + + possibilities = get_element_names_from_uri_protocol (type, protocol); + + if (possibilities) { + g_list_free (possibilities); + return TRUE; + } else + return FALSE; +} + /** * gst_element_make_from_uri: * @type: Wether to create a source or a sink @@ -517,17 +563,15 @@ gst_element_make_from_uri (const GstURIT const gchar * elementname) { GList *possibilities, *walk; - SearchEntry entry; + gchar *protocol; GstElement *ret = NULL; g_return_val_if_fail (GST_URI_TYPE_IS_VALID (type), NULL); g_return_val_if_fail (gst_uri_is_valid (uri), NULL); - entry.type = type; - entry.protocol = gst_uri_get_protocol (uri); - possibilities = gst_registry_feature_filter (gst_registry_get_default (), - search_by_entry, FALSE, &entry); - g_free (entry.protocol); + protocol = gst_uri_get_protocol (uri); + possibilities = get_element_names_from_uri_protocol (type, protocol); + g_free (protocol); if (!possibilities) { GST_DEBUG ("No %s for URI '%s'", type == GST_URI_SINK ? "sink" : "source", Index: gst/gsturi.h =================================================================== RCS file: /cvs/gstreamer/gstreamer/gst/gsturi.h,v retrieving revision 1.16 diff -u -p -u -p -r1.16 gsturi.h --- gst/gsturi.h 9 Mar 2006 12:08:54 -0000 1.16 +++ gst/gsturi.h 27 Apr 2007 08:10:00 -0000 @@ -113,6 +113,8 @@ struct _GstURIHandlerInterface { /* general URI functions */ gboolean gst_uri_protocol_is_valid (const gchar * protocol); +gboolean gst_uri_protocol_is_supported (const GstURIType type, + const gchar *protocol); gboolean gst_uri_is_valid (const gchar * uri); gchar * gst_uri_get_protocol (const gchar * uri); gboolean gst_uri_has_protocol (const gchar * uri,