inputselector: Never reset active pad set from the user
authorThibault Saunier <tsaunier@igalia.com>
Wed, 13 May 2020 21:07:43 +0000 (17:07 -0400)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 14 May 2020 22:15:12 +0000 (22:15 +0000)
This was leading to interesting races in a GES test.
Related to: https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/issues/108

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/481>

plugins/elements/gstinputselector.c
plugins/elements/gstinputselector.h

index 25b4e7f..099ae35 100644 (file)
@@ -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;
   }
index 3dff175..9d2eb6a 100644 (file)
@@ -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;