[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