From 4fd61fbaa41902cd51b01d53253acaeb768f8606 Mon Sep 17 00:00:00 2001 From: Peter Kjellerstedt Date: Tue, 9 Jun 2009 19:14:00 +0200 Subject: [PATCH] rtsp: Made the parsing of the RTSP URL scheme more generic. --- gst-libs/gst/rtsp/gstrtspurl.c | 54 +++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/gst-libs/gst/rtsp/gstrtspurl.c b/gst-libs/gst/rtsp/gstrtspurl.c index 145018e..98f1ac2 100644 --- a/gst-libs/gst/rtsp/gstrtspurl.c +++ b/gst-libs/gst/rtsp/gstrtspurl.c @@ -75,15 +75,21 @@ gst_rtsp_url_get_type (void) return id; } - -#define RTSP_PROTO "rtsp://" -#define RTSP_PROTO_LEN 7 -#define RTSPU_PROTO "rtspu://" -#define RTSPU_PROTO_LEN 8 -#define RTSPT_PROTO "rtspt://" -#define RTSPT_PROTO_LEN 8 -#define RTSPH_PROTO "rtsph://" -#define RTSPH_PROTO_LEN 8 +static const gchar *rtsp_url_schemes[] = { + "rtsp", + "rtspu", + "rtspt", + "rtsph", + NULL +}; + +static GstRTSPLowerTrans rtsp_url_transports[] = { + GST_RTSP_LOWER_TRANS_TCP | GST_RTSP_LOWER_TRANS_UDP | + GST_RTSP_LOWER_TRANS_UDP_MCAST, + GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST, + GST_RTSP_LOWER_TRANS_TCP, + GST_RTSP_LOWER_TRANS_HTTP | GST_RTSP_LOWER_TRANS_TCP, +}; /* format is rtsp[u]://[user:passwd@]host[:port]/abspath[?query] where host * is a host name, an IPv4 dotted decimal address ("aaa.bbb.ccc.ddd") or an @@ -107,6 +113,7 @@ gst_rtsp_url_parse (const gchar * urlstr, GstRTSPUrl ** url) GstRTSPUrl *res; gchar *p, *delim, *at, *col; gchar *host_end = NULL; + guint scheme; g_return_val_if_fail (urlstr != NULL, GST_RTSP_EINVAL); g_return_val_if_fail (url != NULL, GST_RTSP_EINVAL); @@ -114,21 +121,20 @@ gst_rtsp_url_parse (const gchar * urlstr, GstRTSPUrl ** url) res = g_new0 (GstRTSPUrl, 1); p = (gchar *) urlstr; - if (g_str_has_prefix (p, RTSP_PROTO)) { - res->transports = - GST_RTSP_LOWER_TRANS_TCP | GST_RTSP_LOWER_TRANS_UDP | - GST_RTSP_LOWER_TRANS_UDP_MCAST; - p += RTSP_PROTO_LEN; - } else if (g_str_has_prefix (p, RTSPU_PROTO)) { - res->transports = GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST; - p += RTSPU_PROTO_LEN; - } else if (g_str_has_prefix (p, RTSPT_PROTO)) { - res->transports = GST_RTSP_LOWER_TRANS_TCP; - p += RTSPT_PROTO_LEN; - } else if (g_str_has_prefix (p, RTSPH_PROTO)) { - res->transports = GST_RTSP_LOWER_TRANS_HTTP | GST_RTSP_LOWER_TRANS_TCP; - p += RTSPH_PROTO_LEN; - } else + + col = strstr (p, "://"); + if (col == NULL) + goto invalid; + + for (scheme = 0; rtsp_url_schemes[scheme] != NULL; scheme++) { + if (g_ascii_strncasecmp (rtsp_url_schemes[scheme], p, col - p) == 0) { + res->transports = rtsp_url_transports[scheme]; + p = col + 3; + break; + } + } + + if (res->transports == GST_RTSP_LOWER_TRANS_UNKNOWN) goto invalid; delim = strpbrk (p, "/?"); -- 2.7.4