From b96d931bf4ce5c3c8c5be4fa76f5c75bca85d0c4 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 20 Jun 2013 14:43:47 +0200 Subject: [PATCH] rtspsrc: fix race in state change to paused 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index c327cb817d..d751d8d8ad 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -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;