rtspsrc: open on play and pause when not done yet

With the async state changes, it is possible that we need to open the stream
before play and pause.
Also make sure we remember a previous open failure so that we don't keep trying
again.
This commit is contained in:
Wim Taymans 2011-01-10 12:46:37 +01:00 committed by Mark Nauwelaerts
parent 6fe680934a
commit ddfcd8bbfd
2 changed files with 44 additions and 4 deletions

View file

@ -3952,10 +3952,6 @@ gst_rtspsrc_reconnect (GstRTSPSrc * src, gboolean async)
/* we can try only TCP now */ /* we can try only TCP now */
src->cur_protocols = GST_RTSP_LOWER_TRANS_TCP; src->cur_protocols = GST_RTSP_LOWER_TRANS_TCP;
/* pause to prepare for a restart */
if ((res = gst_rtspsrc_pause (src, FALSE, async)) < 0)
goto done;
/* close and cleanup our state */ /* close and cleanup our state */
if ((res = gst_rtspsrc_close (src, async)) < 0) if ((res = gst_rtspsrc_close (src, async)) < 0)
goto done; goto done;
@ -5744,11 +5740,13 @@ done:
no_sdp: no_sdp:
{ {
GST_WARNING_OBJECT (src, "can't get sdp"); GST_WARNING_OBJECT (src, "can't get sdp");
src->open_error = TRUE;
goto done; goto done;
} }
open_failed: open_failed:
{ {
GST_WARNING_OBJECT (src, "can't setup streaming from sdp"); GST_WARNING_OBJECT (src, "can't setup streaming from sdp");
src->open_error = TRUE;
goto done; goto done;
} }
} }
@ -5986,6 +5984,30 @@ clear_rtp_base (GstRTSPSrc * src, GstRTSPStream * stream)
} }
} }
static GstRTSPResult
gst_rtspsrc_ensure_open (GstRTSPSrc * src, gboolean async)
{
GstRTSPResult res = GST_RTSP_OK;
if (src->state < GST_RTSP_STATE_READY) {
res = GST_RTSP_ERROR;
if (src->open_error) {
GST_DEBUG_OBJECT (src, "the stream was in error");
goto done;
}
if (async)
gst_rtspsrc_loop_start_cmd (src, CMD_OPEN);
if ((res = gst_rtspsrc_open (src, async)) < 0) {
GST_DEBUG_OBJECT (src, "failed to open stream");
goto done;
}
}
done:
return res;
}
static GstRTSPResult static GstRTSPResult
gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async)
{ {
@ -5999,6 +6021,9 @@ gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async)
GST_DEBUG_OBJECT (src, "PLAY..."); GST_DEBUG_OBJECT (src, "PLAY...");
if ((res = gst_rtspsrc_ensure_open (src, async)) < 0)
goto open_failed;
if (!(src->methods & GST_RTSP_PLAY)) if (!(src->methods & GST_RTSP_PLAY))
goto not_supported; goto not_supported;
@ -6149,6 +6174,11 @@ done:
return res; return res;
/* ERRORS */ /* ERRORS */
open_failed:
{
GST_DEBUG_OBJECT (src, "failed to open stream");
goto done;
}
not_supported: not_supported:
{ {
GST_DEBUG_OBJECT (src, "PLAY is not supported"); GST_DEBUG_OBJECT (src, "PLAY is not supported");
@ -6195,6 +6225,9 @@ gst_rtspsrc_pause (GstRTSPSrc * src, gboolean idle, gboolean async)
GST_DEBUG_OBJECT (src, "PAUSE..."); GST_DEBUG_OBJECT (src, "PAUSE...");
if ((res = gst_rtspsrc_ensure_open (src, async)) < 0)
goto open_failed;
if (!(src->methods & GST_RTSP_PAUSE)) if (!(src->methods & GST_RTSP_PAUSE))
goto not_supported; goto not_supported;
@ -6261,6 +6294,11 @@ done:
return res; return res;
/* ERRORS */ /* ERRORS */
open_failed:
{
GST_DEBUG_OBJECT (src, "failed to open stream");
goto done;
}
not_supported: not_supported:
{ {
GST_DEBUG_OBJECT (src, "PAUSE is not supported"); GST_DEBUG_OBJECT (src, "PAUSE is not supported");
@ -6395,6 +6433,7 @@ gst_rtspsrc_thread (GstRTSPSrc * src)
src->cur_protocols = src->protocols; src->cur_protocols = src->protocols;
/* first attempt, don't ignore timeouts */ /* first attempt, don't ignore timeouts */
src->ignore_timeout = FALSE; src->ignore_timeout = FALSE;
src->open_error = FALSE;
ret = gst_rtspsrc_open (src, TRUE); ret = gst_rtspsrc_open (src, TRUE);
break; break;
case CMD_PLAY: case CMD_PLAY:

View file

@ -182,6 +182,7 @@ struct _GstRTSPSrc {
gboolean ignore_timeout; gboolean ignore_timeout;
gboolean flushing; gboolean flushing;
gboolean waiting; gboolean waiting;
gboolean open_error;
/* mutex for protecting state changes */ /* mutex for protecting state changes */
GStaticRecMutex *state_rec_lock; GStaticRecMutex *state_rec_lock;