RTCEncodedAudioFrame-constructor.html (2636B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>Timestamps in RTCEncodedFrame metadata</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/webrtc/RTCPeerConnection-helper.js"></script> 7 <script src="RTCEncodedFrame-timestamps-helper.js"></script> 8 <script> 9 'use strict'; 10 11 function doWork() { 12 onrtctransform = async e => { 13 const reader = e.transformer.readable.getReader(); 14 const writer = e.transformer.writable.getWriter(); 15 for (let i = 0; i<10; i++) { 16 const frameOrDone = await reader.read(); 17 if (frameOrDone.done) { 18 self.postMessage("Unexpected end of stream"); 19 return; 20 } 21 const originalFrame = frameOrDone.value; 22 const originalMetadata= originalFrame.getMetadata(); 23 const newFrame = new RTCEncodedAudioFrame(originalFrame, {metadata: originalMetadata}); 24 await writer.write(newFrame); 25 } 26 self.postMessage("OK"); 27 }; 28 } 29 30 async function testAudioFrameConstructor(t, enableAbsCaptureTime, enableForSenderFrames) { 31 const worker = new Worker(`data:text/javascript,(${doWork.toString()})()`); 32 const workerPromise = new Promise((resolve, reject) => { 33 worker.onmessage = t.step_func(message => { 34 if (message.data == "OK") { 35 resolve(); 36 } else { 37 reject(message.data); 38 } 39 }); 40 }); 41 42 await initiateCall( 43 t, /*streamOptions=*/{audio: true, video: false}, 44 /*enableAbsCaptureTime=*/enableAbsCaptureTime, worker, /*enableSenderTransform=*/enableForSenderFrames, 45 /*enableReceiverTransform=*/!enableForSenderFrames); 46 47 return workerPromise; 48 } 49 50 promise_test(async t => { 51 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/false) 52 }, 'Constructing a new receiver audio frame explicitly using metadata from a previous frame works'); 53 54 promise_test(async t => { 55 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/true) 56 }, 'Constructing a new sender audio frame explicitly using metadata from a previous frame works'); 57 58 promise_test(async t => { 59 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/false) 60 }, 'Constructing a new receiver audio frame explicitly using metadata from a previous frame works, absCaptureTime extension enabled'); 61 62 promise_test(async t => { 63 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/true) 64 }, 'Constructing a new sender audio frame explicitly using metadata from a previous frame works, absCaptureTime extension enabled'); 65 66 </script>