04f0f80c03386ce250a495826484b900562ecc88
[talkcutter.git] / src / videoplayer.py
1 import os
2 import gst, gtk, gobject
3 import sys
4 import pygtk
5 import gtk
6 import gtk.glade
7
8 class videoplayer:
9     def __init__( self, parent ):
10         self.parent = parent
11         self.wTree = parent.wTree
12
13         self.playbin = gst.element_factory_make('playbin2')
14
15         self.sink = gst.element_factory_make('xvimagesink')
16         self.sink.set_property('force-aspect-ratio', True)
17         self.playbin.set_property('video-sink', self.sink)
18
19         self.bus = self.playbin.get_bus()
20         self.bus.add_signal_watch()
21         self.bus.connect("message::eos", self.on_finish)
22
23         self.drawingarea = self.wTree.get_widget('video')
24         self.drawingarea.connect('realize', self.on_video_realized)
25
26         self.spinner = self.wTree.get_widget('video_spin')
27         #self.spinner.connect('change-value', self.on_)
28
29         self.seeker = self.wTree.get_widget('video_seeker')
30         self.seeker.set_range(0, 100)
31         self.seeker.set_increments(1, 10)
32         self.seeker.connect('change-value', self.on_seeker_change)
33
34         self.label = self.wTree.get_widget('video_label')
35
36         self.is_playing = False
37
38     def play(self, uri):
39         self.playbin.set_property('uri', uri)
40         self.playbin.set_state(gst.STATE_PLAYING)
41         self.label.label = 'f';
42         gobject.timeout_add(100, self.update_slider)
43         self.is_playing = True
44
45     def on_finish(self, bus, message):
46         self.playbin.set_state(gst.STATE_PAUSED);
47         self.slider.set_value(0);
48
49     def on_video_realized(self, sender):
50         self.sink.set_xwindow_id(self.drawingarea.window.xid)
51
52
53     def update_slider(self):
54         if not self.is_playing:
55             return False # cancel timeout
56
57         try:
58             nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
59             duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME)
60
61             # block seek handler so we don't seek when we set_value()
62             self.seeker.handler_block_by_func(self.on_seeker_change)
63
64             self.seeker.set_range(0, float(duration_nanosecs) / gst.SECOND)
65             self.seeker.set_value(float(nanosecs) / gst.SECOND)
66
67             self.seeker.handler_unblock_by_func(self.on_seeker_change)
68
69         except gst.QueryError:
70             # pipeline must not be ready and does not know position
71          pass
72
73         return True # continue calling every 30 milliseconds
74
75
76     def on_seeker_change(self, slider, a, b):
77         print 'on_seeker_change'
78         seek_time_secs = slider.get_value()
79         self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
80
81
82