From 0ba29dc4969628e0272b229fbade6329dc64b95dcad97e195d1e8305c3f96884 Mon Sep 17 00:00:00 2001 From: Antonio Larrosa Date: Mon, 28 Mar 2022 11:27:37 +0000 Subject: [PATCH] Accepting request 965353 from home:iznogood - Add 5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch: playsink: Complete reconfiguration on pad release. - Use ldconfig_scriptlets macro for post(un) handling. OBS-URL: https://build.opensuse.org/request/show/965353 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/gstreamer-plugins-base?expand=0&rev=179 --- ...4a11f90e3d70b24bf0c535ab0480fad9e701.patch | 177 ++++++++++++++++++ gstreamer-plugins-base.changes | 7 + gstreamer-plugins-base.spec | 45 ++--- 3 files changed, 202 insertions(+), 27 deletions(-) create mode 100644 5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch diff --git a/5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch b/5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch new file mode 100644 index 0000000..38ff135 --- /dev/null +++ b/5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch @@ -0,0 +1,177 @@ +From 5a074a11f90e3d70b24bf0c535ab0480fad9e701 Mon Sep 17 00:00:00 2001 +From: Jan Schmidt +Date: Fri, 6 Aug 2021 19:27:02 +1000 +Subject: [PATCH] playsink: Complete reconfiguration on pad release. + +Requesting a new pad can start a reconfiguration cycle, where +playsink will block all input pads and wait for data on them +before doing internal reconfiguration. If a pad is released, +that reconfiguration might never trigger because it's now waiting +for a pad that doesn't exist any more. + +In that case, complete the reconfiguration on pad release. + +Part-of: +--- + .../gst/playback/gstplaysink.c | 89 ++++++++++++++----- + 1 file changed, 66 insertions(+), 23 deletions(-) + +diff --git a/subprojects/gst-plugins-base/gst/playback/gstplaysink.c b/subprojects/gst-plugins-base/gst/playback/gstplaysink.c +index 095a0bbcf31..ebef70d977e 100644 +--- a/subprojects/gst-plugins-base/gst/playback/gstplaysink.c ++++ b/subprojects/gst-plugins-base/gst/playback/gstplaysink.c +@@ -194,6 +194,7 @@ struct _GstPlaySink + + gboolean async_pending; + gboolean need_async_start; ++ gboolean reconfigure_pending; + + GstPlayFlags flags; + +@@ -412,6 +413,8 @@ static void gst_play_sink_navigation_init (gpointer g_iface, + static void gst_play_sink_colorbalance_init (gpointer g_iface, + gpointer g_iface_data); + ++static gboolean is_raw_pad (GstPad * pad); ++ + static void + _do_init_type (GType type) + { +@@ -3231,6 +3234,19 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink) + need_text = TRUE; + } + ++ if (playsink->video_pad) { ++ playsink->video_pad_raw = is_raw_pad (playsink->video_pad); ++ GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d", ++ playsink->video_pad_raw); ++ } ++ ++ if (playsink->audio_pad) { ++ playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad); ++ GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d", ++ playsink->audio_pad_raw); ++ } ++ ++ + if (((flags & GST_PLAY_FLAG_VIDEO) + || (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) { + /* we have video and we are requested to show it */ +@@ -3881,6 +3897,9 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink) + update_av_offset (playsink); + update_text_offset (playsink); + do_async_done (playsink); ++ ++ playsink->reconfigure_pending = FALSE; ++ + GST_PLAY_SINK_UNLOCK (playsink); + + return TRUE; +@@ -4333,11 +4352,39 @@ gst_play_sink_reconfigure (GstPlaySink * playsink) + video_set_blocked (playsink, TRUE); + audio_set_blocked (playsink, TRUE); + text_set_blocked (playsink, TRUE); ++ playsink->reconfigure_pending = TRUE; + GST_PLAY_SINK_UNLOCK (playsink); + + return TRUE; + } + ++/* Called with PLAY_SINK_LOCK */ ++static gboolean ++gst_play_sink_ready_to_reconfigure_locked (GstPlaySink * playsink) ++{ ++ /* We reconfigure when for ALL streams: ++ * * there isn't a pad ++ * * OR the pad is blocked ++ * * OR there are no pending blocks on that pad ++ */ ++ if (playsink->reconfigure_pending == FALSE) ++ return FALSE; ++ ++ if (playsink->video_pad && !playsink->video_pad_blocked ++ && PENDING_VIDEO_BLOCK (playsink)) ++ return FALSE; ++ ++ if (playsink->audio_pad && !playsink->audio_pad_blocked ++ && PENDING_AUDIO_BLOCK (playsink)) ++ return FALSE; ++ ++ if (playsink->text_pad && !playsink->text_pad_blocked ++ && PENDING_TEXT_BLOCK (playsink)) ++ return FALSE; ++ ++ return TRUE; ++} ++ + static GstPadProbeReturn + sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info, + gpointer user_data) +@@ -4365,31 +4412,9 @@ sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info, + GST_DEBUG_OBJECT (pad, "Text pad blocked"); + } + +- /* We reconfigure when for ALL streams: +- * * there isn't a pad +- * * OR the pad is blocked +- * * OR there are no pending blocks on that pad +- */ +- +- if ((!playsink->video_pad || playsink->video_pad_blocked +- || !PENDING_VIDEO_BLOCK (playsink)) && (!playsink->audio_pad +- || playsink->audio_pad_blocked || !PENDING_AUDIO_BLOCK (playsink)) +- && (!playsink->text_pad || playsink->text_pad_blocked +- || !PENDING_TEXT_BLOCK (playsink))) { ++ if (gst_play_sink_ready_to_reconfigure_locked (playsink)) { + GST_DEBUG_OBJECT (playsink, "All pads blocked -- reconfiguring"); + +- if (playsink->video_pad) { +- playsink->video_pad_raw = is_raw_pad (playsink->video_pad); +- GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d", +- playsink->video_pad_raw); +- } +- +- if (playsink->audio_pad) { +- playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad); +- GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d", +- playsink->audio_pad_raw); +- } +- + gst_play_sink_do_reconfigure (playsink); + + video_set_blocked (playsink, FALSE); +@@ -4681,6 +4706,7 @@ gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad) + res = &pad; + untarget = FALSE; + } ++ + GST_PLAY_SINK_UNLOCK (playsink); + + if (*res) { +@@ -4694,6 +4720,23 @@ gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad) + gst_element_remove_pad (GST_ELEMENT_CAST (playsink), *res); + *res = NULL; + } ++ ++ GST_PLAY_SINK_LOCK (playsink); ++ ++ /* If we have a pending reconfigure, we might have met the conditions ++ * to reconfigure now */ ++ if (gst_play_sink_ready_to_reconfigure_locked (playsink)) { ++ GST_DEBUG_OBJECT (playsink, ++ "All pads ready after release -- reconfiguring"); ++ ++ gst_play_sink_do_reconfigure (playsink); ++ ++ video_set_blocked (playsink, FALSE); ++ audio_set_blocked (playsink, FALSE); ++ text_set_blocked (playsink, FALSE); ++ } ++ ++ GST_PLAY_SINK_UNLOCK (playsink); + } + + static void +-- +GitLab + diff --git a/gstreamer-plugins-base.changes b/gstreamer-plugins-base.changes index 5d7ae84..350e6fb 100644 --- a/gstreamer-plugins-base.changes +++ b/gstreamer-plugins-base.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Sat Mar 26 17:25:23 UTC 2022 - Bjørn Lie + +- Add 5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch: playsink: + Complete reconfiguration on pad release. +- Use ldconfig_scriptlets macro for post(un) handling. + ------------------------------------------------------------------- Fri Mar 18 07:30:44 UTC 2022 - Antonio Larrosa diff --git a/gstreamer-plugins-base.spec b/gstreamer-plugins-base.spec index 0d679a3..1d24d8a 100644 --- a/gstreamer-plugins-base.spec +++ b/gstreamer-plugins-base.spec @@ -30,10 +30,10 @@ Source0: %{url}/src/%{_name}/%{_name}-%{version}.tar.xz Source1: gstreamer-plugins-base.appdata.xml Source2: baselibs.conf -# PATCH-FIX-OPENSUSE gstreamer-plugins-base-gl-deps.patch dimstar@opensuse.org -- Local workaround for https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/735 -#Patch3: gstreamer-plugins-base-gl-deps.patch Patch4: add_wayland_dep_to_tests.patch Patch5: MR-221-video-anc-add-two-new-CEA-608-caption-formats.patch +# PATCH-FIX-UPSTREAM 5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch -- playsink: Complete reconfiguration on pad release +Patch6: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/commit/5a074a11f90e3d70b24bf0c535ab0480fad9e701.patch BuildRequires: Mesa-libGLESv3-devel BuildRequires: cdparanoia-devel @@ -491,7 +491,10 @@ to compile and link applications that use gstreamer-plugins-base. %lang_package %prep -%autosetup -n %{_name}-%{version} -p1 +%autosetup -n %{_name}-%{version} -N +%patch4 -p1 +%patch5 -p1 +%patch6 -p3 %build export PYTHON=%{_bindir}/python3 @@ -520,30 +523,18 @@ fi find %{buildroot} -type f -name "*.la" -delete -print %find_lang %{_name}-%{gst_branch} -%post -n libgstallocators-1_0-0 -p /sbin/ldconfig -%postun -n libgstallocators-1_0-0 -p /sbin/ldconfig -%post -n libgstapp-1_0-0 -p /sbin/ldconfig -%postun -n libgstapp-1_0-0 -p /sbin/ldconfig -%post -n libgstaudio-1_0-0 -p /sbin/ldconfig -%postun -n libgstaudio-1_0-0 -p /sbin/ldconfig -%post -n libgstfft-1_0-0 -p /sbin/ldconfig -%postun -n libgstfft-1_0-0 -p /sbin/ldconfig -%post -n libgstgl-1_0-0 -p /sbin/ldconfig -%postun -n libgstgl-1_0-0 -p /sbin/ldconfig -%post -n libgstpbutils-1_0-0 -p /sbin/ldconfig -%postun -n libgstpbutils-1_0-0 -p /sbin/ldconfig -%post -n libgstriff-1_0-0 -p /sbin/ldconfig -%postun -n libgstriff-1_0-0 -p /sbin/ldconfig -%post -n libgstrtp-1_0-0 -p /sbin/ldconfig -%postun -n libgstrtp-1_0-0 -p /sbin/ldconfig -%post -n libgstrtsp-1_0-0 -p /sbin/ldconfig -%postun -n libgstrtsp-1_0-0 -p /sbin/ldconfig -%post -n libgstsdp-1_0-0 -p /sbin/ldconfig -%postun -n libgstsdp-1_0-0 -p /sbin/ldconfig -%post -n libgsttag-1_0-0 -p /sbin/ldconfig -%postun -n libgsttag-1_0-0 -p /sbin/ldconfig -%post -n libgstvideo-1_0-0 -p /sbin/ldconfig -%postun -n libgstvideo-1_0-0 -p /sbin/ldconfig +%ldconfig_scriptlets -n libgstallocators-1_0-0 +%ldconfig_scriptlets -n libgstapp-1_0-0 +%ldconfig_scriptlets -n libgstaudio-1_0-0 +%ldconfig_scriptlets -n libgstfft-1_0-0 +%ldconfig_scriptlets -n libgstgl-1_0-0 +%ldconfig_scriptlets -n libgstpbutils-1_0-0 +%ldconfig_scriptlets -n libgstriff-1_0-0 +%ldconfig_scriptlets -n libgstrtp-1_0-0 +%ldconfig_scriptlets -n libgstrtsp-1_0-0 +%ldconfig_scriptlets -n libgstsdp-1_0-0 +%ldconfig_scriptlets -n libgsttag-1_0-0 +%ldconfig_scriptlets -n libgstvideo-1_0-0 %files %license COPYING