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.
This commit is contained in:
Wim Taymans 2006-02-02 16:12:35 +00:00
parent e2e2bda0d3
commit d5c530e34f
2 changed files with 42 additions and 20 deletions

View file

@ -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),

View file

@ -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;