Revision control

Copy as Markdown

Other Tools

<!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>