diff --git a/video/gtk4/examples/gtksink.py b/video/gtk4/examples/gtksink.py new file mode 100644 index 00000000..c9b0df0a --- /dev/null +++ b/video/gtk4/examples/gtksink.py @@ -0,0 +1,57 @@ +import gi +import sys + +gi.require_version("Gtk", "4.0") +gi.require_version('Gst', '1.0') + +from gi.repository import Gtk +from gi.repository import Gst + +Gst.init(sys.argv[1:]) + +gtksink = Gst.ElementFactory.make("gtk4paintablesink", "sink") +# Get the paintable from the sink +paintable = gtksink.props.paintable + +# Use GL if available +if paintable.props.gl_context: + print("Using GL") + source = Gst.ElementFactory.make("gltestsrc", "source") + glsink = Gst.ElementFactory.make("glsinkbin", "sink") + glsink.props.sink = gtksink + sink = glsink +else: + source = Gst.ElementFactory.make("videotestsrc", "source") + sink = gtksink + +pipeline = Gst.Pipeline.new() + +if not pipeline or not source or not sink: + print("Not all elements could be created.") + exit(-1) + +pipeline.add(source) +pipeline.add(sink) +source.link(sink) + +def on_activate(app): + win = Gtk.ApplicationWindow(application=app) + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + + picture = Gtk.Picture.new() + picture.set_size_request(640, 480) + # Set the paintable on the picture + picture.set_paintable(paintable) + box.append(picture) + + btn = Gtk.Button(label="▶/⏸") + box.append(btn) + btn.connect('clicked', lambda _: pipeline.set_state(Gst.State.PAUSED) if pipeline.get_state(1)[1]==Gst.State.PLAYING else pipeline.set_state(Gst.State.PLAYING)) + + win.set_child(box) + win.present() + +app = Gtk.Application() +app.connect('activate', on_activate) + +app.run(None)