Commit 93fe45b2 authored by Guido Urdaneta's avatar Guido Urdaneta Committed by Commit Bot

[RTCInsertableStreams] Add simulcast test

Bug: 1065838
Change-Id: Id87979155a33bb8bc6daf18555fc4135ab21f3d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2144276Reviewed-by: default avatarMarina Ciocea <marinaciocea@chromium.org>
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758427}
parent 4900686d
<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection Simulcast Tests</title>
<script src="../../external/wpt/webrtc/third_party/sdp/sdp.js"></script>
<script src="../../external/wpt/webrtc/simulcast/simulcast.js"></script>
<script src="../../external/wpt/webrtc/RTCPeerConnection-helper.js"></script>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
// Test based on wpt/webrtc/simulcast/basic.https.html
promise_test(async t => {
const rids = [0, 1, 2];
const pc1 = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true});
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true});
t.add_cleanup(() => pc2.close());
exchangeIceCandidates(pc1, pc2);
const metadataToBeLoaded = [];
let receiverSSRCs = []
pc2.ontrack = t.step_func(e => {
const receiverTransformer = new TransformStream({
async transform(chunk, controller) {
if (receiverSSRCs.indexOf(chunk.synchronizationSource) == -1)
receiverSSRCs.push(chunk.synchronizationSource);
controller.enqueue(chunk);
}
});
const receiverStreams = e.receiver.createEncodedVideoStreams();
receiverStreams.readableStream
.pipeThrough(receiverTransformer)
.pipeTo(receiverStreams.writableStream);
const stream = e.streams[0];
const v = document.createElement('video');
v.autoplay = true;
v.srcObject = stream;
v.id = stream.id
metadataToBeLoaded.push(new Promise((resolve) => {
v.addEventListener('loadedmetadata', () => {
resolve();
});
}));
});
const stream = await navigator.mediaDevices.getUserMedia({video: {width: 1280, height: 720}});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const transceiver = pc1.addTransceiver(stream.getVideoTracks()[0], {
streams: [stream],
sendEncodings: rids.map(rid => {rid}),
});
const senderStreams = transceiver.sender.createEncodedVideoStreams();
let senderSSRCs = [];
const senderTransformer = new TransformStream({
async transform(chunk, controller) {
if (senderSSRCs.indexOf(chunk.synchronizationSource) == -1)
senderSSRCs.push(chunk.synchronizationSource);
controller.enqueue(chunk);
}
});
senderStreams.readableStream
.pipeThrough(senderTransformer)
.pipeTo(senderStreams.writableStream);
const offer = await pc1.createOffer();
await pc1.setLocalDescription(offer),
await pc2.setRemoteDescription({
type: 'offer',
sdp: swapRidAndMidExtensionsInSimulcastOffer(offer, rids),
});
const answer = await pc2.createAnswer();
await pc2.setLocalDescription(answer);
await pc1.setRemoteDescription({
type: 'answer',
sdp: swapRidAndMidExtensionsInSimulcastAnswer(answer, pc1.localDescription, rids),
});
assert_equals(metadataToBeLoaded.length, 3);
await Promise.all(metadataToBeLoaded);
// Ensure that frames from the 3 simulcast layers are exposed.
assert_equals(senderSSRCs.length, 3);
assert_equals(receiverSSRCs.length, 3);
}, 'Basic simulcast setup with three spatial layers');
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment