| <!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> |