#!/usr/bin/env python3 ''' Simple example to demonstrate dynamically adding and removing source elements to a playing pipeline. ''' import sys import random import gi gi.require_version('Gst', '1.0') gi.require_version('GLib', '2.0') from gi.repository import GLib, Gst class ProbeData: def __init__(self, pipe, src): self.pipe = pipe self.src = src def bus_call(bus, message, loop): t = message.type if t == Gst.MessageType.EOS: sys.stdout.write("End-of-stream\n") loop.quit() elif t == Gst.MessageType.ERROR: err, debug = message.parse_error() sys.stderr.write("Error: %s: %s\n" % (err, debug)) loop.quit() return True def dispose_src_cb(src): src.set_state(Gst.State.NULL) def probe_cb(pad, info, pdata): peer = pad.get_peer() pad.unlink(peer) pdata.pipe.remove(pdata.src) # Can't set the state of the src to NULL from its streaming thread GLib.idle_add(dispose_src_cb, pdata.src) pdata.src = Gst.ElementFactory.make('videotestsrc') pdata.src.props.pattern = random.randint(0, 24) pdata.src.props.is_live = True pdata.pipe.add(pdata.src) srcpad = pdata.src.get_static_pad("src") srcpad.link(peer) pdata.src.sync_state_with_parent() GLib.timeout_add_seconds(1, timeout_cb, pdata) return Gst.PadProbeReturn.REMOVE def timeout_cb(pdata): srcpad = pdata.src.get_static_pad('src') srcpad.add_probe(Gst.PadProbeType.IDLE, probe_cb, pdata) return GLib.SOURCE_REMOVE def main(args): Gst.init(None) pipe = Gst.Pipeline.new('dynamic') src = Gst.ElementFactory.make('videotestsrc') sink = Gst.ElementFactory.make('autovideosink') pipe.add(src, sink) src.link(sink) pdata = ProbeData(pipe, src) loop = GLib.MainLoop() GLib.timeout_add_seconds(1, timeout_cb, pdata) bus = pipe.get_bus() bus.add_signal_watch() bus.connect("message", bus_call, loop) # start play back and listen to events pipe.set_state(Gst.State.PLAYING) try: loop.run() except e: pass # cleanup pipe.set_state(Gst.State.NULL) if __name__ == '__main__': sys.exit(main(sys.argv))