[Telepathy-commits] [mingle/master] Use gconfvideosink

Sjoerd Simons sjoerd.simons at collabora.co.uk
Wed Dec 10 11:01:54 PST 2008


---
 mingle-client.py |   42 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/mingle-client.py b/mingle-client.py
index 62b6a7b..9ba4716 100644
--- a/mingle-client.py
+++ b/mingle-client.py
@@ -40,8 +40,24 @@ class VideoSink(gtk.DrawingArea):
         gtk.DrawingArea.__init__(self)
         self.set_double_buffered(False)
         self.set_size_request (320, 240)
-        self.sink = gst.element_factory_make("xvimagesink")
-        self.sink.set_property("force-aspect-ratio", True)
+        self.vsink = None
+        self.sink = bin = gst.Bin()
+
+        bin.connect ("element-added", self.element_added_cb)
+
+        colorspace = gst.element_factory_make("ffmpegcolorspace")
+        videoscale = gst.element_factory_make("videoscale")
+        vsink = gst.element_factory_make("gconfvideosink")
+
+        bin.add(colorspace)
+        bin.add(videoscale)
+        bin.add(vsink)
+
+        colorspace.link(videoscale)
+        videoscale.link(vsink)
+
+        bin.add_pad(gst.GhostPad("sink", colorspace.get_pad("sink")))
+
         bus = pipeline.get_bus()
         bus.enable_sync_message_emission()
         bus.connect("sync-message", self.sync_handler)
@@ -51,6 +67,19 @@ class VideoSink(gtk.DrawingArea):
 
         self.connect ("expose-event", self.expose_event)
 
+    def element_added_cb (self, bin, element):
+        if isinstance(element, gst.Bin):
+            element.connect ("element-added", self.element_added_cb)
+            for e in element.elements():
+                self.element_added_cb (element, e)
+
+        if isinstance(element, gst.interfaces.XOverlay):
+            self.vsink = element
+            try:
+                self.sink.set_property("force-aspect-ratio", True)
+            except Exception:
+                pass
+
     def expose_event(self, *args):
         if not self.exposed:
             self.exposedc.acquire()
@@ -59,16 +88,15 @@ class VideoSink(gtk.DrawingArea):
             self.exposedc.release()
 
     def sync_handler(self, bus, message):
-        if message.src == self.sink and \
+        if message.src == self.vsink and \
             message.type == gst.MESSAGE_ELEMENT and \
             message.structure.has_name("prepare-xwindow-id"):
 
-
             self.exposedc.acquire()
             while not self.exposed:
                 self.exposedc.wait()
             gtk.gdk.threads_enter()
-            self.sink.set_xwindow_id (self.window.xid)
+            self.vsink.set_xwindow_id (self.window.xid)
             gtk.gdk.threads_leave()
             self.exposedc.release()
 
@@ -93,7 +121,7 @@ class UI(gtk.Window):
         self.preview_frame = gtk.Frame("Local Preview")
         self.preview_frame.set_size_request(self.WIDTH, self.HEIGHT)
 
-        self.hbox.add(self.preview_frame)
+        self.hbox.pack_start(self.preview_frame, False, False, 3)
         self.hbox.add(self.label)
         self.conference = conference
         self.set_title(jid.userhost())
@@ -108,7 +136,7 @@ class UI(gtk.Window):
         vsink = VideoSink(self.conference)
         session.source.add(vsink.sink)
 
-        vsink.sink.set_property("sync", False)
+        #vsink.sink.set_property("sync", False)
 
         pad.link(vsink.sink.get_pad("sink"))
         vsink.sink.set_state(gst.STATE_PLAYING)
-- 
1.5.6.5



More information about the Telepathy-commits mailing list