diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2005-06-23 14:30:13 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2005-06-23 14:30:13 +0000 |
commit | c51c1a4c38b727c035190c9c0639a7cdc574b3ee (patch) | |
tree | f8f0e7775dbfacaf93e6b56393e33ef3529e4226 | |
parent | 5f70cb82980abec8007d3d590534847391336722 (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.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | gst/rtsp/gstrtspsrc.c | 37 | ||||
-rw-r--r-- | gst/rtsp/rtspurl.c | 3 |
3 files changed, 37 insertions, 16 deletions
@@ -1,5 +1,18 @@ 2005-06-23 Wim Taymans <wim@fluendo.com> + * 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. + +2005-06-23 Wim Taymans <wim@fluendo.com> + * gst/udp/gstudpsrc.c: (gst_udpsrc_init): Make udpsrc a live source. 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; |