RTCEncodedVideoFrame-clone.https.html (2350B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>RTCEncodedVideoFrame can be cloned and distributed</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src=/resources/testdriver.js></script> 7 <script src=/resources/testdriver-vendor.js></script> 8 <script src='../../mediacapture-streams/permission-helper.js'></script> 9 <script src="../../webrtc/RTCPeerConnection-helper.js"></script> 10 <script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script> 11 12 <script> 13 "use strict"; 14 promise_test(async t => { 15 const caller = new RTCPeerConnection({encodedInsertableStreams:true}); 16 t.add_cleanup(() => caller.close()); 17 const callee = new RTCPeerConnection({encodedInsertableStreams:true}); 18 t.add_cleanup(() => callee.close()); 19 20 await setMediaPermission("granted", ["camera"]); 21 const stream = await navigator.mediaDevices.getUserMedia({video:true}); 22 const videoTrack = stream.getVideoTracks()[0]; 23 t.add_cleanup(() => videoTrack.stop()); 24 25 const videoSender = caller.addTrack(videoTrack) 26 const senderStreams = videoSender.createEncodedStreams(); 27 const senderReader = senderStreams.readable.getReader(); 28 const senderWriter = senderStreams.writable.getWriter(); 29 30 exchangeIceCandidates(caller, callee); 31 32 // Send 10 frames and stop 33 const numFramesToSend = 10; 34 35 const framesReceivedCorrectly = new Promise((resolve, reject) => { 36 callee.ontrack = async e => { 37 const receiverStreams = e.receiver.createEncodedStreams(); 38 const receiverReader = receiverStreams.readable.getReader(); 39 const receiverWriter = receiverStreams.writable.getWriter(); 40 41 // This should all be able to happen in 5 seconds. 42 // For fast failures, uncomment this line. 43 // t.step_timeout(reject, 5000); 44 for (let i = 0; i < numFramesToSend; i++) { 45 const result = await receiverReader.read(); 46 // Write upstream, purely to avoid "no frame received" error messages 47 receiverWriter.write(result.value); 48 } 49 resolve(); 50 } 51 }); 52 53 await exchangeOfferAnswer(caller, callee); 54 55 for (let i = 0; i < numFramesToSend; i++) { 56 const result = await senderReader.read(); 57 senderWriter.write(structuredClone(result.value)); 58 } 59 return framesReceivedCorrectly; 60 }, "Cloning before sending works"); 61 </script>