From 9f2e9ccd7ef3c19447f5667e6fdc8176a3f319e1 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 13 May 2020 17:07:43 -0400 Subject: [PATCH] inputselector: Never reset active pad set from the user This was leading to interesting races in a GES test. Related to: https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/108 Part-of: --- plugins/elements/gstinputselector.c | 4 +++- plugins/elements/gstinputselector.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index 25b4e7f61f..099ae35e35 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -1427,6 +1427,7 @@ gst_input_selector_set_property (GObject * object, guint prop_id, GST_INPUT_SELECTOR_LOCK (sel); + sel->active_sinkpad_from_user = ! !pad; #if DEBUG_CACHED_BUFFERS gst_input_selector_debug_cached_buffers (sel); #endif @@ -1814,6 +1815,7 @@ gst_input_selector_release_pad (GstElement * element, GstPad * pad) GST_DEBUG_OBJECT (sel, "Deactivating pad %s:%s", GST_DEBUG_PAD_NAME (pad)); gst_object_unref (sel->active_sinkpad); sel->active_sinkpad = NULL; + sel->active_sinkpad_from_user = FALSE; } sel->n_pads--; GST_INPUT_SELECTOR_UNLOCK (sel); @@ -1829,7 +1831,7 @@ gst_input_selector_reset (GstInputSelector * sel) GST_INPUT_SELECTOR_LOCK (sel); /* clear active pad */ - if (sel->active_sinkpad) { + if (sel->active_sinkpad && !sel->active_sinkpad_from_user) { gst_object_unref (sel->active_sinkpad); sel->active_sinkpad = NULL; } diff --git a/plugins/elements/gstinputselector.h b/plugins/elements/gstinputselector.h index 3dff17504b..9d2eb6aa5c 100644 --- a/plugins/elements/gstinputselector.h +++ b/plugins/elements/gstinputselector.h @@ -65,7 +65,8 @@ struct _GstInputSelector { GstPad *srcpad; - GstPad *active_sinkpad; + gboolean active_sinkpad_from_user; + GstPad* active_sinkpad; guint n_pads; /* number of pads */ guint padcount; /* sequence number for pads */ gboolean sync_streams;