From b14738fb2062a766ca772d894acfc08fa178882b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 18 Oct 2006 16:18:55 +0000 Subject: [PATCH] gst/rtsp/: Reuse already existing enum for lower transport. Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_set_uri): * gst/rtsp/rtspconnection.c: (rtsp_connection_create): * gst/rtsp/rtspdefs.h: * gst/rtsp/rtspurl.c: (rtsp_url_parse): * gst/rtsp/rtspurl.h: Reuse already existing enum for lower transport. Add rtspt and rtspu protocols. Send redirect to rtspt when udp times out. --- ChangeLog | 14 ++++++++++ gst/rtsp/gstrtspsrc.c | 56 +++++++++++++++++++++++++++------------ gst/rtsp/rtspconnection.c | 3 --- gst/rtsp/rtspdefs.h | 5 ---- gst/rtsp/rtspurl.c | 11 ++++++-- gst/rtsp/rtspurl.h | 15 ++++++----- 6 files changed, 70 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8689cecab5..44b794ded6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-10-18 Wim Taymans + + * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), + (gst_rtspsrc_class_init), (gst_rtspsrc_loop_interleaved), + (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), + (gst_rtspsrc_uri_get_protocols), (gst_rtspsrc_uri_set_uri): + * gst/rtsp/rtspconnection.c: (rtsp_connection_create): + * gst/rtsp/rtspdefs.h: + * gst/rtsp/rtspurl.c: (rtsp_url_parse): + * gst/rtsp/rtspurl.h: + Reuse already existing enum for lower transport. + Add rtspt and rtspu protocols. + Send redirect to rtspt when udp times out. + 2006-10-18 Wim Taymans * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index e698f6addc..f29bfa2994 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -143,22 +143,23 @@ enum PROP_TIMEOUT, }; -#define GST_TYPE_RTSP_PROTO (gst_rtsp_proto_get_type()) +#define GST_TYPE_RTSP_LOWER_TRANS (gst_rtsp_lower_trans_get_type()) static GType -gst_rtsp_proto_get_type (void) +gst_rtsp_lower_trans_get_type (void) { - static GType rtsp_proto_type = 0; - static const GFlagsValue rtsp_proto[] = { + static GType rtsp_lower_trans_type = 0; + static const GFlagsValue rtsp_lower_trans[] = { {RTSP_LOWER_TRANS_UDP, "UDP Unicast Mode", "udp-unicast"}, {RTSP_LOWER_TRANS_UDP_MCAST, "UDP Multicast Mode", "udp-multicast"}, {RTSP_LOWER_TRANS_TCP, "TCP interleaved mode", "tcp"}, {0, NULL, NULL}, }; - if (!rtsp_proto_type) { - rtsp_proto_type = g_flags_register_static ("GstRTSPProto", rtsp_proto); + if (!rtsp_lower_trans_type) { + rtsp_lower_trans_type = + g_flags_register_static ("GstRTSPLowerTrans", rtsp_lower_trans); } - return rtsp_proto_type; + return rtsp_lower_trans_type; } static void gst_rtspsrc_base_init (gpointer g_class); @@ -245,7 +246,7 @@ gst_rtspsrc_class_init (GstRTSPSrcClass * klass) g_object_class_install_property (gobject_class, PROP_PROTOCOLS, g_param_spec_flags ("protocols", "Protocols", - "Allowed lower transport protocols", GST_TYPE_RTSP_PROTO, + "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS, DEFAULT_PROTOCOLS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_object_class_install_property (gobject_class, PROP_DEBUG, @@ -1170,8 +1171,10 @@ receive_error: GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("Could not receive message. (%s)", str)); g_free (str); + if (src->debug) rtsp_message_dump (&response); + rtsp_message_unset (&response); ret = GST_FLOW_UNEXPECTED; goto need_pause; @@ -1250,6 +1253,8 @@ gst_rtspsrc_loop_udp (GstRTSPSrc * src) /* see if we have TCP left to try */ if (src->cur_protocols & RTSP_LOWER_TRANS_TCP) { + gchar *url, *pos; + /* We post a warning message now to inform the user * that nothing happened. It's most likely a firewall thing. */ GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL), @@ -1258,14 +1263,23 @@ gst_rtspsrc_loop_udp (GstRTSPSrc * src) (gdouble) src->timeout / 1000000)); /* we can try only TCP now */ src->cur_protocols = RTSP_LOWER_TRANS_TCP; - gst_rtspsrc_open (src); - gst_rtspsrc_play (src); + + pos = strstr (src->location, "://"); + if (!pos) + goto weird_url; + + url = g_strdup_printf ("rtspt://%s", pos + 3); + + gst_element_post_message (GST_ELEMENT_CAST (src), + gst_message_new_element (GST_OBJECT_CAST (src), + gst_structure_new ("redirect", + "new-location", G_TYPE_STRING, url, NULL))); + g_free (url); } else { src->cur_protocols = 0; - /* no transport possible, post an error */ + /* no transport possible, post an error and stop */ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), - ("Could not receive any UDP packets for %.4f seconds, maybe your " - "firewall is blocking it.", (gdouble) src->timeout / 1000000)); + ("Could not connect to server, no protocols left")); } } return; @@ -1278,6 +1292,12 @@ stopping: gst_task_pause (src->task); return; } +weird_url: + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), + ("Could not redirect, location %s is invalid", src->location)); + return; + } } static void @@ -1738,9 +1758,9 @@ gst_rtspsrc_open (GstRTSPSrc * src) if (src->extension && src->extension->parse_sdp) src->extension->parse_sdp (src->extension, &sdp); - /* we initially allow all configured lower transports. based on the - * replies from the server we narrow them down. */ - protocols = src->cur_protocols; + /* we initially allow all configured lower transports. based on the URL + * transports and the replies from the server we narrow them down. */ + protocols = src->url->transports & src->cur_protocols; /* setup streams */ n_streams = sdp_message_medias_len (&sdp); @@ -2230,7 +2250,7 @@ gst_rtspsrc_uri_get_type (void) static gchar ** gst_rtspsrc_uri_get_protocols (void) { - static gchar *protocols[] = { "rtsp", NULL }; + static gchar *protocols[] = { "rtsp", "rtspu", "rtspt", NULL }; return protocols; } @@ -2267,6 +2287,8 @@ gst_rtspsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) src->url = newurl; g_free (src->location); src->location = g_strdup (uri); + if (!g_str_has_prefix (src->location, "rtsp://")) + memmove (src->location + 4, src->location + 5, strlen (src->location) - 4); GST_DEBUG_OBJECT (src, "set uri: %s", GST_STR_NULL (uri)); diff --git a/gst/rtsp/rtspconnection.c b/gst/rtsp/rtspconnection.c index 9466db7ccf..a0817f926b 100644 --- a/gst/rtsp/rtspconnection.c +++ b/gst/rtsp/rtspconnection.c @@ -120,9 +120,6 @@ rtsp_connection_create (RTSPUrl * url, RTSPConnection ** conn) g_return_val_if_fail (url != NULL, RTSP_EINVAL); g_return_val_if_fail (conn != NULL, RTSP_EINVAL); - if (url->protocol != RTSP_PROTO_TCP) - return RTSP_ENOTIMPL; - newconn = g_new (RTSPConnection, 1); #ifdef G_OS_WIN32 diff --git a/gst/rtsp/rtspdefs.h b/gst/rtsp/rtspdefs.h index 7afece94c4..61ec3bd1b3 100644 --- a/gst/rtsp/rtspdefs.h +++ b/gst/rtsp/rtspdefs.h @@ -70,11 +70,6 @@ typedef enum { RTSP_ELAST = -14, } RTSPResult; -typedef enum { - RTSP_PROTO_TCP, - RTSP_PROTO_UDP, -} RTSPProto; - typedef enum { RTSP_FAM_NONE, RTSP_FAM_INET, diff --git a/gst/rtsp/rtspurl.c b/gst/rtsp/rtspurl.c index cc11e91fe8..dd735565f1 100644 --- a/gst/rtsp/rtspurl.c +++ b/gst/rtsp/rtspurl.c @@ -49,6 +49,8 @@ #define RTSP_PROTO_LEN 7 #define RTSPU_PROTO "rtspu://" #define RTSPU_PROTO_LEN 8 +#define RTSPT_PROTO "rtspt://" +#define RTSPT_PROTO_LEN 8 /* format is rtsp[u]://[user:passwd@]host[:port]/abspath */ @@ -65,11 +67,16 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url) p = (gchar *) urlstr; if (g_str_has_prefix (p, RTSP_PROTO)) { - res->protocol = RTSP_PROTO_TCP; + res->transports = + RTSP_LOWER_TRANS_TCP | RTSP_LOWER_TRANS_UDP | + RTSP_LOWER_TRANS_UDP_MCAST; p += RTSP_PROTO_LEN; } else if (g_str_has_prefix (p, RTSPU_PROTO)) { - res->protocol = RTSP_PROTO_UDP; + res->transports = RTSP_LOWER_TRANS_UDP | RTSP_LOWER_TRANS_UDP_MCAST; p += RTSPU_PROTO_LEN; + } else if (g_str_has_prefix (p, RTSPT_PROTO)) { + res->transports = RTSP_LOWER_TRANS_TCP; + p += RTSPT_PROTO_LEN; } else goto invalid; diff --git a/gst/rtsp/rtspurl.h b/gst/rtsp/rtspurl.h index 27b537d84e..3c39e92459 100644 --- a/gst/rtsp/rtspurl.h +++ b/gst/rtsp/rtspurl.h @@ -46,19 +46,20 @@ #include #include +#include G_BEGIN_DECLS #define RTSP_DEFAULT_PORT 554 typedef struct _RTSPUrl { - RTSPProto protocol; - RTSPFamily family; - gchar *user; - gchar *passwd; - gchar *host; - guint16 port; - gchar *abspath; + RTSPLowerTrans transports; + RTSPFamily family; + gchar *user; + gchar *passwd; + gchar *host; + guint16 port; + gchar *abspath; } RTSPUrl; RTSPResult rtsp_url_parse (const gchar *urlstr, RTSPUrl **url);