tor-browser

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

svc-helper.js (2034B)


      1 function supportsCodec(mimeType) {
      2  return RTCRtpSender.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType).length() > 0;
      3 }
      4 
      5 async function supportsScalabilityMode(mimeType, scalabilityMode) {
      6  let result = await navigator.mediaCapabilities.encodingInfo({
      7    type: 'webrtc',
      8    video: {
      9      contentType: mimeType,
     10      width: 60,
     11      height: 60,
     12      bitrate: 10000,
     13      framerate: 30,
     14      scalabilityMode: scalabilityMode
     15    }
     16  });
     17  return result.supported;
     18 }
     19 
     20 function createScalabilityTest(mimeType, scalabilityModes) {
     21  for (const scalabilityMode of scalabilityModes) {
     22    promise_test(async t => {
     23      assert_implements_optional(
     24        supportsScalabilityMode(mimeType, scalabilityMode),
     25        `${mimeType} supported`
     26      );
     27      const v = document.createElement('video');
     28      v.autoplay = true;
     29      const pc1 = new RTCPeerConnection();
     30      const pc2 = new RTCPeerConnection();
     31      t.add_cleanup(() => pc1.close());
     32      t.add_cleanup(() => pc2.close());
     33      const stream1 = await getNoiseStream({ video: { signal: 100, width: 60, height: 60 } });
     34      const [track1] = stream1.getTracks();
     35      t.add_cleanup(() => track1.stop());
     36      const transceiver = pc1.addTransceiver(track1, {
     37        sendEncodings: [{ scalabilityMode: scalabilityMode }],
     38      });
     39      pc2.addEventListener('track', e => {
     40        e.transceiver.setCodecPreferences(RTCRtpReceiver.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType));
     41      });
     42      const haveTrackEvent = new Promise(r => pc2.ontrack = r);
     43      exchangeIceCandidates(pc1, pc2);
     44      await exchangeOfferAnswer(pc1, pc2);
     45      v.srcObject = new MediaStream([(await haveTrackEvent).track]);
     46      await new Promise(r => v.onloadedmetadata = r);
     47      await detectSignal(t, v, 100);
     48      const sendParams = pc1.getSenders()[0].getParameters();
     49      assert_equals(sendParams.encodings[0].scalabilityMode, scalabilityMode);
     50    }, `${mimeType} - ${scalabilityMode} should produce valid video content`);
     51  }
     52 }