tor-browser

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

RTCEncodedVideoFrame-constructor.html (2641B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title>Timestamps in RTCEncodedFrame metadata</title>
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src="/webrtc/RTCPeerConnection-helper.js"></script>
      7 <script src="RTCEncodedFrame-timestamps-helper.js"></script>
      8 <script>
      9 'use strict';
     10 
     11 function doWork() {
     12  onrtctransform = async e => {
     13    const reader = e.transformer.readable.getReader();
     14    const writer = e.transformer.writable.getWriter();
     15    for (let i = 0; i<10; i++) {
     16      const frameOrDone = await reader.read();
     17      if (frameOrDone.done) {
     18        self.postMessage("Unexpected end of stream");
     19        return;
     20      }
     21      const originalFrame = frameOrDone.value;
     22      const originalMetadata= originalFrame.getMetadata();
     23      const newFrame = new RTCEncodedVideoFrame(originalFrame, {metadata: originalMetadata});
     24 
     25      await writer.write(newFrame);
     26    }
     27    self.postMessage("OK");
     28  };
     29 }
     30 
     31 async function testAudioFrameConstructor(t, enableAbsCaptureTime, enableForSenderFrames) {
     32  const worker = new Worker(`data:text/javascript,(${doWork.toString()})()`);
     33  const workerPromise = new Promise((resolve, reject) => {
     34    worker.onmessage = t.step_func(message => {
     35      if (message.data == "OK") {
     36        resolve();
     37      } else {
     38        reject(message.data);
     39      }
     40    });
     41  });
     42 
     43  await initiateCall(
     44      t, /*streamOptions=*/{audio: false, video: true},
     45      /*enableAbsCaptureTime=*/enableAbsCaptureTime, worker, /*enableSenderTransform=*/enableForSenderFrames,
     46      /*enableReceiverTransform=*/!enableForSenderFrames);
     47 
     48  return workerPromise;
     49 }
     50 
     51 promise_test(async t => {
     52  return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/false)
     53 }, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works');
     54 
     55 promise_test(async t => {
     56  return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/true)
     57 }, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works');
     58 
     59 promise_test(async t => {
     60  return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/false)
     61 }, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled');
     62 
     63 promise_test(async t => {
     64  return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/true)
     65 }, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled');
     66 
     67 </script>