tor-browser

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

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>