diff options
Diffstat (limited to 'common/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch')
-rw-r--r-- | common/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/common/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch b/common/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch new file mode 100644 index 0000000..1505cbe --- /dev/null +++ b/common/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch @@ -0,0 +1,70 @@ +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 + |