UNPKG

cloudinary-video-player

Version:

Cloudinary Video Player

1,385 lines (1,169 loc) 3.09 MB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["cloudinary-video-player"] = factory(); else root["cloudinary-video-player"] = factory(); })(self, () => { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "../node_modules/@videojs/vhs-utils/es/byte-helpers.js": /*!*************************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/byte-helpers.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ENDIANNESS: () => (/* binding */ ENDIANNESS), /* harmony export */ IS_BIG_ENDIAN: () => (/* binding */ IS_BIG_ENDIAN), /* harmony export */ IS_LITTLE_ENDIAN: () => (/* binding */ IS_LITTLE_ENDIAN), /* harmony export */ bytesMatch: () => (/* binding */ bytesMatch), /* harmony export */ bytesToNumber: () => (/* binding */ bytesToNumber), /* harmony export */ bytesToString: () => (/* binding */ bytesToString), /* harmony export */ concatTypedArrays: () => (/* binding */ concatTypedArrays), /* harmony export */ countBits: () => (/* binding */ countBits), /* harmony export */ countBytes: () => (/* binding */ countBytes), /* harmony export */ isArrayBufferView: () => (/* binding */ isArrayBufferView), /* harmony export */ isTypedArray: () => (/* binding */ isTypedArray), /* harmony export */ numberToBytes: () => (/* binding */ numberToBytes), /* harmony export */ padStart: () => (/* binding */ padStart), /* harmony export */ reverseBytes: () => (/* binding */ reverseBytes), /* harmony export */ sliceBytes: () => (/* binding */ sliceBytes), /* harmony export */ stringToBytes: () => (/* binding */ stringToBytes), /* harmony export */ toBinaryString: () => (/* binding */ toBinaryString), /* harmony export */ toHexString: () => (/* binding */ toHexString), /* harmony export */ toUint8: () => (/* binding */ toUint8) /* harmony export */ }); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! global/window */ "../node_modules/global/window.js"); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(global_window__WEBPACK_IMPORTED_MODULE_0__); // const log2 = Math.log2 ? Math.log2 : (x) => (Math.log(x) / Math.log(2)); var repeat = function repeat(str, len) { var acc = ''; while (len--) { acc += str; } return acc; }; // count the number of bits it would take to represent a number // we used to do this with log2 but BigInt does not support builtin math // Math.ceil(log2(x)); var countBits = function countBits(x) { return x.toString(2).length; }; // count the number of whole bytes it would take to represent a number var countBytes = function countBytes(x) { return Math.ceil(countBits(x) / 8); }; var padStart = function padStart(b, len, str) { if (str === void 0) { str = ' '; } return (repeat(str, len) + b.toString()).slice(-len); }; var isArrayBufferView = function isArrayBufferView(obj) { if (ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(obj); } return obj && obj.buffer instanceof ArrayBuffer; }; var isTypedArray = function isTypedArray(obj) { return isArrayBufferView(obj); }; var toUint8 = function toUint8(bytes) { if (bytes instanceof Uint8Array) { return bytes; } if (!Array.isArray(bytes) && !isTypedArray(bytes) && !(bytes instanceof ArrayBuffer)) { // any non-number or NaN leads to empty uint8array // eslint-disable-next-line if (typeof bytes !== 'number' || typeof bytes === 'number' && bytes !== bytes) { bytes = 0; } else { bytes = [bytes]; } } return new Uint8Array(bytes && bytes.buffer || bytes, bytes && bytes.byteOffset || 0, bytes && bytes.byteLength || 0); }; var toHexString = function toHexString(bytes) { bytes = toUint8(bytes); var str = ''; for (var i = 0; i < bytes.length; i++) { str += padStart(bytes[i].toString(16), 2, '0'); } return str; }; var toBinaryString = function toBinaryString(bytes) { bytes = toUint8(bytes); var str = ''; for (var i = 0; i < bytes.length; i++) { str += padStart(bytes[i].toString(2), 8, '0'); } return str; }; var BigInt = (global_window__WEBPACK_IMPORTED_MODULE_0___default().BigInt) || Number; var BYTE_TABLE = [BigInt('0x1'), BigInt('0x100'), BigInt('0x10000'), BigInt('0x1000000'), BigInt('0x100000000'), BigInt('0x10000000000'), BigInt('0x1000000000000'), BigInt('0x100000000000000'), BigInt('0x10000000000000000')]; var ENDIANNESS = function () { var a = new Uint16Array([0xFFCC]); var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength); if (b[0] === 0xFF) { return 'big'; } if (b[0] === 0xCC) { return 'little'; } return 'unknown'; }(); var IS_BIG_ENDIAN = ENDIANNESS === 'big'; var IS_LITTLE_ENDIAN = ENDIANNESS === 'little'; var bytesToNumber = function bytesToNumber(bytes, _temp) { var _ref = _temp === void 0 ? {} : _temp, _ref$signed = _ref.signed, signed = _ref$signed === void 0 ? false : _ref$signed, _ref$le = _ref.le, le = _ref$le === void 0 ? false : _ref$le; bytes = toUint8(bytes); var fn = le ? 'reduce' : 'reduceRight'; var obj = bytes[fn] ? bytes[fn] : Array.prototype[fn]; var number = obj.call(bytes, function (total, byte, i) { var exponent = le ? i : Math.abs(i + 1 - bytes.length); return total + BigInt(byte) * BYTE_TABLE[exponent]; }, BigInt(0)); if (signed) { var max = BYTE_TABLE[bytes.length] / BigInt(2) - BigInt(1); number = BigInt(number); if (number > max) { number -= max; number -= max; number -= BigInt(2); } } return Number(number); }; var numberToBytes = function numberToBytes(number, _temp2) { var _ref2 = _temp2 === void 0 ? {} : _temp2, _ref2$le = _ref2.le, le = _ref2$le === void 0 ? false : _ref2$le; // eslint-disable-next-line if (typeof number !== 'bigint' && typeof number !== 'number' || typeof number === 'number' && number !== number) { number = 0; } number = BigInt(number); var byteCount = countBytes(number); var bytes = new Uint8Array(new ArrayBuffer(byteCount)); for (var i = 0; i < byteCount; i++) { var byteIndex = le ? i : Math.abs(i + 1 - bytes.length); bytes[byteIndex] = Number(number / BYTE_TABLE[i] & BigInt(0xFF)); if (number < 0) { bytes[byteIndex] = Math.abs(~bytes[byteIndex]); bytes[byteIndex] -= i === 0 ? 1 : 2; } } return bytes; }; var bytesToString = function bytesToString(bytes) { if (!bytes) { return ''; } // TODO: should toUint8 handle cases where we only have 8 bytes // but report more since this is a Uint16+ Array? bytes = Array.prototype.slice.call(bytes); var string = String.fromCharCode.apply(null, toUint8(bytes)); try { return decodeURIComponent(escape(string)); } catch (e) {// if decodeURIComponent/escape fails, we are dealing with partial // or full non string data. Just return the potentially garbled string. } return string; }; var stringToBytes = function stringToBytes(string, stringIsBytes) { if (typeof string !== 'string' && string && typeof string.toString === 'function') { string = string.toString(); } if (typeof string !== 'string') { return new Uint8Array(); } // If the string already is bytes, we don't have to do this // otherwise we do this so that we split multi length characters // into individual bytes if (!stringIsBytes) { string = unescape(encodeURIComponent(string)); } var view = new Uint8Array(string.length); for (var i = 0; i < string.length; i++) { view[i] = string.charCodeAt(i); } return view; }; var concatTypedArrays = function concatTypedArrays() { for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) { buffers[_key] = arguments[_key]; } buffers = buffers.filter(function (b) { return b && (b.byteLength || b.length) && typeof b !== 'string'; }); if (buffers.length <= 1) { // for 0 length we will return empty uint8 // for 1 length we return the first uint8 return toUint8(buffers[0]); } var totalLen = buffers.reduce(function (total, buf, i) { return total + (buf.byteLength || buf.length); }, 0); var tempBuffer = new Uint8Array(totalLen); var offset = 0; buffers.forEach(function (buf) { buf = toUint8(buf); tempBuffer.set(buf, offset); offset += buf.byteLength; }); return tempBuffer; }; /** * Check if the bytes "b" are contained within bytes "a". * * @param {Uint8Array|Array} a * Bytes to check in * * @param {Uint8Array|Array} b * Bytes to check for * * @param {Object} options * options * * @param {Array|Uint8Array} [offset=0] * offset to use when looking at bytes in a * * @param {Array|Uint8Array} [mask=[]] * mask to use on bytes before comparison. * * @return {boolean} * If all bytes in b are inside of a, taking into account * bit masks. */ var bytesMatch = function bytesMatch(a, b, _temp3) { var _ref3 = _temp3 === void 0 ? {} : _temp3, _ref3$offset = _ref3.offset, offset = _ref3$offset === void 0 ? 0 : _ref3$offset, _ref3$mask = _ref3.mask, mask = _ref3$mask === void 0 ? [] : _ref3$mask; a = toUint8(a); b = toUint8(b); // ie 11 does not support uint8 every var fn = b.every ? b.every : Array.prototype.every; return b.length && a.length - offset >= b.length && // ie 11 doesn't support every on uin8 fn.call(b, function (bByte, i) { var aByte = mask[i] ? mask[i] & a[offset + i] : a[offset + i]; return bByte === aByte; }); }; var sliceBytes = function sliceBytes(src, start, end) { if (Uint8Array.prototype.slice) { return Uint8Array.prototype.slice.call(src, start, end); } return new Uint8Array(Array.prototype.slice.call(src, start, end)); }; var reverseBytes = function reverseBytes(src) { if (src.reverse) { return src.reverse(); } return Array.prototype.reverse.call(src); }; /***/ }), /***/ "../node_modules/@videojs/vhs-utils/es/codec-helpers.js": /*!**************************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/codec-helpers.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getAv1Codec: () => (/* binding */ getAv1Codec), /* harmony export */ getAvcCodec: () => (/* binding */ getAvcCodec), /* harmony export */ getHvcCodec: () => (/* binding */ getHvcCodec) /* harmony export */ }); /* harmony import */ var _byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./byte-helpers.js */ "../node_modules/@videojs/vhs-utils/es/byte-helpers.js"); // https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-syntax // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter#AV1 var getAv1Codec = function getAv1Codec(bytes) { var codec = ''; var profile = bytes[1] >>> 3; var level = bytes[1] & 0x1F; var tier = bytes[2] >>> 7; var highBitDepth = (bytes[2] & 0x40) >> 6; var twelveBit = (bytes[2] & 0x20) >> 5; var monochrome = (bytes[2] & 0x10) >> 4; var chromaSubsamplingX = (bytes[2] & 0x08) >> 3; var chromaSubsamplingY = (bytes[2] & 0x04) >> 2; var chromaSamplePosition = bytes[2] & 0x03; codec += profile + "." + (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.padStart)(level, 2, '0'); if (tier === 0) { codec += 'M'; } else if (tier === 1) { codec += 'H'; } var bitDepth; if (profile === 2 && highBitDepth) { bitDepth = twelveBit ? 12 : 10; } else { bitDepth = highBitDepth ? 10 : 8; } codec += "." + (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.padStart)(bitDepth, 2, '0'); // TODO: can we parse color range?? codec += "." + monochrome; codec += "." + chromaSubsamplingX + chromaSubsamplingY + chromaSamplePosition; return codec; }; var getAvcCodec = function getAvcCodec(bytes) { var profileId = (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toHexString)(bytes[1]); var constraintFlags = (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toHexString)(bytes[2] & 0xFC); var levelId = (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toHexString)(bytes[3]); return "" + profileId + constraintFlags + levelId; }; var getHvcCodec = function getHvcCodec(bytes) { var codec = ''; var profileSpace = bytes[1] >> 6; var profileId = bytes[1] & 0x1F; var tierFlag = (bytes[1] & 0x20) >> 5; var profileCompat = bytes.subarray(2, 6); var constraintIds = bytes.subarray(6, 12); var levelId = bytes[12]; if (profileSpace === 1) { codec += 'A'; } else if (profileSpace === 2) { codec += 'B'; } else if (profileSpace === 3) { codec += 'C'; } codec += profileId + "."; // ffmpeg does this in big endian var profileCompatVal = parseInt((0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toBinaryString)(profileCompat).split('').reverse().join(''), 2); // apple does this in little endian... if (profileCompatVal > 255) { profileCompatVal = parseInt((0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toBinaryString)(profileCompat), 2); } codec += profileCompatVal.toString(16) + "."; if (tierFlag === 0) { codec += 'L'; } else { codec += 'H'; } codec += levelId; var constraints = ''; for (var i = 0; i < constraintIds.length; i++) { var v = constraintIds[i]; if (v) { if (constraints) { constraints += '.'; } constraints += v.toString(16); } } if (constraints) { codec += "." + constraints; } return codec; }; /***/ }), /***/ "../node_modules/@videojs/vhs-utils/es/codecs.js": /*!*******************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/codecs.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DEFAULT_AUDIO_CODEC: () => (/* binding */ DEFAULT_AUDIO_CODEC), /* harmony export */ DEFAULT_VIDEO_CODEC: () => (/* binding */ DEFAULT_VIDEO_CODEC), /* harmony export */ browserSupportsCodec: () => (/* binding */ browserSupportsCodec), /* harmony export */ codecsFromDefault: () => (/* binding */ codecsFromDefault), /* harmony export */ getMimeForCodec: () => (/* binding */ getMimeForCodec), /* harmony export */ isAudioCodec: () => (/* binding */ isAudioCodec), /* harmony export */ isTextCodec: () => (/* binding */ isTextCodec), /* harmony export */ isVideoCodec: () => (/* binding */ isVideoCodec), /* harmony export */ mapLegacyAvcCodecs: () => (/* binding */ mapLegacyAvcCodecs), /* harmony export */ muxerSupportsCodec: () => (/* binding */ muxerSupportsCodec), /* harmony export */ parseCodecs: () => (/* binding */ parseCodecs), /* harmony export */ translateLegacyCodec: () => (/* binding */ translateLegacyCodec), /* harmony export */ translateLegacyCodecs: () => (/* binding */ translateLegacyCodecs) /* harmony export */ }); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! global/window */ "../node_modules/global/window.js"); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(global_window__WEBPACK_IMPORTED_MODULE_0__); var regexs = { // to determine mime types mp4: /^(av0?1|avc0?[1234]|vp0?9|flac|opus|mp3|mp4a|mp4v|stpp.ttml.im1t)/, webm: /^(vp0?[89]|av0?1|opus|vorbis)/, ogg: /^(vp0?[89]|theora|flac|opus|vorbis)/, // to determine if a codec is audio or video video: /^(av0?1|avc0?[1234]|vp0?[89]|hvc1|hev1|theora|mp4v)/, audio: /^(mp4a|flac|vorbis|opus|ac-[34]|ec-3|alac|mp3|speex|aac)/, text: /^(stpp.ttml.im1t)/, // mux.js support regex muxerVideo: /^(avc0?1)/, muxerAudio: /^(mp4a)/, // match nothing as muxer does not support text right now. // there cannot never be a character before the start of a string // so this matches nothing. muxerText: /a^/ }; var mediaTypes = ['video', 'audio', 'text']; var upperMediaTypes = ['Video', 'Audio', 'Text']; /** * Replace the old apple-style `avc1.<dd>.<dd>` codec string with the standard * `avc1.<hhhhhh>` * * @param {string} codec * Codec string to translate * @return {string} * The translated codec string */ var translateLegacyCodec = function translateLegacyCodec(codec) { if (!codec) { return codec; } return codec.replace(/avc1\.(\d+)\.(\d+)/i, function (orig, profile, avcLevel) { var profileHex = ('00' + Number(profile).toString(16)).slice(-2); var avcLevelHex = ('00' + Number(avcLevel).toString(16)).slice(-2); return 'avc1.' + profileHex + '00' + avcLevelHex; }); }; /** * Replace the old apple-style `avc1.<dd>.<dd>` codec strings with the standard * `avc1.<hhhhhh>` * * @param {string[]} codecs * An array of codec strings to translate * @return {string[]} * The translated array of codec strings */ var translateLegacyCodecs = function translateLegacyCodecs(codecs) { return codecs.map(translateLegacyCodec); }; /** * Replace codecs in the codec string with the old apple-style `avc1.<dd>.<dd>` to the * standard `avc1.<hhhhhh>`. * * @param {string} codecString * The codec string * @return {string} * The codec string with old apple-style codecs replaced * * @private */ var mapLegacyAvcCodecs = function mapLegacyAvcCodecs(codecString) { return codecString.replace(/avc1\.(\d+)\.(\d+)/i, function (match) { return translateLegacyCodecs([match])[0]; }); }; /** * @typedef {Object} ParsedCodecInfo * @property {number} codecCount * Number of codecs parsed * @property {string} [videoCodec] * Parsed video codec (if found) * @property {string} [videoObjectTypeIndicator] * Video object type indicator (if found) * @property {string|null} audioProfile * Audio profile */ /** * Parses a codec string to retrieve the number of codecs specified, the video codec and * object type indicator, and the audio profile. * * @param {string} [codecString] * The codec string to parse * @return {ParsedCodecInfo} * Parsed codec info */ var parseCodecs = function parseCodecs(codecString) { if (codecString === void 0) { codecString = ''; } var codecs = codecString.split(','); var result = []; codecs.forEach(function (codec) { codec = codec.trim(); var codecType; mediaTypes.forEach(function (name) { var match = regexs[name].exec(codec.toLowerCase()); if (!match || match.length <= 1) { return; } codecType = name; // maintain codec case var type = codec.substring(0, match[1].length); var details = codec.replace(type, ''); result.push({ type: type, details: details, mediaType: name }); }); if (!codecType) { result.push({ type: codec, details: '', mediaType: 'unknown' }); } }); return result; }; /** * Returns a ParsedCodecInfo object for the default alternate audio playlist if there is * a default alternate audio playlist for the provided audio group. * * @param {Object} master * The master playlist * @param {string} audioGroupId * ID of the audio group for which to find the default codec info * @return {ParsedCodecInfo} * Parsed codec info */ var codecsFromDefault = function codecsFromDefault(master, audioGroupId) { if (!master.mediaGroups.AUDIO || !audioGroupId) { return null; } var audioGroup = master.mediaGroups.AUDIO[audioGroupId]; if (!audioGroup) { return null; } for (var name in audioGroup) { var audioType = audioGroup[name]; if (audioType.default && audioType.playlists) { // codec should be the same for all playlists within the audio type return parseCodecs(audioType.playlists[0].attributes.CODECS); } } return null; }; var isVideoCodec = function isVideoCodec(codec) { if (codec === void 0) { codec = ''; } return regexs.video.test(codec.trim().toLowerCase()); }; var isAudioCodec = function isAudioCodec(codec) { if (codec === void 0) { codec = ''; } return regexs.audio.test(codec.trim().toLowerCase()); }; var isTextCodec = function isTextCodec(codec) { if (codec === void 0) { codec = ''; } return regexs.text.test(codec.trim().toLowerCase()); }; var getMimeForCodec = function getMimeForCodec(codecString) { if (!codecString || typeof codecString !== 'string') { return; } var codecs = codecString.toLowerCase().split(',').map(function (c) { return translateLegacyCodec(c.trim()); }); // default to video type var type = 'video'; // only change to audio type if the only codec we have is // audio if (codecs.length === 1 && isAudioCodec(codecs[0])) { type = 'audio'; } else if (codecs.length === 1 && isTextCodec(codecs[0])) { // text uses application/<container> for now type = 'application'; } // default the container to mp4 var container = 'mp4'; // every codec must be able to go into the container // for that container to be the correct one if (codecs.every(function (c) { return regexs.mp4.test(c); })) { container = 'mp4'; } else if (codecs.every(function (c) { return regexs.webm.test(c); })) { container = 'webm'; } else if (codecs.every(function (c) { return regexs.ogg.test(c); })) { container = 'ogg'; } return type + "/" + container + ";codecs=\"" + codecString + "\""; }; /** * Tests whether the codec is supported by MediaSource. Optionally also tests ManagedMediaSource. * * @param {string} codecString * Codec to test * @param {boolean} [withMMS] * Whether to check if ManagedMediaSource supports it * @return {boolean} * Codec is supported */ var browserSupportsCodec = function browserSupportsCodec(codecString, withMMS) { if (codecString === void 0) { codecString = ''; } if (withMMS === void 0) { withMMS = false; } return (global_window__WEBPACK_IMPORTED_MODULE_0___default().MediaSource) && (global_window__WEBPACK_IMPORTED_MODULE_0___default().MediaSource).isTypeSupported && global_window__WEBPACK_IMPORTED_MODULE_0___default().MediaSource.isTypeSupported(getMimeForCodec(codecString)) || withMMS && (global_window__WEBPACK_IMPORTED_MODULE_0___default().ManagedMediaSource) && (global_window__WEBPACK_IMPORTED_MODULE_0___default().ManagedMediaSource).isTypeSupported && global_window__WEBPACK_IMPORTED_MODULE_0___default().ManagedMediaSource.isTypeSupported(getMimeForCodec(codecString)) || false; }; var muxerSupportsCodec = function muxerSupportsCodec(codecString) { if (codecString === void 0) { codecString = ''; } return codecString.toLowerCase().split(',').every(function (codec) { codec = codec.trim(); // any match is supported. for (var i = 0; i < upperMediaTypes.length; i++) { var type = upperMediaTypes[i]; if (regexs["muxer" + type].test(codec)) { return true; } } return false; }); }; var DEFAULT_AUDIO_CODEC = 'mp4a.40.2'; var DEFAULT_VIDEO_CODEC = 'avc1.4d400d'; /***/ }), /***/ "../node_modules/@videojs/vhs-utils/es/containers.js": /*!***********************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/containers.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ detectContainerForBytes: () => (/* binding */ detectContainerForBytes), /* harmony export */ isLikely: () => (/* binding */ isLikely), /* harmony export */ isLikelyFmp4MediaSegment: () => (/* binding */ isLikelyFmp4MediaSegment) /* harmony export */ }); /* harmony import */ var _byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./byte-helpers.js */ "../node_modules/@videojs/vhs-utils/es/byte-helpers.js"); /* harmony import */ var _mp4_helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mp4-helpers.js */ "../node_modules/@videojs/vhs-utils/es/mp4-helpers.js"); /* harmony import */ var _ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ebml-helpers.js */ "../node_modules/@videojs/vhs-utils/es/ebml-helpers.js"); /* harmony import */ var _id3_helpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./id3-helpers.js */ "../node_modules/@videojs/vhs-utils/es/id3-helpers.js"); /* harmony import */ var _nal_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nal-helpers.js */ "../node_modules/@videojs/vhs-utils/es/nal-helpers.js"); var CONSTANTS = { // "webm" string literal in hex 'webm': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x77, 0x65, 0x62, 0x6d]), // "matroska" string literal in hex 'matroska': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x6d, 0x61, 0x74, 0x72, 0x6f, 0x73, 0x6b, 0x61]), // "fLaC" string literal in hex 'flac': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x66, 0x4c, 0x61, 0x43]), // "OggS" string literal in hex 'ogg': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x4f, 0x67, 0x67, 0x53]), // ac-3 sync byte, also works for ec-3 as that is simply a codec // of ac-3 'ac3': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x0b, 0x77]), // "RIFF" string literal in hex used for wav and avi 'riff': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x52, 0x49, 0x46, 0x46]), // "AVI" string literal in hex 'avi': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x41, 0x56, 0x49]), // "WAVE" string literal in hex 'wav': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x57, 0x41, 0x56, 0x45]), // "ftyp3g" string literal in hex '3gp': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x66, 0x74, 0x79, 0x70, 0x33, 0x67]), // "ftyp" string literal in hex 'mp4': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x66, 0x74, 0x79, 0x70]), // "styp" string literal in hex 'fmp4': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x73, 0x74, 0x79, 0x70]), // "ftypqt" string literal in hex 'mov': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x66, 0x74, 0x79, 0x70, 0x71, 0x74]), // moov string literal in hex 'moov': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x6D, 0x6F, 0x6F, 0x76]), // moof string literal in hex 'moof': (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x6D, 0x6F, 0x6F, 0x66]) }; var _isLikely = { aac: function aac(bytes) { var offset = (0,_id3_helpers_js__WEBPACK_IMPORTED_MODULE_3__.getId3Offset)(bytes); return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, [0xFF, 0x10], { offset: offset, mask: [0xFF, 0x16] }); }, mp3: function mp3(bytes) { var offset = (0,_id3_helpers_js__WEBPACK_IMPORTED_MODULE_3__.getId3Offset)(bytes); return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, [0xFF, 0x02], { offset: offset, mask: [0xFF, 0x06] }); }, webm: function webm(bytes) { var docType = (0,_ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.findEbml)(bytes, [_ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.EBML_TAGS.EBML, _ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.EBML_TAGS.DocType])[0]; // check if DocType EBML tag is webm return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(docType, CONSTANTS.webm); }, mkv: function mkv(bytes) { var docType = (0,_ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.findEbml)(bytes, [_ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.EBML_TAGS.EBML, _ebml_helpers_js__WEBPACK_IMPORTED_MODULE_2__.EBML_TAGS.DocType])[0]; // check if DocType EBML tag is matroska return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(docType, CONSTANTS.matroska); }, mp4: function mp4(bytes) { // if this file is another base media file format, it is not mp4 if (_isLikely['3gp'](bytes) || _isLikely.mov(bytes)) { return false; } // if this file starts with a ftyp or styp box its mp4 if ((0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.mp4, { offset: 4 }) || (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.fmp4, { offset: 4 })) { return true; } // if this file starts with a moof/moov box its mp4 if ((0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.moof, { offset: 4 }) || (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.moov, { offset: 4 })) { return true; } }, mov: function mov(bytes) { return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.mov, { offset: 4 }); }, '3gp': function gp(bytes) { return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS['3gp'], { offset: 4 }); }, ac3: function ac3(bytes) { var offset = (0,_id3_helpers_js__WEBPACK_IMPORTED_MODULE_3__.getId3Offset)(bytes); return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.ac3, { offset: offset }); }, ts: function ts(bytes) { if (bytes.length < 189 && bytes.length >= 1) { return bytes[0] === 0x47; } var i = 0; // check the first 376 bytes for two matching sync bytes while (i + 188 < bytes.length && i < 188) { if (bytes[i] === 0x47 && bytes[i + 188] === 0x47) { return true; } i += 1; } return false; }, flac: function flac(bytes) { var offset = (0,_id3_helpers_js__WEBPACK_IMPORTED_MODULE_3__.getId3Offset)(bytes); return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.flac, { offset: offset }); }, ogg: function ogg(bytes) { return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.ogg); }, avi: function avi(bytes) { return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.riff) && (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.avi, { offset: 8 }); }, wav: function wav(bytes) { return (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.riff) && (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(bytes, CONSTANTS.wav, { offset: 8 }); }, 'h264': function h264(bytes) { // find seq_parameter_set_rbsp return (0,_nal_helpers_js__WEBPACK_IMPORTED_MODULE_4__.findH264Nal)(bytes, 7, 3).length; }, 'h265': function h265(bytes) { // find video_parameter_set_rbsp or seq_parameter_set_rbsp return (0,_nal_helpers_js__WEBPACK_IMPORTED_MODULE_4__.findH265Nal)(bytes, [32, 33], 3).length; } }; // get all the isLikely functions // but make sure 'ts' is above h264 and h265 // but below everything else as it is the least specific var isLikelyTypes = Object.keys(_isLikely) // remove ts, h264, h265 .filter(function (t) { return t !== 'ts' && t !== 'h264' && t !== 'h265'; }) // add it back to the bottom .concat(['ts', 'h264', 'h265']); // make sure we are dealing with uint8 data. isLikelyTypes.forEach(function (type) { var isLikelyFn = _isLikely[type]; _isLikely[type] = function (bytes) { return isLikelyFn((0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)(bytes)); }; }); // export after wrapping var isLikely = _isLikely; // A useful list of file signatures can be found here // https://en.wikipedia.org/wiki/List_of_file_signatures var detectContainerForBytes = function detectContainerForBytes(bytes) { bytes = (0,_byte_helpers_js__WEBPACK_IMPORTED_MODULE_0__.toUint8)(bytes); for (var i = 0; i < isLikelyTypes.length; i++) { var type = isLikelyTypes[i]; if (isLikely[type](bytes)) { return type; } } return ''; }; // fmp4 is not a container var isLikelyFmp4MediaSegment = function isLikelyFmp4MediaSegment(bytes) { return (0,_mp4_helpers_js__WEBPACK_IMPORTED_MODULE_1__.findBox)(bytes, ['moof']).length > 0; }; /***/ }), /***/ "../node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js": /*!**************************************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ decodeB64ToUint8Array) /* harmony export */ }); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! global/window */ "../node_modules/global/window.js"); /* harmony import */ var global_window__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(global_window__WEBPACK_IMPORTED_MODULE_0__); var atob = function atob(s) { return (global_window__WEBPACK_IMPORTED_MODULE_0___default().atob) ? global_window__WEBPACK_IMPORTED_MODULE_0___default().atob(s) : Buffer.from(s, 'base64').toString('binary'); }; function decodeB64ToUint8Array(b64Text) { var decodedString = atob(b64Text); var array = new Uint8Array(decodedString.length); for (var i = 0; i < decodedString.length; i++) { array[i] = decodedString.charCodeAt(i); } return array; } /***/ }), /***/ "../node_modules/@videojs/vhs-utils/es/ebml-helpers.js": /*!*************************************************************!*\ !*** ../node_modules/@videojs/vhs-utils/es/ebml-helpers.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EBML_TAGS: () => (/* binding */ EBML_TAGS), /* harmony export */ decodeBlock: () => (/* binding */ decodeBlock), /* harmony export */ findEbml: () => (/* binding */ findEbml), /* harmony export */ parseData: () => (/* binding */ parseData), /* harmony export */ parseTracks: () => (/* binding */ parseTracks) /* harmony export */ }); /* harmony import */ var _byte_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./byte-helpers */ "../node_modules/@videojs/vhs-utils/es/byte-helpers.js"); /* harmony import */ var _codec_helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./codec-helpers.js */ "../node_modules/@videojs/vhs-utils/es/codec-helpers.js"); // relevant specs for this parser: // https://matroska-org.github.io/libebml/specs.html // https://www.matroska.org/technical/elements.html // https://www.webmproject.org/docs/container/ var EBML_TAGS = { EBML: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x1A, 0x45, 0xDF, 0xA3]), DocType: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x42, 0x82]), Segment: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x18, 0x53, 0x80, 0x67]), SegmentInfo: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x15, 0x49, 0xA9, 0x66]), Tracks: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x16, 0x54, 0xAE, 0x6B]), Track: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xAE]), TrackNumber: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xd7]), DefaultDuration: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x23, 0xe3, 0x83]), TrackEntry: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xAE]), TrackType: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x83]), FlagDefault: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x88]), CodecID: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x86]), CodecPrivate: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x63, 0xA2]), VideoTrack: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xe0]), AudioTrack: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xe1]), // Not used yet, but will be used for live webm/mkv // see https://www.matroska.org/technical/basics.html#block-structure // see https://www.matroska.org/technical/basics.html#simpleblock-structure Cluster: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x1F, 0x43, 0xB6, 0x75]), Timestamp: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xE7]), TimestampScale: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x2A, 0xD7, 0xB1]), BlockGroup: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xA0]), BlockDuration: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0x9B]), Block: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xA1]), SimpleBlock: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)([0xA3]) }; /** * This is a simple table to determine the length * of things in ebml. The length is one based (starts at 1, * rather than zero) and for every zero bit before a one bit * we add one to length. We also need this table because in some * case we have to xor all the length bits from another value. */ var LENGTH_TABLE = [128, 64, 32, 16, 8, 4, 2, 1]; var getLength = function getLength(byte) { var len = 1; for (var i = 0; i < LENGTH_TABLE.length; i++) { if (byte & LENGTH_TABLE[i]) { break; } len++; } return len; }; // length in ebml is stored in the first 4 to 8 bits // of the first byte. 4 for the id length and 8 for the // data size length. Length is measured by converting the number to binary // then 1 + the number of zeros before a 1 is encountered starting // from the left. var getvint = function getvint(bytes, offset, removeLength, signed) { if (removeLength === void 0) { removeLength = true; } if (signed === void 0) { signed = false; } var length = getLength(bytes[offset]); var valueBytes = bytes.subarray(offset, offset + length); // NOTE that we do **not** subarray here because we need to copy these bytes // as they will be modified below to remove the dataSizeLen bits and we do not // want to modify the original data. normally we could just call slice on // uint8array but ie 11 does not support that... if (removeLength) { valueBytes = Array.prototype.slice.call(bytes, offset, offset + length); valueBytes[0] ^= LENGTH_TABLE[length - 1]; } return { length: length, value: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesToNumber)(valueBytes, { signed: signed }), bytes: valueBytes }; }; var normalizePath = function normalizePath(path) { if (typeof path === 'string') { return path.match(/.{1,2}/g).map(function (p) { return normalizePath(p); }); } if (typeof path === 'number') { return (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.numberToBytes)(path); } return path; }; var normalizePaths = function normalizePaths(paths) { if (!Array.isArray(paths)) { return [normalizePath(paths)]; } return paths.map(function (p) { return normalizePath(p); }); }; var getInfinityDataSize = function getInfinityDataSize(id, bytes, offset) { if (offset >= bytes.length) { return bytes.length; } var innerid = getvint(bytes, offset, false); if ((0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(id.bytes, innerid.bytes)) { return offset; } var dataHeader = getvint(bytes, offset + innerid.length); return getInfinityDataSize(id, bytes, offset + dataHeader.length + dataHeader.value + innerid.length); }; /** * Notes on the EBLM format. * * EBLM uses "vints" tags. Every vint tag contains * two parts * * 1. The length from the first byte. You get this by * converting the byte to binary and counting the zeros * before a 1. Then you add 1 to that. Examples * 00011111 = length 4 because there are 3 zeros before a 1. * 00100000 = length 3 because there are 2 zeros before a 1. * 00000011 = length 7 because there are 6 zeros before a 1. * * 2. The bits used for length are removed from the first byte * Then all the bytes are merged into a value. NOTE: this * is not the case for id ebml tags as there id includes * length bits. * */ var findEbml = function findEbml(bytes, paths) { paths = normalizePaths(paths); bytes = (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)(bytes); var results = []; if (!paths.length) { return results; } var i = 0; while (i < bytes.length) { var id = getvint(bytes, i, false); var dataHeader = getvint(bytes, i + id.length); var dataStart = i + id.length + dataHeader.length; // dataSize is unknown or this is a live stream if (dataHeader.value === 0x7f) { dataHeader.value = getInfinityDataSize(id, bytes, dataStart); if (dataHeader.value !== bytes.length) { dataHeader.value -= dataStart; } } var dataEnd = dataStart + dataHeader.value > bytes.length ? bytes.length : dataStart + dataHeader.value; var data = bytes.subarray(dataStart, dataEnd); if ((0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesMatch)(paths[0], id.bytes)) { if (paths.length === 1) { // this is the end of the paths and we've found the tag we were // looking for results.push(data); } else { // recursively search for the next tag inside of the data // of this one results = results.concat(findEbml(data, paths.slice(1))); } } var totalLength = id.length + dataHeader.length + data.length; // move past this tag entirely, we are not looking for it i += totalLength; } return results; }; // see https://www.matroska.org/technical/basics.html#block-structure var decodeBlock = function decodeBlock(block, type, timestampScale, clusterTimestamp) { var duration; if (type === 'group') { duration = findEbml(block, [EBML_TAGS.BlockDuration])[0]; if (duration) { duration = (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesToNumber)(duration); duration = 1 / timestampScale * duration * timestampScale / 1000; } block = findEbml(block, [EBML_TAGS.Block])[0]; type = 'block'; // treat data as a block after this point } var dv = new DataView(block.buffer, block.byteOffset, block.byteLength); var trackNumber = getvint(block, 0); var timestamp = dv.getInt16(trackNumber.length, false); var flags = block[trackNumber.length + 2]; var data = block.subarray(trackNumber.length + 3); // pts/dts in seconds var ptsdts = 1 / timestampScale * (clusterTimestamp + timestamp) * timestampScale / 1000; // return the frame var parsed = { duration: duration, trackNumber: trackNumber.value, keyframe: type === 'simple' && flags >> 7 === 1, invisible: (flags & 0x08) >> 3 === 1, lacing: (flags & 0x06) >> 1, discardable: type === 'simple' && (flags & 0x01) === 1, frames: [], pts: ptsdts, dts: ptsdts, timestamp: timestamp }; if (!parsed.lacing) { parsed.frames.push(data); return parsed; } var numberOfFrames = data[0] + 1; var frameSizes = []; var offset = 1; // Fixed if (parsed.lacing === 2) { var sizeOfFrame = (data.length - offset) / numberOfFrames; for (var i = 0; i < numberOfFrames; i++) { frameSizes.push(sizeOfFrame); } } // xiph if (parsed.lacing === 1) { for (var _i = 0; _i < numberOfFrames - 1; _i++) { var size = 0; do { size += data[offset]; offset++; } while (data[offset - 1] === 0xFF); frameSizes.push(size); } } // ebml if (parsed.lacing === 3) { // first vint is unsinged // after that vints are singed and // based on a compounding size var _size = 0; for (var _i2 = 0; _i2 < numberOfFrames - 1; _i2++) { var vint = _i2 === 0 ? getvint(data, offset) : getvint(data, offset, true, true); _size += vint.value; frameSizes.push(_size); offset += vint.length; } } frameSizes.forEach(function (size) { parsed.frames.push(data.subarray(offset, offset + size)); offset += size; }); return parsed; }; // VP9 Codec Feature Metadata (CodecPrivate) // https://www.webmproject.org/docs/container/ var parseVp9Private = function parseVp9Private(bytes) { var i = 0; var params = {}; while (i < bytes.length) { var id = bytes[i] & 0x7f; var len = bytes[i + 1]; var val = void 0; if (len === 1) { val = bytes[i + 2]; } else { val = bytes.subarray(i + 2, i + 2 + len); } if (id === 1) { params.profile = val; } else if (id === 2) { params.level = val; } else if (id === 3) { params.bitDepth = val; } else if (id === 4) { params.chromaSubsampling = val; } else { params[id] = val; } i += 2 + len; } return params; }; var parseTracks = function parseTracks(bytes) { bytes = (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.toUint8)(bytes); var decodedTracks = []; var tracks = findEbml(bytes, [EBML_TAGS.Segment, EBML_TAGS.Tracks, EBML_TAGS.Track]); if (!tracks.length) { tracks = findEbml(bytes, [EBML_TAGS.Tracks, EBML_TAGS.Track]); } if (!tracks.length) { tracks = findEbml(bytes, [EBML_TAGS.Track]); } if (!tracks.length) { return decodedTracks; } tracks.forEach(function (track) { var trackType = findEbml(track, EBML_TAGS.TrackType)[0]; if (!trackType || !trackType.length) { return; } // 1 is video, 2 is audio, 17 is subtitle // other values are unimportant in this context if (trackType[0] === 1) { trackType = 'video'; } else if (trackType[0] === 2) { trackType = 'audio'; } else if (trackType[0] === 17) { trackType = 'subtitle'; } else { return; } // todo parse language var decodedTrack = { rawCodec: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesToString)(findEbml(track, [EBML_TAGS.CodecID])[0]), type: trackType, codecPrivate: findEbml(track, [EBML_TAGS.CodecPrivate])[0], number: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesToNumber)(findEbml(track, [EBML_TAGS.TrackNumber])[0]), defaultDuration: (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.bytesToNumber)(findEbml(track, [EBML_TAGS.DefaultDuration])[0]), default: findEbml(track, [EBML_TAGS.FlagDefault])[0], rawData: track }; var codec = ''; if (/V_MPEG4\/ISO\/AVC/.test(decodedTrack.rawCodec)) { codec = "avc1." + (0,_codec_helpers_js__WEBPACK_IMPORTED_MODULE_1__.getAvcCodec)(decodedTrack.codecPrivate); } else if (/V_MPEGH\/ISO\/HEVC/.test(decodedTrack.rawCodec)) { codec = "hev1." + (0,_codec_helpers_js__WEBPACK_IMPORTED_MODULE_1__.getHvcCodec)(decodedTrack.codecPrivate); } else if (/V_MPEG4\/ISO\/ASP/.test(decodedTrack.rawCodec)) { if (decodedTrack.codecPrivate) { codec = 'mp4v.20.' + decodedTrack.codecPrivate[4].toString(); } else { codec = 'mp4v.20.9'; } } else if (/^V_THEORA/.test(decodedTrack.rawCodec)) { codec = 'theora'; } else if (/^V_VP8/.test(decodedTrack.rawCodec)) { codec = 'vp8'; } else if (/^V_VP9/.test(decodedTrack.rawCodec)) { if (decodedTrack.codecPrivate) { var _parseVp9Private = parseVp9Private(decodedTrack.codecPrivate), profile = _parseVp9Private.profile, level = _parseVp9Private.level, bitDepth = _parseVp9Private.bitDepth, chromaSubsampling = _parseVp9Private.chromaSubsampling; codec = 'vp09.'; codec += (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(profile, 2, '0') + "."; codec += (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(level, 2, '0') + "."; codec += (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(bitDepth, 2, '0') + "."; codec += "" + (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(chromaSubsampling, 2, '0'); // Video -> Colour -> Ebml name var matrixCoefficients = findEbml(track, [0xE0, [0x55, 0xB0], [0x55, 0xB1]])[0] || []; var videoFullRangeFlag = findEbml(track, [0xE0, [0x55, 0xB0], [0x55, 0xB9]])[0] || []; var transferCharacteristics = findEbml(track, [0xE0, [0x55, 0xB0], [0x55, 0xBA]])[0] || []; var colourPrimaries = findEbml(track, [0xE0, [0x55, 0xB0], [0x55, 0xBB]])[0] || []; // if we find any optional codec parameter specify them all. if (matrixCoefficients.length || videoFullRangeFlag.length || transferCharacteristics.length || colourPrimaries.length) { codec += "." + (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(colourPrimaries[0], 2, '0'); codec += "." + (0,_byte_helpers__WEBPACK_IMPORTED_MODULE_0__.padStart)(transferCharacteristics[0], 2, '0'); codec += "." + (0,_byte_helpers__WEBP