From 0c615e0a7d176c53981b3526528c7a61169b5cf1 Mon Sep 17 00:00:00 2001 From: Yannick Gicquel Date: Thu, 10 Nov 2016 14:55:11 +0100 Subject: meta-agl-bsp: backport: gstreamer1.0 v1.4.5 recipes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a backport from Jethro as meta-rcar-gen3 append on following: - gstreamer1.0-libav_1.4.5 - gstreamer1.0-omx_1.2.0 - gstreamer1.0-plugins-bad_1.4.5 - gstreamer1.0-plugins-good_1.4.5 v2 (jsmoeller): Move into meta-rcar-gen3 subfolder as it only affects that layer. Change-Id: Iefc9a2c10e76c172f1cb1f8d3babf3544828310e Signed-off-by: Yannick Gicquel Signed-off-by: Jan-Simon Möller --- .../0001-Fix-crash-with-gst-inspect.patch | 28 ++++ ...gstinfo-Shorten-__FILE__-on-all-platforms.patch | 55 +++++++ ...x-QoS-lateness-checking-if-subclass-imple.patch | 70 +++++++++ ...ink-Shouldn-t-drop-buffer-when-sync-false.patch | 30 ++++ ...cky-events-haven-t-send-out-when-ac-1-4-1.patch | 167 +++++++++++++++++++++ 5 files changed, 350 insertions(+) create mode 100644 meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-Fix-crash-with-gst-inspect.patch create mode 100644 meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-gstinfo-Shorten-__FILE__-on-all-platforms.patch create mode 100644 meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch create mode 100755 meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch create mode 100755 meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/inputselector-sticky-events-haven-t-send-out-when-ac-1-4-1.patch (limited to 'meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0') diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-Fix-crash-with-gst-inspect.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-Fix-crash-with-gst-inspect.patch new file mode 100644 index 000000000..94f5cc56e --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-Fix-crash-with-gst-inspect.patch @@ -0,0 +1,28 @@ +From 6b26f3dbf9bf577d71534ab7410de66d06e46ba2 Mon Sep 17 00:00:00 2001 +From: Carlos Rafael Giani +Date: Sat, 6 Apr 2013 23:52:11 +0200 +Subject: [PATCH] Fix crash with gst-inspect Chris Lord + +Upstream-Status: Pending + +Signed-off-by: Carlos Rafael Giani +--- + tools/gst-inspect.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c +index 23b7c44..b79b02e 100644 +--- a/tools/gst-inspect.c ++++ b/tools/gst-inspect.c +@@ -1556,7 +1556,7 @@ main (int argc, char *argv[]) + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { +- g_printerr ("Error initializing: %s\n", err->message); ++ g_printerr ("Error initializing: %s\n", err ? err->message : "(null)"); + return -1; + } + g_option_context_free (ctx); +-- +1.8.2 + diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-gstinfo-Shorten-__FILE__-on-all-platforms.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-gstinfo-Shorten-__FILE__-on-all-platforms.patch new file mode 100644 index 000000000..8213c4b8b --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0001-gstinfo-Shorten-__FILE__-on-all-platforms.patch @@ -0,0 +1,55 @@ +From 81fecd367b016e5ac4fb0c04b84da5c474f30da6 Mon Sep 17 00:00:00 2001 +From: Peter Urbanec +Date: Fri, 27 Feb 2015 01:16:58 +1100 +Subject: [PATCH 1/1] gstinfo: Shorten __FILE__ on all platforms. + +This is useful not only for MSVC, but also with gcc/Linux when doing +cross-compilation builds and out-of-tree builds. + +Upstream-Status: Submitted [https://bugzilla.gnome.org/show_bug.cgi?id=745213] + +Signed-off-by: Peter Urbanec +--- + gst/gstinfo.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +diff --git a/gst/gstinfo.c b/gst/gstinfo.c +index b2a3005..8b61d09 100644 +--- a/gst/gstinfo.c ++++ b/gst/gstinfo.c +@@ -444,7 +444,6 @@ gst_debug_log (GstDebugCategory * category, GstDebugLevel level, + va_end (var_args); + } + +-#ifdef G_OS_WIN32 + /* based on g_basename(), which we can't use because it was deprecated */ + static inline const gchar * + gst_path_basename (const gchar * file_name) +@@ -467,7 +466,6 @@ gst_path_basename (const gchar * file_name) + + return file_name; + } +-#endif + + /** + * gst_debug_log_valist: +@@ -497,12 +495,11 @@ gst_debug_log_valist (GstDebugCategory * category, GstDebugLevel level, + g_return_if_fail (function != NULL); + g_return_if_fail (format != NULL); + +- /* The predefined macro __FILE__ is always the exact path given to the +- * compiler with MSVC, which may or may not be the basename. We work +- * around it at runtime to improve the readability. */ +-#ifdef G_OS_WIN32 ++ /* The predefined macro __FILE__ can be an absolute path in some build ++ * environments, such as MSVC or out-of-tree cross-compiles. This may ++ * be significantly longer than the filename. We work around it at ++ * runtime to improve the readability. */ + file = gst_path_basename (file); +-#endif + + message.message = NULL; + message.format = format; +-- +2.3.0 + diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch new file mode 100644 index 000000000..1505cbefc --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/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 +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 + diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch new file mode 100755 index 000000000..d682ee60c --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch @@ -0,0 +1,30 @@ +From 73df2b5c0aea58015788f5a94a3ec65296a688d3 Mon Sep 17 00:00:00 2001 +From: Song Bing +Date: Thu, 2 Jul 2015 14:32:21 +0800 +Subject: [PATCH] basesink: Shouldn't drop buffer when sync=false + +Shouldn't drop buffer when sync=false + +Upstream-Status: Accepted + +https://bugzilla.gnome.org/show_bug.cgi?id=751819 +--- + libs/gst/base/gstbasesink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c +index d44e8fc..cd759ac 100644 +--- a/libs/gst/base/gstbasesink.c ++++ b/libs/gst/base/gstbasesink.c +@@ -3423,7 +3423,7 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad, + if (G_UNLIKELY (stepped)) + goto dropped; + +- if (syncable && do_sync) { ++ if (syncable && do_sync && gst_base_sink_get_sync (basesink)) { + GstClock *clock; + + GST_OBJECT_LOCK (basesink); +-- +1.7.9.5 + diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/inputselector-sticky-events-haven-t-send-out-when-ac-1-4-1.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/inputselector-sticky-events-haven-t-send-out-when-ac-1-4-1.patch new file mode 100755 index 000000000..f50ce6ff2 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0/inputselector-sticky-events-haven-t-send-out-when-ac-1-4-1.patch @@ -0,0 +1,167 @@ +From 83bed90c306ed3185d48febf6441177d638f7341 Mon Sep 17 00:00:00 2001 +From: Song Bing +Date: Wed, 24 Dec 2014 10:13:51 +0800 +Subject: [PATCH] inputselector: sticky events haven't send out when active + track reach EOS + +EOS event hasn't been send to down-element. The resolution is block EOS event +of inactive pad, send the event after the pad actived. + +https://bugzilla.gnome.org/show_bug.cgi?id=740949 + +Upstream-Status: Backport [1.5.1] + +Signed-off-by: Song Bing +--- + plugins/elements/gstinputselector.c | 58 ++++++++++++++++++++++++++--------- + plugins/elements/gstinputselector.h | 1 + + 2 files changed, 45 insertions(+), 14 deletions(-) + +diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c +index fb50802..4461f7c 100644 +--- a/plugins/elements/gstinputselector.c ++++ b/plugins/elements/gstinputselector.c +@@ -440,6 +440,17 @@ gst_selector_pad_iterate_linked_pads (GstPad * pad, GstObject * parent) + } + + static gboolean ++gst_input_selector_eos_wait (GstInputSelector * self, GstSelectorPad * pad) ++{ ++ while (!self->eos && !self->flushing && !pad->flushing) { ++ /* we can be unlocked here when we are shutting down (flushing) or when we ++ * get unblocked */ ++ GST_INPUT_SELECTOR_WAIT (self); ++ } ++ return self->flushing; ++} ++ ++static gboolean + gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event) + { + gboolean res = TRUE; +@@ -486,6 +497,7 @@ gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event) + case GST_EVENT_FLUSH_START: + /* Unblock the pad if it's waiting */ + selpad->flushing = TRUE; ++ sel->eos = FALSE; + GST_INPUT_SELECTOR_BROADCAST (sel); + break; + case GST_EVENT_FLUSH_STOP: +@@ -523,21 +535,12 @@ gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event) + case GST_EVENT_EOS: + selpad->eos = TRUE; + +- if (forward) { +- selpad->eos_sent = TRUE; +- } else { +- GstSelectorPad *active_selpad; +- +- /* If the active sinkpad is in EOS state but EOS +- * was not sent downstream this means that the pad +- * got EOS before it was set as active pad and that +- * the previously active pad got EOS after it was +- * active +- */ +- active_selpad = GST_SELECTOR_PAD (active_sinkpad); +- forward = (active_selpad->eos && !active_selpad->eos_sent); +- active_selpad->eos_sent = TRUE; ++ if (!forward) { ++ /* blocked until active the sind pad or flush */ ++ gst_input_selector_eos_wait (sel, selpad); ++ forward = TRUE; + } ++ selpad->eos_sent = TRUE; + GST_DEBUG_OBJECT (pad, "received EOS"); + break; + case GST_EVENT_GAP:{ +@@ -676,6 +679,12 @@ gst_input_selector_wait_running_time (GstInputSelector * sel, + gst_input_selector_activate_sinkpad (sel, GST_PAD_CAST (selpad)); + active_selpad = GST_SELECTOR_PAD_CAST (active_sinkpad); + ++ if (sel->eos) { ++ GST_DEBUG_OBJECT (sel, "Not waiting because inputselector reach EOS."); ++ GST_INPUT_SELECTOR_UNLOCK (sel); ++ return FALSE; ++ } ++ + if (seg->format != GST_FORMAT_TIME) { + GST_DEBUG_OBJECT (selpad, + "Not waiting because we don't have a TIME segment"); +@@ -971,6 +980,12 @@ gst_selector_pad_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + GST_INPUT_SELECTOR_LOCK (sel); ++ if (sel->eos) { ++ GST_DEBUG_OBJECT (pad, "inputselector eos."); ++ GST_INPUT_SELECTOR_UNLOCK (sel); ++ goto eos; ++ } ++ + /* wait or check for flushing */ + if (gst_input_selector_wait (sel, selpad)) { + GST_INPUT_SELECTOR_UNLOCK (sel); +@@ -1151,6 +1166,13 @@ flushing: + res = GST_FLOW_FLUSHING; + goto done; + } ++eos: ++ { ++ GST_DEBUG_OBJECT (pad, "We are eos, discard buffer %p", buf); ++ gst_buffer_unref (buf); ++ res = GST_FLOW_EOS; ++ goto done; ++ } + } + + static void gst_input_selector_dispose (GObject * object); +@@ -1309,6 +1331,7 @@ gst_input_selector_init (GstInputSelector * sel) + g_mutex_init (&sel->lock); + g_cond_init (&sel->cond); + sel->blocked = FALSE; ++ sel->eos = FALSE; + + /* lets give a change for downstream to do something on + * active-pad change before we start pushing new buffers */ +@@ -1377,6 +1400,11 @@ gst_input_selector_set_active_pad (GstInputSelector * self, GstPad * pad) + GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT, + self->active_sinkpad); + ++ if (old != new && new->eos && !new->eos_sent) { ++ self->eos = TRUE; ++ GST_INPUT_SELECTOR_BROADCAST (self); ++ } ++ + return TRUE; + } + +@@ -1771,6 +1799,7 @@ gst_input_selector_change_state (GstElement * element, + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_INPUT_SELECTOR_LOCK (self); ++ self->eos = FALSE; + self->blocked = FALSE; + self->flushing = FALSE; + GST_INPUT_SELECTOR_UNLOCK (self); +@@ -1779,6 +1808,7 @@ gst_input_selector_change_state (GstElement * element, + /* first unlock before we call the parent state change function, which + * tries to acquire the stream lock when going to ready. */ + GST_INPUT_SELECTOR_LOCK (self); ++ self->eos = TRUE; + self->blocked = FALSE; + self->flushing = TRUE; + GST_INPUT_SELECTOR_BROADCAST (self); +diff --git a/plugins/elements/gstinputselector.h b/plugins/elements/gstinputselector.h +index 96c680f..9bf924f 100644 +--- a/plugins/elements/gstinputselector.h ++++ b/plugins/elements/gstinputselector.h +@@ -77,6 +77,7 @@ struct _GstInputSelector { + GMutex lock; + GCond cond; + gboolean blocked; ++ gboolean eos; + gboolean flushing; + }; + +-- +1.7.9.5 + -- cgit 1.2.3-korg