blob: 0f58a3ba28f56ee44f73d210cccbb22248981e97 [file] [log] [blame]
<!DOCTYPE HTML>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
promise_test(function() {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(function(stream) {
var capabilities = stream.getAudioTracks()[0].getCapabilities();
assert_equals(Object.keys(capabilities).length, 9);
assert_true(capabilities.hasOwnProperty('deviceId'));
assert_true(capabilities.hasOwnProperty('groupId'));
assert_true(capabilities.hasOwnProperty('sampleSize'));
assert_true(capabilities.hasOwnProperty('channelCount'));
assert_true(capabilities.hasOwnProperty('sampleRate'));
assert_true(capabilities.hasOwnProperty('latency'));
verifyAudioProcessingProperties(capabilities, true);
});
}, 'getCapabilities() support for getUserMedia() audio track.');
promise_test(function() {
return navigator.mediaDevices.getUserMedia({video: true})
.then(function(stream) {
var capabilities = stream.getVideoTracks()[0].getCapabilities();
assert_greater_than(Object.keys(capabilities).length, 0);
assert_true(capabilities.hasOwnProperty('deviceId'));
assert_true(capabilities.hasOwnProperty('groupId'));
assert_true(capabilities.hasOwnProperty('facingMode'));
verifyVideoRangeProperties(capabilities);
assert_true(capabilities.hasOwnProperty('resizeMode'));
assert_in_array('none', capabilities.resizeMode);
assert_in_array('crop-and-scale', capabilities.resizeMode);
});
}, 'getCapabilities() support for getUserMedia() video track.');
test(function() {
var stream = (new AudioContext()).createMediaStreamDestination().stream;
var capabilities = stream.getAudioTracks()[0].getCapabilities();
assert_equals(Object.keys(capabilities).length, 5);
assert_true(capabilities.hasOwnProperty('deviceId'));
assert_true(capabilities.hasOwnProperty('sampleSize'));
verifyAudioProcessingProperties(capabilities, false);
}, 'getCapabilities() support for audio track associated with a MediaStreamAudioDestinationNode.');
test(function() {
var canvas = document.createElement('canvas');
var stream = canvas.captureStream();
var capabilities = stream.getVideoTracks()[0].getCapabilities();
assert_greater_than(Object.keys(capabilities).length, 0);
assert_true(capabilities.hasOwnProperty('deviceId'));
assert_true(capabilities.hasOwnProperty('facingMode'));
assert_equals(Object.keys(capabilities.facingMode).length, 0);
verifyVideoRangeProperties(capabilities);
assert_true(capabilities.hasOwnProperty('resizeMode'));
assert_in_array('none', capabilities.resizeMode);
assert_in_array('crop-and-scale', capabilities.resizeMode);
}, 'getCapabilities() support for video track associated with a canvas element.');
test(function() {
var video = document.createElement('video');
video.src = "../../external/wpt/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm";
video.play();
video.oncanplay = function() {
var stream = video.captureStream();
var audioCapabilities = stream.getAudioTracks()[0].getCapabilities();
var videoCapabilities = stream.getVideoTracks()[0].getCapabilities();
assert_equals(Object.keys(audioCapabilities).length, 5);
assert_true(audioCapabilities.hasOwnProperty('deviceId'));
assert_true(audioCapabilities.hasOwnProperty('sampleSize'));
verifyAudioProcessingProperties(audioCapabilities, false);
assert_greater_than(Object.keys(videoCapabilities).length, 0);
assert_true(videoCapabilities.hasOwnProperty('deviceId'));
assert_true(videoCapabilities.hasOwnProperty('facingMode'));
assert_equals(Object.keys(videoCapabilities.facingMode).length, 0);
verifyVideoRangeProperties(videoCapabilities);
assert_true(videoCapabilities.hasOwnProperty('resizeMode'));
assert_in_array('none', videoCapabilities.resizeMode);
assert_in_array('crop-and-scale', videoCapabilities.resizeMode);
};
}, 'getCapabilities() support for audio and video tracks associated with a video element.');
promise_test(function() {
var caller = new RTCPeerConnection();
var callee = new RTCPeerConnection();
return navigator.mediaDevices.getUserMedia({audio:true, video:true})
.then((stream) => {
caller.addStream(stream);
return createAndSetOffer(caller, callee);
}).then(() => {
var remoteStream = callee.getRemoteStreams()[0];
var audioCapabilities = remoteStream.getAudioTracks()[0].getCapabilities();
var videoCapabilities = remoteStream.getVideoTracks()[0].getCapabilities();
assert_equals(Object.keys(audioCapabilities).length, 5);
assert_true(audioCapabilities.hasOwnProperty('deviceId'));
assert_true(audioCapabilities.hasOwnProperty('sampleSize'));
verifyAudioProcessingProperties(audioCapabilities, false);
assert_greater_than(Object.keys(videoCapabilities).length, 0);
assert_true(videoCapabilities.hasOwnProperty('deviceId'));
assert_true(videoCapabilities.hasOwnProperty('facingMode'));
assert_equals(Object.keys(videoCapabilities.facingMode).length, 0);
assert_true(videoCapabilities.hasOwnProperty('resizeMode'));
assert_in_array('none', videoCapabilities.resizeMode);
assert_in_array('crop-and-scale', videoCapabilities.resizeMode);
});
}, 'getCapabilities() support for audio and video tracks associated with a RTCPeerConnection.');
function createAndSetOffer(caller, callee) {
var description = null;
return caller.createOffer()
.then(offer => {
description = offer;
return caller.setLocalDescription(description);
}).then(() => {
return callee.setRemoteDescription(description);
});
}
function verifyAudioProcessingProperties(capabilities, is_get_user_media) {
assert_true(capabilities.hasOwnProperty('echoCancellation'));
assert_equals(Object.keys(capabilities.echoCancellation).length, is_get_user_media ? 2 : 1);
assert_true(capabilities.hasOwnProperty('autoGainControl'));
assert_equals(Object.keys(capabilities.autoGainControl).length, is_get_user_media ? 2 : 1);
assert_true(capabilities.hasOwnProperty('noiseSuppression'));
assert_equals(Object.keys(capabilities.noiseSuppression).length, is_get_user_media ? 2 : 1);
}
function verifyVideoRangeProperties(capabilities) {
if (capabilities.hasOwnProperty('width')) {
assert_equals(Object.keys(capabilities.width).length, 2);
assert_true(capabilities.width.hasOwnProperty('min'));
assert_true(capabilities.width.hasOwnProperty('max'));
assert_less_than_equal(capabilities.width.min, capabilities.width.max);
}
if (capabilities.hasOwnProperty('height')) {
assert_equals(Object.keys(capabilities.height).length, 2);
assert_true(capabilities.height.hasOwnProperty('min'));
assert_true(capabilities.height.hasOwnProperty('max'));
assert_less_than_equal(capabilities.height.min, capabilities.height.max);
}
if (capabilities.hasOwnProperty('aspectRatio')) {
assert_equals(Object.keys(capabilities.aspectRatio).length, 2);
assert_true(capabilities.aspectRatio.hasOwnProperty('min'));
assert_true(capabilities.aspectRatio.hasOwnProperty('max'));
assert_less_than_equal(capabilities.aspectRatio.min, capabilities.aspectRatio.max);
}
if (capabilities.hasOwnProperty('frameRate')) {
assert_equals(Object.keys(capabilities.frameRate).length, 2);
assert_true(capabilities.frameRate.hasOwnProperty('min'));
assert_true(capabilities.frameRate.hasOwnProperty('max'));
assert_less_than_equal(capabilities.frameRate.min, capabilities.frameRate.max);
}
}
</script>