summaryrefslogtreecommitdiffstats
path: root/gst/rtsp
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2005-06-23 14:30:13 +0000
committerWim Taymans <wim.taymans@gmail.com>2005-06-23 14:30:13 +0000
commitc51c1a4c38b727c035190c9c0639a7cdc574b3ee (patch)
treef8f0e7775dbfacaf93e6b56393e33ef3529e4226 /gst/rtsp
parent5f70cb82980abec8007d3d590534847391336722 (diff)
gst/rtsp/: Make rtspsrc a live source.
Original commit message from CVS: * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_stream_configure_transport), (find_stream), (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), (gst_rtspsrc_change_state): * gst/rtsp/rtspurl.c: (rtsp_url_parse): Make rtspsrc a live source. Don't try to parse NULL urls.
Diffstat (limited to 'gst/rtsp')
-rw-r--r--gst/rtsp/gstrtspsrc.c37
-rw-r--r--gst/rtsp/rtspurl.c3
2 files changed, 24 insertions, 16 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index 5938608d..d2466c35 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -266,20 +266,20 @@ gst_rtspsrc_set_state (GstRTSPSrc * src, GstElementState state)
/* first our rtp session manager */
if ((ret =
- gst_element_set_state (stream->rtpdec, state)) != GST_STATE_SUCCESS)
+ gst_element_set_state (stream->rtpdec, state)) == GST_STATE_FAILURE)
goto done;
/* then our sources */
if (stream->rtpsrc) {
if ((ret =
gst_element_set_state (stream->rtpsrc,
- state)) != GST_STATE_SUCCESS)
+ state)) == GST_STATE_FAILURE)
goto done;
}
if (stream->rtcpsrc) {
if ((ret =
gst_element_set_state (stream->rtcpsrc,
- state)) != GST_STATE_SUCCESS)
+ state)) == GST_STATE_FAILURE)
goto done;
}
}
@@ -305,9 +305,8 @@ gst_rtspsrc_stream_setup_rtp (GstRTSPStream * stream, gint * rtpport,
/* we manage this element */
gst_rtspsrc_add_element (src, stream->rtpsrc);
- if ((ret =
- gst_element_set_state (stream->rtpsrc,
- GST_STATE_PAUSED)) != GST_STATE_SUCCESS)
+ ret = gst_element_set_state (stream->rtpsrc, GST_STATE_PAUSED);
+ if (ret == GST_STATE_FAILURE)
goto start_rtp_failure;
if (!(stream->rtcpsrc =
@@ -317,9 +316,8 @@ gst_rtspsrc_stream_setup_rtp (GstRTSPStream * stream, gint * rtpport,
/* we manage this element */
gst_rtspsrc_add_element (src, stream->rtcpsrc);
- if ((ret =
- gst_element_set_state (stream->rtcpsrc,
- GST_STATE_PAUSED)) != GST_STATE_SUCCESS)
+ ret = gst_element_set_state (stream->rtcpsrc, GST_STATE_PAUSED);
+ if (ret == GST_STATE_FAILURE)
goto start_rtcp_failure;
g_object_get (G_OBJECT (stream->rtpsrc), "port", rtpport, NULL);
@@ -378,7 +376,7 @@ gst_rtspsrc_stream_configure_transport (GstRTSPStream * stream,
/* FIXME, make sure it outputs the caps */
pad = gst_element_get_pad (stream->rtpdec, "srcrtp");
name = g_strdup_printf ("rtp_stream%d", stream->id);
- gst_element_add_ghost_pad (GST_ELEMENT (src), pad, name);
+ gst_element_add_pad (GST_ELEMENT (src), gst_ghost_pad_new (name, pad));
g_free (name);
gst_object_unref (GST_OBJECT (pad));
@@ -625,9 +623,11 @@ gst_rtspsrc_open (GstRTSPSrc * src)
gchar *new;
gint rtpport, rtcpport;
gchar *trxparams;
+ gboolean res;
/* allocate two udp ports */
- gst_rtspsrc_stream_setup_rtp (stream, &rtpport, &rtcpport);
+ if (!gst_rtspsrc_stream_setup_rtp (stream, &rtpport, &rtcpport))
+ goto setup_rtp_failed;
trxparams = g_strdup_printf ("client_port=%d-%d", rtpport, rtcpport);
new = g_strconcat (transports, "RTP/AVP/UDP;unicast;", trxparams, NULL);
@@ -719,6 +719,11 @@ send_error:
("Could not send message."), (NULL));
return FALSE;
}
+setup_rtp_failed:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, WRITE, ("Could not setup rtp."), (NULL));
+ return FALSE;
+ }
}
static gboolean
@@ -863,9 +868,6 @@ gst_rtspsrc_change_state (GstElement * element)
rtspsrc->interleaved = FALSE;
if (!gst_rtspsrc_open (rtspsrc))
goto open_failed;
- /* need to play now for the preroll, might delay that to
- * next state when we have NO_PREROLL as a return value */
- gst_rtspsrc_play (rtspsrc);
break;
case GST_STATE_PAUSED_TO_PLAYING:
gst_rtspsrc_play (rtspsrc);
@@ -874,10 +876,13 @@ gst_rtspsrc_change_state (GstElement * element)
break;
}
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element);
+ if (ret == GST_STATE_FAILURE)
+ goto done;
+
ret = gst_rtspsrc_set_state (rtspsrc, GST_STATE_PENDING (rtspsrc));
- if (ret != GST_STATE_SUCCESS)
+ if (ret == GST_STATE_FAILURE)
goto done;
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element);
switch (transition) {
case GST_STATE_PLAYING_TO_PAUSED:
diff --git a/gst/rtsp/rtspurl.c b/gst/rtsp/rtspurl.c
index 25c85a2f..830520bb 100644
--- a/gst/rtsp/rtspurl.c
+++ b/gst/rtsp/rtspurl.c
@@ -35,6 +35,9 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
res = g_new0 (RTSPUrl, 1);
+ if (urlstr == NULL)
+ return RTSP_EINVAL;
+
p = (gchar *) urlstr;
if (g_str_has_prefix (p, RTSP_PROTO)) {
res->protocol = RTSP_PROTO_TCP;