How can I create a mosaic in Gstreamer? How can I set "sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0" in Python?

Thiago Santos thiagoss at osg.samsung.com
Wed Aug 5 13:43:43 PDT 2015


On 08/05/2015 01:26 PM, Giacomo D wrote:
> Perfect Thiago, your help has been great!!
>
> But now everything works fine or it seems so because I haven't got errors
> but unfortunately nothing shows.
>
>
> As I said, I want to write in Python this command line which works well:
>
>
> gst-launch-1.0 -e \
> videomixer name=mix \
>          sink_0::xpos=0   sink_0::ypos=0  sink_0::alpha=0\
>          sink_1::xpos=0   sink_1::ypos=0 \
>          sink_2::xpos=200 sink_2::ypos=0 \
>          sink_3::xpos=0   sink_3::ypos=100 \
>          sink_4::xpos=200 sink_4::ypos=100 \
>      ! xvimagesink \
> videotestsrc pattern="black" \
>      ! video/x-raw,width=400,height=200 \
>      ! mix.sink_0 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
>      ! decodebin ! videoconvert ! videoscale \
>      ! video/x-raw,width=200,height=100 \
>      ! mix.sink_1 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
>      ! decodebin ! videoconvert ! videoscale \
>      ! video/x-raw,width=200,height=100 \
>      ! mix.sink_2 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
>      ! decodebin ! videoconvert ! videoscale \
>      ! video/x-raw,width=200,height=100 \
>      ! mix.sink_3 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
>      ! decodebin ! videoconvert ! videoscale \
>      ! video/x-raw,width=200,height=100 \
>      ! mix.sink_4 \
>
>
> and the result is this:
>
> <http://gstreamer-devel.966125.n4.nabble.com/file/n4672994/42.png>
>
> So I have written it in Python like below but nothing is showing up as a
> result:
>
>
>
> _author__ = 'giacomo'
>
> import sys
> from gi.repository import Gst
> from gi.repository import GObject
> GObject.threads_init()
> Gst.init(None)
>
> import os
>
> class VideoBox():
>     def __init__(self):
>         mainloop = GObject.MainLoop()
>         # Create transcoding pipeline
>         self.pipeline = Gst.Pipeline()
>
>         self.videotestsrc = Gst.ElementFactory.make('videotestsrc', None)
>         self.videotestsrc.set_property("pattern", "black")
>         self.pipeline.add(self.videotestsrc)
>
>         self.filesrc1 = Gst.ElementFactory.make('filesrc', None)
>         self.filesrc1.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
>         self.pipeline.add(self.filesrc1)
>
>
>         self.filesrc2 = Gst.ElementFactory.make('filesrc', None)
>         self.filesrc2.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
>         self.pipeline.add(self.filesrc2)
>
>         self.filesrc3 = Gst.ElementFactory.make('filesrc', None)
>         self.filesrc3.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
>         self.pipeline.add(self.filesrc3)
>
>         self.filesrc4 = Gst.ElementFactory.make('filesrc', None)
>         self.filesrc4.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
>         self.pipeline.add(self.filesrc4)
>
>         self.videomixer = Gst.ElementFactory.make('videomixer', None)
>         self.pipeline.add(self.videomixer)
>
>
>
>         self.pad0 = self.videomixer.get_request_pad("sink_%u")
>         self.pad1 = self.videomixer.get_request_pad("sink_%u")
>         self.pad2 = self.videomixer.get_request_pad("sink_%u")
>         self.pad3 = self.videomixer.get_request_pad("sink_%u")
>         self.pad4 = self.videomixer.get_request_pad("sink_%u")
>
>
>
>         #sink_0
>         self.pad0.set_property('xpos',0)
>         self.pad0.set_property("ypos",0)
>         self.pad0.set_property("alpha",0)
>
>         #sink_1
>         self.pad1.set_property("xpos",0)
>         self.pad1.set_property("ypos",0)
>
>         #sink_2
>         self.pad2.set_property("xpos",200)
>         self.pad2.set_property("ypos",0)
>
>         #sink_3
>         self.pad3.set_property("xpos",0)
>         self.pad3.set_property("ypos",100)
>
>         #sink_4
>         self.pad4.set_property("xpos",200)
>         self.pad4.set_property("ypos",100)
>
>
>
>         self.decodebin1 = Gst.ElementFactory.make('decodebin', None)
>         self.pipeline.add(self.decodebin1)
>
>         self.decodebin2 = Gst.ElementFactory.make('decodebin', None)
>         self.pipeline.add(self.decodebin2)
>
>         self.decodebin3 = Gst.ElementFactory.make('decodebin', None)
>         self.pipeline.add(self.decodebin3)
>
>         self.decodebin4 = Gst.ElementFactory.make('decodebin', None)
>         self.pipeline.add(self.decodebin4)
>
>
>         self.videoformatconverter1 = Gst.ElementFactory.make('videoconvert',
> None)
>         self.pipeline.add(self.videoformatconverter1)
>
>         self.videoformatconverter2 = Gst.ElementFactory.make('videoconvert',
> None)
>         self.pipeline.add(self.videoformatconverter2)
>
>         self.videoformatconverter3 = Gst.ElementFactory.make('videoconvert',
> None)
>         self.pipeline.add(self.videoformatconverter3)
>
>         self.videoformatconverter4 = Gst.ElementFactory.make('videoconvert',
> None)
>         self.pipeline.add(self.videoformatconverter4)
>
>         self.videoscale1 = Gst.ElementFactory.make('videoscale', None)
>         self.pipeline.add(self.videoscale1)
>
>         self.videoscale2 = Gst.ElementFactory.make('videoscale', None)
>         self.pipeline.add(self.videoscale2)
>
>         self.videoscale3 = Gst.ElementFactory.make('videoscale', None)
>         self.pipeline.add(self.videoscale3)
>
>         self.videoscale4 = Gst.ElementFactory.make('videoscale', None)
>         self.pipeline.add(self.videoscale4)
>
>
>         camera0caps =
> Gst.Caps.from_string("video/x-raw,width=400,height=200")
>
>         self.camerafilter0 = Gst.ElementFactory.make("capsfilter", "filter0")
>         self.camerafilter0.set_property("caps", camera0caps)
>         self.pipeline.add(self.camerafilter0)
>
>
>         camera1caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
>         self.camerafilter1 = Gst.ElementFactory.make("capsfilter", "filter1")
>         self.camerafilter1.set_property("caps", camera1caps)
>         self.pipeline.add(self.camerafilter1)
>         #
>         camera2caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>         self.camerafilter2 = Gst.ElementFactory.make("capsfilter", "filter2")
>         self.camerafilter2.set_property("caps", camera2caps)
>         self.pipeline.add(self.camerafilter2)
>
>         camera3caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
>         self.camerafilter3 = Gst.ElementFactory.make("capsfilter", "filter3")
>         self.camerafilter3.set_property("caps", camera3caps)
>         self.pipeline.add(self.camerafilter3)
>
>
>         camera4caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
>         self.camerafilter4 = Gst.ElementFactory.make("capsfilter", "filter4")
>         self.camerafilter4.set_property("caps", camera4caps)
>         self.pipeline.add(self.camerafilter4)
>
>         self.xvimagesink = Gst.ElementFactory.make('xvimagesink',None)
>         self.pipeline.add(self.xvimagesink)
>
>
>
>         self.videotestsrc.link(self.camerafilter0)
>        
> self.camerafilter0.get_static_pad("src").link(self.videomixer.get_static_pad("sink_0"))
>
>
>
>         self.filesrc1.link(self.decodebin1)
>         self.decodebin1.link(self.videoformatconverter1)
>         self.videoformatconverter1.link(self.videoscale1)
>         self.videoscale1.link(self.camerafilter1)
>        
> self.camerafilter1.get_static_pad("src").link(self.videomixer.get_static_pad("sink_1"))
>
>
>         self.filesrc2.link(self.decodebin2)
>         self.decodebin2.link(self.videoformatconverter2)
>         self.videoformatconverter2.link(self.videoscale2)
>         self.videoscale2.link(self.camerafilter2)
>        
> self.camerafilter2.get_static_pad("src").link(self.videomixer.get_static_pad("sink_2"))
>
>
>         self.filesrc3.link(self.decodebin3)
>         self.decodebin3.link(self.videoformatconverter3)
>         self.videoformatconverter3.link(self.videoscale3)
>         self.videoscale3.link(self.camerafilter3)
>        
> self.camerafilter3.get_static_pad("src").link(self.videomixer.get_static_pad("sink_3"))
>
>         self.filesrc4.link(self.decodebin4)
>         self.decodebin4.link(self.videoformatconverter4)
>         self.videoformatconverter4.link(self.videoscale4)
>         self.videoscale4.link(self.camerafilter4)
>        
> self.camerafilter4.get_static_pad("src").link(self.videomixer.get_static_pad("sink_4"))
>
>
>         self.videomixer.link(self.xvimagesink)
>         self.pipeline.set_state(Gst.State.PLAYING)
>         mainloop.run()
>
> if __name__ == "__main__":
>      app = VideoBox()
>      signal.signal(signal.SIGINT, signal.SIG_DFL)
>      exit_status = app.run(sys.argv)
>      sys.exit(exit_status)
>
>
>
>
> Can you or someone else help me??
decodebin has sometimes source pads, meaning that they won't exist until 
the stream has started and decodebin has decided to add them. Because of 
that you can't just link with decodebin.link(someelement) as there is no 
pad to link and it will return an error (it is recommended to check the 
return of those functions).

Check the documentation for the dynamic pads, you need to register a 
callback on the pad-added signal and link from there. There should be 
plenty of examples available on the internet for this. The documentation 
should also include one (in C), but that is translatable to the the 
python bindings.

Regards,
>
> thanks
> Giacomo
>
>
>
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/How-can-I-create-a-mosaic-in-Gstreamer-How-can-I-set-sink-0-xpos-0-sink-0-ypos-0-sink-0-alpha-0-in-P-tp4672943p4672994.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


-- 
Thiago Sousa Santos
Senior Multimedia Engineer, Open Source Group
Samsung Research America - Silicon Valley



More information about the gstreamer-devel mailing list