def __on_stream_get_codec_config(self, channel, stream_id, media_type, direction): """ On signal "stream-get-codec-config", we returns our codec configuration """ print print "=== %s __on_stream_get_codec_config ===" % self print if media_type == farsight.MEDIA_TYPE_VIDEO: codecs = [ farsight.Codec(farsight.CODEC_ID_ANY, "JPEG", farsight.MEDIA_TYPE_VIDEO, 0), ] if self.conn.GetProtocol() == "sip": codecs += [ farsight.Codec(farsight.CODEC_ID_DISABLE, "THEORA", farsight.MEDIA_TYPE_VIDEO, 0) ] else: codecs += [ farsight.Codec(farsight.CODEC_ID_ANY, "THEORA", farsight.MEDIA_TYPE_VIDEO, 0) ] return codecs else: return None
def send_local_codecs(self): print "Send local codecs to %s for media %s" % (self.pid, self.id) self.connect.send_codecs(self.pid, self.id, [farsight.Codec(self.connect.myid, "local_codec", self.pid, self.id)])
def codecs(self, codecs): if self.connect.myid != 1: self.connect.send_codecs(1, self.id, [farsight.Codec(self.connect.myid, "codec-name", self.pid, self.id)])
def get_codec_config(self, channel, stream_id, media_type, direction): print "got codec config" if media_type == farsight.MEDIA_TYPE_VIDEO: codecs = [ farsight.Codec(farsight.CODEC_ID_ANY, "H264", farsight.MEDIA_TYPE_VIDEO, 0) ] if self.conn.GetProtocol() == "sip": codecs += [ farsight.Codec(farsight.CODEC_ID_DISABLE, "THEORA", farsight.MEDIA_TYPE_VIDEO, 0) ] else: codecs += [ farsight.Codec(farsight.CODEC_ID_ANY, "THEORA", farsight.MEDIA_TYPE_VIDEO, 0) ] codecs += [ farsight.Codec(farsight.CODEC_ID_ANY, "H263", farsight.MEDIA_TYPE_VIDEO, 0), farsight.Codec(farsight.CODEC_ID_DISABLE, "DV", farsight.MEDIA_TYPE_VIDEO, 0), farsight.Codec(farsight.CODEC_ID_ANY, "JPEG", farsight.MEDIA_TYPE_VIDEO, 0), farsight.Codec(farsight.CODEC_ID_ANY, "MPV", farsight.MEDIA_TYPE_VIDEO, 0), ] return codecs else: return None
def convert_media_codecs(codecs, name): fscodecs = [] media_type = media_types[name] for codec in codecs: fscodec = farsight.Codec(codec.payload, codec.encoding, media_type, codec.clockrate) fscodec.optional_params = codec.params.items() fscodecs.append(fscodec) return fscodecs
def __init__(self, conference, source): self.conference = conference self.source = source self.streams = [] self.fssession = conference.new_session(source.get_type()) self.fssession.uisession = self if source.get_type() == farsight.MEDIA_TYPE_VIDEO: # We prefer H263-1998 because we know it works # We don't know if the others do work # We know H264 doesn't work for now or anything else # that needs to send config data self.fssession.set_codec_preferences( [ \ farsight.Codec(farsight.CODEC_ID_DISABLE, "THEORA", farsight.MEDIA_TYPE_VIDEO, 90000), farsight.Codec(farsight.CODEC_ID_DISABLE, "H264", farsight.MEDIA_TYPE_VIDEO, 0), farsight.Codec(farsight.CODEC_ID_ANY, "H263-1998", farsight.MEDIA_TYPE_VIDEO, 0), farsight.Codec(farsight.CODEC_ID_ANY, "H263", farsight.MEDIA_TYPE_VIDEO, 0) ]) elif source.get_type() == farsight.MEDIA_TYPE_AUDIO: self.fssession.set_codec_preferences( [ \ farsight.Codec(farsight.CODEC_ID_ANY, "PCMA", farsight.MEDIA_TYPE_AUDIO, 0), farsight.Codec(farsight.CODEC_ID_ANY, "PCMU", farsight.MEDIA_TYPE_AUDIO, 0), # The gst speexenc element breaks timestamps farsight.Codec(farsight.CODEC_ID_DISABLE, "SPEEX", farsight.MEDIA_TYPE_AUDIO, 16000), # Sadly, vorbis is not currently compatible with live streaming :-( farsight.Codec(farsight.CODEC_ID_DISABLE, "VORBIS", farsight.MEDIA_TYPE_AUDIO, 0), ]) self.sourcepad = self.source.get_src_pad() self.sourcepad.link(self.fssession.get_property("sink-pad"))
def __codecs_from_string(self, string): codecs = [] for substring in string.split("\n"): (start,end) = substring.split("|") (id, encoding_name, media_type, clock_rate, channels) = start.split(" ") codec = farsight.Codec(int(id), encoding_name, int(media_type), int(clock_rate)) codec.channels = int(channels) if len(end): codec.optional_params = \ [tuple(x.split("=",1)) for x in end.split(";") if len(x) > 0] codecs.append(codec) return codecs
pygst.require('0.10') import farsight, gst, gobject, sys loop = gobject.MainLoop() pipeline = gst.Pipeline() conference = gst.element_factory_make ("fsrtpconference") conference.set_property ("sdes-cname", sys.argv[1] + "@1.2.3.4") pipeline.add (conference) session = conference.new_session (farsight.MEDIA_TYPE_VIDEO) participant = conference.new_participant (sys.argv[2]+"@1.2.3.4") stream = session.new_stream (participant, farsight.DIRECTION_BOTH, "multicast") stream.set_remote_codecs([farsight.Codec(96, "H263-1998", farsight.MEDIA_TYPE_VIDEO, 90000)]) candidate = farsight.Candidate() candidate.ip = "224.0.0.110" candidate.port = 3442 candidate.component_id = farsight.COMPONENT_RTP candidate.proto = farsight.NETWORK_PROTOCOL_UDP candidate.type = farsight.CANDIDATE_TYPE_MULTICAST candidate.ttl = 1 candidate2 = candidate.copy() candidate2.port = 3443 candidate2.component_id = farsight.COMPONENT_RTCP stream.set_remote_candidates ([candidate, candidate2]) videosource = gst.parse_bin_from_description (sys.argv[3] + " ! videoscale", True)
def build_codecs(type): codecs = [] for args in codecs_definitions[type]: codec = farsight.Codec(*args) codecs.append(codec) return codecs
def get_codecs(self): return [farsight.Codec(self.connect.myid, "nego-codecs", self.pid, self.id)]