Advertisement
Biggie

Custom gst.Element in GTK2

Jul 16th, 2014
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. import gst
  2. import gtk
  3. import gobject
  4. gobject.threads_init()
  5.  
  6. class TestFilter(gst.Element):
  7.  
  8.     __gstdetails__ = (
  9.         "TestFilter plugin",
  10.         "test_filter.py",
  11.         "Description",
  12.         "Contact"
  13.     )
  14.    
  15.     # src pad template: used to forward buffers
  16.     _srctemplate = gst.PadTemplate (
  17.         'video_src',
  18.         gst.PAD_SRC,
  19.         gst.PAD_ALWAYS,
  20.         gst.Caps('video/x-raw-yuv')
  21.     )
  22.  
  23.     # sink pad template: used to receive buffers
  24.     _sinktemplate = gst.PadTemplate (
  25.         'video_sink',
  26.         gst.PAD_SINK,
  27.         gst.PAD_ALWAYS,
  28.         gst.Caps('video/x-raw-yuv')
  29.     )
  30.    
  31.     # register pad templates
  32.     __gsttemplates__ = (_srctemplate, _sinktemplate)
  33.  
  34.     def __init__(self):  
  35.         gst.Element.__init__(self)
  36.        
  37.         # src pad
  38.         self.srcpad = gst.Pad(self._srctemplate, 'video_src')
  39.        
  40.         # sink pad
  41.         self.sinkpad = gst.Pad(self._sinktemplate, 'video_sink')
  42.         self.sinkpad.set_setcaps_function(self._sink_setcaps)
  43.         self.sinkpad.set_chain_function(self._sink_chain)
  44.        
  45.         # add pads
  46.         self.add_pad(self.srcpad)
  47.         self.add_pad(self.sinkpad)
  48.    
  49.     def _sink_setcaps(self, pad, caps):
  50.         return True
  51.    
  52.     def _sink_chain(self, pad, buf):
  53.         # ... do analyzing stuff ...
  54.         print('...analyzing buffer...')
  55.         # forward buffer
  56.         return self.srcpad.push(buf)
  57.  
  58. gobject.type_register(TestFilter)
  59.  
  60.  
  61. if __name__=='__main__':
  62.     def on_message(bus, message):
  63.         if message.type == gst.MESSAGE_EOS:
  64.             player.set_state(gst.STATE_NULL)
  65.         elif message.type == gst.MESSAGE_ERROR:
  66.           player.set_state(gst.STATE_NULL)
  67.           (err, debug) = message.parse_error()
  68.           print "Error: %s" % err, debug
  69.      
  70.     def on_sync_message(bus, message):
  71.         if message.structure.get_name() == "prepare-xwindow-id":
  72.             win_id = videowidget.window.xid
  73.             imagesink = message.src
  74.             imagesink.set_property("force-aspect-ratio", True)
  75.             imagesink.set_xwindow_id(win_id)
  76.  
  77.     def on_delete(*args):
  78.         player.set_state(gst.STATE_NULL)
  79.         gtk.main_quit()
  80.  
  81.     win = gtk.Window()
  82.     win.connect("delete_event", on_delete)
  83.     videowidget = gtk.DrawingArea()
  84.     videowidget.set_size_request(400, 250)
  85.     vbox = gtk.VBox(False, 0)
  86.     vbox.pack_start(videowidget, True, True, 0)
  87.     win.add(vbox)
  88.     win.show_all()
  89.  
  90.     # Setup GStreamer
  91.     player = gst.element_factory_make("playbin", "MultimediaPlayer")
  92.     bus = player.get_bus()
  93.     bus.add_signal_watch()
  94.     bus.enable_sync_message_emission()
  95.     bus.connect("message", on_message)
  96.     bus.connect("sync-message::element", on_sync_message)
  97.  
  98.     # create a Bin containing my own TestFilter, textoverlay and autovideosink
  99.     testfilter = TestFilter()
  100.     autovideosink = gst.element_factory_make('autovideosink')
  101.     textoverlay = gst.element_factory_make('textoverlay', 'textoverlay')
  102.     video_bin = gst.Bin()
  103.     video_bin.add(testfilter)
  104.     video_bin.add(textoverlay)
  105.     video_bin.add(autovideosink)
  106.     sink_pad = gst.GhostPad('video_sink', testfilter.get_pad('video_sink'))
  107.     video_bin.add_pad(sink_pad)
  108.     gst.element_link_many(testfilter, textoverlay, autovideosink)
  109.     player.set_property('video-sink', video_bin)
  110.  
  111.     textoverlay.set_property('text', 'ABC')
  112.  
  113.  
  114.     player.set_property('uri', "file:///.../somefile.avi")
  115.     player.set_state(gst.STATE_PLAYING)
  116.  
  117.     gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement