diff options
author | Walter Bender <walter.bender@gmail.com> | 2011-05-08 14:48:56 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2011-05-08 14:48:56 (GMT) |
commit | 2fbb5d42128d2206f9b44e8e3f4b55e451bc05b6 (patch) | |
tree | 25429356f57871b7524235735953706cfc9bd044 | |
parent | 7301ca715dfd60a010d188472e03c5780ef79fc6 (diff) |
add movie-playing capacity
-rw-r--r-- | page.py | 22 | ||||
-rw-r--r-- | utils/gplay.py | 99 |
2 files changed, 108 insertions, 13 deletions
@@ -19,7 +19,7 @@ from gettext import gettext as _ from random import randrange -from utils.gplay import play_audio_from_file +from utils.gplay import play_audio_from_file, play_movie_from_file import logging _logger = logging.getLogger('infused-activity') @@ -488,7 +488,7 @@ class Page(): return True def _button_release_cb(self, win, event): - ''' Play a sound or jump to a card as indexed in the list. ''' + ''' Play a sound or video or jump to a card as indexed in the list. ''' win.grab_focus() if self._looking_at_word_list: @@ -507,10 +507,20 @@ class Page(): if self.page < len(self._card_data): if os.path.exists(os.path.join( os.path.abspath('.'), 'sounds', - self._sound_data[self.page])): + self._media_data[self.page])): play_audio_from_file(self, os.path.join( os.path.abspath('.'), 'sounds', - self._sound_data[self.page])) + self._media_data[self.page])) + if os.path.exists(os.path.join( + os.path.abspath('.'), 'videos', + self._media_data[self.page])): + play_movie_from_file(self, os.path.join( + os.path.abspath('.'), 'videos', + self._media_data[self.page]), + self._width - 320 * self._scale / 2.5, + GRID_CELL_SIZE + 15 * self._scale, + 80 * self._scale, + 60 * self._scale) def _keypress_cb(self, area, event): ''' No keyboard shortcuts at the moment. Perhaps jump to the page @@ -536,7 +546,7 @@ class Page(): self._card_data = [] self._color_data = [] self._msg_data = [] - self._sound_data = [] + self._media_data = [] self._word_data = [] # f = file(path, 'r') f = codecs.open(path, encoding='utf-8') @@ -565,7 +575,7 @@ class Page(): else: print 'unknown message id %s' % (words[4]) self._msg_data.append(CONSONANT) - self._sound_data.append(words[5]) + self._media_data.append(words[5]) if words[0] == '+': self._test_data = words[6] else: diff --git a/utils/gplay.py b/utils/gplay.py index 9ccf8b4..d48850f 100644 --- a/utils/gplay.py +++ b/utils/gplay.py @@ -1,10 +1,10 @@ """ - gplay.py + tagplay.py refactored based on Jukebox Activity Copyright (C) 2007 Andy Wingo <wingo@pobox.com> Copyright (C) 2007 Red Hat, Inc. Copyright (C) 2008-2010 Kushal Das <kushal@fedoraproject.org> - Copyright (C) 2010-11 Walter Bender + Copyright (C) 2010-2011 Walter Bender """ # This program is free software; you can redistribute it and/or @@ -42,29 +42,79 @@ import urllib def play_audio_from_file(lc, file_path): """ Called from Show block of audio media """ + if lc.gplay is not None and lc.gplay.player is not None: + if lc.gplay.player.playing: + lc.gplay.player.stop() + if lc.gplay.bin is not None: + lc.gplay.bin.destroy() + lc.gplay = Gplay(lc) lc.gplay.start(file_path) +def play_movie_from_file(lc, filepath, x, y, w, h): + """ Called from Show block of video media """ + if lc.gplay is not None and lc.gplay.player is not None: + if lc.gplay.player.playing: + lc.gplay.player.stop() + if lc.gplay.bin is not None: + lc.gplay.bin.destroy() + + lc.gplay = Gplay(lc, x, y, w, h) + lc.gplay.start(filepath) + + +def stop_media(lc): + """ Called from Clean block and toolbar Stop button """ + if lc.gplay == None: + return + + if lc.gplay.player is not None: + lc.gplay.player.stop() + if lc.gplay.bin != None: + lc.gplay.bin.destroy() + + lc.gplay = None + + +def media_playing(lc): + if lc.gplay == None: + return False + return lc.gplay.player.is_playing() + + class Gplay(): UPDATE_INTERVAL = 500 - def __init__(self, lc): + def __init__(self, lc, x=0, y=0, w=0, h=0): self.player = None self.uri = None self.playlist = [] self.jobjectlist = [] self.playpath = None - self.only_audio = True + if w == 0: + self.only_audio = True + else: + self.only_audio = False self.got_stream_info = False self.currentplaying = 0 + self.bin = gtk.Window() + self.videowidget = VideoWidget() + self.bin.add(self.videowidget) + self.bin.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL) + self.bin.set_decorated(False) + + self.bin.move(int(x), int(y)) + self.bin.resize(int(w), int(h)) + self.bin.show_all() + self._want_document = True def _player_eos_cb(self, widget): - pass + logging.debug('end of stream') def _player_error_cb(self, widget, message, detail): self.player.stop() @@ -173,13 +223,48 @@ class GstPlayer(gobject.GObject): self.player.props.stream_info_value_array) def _init_video_sink(self): - return + self.bin = gst.Bin() + videoscale = gst.element_factory_make('videoscale') + self.bin.add(videoscale) + pad = videoscale.get_pad('sink') + ghostpad = gst.GhostPad('sink', pad) + self.bin.add_pad(ghostpad) + videoscale.set_property('method', 0) + + caps_string = 'video/x-raw-yuv, ' + r = self.videowidget.get_allocation() + if r.width > 500 and r.height > 500: + # Sigh... xvimagesink on the XOs will scale the video to fit + # but ximagesink in Xephyr does not. So we live with unscaled + # video in Xephyr so that the XO can work right. + w = 480 + h = float(w) / float(float(r.width) / float(r.height)) + caps_string += 'width=%d, height=%d' % (w, h) + else: + caps_string += 'width=480, height=360' + + caps = gst.Caps(caps_string) + self.filter = gst.element_factory_make('capsfilter', 'filter') + self.bin.add(self.filter) + self.filter.set_property('caps', caps) + + conv = gst.element_factory_make('ffmpegcolorspace', 'conv') + self.bin.add(conv) + videosink = gst.element_factory_make('autovideosink') + self.bin.add(videosink) + gst.element_link_many(videoscale, self.filter, conv, videosink) + self.player.set_property('video-sink', self.bin) + + def pause(self): + self.player.set_state(gst.STATE_PAUSED) + self.playing = False + logging.debug('pausing player') def play(self): self.player.set_state(gst.STATE_PLAYING) self.playing = True self.error = False - # logging.debug('playing player') + logging.debug('playing player') def stop(self): self.player.set_state(gst.STATE_NULL) |