RTCEncodedVideoFrame-constructor.html (2641B)
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 RTCEncodedVideoFrame(originalFrame, {metadata: originalMetadata}); 24 25 await writer.write(newFrame); 26 } 27 self.postMessage("OK"); 28 }; 29 } 30 31 async function testAudioFrameConstructor(t, enableAbsCaptureTime, enableForSenderFrames) { 32 const worker = new Worker(`data:text/javascript,(${doWork.toString()})()`); 33 const workerPromise = new Promise((resolve, reject) => { 34 worker.onmessage = t.step_func(message => { 35 if (message.data == "OK") { 36 resolve(); 37 } else { 38 reject(message.data); 39 } 40 }); 41 }); 42 43 await initiateCall( 44 t, /*streamOptions=*/{audio: false, video: true}, 45 /*enableAbsCaptureTime=*/enableAbsCaptureTime, worker, /*enableSenderTransform=*/enableForSenderFrames, 46 /*enableReceiverTransform=*/!enableForSenderFrames); 47 48 return workerPromise; 49 } 50 51 promise_test(async t => { 52 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/false) 53 }, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works'); 54 55 promise_test(async t => { 56 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/true) 57 }, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works'); 58 59 promise_test(async t => { 60 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/false) 61 }, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled'); 62 63 promise_test(async t => { 64 return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/true) 65 }, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled'); 66 67 </script>