summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webrtc-svc
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webrtc-svc')
-rw-r--r--testing/web-platform/tests/webrtc-svc/META.yml1
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-av1.html43
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-h264.html18
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp8.html18
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp9.html43
-rw-r--r--testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability.html122
-rw-r--r--testing/web-platform/tests/webrtc-svc/svc-helper.js50
7 files changed, 295 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc-svc/META.yml b/testing/web-platform/tests/webrtc-svc/META.yml
new file mode 100644
index 0000000000..17d93c51a9
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/META.yml
@@ -0,0 +1 @@
+spec: https://w3c.github.io/webrtc-svc/
diff --git a/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-av1.html b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-av1.html
new file mode 100644
index 0000000000..24cfcb8f4a
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-av1.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>AV1 scalabilityMode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCRtpParameters-helper.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-svc/svc-helper.js"></script>
+<script>
+ 'use strict';
+
+ createScalabilityTest('video/AV1', [
+ "L1T1",
+ "L1T2",
+ "L1T3",
+ "L2T1",
+ "L2T2",
+ "L2T3",
+ "L3T1",
+ "L3T2",
+ "L3T3",
+ "L2T1h",
+ "L2T2h",
+ "L2T3h",
+ "S2T1",
+ "S2T2",
+ "S2T3",
+ "S2T1h",
+ "S2T2h",
+ "S2T3h",
+ "S3T1",
+ "S3T2",
+ "S3T3",
+ "S3T1h",
+ "S3T2h",
+ "S3T3h",
+ "L2T2_KEY",
+ "L2T3_KEY",
+ "L3T2_KEY",
+ "L3T3_KEY"
+ ]);
+</script>
diff --git a/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-h264.html b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-h264.html
new file mode 100644
index 0000000000..2a595a8169
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-h264.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>H264 scalabilityMode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCRtpParameters-helper.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-svc/svc-helper.js"></script>
+<script>
+ 'use strict';
+
+ createScalabilityTest('video/H264', [
+ "L1T1",
+ "L1T2",
+ "L1T3"
+ ]);
+</script>
diff --git a/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp8.html b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp8.html
new file mode 100644
index 0000000000..1708ab1017
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp8.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>VP8 scalabilityMode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCRtpParameters-helper.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-svc/svc-helper.js"></script>
+<script>
+ 'use strict';
+
+ createScalabilityTest('video/VP8', [
+ "L1T1",
+ "L1T2",
+ "L1T3"
+ ]);
+</script>
diff --git a/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp9.html b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp9.html
new file mode 100644
index 0000000000..f1f4923868
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/RTCRtpParameters-scalability-vp9.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>VP9 scalabilityMode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCRtpParameters-helper.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-svc/svc-helper.js"></script>
+<script>
+ 'use strict';
+
+ createScalabilityTest('video/VP9', [
+ "L1T1",
+ "L1T2",
+ "L1T3",
+ "L2T1",
+ "L2T2",
+ "L2T3",
+ "L3T1",
+ "L3T2",
+ "L3T3",
+ "L2T1h",
+ "L2T2h",
+ "L2T3h",
+ "S2T1",
+ "S2T2",
+ "S2T3",
+ "S2T1h",
+ "S2T2h",
+ "S2T3h",
+ "S3T1",
+ "S3T2",
+ "S3T3",
+ "S3T1h",
+ "S3T2h",
+ "S3T3h",
+ "L2T2_KEY",
+ "L2T3_KEY",
+ "L3T2_KEY",
+ "L3T3_KEY"
+ ]);
+</script>
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>
diff --git a/testing/web-platform/tests/webrtc-svc/svc-helper.js b/testing/web-platform/tests/webrtc-svc/svc-helper.js
new file mode 100644
index 0000000000..e73ccfa750
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-svc/svc-helper.js
@@ -0,0 +1,50 @@
+function supportsCodec(mimeType) {
+ return RTCRtpSender.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType).length() > 0;
+}
+
+async function supportsScalabilityMode(mimeType, scalabilityMode) {
+ let result = await navigator.mediaCapabilities.encodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: mimeType,
+ width: 60,
+ height: 60,
+ bitrate: 10000,
+ framerate: 30,
+ scalabilityMode: scalabilityMode
+ }
+ });
+ return result.supported;
+}
+
+function createScalabilityTest(mimeType, scalabilityModes) {
+ for (const scalabilityMode of scalabilityModes) {
+ promise_test(async t => {
+ assert_implements_optional(
+ supportsScalabilityMode(mimeType, scalabilityMode),
+ `${mimeType} supported`
+ );
+ 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 stream1 = await getNoiseStream({ video: { signal: 100, width: 60, height: 60 } });
+ const [track1] = stream1.getTracks();
+ t.add_cleanup(() => track1.stop());
+ const transceiver = pc1.addTransceiver(track1, {
+ sendEncodings: [{ scalabilityMode: scalabilityMode }],
+ });
+ transceiver.setCodecPreferences(RTCRtpSender.getCapabilities('video').codecs.filter(c => c.mimeType == mimeType));
+ const haveTrackEvent = new Promise(r => pc2.ontrack = r);
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+ v.srcObject = new MediaStream([(await haveTrackEvent).track]);
+ await new Promise(r => v.onloadedmetadata = r);
+ await detectSignal(t, v, 100);
+ const sendParams = pc1.getSenders()[0].getParameters();
+ assert_equals(sendParams.encodings[0].scalabilityMode, scalabilityMode);
+ }, `${mimeType} - ${scalabilityMode} should produce valid video content`);
+ }
+}