mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-18 15:51:11 +00:00
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:
parent
68bf754d0e
commit
56e63b4488
2 changed files with 25 additions and 0 deletions
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue