Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import gst
- import gtk
- import gobject
- gobject.threads_init()
- class TestFilter(gst.Element):
- __gstdetails__ = (
- "TestFilter plugin",
- "test_filter.py",
- "Description",
- "Contact"
- )
- # src pad template: used to forward buffers
- _srctemplate = gst.PadTemplate (
- 'video_src',
- gst.PAD_SRC,
- gst.PAD_ALWAYS,
- gst.Caps('video/x-raw-yuv')
- )
- # sink pad template: used to receive buffers
- _sinktemplate = gst.PadTemplate (
- 'video_sink',
- gst.PAD_SINK,
- gst.PAD_ALWAYS,
- gst.Caps('video/x-raw-yuv')
- )
- # register pad templates
- __gsttemplates__ = (_srctemplate, _sinktemplate)
- def __init__(self):
- gst.Element.__init__(self)
- # src pad
- self.srcpad = gst.Pad(self._srctemplate, 'video_src')
- # sink pad
- self.sinkpad = gst.Pad(self._sinktemplate, 'video_sink')
- self.sinkpad.set_setcaps_function(self._sink_setcaps)
- self.sinkpad.set_chain_function(self._sink_chain)
- # add pads
- self.add_pad(self.srcpad)
- self.add_pad(self.sinkpad)
- def _sink_setcaps(self, pad, caps):
- return True
- def _sink_chain(self, pad, buf):
- # ... do analyzing stuff ...
- print('...analyzing buffer...')
- # forward buffer
- return self.srcpad.push(buf)
- gobject.type_register(TestFilter)
- if __name__=='__main__':
- def on_message(bus, message):
- if message.type == gst.MESSAGE_EOS:
- player.set_state(gst.STATE_NULL)
- elif message.type == gst.MESSAGE_ERROR:
- player.set_state(gst.STATE_NULL)
- (err, debug) = message.parse_error()
- print "Error: %s" % err, debug
- def on_sync_message(bus, message):
- if message.structure.get_name() == "prepare-xwindow-id":
- win_id = videowidget.window.xid
- imagesink = message.src
- imagesink.set_property("force-aspect-ratio", True)
- imagesink.set_xwindow_id(win_id)
- def on_delete(*args):
- player.set_state(gst.STATE_NULL)
- gtk.main_quit()
- win = gtk.Window()
- win.connect("delete_event", on_delete)
- videowidget = gtk.DrawingArea()
- videowidget.set_size_request(400, 250)
- vbox = gtk.VBox(False, 0)
- vbox.pack_start(videowidget, True, True, 0)
- win.add(vbox)
- win.show_all()
- # Setup GStreamer
- player = gst.element_factory_make("playbin", "MultimediaPlayer")
- bus = player.get_bus()
- bus.add_signal_watch()
- bus.enable_sync_message_emission()
- bus.connect("message", on_message)
- bus.connect("sync-message::element", on_sync_message)
- # create a Bin containing my own TestFilter, textoverlay and autovideosink
- testfilter = TestFilter()
- autovideosink = gst.element_factory_make('autovideosink')
- textoverlay = gst.element_factory_make('textoverlay', 'textoverlay')
- video_bin = gst.Bin()
- video_bin.add(testfilter)
- video_bin.add(textoverlay)
- video_bin.add(autovideosink)
- sink_pad = gst.GhostPad('video_sink', testfilter.get_pad('video_sink'))
- video_bin.add_pad(sink_pad)
- gst.element_link_many(testfilter, textoverlay, autovideosink)
- player.set_property('video-sink', video_bin)
- textoverlay.set_property('text', 'ABC')
- player.set_property('uri', "file:///.../somefile.avi")
- player.set_state(gst.STATE_PLAYING)
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement