qmloverlay: Use first found GstGLVideoItem as widget property
authorVaL Doroshchuk <valentyn.doroshchuk@qt.io>
Thu, 25 Mar 2021 12:20:38 +0000 (13:20 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 21 Apr 2021 08:26:52 +0000 (08:26 +0000)
GstGLVideoItem is required to render input video in the overlay's qml.
And currently qmlgloverlay requires to set this GstGLVideoItem to its widget property.

Instead of fetching GstGLVideoItem from the overlay's root object (root-item prop),
and setting it back as a widget (widget prop),
proposing to use found GstGLVideoItem in the current object hierarchy (passed in qml-scene) by default.

Also useful in Python, which solves the issue when casting gpointer <=> QQuickItem* is required.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/919>

ext/qt/gstqtoverlay.cc
tests/examples/qt/qmloverlay/overlay.py [new file with mode: 0644]

index af54ec7..6a0e4e7 100644 (file)
@@ -335,6 +335,14 @@ gst_qt_overlay_gl_start (GstGLBaseFilter * bfilter)
   g_object_notify (G_OBJECT (qt_overlay), "root-item");
   g_signal_emit (qt_overlay, gst_qt_overlay_signals[SIGNAL_QML_SCENE_INITIALIZED], 0);
 
+  GST_OBJECT_LOCK (bfilter);
+  if (!qt_overlay->widget) {
+    QtGLVideoItem *qt_item = static_cast<QtGLVideoItem *>(root->findChild<QtGLVideoItem *> ());
+    if (qt_item)
+      qt_overlay->widget = qt_item->getInterface();
+  }
+  GST_OBJECT_UNLOCK (bfilter);
+
   return TRUE;
 
 fail_renderer:
diff --git a/tests/examples/qt/qmloverlay/overlay.py b/tests/examples/qt/qmloverlay/overlay.py
new file mode 100644 (file)
index 0000000..bf3e18c
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+import signal
+signal.signal(signal.SIGINT, signal.SIG_DFL)
+
+import sys
+import gi
+gi.require_version('Gst', '1.0')
+
+from gi.repository import Gst, GLib
+from PySide2.QtGui import QGuiApplication
+from PySide2.QtQuick import QQuickItem
+
+def main(args):
+    app = QGuiApplication(args)
+    Gst.init(args)
+
+    pipeline = Gst.parse_launch("""videotestsrc ! glupload ! qmlgloverlay name=o ! gldownload ! videoconvert ! autovideosink""")
+    o = pipeline.get_by_name('o')
+    f = open('overlay.qml', 'r')
+    o.set_property('qml-scene', f.read())
+
+    pipeline.set_state(Gst.State.PLAYING)
+    app.exec_()
+    pipeline.set_state(Gst.State.NULL)
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))