diff options
author | Tony Anderson <tony_anderson@usa.net> | 2009-06-22 14:04:24 (GMT) |
---|---|---|
committer | Tony Anderson <tony_anderson@usa.net> | 2009-06-22 14:04:24 (GMT) |
commit | 6eb30b09566a53ef510532f2a1705d7fc22985a8 (patch) | |
tree | d52765c093219f91d07f030ed597f9491a7f8493 /olpcgames/video.py |
initial commit
Diffstat (limited to 'olpcgames/video.py')
-rwxr-xr-x | olpcgames/video.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/olpcgames/video.py b/olpcgames/video.py new file mode 100755 index 0000000..2c3a842 --- /dev/null +++ b/olpcgames/video.py @@ -0,0 +1,71 @@ +"""Video widget for displaying a gstreamer pipe""" +import logging +log = logging.getLogger( 'olpcgames.video' ) +import os +import signal + +import pygtk +pygtk.require('2.0') +import gtk +import gst + +class VideoWidget(gtk.DrawingArea): + """A custom widget to render GStreamer video.""" + + def __init__(self, x=160, y=120): + super(VideoWidget, self).__init__() + self._imagesink = None + self.unset_flags(gtk.DOUBLE_BUFFERED) + self.set_size_request(x,y) + + def do_expose_event(self, event): + if self._imagesink: + self._imagesink.expose() + return False + else: + return True + + def set_sink(self, sink): + assert self.window.xid + self._imagesink = sink + self._imagesink.set_xwindow_id(self.window.xid) + +#pipe_desc = 'v4l2src ! video/x-raw-yuv,width=160,height=120 ! ffmpegcolorspace ! xvimagesink' +pipe_desc = 'v4l2src ! ffmpegcolorspace ! video/x-raw-yuv ! xvimagesink' +class Player(object): + def __init__(self, videowidget): + self._playing = False + self._videowidget = videowidget + + self._pipeline = gst.parse_launch(pipe_desc) + + bus = self._pipeline.get_bus() + bus.enable_sync_message_emission() + bus.add_signal_watch() + bus.connect('sync-message::element', self.on_sync_message) + bus.connect('message', self.on_message) + + def play(self): + if self._playing == False: + self._pipeline.set_state(gst.STATE_PLAYING) + self._playing = True + + def pause(self): + if self._playing == True: + self._pipeline.set_state(gst.STATE_PAUSED) + self._playing = False + + def on_sync_message(self, bus, message): + if message.structure is None: + return + if message.structure.get_name() == 'prepare-xwindow-id': + self._videowidget.set_sink(message.src) + + def on_message(self, bus, message): + t = message.type + if t == gst.MESSAGE_ERROR: + err, debug = message.parse_error() + log.debug("Video error: (%s) %s" ,err, debug) + self._playing = False + gtk.main_quit() + |