rtspsrc: fix race in state change to paused
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 20 Jun 2013 12:43:47 +0000 (14:43 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 20 Jun 2013 12:43:47 +0000 (14:43 +0200)
When we go to paused, we first flush the connection and then send the pause
command. As a result of the flushing, the scheduled paused command can get
lost. Wait until the connection is completely flushed and the rtsp task is
waiting before issuing the paused or playing request.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=702705

gst/rtsp/gstrtspsrc.c

index c327cb8..d751d8d 100644 (file)
@@ -4342,7 +4342,7 @@ gst_rtspsrc_loop_send_cmd (GstRTSPSrc * src, gint cmd, gint mask)
     src->pending_cmd = CMD_WAIT;
     GST_OBJECT_UNLOCK (src);
     /* cancel previous request */
-    GST_DEBUG_OBJECT (src, "cancel previous request");
+    GST_DEBUG_OBJECT (src, "cancel previous request %d", old);
     gst_rtspsrc_loop_cancel_cmd (src, old);
     GST_OBJECT_LOCK (src);
   }
@@ -6945,6 +6945,9 @@ gst_rtspsrc_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
       /* unblock the tcp tasks and make the loop waiting */
       gst_rtspsrc_loop_send_cmd (rtspsrc, CMD_WAIT, CMD_LOOP);
+      /* make sure it is waiting before we send PAUSE or PLAY below */
+      GST_RTSP_STREAM_LOCK (rtspsrc);
+      GST_RTSP_STREAM_UNLOCK (rtspsrc);
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       break;