sdp-translator
Version:
A simple SDP interoperability layer for Unified Plan/Plan B
1,378 lines (1,317 loc) • 120 kB
JavaScript
var Interop = require('../').Interop;
if (typeof QUnit == 'undefined') {
QUnit = require('qunit-cli');
QUnit.load();
interop = require('..');
};
global.RTCSessionDescription = function (desc) {
this.type = desc.type;
this.sdp = desc.sdp;
}
global.RTCIceCandidate = function (cand) {
this.candidate = cand.candidate;
this.sdpMLineIndex = cand.sdpMLineIndex;
this.sdpMid = cand.sdpMid;
}
var dumpSDP = function (description) {
if (typeof description === 'undefined' || description === null) {
return '';
}
return 'type: ' + description.type + '\r\n' + description.sdp;
};
QUnit.test('ChromePlanB2UnifiedPlan_1track', function (assert) {
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=maxptime:60\r\n\
a=ssrc:3393882360 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:3393882360 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=ssrc:3393882360 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:3393882360 label:22345512-82de-4e55-b205-967e0249e8e0\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=ssrc-group:FID 2560713622 1733429841\r\n\
a=ssrc:2560713622 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:2560713622 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:2560713622 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:2560713622 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:1733429841 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:1733429841 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:1733429841 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:1733429841 label:9203939c-25cf-4d60-82c2-d25b19350926"
/*jshint multistr: true */
var expectedUnifiedPlan =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio-3393882360 video-1733429841\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:actpass\r\n\
a=mid:audio-3393882360\r\n\
a=msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=maxptime:60\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:3393882360 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:3393882360 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:3393882360 label:22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=rtcp-mux\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=setup:actpass\r\n\
a=mid:video-1733429841\r\n\
a=msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:1733429841 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:1733429841 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:1733429841 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:2560713622 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:2560713622 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:2560713622 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc-group:FID 2560713622 1733429841\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(offer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
});
QUnit.test('ChromePlanB2UnifiedPlan_2tracks', function (assert) {
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS 0ec45b31-e98d-49fa-b695-7631e004843a nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=maxptime:60\r\n\
a=ssrc:3393882360 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:3393882360 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=ssrc:3393882360 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:3393882360 label:22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=ssrc:2998362345 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:2998362345 msid:0ec45b31-e98d-49fa-b695-7631e004843a 96a45cea-7b24-401f-b12b-92bead3bf181\r\n\
a=ssrc:2998362345 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:2998362345 label:96a45cea-7b24-401f-b12b-92bead3bf181\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=ssrc-group:FID 2560713622 1733429841\r\n\
a=ssrc:2560713622 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:2560713622 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:2560713622 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:2560713622 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:1733429841 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:1733429841 msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:1733429841 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:1733429841 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc-group:FID 3792658351 624578865\r\n\
a=ssrc:3792658351 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:3792658351 msid:0ec45b31-e98d-49fa-b695-7631e004843a 6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=ssrc:3792658351 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:3792658351 label:6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=ssrc:624578865 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:624578865 msid:0ec45b31-e98d-49fa-b695-7631e004843a 6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=ssrc:624578865 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:624578865 label:6f961540-d5ee-46da-a5b7-b42b97211905"
/*jshint multistr: true */
var expectedUnifiedPlan =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio-2998362345 audio-3393882360 video-624578865 video-1733429841\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:actpass\r\n\
a=mid:audio-2998362345\r\n\
a=msid:0ec45b31-e98d-49fa-b695-7631e004843a 96a45cea-7b24-401f-b12b-92bead3bf181\r\n\
a=maxptime:60\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:2998362345 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:2998362345 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:2998362345 label:96a45cea-7b24-401f-b12b-92bead3bf181\r\n\
a=rtcp-mux\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:actpass\r\n\
a=mid:audio-3393882360\r\n\
a=msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=maxptime:60\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:3393882360 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:3393882360 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:3393882360 label:22345512-82de-4e55-b205-967e0249e8e0\r\n\
a=rtcp-mux\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=setup:actpass\r\n\
a=mid:video-624578865\r\n\
a=msid:0ec45b31-e98d-49fa-b695-7631e004843a 6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:624578865 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:624578865 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:624578865 label:6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=ssrc:3792658351 cname:XvUdN+mQ3KWuNJNu\r\n\
a=ssrc:3792658351 mslabel:0ec45b31-e98d-49fa-b695-7631e004843a\r\n\
a=ssrc:3792658351 label:6f961540-d5ee-46da-a5b7-b42b97211905\r\n\
a=ssrc-group:FID 3792658351 624578865\r\n\
a=rtcp-mux\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=setup:actpass\r\n\
a=mid:video-1733429841\r\n\
a=msid:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=sendrecv\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:1733429841 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:1733429841 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:1733429841 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:2560713622 cname:5YcASuDc3X86mu+d\r\n\
a=ssrc:2560713622 mslabel:nnnwYrPTpGmyoJX5GFHMVv42y1ZthbnCx26c\r\n\
a=ssrc:2560713622 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc-group:FID 2560713622 1733429841\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(offer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
/* #region Check Unified Plan candidates */
var candUnifiedPlan = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 0,
"sdpMid" : "audio-2998362345"
});
var candPlanB = interop.candidateToPlanB (candUnifiedPlan);
assert.equal(candPlanB.candidate, candUnifiedPlan.candidate, "candidate arg not matching");
assert.equal(candPlanB.sdpMid, "audio", "sdpMid arg not matching");
assert.equal(candPlanB.sdpMLineIndex, 0, "sdpMLineIndex arg not matching");
var candUnifiedPlan = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 1,
"sdpMid" : "audio-3393882360"
});
var candPlanB = interop.candidateToPlanB (candUnifiedPlan);
assert.equal(candPlanB.candidate, candUnifiedPlan.candidate, "candidate arg not matching");
assert.equal(candPlanB.sdpMid, "audio", "sdpMid arg not matching");
assert.equal(candPlanB.sdpMLineIndex, 0, "sdpMLineIndex arg not matching");
var candUnifiedPlan = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 2,
"sdpMid" : "video-624578865"
});
var candPlanB = interop.candidateToPlanB (candUnifiedPlan);
assert.equal(candPlanB.candidate, candUnifiedPlan.candidate, "candidate arg not matching");
assert.equal(candPlanB.sdpMid, "video", "sdpMid arg not matching");
assert.equal(candPlanB.sdpMLineIndex, 1, "sdpMLineIndex arg not matching");
var candUnifiedPlan = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 3,
"sdpMid" : "video-1733429841"
});
var candPlanB = interop.candidateToPlanB (candUnifiedPlan);
assert.equal(candPlanB.candidate, candUnifiedPlan.candidate, "candidate arg not matching");
assert.equal(candPlanB.sdpMid, "video", "sdpMid arg not matching");
assert.equal(candPlanB.sdpMLineIndex, 1, "sdpMLineIndex arg not matching");
/* #endregion */
/* #region Check Plan B candidates */
var candPlanB = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 0,
"sdpMid" : "audio"
});
var candUnifiedPlan = interop.candidateToUnifiedPlan (candPlanB);
assert.equal(candUnifiedPlan.candidate, candPlanB.candidate, "candidate arg not matching");
assert.equal(candUnifiedPlan.sdpMid, "audio", "sdpMid arg not matching");
assert.equal(candUnifiedPlan.sdpMLineIndex, 0, "sdpMLineIndex arg not matching");
var candPlanB = new RTCIceCandidate ({
"candidate" : "candidate:11111111 1 udp 22222222 10.0.0.1 2345 typ host generation 0",
"sdpMLineIndex" : 1,
"sdpMid" : "video"
});
var candUnifiedPlan = interop.candidateToUnifiedPlan (candPlanB);
assert.equal(candUnifiedPlan.candidate, candPlanB.candidate, "candidate arg not matching");
assert.equal(candUnifiedPlan.sdpMid, "video", "sdpMid arg not matching");
assert.equal(candUnifiedPlan.sdpMLineIndex, 2, "sdpMLineIndex arg not matching");
/* #endregion */
});
QUnit.test('sendonlyPlanB2UnifiedPlan', function (assert) {
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS MS-0\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=sendonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=ssrc:1001 cname:CN-0\r\n\
a=ssrc:1001 msid:MS-0 MST-0_0\r\n\
a=ssrc:1001 mslabel:MS-0\r\n\
a=ssrc:1001 label:MST-0_0\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=sendonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=ssrc-group:FID 2001\r\n\
a=ssrc:2001 cname:CN-0\r\n\
a=ssrc:2001 msid:MS-0 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=ssrc:2001 mslabel:MS-0\r\n\
a=ssrc:2001 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n"
/*jshint multistr: true */
var expectedUnifiedPlan =
"v=0\r\n\
o=- 6352417452822806569 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio-1001 video-2001\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=setup:actpass\r\n\
a=mid:audio-1001\r\n\
a=msid:MS-0 MST-0_0\r\n\
a=sendonly\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:1001 cname:CN-0\r\n\
a=ssrc:1001 mslabel:MS-0\r\n\
a=ssrc:1001 label:MST-0_0\r\n\
a=rtcp-mux\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=setup:actpass\r\n\
a=mid:video-2001\r\n\
a=msid:MS-0 9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=sendonly\r\n\
a=ice-ufrag:xHOGnBsKDPCmHB5t\r\n\
a=ice-pwd:qpnbhhoyeTrypBkX5F1u338T\r\n\
a=fingerprint:sha-256 58:E0:FE:56:6A:8C:5A:AD:71:5B:A0:52:47:27:60:66:27:53:EC:B6:F3:03:A8:4B:9B:30:28:62:29:49:C6:73\r\n\
a=ssrc:2001 cname:CN-0\r\n\
a=ssrc:2001 mslabel:MS-0\r\n\
a=ssrc:2001 label:9203939c-25cf-4d60-82c2-d25b19350926\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(offer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
});
QUnit.test('audioInactiveUnifiedPlan2PlanB', function (assert) {
/*jshint multistr: true */
var originUnifiedPlan =
"v=0\r\n\
o=- 3656853607 3656853607 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE video-65477720 video-774581929\r\n\
m=audio 0 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
a=inactive\r\n\
a=mid:audio-2331169307\r\n\
m=audio 0 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
a=inactive\r\n\
a=mid:audio-3362868299\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100\r\n\
b=AS:2000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=setup:active\r\n\
a=mid:video-65477720\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=ssrc:3850339357 cname:user1483941637@host-3c4150dc\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100\r\n\
b=AS:2000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=setup:active\r\n\
a=mid:video-774581929\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=ssrc:3423627266 cname:user1483941637@host-3c4150dc\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:FR3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n"
/*jshint multistr: true */
var expectedPlanB =
"v=0\r\n\
o=- 3656853607 3656853607 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio video\r\n\
m=audio 0 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
a=mid:audio\r\n\
a=inactive\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100\r\n\
b=AS:2000\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:active\r\n\
a=mid:video\r\n\
a=recvonly\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n\
a=ssrc:3423627266 cname:user1483941637@host-3c4150dc\r\n\
a=ssrc:3850339357 cname:user1483941637@host-3c4150dc\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var answer = new RTCSessionDescription({
type: 'answer',
sdp: originUnifiedPlan
});
var planBDesc = interop.toPlanB(answer);
assert.equal(planBDesc.sdp, expectedPlanB,
"Not expected Plan B output")
});
QUnit.test('1audio1videoInactivesUnifiedPlan2PlanB', function (assert) {
/*jshint multistr: true */
var originUnifiedPlan =
"v=0\r\n\
o=- 3656853607 3656853607 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio-3362868299 video-774581929\r\n\
m=audio 0 UDP/TLS/RTP/SAVPF 111 0\r\n\
a=inactive\r\n\
a=mid:audio-2331169307\r\n\
m=audio 1 UDP/TLS/RTP/SAVPF 111 0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=setup:active\r\n\
a=mid:audio-3362868299\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=maxptime:60\r\n\
a=ssrc:4147269654 cname:user1483941637@host-3c4150dc\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n\
a=inactive\r\n\
a=mid:video-65477720\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100\r\n\
b=AS:2000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=setup:active\r\n\
a=mid:video-774581929\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=ssrc:3423627266 cname:user1483941637@host-3c4150dc\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n"
/*jshint multistr: true */
var expectedPlanB =
"v=0\r\n\
o=- 3656853607 3656853607 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio video\r\n\
m=audio 1 UDP/TLS/RTP/SAVPF 111 0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:active\r\n\
a=mid:audio\r\n\
a=maxptime:60\r\n\
a=recvonly\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n\
a=ssrc:4147269654 cname:user1483941637@host-3c4150dc\r\n\
a=rtcp-mux\r\n\
m=video 1 UDP/TLS/RTP/SAVPF 100\r\n\
b=AS:2000\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:active\r\n\
a=mid:video\r\n\
a=recvonly\r\n\
a=ice-ufrag:l+rG\r\n\
a=ice-pwd:Ab5LzP5Wn5dBfC6ct6Xhg3\r\n\
a=fingerprint:sha-256 E7:70:CE:58:6A:CC:77:B0:B4:4B:F2:BC:7E:89:0D:69:E3:90:F3:7A:11:78:B1:5A:CD:E6:41:19:14:EB:56:49\r\n\
a=ssrc:3423627266 cname:user1483941637@host-3c4150dc\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var answer = new RTCSessionDescription({
type: 'answer',
sdp: originUnifiedPlan
});
var planBDesc = interop.toPlanB(answer);
assert.equal(planBDesc.sdp, expectedPlanB,
"Not expected Plan B output")
});
QUnit.test('answerChromePlanB2UnifiedPlan', function (assert) {
/*jshint multistr: true */
var originUnifiedPlan =
"v=0\r\n\
o=- 3657363455 3657363455 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=group:BUNDLE audio0 video0 video1\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-mux\r\n\
a=ssrc:3563419008 cname:user3545937947@host-98980057\r\n\
a=msid:ms 0\r\n\
a=ssrc:3563419008 mslabel:ms\r\n\
a=ssrc:3563419008 label:0\r\n\
a=ice-ufrag:Cm5n\r\n\
a=ice-pwd:n40sz+gvZaHn7jKWttb5qg\r\n\
a=fingerprint:sha-256 BF:5F:83:8D:B3:40:21:95:46:FC:F5:C1:1E:F1:C9:C2:9D:F4:A8:90:A0:F9:7C:41:CD:60:91:A7:3D:0A:F3:99\r\n\
a=mid:audio0\r\n\
m=video 1 RTP/SAVPF 99\r\n\
b=AS:2000\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-mux\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=ssrc:593546241 cname:user3545937947@host-98980057\r\n\
a=msid:ms 1\r\n\
a=ssrc:593546241 mslabel:ms\r\n\
a=ssrc:593546241 label:1\r\n\
a=ice-ufrag:Cm5n\r\n\
a=ice-pwd:n40sz+gvZaHn7jKWttb5qg\r\n\
a=fingerprint:sha-256 BF:5F:83:8D:B3:40:21:95:46:FC:F5:C1:1E:F1:C9:C2:9D:F4:A8:90:A0:F9:7C:41:CD:60:91:A7:3D:0A:F3:99\r\n\
a=mid:video0\r\n\
m=video 1 RTP/SAVPF 99\r\n\
b=AS:2000\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-mux\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=ssrc:3172327889 cname:user3545937947@host-98980057\r\n\
a=msid:ms 2\r\n\
a=ssrc:3172327889 mslabel:ms\r\n\
a=ssrc:3172327889 label:2\r\n\
a=ice-ufrag:Cm5n\r\n\
a=ice-pwd:n40sz+gvZaHn7jKWttb5qg\r\n\
a=fingerprint:sha-256 BF:5F:83:8D:B3:40:21:95:46:FC:F5:C1:1E:F1:C9:C2:9D:F4:A8:90:A0:F9:7C:41:CD:60:91:A7:3D:0A:F3:99\r\n\
a=mid:video1"
/*jshint multistr: true */
var expectedPlanB =
"v=0\r\n\
o=- 3657363455 3657363455 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio video\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:audio\r\n\
a=ice-ufrag:Cm5n\r\n\
a=ice-pwd:n40sz+gvZaHn7jKWttb5qg\r\n\
a=fingerprint:sha-256 BF:5F:83:8D:B3:40:21:95:46:FC:F5:C1:1E:F1:C9:C2:9D:F4:A8:90:A0:F9:7C:41:CD:60:91:A7:3D:0A:F3:99\r\n\
a=ssrc:3563419008 cname:user3545937947@host-98980057\r\n\
a=ssrc:3563419008 mslabel:ms\r\n\
a=ssrc:3563419008 label:0\r\n\
a=ssrc:3563419008 msid:ms 0\r\n\
a=rtcp-mux\r\n\
m=video 1 RTP/SAVPF 99\r\n\
b=AS:2000\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:video\r\n\
a=ice-ufrag:Cm5n\r\n\
a=ice-pwd:n40sz+gvZaHn7jKWttb5qg\r\n\
a=fingerprint:sha-256 BF:5F:83:8D:B3:40:21:95:46:FC:F5:C1:1E:F1:C9:C2:9D:F4:A8:90:A0:F9:7C:41:CD:60:91:A7:3D:0A:F3:99\r\n\
a=ssrc:593546241 cname:user3545937947@host-98980057\r\n\
a=ssrc:593546241 mslabel:ms\r\n\
a=ssrc:593546241 label:1\r\n\
a=ssrc:593546241 msid:ms 1\r\n\
a=ssrc:3172327889 cname:user3545937947@host-98980057\r\n\
a=ssrc:3172327889 mslabel:ms\r\n\
a=ssrc:3172327889 label:2\r\n\
a=ssrc:3172327889 msid:ms 2\r\n\
a=rtcp-mux\r\n"
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 590499500270831419 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS\r\n\
m=audio 9 RTP/SAVPF 96 0\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:D/SIZC9xg+MActHq\r\n\
a=ice-pwd:0AJ690SNxw0UHVNmIZDEBHQy\r\n\
a=fingerprint:sha-256 D2:7A:84:32:AE:19:4A:C0:96:33:36:61:81:F2:BD:2C:57:9E:79:EE:56:5B:1D:19:37:E4:AC:ED:70:C8:79:72\r\n\
a=setup:active\r\n\
a=mid:audio\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=fmtp:96 minptime=10; useinbandfec=1\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=maxptime:60\r\n\
m=video 9 RTP/SAVPF 99\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:D/SIZC9xg+MActHq\r\n\
a=ice-pwd:0AJ690SNxw0UHVNmIZDEBHQy\r\n\
a=fingerprint:sha-256 D2:7A:84:32:AE:19:4A:C0:96:33:36:61:81:F2:BD:2C:57:9E:79:EE:56:5B:1D:19:37:E4:AC:ED:70:C8:79:72\r\n\
a=setup:active\r\n\
a=mid:video\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb"
/*jshint multistr: true */
var expectedUnifiedPlan =
"v=0\r\n\
o=- 590499500270831419 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio0 video0 video1\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:audio0\r\n\
a=recvonly\r\n\
a=ice-ufrag:D/SIZC9xg+MActHq\r\n\
a=ice-pwd:0AJ690SNxw0UHVNmIZDEBHQy\r\n\
a=fingerprint:sha-256 D2:7A:84:32:AE:19:4A:C0:96:33:36:61:81:F2:BD:2C:57:9E:79:EE:56:5B:1D:19:37:E4:AC:ED:70:C8:79:72\r\n\
a=rtcp-mux\r\n\
m=video 1 RTP/SAVPF 99\r\n\
b=AS:2000\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:video0\r\n\
a=recvonly\r\n\
a=ice-ufrag:D/SIZC9xg+MActHq\r\n\
a=ice-pwd:0AJ690SNxw0UHVNmIZDEBHQy\r\n\
a=fingerprint:sha-256 D2:7A:84:32:AE:19:4A:C0:96:33:36:61:81:F2:BD:2C:57:9E:79:EE:56:5B:1D:19:37:E4:AC:ED:70:C8:79:72\r\n\
a=rtcp-mux\r\n\
m=video 1 RTP/SAVPF 99\r\n\
b=AS:2000\r\n\
a=rtpmap:99 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:99 ccm fir\r\n\
a=rtcp-fb:99 nack\r\n\
a=rtcp-fb:99 nack pli\r\n\
a=rtcp-fb:99 goog-remb\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:video1\r\n\
a=recvonly\r\n\
a=ice-ufrag:D/SIZC9xg+MActHq\r\n\
a=ice-pwd:0AJ690SNxw0UHVNmIZDEBHQy\r\n\
a=fingerprint:sha-256 D2:7A:84:32:AE:19:4A:C0:96:33:36:61:81:F2:BD:2C:57:9E:79:EE:56:5B:1D:19:37:E4:AC:ED:70:C8:79:72\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originUnifiedPlan
});
var planBDesc = interop.toPlanB(offer);
assert.equal(planBDesc.sdp, expectedPlanB,
"Not expected Plan B output")
var answer = new RTCSessionDescription({
type: 'answer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(answer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
});
QUnit.test('answerChromeAsSenderPlanB2UnifiedPlan', function (assert) {
/*jshint multistr: true */
var originUnifiedPlan =
"v=0\r\n\
o=- 3662296925 3662296925 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=group:BUNDLE audio0 video0\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-mux\r\n\
a=mid:audio0\r\n\
a=ssrc:2436440562 cname:user3751582401@host-766297e3\r\n\
a=msid:ms-0 0\r\n\
a=ssrc:2436440562 mslabel:ms-0\r\n\
a=ssrc:2436440562 label:0\r\n\
a=ice-ufrag:ABVj\r\n\
a=ice-pwd:kWL7Ao3kOEU5iqyUfysrYv\r\n\
a=fingerprint:sha-256 3D:2C:7D:F6:55:E8:77:E2:4D:51:F2:88:7F:28:DA:F0:8A:6A:59:62:77:05:19:25:CC:9A:9D:7F:98:98:84:AE\r\n\
m=video 1 RTP/SAVPF 97\r\n\
b=AS:2000\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=rtpmap:97 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-mux\r\n\
a=mid:video0\r\n\
a=rtcp-fb:97 nack\r\n\
a=rtcp-fb:97 nack pli\r\n\
a=rtcp-fb:97 goog-remb\r\n\
a=rtcp-fb:97 ccm fir\r\n\
a=ssrc:757911244 cname:user3751582401@host-766297e3\r\n\
a=msid:ms-0 1\r\n\
a=ssrc:757911244 mslabel:ms-0\r\n\
a=ssrc:757911244 label:1\r\n\
a=ice-ufrag:ABVj\r\n\
a=ice-pwd:kWL7Ao3kOEU5iqyUfysrYv\r\n\
a=fingerprint:sha-256 3D:2C:7D:F6:55:E8:77:E2:4D:51:F2:88:7F:28:DA:F0:8A:6A:59:62:77:05:19:25:CC:9A:9D:7F:98:98:84:AE\r\n"
/*jshint multistr: true */
var expectedPlanB =
"v=0\r\n\
o=- 3662296925 3662296925 IN IP4 0.0.0.0\r\n\
s=Kurento Media Server\r\n\
c=IN IP4 0.0.0.0\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio video\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:audio\r\n\
a=ice-ufrag:ABVj\r\n\
a=ice-pwd:kWL7Ao3kOEU5iqyUfysrYv\r\n\
a=fingerprint:sha-256 3D:2C:7D:F6:55:E8:77:E2:4D:51:F2:88:7F:28:DA:F0:8A:6A:59:62:77:05:19:25:CC:9A:9D:7F:98:98:84:AE\r\n\
a=ssrc:2436440562 cname:user3751582401@host-766297e3\r\n\
a=ssrc:2436440562 mslabel:ms-0\r\n\
a=ssrc:2436440562 label:0\r\n\
a=ssrc:2436440562 msid:ms-0 0\r\n\
a=rtcp-mux\r\n\
m=video 1 RTP/SAVPF 97\r\n\
b=AS:2000\r\n\
a=rtpmap:97 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:97 nack\r\n\
a=rtcp-fb:97 nack pli\r\n\
a=rtcp-fb:97 goog-remb\r\n\
a=rtcp-fb:97 ccm fir\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:video\r\n\
a=ice-ufrag:ABVj\r\n\
a=ice-pwd:kWL7Ao3kOEU5iqyUfysrYv\r\n\
a=fingerprint:sha-256 3D:2C:7D:F6:55:E8:77:E2:4D:51:F2:88:7F:28:DA:F0:8A:6A:59:62:77:05:19:25:CC:9A:9D:7F:98:98:84:AE\r\n\
a=ssrc:757911244 cname:user3751582401@host-766297e3\r\n\
a=ssrc:757911244 mslabel:ms-0\r\n\
a=ssrc:757911244 label:1\r\n\
a=ssrc:757911244 msid:ms-0 1\r\n\
a=rtcp-mux\r\n"
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 7577719950547761212 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu\r\n\
m=audio 9 RTP/SAVPF 96 0\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:eeAaTQp8Bz2m5EIr\r\n\
a=ice-pwd:JshDr8jaKU92bdj1IvSNQxnD\r\n\
a=fingerprint:sha-256 C0:15:C5:18:E4:86:EE:84:B9:05:F2:F8:A2:0F:87:E7:C8:CF:93:66:C3:F3:F6:85:E4:0F:B5:84:AD:A2:75:B2\r\n\
a=setup:active\r\n\
a=mid:audio\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=fmtp:96 minptime=10; useinbandfec=1\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=maxptime:60\r\n\
a=ssrc:2408808671 cname:AAzXxskrCZzvzGxA\r\n\
a=ssrc:2408808671 msid:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu 46fbfa41-04c5-450b-9884-9720e0f65e12\r\n\
a=ssrc:2408808671 mslabel:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu\r\n\
a=ssrc:2408808671 label:46fbfa41-04c5-450b-9884-9720e0f65e12\r\n\
m=video 9 RTP/SAVPF 97\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:eeAaTQp8Bz2m5EIr\r\n\
a=ice-pwd:JshDr8jaKU92bdj1IvSNQxnD\r\n\
a=fingerprint:sha-256 C0:15:C5:18:E4:86:EE:84:B9:05:F2:F8:A2:0F:87:E7:C8:CF:93:66:C3:F3:F6:85:E4:0F:B5:84:AD:A2:75:B2\r\n\
a=setup:active\r\n\
a=mid:video\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=sendrecv\r\n\
a=rtcp-mux\r\n\
a=rtpmap:97 VP8/90000\r\n\
a=rtcp-fb:97 ccm fir\r\n\
a=rtcp-fb:97 nack\r\n\
a=rtcp-fb:97 nack pli\r\n\
a=rtcp-fb:97 goog-remb\r\n\
a=ssrc:3493232231 cname:AAzXxskrCZzvzGxA\r\n\
a=ssrc:3493232231 msid:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu f3918557-3d3a-4917-bc8b-661c07aea169\r\n\
a=ssrc:3493232231 mslabel:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu\r\n\
a=ssrc:3493232231 label:f3918557-3d3a-4917-bc8b-661c07aea169\r\n"
/*jshint multistr: true */
var expectedUnifiedPlan =
"v=0\r\n\
o=- 7577719950547761212 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio0 video0\r\n\
m=audio 1 RTP/SAVPF 96 0\r\n\
a=rtpmap:96 opus/48000/2\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:audio0\r\n\
a=sendrecv\r\n\
a=ice-ufrag:eeAaTQp8Bz2m5EIr\r\n\
a=ice-pwd:JshDr8jaKU92bdj1IvSNQxnD\r\n\
a=fingerprint:sha-256 C0:15:C5:18:E4:86:EE:84:B9:05:F2:F8:A2:0F:87:E7:C8:CF:93:66:C3:F3:F6:85:E4:0F:B5:84:AD:A2:75:B2\r\n\
a=ssrc:2408808671 cname:AAzXxskrCZzvzGxA\r\n\
a=ssrc:2408808671 mslabel:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu\r\n\
a=ssrc:2408808671 label:46fbfa41-04c5-450b-9884-9720e0f65e12\r\n\
a=rtcp-mux\r\n\
m=video 1 RTP/SAVPF 97\r\n\
b=AS:2000\r\n\
a=rtpmap:97 VP8/90000\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:97 ccm fir\r\n\
a=rtcp-fb:97 nack\r\n\
a=rtcp-fb:97 nack pli\r\n\
a=rtcp-fb:97 goog-remb\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=mid:video0\r\n\
a=sendrecv\r\n\
a=ice-ufrag:eeAaTQp8Bz2m5EIr\r\n\
a=ice-pwd:JshDr8jaKU92bdj1IvSNQxnD\r\n\
a=fingerprint:sha-256 C0:15:C5:18:E4:86:EE:84:B9:05:F2:F8:A2:0F:87:E7:C8:CF:93:66:C3:F3:F6:85:E4:0F:B5:84:AD:A2:75:B2\r\n\
a=ssrc:3493232231 cname:AAzXxskrCZzvzGxA\r\n\
a=ssrc:3493232231 mslabel:IfJVHad8MuDaHZN3BqwOEajvjBiel1H29lRu\r\n\
a=ssrc:3493232231 label:f3918557-3d3a-4917-bc8b-661c07aea169\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originUnifiedPlan
});
var planBDesc = interop.toPlanB(offer);
assert.equal(planBDesc.sdp, expectedPlanB,
"Not expected Plan B output")
var answer = new RTCSessionDescription({
type: 'answer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(answer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
});
QUnit.test('ChromePlanB2UnifiedPlan_offer_recvonly', function (assert) {
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 5223234492575663261 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:VI6x/eXAwICStpq4\r\n\
a=ice-pwd:ukss7EaFw6RovD2phIZ9lHll\r\n\
a=fingerprint:sha-256 DF:6D:A3:7F:CD:7A:B2:4F:84:2F:04:EA:C3:48:CA:43:FC:1D:24:07:D2:3D:CB:92:2F:40:4A:71:85:B5:F9:56\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=maxptime:60\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:VI6x/eXAwICStpq4\r\n\
a=ice-pwd:ukss7EaFw6RovD2phIZ9lHll\r\n\
a=fingerprint:sha-256 DF:6D:A3:7F:CD:7A:B2:4F:84:2F:04:EA:C3:48:CA:43:FC:1D:24:07:D2:3D:CB:92:2F:40:4A:71:85:B5:F9:56\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=recvonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=rtpmap:101 VP9/90000\r\n\
a=rtcp-fb:101 ccm fir\r\n\
a=rtcp-fb:101 nack\r\n\
a=rtcp-fb:101 nack pli\r\n\
a=rtcp-fb:101 goog-remb\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100"
/*jshint multistr: true */
var expectedUnifiedPlan = /* The same but in line in different order */
"v=0\r\n\
o=- 5223234492575663261 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=msid-semantic: WMS *\r\n\
a=group:BUNDLE audio video\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=maxptime:60\r\n\
a=recvonly\r\n\
a=ice-ufrag:VI6x/eXAwICStpq4\r\n\
a=ice-pwd:ukss7EaFw6RovD2phIZ9lHll\r\n\
a=fingerprint:sha-256 DF:6D:A3:7F:CD:7A:B2:4F:84:2F:04:EA:C3:48:CA:43:FC:1D:24:07:D2:3D:CB:92:2F:40:4A:71:85:B5:F9:56\r\n\
a=rtcp-mux\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtpmap:101 VP9/90000\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=rtcp-fb:101 ccm fir\r\n\
a=rtcp-fb:101 nack\r\n\
a=rtcp-fb:101 nack pli\r\n\
a=rtcp-fb:101 goog-remb\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=recvonly\r\n\
a=ice-ufrag:VI6x/eXAwICStpq4\r\n\
a=ice-pwd:ukss7EaFw6RovD2phIZ9lHll\r\n\
a=fingerprint:sha-256 DF:6D:A3:7F:CD:7A:B2:4F:84:2F:04:EA:C3:48:CA:43:FC:1D:24:07:D2:3D:CB:92:2F:40:4A:71:85:B5:F9:56\r\n\
a=rtcp-mux\r\n"
var interop = new Interop();
var offer = new RTCSessionDescription({
type: 'offer',
sdp: originPlanB
});
var unifiedPlanDesc = interop.toUnifiedPlan(offer);
assert.equal(unifiedPlanDesc.sdp, expectedUnifiedPlan,
"Not expected Unified Plan output")
});
QUnit.test('ChromePlanB2UnifiedPlan_simulcast', function (assert) {
/*jshint multistr: true */
var originPlanB =
"v=0\r\n\
o=- 3154774635554078802 2 IN IP4 127.0.0.1\r\n\
s=-\r\n\
t=0 0\r\n\
a=group:BUNDLE audio video\r\n\
a=msid-semantic: WMS SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU qCJz9KUv8my1ymOofvsnbuEty6dYudDtmZM3\r\n\
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:/LqjwfEbqKQ3f3wD\r\n\
a=ice-pwd:rg4H+j0AEvnxp4Th847dGznM\r\n\
a=fingerprint:sha-256 ED:AD:B3:20:A5:E1:4A:A6:DB:7A:43:C3:E3:E0:25:47:CA:F9:51:C5:CE:96:DF:49:95:1F:A5:92:21:8A:77:56\r\n\
a=setup:actpass\r\n\
a=mid:audio\r\n\
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=sendonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:111 opus/48000/2\r\n\
a=fmtp:111 minptime=10; useinbandfec=1\r\n\
a=rtpmap:103 ISAC/16000\r\n\
a=rtpmap:104 ISAC/32000\r\n\
a=rtpmap:9 G722/8000\r\n\
a=rtpmap:0 PCMU/8000\r\n\
a=rtpmap:8 PCMA/8000\r\n\
a=rtpmap:106 CN/32000\r\n\
a=rtpmap:105 CN/16000\r\n\
a=rtpmap:13 CN/8000\r\n\
a=rtpmap:126 telephone-event/8000\r\n\
a=maxptime:60\r\n\
a=ssrc:110 cname:95qLJLELw6Trsslz\r\n\
a=ssrc:110 msid:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU 29c336da-a4c0-4ae3-98c3-01dcb045ea11\r\n\
a=ssrc:110 mslabel:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU\r\n\
a=ssrc:110 label:29c336da-a4c0-4ae3-98c3-01dcb045ea11\r\n\
m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96\r\n\
c=IN IP4 0.0.0.0\r\n\
a=rtcp:9 IN IP4 0.0.0.0\r\n\
a=ice-ufrag:/LqjwfEbqKQ3f3wD\r\n\
a=ice-pwd:rg4H+j0AEvnxp4Th847dGznM\r\n\
a=fingerprint:sha-256 ED:AD:B3:20:A5:E1:4A:A6:DB:7A:43:C3:E3:E0:25:47:CA:F9:51:C5:CE:96:DF:49:95:1F:A5:92:21:8A:77:56\r\n\
a=setup:actpass\r\n\
a=mid:video\r\n\
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n\
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n\
a=extmap:4 urn:3gpp:video-orientation\r\n\
a=sendonly\r\n\
a=rtcp-mux\r\n\
a=rtpmap:100 VP8/90000\r\n\
a=rtcp-fb:100 ccm fir\r\n\
a=rtcp-fb:100 nack\r\n\
a=rtcp-fb:100 nack pli\r\n\
a=rtcp-fb:100 goog-remb\r\n\
a=rtcp-fb:100 transport-cc\r\n\
a=rtpmap:101 VP9/90000\r\n\
a=rtcp-fb:101 ccm fir\r\n\
a=rtcp-fb:101 nack\r\n\
a=rtcp-fb:101 nack pli\r\n\
a=rtcp-fb:101 goog-remb\r\n\
a=rtcp-fb:101 transport-cc\r\n\
a=rtpmap:116 red/90000\r\n\
a=rtpmap:117 ulpfec/90000\r\n\
a=rtpmap:96 rtx/90000\r\n\
a=fmtp:96 apt=100\r\n\
a=x-google-flag:conference\r\n\
a=ssrc-group:SIM 121 122 123\r\n\
a=ssrc:121 cname:localVideo\r\n\
a=ssrc:121 msid:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc:121 mslabel:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU\r\n\
a=ssrc:121 label:e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc:122 cname:localVideo\r\n\
a=ssrc:122 msid:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc:122 mslabel:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU\r\n\
a=ssrc:122 label:e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc:123 cname:localVideo\r\n\
a=ssrc:123 msid:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc:123 mslabel:SzwIW5b90m4nPQ5p0exZEvfNKYdLNdGMLRCU\r\n\
a=ssrc:123 label:e99f5ae5-287d-4664-a1ce-d3d0a7aa7e8d\r\n\
a=ssrc-group:FID 210 3110152606\r\n\
a=ssrc:210 cname:lwqoaa3WFMuYGqh8\r\n\
a=ssrc:210 msid:qCJz9KUv8my1ymOofvsnbuEty6dYudDtmZM3 3a9d80a8-0400-4d99-a1b4-7bd554555dea\r\n\
a=ssrc:210 mslabel:qCJz9KUv8my1ymOofvsnbuEty6dYudDtmZM3\r\n\
a=ssrc:210 label:3a9d80a8-0400-4d99-a1b4-7bd554555dea\r\n\
a=ssrc:3110152606 cname:lwqoaa3WFMuYGqh8\r\n\
a=ssrc:3110152606 msid:qCJz9KUv8my1ymOofvsnbuEty6dYudDtmZM3 3a9d80a8-0400-4d99-a1b4-7bd554555dea\r\n\
a=ssrc:3110152606 mslabel:qCJz9KUv8my1ymOofvsnbuEty6dYudDtmZM3\r\n\
a=ssrc:3110152606 label:3a9d80a8-0400-4d99-a1b4-7bd554555dea"
/*jshint multistr: