Example #1
0
class Rtcp(object):
    """
    RFC 3605 (http://www.rfc-editor.org/rfc/rfc3605.txt)
    Real Time Control Protocol (RTCP) attribute in Session Description Protocol (SDP)
    """
    def __init__(self, attributes):
        assert type(attributes) is AttributeCollection
        self.__attributes = attributes
        rtcps = attributes.get("rtcp")
        assert len(rtcps) < 2
        self.__rtcp_attribute = rtcps[0] if len(rtcps) == 1 else None

    def __nonzero__(self):
        return self.__rtcp_attribute is not None

    @property
    def port(self):
        return self.__rtcp_attribute.value.port if self.__rtcp_attribute else None

    @port.setter
    def port(self, port):
        assert type(port) is int
        if self.__rtcp_attribute is not None:
            self.__rtcp_attribute.value.port = port
        else:
            self.__add_attribute(port)

    @property
    def connection_address(self):
        return self.__rtcp_attribute.value.connection_address if self.__rtcp_attribute else None

    @connection_address.setter
    def connection_address(self, connection_address):
        assert type(connection_address) is str
        if self.__rtcp_attribute is not None:
            self.__rtcp_attribute.value.connection_address = connection_address
        else:
            self.__add_attribute(0, NetType.IN, AddrType.IP4,
                                 connection_address)

    def __add_attribute(self,
                        port,
                        nettype=None,
                        addrtype=None,
                        connection_address=None):
        assert self.__rtcp_attribute is None
        assert type(port) is int
        self.__rtcp_attribute = Attribute(
            "rtcp", RtcpAttribute(port, nettype, addrtype, connection_address))
        self.__attributes.append(self.__rtcp_attribute)

    def __remove_attribute(self):
        assert self.__rtcp_attribute is not None
        self.__rtcp_attribute.remove()
        self.__rtcp_attribute = None
Example #2
0
class Ptime(object):
    def __init__(self, attributes):
        assert type(attributes) is AttributeCollection
        self.__attributes = attributes
        ptimes = attributes.get("ptime")
        assert len(ptimes) < 2
        self.__ptime_attribute = ptimes[0] if len(ptimes) == 1 else None

    def __nonzero__(self):
        return self.__ptime_attribute is not None

    @property
    def packet_time(self):
        return self.__ptime_attribute.value.packet_time if self.__ptime_attribute else None

    @packet_time.setter
    def packet_time(self, packet_time):
        assert packet_time is None or type(packet_time) is int
        if packet_time is not None:
            self.__set_packet_time(packet_time)
        else:
            self.__remove_packet_time()

    def __set_packet_time(self, packet_time):
        assert type(packet_time) is int
        if self.__ptime_attribute is not None:
            self.__ptime_attribute.value.packet_time = packet_time
        else:
            self.__ptime_attribute = Attribute("ptime",
                                               PtimeValue(packet_time))
            self.__attributes.append(self.__ptime_attribute)

    def __remove_packet_time(self):
        if self.__ptime_attribute is not None:
            self.__ptime_attribute.remove()
            self.__ptime_attribute = None
Example #3
0
class Mid(object):
    def __init__(self, attributes):
        assert type(attributes) is AttributeCollection
        self.__attributes = attributes
        mids = self.__attributes.get("mid")
        if len(mids) > 1:
            raise SemanticError("More than one mid attribute")
        self.__attribute = mids[0] if len(mids) == 1 else None

    @property
    def value(self):
        return self.__attribute.value.value if self.__attribute else None

    @value.setter
    def value(self, value):
        assert value is None or type(value) is str
        if value is not None:
            self.__set_attribute(value)
        else:
            self.__remove_attribute()

    def __nonzero__(self):
        return self.value is not None

    def __set_attribute(self, value):
        assert type(value) is str
        if self.__attribute is None:
            self.__attribute = Attribute("mid", RawMid(value))
            self.__attribute.appendTo(self.__attributes)
        else:
            self.__attribute.value.value = value

    def __remove_attribute(self):
        if self.__attribute is not None:
            self.__attribute.remove()
            self.__attribute = None
Example #4
0
class RtcpMux(object):
    """
    RFC 5761
    Multiplexing RTP Data and Control Packets on a Single Port
    """
    def __init__(self, attributes):
        assert type(attributes) is AttributeCollection
        self.__attributes = attributes
        rtcpmuxs = attributes.get("rtcp-mux")
        assert len(rtcpmuxs) < 2
        self.__rtcpmux_attribute = rtcpmuxs[0] if len(rtcpmuxs) == 1 else None

    def __nonzero__(self):
        return self.value

    @property
    def value(self):
        return self.__rtcpmux_attribute is not None

    @value.setter
    def value(self, value):
        assert type(value) is bool
        if self.__rtcpmux_attribute is None and value:
            self.__add_attribute()
        elif self.__rtcpmux_attribute is not None and not value:
            self.__remove_attribute()

    def __add_attribute(self):
        assert self.__rtcpmux_attribute is None
        self.__rtcpmux_attribute = Attribute("rtcp-mux", RtcpMuxAttribute())
        self.__attributes.append(self.__rtcpmux_attribute)

    def __remove_attribute(self):
        assert self.__rtcpmux_attribute is not None
        self.__rtcpmux_attribute.remove()
        self.__rtcpmux_attribute = None