From: <wt...@fr...> - 2005-10-21 17:53:50
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Fri Oct 21 2005 10:53:43 PDT Log message: * gst/base/gstbasesink.c: (gst_base_sink_commit_state), (gst_base_sink_get_position), (gst_base_sink_query), (gst_base_sink_change_state): Simply set the right flag when going to playing, that's all we need to do instead of calling a function inside the object lock (that could take the lock as well and deadlock) Modified files: . : ChangeLog gst/base : gstbasesink.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.1782&r2=1.1783 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/base/gstbasesink.c.diff?r1=1.79&r2=1.80 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.1782 retrieving revision 1.1783 diff -u -d -r1.1782 -r1.1783 --- ChangeLog 21 Oct 2005 16:18:54 -0000 1.1782 +++ ChangeLog 21 Oct 2005 17:53:30 -0000 1.1783 @@ -1,5 +1,14 @@ 2005-10-21 Wim Taymans <wi...@fl...> + * gst/base/gstbasesink.c: (gst_base_sink_commit_state), + (gst_base_sink_get_position), (gst_base_sink_query), + (gst_base_sink_change_state): + Simply set the right flag when going to playing, that's all + we need to do instead of calling a function inside the object + lock (that could take the lock as well and deadlock) + +2005-10-21 Wim Taymans <wi...@fl...> * gst/base/gstbasesrc.c: (gst_base_src_do_seek), (gst_base_src_loop): Don't warn, the peer element knows what to do best when Index: gstbasesink.c RCS file: /cvs/gstreamer/gstreamer/gst/base/gstbasesink.c,v retrieving revision 1.79 retrieving revision 1.80 diff -u -d -r1.79 -r1.80 --- gstbasesink.c 20 Oct 2005 17:18:11 -0000 1.79 +++ gstbasesink.c 21 Oct 2005 17:53:31 -0000 1.80 @@ -98,8 +98,6 @@ return base_sink_type; } -static GstStateChangeReturn do_playing (GstBaseSink * sink); - static void gst_base_sink_set_clock (GstElement * element, GstClock * clock); static void gst_base_sink_set_property (GObject * object, guint prop_id, @@ -443,6 +441,7 @@ GST_PREROLL_SIGNAL (pad); +/* with PREROLL_LOCK */ static gboolean gst_base_sink_commit_state (GstBaseSink * basesink) { @@ -460,7 +459,7 @@ switch (pending) { case GST_STATE_PLAYING: - do_playing (basesink); + basesink->need_preroll = FALSE; post_playing = TRUE; break; case GST_STATE_PAUSED: @@ -1495,50 +1494,6 @@ return res; -/* with PREROLL_LOCK */ -static GstStateChangeReturn -do_playing (GstBaseSink * basesink) -{ - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - /* no preroll needed */ - basesink->need_preroll = FALSE; - /* if we have EOS, we should empty the queue now as there will - * be no more data received in the chain function. - * FIXME, this could block the state change function too long when - * we are pushing and syncing the buffers, better start a new - * thread to do this. */ - if (basesink->eos) { - gboolean do_eos = !basesink->eos_queued; - gst_base_sink_preroll_queue_empty (basesink, basesink->sinkpad); - /* need to post EOS message here if it was not in the preroll queue we - * just emptied. */ - if (do_eos) { - GST_DEBUG_OBJECT (basesink, "Now posting EOS"); - gst_element_post_message (GST_ELEMENT (basesink), - gst_message_new_eos (GST_OBJECT (basesink))); - } - } else if (!basesink->have_preroll) { - /* don't need preroll, but do queue a commit_state */ - basesink->need_preroll = TRUE; - GST_DEBUG_OBJECT (basesink, - "PAUSED to PLAYING, !eos, !have_preroll, need preroll to FALSE"); - ret = GST_STATE_CHANGE_ASYNC; - /* we know it's not waiting, no need to signal */ - } else { - /* don't need the preroll anymore */ - "PAUSED to PLAYING, !eos, have_preroll, need preroll to FALSE"); - /* now let it play */ - GST_PREROLL_SIGNAL (basesink->sinkpad); - } - return ret; -} static GstStateChangeReturn gst_base_sink_change_state (GstElement * element, GstStateChange transition) @@ -1573,7 +1528,39 @@ break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: GST_PREROLL_LOCK (basesink->sinkpad); - ret = do_playing (basesink); + /* no preroll needed */ + basesink->need_preroll = FALSE; + /* if we have EOS, we should empty the queue now as there will + * be no more data received in the chain function. + * FIXME, this could block the state change function too long when + * we are pushing and syncing the buffers, better start a new + * thread to do this. */ + if (basesink->eos) { + gboolean do_eos = !basesink->eos_queued; + gst_base_sink_preroll_queue_empty (basesink, basesink->sinkpad); + /* need to post EOS message here if it was not in the preroll queue we + * just emptied. */ + if (do_eos) { + GST_DEBUG_OBJECT (basesink, "Now posting EOS"); + gst_element_post_message (GST_ELEMENT (basesink), + gst_message_new_eos (GST_OBJECT (basesink))); + } + } else if (!basesink->have_preroll) { + /* queue a commit_state */ + basesink->need_preroll = TRUE; + GST_DEBUG_OBJECT (basesink, + "PAUSED to PLAYING, !eos, !have_preroll, need preroll to FALSE"); + ret = GST_STATE_CHANGE_ASYNC; + /* we know it's not waiting, no need to signal */ + } else { + "PAUSED to PLAYING, !eos, have_preroll, need preroll to FALSE"); + /* now let it play */ + GST_PREROLL_SIGNAL (basesink->sinkpad); + } GST_PREROLL_UNLOCK (basesink->sinkpad); default: |