diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | gst/rtsp/gstrtspsrc.c | 17 |
2 files changed, 25 insertions, 0 deletions
@@ -1,5 +1,13 @@ 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> + Patch by: Peter Kjellerstedt <pkj at axis com> * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_finalize): 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); |