RTCRtpSynchronizationSource-senderCaptureTimeOffset.html (3716B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <!-- This file contains a test that waits for 2 seconds. --> 4 <meta name="timeout" content="long"> 5 <title>senderCaptureTimeOffset attribute in RTCRtpSynchronizationSource</title> 6 <div><video id="remote" width="124" height="124" autoplay></video></div> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 <script src="/webrtc/RTCPeerConnection-helper.js"></script> 10 <script src="/webrtc-extensions/RTCRtpSynchronizationSource-helper.js"></script> 11 <script> 12 'use strict'; 13 14 function listenForSenderCaptureTimeOffset(t, receiver) { 15 return new Promise((resolve) => { 16 function listen() { 17 const ssrcs = receiver.getSynchronizationSources(); 18 assert_true(ssrcs != undefined); 19 if (ssrcs.length > 0) { 20 assert_equals(ssrcs.length, 1); 21 if (ssrcs[0].captureTimestamp != undefined) { 22 resolve(ssrcs[0].senderCaptureTimeOffset); 23 return true; 24 } 25 } 26 return false; 27 }; 28 t.step_wait(listen, 'No abs-capture-time capture time header extension.'); 29 }); 30 } 31 32 // Passes if `getSynchronizationSources()` contains `senderCaptureTimeOffset` if 33 // and only if expected. 34 for (const kind of ['audio', 'video']) { 35 promise_test(async t => { 36 const [caller, callee] = await initiateSingleTrackCall( 37 t, /* caps= */{[kind]: true}, /* absCaptureTimeOffered= */false, 38 /* absCaptureTimeAnswered= */false); 39 const receiver = callee.getReceivers()[0]; 40 41 for (const ssrc of await listenForSSRCs(t, receiver)) { 42 assert_equals(typeof ssrc.senderCaptureTimeOffset, 'undefined'); 43 } 44 }, '[' + kind + '] getSynchronizationSources() should not contain ' + 45 'senderCaptureTimeOffset if absolute capture time RTP header extension ' + 46 'is not offered'); 47 48 promise_test(async t => { 49 const [caller, callee] = await initiateSingleTrackCall( 50 t, /* caps= */{[kind]: true}, /* absCaptureTimeOffered= */false, 51 /* absCaptureTimeAnswered= */false); 52 const receiver = callee.getReceivers()[0]; 53 54 for (const ssrc of await listenForSSRCs(t, receiver)) { 55 assert_equals(typeof ssrc.senderCaptureTimeOffset, 'undefined'); 56 } 57 }, '[' + kind + '] getSynchronizationSources() should not contain ' + 58 'senderCaptureTimeOffset if absolute capture time RTP header extension ' + 59 'is offered, but not answered'); 60 61 promise_test(async t => { 62 const [caller, callee] = await initiateSingleTrackCall( 63 t, /* caps= */{[kind]: true}, /* absCaptureTimeOffered= */true, 64 /* absCaptureTimeAnswered= */true); 65 const receiver = callee.getReceivers()[0]; 66 let senderCaptureTimeOffset = await listenForSenderCaptureTimeOffset( 67 t, receiver); 68 assert_true(senderCaptureTimeOffset != undefined); 69 }, '[' + kind + '] getSynchronizationSources() should contain ' + 70 'senderCaptureTimeOffset if absolute capture time RTP header extension ' + 71 'is negotiated'); 72 } 73 74 // Passes if `senderCaptureTimeOffset` is zero, which is expected since the test 75 // creates a local peer connection between `caller` and `callee`. 76 promise_test(async t => { 77 const [caller, callee] = await initiateSingleTrackCall( 78 t, /* caps= */{audio: true, video: true}, 79 /* absCaptureTimeOffered= */true, /* absCaptureTimeAnswered= */true); 80 const receivers = callee.getReceivers(); 81 assert_equals(receivers.length, 2); 82 83 for (let i = 0; i < 2; ++i) { 84 let senderCaptureTimeOffset = await listenForSenderCaptureTimeOffset( 85 t, receivers[i]); 86 assert_equals(senderCaptureTimeOffset, 0); 87 } 88 }, 'Audio and video RTCRtpSynchronizationSource.senderCaptureTimeOffset must ' + 89 'be zero'); 90 91 </script>