From c859a1719ccfaa094d34d251f493f635b85fd1a9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 1 Jan 2013 10:23:59 +0100 Subject: [PATCH] basesink: Check if buffers are too late before calling prepare/prepare_list https://bugzilla.gnome.org/show_bug.cgi?id=690936 --- libs/gst/base/gstbasesink.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 31679db..7ec9655 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -3259,17 +3259,36 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad, goto out_of_segment; } - if (!is_list) { - if (bclass->prepare) { - ret = bclass->prepare (basesink, GST_BUFFER_CAST (obj)); - if (G_UNLIKELY (ret != GST_FLOW_OK)) - goto prepare_failed; - } - } else { - if (bclass->prepare_list) { - ret = bclass->prepare_list (basesink, GST_BUFFER_LIST_CAST (obj)); - if (G_UNLIKELY (ret != GST_FLOW_OK)) - goto prepare_failed; + if (bclass->prepare || bclass->prepare_list) { + gboolean late = FALSE; + gboolean do_sync = TRUE, stepped = FALSE, step_end, syncable = TRUE; + GstClockTime sstart, sstop, rstart, rstop; + GstStepInfo *current; + + current = &priv->current_step; + syncable = + gst_base_sink_get_sync_times (basesink, obj, &sstart, &sstop, &rstart, + &rstop, &do_sync, &stepped, current, &step_end); + + if (!stepped && syncable && do_sync) + late = + gst_base_sink_is_too_late (basesink, obj, rstart, rstop, + GST_CLOCK_EARLY, 0); + if (late) + goto dropped; + + if (!is_list) { + if (bclass->prepare) { + ret = bclass->prepare (basesink, GST_BUFFER_CAST (obj)); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto prepare_failed; + } + } else { + if (bclass->prepare_list) { + ret = bclass->prepare_list (basesink, GST_BUFFER_LIST_CAST (obj)); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto prepare_failed; + } } } -- 2.7.4