From: Asbjørn Sloth Tønnesen <asbjorn@ahead.com> Date: Thu, 25 Mar 2010 17:02:20 +0000 (+0000) Subject: initail commit X-Git-Url: http://git.asbjorn.biz/?a=commitdiff_plain;h=66912d768e1245aaaf77728af7c38bf299e0bb8d;p=talkcutter.git initail commit --- 66912d768e1245aaaf77728af7c38bf299e0bb8d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/src/main.glade b/src/main.glade new file mode 100644 index 0000000..f77d5fd --- /dev/null +++ b/src/main.glade @@ -0,0 +1,419 @@ +<?xml version="1.0"?> +<glade-interface> + <!-- interface-requires gtk+ 2.8 --> + <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-local-resource-path /usr/share/icons --> + <widget class="GtkWindow" id="dMain"> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkMenuBar" id="menubar1"> + <property name="visible">True</property> + <child> + <widget class="GtkMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_File</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu1"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem1"> + <property name="label">gtk-new</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem2"> + <property name="label">gtk-open</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem3"> + <property name="label">gtk-save</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem4"> + <property name="label">gtk-save-as</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem5"> + <property name="label">gtk-quit</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Edit</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu2"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem6"> + <property name="label">gtk-cut</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem7"> + <property name="label">gtk-copy</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem8"> + <property name="label">gtk-paste</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem9"> + <property name="label">gtk-delete</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="menuitem3"> + <property name="visible">True</property> + <property name="label" translatable="yes">_View</property> + <property name="use_underline">True</property> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="menuitem4"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Help</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu3"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="imagemenuitem10"> + <property name="label">gtk-about</property> + <property name="visible">True</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHPaned" id="hpaned6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="resize">False</property> + <property name="shrink">True</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="av_boxes"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkVBox" id="video_box"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkAlignment" id="video_align"> + <property name="visible">True</property> + <child> + <widget class="GtkDrawingArea" id="video"> + <property name="visible">True</property> + <signal name="realize" handler="on_video_realize"/> + </widget> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="video_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">video filename</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="video_slider"> + <property name="visible">True</property> + <child> + <widget class="GtkHScale" id="video_seeker"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="video_spin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="width_chars">15</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkToggleButton" id="video_lock"> + <property name="label">gtk-media-pause</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="audio_box"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkLabel" id="audio_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">audio filename</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="audio_slider"> + <property name="visible">True</property> + <child> + <widget class="GtkHScale" id="audio_seeker"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="audio_spin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="width_chars">15</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkToggleButton" id="audio_lock"> + <property name="label">gtk-media-pause</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="talk_box"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkLabel" id="talk_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">talk filename</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="talk_slider"> + <property name="visible">True</property> + <child> + <widget class="GtkHScale" id="talk_seeker"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="talk_spin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="width_chars">15</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkToggleButton" id="talk_lock"> + <property name="label">gtk-media-pause</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> + </child> + </widget> + <packing> + <property name="resize">False</property> + <property name="shrink">True</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkStatusbar" id="statusbar"> + <property name="visible">True</property> + <property name="spacing">2</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/src/talkcutter.py b/src/talkcutter.py new file mode 100755 index 0000000..bf91923 --- /dev/null +++ b/src/talkcutter.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +import os +import gst, gtk, gobject +import sys +from videoplayer import videoplayer +try: + import pygtk + pygtk.require("2.0") +except: + pass +try: + import gtk + import gtk.glade +except: + print("GTK Not Availible") + sys.exit(1) + + +class TalkCutter: + + wTree = None + + def __init__( self ): + self.wTree = gtk.glade.XML( "main.glade" ) + + dic = { + "on_quit_clicked" : self.quit, + "on_video_realize" : self.on_video_realize, + } + + self.wTree.signal_autoconnect( dic ) + + self.drawingarea = self.wTree.get_widget("video") + + print self.drawingarea + + self.video = videoplayer(self) + self.video.play('file:///mnt/dl/dkuug/video/osd10/dan/dan.dv') + + print self.wTree.get_widget('dMain').show() + self.wTree.visible = True + gtk.main() + + + def on_destroy(self, window): + self.playbin.set_state(gst.STATE_NULL) + gtk.main_quit() + + def on_video_realize(self, sender): + print 'triggered' + print self.drawingarea.window.xid + + def quit(self, widget): + gtk.main_quit() + sys.exit(0) + +if __name__ == "__main__": + TalkCutter() + diff --git a/src/videoplayer.py b/src/videoplayer.py new file mode 100644 index 0000000..04f0f80 --- /dev/null +++ b/src/videoplayer.py @@ -0,0 +1,82 @@ +import os +import gst, gtk, gobject +import sys +import pygtk +import gtk +import gtk.glade + +class videoplayer: + def __init__( self, parent ): + self.parent = parent + self.wTree = parent.wTree + + self.playbin = gst.element_factory_make('playbin2') + + self.sink = gst.element_factory_make('xvimagesink') + self.sink.set_property('force-aspect-ratio', True) + self.playbin.set_property('video-sink', self.sink) + + self.bus = self.playbin.get_bus() + self.bus.add_signal_watch() + self.bus.connect("message::eos", self.on_finish) + + self.drawingarea = self.wTree.get_widget('video') + self.drawingarea.connect('realize', self.on_video_realized) + + self.spinner = self.wTree.get_widget('video_spin') + #self.spinner.connect('change-value', self.on_) + + self.seeker = self.wTree.get_widget('video_seeker') + self.seeker.set_range(0, 100) + self.seeker.set_increments(1, 10) + self.seeker.connect('change-value', self.on_seeker_change) + + self.label = self.wTree.get_widget('video_label') + + self.is_playing = False + + def play(self, uri): + self.playbin.set_property('uri', uri) + self.playbin.set_state(gst.STATE_PLAYING) + self.label.label = 'f'; + gobject.timeout_add(100, self.update_slider) + self.is_playing = True + + def on_finish(self, bus, message): + self.playbin.set_state(gst.STATE_PAUSED); + self.slider.set_value(0); + + def on_video_realized(self, sender): + self.sink.set_xwindow_id(self.drawingarea.window.xid) + + + def update_slider(self): + if not self.is_playing: + return False # cancel timeout + + try: + nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME) + duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME) + + # block seek handler so we don't seek when we set_value() + self.seeker.handler_block_by_func(self.on_seeker_change) + + self.seeker.set_range(0, float(duration_nanosecs) / gst.SECOND) + self.seeker.set_value(float(nanosecs) / gst.SECOND) + + self.seeker.handler_unblock_by_func(self.on_seeker_change) + + except gst.QueryError: + # pipeline must not be ready and does not know position + pass + + return True # continue calling every 30 milliseconds + + + def on_seeker_change(self, slider, a, b): + print 'on_seeker_change' + seek_time_secs = slider.get_value() + self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND) + + +