gst/rtsp/gstrtspsrc.c: Fix race when pausing a RTSP stream in interleaved.
authorTommi Myöhänen <ext-tommi.myohanen@nokia.com>
Mon, 22 Oct 2007 16:44:48 +0000 (16:44 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 22 Oct 2007 16:44:48 +0000 (16:44 +0000)
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.

ChangeLog
gst/rtsp/gstrtspsrc.c

index eaed420..59d29a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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):
index 34b4358..8a85c0b 100644 (file)
@@ -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);