<!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>