Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- '''
- Porting This http://sourceforge.net/projects/camdesk/?source=dlp (cool app from Mike, give him the money) following https://wiki.ubuntu.com/Novacut/GStreamer1.0
- Many things are not yet working. Broken: -video appears in new window ~ -no settings window yet
- What has been done:
- Changes folowing the porting guide
- All indents are using four spaces even on line breaks (or python3 complains)
- What needs to be done:
- somehow connect the video to widget
- settings window is broke, debug and fix
- anything else
- look for and implement new stuff (talk to creator?)
- '''
- import sys, os
- import gi
- gi.require_version('Gst', '1.0')
- from gi.repository import GObject, Gst, Gtk, Gdk
- from gi.repository import GdkX11, GstVideo
- GObject.threads_init()
- Gst.init(None)
- class CamDesk(Gtk.Window):
- '''
- The base CamDesk class
- '''
- def __init__(self):
- '''
- Case switch in python FTW
- '''
- super(CamDesk, self).__init__()
- self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
- self.set_title("CamDesk")
- self.set_decorated(False)
- #self.set_has_frame(False)
- self.set_size_request(320, 240)
- self.set_resizable(False)
- self.set_keep_above(True)
- self.set_property('skip-taskbar-hint', True)
- #Gtk.Window_set_default_icon_from_file('logo.png')
- self.connect("destroy", Gtk.main_quit)
- self.connect("key-press-event", self.on_keypress)
- vbox = Gtk.VBox(False, 0)
- self.add(vbox)
- self.movie_window = Gtk.DrawingArea()
- vbox.add(self.movie_window)
- self.show_all()
- # Set up the Gstreamer pipeline
- self.player = Gst.parse_launch ("v4l2src ! autovideosink")
- bus = self.player.get_bus()
- bus.add_signal_watch()
- bus.enable_sync_message_emission()
- bus.connect("message", self.on_message)
- bus.connect("sync-message::element", self.on_sync_message)
- def post_init(self):
- self.on_keypress_dict = {
- Gdk.KEY_Escape : Gtk.main_quit,
- Gdk.KEY_F1 : self.player.set_state,
- Gdk.KEY_F2 : self.player.set_state,
- }
- self.state_args = {
- Gdk.KEY_Escape : Gtk.main_quit,
- Gdk.KEY_F1 : Gst.State.PLAYING,
- Gdk.KEY_F2 : Gst.State.NULL
- }
- def on_keypress(self, widget, event):
- '''
- A case switch statement to eliminate the
- five checks kludginess
- '''
- print('In keypress')
- if event.keyval == Gdk.KEY_F5: self.properties(widget, event)
- else: self.on_keypress_dict[event.keyval](self.state_args[event.keyval])
- def properties(self, widget, event) :
- self.win = Gtk.Window(Gtk.WindowType.TOPLEVEL)
- self.win.set_title("Properties")
- self.win.set_size_request(320, 120)
- self.win.set_resizable(False)
- self.win.set_keep_above(True)
- self.win.set_property('skip-taskbar-hint', True)
- self.win.connect("destroy", self.closeproperties)
- vbox = Gtk.VBox(spacing=4)
- hbox = Gtk.HBox(spacing=4)
- hbox2 = Gtk.HBox(spacing=4)
- check = Gtk.CheckButton("Pin")
- check.set_active(True)
- check.set_size_request(100, 35)
- check.connect("clicked", self.pinning)
- hbox.pack_start(check, True, True, 0)
- scale = Gtk.HScale()
- scale.set_range(0, 100)
- scale.set_value(100)
- scale.set_size_request(320, 35)
- scale.connect("value-changed", self.opac_slider)
- hbox.pack_start(scale, True, True, 0)
- self.entry = Gtk.Entry()
- self.entry2 = Gtk.Entry()
- self.entry.set_text("width")
- self.entry2.set_text("height")
- hbox2.pack_start(self.entry, True, True, 0)
- hbox2.pack_start(self.entry2, True, True, 0)
- hbox3 = Gtk.HBox(spacing=4)
- ok = Gtk.Button("OK")
- ok.connect("clicked", self.change_size)
- hbox3.pack_start(ok, True, True, 0)
- exit = Gtk.Button("Exit")
- exit.connect("clicked", self.closeproperties)
- hbox3.pack_start(exit, True, True, 0)
- vbox.pack_start(hbox, True, True, 0)
- vbox.pack_start(hbox2, True, True, 0)
- vbox.pack_start(hbox3, True, True, 0)
- self.win.add(vbox)
- self.win.show_all()
- def pinning(self, checkbox):
- if checkbox.get_active():
- self.set_keep_above(True)
- else:
- self.set_keep_above(False)
- def opac_slider(self, w):
- self.set_opacity(w.get_value()/100.0)
- def change_size(self, w):
- width = int(self.entry.get_text())
- height = int(self.entry2.get_text())
- self.set_size_request(width,height)
- self.show()
- def closeproperties(self, w):
- self.win.hide()
- def on_message(self, bus, message):
- t = message.type
- if t == Gst.Message.EOS:
- self.player.set_state(Gst.State_NULL)
- self.startcam.set_label("Start")
- elif t == Gst.Message.ERROR:
- err, debug = message.parse_error()
- print("Error: %s" % err, debug)
- self.player.set_state(Gst.State_NULL)
- self.startcam.set_label("Start")
- def on_sync_message(self, bus, message):
- if message.structure is None:
- return
- message_name = message.structure.get_name()
- if message_name == "prepare-window-handle":
- # Assign the viewport
- print('Got to assign')
- self.movie_window.imagesink = message.src
- self.movie_window.imagesink.set_property("force-aspect-ratio", True)
- self.movie_window.imagesink.set_window_handle(self.movie_window.window.xid)
- camdesk = CamDesk()
- camdesk.post_init()
- #Gtk.gdk.threads_init()
- print("Got here")
- Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement