From 92e88768443a21eab5d2dd6bc7a318c9b46e54f8 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 6 Sep 2017 16:50:31 +0200 Subject: [PATCH] parsebin: Emit 'drained' only for the top-level chain Instead of emitting 'drained' whenever every single chain is drained (which would result in plenty of signal emission, and would also occur when switching groups), only emit it when the top-level chain is drained. Furthermore, mark unknown (and therefore unexposed) pads as drained since we'll never get EOS on them. https://bugzilla.gnome.org/show_bug.cgi?id=787367 --- gst/playback/gstparsebin.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/gst/playback/gstparsebin.c b/gst/playback/gstparsebin.c index 0c59c79..0768056 100644 --- a/gst/playback/gstparsebin.c +++ b/gst/playback/gstparsebin.c @@ -1515,6 +1515,7 @@ unknown_type: chain->deadend_details = deadend_details; chain->deadend = TRUE; + chain->drained = TRUE; chain->endcaps = caps; gst_object_replace ((GstObject **) & chain->current_pad, NULL); @@ -3217,14 +3218,13 @@ drain_and_switch_chains (GstParseChain * chain, GstParsePad * drainpad, beach: CHAIN_MUTEX_UNLOCK (chain); - GST_DEBUG ("Chain %p (handled:%d, last_group:%d, drained:%d, switched:%d)", - chain, handled, *last_group, chain->drained, *switched); + GST_DEBUG + ("Chain %p (%s:%s handled:%d, last_group:%d, drained:%d, switched:%d, deadend:%d)", + chain, GST_DEBUG_PAD_NAME (chain->pad), handled, *last_group, + chain->drained, *switched, chain->deadend); *drained = chain->drained; - if (*drained) - g_signal_emit (parsebin, gst_parse_bin_signals[SIGNAL_DRAINED], 0, NULL); - return handled; } @@ -3245,11 +3245,18 @@ gst_parse_pad_handle_eos (GstParsePad * pad) drain_and_switch_chains (parsebin->parse_chain, pad, &last_group, &drained, &switched); + GST_LOG_OBJECT (parsebin, "drained:%d switched:%d", drained, switched); if (switched) { /* If we resulted in a group switch, expose what's needed */ if (gst_parse_chain_is_complete (parsebin->parse_chain)) gst_parse_bin_expose (parsebin); } + + if (drained) { + GST_DEBUG_OBJECT (parsebin, "We are fully drained, emitting signal"); + g_signal_emit (parsebin, gst_parse_bin_signals[SIGNAL_DRAINED], 0, NULL); + } + } EXPOSE_UNLOCK (parsebin); -- 2.7.4