diff options
author | Aleksey Lim <alsroot@member.fsf.org> | 2009-04-20 23:18:23 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-04-20 23:19:18 (GMT) |
commit | 88f2a5f3c2834f508a19f7cc8a4ec5a8ea2b0916 (patch) | |
tree | 2760f47677ca16dff8b0344572f3da8560849738 /gplay.py | |
parent | 2e08c002759d09e31d13b96de02490d467da4e16 (diff) |
Rewrite glive.py
* Use uuid and do not md5 video files
* Fallback to ximagesink if xvimagesink is unaccessible
* Use one pass for encodings
* Remove glivex and add thumb_play to glive
Diffstat (limited to 'gplay.py')
-rw-r--r-- | gplay.py | 88 |
1 files changed, 34 insertions, 54 deletions
@@ -32,54 +32,38 @@ import gobject import time gobject.threads_init() +import logging +logger = logging.getLogger('record:gplay.py') + import record class Gplay: - def __init__(self): + def __init__(self, ca): + self.ca = ca self.window = None self.players = [] self.playing = False - self.nextMovie() - - def nextMovie(self): - if ( len(self.players) > 0 ): - self.playing = False - self.getPlayer().set_property("video-sink", None) - self.getPlayer().get_bus().disconnect(self.SYNC_ID) - self.getPlayer().get_bus().remove_signal_watch() - self.getPlayer().get_bus().disable_sync_message_emission() - - player = gst.element_factory_make("playbin", "playbin") - xis = gst.element_factory_make("xvimagesink", "xvimagesink") - player.set_property("video-sink", xis) - bus = player.get_bus() - bus.enable_sync_message_emission() - bus.add_signal_watch() - self.SYNC_ID = bus.connect('sync-message::element', self.onSyncMessage) - self.players.append(player) + self.player = gst.element_factory_make('playbin') - def getPlayer(self): - return self.players[len(self.players)-1] - - - def onSyncMessage(self, bus, message): - if message.structure is None: - return True - if message.structure.get_name() == 'prepare-xwindow-id': - self.window.set_sink(message.src) - message.src.set_property('force-aspect-ratio', True) - return True + bus = self.player.get_bus() + bus.enable_sync_message_emission() + bus.add_signal_watch() + bus.connect('message', self._onMessageCb) + def _onMessageCb(self, bus, message): + if message.type == gst.MESSAGE_ERROR: + err, debug = message.parse_error() + logger.error('_onMessageCb: error=%s debug=%s' % (err, debug)) def setLocation(self, location): - if (self.getPlayer().get_property('uri') == location): + if (self.player.get_property('uri') == location): self.seek(gst.SECOND*0) return - self.getPlayer().set_state(gst.STATE_READY) - self.getPlayer().set_property('uri', location) + self.player.set_state(gst.STATE_READY) + self.player.set_property('uri', location) ext = location[len(location)-3:] record.Record.log.debug("setLocation: ext->"+str(ext)) if (ext == "jpg"): @@ -89,12 +73,12 @@ class Gplay: def queryPosition(self): "Returns a (position, duration) tuple" try: - position, format = self.getPlayer().query_position(gst.FORMAT_TIME) + position, format = self.player.query_position(gst.FORMAT_TIME) except: position = gst.CLOCK_TIME_NONE try: - duration, format = self.getPlayer().query_duration(gst.FORMAT_TIME) + duration, format = self.player.query_duration(gst.FORMAT_TIME) except: duration = gst.CLOCK_TIME_NONE @@ -103,29 +87,37 @@ class Gplay: def seek(self, location): event = gst.event_new_seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, location, gst.SEEK_TYPE_NONE, 0) - res = self.getPlayer().send_event(event) + res = self.player.send_event(event) if res: - self.getPlayer().set_new_stream_time(0L) + self.player.set_new_stream_time(0L) def pause(self): self.playing = False - self.getPlayer().set_state(gst.STATE_PAUSED) + self.player.set_state(gst.STATE_PAUSED) def play(self): + if not self.player.props.video_sink: + if self.ca.glive.fallback: + sink = gst.element_factory_make('ximagesink') + else: + sink = gst.element_factory_make('xvimagesink') + sink.props.force_aspect_ratio = True + self.player.props.video_sink = sink + + self.player.props.video_sink.set_xwindow_id(self.window.window.xid) self.playing = True - self.getPlayer().set_state(gst.STATE_PLAYING) + self.player.set_state(gst.STATE_PLAYING) def stop(self): self.playing = False - self.getPlayer().set_state(gst.STATE_NULL) - self.nextMovie() + self.player.set_state(gst.STATE_NULL) def get_state(self, timeout=1): - return self.getPlayer().get_state(timeout=timeout) + return self.player.get_state(timeout=timeout) def is_playing(self): @@ -136,19 +128,7 @@ class PlayVideoWindow(gtk.Window): def __init__(self, bgd): gtk.Window.__init__(self) - self.imagesink = None - self.modify_bg( gtk.STATE_NORMAL, bgd ) self.modify_bg( gtk.STATE_INSENSITIVE, bgd ) self.unset_flags(gtk.DOUBLE_BUFFERED) self.set_flags(gtk.APP_PAINTABLE) - - - def set_sink(self, sink): - if (self.imagesink != None): - assert self.window.xid - self.imagesink = None - del self.imagesink - - self.imagesink = sink - self.imagesink.set_xwindow_id(self.window.xid)
\ No newline at end of file |