test_peerConnection_simulcastOffer_oldSetParameters.html (4387B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="pc.js"></script> 5 <script type="application/javascript" src="parser_rtp.js"></script> 6 <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script> 7 <script type="application/javascript" src="helpers_from_wpt/sdp.js"></script> 8 <script type="application/javascript" src="simulcast.js"></script> 9 <script type="application/javascript" src="stats.js"></script> 10 </head> 11 <body> 12 <pre id="test"> 13 <script type="application/javascript"> 14 createHTML({ 15 bug: "1231507", 16 title: "Basic video-only peer connection with Simulcast offer", 17 visible: true 18 }); 19 20 runNetworkTest(async () => { 21 await pushPrefs( 22 // 180Kbps was determined empirically, set well-higher than 23 // the 80Kbps+overhead needed for the two simulcast streams. 24 // 100Kbps was apparently too low. 25 ['media.peerconnection.video.min_bitrate_estimate', 180*1000]); 26 27 // [TODO] re-enable HW decoder after bug 1526207 is fixed. 28 if (navigator.userAgent.includes("Android")) { 29 await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false]); 30 } 31 32 33 const offerer = new RTCPeerConnection(); 34 const answerer = new RTCPeerConnection(); 35 36 const add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); 37 offerer.onicecandidate = e => add(answerer, e.candidate, generateErrorCallback()); 38 answerer.onicecandidate = e => add(offerer, e.candidate, generateErrorCallback()); 39 40 const metadataToBeLoaded = []; 41 answerer.ontrack = (e) => { 42 metadataToBeLoaded.push(getPlaybackWithLoadedMetadata(e.track)); 43 }; 44 45 // One send transceiver, that will be used to send both simulcast streams 46 const emitter = new VideoFrameEmitter(); 47 const videoStream = emitter.stream(); 48 offerer.addTrack(videoStream.getVideoTracks()[0], videoStream); 49 emitter.start(); 50 51 const sender = offerer.getSenders()[0]; 52 sender.setParameters({ 53 encodings: [ 54 { rid: '0', maxBitrate: 40000 }, 55 { rid: '1', maxBitrate: 40000, scaleResolutionDownBy: 2 } 56 ] 57 }); 58 59 const offer = await offerer.createOffer(); 60 61 const mungedOffer = ridToMid(offer); 62 info(`Transformed send simulcast offer to multiple m-sections: ${offer.sdp} to ${mungedOffer}`); 63 64 await answerer.setRemoteDescription({type: "offer", sdp: mungedOffer}); 65 await offerer.setLocalDescription(offer); 66 67 const rids = answerer.getTransceivers().map(t => t.mid); 68 is(rids.length, 2, 'Should have 2 mids in offer'); 69 ok(rids[0] != '', 'First mid should be non-empty'); 70 ok(rids[1] != '', 'Second mid should be non-empty'); 71 info(`rids: ${JSON.stringify(rids)}`); 72 73 const answer = await answerer.createAnswer(); 74 75 const mungedAnswer = midToRid(answer); 76 info(`Transformed recv answer to simulcast: ${answer.sdp} to ${mungedAnswer}`); 77 await offerer.setRemoteDescription({type: "answer", sdp: mungedAnswer}); 78 await answerer.setLocalDescription(answer); 79 80 is(metadataToBeLoaded.length, 2, 'Offerer should have gotten 2 ontrack events'); 81 info('Waiting for 2 loadedmetadata events'); 82 const videoElems = await Promise.all(metadataToBeLoaded); 83 84 const statsReady = 85 Promise.all([waitForSyncedRtcp(offerer), waitForSyncedRtcp(answerer)]); 86 87 const helper = new VideoStreamHelper(); 88 info('Waiting for first video element to start playing'); 89 await helper.checkVideoPlaying(videoElems[0]); 90 info('Waiting for second video element to start playing'); 91 await helper.checkVideoPlaying(videoElems[1]); 92 93 is(videoElems[0].videoWidth, 64, 94 "sink is same width as source, modulo our cropping algorithm"); 95 is(videoElems[0].videoHeight, 64, 96 "sink is same height as source, modulo our cropping algorithm"); 97 is(videoElems[1].videoWidth, 32, 98 "sink is 1/2 width of source, modulo our cropping algorithm"); 99 is(videoElems[1].videoHeight, 32, 100 "sink is 1/2 height of source, modulo our cropping algorithm"); 101 102 await statsReady; 103 const senderStats = await sender.getStats(); 104 checkSenderStats(senderStats, 2); 105 checkExpectedFields(senderStats); 106 pedanticChecks(senderStats); 107 108 emitter.stop(); 109 videoStream.getVideoTracks()[0].stop(); 110 offerer.close(); 111 answerer.close(); 112 }); 113 </script> 114 </pre> 115 </body> 116 </html>