Advertisement
Guest User

still busted

a guest
Dec 12th, 2013
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.45 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. from os import path
  4.  
  5. import gi
  6. gi.require_version('Gst', '1.0')
  7. from gi.repository import GObject
  8.  
  9. GObject.threads_init()
  10.  
  11. from gi.repository import Gst, Gtk
  12. # Needed for window.get_xid(), xvimagesink.set_window_handle(), respectively:
  13. from gi.repository import GdkX11, GstVideo
  14.  
  15. from gi.repository import Gdk
  16.  
  17. Gst.init(None)
  18.  
  19. class Player(object):
  20.     def __init__(self):
  21.         self.win = Gtk.Window()
  22.         self.win.connect('destroy', self.quit)
  23.         self.win.set_default_size(800, 450)
  24.         self.win.set_decorated(False)
  25.         self.win.set_keep_above(True)
  26.         self.win.set_property('skip-taskbar-hint', True)
  27.  
  28.         self.drawingarea = Gtk.DrawingArea()
  29.         self.win.add(self.drawingarea)
  30.  
  31.         # Create GStreamer pipeline
  32.         print('Getting pipe')
  33.         self.pipeline = Gst.parse_launch ("v4l2src ! videoconvert ! xvimagesink")
  34.  
  35.         # Create bus to get events from GStreamer pipeline
  36.         print('Getting bus')
  37.         self.bus = self.pipeline.get_bus()
  38.         self.bus.add_signal_watch()
  39.         self.bus.connect('message::eos', self.on_eos)
  40.         self.bus.connect('message::error', self.on_error)
  41.  
  42.         # This is needed to make the video output in our DrawingArea:
  43.         self.bus.enable_sync_message_emission()
  44.         self.bus.connect('sync-message::element', self.on_sync_message)
  45.  
  46.         self.win.connect("key-press-event", self.on_keypress)
  47.         self.on_keypress_dict = {
  48.             Gdk.KEY_Escape : Gtk.main_quit,
  49.             Gdk.KEY_F1 : self.pipeline.set_state,
  50.             Gdk.KEY_F2 : self.pipeline.set_state,
  51.         }
  52.         self.state_args = {
  53.             Gdk.KEY_Escape : Gtk.main_quit,
  54.             Gdk.KEY_F1 : Gst.State.PLAYING,
  55.             Gdk.KEY_F2 : Gst.State.NULL
  56.         }
  57.  
  58.     def on_keypress(self, widget, event):
  59.         '''
  60.        A case switch statement to eliminate the
  61.        five checks kludginess
  62.        '''
  63.         print('In keypress')
  64.         if event.keyval == Gdk.KEY_F5: self.properties(widget, event)
  65.         else: self.on_keypress_dict[event.keyval](self.state_args[event.keyval])
  66.  
  67.     def properties(self, widget, event) :
  68.         self.prop_win = Gtk.Window(Gtk.WindowType.TOPLEVEL)
  69.         self.prop_win.set_title("Properties")
  70.         self.prop_win.set_size_request(320, 120)
  71.         self.prop_win.set_resizable(False)
  72.         self.prop_win.set_keep_above(True)
  73.         self.prop_win.set_property('skip-taskbar-hint', True)
  74.         self.win.connect("destroy", self.closeproperties)
  75.         vbox = Gtk.VBox(spacing=4)
  76.         hbox = Gtk.HBox(spacing=4)
  77.         hbox2 = Gtk.HBox(spacing=4)
  78.         check = Gtk.CheckButton("Pin")
  79.         check.set_active(True)
  80.         check.set_size_request(100, 35)
  81.         check.connect("clicked", self.pinning)
  82.         hbox.pack_start(check, True, True, 0)
  83.         scale = Gtk.HScale()
  84.         scale.set_range(0, 100)
  85.         scale.set_value(100)
  86.         scale.set_size_request(320, 35)
  87.         scale.connect("value-changed", self.opac_slider)
  88.         hbox.pack_start(scale, True, True, 0)
  89.         self.entry = Gtk.Entry()
  90.         self.entry2 = Gtk.Entry()
  91.         self.entry.set_text("width")
  92.         self.entry2.set_text("height")
  93.         hbox2.pack_start(self.entry, True, True, 0)
  94.         hbox2.pack_start(self.entry2, True, True, 0)
  95.         hbox3 = Gtk.HBox(spacing=4)
  96.         ok = Gtk.Button("OK")
  97.         ok.connect("clicked", self.change_size)
  98.         hbox3.pack_start(ok, True, True, 0)
  99.         exit = Gtk.Button("Exit")
  100.         exit.connect("clicked", self.closeproperties)
  101.         hbox3.pack_start(exit, True, True, 0)
  102.         vbox.pack_start(hbox, True, True, 0)
  103.         vbox.pack_start(hbox2, True, True, 0)
  104.         vbox.pack_start(hbox3, True, True, 0)
  105.         self.prop_win.add(vbox)
  106.         self.prop_win.show_all()
  107.  
  108.     def pinning(self, checkbox):
  109.         if checkbox.get_active():
  110.             self.set_keep_above(True)
  111.         else:
  112.             self.set_keep_above(False)
  113.  
  114.     def opac_slider(self, w):
  115.         self.win.set_opacity(w.get_value()/100.0)
  116.                
  117.     def change_size(self, w):
  118.         print('in change size')
  119.         width = int(self.entry.get_text())
  120.         height = int(self.entry2.get_text())
  121.         print(width)
  122.         print(height)
  123.         self.win.resize(width,height)
  124.         self.win.show_all()
  125.  
  126.     def closeproperties(self, w):
  127.         self.prop_win.hide()
  128.  
  129.     def run(self):
  130.         self.win.show_all()
  131.         # You need to get the XID after window.show_all().  You shouldn't get it
  132.         # in the on_sync_message() handler because threading issues will cause
  133.         # segfaults there.
  134.         self.xid = self.drawingarea.get_property('window').get_xid()
  135.  
  136.         print('in get_xid')
  137.         self.pipeline.set_state(Gst.State.READY)
  138.         Gtk.main()
  139.  
  140.     def quit(self, window):
  141.         self.pipeline.set_state(Gst.State.NULL)
  142.         Gtk.main_quit()
  143.  
  144.     def on_sync_message(self, bus, msg):
  145.         if msg.get_structure().get_name() == 'prepare-window-handle':
  146.             print('prepare-window-handle')
  147.             msg.src.set_window_handle(self.xid)
  148.  
  149.     def on_eos(self, bus, msg):
  150.         print('on_eos(): seeking to start of video')
  151.         self.pipeline.seek_simple(
  152.             Gst.Format.TIME,        
  153.             Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
  154.             0
  155.         )
  156.  
  157.     def on_error(self, bus, msg):
  158.         print('on_error():', msg.parse_error())
  159.  
  160.  
  161. p = Player()
  162. p.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement