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