blob: 69d24ee671a17461e23f4d485b248f64e41979ff (
plain)
- #!/usr/bin/python3
- import gi, time
- gi.require_version('Gst', '1.0')
- from gi.repository import GLib, Gst, GObject
- GObject.threads_init()
- Gst.init(None)
- class SrcBin(Gst.Bin):
- def __init__(self):
- super().__init__()
- self.src = Gst.ElementFactory.make('videotestsrc', 'src')
- self.add(self.src)
- self.add_pad(
- Gst.GhostPad.new('src', self.src.get_static_pad('src'))
- )
- class SinkBin(Gst.Bin):
- def __init__(self):
- super().__init__()
- self.sink = Gst.ElementFactory.make('autovideosink', 'sink')
- self.add(self.sink)
- self.add_pad(
- Gst.GhostPad.new('sink', self.sink.get_static_pad('sink'))
- )
- class MixBin(Gst.Bin):
- def __init__(self):
- super().__init__()
- self.mix = Gst.ElementFactory.make('videomixer', 'src')
- self.add(self.mix)
- self.add_pad(
- Gst.GhostPad.new('src', self.mix.get_static_pad('src'))
- )
- def create_ghostpad(self, pad):
- ghostpad = Gst.GhostPad.new(pad.get_name(), pad)
- self.add_pad(ghostpad)
- return ghostpad
- def add_src(self, src):
- sinkpad = self.mix.get_request_pad('sink_%u')
- sinkpad.set_property('alpha', 0.75)
- srcpad = src.get_static_pad('src')
- # works
- #print(src.link(self.mix)) # True
- # doesn't
- #print(srcpad.link(sinkpad)) # Error => GST_PAD_LINK_WRONG_HIERARCHY
- # but this does
- sinkghostpad = self.create_ghostpad(sinkpad)
- print(srcpad.link(sinkghostpad)) # True
- class Example:
- def __init__(self):
- self.mainloop = GObject.MainLoop()
- self.pipeline = Gst.Pipeline()
- self.src = SrcBin()
- self.sink = SinkBin()
- self.mix = MixBin()
- # Add elements to pipeline
- self.pipeline.add(self.src)
- self.pipeline.add(self.sink)
- self.pipeline.add(self.mix)
- self.mix.add_src(self.src)
- self.mix.link(self.sink)
- def run(self):
- self.pipeline.set_state(Gst.State.PLAYING)
- self.mainloop.run()
- def kill(self):
- self.pipeline.set_state(Gst.State.NULL)
- self.mainloop.quit()
- example = Example()
- example.run()
|