summaryrefslogtreecommitdiffstats
path: root/gst/rtsp
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2006-10-18 16:18:55 +0000
committerWim Taymans <wim.taymans@gmail.com>2006-10-18 16:18:55 +0000
commitb14738fb2062a766ca772d894acfc08fa178882b (patch)
treee554a6b2de982920bbd7e598ba20c0faba94a63d /gst/rtsp
parent02ae90eaf49949ff9bb7ed398ab80bb7522f5460 (diff)
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.
Diffstat (limited to 'gst/rtsp')
-rw-r--r--gst/rtsp/gstrtspsrc.c56
-rw-r--r--gst/rtsp/rtspconnection.c3
-rw-r--r--gst/rtsp/rtspdefs.h5
-rw-r--r--gst/rtsp/rtspurl.c11
-rw-r--r--gst/rtsp/rtspurl.h15
5 files changed, 56 insertions, 34 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index e698f6ad..f29bfa29 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 9466db7c..a0817f92 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 7afece94..61ec3bd1 100644
--- a/gst/rtsp/rtspdefs.h
+++ b/gst/rtsp/rtspdefs.h
@@ -71,11 +71,6 @@ typedef enum {
} RTSPResult;
typedef enum {
- RTSP_PROTO_TCP,
- RTSP_PROTO_UDP,
-} RTSPProto;
-
-typedef enum {
RTSP_FAM_NONE,
RTSP_FAM_INET,
RTSP_FAM_INET6,
diff --git a/gst/rtsp/rtspurl.c b/gst/rtsp/rtspurl.c
index cc11e91f..dd735565 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 27b537d8..3c39e924 100644
--- a/gst/rtsp/rtspurl.h
+++ b/gst/rtsp/rtspurl.h
@@ -46,19 +46,20 @@
#include <glib.h>
#include <rtspdefs.h>
+#include <rtsptransport.h>
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);