Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/olpcgames/video.py
diff options
context:
space:
mode:
authorTony 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)
commit6eb30b09566a53ef510532f2a1705d7fc22985a8 (patch)
treed52765c093219f91d07f030ed597f9491a7f8493 /olpcgames/video.py
initial commit
Diffstat (limited to 'olpcgames/video.py')
-rwxr-xr-xolpcgames/video.py71
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()
+