rtp-demuxing.html (4085B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>RTCPeerConnection payload type demuxing</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="../RTCPeerConnection-helper.js"></script> 8 <script> 9 'use strict'; 10 promise_test(async t => { 11 const caller = new RTCPeerConnection(); 12 t.add_cleanup(() => caller.close()); 13 const callee = new RTCPeerConnection(); 14 t.add_cleanup(() => callee.close()); 15 exchangeIceCandidates(caller, callee); 16 17 const stream = await getNoiseStream({video: true}); 18 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 19 stream.getTracks().forEach(track => caller.addTrack(track, stream)); 20 stream.getTracks().forEach(track => caller.addTrack(track.clone(), stream.clone())); 21 22 let callCount = 0; 23 let metadataToBeLoaded = new Promise(resolve => { 24 callee.ontrack = (e) => { 25 const stream = e.streams[0]; 26 const v = document.createElement('video'); 27 v.autoplay = true; 28 v.srcObject = stream; 29 v.id = stream.id 30 v.addEventListener('loadedmetadata', () => { 31 if (++callCount === 2) { 32 resolve(); 33 } 34 }); 35 }; 36 }); 37 38 // Restrict first transceiver to VP8, second to H264. 39 const {codecs} = RTCRtpSender.getCapabilities('video'); 40 const vp8 = codecs.find(c => c.mimeType === 'video/VP8'); 41 const h264 = codecs.find(c => c.mimeType === 'video/H264'); 42 caller.getTransceivers()[0].setCodecPreferences([vp8]); 43 caller.getTransceivers()[1].setCodecPreferences([h264]); 44 45 const offer = await caller.createOffer(); 46 // Replace the mid header extension and all ssrc lines 47 // with bogus. The receiver will be forced to do payload type demuxing. 48 const sdp = offer.sdp 49 .replace(/rtp-hdrext:sdes/g, 'rtp-hdrext:something') 50 .replace(/a=ssrc:/g, 'a=notssrc'); 51 52 await callee.setRemoteDescription({type: 'offer', sdp}); 53 await caller.setLocalDescription(offer); 54 55 const answer = await callee.createAnswer(); 56 await caller.setRemoteDescription(answer); 57 await callee.setLocalDescription(answer); 58 59 assert_equals(callee.getReceivers().length, 2); 60 61 await metadataToBeLoaded; 62 }, 'Can demux two video tracks with different payload types on a bundled connection'); 63 64 promise_test(async t => { 65 const caller = new RTCPeerConnection({bundlePolicy: 'max-compat'}); 66 t.add_cleanup(() => caller.close()); 67 const callee = new RTCPeerConnection(); 68 t.add_cleanup(() => callee.close()); 69 exchangeIceCandidates(caller, callee); 70 71 const stream = await getNoiseStream({video: true}); 72 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 73 stream.getTracks().forEach(track => caller.addTrack(track, stream)); 74 stream.getTracks().forEach(track => caller.addTrack(track.clone(), stream.clone())); 75 76 let callCount = 0; 77 let metadataToBeLoaded = new Promise(resolve => { 78 callee.ontrack = (e) => { 79 const stream = e.streams[0]; 80 const v = document.createElement('video'); 81 v.autoplay = true; 82 v.srcObject = stream; 83 v.id = stream.id 84 v.addEventListener('loadedmetadata', () => { 85 if (++callCount === 2) { 86 resolve(); 87 } 88 }); 89 }; 90 }); 91 92 const offer = await caller.createOffer(); 93 // Replace BUNDLE, the mid header extension and all ssrc lines 94 // with bogus. The receiver will be forced to do payload type demuxing 95 // which is still possible because the different m-lines arrive on 96 // different ports/sockets. 97 const sdp = offer.sdp.replace('BUNDLE', 'SOMETHING') 98 .replace(/rtp-hdrext:sdes/g, 'rtp-hdrext:something') 99 .replace(/a=ssrc:/g, 'a=notssrc'); 100 101 await callee.setRemoteDescription({type: 'offer', sdp}); 102 await caller.setLocalDescription(offer); 103 104 const answer = await callee.createAnswer(); 105 await caller.setRemoteDescription(answer); 106 await callee.setLocalDescription(answer); 107 108 assert_equals(callee.getReceivers().length, 2); 109 110 await metadataToBeLoaded; 111 }, 'Can demux two video tracks with the same payload type on an unbundled connection'); 112 113 </script>