From 4dd30bbd166db003f9963f41918b056df338dcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 16 Feb 2014 15:32:47 +0100 Subject: [PATCH] playsink: Only remove the complete text chain if the text pad goes away If the text pads does not go away we just set the overlay to silent, which allows us to immediately re-enable subs later again. However before this change we also released the streamsynchronizer text pads, which deadlocked because there was still dataflow going on. Just do this only if we remove the complete chain. https://bugzilla.gnome.org/show_bug.cgi?id=683504 --- gst/playback/gstplaysink.c | 61 ++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c index 2154fd2c5b..8849806b89 100644 --- a/gst/playback/gstplaysink.c +++ b/gst/playback/gstplaysink.c @@ -3464,22 +3464,44 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink) GST_DEBUG_OBJECT (playsink, "no text needed"); /* we have no subtitles/text or we are requested to not show them */ - if (playsink->text_sinkpad_stream_synchronizer) { - gst_element_release_request_pad (GST_ELEMENT_CAST - (playsink->stream_synchronizer), - playsink->text_sinkpad_stream_synchronizer); - gst_object_unref (playsink->text_sinkpad_stream_synchronizer); - playsink->text_sinkpad_stream_synchronizer = NULL; - gst_object_unref (playsink->text_srcpad_stream_synchronizer); - playsink->text_srcpad_stream_synchronizer = NULL; - } - if (playsink->textchain) { if (playsink->text_pad == NULL) { /* no text pad, remove the chain entirely */ GST_DEBUG_OBJECT (playsink, "removing text chain"); add_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE); activate_chain (GST_PLAY_CHAIN (playsink->textchain), FALSE); + + if (playsink->text_sinkpad_stream_synchronizer) { + gst_element_release_request_pad (GST_ELEMENT_CAST + (playsink->stream_synchronizer), + playsink->text_sinkpad_stream_synchronizer); + gst_object_unref (playsink->text_sinkpad_stream_synchronizer); + playsink->text_sinkpad_stream_synchronizer = NULL; + gst_object_unref (playsink->text_srcpad_stream_synchronizer); + playsink->text_srcpad_stream_synchronizer = NULL; + } + + if (!need_video && playsink->video_pad) { + if (playsink->video_sinkpad_stream_synchronizer) { + gst_element_release_request_pad (GST_ELEMENT_CAST + (playsink->stream_synchronizer), + playsink->video_sinkpad_stream_synchronizer); + gst_object_unref (playsink->video_sinkpad_stream_synchronizer); + playsink->video_sinkpad_stream_synchronizer = NULL; + gst_object_unref (playsink->video_srcpad_stream_synchronizer); + playsink->video_srcpad_stream_synchronizer = NULL; + } + + gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), + NULL); + } + + if (playsink->text_pad && !playsink->textchain) + gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad), + NULL); + + if (playsink->text_sink) + gst_element_set_state (playsink->text_sink, GST_STATE_NULL); } else { /* we have a chain and a textpad, turn the subtitles off */ GST_DEBUG_OBJECT (playsink, "turning off the text"); @@ -3488,25 +3510,6 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink) NULL); } } - if (!need_video && playsink->video_pad) { - if (playsink->video_sinkpad_stream_synchronizer) { - gst_element_release_request_pad (GST_ELEMENT_CAST - (playsink->stream_synchronizer), - playsink->video_sinkpad_stream_synchronizer); - gst_object_unref (playsink->video_sinkpad_stream_synchronizer); - playsink->video_sinkpad_stream_synchronizer = NULL; - gst_object_unref (playsink->video_srcpad_stream_synchronizer); - playsink->video_srcpad_stream_synchronizer = NULL; - } - - gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->video_pad), NULL); - } - - if (playsink->text_pad && !playsink->textchain) - gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (playsink->text_pad), NULL); - - if (playsink->text_sink) - gst_element_set_state (playsink->text_sink, GST_STATE_NULL); } update_av_offset (playsink); do_async_done (playsink);