diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2006-02-02 16:12:35 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2006-02-02 16:12:35 +0000 |
commit | d5c530e34f4339b00cfaf8eabd1c56ab79de7924 (patch) | |
tree | c76eb46d9718a65305f08084046646848d8c06b5 | |
parent | e2e2bda0d3824059f986d9d6139ea0ed84505a7e (diff) | |
download | gstreamer-d5c530e34f4339b00cfaf8eabd1c56ab79de7924.tar.gz |
libs/gst/base/gstbasesink.c: Only keep track of prerollable items when we are prerolling.
Original commit message from CVS:
* libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync),
(gst_base_sink_render_object),
(gst_base_sink_queue_object_unlocked):
Only keep track of prerollable items when we are
prerolling.
Before rendering after preroll, always check if we
have queued items.
Added some more debugging.
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | libs/gst/base/gstbasesink.c | 51 |
2 files changed, 42 insertions, 20 deletions
@@ -1,5 +1,16 @@ 2006-02-02 Wim Taymans <wim@fluendo.com> + * libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync), + (gst_base_sink_render_object), + (gst_base_sink_queue_object_unlocked): + Only keep track of prerollable items when we are + prerolling. + Before rendering after preroll, always check if we + have queued items. + Added some more debugging. + +2006-02-02 Wim Taymans <wim@fluendo.com> + * gst/gstelement.c: (gst_element_continue_state), (gst_element_set_state_func), (gst_element_change_state): Fixed #326576, been running this for quite some time with diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 263f228e84..bbfa4e8caf 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -765,6 +765,8 @@ again: * any clock sync in PAUSED because there is no clock. */ while (G_UNLIKELY (basesink->need_preroll)) { + GST_DEBUG_OBJECT (basesink, "prerolling object %p", obj); + if (G_LIKELY (basesink->playing_async)) { basesink->playing_async = FALSE; /* commit state */ @@ -853,15 +855,20 @@ gst_base_sink_render_object (GstBaseSink * basesink, GstPad * pad, } else { GstEvent *event = GST_EVENT_CAST (obj); gboolean ok = TRUE; + GstEventType type; bclass = GST_BASE_SINK_GET_CLASS (basesink); - GST_DEBUG_OBJECT (basesink, "rendering event %p", obj); + type = GST_EVENT_TYPE (event); + + GST_DEBUG_OBJECT (basesink, "rendering event %p, type %s", obj, + gst_event_type_get_name (type)); + if (bclass->event) ok = bclass->event (basesink, event); if (G_LIKELY (ok)) { - switch (GST_EVENT_TYPE (event)) { + switch (type) { case GST_EVENT_EOS: /* the EOS event is completely handled so we mark * ourselves as being in the EOS state. eos is also @@ -968,40 +975,44 @@ gst_base_sink_queue_object_unlocked (GstBaseSink * basesink, GstPad * pad, { GstFlowReturn ret = GST_FLOW_OK; gint length; - - if (G_LIKELY (prerollable)) - basesink->preroll_queued++; - - GST_DEBUG_OBJECT (basesink, "now %d prerolled items", - basesink->preroll_queued); + GQueue *q; if (G_UNLIKELY (basesink->need_preroll)) { + if (G_LIKELY (prerollable)) + basesink->preroll_queued++; + length = basesink->preroll_queued; + GST_DEBUG_OBJECT (basesink, "now %d prerolled items", length); + + /* first prerollable item needs to finish the preroll */ if (length == 1) { ret = gst_base_sink_preroll_object (basesink, pad, obj); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto preroll_failed; } - /* need to recheck, commmit state during preroll could have made us - * not need more preroll. */ + /* need to recheck if we need preroll, commmit state during preroll + * could have made us not need more preroll. */ if (G_UNLIKELY (basesink->need_preroll)) { - GQueue *q; - /* see if we can render now. */ if (G_UNLIKELY (length <= basesink->preroll_queue_max_len)) goto more_preroll; - - /* we can start rendering (or blocking) */ - GST_DEBUG_OBJECT (basesink, "emptying queue"); - q = basesink->preroll_queue; - while (G_UNLIKELY (!g_queue_is_empty (q))) { - /* FIXME, do something with the return value? */ - ret = gst_base_sink_render_object (basesink, pad, g_queue_pop_head (q)); - } } } + /* we can start rendering (or blocking) the queued object + * if any. */ + q = basesink->preroll_queue; + while (G_UNLIKELY (!g_queue_is_empty (q))) { + GstMiniObject *o; + + o = g_queue_pop_head (q); + GST_DEBUG_OBJECT (basesink, "rendering queued object %p", o); + + /* FIXME, do something with the return value? */ + ret = gst_base_sink_render_object (basesink, pad, o); + } + /* now render the object */ ret = gst_base_sink_render_object (basesink, pad, obj); basesink->preroll_queued = 0; |