MediaStreamTrackProcessor-with-window-tracks.https.html (2532B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>MediaStreamTrackProcessor</title> 5 <link rel="help" href="https://w3c.github.io/mediacapture-insertable-streams"> 6 </head> 7 <body> 8 <p class="instructions">When prompted, use the accept button to give permission to use your audio and video devices.</p> 9 <h1 class="instructions">Description</h1> 10 <p class="instructions">This test checks that MediaStreamTrackProcessor works as expected on video MediaStreamTracks.</p> 11 <script src=/resources/testharness.js></script> 12 <script src=/resources/testharnessreport.js></script> 13 <script src=/resources/testdriver.js></script> 14 <script src=/resources/testdriver-vendor.js></script> 15 <script src='/mediacapture-streams/permission-helper.js'></script> 16 <script> 17 async function createWorker(script) { 18 script = script + "self.postMessage('ready');"; 19 const blob = new Blob([script], { type: 'text/javascript' }); 20 const url = URL.createObjectURL(blob); 21 const worker = new Worker(url); 22 await new Promise(resolve => worker.onmessage = () => { 23 resolve(); 24 }); 25 URL.revokeObjectURL(url); 26 return worker; 27 } 28 29 promise_test(async t => { 30 const stream = await navigator.mediaDevices.getUserMedia({video: true}); 31 const track = stream.getTracks()[0]; 32 const worker = await createWorker(` 33 let track; 34 onmessage = async msg => { 35 if (msg.data.type === "stop") { 36 track.stop(); 37 return; 38 } 39 track = msg.data.track; 40 const processor = new MediaStreamTrackProcessor({track}); 41 const reader = processor.readable.getReader(); 42 let readResult = await reader.read(); 43 postMessage(readResult.value); 44 readResult.value.close(); 45 // Continue reading until the stream is done due to a track.stop() 46 while (true) { 47 readResult = await reader.read(); 48 if (readResult.done) { 49 break; 50 } else { 51 readResult.value.close(); 52 } 53 } 54 await reader.closed; 55 postMessage('closed'); 56 } 57 `); 58 59 worker.postMessage({ type: "start", track }, [track]); 60 61 return new Promise(resolve => { 62 worker.onmessage = t.step_func(msg => { 63 if (msg.data instanceof VideoFrame) { 64 msg.data.close(); 65 worker.postMessage({ type: "stop" }); 66 } else if (msg.data == 'closed') { 67 resolve(); 68 } else { 69 assert_unreached(); 70 } 71 }) 72 }); 73 }, "Tests that the reader of a video MediaStreamTrackProcessor produces VideoFrame objects and is closed on track stop while running on a worker"); 74 75 </script> 76 </body> 77 </html>