try not setting caps in pad_added callback: in complains
[opo.git] / gst_convert_video.py
blob942aafb8552bf038ac30078d9ecdc491ae994553
1 #!/usr/bin/python
2 import os, sys
4 import pygst
5 pygst.require("0.10")
6 import gst
7 import gobject
11 WIDTH = 256
12 HEIGHT = 192
13 #WIDTH = 1024
14 #HEIGHT = 768
15 #SCREENS = 4
17 _connected = 0
19 def pre_mixer_pipe(pipeline, mixer, fn, i, screens):
20 uri = 'file://' + os.path.abspath(fn)
21 src = gst.element_factory_make("uridecodebin", "decoder_%d" % i)
22 src.set_property('uri', uri)
23 pipeline.add(src)
24 deinterlace = gst.element_factory_make("deinterlace")
25 pipeline.add(deinterlace)
26 vbox = gst.element_factory_make("videobox")
27 vbox.set_property('left', i * -WIDTH)
28 vbox.set_property('left', (screens - 1 - i) * -WIDTH)
29 vbox.set_property('border-alpha', 0)
30 pipeline.add(vbox)
31 scale = gst.element_factory_make("videoscale")
32 pipeline.add(scale)
33 caps = gst.Caps("video/x-raw-yuv, width=%s, height=%s" % (WIDTH, HEIGHT))
34 scale.link_filtered(vbox, caps)
35 gst.element_link_many(vbox, mixer)
36 gst.element_link_many(deinterlace, scale)
38 deint_sink = deinterlace.get_pad("sink")
39 #special callback for linking decodebin
40 fakesink = gst.element_factory_make("fakesink")
41 pipeline.add(fakesink)
44 def on_pad_added(element, pad, whatever=None):
45 print '%s pad_added: %s' %(i, pad)
46 global _connected
47 caps = pad.get_caps()
48 name = caps[0].get_name()
49 if name.startswith('video') and not deint_sink.is_linked():
50 pad.link(deint_sink)
51 print "%s (# %d) connecting %s" % (i, _connected, name)
52 _connected += 1
53 else:
54 print "%s ignoring %s" % (i, name)
55 pad.link(fakesink.get_pad("sink"))
57 src.connect('pad-added', on_pad_added)
63 def stitch_and_convert(*files):
64 screens = len(files)
65 pipeline = gst.Pipeline()
66 mixer = gst.element_factory_make("videomixer", "mixer")
67 pipeline.add(mixer)
68 cs = gst.element_factory_make("ffmpegcolorspace")
69 pipeline.add(cs)
70 sink = gst.element_factory_make("xvimagesink", "sink")
71 pipeline.add(sink)
72 gst.element_link_many(mixer, cs, sink)
74 for i, fn in enumerate(files):
75 pre_mixer_pipe(pipeline, mixer, fn, i, screens)
79 mainloop = gobject.MainLoop()
80 pipeline.set_state(gst.STATE_PLAYING)
81 mainloop.run()
84 gobject.threads_init()
85 stitch_and_convert(*sys.argv[1:])