mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-27 11:32:51 +00:00
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:
parent
e2e2bda0d3
commit
d5c530e34f
2 changed files with 42 additions and 20 deletions
11
ChangeLog
11
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),
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue