From bf32c0b3b00b7f60d9ea9afd078be9cb090d9eb7 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 19 Jul 2017 19:58:28 +0900 Subject: [PATCH] decodebin3: Remove FIXME and do remove_input_stream() only for the corresponding parsebin Do not remove other parsebin's input streams. It will cause unexpected removal of any input streams in multi-parsebin use case. Basically, the purpose of blocking buffers is similar to checking no-more-pads of chain/group. That is, it gives hint to know the timing to remove old (EOSed) streams of the parsebin and to add/reuse slots for new input streams. But, that doesn't mean that we need to remove other parsebin's EOSed stream. Each parsebin has most likely its own streaming thread and therefore EOSed time can be much different. (i.e., much early EOS of subtitle only parsebin) https://bugzilla.gnome.org/show_bug.cgi?id=785120 --- gst/playback/gstdecodebin3-parse.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gst/playback/gstdecodebin3-parse.c b/gst/playback/gstdecodebin3-parse.c index 40b5175550..6acef21c25 100644 --- a/gst/playback/gstdecodebin3-parse.c +++ b/gst/playback/gstdecodebin3-parse.c @@ -412,6 +412,11 @@ parsebin_buffer_probe (GstPad * pad, GstPadProbeInfo * info, DecodebinInputStream *input_stream = (DecodebinInputStream *) tmp->data; GList *next = tmp->next; + if (input_stream->input != input) { + tmp = next; + continue; + } + GST_DEBUG_OBJECT (dbin, "Checking input stream %p", input_stream); if (input_stream->input_buffer_probe_id) { GST_DEBUG_OBJECT (dbin, @@ -542,11 +547,11 @@ parsebin_pad_added_cb (GstElement * demux, GstPad * pad, DecodebinInput * input) input->pending_pads = g_list_append (input->pending_pads, ppad); - /* FIXME : ONLY DO FOR THIS PARSEBIN/INPUT ! */ /* Check if all existing input streams have a buffer probe set */ for (tmp = dbin->input_streams; tmp; tmp = tmp->next) { DecodebinInputStream *input_stream = (DecodebinInputStream *) tmp->data; - if (input_stream->input_buffer_probe_id == 0) { + if (input_stream->input == input && + input_stream->input_buffer_probe_id == 0) { GST_DEBUG_OBJECT (input_stream->srcpad, "Adding blocking buffer probe"); input_stream->input_buffer_probe_id = gst_pad_add_probe (input_stream->srcpad,