tor-browser

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

MediaStreamTrackProcessor-maxBufferSize.worker.js (2618B)


      1 // META: title=MediaStreamTrackProcessor maxBufferSize
      2 importScripts("/resources/testharness.js");
      3 
      4 function makeVideoFrame(timestamp) {
      5  const canvas = new OffscreenCanvas(100, 100);
      6  const ctx = canvas.getContext('2d');
      7  return new VideoFrame(canvas, {timestamp});
      8 }
      9 
     10 promise_test(async t => {
     11  // The generator will be used as the source for the processor to
     12  // produce frames in a controlled manner.
     13  const generator = new VideoTrackGenerator();
     14  t.add_cleanup(() => generator.track.stop());
     15  // Use a larger maxBufferSize than the default to ensure no frames
     16  // will be dropped.
     17  const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10});
     18  const reader = processor.readable.getReader();
     19  const writer = generator.writable.getWriter();
     20 
     21  let numReads = 0;
     22  let resolve = null;
     23  const promise = new Promise(r => resolve = r);
     24 
     25  const numOperations = 4;
     26  // Issue reads without waiting for the frames to arrive.
     27  for (let i = 0; i < numOperations; i++) {
     28    reader.read().then(dv=> {
     29      dv.value.close();
     30      if (++numReads == numOperations)
     31        resolve();
     32    });
     33  }
     34 
     35  // Write video frames in different tasks to "slowly" settle the pending read
     36  // requests.
     37  for (let i = 0; i<numOperations; i++) {
     38     await writer.write(makeVideoFrame(i));
     39     await new Promise(r=>t.step_timeout(r, 0));
     40  }
     41 
     42  return promise;
     43 
     44 }, "Tests that multiple read requests are eventually settled");
     45 
     46 promise_test(async t => {
     47  // The generator will be used as the source for the processor to
     48  // produce frames in a controlled manner.
     49  const generator = new VideoTrackGenerator();
     50  t.add_cleanup(() => generator.track.stop());
     51  // Use a larger maxBufferSize than the default to ensure no frames
     52  // will be dropped.
     53  const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10});
     54  const reader = processor.readable.getReader();
     55  const writer = generator.writable.getWriter();
     56 
     57  const numOperations = 4;
     58  // Write video frames as fast as we can with "slower" reads.
     59  // requests.
     60  for (let i = 0; i<numOperations; i++) {
     61     await writer.write(makeVideoFrame(i));
     62  }
     63 
     64  let numReads = 0;
     65  let resolve = null;
     66  const promise = new Promise(r => resolve = r);
     67 
     68  // Issue reads without waiting for the frames to arrive.
     69  for (let i = 0; i < numOperations; i++) {
     70    await new Promise(r=>t.step_timeout(r, 50));
     71    reader.read().then(dv=> {
     72      dv.value.close();
     73      if (++numReads == numOperations)
     74        resolve();
     75    });
     76  }
     77 
     78  return promise;
     79 
     80 }, "Tests that multiple write requests are buffered");
     81 
     82 done();