import sys, os import pygtk, gtk, gobject import pygst pygst.require("0.10") import gst def playIntro(): GTK_Main() gtk.gdk.threads_init() gtk.main() class GTK_Main: def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_default_size(1200, 900) self.window.show_all() self.window.fullscreen() self.window.realize() self.window.connect("destroy", gtk.main_quit, "WM destroy") self.window.connect("key_press_event", self.OnKeyPress) self.window.connect("event_after", self.OnEventAfter) self.player = gst.Pipeline("player") source = gst.element_factory_make("filesrc", "file-source") demuxer = gst.element_factory_make("oggdemux", "demuxer") demuxer.connect("pad-added", self.demuxer_callback) self.video_decoder = gst.element_factory_make("theoradec", "video-decoder") self.audio_decoder = gst.element_factory_make("vorbisdec", "audio-decoder") audioconv = gst.element_factory_make("audioconvert", "converter") audiosink = gst.element_factory_make("autoaudiosink", "audio-output") videosink = gst.element_factory_make("autovideosink", "video-output") self.queuea = gst.element_factory_make("queue", "queuea") self.queuev = gst.element_factory_make("queue", "queuev") colorspace = gst.element_factory_make("ffmpegcolorspace", "colorspace") self.player.add(source, demuxer, self.video_decoder, self.audio_decoder, audioconv, audiosink, videosink, self.queuea, self.queuev, colorspace) gst.element_link_many(source, demuxer) gst.element_link_many(self.queuev, self.video_decoder, colorspace, videosink) gst.element_link_many(self.queuea, self.audio_decoder, audioconv, audiosink) bus = self.player.get_bus() bus.add_signal_watch() bus.enable_sync_message_emission() bus.connect("message", self.on_message) bus.connect("sync-message::element", self.on_sync_message) def play(self): #filepath = "/home/olpc/gstests/auvid.ogv" curdir = os.path.abspath(os.path.curdir) filepath = os.path.join(curdir, "resources") filepath = os.path.join(filepath, "intro.ogv") if os.path.isfile(filepath): self.player.get_by_name("file-source").set_property("location", filepath) self.player.set_state(gst.STATE_PLAYING) def stop(self): self.player.set_state(gst.STATE_NULL) #gtk.main_quit() self.window.destroy() def on_stop(self, w): self.stop() def on_message(self, bus, message): t = message.type if t == gst.MESSAGE_EOS: self.stop() elif t == gst.MESSAGE_ERROR: err, debug = message.parse_error() print "Error: %s" % err, debug self.stop() def on_sync_message(self, bus, message): if message.structure is None: return message_name = message.structure.get_name() if message_name == "prepare-xwindow-id": imagesink = message.src imagesink.set_property("force-aspect-ratio", True) imagesink.set_xwindow_id(self.window.window.xid) def demuxer_callback(self, demuxer, pad): caps = pad.get_caps() if str(caps) == "video/x-theora": qv_pad = self.queuev.get_pad("sink") pad.link(qv_pad) elif str(caps) == "audio/x-vorbis": qa_pad = self.queuea.get_pad("sink") pad.link(qa_pad) def OnEventAfter(self, widget, event): if event.type.value_name == "GDK_FOCUS_CHANGE": self.play() def OnKeyPress(self, widget, event): self.stop()