Kyoo/src/videoSupport/playbackMethodDetector.js
2020-01-12 20:58:43 +01:00

159 lines
6.2 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var detect_browser_1 = require("detect-browser");
var method;
(function (method) {
method["direct"] = "Direct Play";
method["transmux"] = "Transmux";
method["transcode"] = "Transcode";
})(method = exports.method || (exports.method = {}));
;
var SupportList = /** @class */ (function () {
function SupportList() {
}
return SupportList;
}());
exports.SupportList = SupportList;
function getPlaybackMethod(player, item) {
var supportList = getWhatIsSupported(player, item);
if (supportList.container) {
if (supportList.videoCodec && supportList.audioCodec)
return method.direct;
return method.transcode;
}
if (supportList.videoCodec && supportList.audioCodec)
return method.transmux;
return method.transcode;
}
exports.getPlaybackMethod = getPlaybackMethod;
function getWhatIsSupported(player, item) {
var supportList = new SupportList();
var browser = detect_browser_1.detect();
if (!browser) {
supportList.container = false;
supportList.videoCodec = false;
supportList.audioCodec = false;
}
else {
supportList.container = containerIsSupported(player, item.container, browser.name) && item.audios.length <= 1;
supportList.videoCodec = videoCodecIsSupported(player, item.video.codec, browser.name);
supportList.audioCodec = audioCodecIsSupported(player, item.audios.map(function (value) { return value.codec; }), browser.name);
}
return (supportList);
}
exports.getWhatIsSupported = getWhatIsSupported;
function containerIsSupported(player, container, browser) {
var supported = false;
switch (container) {
case "asf":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
//videoAudioCodecs = [];
break;
case "avi":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
break;
case "mpg":
case "mpeg":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
break;
case "flv":
supported = browser == "tizen" || browser == "orsay";
break;
case "3gp":
case "mts":
case "trp":
case "vob":
case "vro":
supported = browser == "tizen" || browser == "orsay";
break;
case "mov":
supported = browser == "tizen" || browser == "orsay" || browser == "edge" || browser == "chrome";
break;
case "m2ts":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
break;
case "wmv":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
//videoAudioCodecs = [];
break;
case "ts":
supported = browser == "tizen" || browser == "orsay" || browser == "edge";
break;
case "mp4":
case "m4v":
supported = true;
break;
case "mkv":
supported = browser == "tizen" || browser == "orsay" || browser == "chrome" || browser == "edge";
if (supported)
break;
if (player.canPlayType("video/x-matroska") || player.canPlayType("video/mkv"))
supported = true;
break;
default:
break;
}
return supported;
}
//SHOULD CHECK FOR DEPTH (8bits ok but 10bits unsuported for almost every browsers)
function videoCodecIsSupported(player, codec, browser) {
switch (codec) {
case "h264":
return !!player.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); //The !! is used to parse the string as a bool
case "h265":
case "hevc":
if (browser == "tizen" || browser == "orsay" || browser == "xboxOne" || browser == "ios")
return true;
//SHOULD SUPPORT CHROMECAST ULTRA
// if (browser.chromecast)
// {
// var isChromecastUltra = userAgent.indexOf('aarch64') !== -1;
// if (isChromecastUltra)
// {
// return true;
// }
// }
return !!player.canPlayType('video/hevc; codecs="hevc, aac"');
case "mpeg2video":
return browser == "orsay" || browser == "tizen" || browser == "edge";
case "vc1":
return browser == "orsay" || browser == "tizen" || browser == "edge";
case "msmpeg4v2":
return browser == "orsay" || browser == "tizen";
case "vp8":
return !!player.canPlayType('video/webm; codecs="vp8');
case "vp9":
return !!player.canPlayType('video/webm; codecs="vp9"');
case "vorbis":
return browser == "orsay" || browser == "tizen" || !!player.canPlayType('video/webm; codecs="vp8');
default:
return false;
}
}
//SHOULD CHECK FOR NUMBER OF AUDIO CHANNEL (2 ok but 5 not in some browsers)
function audioCodecIsSupported(player, codecs, browser) {
for (var _i = 0, codecs_1 = codecs; _i < codecs_1.length; _i++) {
var codec = codecs_1[_i];
switch (codec) {
case "mp3":
return !!player.canPlayType('video/mp4; codecs="avc1.640029, mp4a.69"') ||
!!player.canPlayType('video/mp4; codecs="avc1.640029, mp4a.6B"');
case "aac":
return !!player.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"');
case "mp2":
return browser == "orsay" || browser == "tizen" || browser == "edge";
case "pcm_s16le":
case "pcm_s24le":
return browser == "orsay" || browser == "tizen" || browser == "edge";
case "aac_latm":
return browser == "orsay" || browser == "tizen";
case "opus":
return !!player.canPlayType('audio/ogg; codecs="opus"');
case "flac":
return browser == "orsay" || browser == "tizen" || browser == "edge";
default:
return false;
}
}
}
//# sourceMappingURL=playbackMethodDetector.js.map