diff options
author | Yuqing Zhu <b54851@freescale.com> | 2015-08-21 22:29:54 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-09-12 22:48:31 +0100 |
commit | 59f822d8b5dc7fb8c593eaaf16021521033c0414 (patch) | |
tree | c70a7641a3d7604562c45c507611b048be90eebb /meta/recipes-multimedia/gstreamer/gstreamer1.0 | |
parent | f051f10c0fb95f2fdbe15974f6c8ed38c38b0d2b (diff) | |
download | poky-59f822d8b5dc7fb8c593eaaf16021521033c0414.tar.gz |
gstreamer1.0: Fix QoS/lateness checking if subclass implements prepare/prepare_list vfuncs
In function gst_base_sink_chain_unlocked(), it should calculate jitter based
on current media clock, rather than just passing 0.
Or it will drop all the frames when rewind in slow speed, such as -2X.
(From OE-Core rev: 68591de72e27a985242d6ff19fffb80f69869003)
Signed-off-by: Yuqing Zhu <b54851@freescale.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-multimedia/gstreamer/gstreamer1.0')
-rw-r--r-- | meta/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch new file mode 100644 index 0000000000..b6edda1cf7 --- /dev/null +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch | |||
@@ -0,0 +1,70 @@ | |||
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 | |||