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
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
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
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