Skip to content

Commit

Permalink
Add test for backpressure on MediaStreamTrackProcessor (#36522)
Browse files Browse the repository at this point in the history
* Add test for backpressure on MediaStreamTrackProcessor
  • Loading branch information
dontcallmedom authored Oct 19, 2022
1 parent 29092aa commit 1774ecf
Showing 1 changed file with 69 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<!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>

1 comment on commit 1774ecf

@community-tc-integration
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh oh! Looks like an error! Details

HttpError: You have exceeded a secondary rate limit. Please wait a few minutes before you try again.

Please sign in to comment.