| // META: title=MediaStreamTrackProcessor backpressure tests. |
| |
| importScripts("/resources/testharness.js"); |
| |
| 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 => { |
| const generator = new VideoTrackGenerator(); |
| t.add_cleanup(() => generator.track.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.track.stop(); |
| }, 2000); |
| const processor = new MediaStreamTrackProcessor(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"); |
| |
| done(); |