MediaStreamTrackProcessor.worker.js (2499B)
1 // META: title=MediaStreamTrackProcessor tests. 2 3 importScripts("/resources/testharness.js"); 4 5 function makeVideoFrame(timestamp) { 6 const canvas = new OffscreenCanvas(100, 100); 7 const ctx = canvas.getContext('2d'); 8 return new VideoFrame(canvas, {timestamp}); 9 } 10 11 promise_test(async t => { 12 // The generator will be used as the source for the processor to 13 // produce frames in a controlled manner. 14 const generator = new VideoTrackGenerator(); 15 t.add_cleanup(() => generator.track.stop()); 16 // Use a larger maxBufferSize than the default to ensure no frames 17 // will be dropped. 18 const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10}); 19 const reader = processor.readable.getReader(); 20 const writer = generator.writable.getWriter(); 21 22 let numReads = 0; 23 let resolve = null; 24 const promise = new Promise(r => resolve = r); 25 26 const numOperations = 4; 27 // Issue reads without waiting for the frames to arrive. 28 for (let i = 0; i < numOperations; i++) { 29 reader.read().then(dv=> { 30 dv.value.close(); 31 if (++numReads == numOperations) 32 resolve(); 33 }); 34 } 35 36 // Write video frames in different tasks to "slowly" settle the pending read 37 // requests. 38 for (let i = 0; i<numOperations; i++) { 39 await writer.write(makeVideoFrame(i)); 40 await new Promise(r=>t.step_timeout(r,0)); 41 } 42 43 return promise; 44 45 }, "Tests that multiple read requests are eventually settled"); 46 47 promise_test(async t => { 48 // The generator will be used as the source for the processor to 49 // produce frames in a controlled manner. 50 const generator = new VideoTrackGenerator(); 51 t.add_cleanup(() => generator.track.stop()); 52 53 generator.track.enabled = false; 54 const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10}); 55 const reader = processor.readable.getReader(); 56 const writer = generator.writable.getWriter(); 57 58 await writer.write(makeVideoFrame(0)); 59 await writer.write(makeVideoFrame(1)); 60 61 let hasVideoFrame = false; 62 const promise = reader.read().then(chunk => { 63 hasVideoFrame = true; 64 chunk.value.close(); 65 }); 66 67 await new Promise(resolve => t.step_timeout(resolve, 100)); 68 assert_false(hasVideoFrame, "test1"); 69 70 generator.track.enabled = true; 71 72 await new Promise(resolve => t.step_timeout(resolve, 100)); 73 assert_false(hasVideoFrame, "test2"); 74 75 await writer.write(makeVideoFrame(2)); 76 await promise; 77 }, "Tests that MediaStreamTrackProcess respects track.enabled"); 78 79 done();