[telepathy-ashes/master] Echoes sound rather than using testsrc. Video still doesn't work.

David Laban david.laban at collabora.co.uk
Thu Sep 24 16:46:44 PDT 2009


---
 ashes/tools/media_echoer.py |   63 +++++++++++++++++++++++++++++++++++++-----
 1 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/ashes/tools/media_echoer.py b/ashes/tools/media_echoer.py
index 8428b5d..ef1a9a3 100644
--- a/ashes/tools/media_echoer.py
+++ b/ashes/tools/media_echoer.py
@@ -49,20 +49,23 @@ class MediaChannelEchoer(ContactAcceptor):
             self.tfchannel.bus_message(message)
         return True
 
-    def src_pad_added(self, stream, pad, codec):
+    def src_pad_added(self, stream, srcpad, codec):
         """
         Connects up incoming media to the outgoing media pad.
         """
         print green("Accepting, (and throwing away) incoming audio/video.")
         type = stream.get_property ("media-type")
         if type == farsight.MEDIA_TYPE_AUDIO:
-            sink = gst.parse_bin_from_description("audioconvert ! audioresample ! audioconvert ! testsink", True)
+            pipe = gst.parse_bin_from_description("audioconvert ! audioresample ! audioconvert", True)
         elif type == farsight.MEDIA_TYPE_VIDEO:
-            sink = gst.parse_bin_from_description("ffmpegcolorspace ! videoscale ! testsink", True)
+            pipe = gst.parse_bin_from_description("ffmpegcolorspace ! videoscale", True)
 
-        self.pipeline.add(sink)
-        pad.link(sink.get_pad("sink"))
-        sink.set_state(gst.STATE_PLAYING)
+        sinkpad = stream.get_property("sink-pad")
+
+        self.pipeline.add(pipe)
+        srcpad.link(pipe.get_pad("sink"))
+        pipe.get_pad("src").link(sinkpad)
+        pipe.set_state(gst.STATE_PLAYING)
 
     def stream_created(self, channel, stream):
         """
@@ -71,7 +74,9 @@ class MediaChannelEchoer(ContactAcceptor):
         """
         stream.connect("src-pad-added", self.src_pad_added)
         print green('Sending test sound/video')
-        srcpad = stream.get_property("sink-pad")
+
+        return # Skip the rest of this.
+        sinkpad = stream.get_property("sink-pad")
 
         type = stream.get_property ("media-type")
 
@@ -83,9 +88,37 @@ class MediaChannelEchoer(ContactAcceptor):
             src.set_property("is-live", True)
 
         self.pipeline.add(src)
-        src.get_pad("src").link(srcpad)
+        src.get_pad("src").link(sinkpad)
         src.set_state(gst.STATE_PLAYING)
 
+    def make_video_source(self):
+        bin = gst.Bin()
+        if os.environ.has_key("VIDEO_DEVICE"):
+            source = gst.element_factory_make("v4l2src")
+            source.set_property("device", os.environ["VIDEO_DEVICE"])
+        else:
+            source = gst.element_factory_make("videotestsrc")
+            source.set_property("is-live", True)
+
+        bin.add(source)
+
+        filter = gst.element_factory_make("capsfilter")
+        filter.set_property("caps",
+          gst.Caps("video/x-raw-yuv,width=320,height=240," + \
+            "framerate=(fraction)30/1"))
+        bin.add(filter)
+        source.link(filter)
+
+        rate = gst.element_factory_make("fsvideoanyrate")
+        bin.add(rate)
+        filter.link(rate)
+
+        pad = gst.GhostPad("src", rate.get_pad("src"))
+        bin.add_pad(pad)
+
+        return bin
+
+
     def session_created(self, channel, conference, participant):
         """
         #todo: work out why we add conference to the pipeline.
@@ -93,6 +126,20 @@ class MediaChannelEchoer(ContactAcceptor):
         print green("Adding conference to the pipeline")
         self.pipeline.add(conference)
         self.pipeline.set_state(gst.STATE_PLAYING)
+        notifier = farsight.ElementAddedNotifier()
+        notifier.connect("element-added", self.element_added_cb)
+        notifier.add(self.pipeline)
+
+    def element_added_cb(self, notifier, bin, element):
+        if element.get_factory().get_name() == "x264enc":
+            element.set_property("byte-stream", True)
+            element.set_property("bframes", 0)
+            element.set_property("b-adapt", False)
+            element.set_property("cabac", False)
+            element.set_property("dct8x8", False)
+        elif element.get_factory().get_name() == "gstrtpbin":
+            element.set_property("latency", 100)
+
 
 
     def stream_get_codec_config(self, channel, stream_id, media_type, direction):
-- 
1.5.6.5



More information about the telepathy-commits mailing list