inputselector: Wake up streaming thread before PLAYING_TO_PAUSED transition
authorVivia Nikolaidou <vivia@ahiru.eu>
Thu, 16 Mar 2023 10:38:23 +0000 (12:38 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 17 Mar 2023 01:50:34 +0000 (01:50 +0000)
Also take object lock before iterating the pads.

https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1772

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

subprojects/gstreamer/plugins/elements/gstinputselector.c

index 6f6796c..8985234 100644 (file)
@@ -2046,6 +2046,10 @@ gst_input_selector_change_state (GstElement * element,
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
       GList *walk;
 
+      GST_INPUT_SELECTOR_LOCK (self);
+      self->playing = FALSE;
+      GST_INPUT_SELECTOR_BROADCAST (self);
+      GST_OBJECT_LOCK (self);
       for (walk = GST_ELEMENT_CAST (self)->sinkpads; walk;
           walk = g_list_next (walk)) {
         GstSelectorPad *selpad = GST_SELECTOR_PAD_CAST (walk->data);
@@ -2054,6 +2058,8 @@ gst_input_selector_change_state (GstElement * element,
           gst_clock_id_unschedule (selpad->clock_id);
         }
       }
+      GST_OBJECT_UNLOCK (self);
+      GST_INPUT_SELECTOR_UNLOCK (self);
       break;
     }
     default:
@@ -2066,10 +2072,6 @@ gst_input_selector_change_state (GstElement * element,
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       gst_input_selector_reset (self);
       break;
-    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
-      GST_INPUT_SELECTOR_LOCK (self);
-      self->playing = FALSE;
-      GST_INPUT_SELECTOR_UNLOCK (self);
     default:
       break;
   }