in 2019/functional/formatSupportTest.js [24:398]
var FormatsupportTest = function() {
var tests = [];
var createFunctionalTest = function(name, category, mandatory) {
var t = createTest(name);
t.prototype.index = tests.length;
t.prototype.passes = 0;
t.prototype.failures = 0;
t.prototype.timeouts = 0;
t.prototype.category = category || 'Functional';
if (typeof mandatory === 'boolean') {
t.prototype.mandatory = mandatory;
}
tests.push(t);
return t;
};
/**
* Test if specified type is supported through MediaSource.isTypeSupported.
*/
var createSupportTest = function(name, evaluate, mandatory) {
var logResult = function(format, result) {
this.runner.log('[' + this.desc + '] - isTypeSupported("' + format +
'") returned: ' + result);
};
var test = createFunctionalTest(name, 'Support', mandatory);
test.prototype.title = 'Test ' + name;
test.prototype.start = function() {
try {
if (evaluate(logResult.bind(this)))
this.runner.succeed();
else
throw name + ' failed.';
} catch (e) {
this.runner.fail(e);
}
}
};
var isTypeSupportedTest = function(logResult) {
var baselineVideoType = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 360, 30, null, 'bitrate=300000');
var baselineVideoSupported =
MediaSource.isTypeSupported(baselineVideoType);
logResult(baselineVideoType, baselineVideoSupported);
var baselineAudioType =
util.createAudioFormatStr('mp4', 'mp4a.40.2', 'channels=2');
var baselineAudioSupported = MediaSource.isTypeSupported(baselineAudioType);
logResult(baselineAudioType, baselineAudioSupported);
var invalidVideoHeightType = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 10360);
var invalidVideoHeightSupported =
MediaSource.isTypeSupported(invalidVideoHeightType);
logResult(invalidVideoHeightType, invalidVideoHeightSupported);
var invalidAudioChannelsType = util.createAudioFormatStr(
'mp4', 'mp4a.40.2', 'channels=100');
var invalidAudioChannelsSupported =
MediaSource.isTypeSupported(invalidAudioChannelsType);
logResult(invalidAudioChannelsType, invalidAudioChannelsSupported);
if (baselineVideoSupported && baselineAudioSupported &&
!invalidVideoHeightSupported && !invalidAudioChannelsSupported)
return true;
};
createSupportTest('isTypeSupported cryptoblockformat', function(logResult) {
var invalidCryptoBlockFormatType = util.createVideoFormatStr(
'webm', 'vp9', 1280, 720, 23.976, null, 'cryptoblockformat=invalid');
var invalidCryptoBlockFormatSupported =
MediaSource.isTypeSupported(invalidCryptoBlockFormatType);
logResult(
invalidCryptoBlockFormatType, invalidCryptoBlockFormatSupported);
var validCryptoBlockFormatType = util.createVideoFormatStr(
'webm', 'vp9', 1280, 720, 23.976, null, 'cryptoblockformat=subsample');
var validCryptoBlockFormatSupported =
MediaSource.isTypeSupported(validCryptoBlockFormatType);
logResult(validCryptoBlockFormatType, validCryptoBlockFormatSupported);
if (!invalidCryptoBlockFormatSupported && validCryptoBlockFormatSupported) {
return true;
}
});
createSupportTest('isTypeSupported Extensions', isTypeSupportedTest);
createSupportTest(
'H.264 60fps Support',
function(logResult) {
if (!(isTypeSupportedTest(logResult))) return false;
var maxWidth = util.getMaxH264SupportedWindow()[0];
var maxHeight = util.getMaxH264SupportedWindow()[1];
var invalidH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 360, 9999);
var invalidH264Supported = MediaSource.isTypeSupported(invalidH264Type);
logResult(invalidH264Type, invalidH264Supported);
var baselineH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 360, 60)
var baselineH264Supported = MediaSource.isTypeSupported(baselineH264Type);
logResult(baselineH264Type, baselineH264Supported);
var maxResolutionH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', maxWidth, maxHeight, 60);
var maxResolutionH264Supported =
MediaSource.isTypeSupported(maxResolutionH264Type);
logResult(maxResolutionH264Type, maxResolutionH264Supported);
if (baselineH264Supported && maxResolutionH264Supported &&
!invalidH264Supported)
return true;
});
createSupportTest(
'VP9 60fps Support',
function(logResult) {
if (!(isTypeSupportedTest(logResult))) return false;
var maxWidth = util.getMaxVp9SupportedWindow()[0];
var maxHeight = util.getMaxVp9SupportedWindow()[1];
var invalidVp9Type =
util.createVideoFormatStr('webm', 'vp9', 640, 360, 9999);
var invalidVp9Supported = MediaSource.isTypeSupported(invalidVp9Type);
logResult(invalidVp9Type, invalidVp9Supported);
var baselineVp9Type =
util.createVideoFormatStr('webm', 'vp9', 640, 360, 60);
var baselineVp9Supported = MediaSource.isTypeSupported(baselineVp9Type);
logResult(baselineVp9Type, baselineVp9Supported);
var maxVp9Type =
util.createVideoFormatStr('webm', 'vp9', maxWidth, maxHeight, 60);
var maxVp9Supported = MediaSource.isTypeSupported(maxVp9Type);
logResult(maxVp9Type, maxVp9Supported);
if (baselineVp9Supported && maxVp9Supported && !invalidVp9Supported)
return true;
});
createSupportTest(
'H.264 120fps Support',
function(logResult) {
if (!(isTypeSupportedTest(logResult))) return false;
var maxWidth = util.getMaxH264SupportedWindow()[0];
var maxHeight = util.getMaxH264SupportedWindow()[1];
var invalidH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 360, 9999);
var invalidH264Supported = MediaSource.isTypeSupported(invalidH264Type);
logResult(invalidH264Type, invalidH264Supported);
var baselineH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', 640, 360, 120);
var baselineH264Supported = MediaSource.isTypeSupported(baselineH264Type);
logResult(baselineH264Type, baselineH264Supported);
var maxResolutionH264Type = util.createVideoFormatStr(
'mp4', 'avc1.4d401e', maxWidth, maxHeight, 120);;
var maxResolutionH264Supported =
MediaSource.isTypeSupported(maxResolutionH264Type);
logResult(maxResolutionH264Type, maxResolutionH264Supported);
if (baselineH264Supported && maxResolutionH264Supported &&
!invalidH264Supported)
return true;
},
false);
createSupportTest(
'VP9 120fps Support',
function(logResult) {
if (!(isTypeSupportedTest(logResult))) return false;
var maxWidth = util.getMaxVp9SupportedWindow()[0];
var maxHeight = util.getMaxVp9SupportedWindow()[1];
var invalidVp9Type =
util.createVideoFormatStr('webm', 'vp9', 640, 360, 9999);
var invalidVp9Supported = MediaSource.isTypeSupported(invalidVp9Type);
logResult(invalidVp9Type, invalidVp9Supported);
var baselineVp9Type =
util.createVideoFormatStr('webm', 'vp9', 640, 360, 120);
var baselineVp9Supported = MediaSource.isTypeSupported(baselineVp9Type);
logResult(baselineVp9Type, baselineVp9Supported);
var maxVp9Type = util.createVideoFormatStr(
'webm', 'vp9', maxWidth, maxHeight, 120);
var maxVp9Supported = MediaSource.isTypeSupported(maxVp9Type);
logResult(maxVp9Type, maxVp9Supported);
if (baselineVp9Supported && maxVp9Supported && !invalidVp9Supported)
return true;
},
false);
createSupportTest(
'isTypeSupported EOTF Support',
function(logResult) {
var smpte2084Type = util.createVideoFormatStr(
'webm', 'vp9.2', 1280, 720, 30, null, 'eotf=smpte2084');
var smpte2084Supported = MediaSource.isTypeSupported(smpte2084Type);
logResult(smpte2084Type, smpte2084Supported);
var bt709Type = util.createVideoFormatStr(
'webm', 'vp9.2', 1280, 720, 30, null, 'eotf=bt709');
var bt709Supported = MediaSource.isTypeSupported(bt709Type);
logResult(bt709Type, bt709Supported);
var hlgType = util.createVideoFormatStr(
'webm', 'vp9.2', 1280, 720, 30, null, 'eotf=arib-std-b67');
var hlgSupported = MediaSource.isTypeSupported(hlgType);
logResult(hlgType, hlgSupported);
var invalidEOTFType = util.createVideoFormatStr(
'webm', 'vp9.2', 1280, 720, 30, null, 'eotf=strobevision');
var invalidEOTFSupported = MediaSource.isTypeSupported(invalidEOTFType);
logResult(invalidEOTFType, invalidEOTFSupported);
if (smpte2084Supported && bt709Supported &&
hlgSupported && !invalidEOTFSupported)
return true;
},
harnessConfig.support_hdr);
createSupportTest(
'SMPTE2084 Support',
function(logResult) {
var smpte2084Type =
util.createSimpleVideoFormatStr('webm', 'vp9.2', 'eotf=smpte2084');
var smpte2084Supported = MediaSource.isTypeSupported(smpte2084Type);
logResult(smpte2084Type, smpte2084Supported);
if (smpte2084Supported)
return true;
},
harnessConfig.support_hdr);
createSupportTest(
'ARIB STD-B67 Support',
function(logResult) {
var hlgType =
util.createSimpleVideoFormatStr('webm', 'vp9.2', 'eotf=arib-std-b67');
var hlgSupported = MediaSource.isTypeSupported(hlgType);
logResult(hlgType, hlgSupported);
if (hlgSupported)
return true;
},
harnessConfig.support_hdr);
createSupportTest(
'ITU-R BT.709 Support',
function(logResult) {
var bt709Type =
util.createSimpleVideoFormatStr('webm', 'vp9.2', 'eotf=bt709');
var bt709Supported = MediaSource.isTypeSupported(bt709Type);
logResult(bt709Type, bt709Supported);
if (bt709Supported)
return true;
},
harnessConfig.support_hdr);
createSupportTest(
'Spherical(decode-to-texture) Support',
function(logResult) {
if (!(isTypeSupportedTest(logResult))) return false;
var invalidSphericalType = util.createSimpleVideoFormatStr(
'webm', 'vp9', 'decode-to-texture=nope');
var invalidSphericalSupported =
MediaSource.isTypeSupported(invalidSphericalType);
logResult(invalidSphericalType, invalidSphericalSupported);
var validSphericalTrueType = util.createSimpleVideoFormatStr(
'webm', 'vp9', 'decode-to-texture=true');
var validSphericalTrueSupported =
MediaSource.isTypeSupported(validSphericalTrueType);
logResult(validSphericalTrueType, validSphericalTrueSupported);
var validSphericalFalseType = util.createSimpleVideoFormatStr(
'webm', 'vp9', 'decode-to-texture=false');
var validSphericalFalseSupported =
MediaSource.isTypeSupported(validSphericalFalseType);
logResult(validSphericalFalseType, validSphericalFalseSupported);
if (validSphericalTrueSupported && validSphericalFalseSupported &&
!invalidSphericalSupported) {
return true;
}
},
util.isCobalt());
/**
* Validate specified video format could be played.
*/
var createMediaFormatTest = function(name, stream, codec, mandatory) {
var test = createFunctionalTest(name, 'Video / Audio', mandatory);
test.prototype.title = 'Test if browser can play ' + name;
test.prototype.start = function() {
try {
var videoElement = document.createElement('video');
if (!!(MediaSource.isTypeSupported &&
MediaSource.isTypeSupported(
stream + '; codecs="' + codec + '"'))) {
this.runner.succeed();
} else {
throw name + ' not supported.';
}
} catch (e) {
this.runner.fail(e);
}
};
};
createMediaFormatTest('MP4 + H.264', 'video/mp4', 'avc1.4d401e');
createMediaFormatTest('WebM + VP9', 'video/webm', 'vp9');
createMediaFormatTest('WebM + VP9 Profile 2', 'video/webm', 'vp9.2');
createMediaFormatTest('WebM + Opus', 'audio/webm', 'opus', false);
/**
* Validate if VP9 live format can be played.
*/
var createLivePlaybackSupportTest =
function(videoStream, audioStream, expectedPlayTimeInS, sizeToFetch) {
var test = createFunctionalTest(
sizeToFetch ? 'PartialSegmentPlayback' : 'Playback', 'VP9 Live');
test.prototype.title = 'Test if playback of VP9 live format is supported.';
test.prototype.start = function(runner, video) {
var ms = new MediaSource();
var videoSb;
var audioSb;
ms.addEventListener('sourceopen', function() {
videoSb = ms.addSourceBuffer(videoStream.mimetype);
audioSb = ms.addSourceBuffer(audioStream.mimetype);
});
video.src = window.URL.createObjectURL(ms);
var videoXhr = runner.XHRManager.createRequest(
videoStream.src, function(e) {
videoSb.appendBuffer(this.getResponseData());
video.addEventListener('timeupdate', function(e) {
if (!video.paused && video.currentTime > expectedPlayTimeInS) {
runner.succeed();
}
}, 0, sizeToFetch);
video.play();
});
var audioXhr = runner.XHRManager.createRequest(
audioStream.src, function(e) {
audioSb.appendBuffer(this.getResponseData());
videoXhr.send();
}, 0, sizeToFetch);
audioXhr.send();
};
};
createLivePlaybackSupportTest(
Media.VP9.VideoLive, Media.AAC.AudioForVP9Live, 14);
createLivePlaybackSupportTest(
Media.VP9.VideoLive, Media.AAC.AudioForVP9Live, 3, 80000);
return {tests: tests, viewType: 'default'};
};