summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html122
1 files changed, 122 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html
new file mode 100644
index 0000000000..d8b1c6e135
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html
@@ -0,0 +1,122 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>RTCRtpParameters encodings</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/dictionary-helper.js"></script>
+<script src="/webrtc/RTCRtpParameters-helper.js"></script>
+<script src="../webrtc/RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-svc/
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const { sender } = pc.addTransceiver('video', {
+ sendEncodings: [{scalabilityMode: 'L1T3'}],
+ });
+
+ const param = sender.getParameters();
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding.scalabilityMode, 'L1T3');
+
+ encoding.scalabilityMode = 'L1T2';
+ await sender.setParameters(param);
+
+ const updatedParam = sender.getParameters();
+ const updatedEncoding = getFirstEncoding(updatedParam);
+
+ assert_equals(updatedEncoding.scalabilityMode, 'L1T2');
+ }, `Setting and updating scalabilityMode to a legal value should be accepted`);
+
+ promise_test(async t => {
+ const capabilities = RTCRtpSender.getCapabilities('video');
+ var svcSupported = false;
+ for (const codec of capabilities.codecs) {
+ if ('scalabilityModes' in codec && codec.scalabilityModes.length > 0) {
+ svcSupported = true;
+ }
+ }
+ assert_true(svcSupported);
+ }, `Sender capabilities should include at least some scalability modes`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const { sender } = pc.addTransceiver('video');
+ const param = sender.getParameters();
+ assert_equals(param.encodings.length, 0);
+ }, 'Not setting sendEncodings results in no mode info before negotiation');
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const { sender } = pc.addTransceiver('video', {
+ sendEncodings: [{}],
+ });
+ const param = sender.getParameters();
+ const encoding = getFirstEncoding(param);
+
+ assert_true(!('scalabilityMode' in encoding));
+ }, 'Not setting a scalability mode results in no mode set before negotiation');
+
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ const { sender } = pc1.addTransceiver('video', {
+ sendEncodings: [{}],
+ });
+ const param = sender.getParameters();
+ const encoding = getFirstEncoding(param);
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+ const param2 = sender.getParameters();
+ const encoding2 = getFirstEncoding(param);
+ assert_true('scalabilityMode' in encoding2);
+ }, 'Not setting a scalability mode results in some mode set after negotiation');
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ assert_throws_dom('OperationError', () => {
+ pc.addTransceiver('video', {
+ sendEncodings: [{scalabilityMode: 'TotalNonsense'}],
+ });
+ });
+ }, 'Setting a scalability mode to nonsense throws an exception');
+
+ promise_test(async t => {
+ const v = document.createElement('video');
+ v.autoplay = true;
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ const transceiver = pc1.addTransceiver('video', {
+ sendEncodings: [{ scalabilityMode: 'L3T3' }],
+ });
+ // Before negotiation, the mode should be preserved.
+ const param = transceiver.sender.getParameters();
+ const encoding = getFirstEncoding(param);
+ assert_true('scalabilityMode' in encoding);
+ // If L3T3 is not supported at all, abort test.
+ assert_implements_optional(encoding.scalabilityMode === 'L3T3');
+ // Pick a codec known to not have L3T3 support
+ const capabilities = RTCRtpSender.getCapabilities('video');
+ const codec = capabilities.codecs.find(c => c.mimeType === 'video/VP8');
+ assert_true(codec !== undefined);
+ transceiver.setCodecPreferences([codec]);
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+ const sendParams = pc1.getSenders()[0].getParameters();
+ assert_not_equals(sendParams.encodings[0].scalabilityMode, 'L3T3');
+ }, 'L3T3 on VP8 should return something other than L3T3');
+</script>