<!doctype html>
<html>
<head>
  <title>MediaStreamTrackProcessor backpressure</title>
  <link rel="help" href="https://w3c.github.io/mediacapture-insertable-streams">
</head>
<body>
  <h1 class="instructions">Description</h1>
<p class="instructions">This test checks that MediaStreamTrackProcessor handles backpressure from a WHATWG stream pipeline.</p>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script>

  const height = 240;
  const width = 320;

  const inputCanvas = new OffscreenCanvas(width, height);
  const inputCtx = inputCanvas.getContext('2d', {alpha: false});
  inputCtx.fillStyle = 'black';
  inputCtx.fillRect(0, 0, width, height);

  const frameDuration = 40;

  function makeUniformVideoFrame(timestamp) {
    return new VideoFrame(inputCanvas, {timestamp, alpha: 'discard'});
  }

  promise_test(async t => {
    // TODO: use  "new VideoTrackGenerator"
    const generator = new MediaStreamTrackGenerator({kind: 'video'});
    t.add_cleanup(() => generator.stop());

    // Write frames for the duration of the test.
    const writer = generator.writable.getWriter();
    let timestamp = 0;
    const intervalId = setInterval(
      t.step_func(async () => {
        if (generator.readyState === 'live') {
          timestamp++;
          await writer.write(makeUniformVideoFrame(timestamp));
        }
      }),
      frameDuration);
    t.add_cleanup(() => clearInterval(intervalId));
    t.step_timeout(function() {
      clearInterval(intervalId);
      generator.stop();
    }, 2000);
    const processor = new MediaStreamTrackProcessor({track: generator});
    let ts = 1;
    await processor.readable.pipeTo(new WritableStream({
      async write(frame) {
        if (ts === 1) {
          assert_equals(frame.timestamp, ts, "Timestamp mismatch");
        } else {
          assert_greater_than_equal(frame.timestamp, ts, "Backpressure should have resulted in skipping at least 3 frames");
        }
        frame.close();
        ts+=3;
        // Wait the equivalent of 3 frames
        return new Promise((res) => t.step_timeout(res, 3*frameDuration));
      }
    }));
  }, "Tests that backpressure forces MediaStreamTrackProcess to skip frames");
</script>
</body>
</html>
