RTCEncodedAudioFrame-clone.https.html (2196B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>RTCEncodedAudioFrame 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 caller1 = new RTCPeerConnection(); 16 t.add_cleanup(() => caller1.close()); 17 const callee1 = new RTCPeerConnection({encodedInsertableStreams:true}); 18 t.add_cleanup(() => callee1.close()); 19 await setMediaPermission("granted", ["microphone"]); 20 const inputStream = await navigator.mediaDevices.getUserMedia({audio:true}); 21 const inputTrack = inputStream.getAudioTracks()[0]; 22 t.add_cleanup(() => inputTrack.stop()); 23 caller1.addTrack(inputTrack) 24 exchangeIceCandidates(caller1, callee1); 25 26 const caller2 = new RTCPeerConnection({encodedInsertableStreams:true}); 27 t.add_cleanup(() => caller2.close()); 28 const sender2 = caller2.addTransceiver("audio").sender; 29 const writer2 = sender2.createEncodedStreams().writable.getWriter(); 30 sender2.replaceTrack(new MediaStreamTrackGenerator({ kind: 'audio' })); 31 32 const framesReceivedCorrectly = new Promise((resolve, reject) => { 33 callee1.ontrack = async e => { 34 const receiverStreams = e.receiver.createEncodedStreams(); 35 const receiverReader = receiverStreams.readable.getReader(); 36 const result = await receiverReader.read(); 37 const original = result.value; 38 let clone = structuredClone(original); 39 assert_equals(original.timestamp, clone.timestamp); 40 assert_equals(original.getMetadata().captureTime, clone.getMetadata().captureTime); 41 assert_array_equals(Array.from(original.data), Array.from(clone.data)); 42 await writer2.write(clone); 43 resolve(); 44 } 45 }); 46 47 await exchangeOfferAnswer(caller1, callee1); 48 49 return framesReceivedCorrectly; 50 }, "Cloning before sending works"); 51 </script>