97 lines
3.7 KiB
HTML
97 lines
3.7 KiB
HTML
<!doctype html>
|
|
<meta charset=utf-8>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="third_party/sdp/sdp.js"></script>
|
|
<script src="simulcast/simulcast.js"></script>
|
|
<script>
|
|
'use strict';
|
|
|
|
async function pollUntilMultipleOutboundRtps(pc, kTimeoutMs = 10000) {
|
|
const t0 = performance.now();
|
|
while (performance.now() - t0 < kTimeoutMs) {
|
|
const report = await pc.getStats();
|
|
const outboundRtps = Array.from(
|
|
report.values().filter(s => s.type == 'outbound-rtp'));
|
|
if (outboundRtps.length > 1) {
|
|
return;
|
|
}
|
|
}
|
|
throw 'Timed out waiting for multple outbound-rtp stats objects';
|
|
}
|
|
|
|
promise_test(async t => {
|
|
const pc1 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc1.close());
|
|
const pc2 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc2.close());
|
|
pc1.addTransceiver('video');
|
|
|
|
// O/A is needed to ensure outbound-rtp exists.
|
|
await pc1.setLocalDescription();
|
|
await pc2.setRemoteDescription(pc1.localDescription);
|
|
await pc2.setLocalDescription();
|
|
await pc1.setRemoteDescription(pc2.localDescription);
|
|
|
|
const report = await pc1.getStats();
|
|
const outboundRtp = report.values().find(s => s.type == 'outbound-rtp');
|
|
assert_not_equals(outboundRtp, undefined, 'outbound-rtp exists');
|
|
|
|
assert_equals(outboundRtp.encodingIndex, 0, 'encodingIndex is 0');
|
|
}, `In singlecast, encodingIndex is 0`);
|
|
|
|
promise_test(async t => {
|
|
const pc1 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc1.close());
|
|
const pc2 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc2.close());
|
|
|
|
pc1.addTransceiver('video', {sendEncodings: [{rid: 'foo'}, {rid: 'bar'}]});
|
|
// O/A with tweaks to accept simulcast.
|
|
await doOfferToSendSimulcastAndAnswer(pc1, pc2, ['foo', 'bar']);
|
|
|
|
// Workaround to RTP stats lifetime bug: In some browsers it takes a little
|
|
// while before multiple outbound RTP stats objects appear in the report.
|
|
// TODO(https://crbug.com/406585888): Test coverage for this should be added
|
|
// to rtp-stats-lifetime.https.html. When that test passes, delete this
|
|
// workaround.
|
|
await pollUntilMultipleOutboundRtps(pc1);
|
|
|
|
const report = await pc1.getStats();
|
|
// The RTP stream for sendEncodings[0].
|
|
const outboundRtpFoo = report.values().find(
|
|
s => s.type == 'outbound-rtp' && s.rid == 'foo');
|
|
assert_not_equals(outboundRtpFoo, undefined,
|
|
`outbound-rtp with rid:'foo' exists`);
|
|
assert_equals(outboundRtpFoo.encodingIndex, 0,
|
|
`outbound-rtp with rid:'foo' has encodingIndex 0`);
|
|
// The RTP stream for sendEncodings[1].
|
|
const outboundRtpBar = report.values().find(
|
|
s => s.type == 'outbound-rtp' && s.rid == 'bar');
|
|
assert_not_equals(outboundRtpBar, undefined,
|
|
`outbound-rtp with rid:'bar' exists`);
|
|
assert_equals(outboundRtpBar.encodingIndex, 1,
|
|
`outbound-rtp with rid:'bar' has encodingIndex 1`);
|
|
}, `In simulcast, encodingIndex reflects index of sendEncodings`);
|
|
|
|
promise_test(async t => {
|
|
const pc1 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc1.close());
|
|
const pc2 = new RTCPeerConnection();
|
|
t.add_cleanup(() => pc2.close());
|
|
|
|
pc1.addTransceiver('audio');
|
|
// O/A is needed to ensure outbound-rtp exists.
|
|
await pc1.setLocalDescription();
|
|
await pc2.setRemoteDescription(pc1.localDescription);
|
|
await pc2.setLocalDescription();
|
|
await pc1.setRemoteDescription(pc2.localDescription);
|
|
|
|
const report = await pc1.getStats();
|
|
const outboundRtp = report.values().find(s => s.type == 'outbound-rtp');
|
|
assert_not_equals(outboundRtp, undefined, 'outbound-rtp exists');
|
|
|
|
assert_equals(outboundRtp.encodingIndex, undefined,
|
|
'encodingIndex is undefined');
|
|
}, `encodingIndex is undefined for audio streams`);
|
|
</script>
|