Update to 1.2.1.

Drop patch to fix potential deadlock on startup. Fixed upstream.
This commit is contained in:
Brian Pepple 2013-11-11 09:37:01 -05:00
parent da089c8c34
commit cf6122eef9
2 changed files with 7 additions and 208 deletions

View File

@ -1,203 +0,0 @@
From dd4fe544bcafcf0f00660811d6c5d2b68b69ca25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <slomo@circular-chaos.org>
Date: Wed, 2 Oct 2013 15:02:44 +0200
Subject: [PATCH] playsink: If the visualisation is changing and
reconfiguration is pending, do it all during reconfiguration
Otherwise we will have two pad blocks that want to use the same mutex
and block each other via the streamlock.
https://bugzilla.gnome.org/show_bug.cgi?id=709210
---
gst/playback/gstplaysink.c | 107 ++++++++++++++++++++++++++++++++++++++-------
1 file changed, 91 insertions(+), 16 deletions(-)
diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
index e690c77..7f21c68 100644
--- a/gst/playback/gstplaysink.c
+++ b/gst/playback/gstplaysink.c
@@ -230,6 +230,8 @@ struct _GstPlaySink
GstPad *text_sinkpad_stream_synchronizer;
gulong text_block_id;
+ gulong vis_pad_block_id;
+
guint32 pending_blocked_pads;
/* properties */
@@ -937,6 +939,8 @@ gst_play_sink_vis_blocked (GstPad * tee_pad, GstPadProbeInfo * info,
chain->vissrcpad);
done:
+ playsink->vis_pad_block_id = 0;
+
GST_PLAY_SINK_UNLOCK (playsink);
/* remove the probe and unblock the pad */
@@ -977,8 +981,11 @@ gst_play_sink_set_vis_plugin (GstPlaySink * playsink, GstElement * vis)
* function returns FALSE but the previous pad block will do the right thing
* anyway. */
GST_DEBUG_OBJECT (playsink, "blocking vis pad");
- gst_pad_add_probe (chain->blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
- gst_play_sink_vis_blocked, playsink, NULL);
+ if (!playsink->vis_pad_block_id && !playsink->audio_block_id
+ && !playsink->video_block_id && !playsink->text_block_id)
+ playsink->vis_pad_block_id =
+ gst_pad_add_probe (chain->blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ gst_play_sink_vis_blocked, playsink, NULL);
done:
GST_PLAY_SINK_UNLOCK (playsink);
@@ -3339,21 +3346,54 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink)
if (playsink->vischain) {
GST_DEBUG_OBJECT (playsink, "setting up vis chain");
- srcpad =
- gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
- add_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
- activate_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
- if (playsink->audio_tee_vissrc == NULL) {
- playsink->audio_tee_vissrc =
- gst_element_get_request_pad (playsink->audio_tee, "src_%u");
+
+ /* Just change vis plugin or set up chain? */
+ if (playsink->vischain->vis != playsink->visualisation) {
+ /* unlink the old plugin and unghost the pad */
+ gst_pad_unlink (playsink->vischain->vispeerpad,
+ playsink->vischain->vissinkpad);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->
+ vischain->srcpad), NULL);
+
+ /* set the old plugin to NULL and remove */
+ gst_element_set_state (playsink->vischain->vis, GST_STATE_NULL);
+ gst_bin_remove (GST_BIN_CAST (playsink->vischain->chain.bin),
+ playsink->vischain->vis);
+
+ /* add new plugin and set state to playing */
+ playsink->vischain->vis = playsink->visualisation;
+ gst_bin_add (GST_BIN_CAST (playsink->vischain->chain.bin),
+ playsink->vischain->vis);
+ gst_element_set_state (playsink->vischain->vis, GST_STATE_PLAYING);
+
+ /* get pads */
+ playsink->vischain->vissinkpad =
+ gst_element_get_static_pad (playsink->vischain->vis, "sink");
+ playsink->vischain->vissrcpad =
+ gst_element_get_static_pad (playsink->vischain->vis, "src");
+
+ /* link pads */
+ gst_pad_link_full (playsink->vischain->vispeerpad,
+ playsink->vischain->vissinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->
+ vischain->srcpad), playsink->vischain->vissrcpad);
+ } else {
+ srcpad =
+ gst_element_get_static_pad (playsink->vischain->chain.bin, "src");
+ add_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
+ activate_chain (GST_PLAY_CHAIN (playsink->vischain), TRUE);
+ if (playsink->audio_tee_vissrc == NULL) {
+ playsink->audio_tee_vissrc =
+ gst_element_get_request_pad (playsink->audio_tee, "src_%u");
+ }
+ gst_pad_link_full (playsink->audio_tee_vissrc,
+ playsink->vischain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_pad_link_full (srcpad, playsink->video_sinkpad_stream_synchronizer,
+ GST_PAD_LINK_CHECK_NOTHING);
+ gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
+ playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_object_unref (srcpad);
}
- gst_pad_link_full (playsink->audio_tee_vissrc,
- playsink->vischain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
- gst_pad_link_full (srcpad, playsink->video_sinkpad_stream_synchronizer,
- GST_PAD_LINK_CHECK_NOTHING);
- gst_pad_link_full (playsink->video_srcpad_stream_synchronizer,
- playsink->videochain->sinkpad, GST_PAD_LINK_CHECK_NOTHING);
- gst_object_unref (srcpad);
}
} else {
GST_DEBUG_OBJECT (playsink, "no vis needed");
@@ -3802,6 +3842,11 @@ video_set_blocked (GstPlaySink * playsink, gboolean blocked)
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
(playsink->video_pad)));
if (blocked && playsink->video_block_id == 0) {
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
playsink->video_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -3824,10 +3869,20 @@ audio_set_blocked (GstPlaySink * playsink, gboolean blocked)
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
(playsink->audio_pad)));
if (blocked && playsink->audio_block_id == 0) {
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
playsink->audio_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
} else if (!blocked && playsink->audio_block_id) {
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
gst_pad_remove_probe (opad, playsink->audio_block_id);
PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_AUDIO_RAW);
PENDING_FLAG_UNSET (playsink, GST_PLAY_SINK_TYPE_AUDIO);
@@ -3846,6 +3901,11 @@ text_set_blocked (GstPlaySink * playsink, gboolean blocked)
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
(playsink->text_pad)));
if (blocked && playsink->text_block_id == 0) {
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
playsink->text_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -3995,6 +4055,11 @@ gst_play_sink_refresh_pad (GstPlaySink * playsink, GstPad * pad,
GstPad *blockpad =
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (pad)));
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->vischain)->blockpad,
+ playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
*block_id =
gst_pad_add_probe (blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -4128,6 +4193,11 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
GstPad *blockpad =
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (res)));
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
*block_id =
gst_pad_add_probe (blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -4433,6 +4503,11 @@ gst_play_sink_change_state (GstElement * element, GstStateChange transition)
video_set_blocked (playsink, FALSE);
audio_set_blocked (playsink, FALSE);
text_set_blocked (playsink, FALSE);
+ if (playsink->vis_pad_block_id)
+ gst_pad_remove_probe (((GstPlayVisChain *) playsink->
+ vischain)->blockpad, playsink->vis_pad_block_id);
+ playsink->vis_pad_block_id = 0;
+
GST_PLAY_SINK_UNLOCK (playsink);
/* fall through */
case GST_STATE_CHANGE_READY_TO_NULL:
--
1.8.3.1

View File

@ -1,16 +1,14 @@
%global majorminor 1.0
Name: gstreamer1-plugins-base
Version: 1.2.0
Release: 2%{?dist}
Version: 1.2.1
Release: 1%{?dist}
Summary: GStreamer streaming media framework base plugins
License: LGPLv2+
URL: http://gstreamer.freedesktop.org/
Source0: http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-%{version}.tar.xz
Patch0: 0001-missing-plugins-Remove-the-mpegaudioversion-field.patch
# https://bugzilla.gnome.org/show_bug.cgi?id=709210
Patch1: 0001-playsink-If-the-visualisation-is-changing-and-reconf.patch
BuildRequires: gstreamer1-devel >= %{version}
BuildRequires: gobject-introspection-devel >= 1.31.1
@ -89,7 +87,7 @@ for the GStreamer Base Plugins library.
%prep
%setup -q -n gst-plugins-base-%{version}
%patch0 -p1
%patch1 -p1
%build
%configure \
@ -352,6 +350,10 @@ chrpath --delete $RPM_BUILD_ROOT%{_bindir}/gst-discoverer-1.0
%changelog
* Mon Nov 11 2013 Brian Pepple <bpepple@fedoraproject.org> - 1.2.1-1
- Update to 1.2.1.
- Drop patch to fix potential deadlock on startup. Fixed upstream.
* Thu Oct 03 2013 Bastien Nocera <bnocera@redhat.com> 1.2.0-2
- Fix potential deadlock on startup when playing audio files