qmloverlay: Use first found GstGLVideoItem as widget property

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>
This commit is contained in:
VaL Doroshchuk 2021-03-25 13:20:38 +01:00 committed by GStreamer Marge Bot
parent c70b41b22b
commit 36b794f9ff
2 changed files with 36 additions and 0 deletions

View file

@ -335,6 +335,14 @@ gst_qt_overlay_gl_start (GstGLBaseFilter * bfilter)
g_object_notify (G_OBJECT (qt_overlay), "root-item"); g_object_notify (G_OBJECT (qt_overlay), "root-item");
g_signal_emit (qt_overlay, gst_qt_overlay_signals[SIGNAL_QML_SCENE_INITIALIZED], 0); 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; return TRUE;
fail_renderer: fail_renderer:

View file

@ -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))