test_peerConnection_maxFsConstraint.html (3694B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="pc.js"></script> 5 </head> 6 <body> 7 <pre id="test"> 8 <script type="application/javascript"> 9 createHTML({ 10 bug: "1393687", 11 title: "Enforce max-fs constraint on a PeerConnection", 12 visible: true 13 }); 14 15 var mustRejectWith = (msg, reason, f) => 16 f().then(() => ok(false, msg), 17 e => is(e.name, reason, msg)); 18 19 var removeAllButCodec = (d, codec) => { 20 d.sdp = d.sdp.replace(/m=video (\w) UDP\/TLS\/RTP\/SAVPF \w.*\r\n/, 21 "m=video $1 UDP/TLS/RTP/SAVPF " + codec + "\r\n"); 22 return d; 23 }; 24 25 var mungeSDP = (d, forceH264) => { 26 if (forceH264) { 27 removeAllButCodec(d, 126); 28 d.sdp = d.sdp.replace(/a=fmtp:126 (.*);packetization-mode=1/, "a=fmtp:126 $1;packetization-mode=1;max-fs=100"); 29 } else { 30 d.sdp = d.sdp.replace(/max-fs=\d+/, "max-fs=100"); 31 } 32 return d; 33 }; 34 35 let resolutionAlignment = 1; 36 37 function testScale(codec) { 38 var v1 = createMediaElement('video', 'v1'); 39 var v2 = createMediaElement('video', 'v2'); 40 41 var pc1 = new RTCPeerConnection(); 42 var pc2 = new RTCPeerConnection(); 43 44 var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); 45 pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback()); 46 pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback()); 47 48 info("testing max-fs with " + codec); 49 50 pc1.onnegotiationneeded = e => 51 pc1.createOffer() 52 .then(d => pc1.setLocalDescription(mungeSDP(d, codec == "H264"))) 53 .then(() => pc2.setRemoteDescription(pc1.localDescription)) 54 .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(mungeSDP(d, codec =="H264"))) 55 .then(() => pc1.setRemoteDescription(pc2.localDescription)) 56 .catch(generateErrorCallback()); 57 58 pc2.ontrack = e => { 59 v2.srcObject = e.streams[0]; 60 }; 61 62 var stream; 63 64 return navigator.mediaDevices.getUserMedia({ video: true }) 65 .then(s => { 66 stream = s; 67 v1.srcObject = stream; 68 let track = stream.getVideoTracks()[0]; 69 let sender = pc1.addTrack(track, stream); 70 is(v2.currentTime, 0, "v2.currentTime is zero at outset"); 71 }) 72 .then(() => wait(5000)) 73 .then(() => { 74 if (v2.videoWidth == 0 && v2.videoHeight == 0) { 75 info("Skipping test, insufficient time for video to start."); 76 } else { 77 const expectedWidth = 184 - 184 % resolutionAlignment; 78 const expectedHeight = 138 - 138 % resolutionAlignment; 79 is(v2.videoWidth, expectedWidth, 80 `sink width should be ${expectedWidth} for ${codec}`); 81 is(v2.videoHeight, expectedHeight, 82 `sink height should be ${expectedHeight} for ${codec}`); 83 }}) 84 .then(() => { 85 stream.getTracks().forEach(track => track.stop()); 86 v1.srcObject = v2.srcObject = null; 87 }).catch(generateErrorCallback()); 88 } 89 90 runNetworkTest(async () => { 91 await pushPrefs( 92 ['media.peerconnection.video.lock_scaling', true], 93 // Disable h264 hardware support, to ensure it is not prioritized over VP8 94 ["media.webrtc.hw.h264.enabled", false], 95 // Use libwebrtc VP8 encoder to avoid unexpected resolution alignment on 96 // some devices. 97 ["media.webrtc.encoder_creation_strategy", 0], 98 ); 99 await testScale("VP8"); 100 101 const h264Support = checkPlatformH264CodecPrefs(); 102 if (!h264Support.webrtc) { 103 // MediaDataEncoder always uses 16-alignment. 104 resolutionAlignment = 16; 105 } 106 if (h264Support.any) { 107 await testScale("H264"); 108 } 109 }); 110 </script> 111 </pre> 112 </body> 113 </html>