Esempio n. 1
0
	def __init__(self, tc, sockTuple):
		self.tc = tc
		sockets, ip, rtpPort = sockTuple

		self.neh = NetworkEventHandler('udp', ip, rtpPort, createSock=False, eventType=RtpEvent.RtpEvent)
		self.rtcpNeh = NetworkEventHandler('udp', ip, rtpPort+1, createSock=False, eventType=RtpEvent.RtpEvent)

		self.neh.addSock(sockets[0])
		self.rtcpNeh.addSock(sockets[1])
 
		self.peerSdp = None
		self.srcAddr = (ip, rtpPort, self.neh.transp)
		self.srcRTCP = (ip, rtpPort+1, self.neh.transp)
		self.pt = 8
		self.timestamp = 1234567890
		self.seqno = 0
		self.ssrc = 0xDEADBEEF
Esempio n. 2
0
class RtpStream:
	""" Details of a stream of RTP, defined by our local NEH and the remote SDP """
	def __init__(self, tc, sockTuple):
		self.tc = tc
		sockets, ip, rtpPort = sockTuple

		self.neh = NetworkEventHandler('udp', ip, rtpPort, createSock=False, eventType=RtpEvent.RtpEvent)
		self.rtcpNeh = NetworkEventHandler('udp', ip, rtpPort+1, createSock=False, eventType=RtpEvent.RtpEvent)

		self.neh.addSock(sockets[0])
		self.rtcpNeh.addSock(sockets[1])
 
		self.peerSdp = None
		self.srcAddr = (ip, rtpPort, self.neh.transp)
		self.srcRTCP = (ip, rtpPort+1, self.neh.transp)
		self.pt = 8
		self.timestamp = 1234567890
		self.seqno = 0
		self.ssrc = 0xDEADBEEF

	def setPeerSdp(self, peerSdp):
		""" During renegotiation, the peer SDP may change """
		self.peerSdp = peerSdp
		if len(peerSdp.media) > 0:
			peerIp = peerSdp.media[0].c[2] if peerSdp.media[0].c else peerSdp.connection[2]
			self.dstAddr = (peerIp, int(peerSdp.media[0].m[1]), 'udp')
			self.dstRTCP = (peerIp, int(peerSdp.media[0].m[1])+1, 'udp')

	def sendTest(self, type):
		if self.peerSdp is None:
			return False
		pkt = RtpEvent.RtpEvent()
		pkt.srcAddress = self.srcAddr
		pkt.dstAddress = self.dstAddr
		if self.seqno == 0:
			mark = self.pt | 0x80
		else:
			mark = self.pt
		pkt.data = struct.pack('!BBHLL', 0x80, mark, self.seqno, self.timestamp, self.ssrc)
		if type in _payloads:
			pkt.data += _payloads[type]
			self.timestamp+=len(_payloads[type])
		self.seqno+=1
		self.neh.writeEvent(pkt)
		return True

	def sendRTCP(self):
		if self.peerSdp is None:
			return False
		pkt = RtpEvent.RtpEvent()
		pkt.srcAddress = self.srcRTCP
		pkt.dstAddress = self.dstRTCP
		pkt.data = struct.pack('!BBHLL', 0x80, 12, self.seqno, self.timestamp, self.ssrc)
		self.rtcpNeh.writeEvent(pkt)
		return True

	def recvPacket(self):
		self.neh.setReadTimeout(0.2)	# 100ms is ample for audio
		return self.neh.readEvent()

	def recvRTCPPacket(self):
		self.rtcpNeh.setReadTimeout(5)	# Longer interval for rtcp
		return self.rtcpNeh.readEvent()

	def verifyTestPacket(self, type, pkt):
		payload = pkt.data[12:]	# Fixme - parse out the header properly
		if type in _payloads:
			if payload == _payloads[type]:
				return True
		return False

	def expect(self, type=G711A_Test):
		pkt = self.recvPacket()
		if pkt is None:
			self.tc.addResult(TestCase.TC_FAILED, "No media packet received")
			return False
		elif not self.verifyTestPacket(type, pkt):
			self.tc.addResult(TestCase.TC_FAILED, "len" + str(len(pkt.data)))
			self.tc.addResult(TestCase.TC_FAILED, "Incorrect media packet")
			return False
		return True

	def expectRTCP(self):
		pkt = self.recvRTCPPacket()
		if pkt is None:
			self.tc.addResult(TestCase.TC_FAILED, "No RTCP packet received")
			return False
		return True