| From 6914566ed6a89c96973a578aa5ecd01ee68cdcfd Mon Sep 17 00:00:00 2001 |
| From: Jian <Jian.Li@freescale.com> |
| 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 |
| |