meta-agl-bsp: backport: gstreamer1.0 v1.4.5 recipes
[AGL/meta-agl.git] / meta-agl-bsp / meta-rcar-gen3 / recipes-multimedia / gstreamer / gstreamer1.0 / 0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch
1 From 6914566ed6a89c96973a578aa5ecd01ee68cdcfd Mon Sep 17 00:00:00 2001
2 From: Jian <Jian.Li@freescale.com>
3 Date: Thu, 14 May 2015 15:49:43 +0800
4 Subject: [PATCH] basesink: Fix QoS/lateness checking if subclass implements
5  prepare/prepare_list vfuncs
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 In basesink functions gst_base_sink_chain_unlocked(), below code is used to
11 checking if buffer is late before doing prepare call to save some effort:
12     if (syncable && do_sync)
13       late =
14           gst_base_sink_is_too_late (basesink, obj, rstart, rstop,
15           GST_CLOCK_EARLY, 0, FALSE);
16
17     if (G_UNLIKELY (late))
18       goto dropped;
19
20 But this code has problem, it should calculate jitter based on current media
21 clock, rather than just passing 0. I found it will drop all the frames when
22 rewind in slow speed, such as -2X.
23
24 https://bugzilla.gnome.org/show_bug.cgi?id=749258
25
26 Upstream-Status: Backport [1.5.1]
27 ---
28  libs/gst/base/gstbasesink.c |   26 ++++++++++++++++++++++----
29  1 file changed, 22 insertions(+), 4 deletions(-)
30
31 diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c
32 index a505695..5fb2d6a 100644
33 --- a/libs/gst/base/gstbasesink.c
34 +++ b/libs/gst/base/gstbasesink.c
35 @@ -3369,10 +3369,28 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
36      if (G_UNLIKELY (stepped))
37        goto dropped;
38  
39 -    if (syncable && do_sync)
40 -      late =
41 -          gst_base_sink_is_too_late (basesink, obj, rstart, rstop,
42 -          GST_CLOCK_EARLY, 0, FALSE);
43 +    if (syncable && do_sync) {
44 +      GstClock *clock;
45 +
46 +      GST_OBJECT_LOCK (basesink);
47 +      clock = GST_ELEMENT_CLOCK (basesink);
48 +      if (clock && GST_STATE (basesink) == GST_STATE_PLAYING) {
49 +        GstClockTime base_time;
50 +        GstClockTime stime;
51 +        GstClockTime now;
52 +
53 +        base_time = GST_ELEMENT_CAST (basesink)->base_time;
54 +        stime = base_time + gst_base_sink_adjust_time (basesink, rstart);
55 +        now = gst_clock_get_time (clock);
56 +        GST_OBJECT_UNLOCK (basesink);
57 +
58 +        late =
59 +            gst_base_sink_is_too_late (basesink, obj, rstart, rstop,
60 +            GST_CLOCK_EARLY, GST_CLOCK_DIFF (stime, now), FALSE);
61 +      } else {
62 +        GST_OBJECT_UNLOCK (basesink);
63 +      }
64 +    }
65  
66      if (G_UNLIKELY (late))
67        goto dropped;
68 -- 
69 1.7.9.5
70