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
)
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)
31 scale
= gst
.element_factory_make("videoscale")
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
)
48 name
= caps
[0].get_name()
49 if name
.startswith('video') and not deint_sink
.is_linked():
51 print "%s (# %d) connecting %s" % (i
, _connected
, name
)
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
):
65 pipeline
= gst
.Pipeline()
66 mixer
= gst
.element_factory_make("videomixer", "mixer")
68 cs
= gst
.element_factory_make("ffmpegcolorspace")
70 sink
= gst
.element_factory_make("xvimagesink", "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
)
84 gobject
.threads_init()
85 stitch_and_convert(*sys
.argv
[1:])