69 lines
2.3 KiB
HTML
69 lines
2.3 KiB
HTML
<!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>
|