mirror of
https://github.com/servo/servo.git
synced 2025-06-25 09:34:32 +01:00
105 lines
4.5 KiB
HTML
105 lines
4.5 KiB
HTML
<!doctype html>
|
||
<meta charset=utf-8>
|
||
<!-- This file contains two tests that wait for 10 seconds each. -->
|
||
<meta name="timeout" content="long">
|
||
<title>RTCRtpReceiver.prototype.getSynchronizationSources</title>
|
||
<script src="/resources/testharness.js"></script>
|
||
<script src="/resources/testharnessreport.js"></script>
|
||
<script src="RTCPeerConnection-helper.js"></script>
|
||
<script>
|
||
'use strict';
|
||
|
||
async function initiateSingleTrackCallAndReturnReceiver(t, kind) {
|
||
const pc1 = new RTCPeerConnection();
|
||
t.add_cleanup(() => pc1.close());
|
||
const pc2 = new RTCPeerConnection();
|
||
t.add_cleanup(() => pc2.close());
|
||
|
||
const stream = await getNoiseStream({[kind]:true});
|
||
const [track] = stream.getTracks();
|
||
t.add_cleanup(() => track.stop());
|
||
pc1.addTrack(track, stream);
|
||
|
||
exchangeIceCandidates(pc1, pc2);
|
||
const trackEvent = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||
await exchangeAnswer(pc1, pc2);
|
||
return trackEvent.receiver;
|
||
}
|
||
|
||
for (const kind of ['audio', 'video']) {
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
await listenForSSRCs(t, receiver);
|
||
}, '[' + kind + '] getSynchronizationSources() eventually returns a ' +
|
||
'non-empty list');
|
||
|
||
promise_test(async t => {
|
||
const startTime = performance.now();
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.timestamp, 'number');
|
||
assert_true(ssrc.timestamp >= startTime);
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is a number');
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.rtpTimestamp, 'number');
|
||
assert_greater_than_equal(ssrc.rtpTimestamp, 0);
|
||
assert_less_than_equal(ssrc.rtpTimestamp, 0xffffffff);
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.rtpTimestamp is a number ' +
|
||
'[0, 2^32-1]');
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
// Wait for packets to start flowing.
|
||
await listenForSSRCs(t, receiver);
|
||
// Wait for 10 seconds.
|
||
await new Promise(resolve => t.step_timeout(resolve, 10000));
|
||
let earliestTimestamp = undefined;
|
||
let latestTimestamp = undefined;
|
||
for (const ssrc of await listenForSSRCs(t, receiver)) {
|
||
if (earliestTimestamp == undefined || earliestTimestamp > ssrc.timestamp)
|
||
earliestTimestamp = ssrc.timestamp;
|
||
if (latestTimestamp == undefined || latestTimestamp < ssrc.timestamp)
|
||
latestTimestamp = ssrc.timestamp;
|
||
}
|
||
assert_true(latestTimestamp - earliestTimestamp <= 10000);
|
||
}, '[' + kind + '] getSynchronizationSources() does not contain SSRCs ' +
|
||
'older than 10 seconds');
|
||
|
||
promise_test(async t => {
|
||
const startTime = performance.timeOrigin + performance.now();
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
const endTime = performance.timeOrigin + performance.now();
|
||
assert_true(startTime <= ssrc.timestamp && ssrc.timestamp <= endTime);
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is comparable to ' +
|
||
'performance.timeOrigin + performance.now()');
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.source, 'number');
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.source is a number');
|
||
}
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.audioLevel, 'number');
|
||
assert_greater_than_equal(ssrc.audioLevel, 0);
|
||
assert_less_than_equal(ssrc.audioLevel, 1);
|
||
}, '[audio-only] RTCRtpSynchronizationSource.audioLevel is a number [0, 1]');
|
||
|
||
// This test only passes if the implementation is sending the RFC 6464 extension
|
||
// header and the "vad" extension attribute is not "off", otherwise
|
||
// voiceActivityFlag is absent. TODO: Consider moving this test to an
|
||
// optional-to-implement subfolder?
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.voiceActivityFlag, 'boolean');
|
||
}, '[audio-only] RTCRtpSynchronizationSource.voiceActivityFlag is a boolean');
|
||
|
||
</script>
|