#!/usr/bin/env python3
from teleoprtc . info import parse_info_from_offer
def lf2crlf ( x ) :
return x . replace ( " \n " , " \r \n " )
class TestStream :
def test_double_video_tracks ( self ) :
sdp = """ v=0
o = - 3910210993 3910210993 IN IP4 0.0 .0 .0
s = -
t = 0 0
a = group : BUNDLE 0 1
a = msid - semantic : WMS *
m = video 9 UDP / TLS / RTP / SAVPF 97 98 99 100 101 102
c = IN IP4 0.0 .0 .0
a = recvonly
a = extmap : 1 urn : ietf : params : rtp - hdrext : sdes : mid
a = extmap : 2 http : / / www . webrtc . org / experiments / rtp - hdrext / abs - send - time
a = mid : 0
a = msid : e123f852 - 010 c - 4 b7b - 8761 - 71 b72fbfd013 2 b75cb0e - 6 b34 - 48 d6 - 8 bf9 - 21 b809f2e08e
a = rtcp : 9 IN IP4 0.0 .0 .0
a = rtcp - mux
a = ssrc - group : FID 1048118556 4149054509
a = ssrc : 1048118556 cname : 61992 fce - bab5 - 42 a0 - ab8c - 7112 adfb1857
a = ssrc : 4149054509 cname : 61992 fce - bab5 - 42 a0 - ab8c - 7112 adfb1857
a = rtpmap : 97 VP8 / 90000
a = rtcp - fb : 97 nack
a = rtcp - fb : 97 nack pli
a = rtcp - fb : 97 goog - remb
a = rtpmap : 98 rtx / 90000
a = fmtp : 98 apt = 97
a = rtpmap : 99 H264 / 90000
a = rtcp - fb : 99 nack
a = rtcp - fb : 99 nack pli
a = rtcp - fb : 99 goog - remb
a = fmtp : 99 level - asymmetry - allowed = 1 ; packetization - mode = 1 ; profile - level - id = 42001 f
a = rtpmap : 100 rtx / 90000
a = fmtp : 100 apt = 99
a = rtpmap : 101 H264 / 90000
a = rtcp - fb : 101 nack
a = rtcp - fb : 101 nack pli
a = rtcp - fb : 101 goog - remb
a = fmtp : 101 level - asymmetry - allowed = 1 ; packetization - mode = 1 ; profile - level - id = 42e01 f
a = rtpmap : 102 rtx / 90000
a = fmtp : 102 apt = 101
a = ice - ufrag : jxQW
a = ice - pwd : KpJ0tfaY2RxnIYpTHqPSSv
a = fingerprint : sha - 256 70 : 3 A : 2 D : 37 : 3 C : 52 : 96 : 0 E : 10 : F6 : 4 D : 7 A : EB : 18 : 38 : 1 B : FD : CA : A5 : 90 : D7 : 6 C : DA : A9 : 39 : 76 : C9 : 2 F : FB : FF : 56 : 0 C
a = setup : actpass
m = video 9 UDP / TLS / RTP / SAVPF 97 98 99 100 101 102
c = IN IP4 0.0 .0 .0
a = recvonly
a = extmap : 1 urn : ietf : params : rtp - hdrext : sdes : mid
a = extmap : 2 http : / / www . webrtc . org / experiments / rtp - hdrext / abs - send - time
a = mid : 1
a = msid : e123f852 - 010 c - 4 b7b - 8761 - 71 b72fbfd013 311 db759 - 8 d51 - 479 c - a5b4 - 5 c8d055c43ec
a = rtcp : 9 IN IP4 0.0 .0 .0
a = rtcp - mux
a = ssrc - group : FID 4096183284 2713379498
a = ssrc : 4096183284 cname : 61992 fce - bab5 - 42 a0 - ab8c - 7112 adfb1857
a = ssrc : 2713379498 cname : 61992 fce - bab5 - 42 a0 - ab8c - 7112 adfb1857
a = rtpmap : 97 VP8 / 90000
a = rtcp - fb : 97 nack
a = rtcp - fb : 97 nack pli
a = rtcp - fb : 97 goog - remb
a = rtpmap : 98 rtx / 90000
a = fmtp : 98 apt = 97
a = rtpmap : 99 H264 / 90000
a = rtcp - fb : 99 nack
a = rtcp - fb : 99 nack pli
a = rtcp - fb : 99 goog - remb
a = fmtp : 99 level - asymmetry - allowed = 1 ; packetization - mode = 1 ; profile - level - id = 42001 f
a = rtpmap : 100 rtx / 90000
a = fmtp : 100 apt = 99
a = rtpmap : 101 H264 / 90000
a = rtcp - fb : 101 nack
a = rtcp - fb : 101 nack pli
a = rtcp - fb : 101 goog - remb
a = fmtp : 101 level - asymmetry - allowed = 1 ; packetization - mode = 1 ; profile - level - id = 42e01 f
a = rtpmap : 102 rtx / 90000
a = fmtp : 102 apt = 101
a = ice - ufrag : 1234
a = ice - pwd : 1234
a = fingerprint : sha - 256 70 : 3 A : 2 D : 37 : 3 C : 52 : 96 : 0 E : 10 : F6 : 4 D : 7 A : EB : 18 : 38 : 1 B : FD : CA : A5 : 90 : D7 : 6 C : DA : A9 : 39 : 76 : C9 : 2 F : FB : FF : 56 : 0 C
a = setup : actpass """
info = parse_info_from_offer ( lf2crlf ( sdp ) )
assert info . n_expected_camera_tracks == 2
assert not info . expected_audio_track
assert not info . incoming_audio_track
assert not info . incoming_datachannel
def test_recvonly_audio ( self ) :
sdp = """ v=0
o = - 3910210904 3910210904 IN IP4 0.0 .0 .0
s = -
t = 0 0
a = group : BUNDLE 0
a = msid - semantic : WMS *
m = audio 9 UDP / TLS / RTP / SAVPF 96 0 8
c = IN IP4 0.0 .0 .0
a = recvonly
a = extmap : 1 urn : ietf : params : rtp - hdrext : sdes : mid
a = extmap : 2 urn : ietf : params : rtp - hdrext : ssrc - audio - level
a = mid : 0
a = msid : eb1d3f1a - 569 a - 465 f - b419 - 319477 bfded6 e44eecb2 - 1 a04 - 4547 - 97 d8 - 481389 f50d5b
a = rtcp : 9 IN IP4 0.0 .0 .0
a = rtcp - mux
a = ssrc : 1233332626 cname : ca4dede8 - 4994 - 4 a6d - 9 ae3 - 923 b28177ca5
a = rtpmap : 96 opus / 48000 / 2
a = rtpmap : 0 PCMU / 8000
a = rtpmap : 8 PCMA / 8000
a = ice - ufrag : 1234
a = ice - pwd : 1234
a = fingerprint : sha - 256 40 : 4 B : 14 : CF : 70 : B8 : 67 : E1 : B1 : FF : 7 E : F9 : 22 : 6 E : 60 : 7 D : 73 : B5 : 1 E : 38 : 4 B : 10 : 20 : 9 C : CD : 1 C : 47 : 02 : 52 : ED : 45 : 25
a = setup : actpass """
info = parse_info_from_offer ( lf2crlf ( sdp ) )
assert info . n_expected_camera_tracks == 0
assert info . expected_audio_track
assert not info . incoming_audio_track
assert not info . incoming_datachannel
def test_incoming_datachanel ( self ) :
sdp = """ v=0
o = - 3910211092 3910211092 IN IP4 0.0 .0 .0
s = -
t = 0 0
a = group : BUNDLE 0
a = msid - semantic : WMS *
m = application 9 DTLS / SCTP 5000
c = IN IP4 0.0 .0 .0
a = mid : 0
a = sctpmap : 5000 webrtc - datachannel 65535
a = max - message - size : 65536
a = ice - ufrag : 1234
a = ice - pwd : 1234
a = fingerprint : sha - 256 9 B : C0 : F3 : 35 : 8 E : 05 : A1 : 15 : DB : F8 : 39 : 0 E : B0 : E0 : 0 C : EB : 82 : E4 : B9 : 26 : 18 : A6 : 43 : 2 D : B9 : 9 A : 23 : 96 : 0 A : 59 : B6 : 58
a = setup : actpass """
info = parse_info_from_offer ( lf2crlf ( sdp ) )
assert info . n_expected_camera_tracks == 0
assert not info . expected_audio_track
assert not info . incoming_audio_track
assert info . incoming_datachannel