summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorTommi Myöhänen <ext-tommi.myohanen@nokia.com>2007-10-22 16:44:48 +0000
committerWim Taymans <wim.taymans@gmail.com>2007-10-22 16:44:48 +0000
commit56e63b44885808845f99fd3b6424bd9eeee8f2f0 (patch)
tree2847d533255a221633c79e62bbf5ad302b598d7b /gst
parent68bf754d0e7a68248d3da80618807d8216dffb18 (diff)
gst/rtsp/gstrtspsrc.c: Fix race when pausing a RTSP stream in interleaved.
Original commit message from CVS: Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_interleaved): Fix race when pausing a RTSP stream in interleaved. Fixes #475784.
Diffstat (limited to 'gst')
-rw-r--r--gst/rtsp/gstrtspsrc.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index 34b43580..8a85c0b5 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -2459,9 +2459,21 @@ gst_rtspsrc_loop_interleaved (GstRTSPSrc * src)
GST_DEBUG_OBJECT (src, "doing receive");
+ /* We need to check if playback has been paused while we have been
+ * doing something else in our own GstTask (e.g. pushing buffer). There
+ * is a slight chance that we have just received data buffer when PAUSE
+ * state change happens (in another thread). In this case we well be
+ * totally ignorant of that unless we explicitly check it here. */
+ GST_RTSP_STATE_LOCK (src);
+ if (src->state == GST_RTSP_STATE_READY) {
+ /* We are looping in a paused mode */
+ GST_RTSP_STATE_UNLOCK (src);
+ goto already_paused;
+ }
/* protect the connection with the connection lock so that we can see when
* we are finished doing server communication */
res = gst_rtspsrc_connection_receive (src, &message, src->ptcp_timeout);
+ GST_RTSP_STATE_UNLOCK (src);
switch (res) {
case GST_RTSP_OK:
@@ -2634,6 +2646,11 @@ interrupt:
gst_rtsp_connection_flush (src->connection, FALSE);
return GST_FLOW_WRONG_STATE;
}
+already_paused:
+ {
+ GST_DEBUG_OBJECT (src, "got interrupted: playback already paused");
+ return GST_FLOW_WRONG_STATE;
+ }
receive_error:
{
gchar *str = gst_rtsp_strresult (res);