diff options
author | Tommi Myöhänen <ext-tommi.myohanen@nokia.com> | 2007-10-22 16:44:48 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2007-10-22 16:44:48 +0000 |
commit | 56e63b44885808845f99fd3b6424bd9eeee8f2f0 (patch) | |
tree | 2847d533255a221633c79e62bbf5ad302b598d7b /gst | |
parent | 68bf754d0e7a68248d3da80618807d8216dffb18 (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.c | 17 |
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); |