qmlglsrc: Fix deadlock when stopping
authorMatthias Fuchs <matthias1.fuchs@zeiss.com>
Fri, 11 Mar 2022 14:13:21 +0000 (15:13 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 6 Apr 2022 10:54:51 +0000 (10:54 +0000)
This fix makes sure that streaming thread stops waiting when the
qmlglsrc element transitions from playing to paused.

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

subprojects/gst-plugins-good/ext/qt/gstqtsrc.cc
subprojects/gst-plugins-good/ext/qt/qtwindow.cc
subprojects/gst-plugins-good/ext/qt/qtwindow.h

index 57fb990..615a42b 100644 (file)
@@ -513,6 +513,8 @@ gst_qt_src_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+      if (qt_src->window)
+        qt_window_stop (qt_src->window);
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       break;
index 70707d8..f67f286 100644 (file)
@@ -450,3 +450,15 @@ qt_window_use_default_fbo (QtGLWindow * qt_window, gboolean useDefaultFbo)
 
   g_mutex_unlock (&qt_window->priv->lock);
 }
+
+void
+qt_window_stop(QtGLWindow* qt_window)
+{
+  g_mutex_lock(&qt_window->priv->lock);
+
+  GST_DEBUG("stop window");
+  qt_window->priv->updated = TRUE;
+  g_cond_signal(&qt_window->priv->update_cond);
+
+  g_mutex_unlock(&qt_window->priv->lock);
+}
index b6b529e..33f62d9 100644 (file)
@@ -64,6 +64,7 @@ gboolean        qt_window_set_context (QtGLWindow * qt_window, GstGLContext * co
 GstGLDisplay *  qt_window_get_display (QtGLWindow * qt_window);
 gboolean        qt_window_is_scenegraph_initialized (QtGLWindow * qt_window);
 void            qt_window_use_default_fbo (QtGLWindow * qt_window, gboolean useDefaultFbo);
+void            qt_window_stop(QtGLWindow* qt_window);
 }
 
 #endif /* __QT_WINDOW_H__ */