summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html')
-rw-r--r--testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html217
1 files changed, 217 insertions, 0 deletions
diff --git a/testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html b/testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html
new file mode 100644
index 0000000000..f283956100
--- /dev/null
+++ b/testing/web-platform/tests/media-capabilities/decodingInfo.webrtc.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<title>MediaCapabilities.decodingInfo() for webrtc</title>
+<script src=/resources/testharness.js></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+// Minimal VideoConfiguration that will be allowed per spec. All optional
+// properties are missing.
+const minimalVideoConfiguration = {
+ contentType: 'video/VP9; profile-level="0"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+};
+
+// Minimal AudioConfiguration that will be allowed per spec. All optional
+// properties are missing.
+const minimalAudioConfiguration = {
+ contentType: 'audio/opus',
+};
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ }));
+}, "Test that decodingInfo rejects if the configuration doesn't have an audio or video field");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/VP9',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: -1,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration has a negative framerate");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/VP9"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 0,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration has a framerate set to 0");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/VP9"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: Infinity,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration has a framerate set to Infinity");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'fgeoa',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration contentType doesn't parse");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'audio/fgeoa',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration contentType isn't of type video");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'fgeoa' },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contentType doesn't parse");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'video/fgeoa' },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contentType isn't of type audio");
+
+promise_test(t => {
+ return navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: minimalVideoConfiguration,
+ audio: minimalAudioConfiguration,
+ }).then(ability => {
+ assert_equals(typeof ability.supported, "boolean");
+ assert_equals(typeof ability.smooth, "boolean");
+ assert_equals(typeof ability.powerEfficient, "boolean");
+ });
+}, "Test that decodingInfo returns a valid MediaCapabilitiesInfo objects");
+
+promise_test(t => {
+ return navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/webm; codecs="vp09.00.10.08"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ audio: minimalAudioConfiguration,
+ }).then(ability => {
+ assert_false(ability.supported);
+ assert_false(ability.smooth);
+ assert_false(ability.powerEfficient);
+ });
+}, "Test that decodingInfo returns supported, smooth, and powerEfficient set to false for non-webrtc video content type.");
+
+promise_test(t => {
+ return navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: minimalVideoConfiguration,
+ audio: {
+ contentType: 'audio/webm; codecs="opus"',
+ },
+ }).then(ability => {
+ assert_false(ability.supported);
+ assert_false(ability.smooth);
+ assert_false(ability.powerEfficient);
+ });
+}, "Test that decodingInfo returns supported, smooth, and powerEfficient set to false for non-webrtc audio content type.");
+
+const validAudioCodecs = (() => {
+ // Some codecs that are returned by getCapabilities() are not real codecs,
+ // exclude these from the test.
+ const excludeList = [ 'audio/CN', 'audio/telephone-event', 'audio/red' ];
+ const audioCodecs = [];
+ RTCRtpReceiver.getCapabilities("audio")['codecs'].forEach(codec => {
+ if (excludeList.indexOf(codec.mimeType) < 0 &&
+ audioCodecs.indexOf(codec.mimeType) < 0) {
+ audioCodecs.push(codec.mimeType);
+ }
+ });
+ return audioCodecs;
+})();
+
+validAudioCodecs.forEach(codec => {
+ promise_test(t => {
+ return navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: {
+ contentType: codec
+ }
+ }).then(ability => {
+ assert_true(ability.supported);
+ });
+}, "Test that decodingInfo returns supported true for the codec " + codec + " returned by RTCRtpReceiver.getCapabilities()")}
+);
+
+const validVideoCodecs = (() => {
+ // Some codecs that are returned by getCapabilities() are not real codecs but
+ // only used for error correction, exclude these from the test.
+ const excludeList = [ 'video/rtx', 'video/red', 'video/ulpfec',
+ 'video/flexfec-03' ];
+ const videoCodecs = [];
+
+ RTCRtpReceiver.getCapabilities("video")['codecs'].forEach(codec => {
+ if (excludeList.indexOf(codec.mimeType) < 0) {
+ let mimeType = codec.mimeType;
+ if ('sdpFmtpLine' in codec) {
+ mimeType += "; " + codec.sdpFmtpLine;
+ }
+ if (!(mimeType in videoCodecs)) {
+ videoCodecs.push(mimeType);
+ }
+ }
+ });
+ return videoCodecs;
+})();
+
+validVideoCodecs.forEach(codec => {
+ promise_test(t => {
+ return navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: codec,
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ }
+ }).then(ability => {
+ assert_true(ability.supported);
+ });
+}, "Test that decodingInfo returns supported true for the codec " + codec + " returned by RTCRtpReceiver.getCapabilities()")}
+);
+
+</script>