tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>