test_peerConnection_scaleResolution.html (4004B)
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: "1244913", 11 title: "Scale resolution down on a PeerConnection", 12 visible: true 13 }); 14 15 let resolutionAlignment = 1; 16 17 var mustRejectWith = (msg, reason, f) => 18 f().then(() => ok(false, msg), 19 e => is(e.name, reason, msg)); 20 21 async function testScale(codec) { 22 var pc1 = new RTCPeerConnection(); 23 var pc2 = new RTCPeerConnection(); 24 25 var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); 26 pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback()); 27 pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback()); 28 29 info("testing scaling with " + codec); 30 31 let stream = await navigator.mediaDevices.getUserMedia({ video: true }); 32 33 var v1 = createMediaElement('video', 'v1'); 34 var v2 = createMediaElement('video', 'v2'); 35 36 var ontrackfired = new Promise(resolve => pc2.ontrack = e => resolve(e)); 37 var v2loadedmetadata = new Promise(resolve => v2.onloadedmetadata = resolve); 38 39 is(v2.currentTime, 0, "v2.currentTime is zero at outset"); 40 41 v1.srcObject = stream; 42 var sender = pc1.addTrack(stream.getVideoTracks()[0], stream); 43 let parameters = sender.getParameters(); 44 is(parameters.encodings.length, 1, "Default number of encodings should be 1"); 45 parameters.encodings[0].scaleResolutionDownBy = 0.5; 46 47 await mustRejectWith( 48 "Invalid scaleResolutionDownBy must reject", "RangeError", 49 () => sender.setParameters(parameters) 50 ); 51 52 parameters = sender.getParameters(); 53 parameters.encodings[0].scaleResolutionDownBy = 2; 54 parameters.encodings[0].maxBitrate = 60000; 55 56 await sender.setParameters(parameters); 57 58 parameters = sender.getParameters(); 59 is(parameters.encodings[0].scaleResolutionDownBy, 2, "Should be able to set scaleResolutionDownBy"); 60 is(parameters.encodings[0].maxBitrate, 60000, "Should be able to set maxBitrate"); 61 62 let offer = await pc1.createOffer(); 63 offer.sdp = sdputils.removeAllButCodec(offer.sdp, codec); 64 await pc1.setLocalDescription(offer); 65 await pc2.setRemoteDescription(pc1.localDescription); 66 67 let answer = await pc2.createAnswer(); 68 await pc2.setLocalDescription(answer); 69 await pc1.setRemoteDescription(pc2.localDescription); 70 let trackevent = await ontrackfired; 71 72 v2.srcObject = trackevent.streams[0]; 73 74 await v2loadedmetadata; 75 76 await waitUntil(() => v2.currentTime > 0); 77 ok(v2.currentTime > 0, "v2.currentTime is moving (" + v2.currentTime + ")"); 78 79 ok(v1.videoWidth > 0, "source width is positive"); 80 ok(v1.videoHeight > 0, "source height is positive"); 81 const expectedWidth = 82 v1.videoWidth / 2 - (v1.videoWidth / 2 % resolutionAlignment); 83 const expectedHeight = 84 v1.videoHeight / 2 - (v1.videoHeight / 2 % resolutionAlignment); 85 is(v2.videoWidth, expectedWidth, 86 "sink is half the width of the source"); 87 is(v2.videoHeight, expectedHeight, 88 "sink is half the height of the source"); 89 stream.getTracks().forEach(track => track.stop()); 90 v1.srcObject = v2.srcObject = null; 91 pc1.close() 92 pc2.close() 93 } 94 95 runNetworkTest(async () => { 96 await pushPrefs( 97 ['media.peerconnection.video.lock_scaling', true], 98 // Disable h264 hardware support, to ensure it is not prioritized over VP8 99 ["media.webrtc.hw.h264.enabled", false], 100 // Use libwebrtc VP8 encoder to avoid unexpected resolution alignment on 101 // some devices. 102 ["media.webrtc.encoder_creation_strategy", 0], 103 ); 104 await testScale("VP8"); 105 106 const h264Support = checkPlatformH264CodecPrefs(); 107 if (!h264Support.webrtc) { 108 // MediaDataEncoder always uses 16-alignment. 109 resolutionAlignment = 16; 110 } 111 if (h264Support.any) { 112 await testScale("H264"); 113 } 114 }); 115 </script> 116 </pre> 117 </body> 118 </html>