// META: title=MediaStreamTrackProcessor tests. importScripts("/resources/testharness.js"); function makeVideoFrame(timestamp) { const canvas = new OffscreenCanvas(100, 100); const ctx = canvas.getContext('2d'); return new VideoFrame(canvas, {timestamp}); } promise_test(async t => { // The generator will be used as the source for the processor to // produce frames in a controlled manner. const generator = new VideoTrackGenerator(); t.add_cleanup(() => generator.track.stop()); // Use a larger maxBufferSize than the default to ensure no frames // will be dropped. const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10}); const reader = processor.readable.getReader(); const writer = generator.writable.getWriter(); let numReads = 0; let resolve = null; const promise = new Promise(r => resolve = r); const numOperations = 4; // Issue reads without waiting for the frames to arrive. for (let i = 0; i < numOperations; i++) { reader.read().then(dv=> { dv.value.close(); if (++numReads == numOperations) resolve(); }); } // Write video frames in different tasks to "slowly" settle the pending read // requests. for (let i = 0; it.step_timeout(r,0)); } return promise; }, "Tests that multiple read requests are eventually settled"); promise_test(async t => { // The generator will be used as the source for the processor to // produce frames in a controlled manner. const generator = new VideoTrackGenerator(); t.add_cleanup(() => generator.track.stop()); generator.track.enabled = false; const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10}); const reader = processor.readable.getReader(); const writer = generator.writable.getWriter(); await writer.write(makeVideoFrame(0)); await writer.write(makeVideoFrame(1)); let hasVideoFrame = false; const promise = reader.read().then(chunk => { hasVideoFrame = true; chunk.value.close(); }); await new Promise(resolve => t.step_timeout(resolve, 100)); assert_false(hasVideoFrame, "test1"); generator.track.enabled = true; await new Promise(resolve => t.step_timeout(resolve, 100)); assert_false(hasVideoFrame, "test2"); await writer.write(makeVideoFrame(2)); await promise; }, "Tests that MediaStreamTrackProcess respects track.enabled"); done();