examples/gstplay/videoplayer.py: New example, simple video player embedded in a gtk...
authorJohan Dahlin <johan@gnome.org>
Tue, 6 Apr 2004 12:38:18 +0000 (12:38 +0000)
committerJohan Dahlin <johan@gnome.org>
Tue, 6 Apr 2004 12:38:18 +0000 (12:38 +0000)
Original commit message from CVS:
* examples/gstplay/videoplayer.py: New example, simple video
player embedded in a gtk+ widget.

ChangeLog
examples/gstplay/videoplayer.py [new file with mode: 0755]

index 5f55225..eef9e41 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-04-06  Johan Dahlin  <johan@gnome.org>
+
+       * examples/gstplay/videoplayer.py: New example, simple video
+       player embedded in a gtk+ widget.
+
 2004-03-31  Johan Dahlin  <johan@gnome.org>
 
        * configure.ac (ACLOCAL): Bump version
diff --git a/examples/gstplay/videoplayer.py b/examples/gstplay/videoplayer.py
new file mode 100755 (executable)
index 0000000..3305ee3
--- /dev/null
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+import sys
+
+import pygtk
+pygtk.require('2.0')
+
+import gtk
+import gst.play
+import gst.interfaces
+
+class Player(gtk.Window):
+    def __init__(self):
+        gtk.Window.__init__(self)
+        self.connect('delete-event', self.delete_event_cb)
+        self.set_size_request(640, 480)
+        vbox = gtk.VBox()
+        self.add(vbox)
+
+        accelgroup = gtk.AccelGroup()
+        self.add_accel_group(accelgroup)
+
+        self.item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accelgroup)
+        
+        menu_items = [
+            ('/_File',      None,         None,         0, '<Branch>' ),
+            ('/File/_Open', '<control>O', self.file_open_cb, 0, ''),
+            ('/File/sep1',  None,         None,         0, '<Separator>'),
+            ('/File/_Quit', '<control>Q', self.file_quit_cb, 0, ''),
+            ]
+        self.item_factory.create_items(menu_items)
+
+        menubar = self.item_factory.get_widget('<main>')
+        vbox.pack_start(menubar, expand=False)
+
+        self.player = PlayerWidget(self)
+        vbox.pack_start(self.player, expand=True)
+
+        hbox = gtk.HBox()
+        vbox.pack_start(hbox, expand=False)
+
+        button = gtk.Button('Play')
+        button.connect('clicked', self.play_clicked_cb)
+        hbox.pack_start(button, expand=False)
+        button.set_size_request(120, -1)
+        button.set_border_width(5)
+        self.play_button = button
+        
+        button = gtk.Button('Stop')
+        button.connect('clicked', self.stop_clicked_cb)
+        hbox.pack_start(button, expand=False)
+        button.set_size_request(120, -1)
+        button.set_border_width(5)
+        self.stop_button = button
+
+    def file_open_cb(self, button, event):
+        fs = gtk.FileSelection('Open a file')
+        response = fs.run()
+        if response == gtk.RESPONSE_OK:
+            self.player.set_filename(fs.get_filename())
+        fs.destroy()
+        self.player.play()
+        self.play_button.set_label('Pause')
+            
+    def file_quit_cb(self, button, event):
+        gst.main_quit()
+    
+    def play_clicked_cb(self, button):
+        if self.player.is_playing():
+            self.player.pause()
+            button.set_label('Play')
+        else:
+            self.player.play()
+            button.set_label('Pause')
+            
+    def stop_clicked_cb(self, button):
+        self.player.stop()
+        
+    def delete_event_cb(self, *args):
+        self.player.stop()
+        gst.main_quit()
+
+class PlayerWidget(gtk.DrawingArea):
+    def __init__(self, parent):
+        self.parentw = parent
+        gtk.DrawingArea.__init__(self)
+        self.connect('destroy', self.destroy_cb)
+        self.connect_after('realize', self.after_realize_cb)
+        self.set_size_request(400, 400)
+        self.player = gst.play.Play()
+        self.player.connect('eos', lambda p: gst.main_quit())
+
+        self.imagesink = gst.Element('xvimagesink')
+        
+        # Setup source and sinks
+        self.player.set_data_src(gst.Element('filesrc'))
+        self.player.set_audio_sink(gst.Element('osssink'))
+        self.player.set_video_sink(self.imagesink)
+
+    def destroy_cb(self, da):
+        overlay = gst.interfaces.XOverlay(self.imagesink)
+        overlay.set_xwindow_id(0L)
+
+    def after_realize_cb(self, window):
+        # Sort of a hack, but it works for now.
+        gtk.idle_add(self.idler)
+
+    def idler(self):
+        overlay = gst.interfaces.XOverlay(self.imagesink)
+        overlay.set_xwindow_id(self.window.xid)
+        
+    def stop(self):
+        self.player.set_state(gst.STATE_NULL)
+
+    def play(self):
+        overlay = gst.interfaces.XOverlay(self.imagesink)
+        overlay.set_xwindow_id(self.window.xid)
+        self.player.set_state(gst.STATE_PLAYING)
+
+    def pause(self):
+        self.player.set_state(gst.STATE_PAUSED)
+
+    def is_playing(self):
+        return self.player.get_state() == gst.STATE_PLAYING
+    
+    def set_filename(self, filename):
+        self.player.set_location(filename)
+
+player = Player()
+player.show_all()
+gst.main()