def test_stop(self): transport, _ = dummy_dtls_transport_pair() sender = RTCRtpSender(AudioStreamTrack(), transport) self.assertEqual(sender.kind, 'audio') self.assertEqual(sender.transport, transport) run(sender.send(RTCRtpParameters(codecs=[PCMU_CODEC]))) # clean shutdown sender.stop() run(asyncio.sleep(0))
def test_handle_rtcp_remb(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'video') run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # receive RTCP feedback REMB packet = RtcpPsfbPacket(fmt=RTCP_PSFB_APP, ssrc=1234, media_ssrc=0, fci=b'REMB\x01\x13\xf7\xa0\x96\xbe\x96\xcf') run(sender._handle_rtcp_packet(packet)) # receive RTCP feedback REMB (malformed) packet = RtcpPsfbPacket(fmt=RTCP_PSFB_APP, ssrc=1234, media_ssrc=0, fci=b'JUNK') run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_send_keyframe(self): """ Ask for a keyframe. """ queue = asyncio.Queue() async def mock_send_rtp(data): if not is_rtcp(data): await queue.put(RtpPacket.parse(data)) self.local_transport._send_rtp = mock_send_rtp sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'video') run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # wait for one packet to be transmitted, and ask for keyframe run(queue.get()) sender._send_keyframe() # wait for packet to be transmitted, then shutdown run(asyncio.sleep(0.1)) run(sender.stop())
def test_retransmit(self): """ Ask for an RTP packet retransmission. """ transport = FakeDtlsTransport() sender = RTCRtpSender(VideoStreamTrack(), transport) self.assertEqual(sender.kind, 'video') self.assertEqual(sender.transport, transport) run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # wait for one packet to be transmitted, and ask to retransmit packet = run(transport.queue.get()) run(sender._retransmit(packet.sequence_number)) # wait for packet to be retransmitted, then shutdown run(asyncio.sleep(0.5)) run(sender.stop()) # check packet was retransmitted found_rtx = False while not transport.queue.empty(): queue_packet = transport.queue.get_nowait() if queue_packet.sequence_number == packet.sequence_number: found_rtx = True self.assertTrue(found_rtx)
def test_handle_rtcp_rr(self): transport, remote = dummy_dtls_transport_pair() sender = RTCRtpSender(VideoStreamTrack(), transport) self.assertEqual(sender.kind, 'video') self.assertEqual(sender.transport, transport) run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # receive RTCP RR for packet in RtcpPacket.parse(load('rtcp_rr.bin')): run(sender._handle_rtcp_packet(packet)) # check stats report = run(sender.getStats()) self.assertTrue(isinstance(report, RTCStatsReport)) self.assertEqual(sorted([s.type for s in report.values()]), ['outbound-rtp', 'remote-inbound-rtp', 'transport']) # clean shutdown run(sender.stop())
def test_handle_rtcp_rr(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'video') run(sender.send(RTCRtpParameters(codecs=[VP8_CODEC]))) # receive RTCP RR packet = RtcpRrPacket(ssrc=1234, reports=[ RtcpReceiverInfo(ssrc=sender._ssrc, fraction_lost=0, packets_lost=0, highest_sequence=630, jitter=1906, lsr=0, dlsr=0) ]) run(sender._handle_rtcp_packet(packet)) # check stats report = run(sender.getStats()) self.assertTrue(isinstance(report, RTCStatsReport)) self.assertEqual(sorted([s.type for s in report.values()]), ['outbound-rtp', 'remote-inbound-rtp', 'transport']) # clean shutdown run(sender.stop())
def test_retransmit(self): """ Ask for an RTP packet retransmission. """ transport = FakeDtlsTransport() sender = RTCRtpSender(VideoStreamTrack(), transport) self.assertEqual(sender.kind, 'video') self.assertEqual(sender.transport, transport) run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # wait for one packet to be transmitted, and ask to retransmit packet = run(transport.queue.get()) run(sender._retransmit(packet.sequence_number)) # wait for packet to be transmitted rtx_packet = run(transport.queue.get()) self.assertEqual(rtx_packet.sequence_number, packet.sequence_number) # clean shutdown run(sender.stop())
def test_stop(self): sender = RTCRtpSender(AudioStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'audio') run(sender.send(RTCRtpParameters(codecs=[PCMU_CODEC]))) # clean shutdown run(sender.stop())
def test_stop_on_exception(self): sender = RTCRtpSender(BuggyStreamTrack(), self.local_transport) self.assertEqual(sender.kind, "audio") run(sender.send(RTCRtpParameters(codecs=[PCMU_CODEC]))) # clean shutdown run(sender.stop())
def test_handle_rtcp_pli(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, "video") run(sender.send(RTCRtpParameters(codecs=[VP8_CODEC]))) # receive RTCP feedback NACK packet = RtcpPsfbPacket(fmt=RTCP_PSFB_PLI, ssrc=1234, media_ssrc=sender._ssrc) run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_retransmit_with_rtx(self): """ Ask for an RTP packet retransmission. """ queue = asyncio.Queue() async def mock_send_rtp(data): if not is_rtcp(data): await queue.put(RtpPacket.parse(data)) self.local_transport._send_rtp = mock_send_rtp sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) sender._ssrc = 1234 sender._rtx_ssrc = 2345 self.assertEqual(sender.kind, "video") run( sender.send( RTCRtpParameters( codecs=[ VP8_CODEC, RTCRtpCodecParameters( mimeType="video/rtx", clockRate=90000, payloadType=101, parameters={"apt": 100}, ), ] ) ) ) # wait for one packet to be transmitted, and ask to retransmit packet = run(queue.get()) run(sender._retransmit(packet.sequence_number)) # wait for packet to be retransmitted, then shutdown run(asyncio.sleep(0.1)) run(sender.stop()) # check packet was retransmitted found_rtx = None while not queue.empty(): queue_packet = queue.get_nowait() if queue_packet.payload_type == 101: found_rtx = queue_packet break self.assertIsNotNone(found_rtx) self.assertEqual(found_rtx.payload_type, 101) self.assertEqual(found_rtx.ssrc, 2345) self.assertEqual(found_rtx.payload[0:2], pack("!H", packet.sequence_number))
def test_handle_rtcp_nack(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'video') run(sender.send(RTCRtpParameters(codecs=[VP8_CODEC]))) # receive RTCP feedback NACK packet = RtcpRtpfbPacket(fmt=RTCP_RTPFB_NACK, ssrc=1234, media_ssrc=sender._ssrc) packet.lost.append(7654) run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_handle_rtcp_pli(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, 'video') run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # receive RTCP feedback NACK packet = RtcpPsfbPacket(fmt=RTCP_PSFB_PLI, ssrc=1234, media_ssrc=5678) run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_handle_rtcp_nack(self): transport, remote = dummy_dtls_transport_pair() sender = RTCRtpSender(VideoStreamTrack(), transport) self.assertEqual(sender.kind, 'video') self.assertEqual(sender.transport, transport) run(sender.send(RTCRtpParameters(codecs=[ RTCRtpCodecParameters(name='VP8', clockRate=90000, payloadType=100), ]))) # receive RTCP feedback NACK packet = RtcpRtpfbPacket(fmt=RTCP_RTPFB_NACK, ssrc=1234, media_ssrc=5678) packet.lost.append(7654) run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_retransmit(self): """ Ask for an RTP packet retransmission. """ queue = asyncio.Queue() async def mock_send_rtp(data): if not is_rtcp(data): await queue.put(RtpPacket.parse(data)) self.local_transport._send_rtp = mock_send_rtp sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) sender._ssrc = 1234 self.assertEqual(sender.kind, 'video') run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # wait for one packet to be transmitted, and ask to retransmit packet = run(queue.get()) run(sender._retransmit(packet.sequence_number)) # wait for packet to be retransmitted, then shutdown run(asyncio.sleep(0.1)) run(sender.stop()) # check packet was retransmitted found_rtx = None while not queue.empty(): queue_packet = queue.get_nowait() if queue_packet.sequence_number == packet.sequence_number: found_rtx = queue_packet break self.assertIsNotNone(found_rtx) self.assertEqual(found_rtx.payload_type, 100) self.assertEqual(found_rtx.ssrc, 1234)
def test_handle_rtcp_remb(self): sender = RTCRtpSender(VideoStreamTrack(), self.local_transport) self.assertEqual(sender.kind, "video") run(sender.send(RTCRtpParameters(codecs=[VP8_CODEC]))) # receive RTCP feedback REMB packet = RtcpPsfbPacket( fmt=RTCP_PSFB_APP, ssrc=1234, media_ssrc=0, fci=pack_remb_fci(4160000, [sender._ssrc]), ) run(sender._handle_rtcp_packet(packet)) # receive RTCP feedback REMB (malformed) packet = RtcpPsfbPacket(fmt=RTCP_PSFB_APP, ssrc=1234, media_ssrc=0, fci=b"JUNK") run(sender._handle_rtcp_packet(packet)) # clean shutdown run(sender.stop())
def test_send_keyframe(self): """ Ask for a keyframe. """ transport = FakeDtlsTransport() sender = RTCRtpSender(VideoStreamTrack(), transport) self.assertEqual(sender.kind, 'video') self.assertEqual(sender.transport, transport) run( sender.send( RTCRtpParameters(codecs=[ RTCRtpCodecParameters( name='VP8', clockRate=90000, payloadType=100), ]))) # wait for one packet to be transmitted, and ask for keyframe run(transport.queue.get()) sender._send_keyframe() # wait for packet to be transmitted, then shutdown run(asyncio.sleep(0.5)) run(sender.stop())
def test_stop_before_send(self): sender = RTCRtpSender(AudioStreamTrack(), self.local_transport) run(sender.stop())
def test_stop_before_send(self): transport, _ = dummy_dtls_transport_pair() sender = RTCRtpSender(AudioStreamTrack(), transport) run(sender.stop())