diff options
Diffstat (limited to 'testing/web-platform/tests/webrtc-svc')
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`); + } +} |