initail commit
authorAsbjørn Sloth Tønnesen <asbjorn@ahead.com>
Thu, 25 Mar 2010 17:02:20 +0000 (17:02 +0000)
committerAsbjørn Sloth Tønnesen <asbjorn@ahead.com>
Thu, 25 Mar 2010 17:02:20 +0000 (17:02 +0000)
.gitignore [new file with mode: 0644]
src/main.glade [new file with mode: 0644]
src/talkcutter.py [new file with mode: 0755]
src/videoplayer.py [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..0d20b64
--- /dev/null
@@ -0,0 +1 @@
+*.pyc
diff --git a/src/main.glade b/src/main.glade
new file mode 100644 (file)
index 0000000..f77d5fd
--- /dev/null
@@ -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">&#x25CF;</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">&#x25CF;</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">&#x25CF;</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 (executable)
index 0000000..bf91923
--- /dev/null
@@ -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 (file)
index 0000000..04f0f80
--- /dev/null
@@ -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)
+
+
+