diff --git a/ChangeLog b/ChangeLog index d06421dfc3..a01101dfd3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +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), 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;