mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 20:59:44 +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>
|
2006-02-02 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/gstelement.c: (gst_element_continue_state),
|
* gst/gstelement.c: (gst_element_continue_state),
|
||||||
|
|
|
@ -765,6 +765,8 @@ again:
|
||||||
* any clock sync in PAUSED because there is no clock.
|
* any clock sync in PAUSED because there is no clock.
|
||||||
*/
|
*/
|
||||||
while (G_UNLIKELY (basesink->need_preroll)) {
|
while (G_UNLIKELY (basesink->need_preroll)) {
|
||||||
|
GST_DEBUG_OBJECT (basesink, "prerolling object %p", obj);
|
||||||
|
|
||||||
if (G_LIKELY (basesink->playing_async)) {
|
if (G_LIKELY (basesink->playing_async)) {
|
||||||
basesink->playing_async = FALSE;
|
basesink->playing_async = FALSE;
|
||||||
/* commit state */
|
/* commit state */
|
||||||
|
@ -853,15 +855,20 @@ gst_base_sink_render_object (GstBaseSink * basesink, GstPad * pad,
|
||||||
} else {
|
} else {
|
||||||
GstEvent *event = GST_EVENT_CAST (obj);
|
GstEvent *event = GST_EVENT_CAST (obj);
|
||||||
gboolean ok = TRUE;
|
gboolean ok = TRUE;
|
||||||
|
GstEventType type;
|
||||||
|
|
||||||
bclass = GST_BASE_SINK_GET_CLASS (basesink);
|
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)
|
if (bclass->event)
|
||||||
ok = bclass->event (basesink, event);
|
ok = bclass->event (basesink, event);
|
||||||
|
|
||||||
if (G_LIKELY (ok)) {
|
if (G_LIKELY (ok)) {
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (type) {
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
/* the EOS event is completely handled so we mark
|
/* the EOS event is completely handled so we mark
|
||||||
* ourselves as being in the EOS state. eos is also
|
* 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;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
gint length;
|
gint length;
|
||||||
|
GQueue *q;
|
||||||
if (G_LIKELY (prerollable))
|
|
||||||
basesink->preroll_queued++;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (basesink, "now %d prerolled items",
|
|
||||||
basesink->preroll_queued);
|
|
||||||
|
|
||||||
if (G_UNLIKELY (basesink->need_preroll)) {
|
if (G_UNLIKELY (basesink->need_preroll)) {
|
||||||
|
if (G_LIKELY (prerollable))
|
||||||
|
basesink->preroll_queued++;
|
||||||
|
|
||||||
length = 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) {
|
if (length == 1) {
|
||||||
ret = gst_base_sink_preroll_object (basesink, pad, obj);
|
ret = gst_base_sink_preroll_object (basesink, pad, obj);
|
||||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||||
goto preroll_failed;
|
goto preroll_failed;
|
||||||
}
|
}
|
||||||
/* need to recheck, commmit state during preroll could have made us
|
/* need to recheck if we need preroll, commmit state during preroll
|
||||||
* not need more preroll. */
|
* could have made us not need more preroll. */
|
||||||
if (G_UNLIKELY (basesink->need_preroll)) {
|
if (G_UNLIKELY (basesink->need_preroll)) {
|
||||||
GQueue *q;
|
|
||||||
|
|
||||||
/* see if we can render now. */
|
/* see if we can render now. */
|
||||||
if (G_UNLIKELY (length <= basesink->preroll_queue_max_len))
|
if (G_UNLIKELY (length <= basesink->preroll_queue_max_len))
|
||||||
goto more_preroll;
|
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 */
|
/* now render the object */
|
||||||
ret = gst_base_sink_render_object (basesink, pad, obj);
|
ret = gst_base_sink_render_object (basesink, pad, obj);
|
||||||
basesink->preroll_queued = 0;
|
basesink->preroll_queued = 0;
|
||||||
|
|
Loading…
Reference in a new issue