old_contents: #!/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 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
  
  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()
  
new_contents: #!/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()
  
subject: create a local ghostpad before linking