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.
This commit is contained in:
Tommi Myöhänen 2007-10-22 16:44:48 +00:00 committed by Wim Taymans
parent 68bf754d0e
commit 56e63b4488
2 changed files with 25 additions and 0 deletions

View file

@ -1,3 +1,11 @@
2007-10-22 Wim Taymans <wim.taymans@gmail.com>
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.
2007-10-22 Wim Taymans <wim.taymans@gmail.com> 2007-10-22 Wim Taymans <wim.taymans@gmail.com>
Patch by: Peter Kjellerstedt <pkj at axis com> Patch by: Peter Kjellerstedt <pkj at axis com>

View file

@ -2459,9 +2459,21 @@ gst_rtspsrc_loop_interleaved (GstRTSPSrc * src)
GST_DEBUG_OBJECT (src, "doing receive"); 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 /* protect the connection with the connection lock so that we can see when
* we are finished doing server communication */ * we are finished doing server communication */
res = gst_rtspsrc_connection_receive (src, &message, src->ptcp_timeout); res = gst_rtspsrc_connection_receive (src, &message, src->ptcp_timeout);
GST_RTSP_STATE_UNLOCK (src);
switch (res) { switch (res) {
case GST_RTSP_OK: case GST_RTSP_OK:
@ -2634,6 +2646,11 @@ interrupt:
gst_rtsp_connection_flush (src->connection, FALSE); gst_rtsp_connection_flush (src->connection, FALSE);
return GST_FLOW_WRONG_STATE; return GST_FLOW_WRONG_STATE;
} }
already_paused:
{
GST_DEBUG_OBJECT (src, "got interrupted: playback already paused");
return GST_FLOW_WRONG_STATE;
}
receive_error: receive_error:
{ {
gchar *str = gst_rtsp_strresult (res); gchar *str = gst_rtsp_strresult (res);