From: Wim Taymans Date: Thu, 20 Jun 2013 12:43:47 +0000 (+0200) Subject: rtspsrc: fix race in state change to paused X-Git-Tag: 1.19.3~509^2~5688 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b96d931bf4ce5c3c8c5be4fa76f5c75bca85d0c4;p=platform%2Fupstream%2Fgstreamer.git 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 --- diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index c327cb8..d751d8d 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;