From 6914566ed6a89c96973a578aa5ecd01ee68cdcfd Mon Sep 17 00:00:00 2001 From: Jian Date: Thu, 14 May 2015 15:49:43 +0800 Subject: [PATCH] basesink: Fix QoS/lateness checking if subclass implements prepare/prepare_list vfuncs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In basesink functions gst_base_sink_chain_unlocked(), below code is used to checking if buffer is late before doing prepare call to save some effort: if (syncable && do_sync) late = gst_base_sink_is_too_late (basesink, obj, rstart, rstop, GST_CLOCK_EARLY, 0, FALSE); if (G_UNLIKELY (late)) goto dropped; But this code has problem, it should calculate jitter based on current media clock, rather than just passing 0. I found it will drop all the frames when rewind in slow speed, such as -2X. https://bugzilla.gnome.org/show_bug.cgi?id=749258 Upstream-Status: Backport [1.5.1] --- libs/gst/base/gstbasesink.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index a505695..5fb2d6a 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -3369,10 +3369,28 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad, if (G_UNLIKELY (stepped)) goto dropped; - if (syncable && do_sync) - late = - gst_base_sink_is_too_late (basesink, obj, rstart, rstop, - GST_CLOCK_EARLY, 0, FALSE); + if (syncable && do_sync) { + GstClock *clock; + + GST_OBJECT_LOCK (basesink); + clock = GST_ELEMENT_CLOCK (basesink); + if (clock && GST_STATE (basesink) == GST_STATE_PLAYING) { + GstClockTime base_time; + GstClockTime stime; + GstClockTime now; + + base_time = GST_ELEMENT_CAST (basesink)->base_time; + stime = base_time + gst_base_sink_adjust_time (basesink, rstart); + now = gst_clock_get_time (clock); + GST_OBJECT_UNLOCK (basesink); + + late = + gst_base_sink_is_too_late (basesink, obj, rstart, rstop, + GST_CLOCK_EARLY, GST_CLOCK_DIFF (stime, now), FALSE); + } else { + GST_OBJECT_UNLOCK (basesink); + } + } if (G_UNLIKELY (late)) goto dropped; -- 1.7.9.5