{"version":3,"file":"index.min.js","sources":["../../xgplayer-streaming-shared/src/utils.js","../../xgplayer-streaming-shared/src/buffer.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/mse.js","../../xgplayer-streaming-shared/src/net/types.js","../../xgplayer-streaming-shared/src/net/error.js","../../xgplayer-streaming-shared/src/is.js","../../xgplayer-streaming-shared/src/net/helper.js","../../xgplayer-streaming-shared/src/event.js","../../../node_modules/eventemitter3/index.js","../../xgplayer-streaming-shared/src/net/fetch.js","../../xgplayer-streaming-shared/src/net/xhr.js","../../xgplayer-streaming-shared/src/net/task.js","../../xgplayer-streaming-shared/src/streaming-helper.js","../../xgplayer-streaming-shared/src/net/index.js","../../xgplayer-streaming-shared/src/net/config.js","../../xgplayer-streaming-shared/src/services/gap.js","../../xgplayer-streaming-shared/src/services/sei.js","../../xgplayer-streaming-shared/src/services/bandwidth.js","../../xgplayer-streaming-shared/src/services/stats.js","../../xgplayer-transmuxer/src/model/types.js","../../xgplayer-transmuxer/src/model/video-track.js","../../xgplayer-transmuxer/src/model/audio-track.js","../../xgplayer-transmuxer/src/model/video-sample.js","../../xgplayer-transmuxer/src/model/audio-sample.js","../../xgplayer-transmuxer/src/model/metadata-track.js","../../xgplayer-transmuxer/src/utils/exp-golomb.js","../../xgplayer-transmuxer/src/utils/logger.js","../../xgplayer-transmuxer/src/utils/utf8.js","../../xgplayer-transmuxer/src/utils/env.js","../../xgplayer-transmuxer/src/utils/index.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/aac.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/fixer.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/mp4/mp4-parser.js","../../xgplayer-transmuxer/src/mp4/fmp4-demuxer.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../xgplayer-transmuxer/src/mp4/fmp4-remuxer.js","../../../node_modules/crypto-es/lib/core.js","../../../node_modules/crypto-es/lib/enc-base64.js","../../../node_modules/crypto-es/lib/evpkdf.js","../../../node_modules/crypto-es/lib/cipher-core.js","../../../node_modules/crypto-es/lib/aes.js","../../../node_modules/crypto-es/lib/mode-ctr.js","../src/hls/buffer-service/decrypt/index.js","../src/hls/constants.js","../src/hls/buffer-service/transmuxer/index.js","../src/hls/buffer-service/index.js","../src/hls/manifest-loader/parser/model.js","../src/hls/manifest-loader/parser/utils.js","../src/hls/manifest-loader/parser/master.js","../src/hls/manifest-loader/parser/media.js","../src/hls/manifest-loader/parser/index.js","../src/hls/manifest-loader/index.js","../src/hls/utils.js","../src/hls/playlist/stream.js","../src/hls/playlist/index.js","../src/hls/segment-loader/index.js","../src/hls/index.js","../src/hls/config.js","../src/plugin-extension.js","../src/plugin.js"],"sourcesContent":["export function createPublicPromise () {\n let res, rej\n const promise = new Promise((resolve, reject) => {\n res = resolve\n rej = reject\n })\n promise.used = false\n promise.resolve = (...args) => {\n promise.used = true\n return res(...args)\n }\n promise.reject = (...args) => {\n promise.used = true\n return rej(...args)\n }\n return promise\n}\n\nexport function nowTime () {\n try {\n return parseInt(performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n","export class Buffer {\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static start (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n // Edge bug: https://bit.ly/2JYLPeB\n if (buf.length === 1 && buf.start(0) < 0) return 0\n\n return buf.start(0)\n }\n\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static end (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n\n return buf.end(buf.length - 1)\n }\n\n /**\n * @param {{buffered?: TimeRanges}} b\n * @returns {TimeRanges | void}\n */\n static get (b) {\n if (!b) return\n try {\n return b.buffered\n } catch (error) {\n // ignore\n }\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {[number,number][]}\n */\n static buffers (buf, maxHole) {\n if (!buf || !buf.length) return []\n\n const buffers = []\n for (let i = 0, l = buf.length; i < l; i++) {\n const bufLen = buffers.length\n if (!bufLen || !maxHole) {\n buffers.push([buf.start(i), buf.end(i)])\n } else {\n const last = buffers[bufLen - 1]\n const lastEnd = last[1]\n const start = buf.start(i)\n if (start - lastEnd <= maxHole) {\n const end = buf.end(i)\n if (end > lastEnd) {\n last[1] = end\n }\n } else {\n buffers.push([buf.start(i), buf.end(i)])\n }\n }\n }\n return buffers\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {{buffers:[number,number][],length:number}}\n */\n static totalLength (buffers) {\n if (!buffers || !buffers.length) return 0\n return buffers.reduce((a, c) => (a += (c[1] - c[0])), 0)\n }\n\n /**\n *\n * @param {TimeRanges} buf\n * @param {number} [pos=0]\n * @param {number} [maxHole=0]\n * @returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}\n */\n static info (buf, pos = 0, maxHole = 0) {\n if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }\n\n let start = 0\n let end = 0\n let index = 0\n let nextStart = 0\n let nextEnd = 0\n let prevStart = 0\n let prevEnd = 0\n const buffers = Buffer.buffers(buf, maxHole)\n\n for (let i = 0, l = buffers.length; i < l; i++) {\n const item = buffers[i]\n if (pos + maxHole >= item[0] && pos <= item[1]) {\n start = item[0]\n end = item[1]\n index = i\n } else if (pos + maxHole < item[0]) {\n nextStart = item[0]\n nextEnd = item[1]\n break\n } else if (pos + maxHole > item[1]) {\n prevStart = item[0]\n prevEnd = item[1]\n }\n }\n\n return {\n start,\n end,\n index,\n buffers,\n nextStart,\n nextEnd,\n prevStart,\n prevEnd,\n currentTime: pos,\n behind: pos - start,\n remaining: end ? end - pos : 0,\n length: Buffer.totalLength && Buffer.totalLength(buffers)\n }\n }\n}\n","export const ERR = {\n MANIFEST: 'manifest',\n NETWORK: 'network',\n NETWORK_TIMEOUT: 'network_timeout',\n NETWORK_FORBIDDEN:'network_forbidden',\n NETWORK_NOTFOUND: 'network_notfound',\n NETWROK_RANGE_NOT_SATISFIABLE:'network_range_not_satisfiable',\n DEMUX: 'demux',\n REMUX: 'remux',\n MEDIA: 'media',\n DRM: 'drm',\n OTHER: 'other',\n RUNTIME:'runtime',\n\n SUB_TYPES: {\n FLV: 'FLV',\n HLS: 'HLS',\n MP4: 'MP4',\n FMP4: 'FMP4',\n MSE_ADD_SB: 'MSE_ADD_SB',\n MSE_APPEND_BUFFER: 'MSE_APPEND_BUFFER',\n MSE_OTHER: 'MSE_OTHER',\n MSE_FULL: 'MSE_FULL',\n OPTION: 'OPTION',\n DASH:'DASH',\n LICENSE:'LICENSE',\n CUSTOM_LICENSE:'CUSTOM_LICENSE',\n MSE_HIJACK:'MSE_HIJACK',\n EME_HIJACK:'EME_HIJACK',\n SIDX:'SIDX',\n NO_CANPLAY_ERROR:'NO_CANPLAY_ERROR',\n BUFFERBREAK_ERROR:'BUFFERBREAK_ERROR',\n WAITING_TIMEOUT_ERROR: 'WAITING_TIMEOUT_ERROR',\n MEDIA_ERR_ABORTED:'MEDIA_ERR_ABORTED',\n MEDIA_ERR_NETWORK:'MEDIA_ERR_NETWORK',\n MEDIA_ERR_DECODE:'MEDIA_ERR_DECODE',\n MEDIA_ERR_SRC_NOT_SUPPORTED:'MEDIA_ERR_SRC_NOT_SUPPORTED',\n MEDIA_ERR_CODEC_NOT_SUPPORTED:'MEDIA_ERR_CODEC_NOT_SUPPORTED',\n MEDIA_ERR_URL_EMPTY:'MEDIA_ERR_URL_EMPTY'\n }\n}\n\nexport const ERR_CODE = {\n [ERR.MANIFEST]: {\n HLS: 1100,\n DASH:1200\n },\n [ERR.NETWORK]: 2100,\n [ERR.NETWORK_TIMEOUT]: 2101,\n [ERR.NETWORK_FORBIDDEN]:2103,\n [ERR.NETWORK_NOTFOUND]:2104,\n [ERR.NETWROK_RANGE_NOT_SATISFIABLE]:2116,\n [ERR.DEMUX]: {\n FLV: 3100,\n HLS: 3200,\n MP4: 3300,\n FMP4: 3400,\n SIDX: 3410\n },\n [ERR.REMUX]: {\n FMP4: 4100,\n MP4: 4200\n },\n [ERR.MEDIA]: {\n MEDIA_ERR_ABORTED: 5101,\n MEDIA_ERR_NETWORK: 5102,\n MEDIA_ERR_DECODE: 5103,\n MEDIA_ERR_SRC_NOT_SUPPORTED: 5104,\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 5105,\n MEDIA_ERR_URL_EMPTY: 5106,\n MSE_ADD_SB: 5200,\n MSE_APPEND_BUFFER: 5201,\n MSE_OTHER: 5202,\n MSE_FULL: 5203,\n MSE_HIJACK:5204,\n EME_HIJACK:5301\n },\n [ERR.DRM]:{\n LICENSE:7100,\n CUSTOM_LICENSE:7200\n },\n [ERR.OTHER]: 8000,\n [ERR.RUNTIME]:{\n NO_CANPLAY_ERROR:9001,\n BUFFERBREAK_ERROR:9002,\n WAITING_TIMEOUT_ERROR:9003\n }\n}\n\n\n\nexport class StreamingError extends Error {\n constructor (type, subType, origin, payload, msg) {\n super(msg || origin?.message)\n this.errorType = type === ERR.NETWORK_TIMEOUT ? ERR.NETWORK : type\n this.originError = origin\n this.ext = payload\n this.errorCode = ERR_CODE[type][subType] || ERR_CODE[type]\n this.errorMessage = this.message\n if (!this.errorCode) {\n this.errorType = ERR.OTHER\n this.errorCode = ERR_CODE[this.errorType]\n }\n }\n\n static create (type, subType, origin, payload, msg) {\n if (type instanceof StreamingError) {\n return type\n } else if (type instanceof Error) {\n origin = type\n type = ''\n }\n\n if (!type) type = ERR.OTHER\n\n return new StreamingError(type, subType, origin, payload, msg)\n }\n\n static network (error) {\n return new StreamingError(\n error?.isTimeout ? ERR.NETWORK_TIMEOUT : ERR.NETWORK,\n null,\n error instanceof Error ? error : null,\n {\n url: error?.url,\n response: error?.response,\n httpCode: error?.response?.status\n }\n )\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n","\nexport const LogCacheLevel = {\n 'DEBUG': 1,\n 'LOG': 2,\n 'WARN': 3,\n 'ERROR': 4\n}\nconst LOG_MAX_SIZE = 200 * 1024\nconst SIMPLE_TYPE = ['Boolean', 'Number' ,'String', 'Undefined','Null', 'Date','Object']\nexport class Logger {\n constructor (name,config) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n this.logCacheLevel = config?.logCacheLevel || 3\n this.logMaxSize = config?.logMaxSize || LOG_MAX_SIZE\n this.logSize = 0\n this.logTextArray = []\n }\n\n debug (...args) {\n this.logCache(LogCacheLevel.DEBUG,...args)\n if (Logger.disabled) return\n console.debug(this._prefix, nowTime(), ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(this._prefix, nowTime(), ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(this._prefix, nowTime(), ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(this._prefix, nowTime(), ...args)\n }\n\n logCache (logCacheLevel, ...logText) {\n if (logCacheLevel < this.logCacheLevel) return\n let text = ''\n try {\n const finLogText = logText.map( item => logable(item))\n text = this._prefix + nowTime() + (JSON.stringify(finLogText))\n } catch (e) {\n return\n }\n if (logCacheLevel >= this.logCacheLevel) {\n this.logSize += text.length\n this.logTextArray.push(text)\n }\n if (this.logSize > this.logMaxSize) {\n const delLog = this.logTextArray.shift()\n this.logSize -= delLog.length\n }\n }\n\n getLogCache () {\n const logText = this.logTextArray.join('\\n')\n this.reset()\n return logText\n }\n\n reset () {\n this.logTextArray = []\n this.logSize = 0\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n\n setLogLevel (val) {\n this.logCacheLevel = val\n }\n}\nfunction nowTime () {\n return new Date().toLocaleString()\n}\n\nfunction reduceDepth (val) {\n if (typeof val !== 'object') {\n return val\n }\n const objType = Object.prototype.toString.call(val).slice(8, -1)\n switch (objType) {\n case 'Array':\n case 'Uint8Array':\n case 'ArrayBuffer':\n\n return objType + '[' + val.length + ']'\n case 'Object':\n return '{}'\n default:\n return objType\n }\n}\n\nfunction logable (obj, maxDepth, depth) {\n if (!depth) depth = 1\n if (!maxDepth) maxDepth = 2\n const result = {}\n\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n const objType = Object.prototype.toString.call(obj).slice(8, -1)\n if (!SIMPLE_TYPE.includes(objType)) {\n return objType\n }\n\n if (depth > maxDepth) {\n return undefined\n }\n\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (depth === maxDepth) {\n result[key] = reduceDepth(obj[key])\n } else if (typeof obj[key] === 'object') {\n result[key] = logable(obj[key], maxDepth, depth + 1)\n } else {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n","/* eslint-disable no-undef */\nimport { createPublicPromise, nowTime } from './utils'\nimport { Buffer } from './buffer'\nimport { StreamingError, ERR } from './error'\nimport { isBrowser } from './env'\nimport { Logger } from './logger'\n\nfunction getMediaSource () {\n try {\n return isBrowser ? window.MediaSource : null\n } catch (e) {}\n}\n\nconst MediaSource = getMediaSource()\n\n/** @enum {string} */\nexport const MSEErrorType = {\n UPDATE_ERROR: 'updateError'\n}\n\nconst OP_NAME = {\n APPEND: 'appendBuffer',\n REMOVE: 'removeBuffer',\n UPDATE_DURATION:'updateDuration'\n}\n\nexport class MSEError extends Error {\n /**\n * @param {MSEErrorType} type\n * @param {any} [msg]\n */\n constructor (type, msg) {\n super(msg || type)\n this.type = type\n this.msg = msg\n }\n}\n\nexport class MSE {\n /** @type { HTMLMediaElement | null } */\n media = null\n\n /** @type { MediaSource | null } */\n mediaSource = null\n\n _openPromise = createPublicPromise()\n\n _queue = Object.create(null)\n\n _sourceBuffer = Object.create(null)\n\n static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n _mseFullFlag = {}\n\n _st = 0\n\n _opst = 0\n\n _logger = null\n\n _config = null\n _url = null\n\n\n static getDefaultConfig () {\n return {\n openLog: false\n }\n }\n\n /**\n * @param {HTMLMediaElement} [media]\n */\n constructor (media, config) {\n this._config = Object.assign(MSE.getDefaultConfig(), config)\n if (media) this.bindMedia(media)\n this._logger = new Logger('MSE')\n if (this._config.openLog) {\n Logger.enable()\n }\n }\n\n get isOpened () {\n return this.mediaSource?.readyState === 'open'\n }\n\n get url () {\n return this._url\n }\n\n get duration () {\n return this.mediaSource?.duration || -1\n }\n\n get isEnded () {\n return this.mediaSource ? this.mediaSource.readyState === 'ended' : false\n }\n\n isFull (type) {\n return type ? this._mseFullFlag[type] : this._mseFullFlag[MSE.VIDEO]\n }\n\n /**\n * @param { number } duration\n * @return { Promise }\n */\n updateDuration (duration) {\n const isReduceDuration = this.mediaSource && this.mediaSource.duration > duration\n if (this.mediaSource && this.mediaSource.duration > duration) {\n let bufferEnd = 0\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n bufferEnd = Math.max(this.bufferEnd(k) || 0, bufferEnd)\n } catch (error) {\n // ignore\n }\n })\n if (duration < bufferEnd) {\n // 设置值比bufferEnd值小,会导致异常\n return Promise.resolve()\n }\n }\n\n return this._enqueueBlockingOp(() => {\n if (this.isEnded) {\n this._logger.debug('[debug mse] setDuration ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('[debug mse] setDuration')\n }\n }, OP_NAME.UPDATE_DURATION, {isReduceDuration})\n }\n\n /** @return { Promise } */\n open () {\n if (this._openPromise.used && !this.isOpened && this.mediaSource) {\n const ms = this.mediaSource\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN', costtime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @param { HTMLMediaElement } media\n * @return { Promise }\n */\n async bindMedia (media) {\n if (this.mediaSource || this.media) await this.unbindMedia()\n if (!media || !MediaSource) throw new Error('Param media or MediaSource does not exist')\n this.media = media\n const ms = this.mediaSource = new MediaSource()\n this._st = nowTime()\n\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n return this._openPromise\n }\n\n /** @return { Promise } */\n async unbindMedia () {\n if (!this._openPromise.used) this._openPromise.resolve()\n const ms = this.mediaSource\n\n if (ms) {\n Object.keys(this._queue).forEach((t) => {\n const queue = this._queue[t]\n if (queue) {\n queue.forEach(x => x.promise?.resolve?.())\n }\n })\n\n const hasMetadata = !!this.media && this.media.readyState >= 1\n const mseOpen = ms.readyState === 'open'\n\n if (hasMetadata && mseOpen) {\n try {\n ms.endOfStream()\n } catch (error) {\n // ignore\n }\n }\n\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n ms.removeSourceBuffer(this._sourceBuffer[k])\n } catch (error) {\n // ignore\n }\n })\n }\n\n if (this.media) {\n this.media.removeAttribute('src')\n try {\n this.media.load()\n } catch (error) {\n // ignore\n }\n this.media = null\n }\n\n this.mediaSource = null\n this._openPromise = createPublicPromise()\n this._queue = Object.create(null)\n this._sourceBuffer = Object.create(null)\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n */\n createSource (type, mimeType) {\n if (this._sourceBuffer[type] || !this.mediaSource) return\n let sb\n try {\n sb = this._sourceBuffer[type] = this.mediaSource.addSourceBuffer(mimeType)\n } catch (error) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_ADD_SB, error)\n }\n sb.mimeType = mimeType\n sb.addEventListener('updateend', this._onSBUpdateEnd.bind(this, type))\n sb.addEventListener('error', this._onSBUpdateError.bind(this, type))\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n changeType (type, mimeType) {\n const sb = this._sourceBuffer[type]\n if (!this.mediaSource || !sb || sb.mimeType === mimeType) return Promise.resolve()\n\n if (typeof sb.changeType !== 'function') return Promise.reject()\n\n return this._enqueueOp(type, () => {\n sb.changeType(mimeType)\n sb.mimeType = mimeType\n this._onSBUpdateEnd(type)\n }, 'changeType', {mimeType})\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n createOrChangeSource (type, mimeType) {\n this.createSource(type, mimeType)\n return this.changeType(type, mimeType)\n }\n\n /**\n * @param { string } type\n * @param { BufferSource } buffer\n * @return { Promise }\n */\n append (type, buffer, context) {\n if (!buffer || !buffer.byteLength) {\n return Promise.resolve()\n }\n\n if (!this._sourceBuffer[type]) return Promise.resolve()\n\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n this._logger.debug('MSE APPEND START', context)\n this._opst = nowTime()\n this._sourceBuffer[type]?.appendBuffer(buffer)\n }, OP_NAME.APPEND, context)\n\n }\n\n /**\n * @param { string } type\n * @param { number } startTime\n * @param { number } endTime\n * @return { Promise }\n */\n remove (type, startTime, endTime, context) {\n // if (Object.keys(this._sourceBuffer).length === 1) return Promise.resolve()\n let isInsertHead = false\n if (this._mseFullFlag[type]) {\n isInsertHead = true\n }\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[type]\n if (startTime >= endTime || !sb) {\n this._onSBUpdateEnd(type)\n return\n }\n this._opst = nowTime()\n this._logger.debug('MSE REMOVE START', type, startTime, endTime, context)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE, context, isInsertHead)\n }\n\n clearBuffer (startTime, endTime) {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this._enqueueOp(k, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[k]\n this._logger.debug('MSE clearBuffer START', k, startTime, endTime)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE)\n })\n return p || Promise.resolve()\n }\n\n clearAllBuffer () {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this._enqueueOp(k, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[k]\n this._logger.debug('MSE clearAllBuffer START', k)\n sb.remove(0, Buffer.end(Buffer.get(sb)))\n })\n })\n return p\n }\n\n clearOpQueues (type, allClear) {\n this._logger.debug('MSE clearOpQueue START')\n const queue = this._queue[type]\n if (allClear && queue) {\n this._queue[type] = []\n return\n }\n if (!queue || !queue[type] || queue.length < 5) return\n const initOpque = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initOpque.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initOpque.length > 0 && this._queue[type].push(...initOpque)\n }\n\n /**\n * @param {EndOfStreamError} [reason]\n * @returns {Promise}\n */\n endOfStream (reason) {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open') return Promise.resolve()\n return this._enqueueBlockingOp(() => {\n const ms = this.mediaSource\n if (!ms || ms.readyState !== 'open') return\n this._logger.debug('MSE endOfStream START')\n if (reason) {\n ms.endOfStream(reason)\n } else {\n ms.endOfStream()\n }\n }, 'endOfStream')\n }\n\n setLiveSeekableRange (start, end) {\n const ms = this.mediaSource\n if (start < 0 || end < start || !ms?.setLiveSeekableRange || ms.readyState !== 'open') return\n ms.setLiveSeekableRange(start, end)\n }\n\n /**\n * @param {string} type\n * @returns {?SourceBuffer}\n */\n getSourceBuffer (type) {\n return this._sourceBuffer[type]\n }\n\n /**\n * @param { string } type\n * @return { TimeRanges | void }\n */\n buffered (type) {\n return Buffer.get(this._sourceBuffer[type])\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferStart (type) {\n return Buffer.start(this.buffered(type))\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferEnd (type) {\n return Buffer.end(this.buffered(type))\n }\n\n _enqueueOp (type, exec, opName, context, isInsertHead) {\n if (!this.mediaSource) return Promise.resolve()\n const queue = this._queue[type] = this._queue[type] || []\n const op = {\n exec,\n promise: createPublicPromise(),\n opName,\n context\n }\n\n if (isInsertHead) {\n queue.splice(0, 0, op)\n this._mseFullFlag[type] = false\n this._startQueue(type)\n } else {\n queue.push(op)\n }\n\n if (this.isOpened || this.isEnded) {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n } else {\n this._openPromise.then(() => {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n })\n }\n\n\n return op.promise\n }\n\n async _enqueueBlockingOp (exec, opName, context) {\n if (!this.mediaSource) return Promise.resolve()\n const types = Object.keys(this._sourceBuffer)\n if (!types.length) {\n return exec()\n }\n\n const waiters = []\n types.forEach(t => {\n const queue = this._queue[t]\n const prom = createPublicPromise()\n waiters.push(prom)\n queue.push({exec: () => {\n prom.resolve()}, promise: prom, opName, context})\n if (queue.length === 1) {\n this._startQueue(t)\n }\n })\n\n return Promise.all(waiters).then(() => {\n try {\n return exec()\n } finally {\n types.forEach(t => {\n const queue = this._queue[t]\n const sb = this._sourceBuffer[t]\n queue?.shift()\n if (!sb || !sb.updating) {\n this._startQueue(t)\n }\n })\n }\n })\n }\n\n _startQueue (type) {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op && !this._mseFullFlag[type]) {\n try {\n op.exec()\n } catch (error) {\n if (error && error.message && error.message.indexOf('SourceBuffer is full') >= 0) {\n this._mseFullFlag[type] = true\n this._logger.error('[MSE error], context,', op.context, ' ,name,', op.opName, ',err,SourceBuffer is full')\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_FULL, error))\n } else {\n this._logger.error(error)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error))\n queue.shift()\n this._startQueue(type)\n }\n }\n }\n }\n }\n\n _onSBUpdateEnd = (type) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (!(op?.opName === OP_NAME.UPDATE_DURATION)) {\n queue.shift()\n }\n if (op) {\n const costtime = nowTime() - this._opst\n this._logger.debug('UpdateEnd', op.opName, costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n this._startQueue(type)\n }\n }\n }\n\n _onSBUpdateError = (type, event) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op) {\n this._logger.error('UpdateError', type, op.opName, op.context)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_APPEND_BUFFER, event))\n // Do not shift from queue, 'updateend' event will fire next\n }\n }\n }\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (!MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n }\n\n setTimeoffset (type, timestampOffset, context) {\n return this._enqueueOp(type, () => {\n if (timestampOffset < 0) {\n timestampOffset += 0.001\n }\n this._sourceBuffer[type].timestampOffset = timestampOffset\n this._onSBUpdateEnd(type)\n }, 'setTimeoffset', context)\n }\n\n /** *重置decode时间戳 */\n abort (type, context) {\n if (!this.isOpened) {\n return Promise.resolve()\n }\n return this._enqueueOp(type, () => {\n this._sourceBuffer[type].abort()\n this._onSBUpdateEnd(type)\n }, 'abort', context)\n }\n}\n","export const LoaderType = {\n FETCH: 'fetch',\n XHR: 'xhr'\n}\n\nexport const ResponseType = {\n ARRAY_BUFFER: 'arraybuffer',\n TEXT: 'text',\n JSON: 'json'\n}\n","import { LoaderType } from './types'\n\nexport class NetError extends Error {\n retryCount = 0\n isTimeout = false\n loaderType = LoaderType.FETCH\n startTime = 0\n endTime = 0\n options = {}\n\n constructor (url, request, response, msg) {\n super(msg)\n this.url = url\n this.request = request\n this.response = response\n }\n}\n","const toString = Object.prototype.toString\n\nexport function isObject (a) {\n return a !== null && typeof a === 'object'\n}\n\nexport function isPlainObject (val) {\n if (toString.call(val) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(val)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isDate (a) {\n return toString.call(a) === '[object Date]'\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { isDate, isObject } from '../is'\n\nexport function getRangeValue (value) {\n if (!value || value[0] === null || value[0] === undefined || (value[0] === 0 && (value[1] === null || value[1] === undefined))) {\n return\n }\n let ret = 'bytes=' + value[0] + '-'\n if (value[1]) ret += value[1]\n return ret\n}\n\nfunction encode (val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\nexport function setUrlParams (url, params) {\n if (!url) return\n if (!params) return url\n let v\n const str = Object.keys(params).map(k => {\n v = params[k]\n if (v === null || v === undefined) return\n if (Array.isArray(v)) {\n k = k + '[]'\n } else {\n v = [v]\n }\n\n return v.map(x => {\n if (isDate(x)) {\n x = x.toISOString()\n } else if (isObject(x)) {\n x = JSON.stringify(x)\n }\n return `${encode(k)}=${encode(x)}`\n }).join('&')\n }).filter(Boolean).join('&')\n\n if (str) {\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex)\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + str\n }\n\n return url\n}\n\nexport function createResponse (\n data,\n done,\n response,\n contentLength,\n age,\n startTime,\n firstByteTime,\n index,\n range,\n vid,\n priOptions\n) {\n age = (age !== null && age !== undefined) ? parseFloat(age) : null\n contentLength = parseInt(contentLength || '0', 10)\n if (Number.isNaN(contentLength)) contentLength = 0\n const options = { range, vid, index, contentLength, age, startTime, firstByteTime, endTime: Date.now(), priOptions }\n return { data, done, options, response }\n}\n\nexport function calculateSpeed (byteLen, millisec) {\n return Math.round(byteLen * 8 * 1000 / millisec / 1024)\n}\n","export const EVENT = {\n ERROR: 'error',\n\n TTFB: 'core.ttfb',\n LOAD_START: 'core.loadstart',\n LOAD_RESPONSE_HEADERS: 'core.loadresponseheaders',\n LOAD_COMPLETE: 'core.loadcomplete',\n LOAD_RETRY: 'core.loadretry',\n SOURCEBUFFER_CREATED: 'core.sourcebuffercreated',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n METADATA_PARSED: 'core.metadataparsed',\n SEI: 'core.sei',\n SEI_IN_TIME: 'core.seiintime',\n FLV_SCRIPT_DATA: 'core.flvscriptdata',\n LOWDECODE: 'core.lowdecode',\n SWITCH_URL_SUCCESS: 'core.switchurlsuccess',\n SWITCH_URL_FAILED: 'core.switchurlfailed',\n SPEED: 'core.speed',\n HLS_MANIFEST_LOADED: 'core.hlsmanifestloaded',\n HLS_LEVEL_LOADED: 'core.hlslevelloaded',\n DEMUXED_TRACK:'core.demuxedtrack',\n\n STREAM_EXCEPTION: 'core.streamexception',\n LARGE_AV_FIRST_FRAME_GAP_DETECT: 'LARGE_AV_FIRST_FRAME_GAP_DETECT',\n LARGE_VIDEO_DTS_GAP_DETECT: 'LARGE_VIDEO_DTS_GAP_DETECT',\n LARGE_AUDIO_DTS_GAP_DETECT: 'LARGE_AUDIO_DTS_GAP_DETECT',\n AUDIO_GAP_DETECT: 'AUDIO_GAP_DETECT',\n AUDIO_OVERLAP_DETECT: 'AUDIO_OVERLAP_DETECT',\n MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT: 'MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT',\n REAL_TIME_SPEED: 'real_time_speed'\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nconst CACHESIZE = 2 * 1024 * 1024\nexport class FetchLoader extends EventEmitter {\n _abortController = null\n _timeoutTimer = null\n _reader = null\n _response = null\n _aborted = false\n _index = -1\n _range = null\n _receivedLength = 0\n _running = false\n _logger = null\n _vid = ''\n _onProcessMinLen = 0\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n constructor () {\n super()\n }\n\n load ({\n url,\n vid,\n timeout, // ms\n responseType,\n onProgress,\n index,\n onTimeout,\n onCancel,\n range,\n transformResponse,\n request,\n params,\n logger,\n\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n onProcessMinLen,\n priOptions\n }) {\n this._logger = logger\n this._aborted = false\n this._onProcessMinLen = onProcessMinLen\n this._onCancel = onCancel\n this._abortController = typeof AbortController !== 'undefined' && new AbortController()\n this._running = true\n this._index = index\n this._range = range || [0, 0]\n this._vid = vid || url\n this._priOptions = priOptions || {}\n const init = {\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n signal: this._abortController?.signal\n }\n\n let isTimeout = false\n clearTimeout(this._timeoutTimer)\n\n url = setUrlParams(url, params)\n\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n if (request) {\n headers = request.headers\n } else {\n headers = init.headers = init.headers || (Headers ? new Headers() : {})\n }\n if (Headers && headers instanceof Headers) {\n headers.append('Range', rangeValue)\n } else {\n headers.Range = rangeValue\n }\n }\n\n if (timeout) {\n this._timeoutTimer = setTimeout(() => {\n isTimeout = true\n this.cancel()\n if (onTimeout) {\n const error = new NetError(url, init, null, 'timeout')\n error.isTimeout = true\n onTimeout(error, {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }, timeout)\n }\n\n const startTime = Date.now()\n this._logger.debug('[fetch load start], index,', index, ',range,', range)\n return new Promise((resolve, reject) => {\n fetch(request || url, request ? undefined : init).then(async (response) => {\n clearTimeout(this._timeoutTimer)\n this._response = response\n if (this._aborted || !this._running) return\n if (transformResponse) {\n response = transformResponse(response, url) || response\n }\n if (!response.ok) {\n throw new NetError(url, init, response, 'bad network response')\n }\n\n const firstByteTime = Date.now()\n let data\n if (responseType === ResponseType.TEXT) {\n data = await response.text()\n this._running = false\n } else if (responseType === ResponseType.JSON) {\n data = await response.json()\n this._running = false\n } else {\n if (onProgress) {\n this.resolve = resolve\n this.reject = reject\n this._loadChunk(response, onProgress, startTime, firstByteTime)\n return\n } else {\n data = await response.arrayBuffer()\n data = new Uint8Array(data)\n this._running = false\n const costTime = Date.now() - startTime\n const speed = calculateSpeed(data.byteLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: data.byteLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n }\n }\n this._logger.debug('[fetch load end], index,', index, ',range,', range)\n resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n startTime,\n firstByteTime,\n index,\n range,\n this._vid,\n this._priOptions\n ))\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._running = false\n if (this._aborted && !isTimeout) return\n error = error instanceof NetError ? error : new NetError(url, init, null, error?.message)\n error.startTime = startTime\n error.endTime = Date.now()\n error.isTimeout = isTimeout\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n reject(error)\n })\n })\n }\n\n async cancel () {\n if (this._aborted) return\n this._aborted = true\n this._running = false\n if (this._response) {\n try {\n // await this._response.body.cancel()\n if (this._reader) {\n await this._reader.cancel()\n }\n } catch (error) {\n // ignore\n }\n this._response = this._reader = null\n }\n\n if (this._abortController) {\n try {\n this._abortController.abort()\n } catch (error) {\n // ignore\n }\n this._abortController = null\n }\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }\n\n _loadChunk (response, onProgress, st, firstByteTime) {\n if (!response.body || !response.body.getReader) {\n this._running = false\n const err = new NetError(response.url, '', response, 'onProgress of bad response.body.getReader')\n err.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(err)\n return\n }\n if (this._onProcessMinLen > 0) {\n this._cache = new Uint8Array(CACHESIZE)\n this._writeIdx = 0\n }\n const reader = this._reader = response.body.getReader()\n let data\n\n let startTime\n let endTime\n const pump = async () => {\n startTime = Date.now()\n try {\n data = await reader.read()\n endTime = Date.now()\n } catch (e) {\n // request aborted\n endTime = Date.now()\n if (!this._aborted) {\n this._running = false\n e.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(e)\n }\n return\n }\n const startRange = this._range?.length > 0 ? this._range[0] : 0\n const startByte = startRange + this._receivedLength\n if (this._aborted) {\n this._running = false\n onProgress(undefined, false, { range: [startByte, startByte], vid: this._vid, index: this._index, startTime, endTime, st, firstByteTime, priOptions:this._priOptions }, response)\n return\n }\n const curLen = data.value ? data.value.byteLength : 0\n this._receivedLength += curLen\n this._logger.debug('【fetchLoader,onProgress call】,task,', this._range, ', start,', startByte, ', end,', startRange + this._receivedLength, ', done,', data.done)\n let retData\n if (this._onProcessMinLen > 0) {\n if (this._writeIdx + curLen >= this._onProcessMinLen || data.done) {\n retData = new Uint8Array(this._writeIdx + curLen)\n retData.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && retData.set(data.value, this._writeIdx)\n this._writeIdx = 0\n this._logger.debug('【fetchLoader,onProgress enough】,done,', data.done, ',len,', retData.byteLength, ', writeIdx,', this._writeIdx)\n } else {\n if (curLen > 0 && this._writeIdx + curLen < CACHESIZE) {\n this._cache.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n this._logger.debug('【fetchLoader,onProgress cache】,len,', curLen, ', writeIdx,', this._writeIdx)\n } else if (curLen > 0) {\n const temp = new Uint8Array(this._writeIdx + curLen + 2048)\n this._logger.debug('【fetchLoader,onProgress extra start】,size,', this._writeIdx + curLen + 2048, ', datalen,', curLen, ', writeIdx,', this._writeIdx)\n temp.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && temp.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n delete this._cache\n this._cache = temp\n this._logger.debug('【fetchLoader,onProgress extra end】,len,', curLen, ', writeIdx,', this._writeIdx)\n }\n }\n } else {\n retData = data.value\n }\n if (retData && retData.byteLength > 0 || data.done) {\n onProgress(retData, data.done, {\n range: [this._range[0] + this._receivedLength - (retData ? retData.byteLength : 0), this._range[0] + this._receivedLength],\n vid: this._vid,\n index: this._index,\n startTime,\n endTime,\n st,\n firstByteTime,\n priOptions:this._priOptions\n }, response)\n }\n if (!data.done) {\n pump()\n } else {\n const costTime = Date.now() - st\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n this._running = false\n this._logger.debug('[fetchLoader onProgress end],task,', this._range, ',done,', data.done)\n this.resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n st,\n firstByteTime,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n pump()\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n static isSupported () {\n return !!(typeof fetch !== 'undefined')\n }\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nexport class XhrLoader extends EventEmitter {\n\n _xhr = null\n _aborted = false\n _timeoutTimer = null\n _range = null\n _receivedLength = 0\n _url = null\n _onProgress = null\n _index = -1\n _headers = null\n // _chunkSizeKBList = [\n // 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n // ]\n\n _currentChunkSizeKB = 384\n _timeout = null\n _xhr = null\n _withCredentials = null\n _startTime = -1\n // _speedSampler = new SpeedSampler()\n _loadCompleteResolve = null\n _loadCompleteReject = null\n _runing = false\n _logger = false\n _vid = ''\n _responseType\n _credentials\n _method\n _transformResponse\n _firstRtt\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n\n constructor () {\n super()\n }\n\n load (req) {\n clearTimeout(this._timeoutTimer)\n this._logger = req.logger\n this._range = req.range\n this._onProgress = req.onProgress\n this._index = req.index\n this._headers = req.headers\n this._withCredentials = req.credentials === 'include' || req.credentials === 'same-origin'\n this._body = req.body || null\n req.method && (this._method = req.method)\n this._timeout = req.timeout || null\n this._runing = true\n this._vid = req.vid || req.url\n this._responseType = req.responseType\n this._firstRtt = -1\n this._onTimeout = req.onTimeout\n this._onCancel = req.onCancel\n this._request = req.request\n this._priOptions = req.priOptions || {}\n this._logger.debug('【xhrLoader task】, range', this._range)\n\n this._url = setUrlParams(req.url, req.params)\n\n const startTime = Date.now()\n return new Promise((resolve, reject) => {\n this._loadCompleteResolve = resolve\n this._loadCompleteReject = reject\n this._startLoad()\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._runing = false\n if (this._aborted) return\n error = error instanceof NetError ? error : new NetError(this._url, this._request)\n error.startTime = startTime\n error.endTime = Date.now()\n error.options = {index: this._index, vid: this._vid, priOptions: this._priOptions}\n throw error\n })\n }\n\n _startLoad () {\n let range = null\n if (this._responseType === ResponseType.ARRAY_BUFFER && this._range && this._range.length > 1) {\n if (this._onProgress) {\n this._firstRtt = -1\n const chunkSize = this._currentChunkSizeKB * 1024\n const from = this._range[0] + this._receivedLength\n let to = this._range[1]\n if (chunkSize < this._range[1] - from) {\n to = from + chunkSize\n }\n range = [from, to]\n this._logger.debug('[xhr_loader->],tast :', this._range, ', SubRange, ', range)\n } else {\n range = this._range\n this._logger.debug('[xhr_loader->],tast :', this._range, ', allRange, ', range)\n }\n }\n this._internalOpen(range)\n }\n\n _internalOpen (range) {\n try {\n this._startTime = Date.now()\n const xhr = this._xhr = new XMLHttpRequest()\n xhr.open(this._method || 'GET', this._url, true)\n xhr.responseType = this._responseType\n this._timeout && (xhr.timeout = this._timeout)\n xhr.withCredentials = this._withCredentials\n xhr.onload = this._onLoad.bind(this)\n xhr.onreadystatechange = this._onReadyStatechange.bind(this)\n xhr.onerror = (errorEvent) => {\n this._running = false\n const error = new NetError(this._url, this._request, errorEvent?.currentTarget?.response, ('xhr.onerror.status:' + errorEvent?.currentTarget?.status + ',statusText,' + errorEvent?.currentTarget?.statusText))\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n xhr.ontimeout = (event) => {\n this.cancel()\n const error = new NetError(this._url, this._request, {status:408}, 'timeout')\n if (this._onTimeout) {\n error.isTimeout = true\n this._onTimeout(error,{index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n const headers = this._headers || {}\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n headers.Range = rangeValue\n }\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n this._logger.debug('[xhr.send->] tast,', this._range, ',load sub range, ', range)\n xhr.send(this._body)\n } catch (e) {\n e.options = {index: this._index, range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(e)\n }\n }\n\n _onReadyStatechange (e) {\n const xhr = e.target\n if (xhr.readyState === 2) {\n this._firstRtt < 0 && (this._firstRtt = Date.now())\n }\n }\n\n _onLoad (e) {\n const status = e.target.status\n if (status < 200 || status > 299) {\n const error = new NetError(this._url, null, { ...e.target.response, status }, 'bad response,status:' + status)\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n return this._loadCompleteReject(error)\n }\n let data = null\n let done = false\n let byteStart\n const startRange = (this._range?.length > 0 ? this._range [0] : 0 )\n if (this._responseType === ResponseType.ARRAY_BUFFER) {\n const chunk = new Uint8Array(e.target.response)\n byteStart = startRange + this._receivedLength\n if (chunk && chunk.byteLength > 0) {\n this._receivedLength += chunk.byteLength\n const costTime = Date.now() - this._startTime\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed, len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: [byteStart, startRange + this._receivedLength], priOptions: this._priOptions})\n }\n data = chunk\n if (this._range?.length > 1 && this._range[1] && this._receivedLength < this._range[1] - this._range[0]) {\n done = false\n } else {\n done = true\n }\n this._logger.debug('[xhr load done->], tast :', this._range, ', start', byteStart, 'end ', startRange + this._receivedLength, ',dataLen,', (chunk ? chunk.byteLength : 0), ',receivedLength', this._receivedLength, ',index,', this._index, ', done,', done)\n } else {\n done = true\n data = e.target.response\n }\n let response = {\n ok: status >= 200 && status < 300,\n status,\n statusText: this._xhr.statusText,\n url: this._xhr.responseURL,\n headers: this._getHeaders(this._xhr),\n body: this._xhr.response\n }\n if (this._transformResponse) {\n response = this._transformResponse(response, this._url) || response\n }\n if (this._onProgress) {\n this._onProgress(data, done, { index: this._index, vid: this._vid, range: [byteStart, startRange + this._receivedLength], startTime: this._startTime, endTime: Date.now(), priOptions: this._priOptions }, response)\n }\n\n if (!done) {\n this._startLoad()\n } else {\n this._runing = false\n this._loadCompleteResolve && this._loadCompleteResolve(createResponse(\n this._onProgress ? null : data,\n done,\n response,\n response.headers['content-length'],\n response.headers.age,\n this._startTime,\n this._firstRtt,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n\n cancel () {\n if (this._aborted) return\n this._aborted = true\n this._runing = false\n super.removeAllListeners()\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n if (this._xhr) {\n return this._xhr.abort()\n }\n }\n\n static isSupported () {\n return typeof XMLHttpRequest !== 'undefined'\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n _getHeaders (xhr) {\n const headerLines = xhr.getAllResponseHeaders().trim().split('\\r\\n')\n const headers = {}\n for (const header of headerLines) {\n const parts = header.split(': ')\n headers[parts[0].toLowerCase()] = parts.slice(1).join(': ')\n }\n return headers\n }\n}\n","import { FetchLoader } from './fetch'\nimport { XhrLoader } from './xhr'\nimport { LoaderType } from './types'\nimport { createPublicPromise } from '../utils'\nimport { Logger } from '../logger'\n\nexport class Task {\n constructor (type, config) {\n this.promise = createPublicPromise()\n this.alive = !!config.onProgress\n !config.logger && (config.logger = new Logger('Loader'))\n this._loaderType = type\n this._loader = type === LoaderType.FETCH && !!window.fetch ? new FetchLoader() : new XhrLoader()\n this._config = config\n this._retryCount = 0\n this._retryTimer = null\n this._canceled = false\n this._retryCheckFunc = config.retryCheckFunc\n this._logger = config.logger\n }\n\n exec () {\n const {\n retry,\n retryDelay,\n onRetryError,\n transformError,\n ...rest\n } = this._config\n\n const request = async () => {\n try {\n const response = await this._loader.load(rest)\n this.promise.resolve(response)\n } catch (e) {\n this._loader.running = false\n this._logger.debug('[task request catch err]', e)\n if (this._canceled) return\n\n e.loaderType = this._loaderType\n e.retryCount = this._retryCount\n\n let error = e\n if (transformError) {\n error = transformError(error) || error\n }\n\n if (onRetryError && this._retryCount > 0) onRetryError(error, this._retryCount, {index: rest.index, vid: rest.vid, range: rest.range, priOptions: rest.priOptions})\n\n this._retryCount++\n let isRetry = true\n if (this._retryCheckFunc) {\n isRetry = this._retryCheckFunc(e)\n }\n if (isRetry && this._retryCount <= retry) {\n clearTimeout(this._retryTimer)\n this._logger.debug('[task request setTimeout],retry', this._retryCount, ',retry range,', rest.range)\n this._retryTimer = setTimeout(request, retryDelay)\n return\n }\n this.promise.reject(error)\n }\n }\n\n request()\n return this.promise\n }\n\n async cancel () {\n clearTimeout(this._retryTimer)\n this._canceled = true\n this._loader.running = false\n return this._loader.cancel()\n }\n\n get running () {\n return this._loader && this._loader.running\n }\n\n get loader () {\n return this._loader\n }\n}\n","export function isMediaPlaying (media) {\n return media && !media.paused && !media.ended && media.playbackRate !== 0 && media.readyState !== 0\n}\n\nexport function getVideoPlaybackQuality (video) {\n if (!video) return {}\n if (typeof video.getVideoPlaybackQuality === 'function') {\n const info = video.getVideoPlaybackQuality()\n return {\n droppedVideoFrames: info.droppedVideoFrames || info.corruptedVideoFrames,\n totalVideoFrames: info.totalVideoFrames,\n creationTime: info.creationTime\n }\n }\n\n return {\n droppedVideoFrames: video.webkitDroppedFrameCount,\n totalVideoFrames: video.webkitDecodedFrameCount,\n creationTime: performance.now()\n }\n}\n\n/**\n * @param {Array.} arr\n * @returns\n */\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n if (arr.length < 2) return arr[0]\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport function sleep (t = 0) {\n return new Promise((resolve) => setTimeout(resolve, t))\n}\n","import { FetchLoader } from './fetch'\nimport { LoaderType, ResponseType } from './types'\nimport { getConfig } from './config'\nimport { Task } from './task'\nimport { isPlainObject } from '../is'\nimport { sleep } from '../streaming-helper'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\n\nexport {\n LoaderType,\n ResponseType\n}\n\nexport class NetLoader extends EventEmitter {\n type = LoaderType.FETCH\n\n _queue = []\n\n _alive = []\n\n _currentTask = null\n\n _config\n\n constructor (cfg) {\n super(cfg)\n this._config = getConfig(cfg)\n if (\n this._config.loaderType === LoaderType.XHR ||\n !FetchLoader.isSupported()\n ) {\n this.type = LoaderType.XHR\n }\n this.log = cfg.logger\n }\n\n isFetch () {\n return this.type === LoaderType.FETCH\n }\n\n static isFetchSupport () {\n return FetchLoader.isSupported()\n }\n\n load (url, config = {}) {\n if (typeof url === 'string' || !url) {\n config.url = url || config.url || this._config.url\n } else {\n config = url\n }\n\n config = Object.assign({}, this._config, config)\n if (config.params) config.params = Object.assign({}, config.params)\n if (config.headers && isPlainObject(config.headers)) config.headers = Object.assign({}, config.headers)\n if (config.body && isPlainObject(config.body)) config.body = Object.assign({}, config.body)\n\n if (config.transformRequest) {\n config = config.transformRequest(config) || config\n }\n config.logger = this.log\n\n const task = new Task(this.type, config)\n task.loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n this._queue.push(task)\n if (this._queue.length === 1 && (!this._currentTask || !this._currentTask.running)) {\n this._processTask()\n }\n\n return task.promise\n }\n\n async cancel () {\n const cancels = this._queue.map(t => t.cancel()).concat(this._alive.map(t => t.cancel()))\n if (this._currentTask) {\n cancels.push(this._currentTask.cancel())\n }\n this._queue = []\n this._alive = []\n await Promise.all(cancels)\n await sleep()\n }\n\n _processTask () {\n this._currentTask = this._queue.shift()\n if (!this._currentTask) return\n\n if (this._currentTask.alive) {\n this._alive.push(this._currentTask)\n }\n const req = this._currentTask.exec().catch(e => {})\n\n if (!(req && typeof req.finally === 'function')) return\n\n req.finally(() => {\n if (this._currentTask?.alive && this._alive?.length > 0) {\n this._alive = this._alive.filter(task => task && task !== this._currentTask)\n }\n this._processTask()\n })\n\n }\n}\n","import { LoaderType, ResponseType } from './types'\n\nexport function getConfig (cfg) {\n return {\n loaderType: LoaderType.FETCH,\n retry: 0,\n retryDelay: 0, // ms\n timeout: 0,\n request: null, // Request\n onTimeout: undefined,\n onProgress: undefined,\n onRetryError: undefined,\n transformRequest: undefined,\n transformResponse: undefined,\n transformError: undefined,\n responseType: ResponseType.TEXT,\n range: undefined,\n url: '',\n params: undefined,\n method: 'GET',\n headers: {},\n body: undefined,\n mode: undefined,\n credentials: undefined,\n cache: undefined,\n redirect: undefined,\n referrer: undefined,\n referrerPolicy: undefined,\n integrity: undefined,\n onProcessMinLen: 0,\n ...cfg\n }\n}\n","import { Buffer } from '../buffer'\n\nexport class GapService {\n _prevCurrentTime = 0\n\n do (media, maxJumpDistance = 3, isLive, seekThreshold = 1) {\n if (!media) return\n\n const currentTime = media.currentTime\n let jumpTo = 0\n\n if (this._prevCurrentTime === currentTime) {\n const info = Buffer.info(Buffer.get(media), currentTime)\n if (!info.buffers.length) return\n\n if (\n (isLive && info.nextStart) ||\n (info.nextStart && info.nextStart - currentTime < maxJumpDistance)\n ) {\n jumpTo = info.nextStart + 0.1\n } else if (info.end && info.end - currentTime > seekThreshold && !media.seeking) {\n jumpTo = currentTime + 0.1\n }\n }\n\n this._prevCurrentTime = currentTime\n\n if (jumpTo && currentTime !== jumpTo) {\n media.currentTime = jumpTo\n }\n }\n}\n","import { EVENT } from '../event'\n\nexport class SeiService {\n _seiSet = new Set()\n\n constructor (emitter) {\n this.emitter = emitter\n\n emitter.on(EVENT.SEI, (sei) => {\n if (sei) this._seiSet.add(sei)\n })\n }\n\n throw (currentTime) {\n if (currentTime === null || currentTime === undefined || !this._seiSet.size) return\n const min = currentTime - 0.2\n const max = currentTime + 0.2\n const toThrow = []\n this._seiSet.forEach(sei => {\n if (sei.time >= min && sei.time <= max) {\n toThrow.push(sei)\n }\n })\n\n toThrow.forEach((sei) => {\n this._seiSet.delete(sei)\n this.emitter.emit(EVENT.SEI_IN_TIME, sei)\n })\n }\n\n reset () {\n this._seiSet.clear()\n }\n}\n","export class BandwidthService {\n _chunkSpeeds = [] // bps\n _speeds = [] // bps\n\n addRecord (totalByte, ms) {\n if (!totalByte || !ms) return\n this._speeds.push(8000 * totalByte / ms)\n this._speeds = this._speeds.slice(-3)\n }\n\n addChunkRecord (totalByte, ms) {\n if (!totalByte || !ms) return\n this._chunkSpeeds.push(8000 * totalByte / ms)\n this._chunkSpeeds = this._chunkSpeeds.slice(-100)\n }\n\n getAvgSpeed () {\n if (!this._chunkSpeeds.length && !this._speeds.length) return 0\n if (this._speeds.length) {\n return this._speeds.reduce((a, c) => (a += c)) / this._speeds.length\n }\n return this._chunkSpeeds.reduce((a, c) => (a += c)) / this._chunkSpeeds.length\n }\n\n getLatestSpeed () {\n if (!this._chunkSpeeds.length && !this._speeds.length) return 0\n if (this._speeds.length) {\n return this._speeds[this._speeds.length - 1]\n }\n return this._chunkSpeeds[this._chunkSpeeds.length - 1]\n }\n\n reset () {\n this._chunkSpeeds = []\n this._speeds = []\n }\n}\n","import { EVENT } from 'xgplayer-streaming-shared'\n\nclass Stats {\n encodeType = '' // hevc | avc\n audioCodec = ''\n videoCodec = ''\n domain = '' // stream url domain\n fps = 0\n bitrate = 0 // 最新1s下载数据的码率\n width = 0\n height = 0\n samplerate = 0\n channelCount = 0\n gop = 0 // 第一个gop帧数\n\n _bitsAccumulateSize = 0\n _bitsAccumulateDuration = 0\n\n constructor (timescale) {\n this._timescale = timescale\n }\n\n getStats () {\n return {\n encodeType: this.encodeType,\n audioCodec: this.audioCodec,\n videoCodec: this.videoCodec,\n domain: this.domain,\n fps: this.fps,\n bitrate: this.bitrate,\n width: this.width,\n height: this.height,\n samplerate: this.samplerate,\n channelCount: this.channelCount,\n gop: this.gop\n }\n }\n\n setEncodeType (encode) {\n this.encodeType = encode\n }\n\n setFpsFromScriptData ({data}) {\n const fps = data?.onMetaData?.framerate\n if (fps && fps > 0 && fps < 100) {\n this.fps = fps\n }\n }\n\n setVideoMeta (track) {\n this.width = track.width\n this.height = track.height\n this.videoCodec = track.codec\n this.encodeType = track.codecType\n if (track.fpsNum && track.fpsDen) {\n const fps = track.fpsNum / track.fpsDen\n if (fps > 0 && fps < 100) {\n this.fps = fps\n }\n }\n }\n\n setAudioMeta (track) {\n this.audioCodec = track.codec\n this.samplerate = track.sampleRate\n this.channelCount = track.channelCount\n }\n\n setDomain (responseUrl) {\n this.domain = responseUrl.split('/').slice(2, 3)[0]\n }\n\n updateBitrate (samples) {\n if (!this.fps || this.fps >= 100) {\n if (samples.length) {\n const duration = samples.reduce((a,b) => a += b.duration, 0) / samples.length\n this.fps = Math.round(this._timescale / duration)\n }\n }\n samples.forEach(sample => {\n if (sample.gopId === 1) {\n this.gop++\n }\n this._bitsAccumulateDuration += sample.duration / (this._timescale / 1000)\n this._bitsAccumulateSize += sample.units.reduce((a, c) => (a += c.length), 0)\n if (this._bitsAccumulateDuration >= 1000) {\n this.bitrate = this._bitsAccumulateSize * 8\n this._bitsAccumulateDuration = 0\n this._bitsAccumulateSize = 0\n }\n })\n }\n}\n\n\n/**\n * @typedef {Object} StatsInfo\n * @property {number} downloadSpeed\n * @property {number} avgSpeed\n * @property {number} currentTime\n * @property {number} bufferEnd\n * @property {number} decodeFps\n * @property {string} encodeType\n * @property {string} audioCodec\n * @property {string} videoCodec\n * @property {string} domain\n * @property {number} fps\n * @property {number} bitrate\n * @property {number} width\n * @property {number} height\n * @property {number} samplerate\n * @property {number} channelCount\n * @property {number} gop\n */\nclass MediaStatsService {\n\n _core = null\n\n _samples = []\n\n constructor (core, timescale = 1000) {\n this._core = core\n this._timescale = timescale\n this._stats = new Stats(timescale)\n this._bindEvents()\n }\n\n\n /** @returns {StatsInfo} */\n getStats () {\n const { currentTime = 0, decodeFps = 0 } = this._core?.media || {}\n return {\n ...this._stats.getStats(),\n downloadSpeed: this._core?.speedInfo?.().speed || 0,\n avgSpeed: this._core?.speedInfo?.().avgSpeed || 0,\n currentTime,\n bufferEnd: this._core?.bufferInfo()?.remaining || 0,\n decodeFps\n }\n }\n\n _bindEvents () {\n this._core.on(EVENT.DEMUXED_TRACK, ({videoTrack}) => this._stats.updateBitrate(videoTrack.samples))\n\n this._core.on(EVENT.FLV_SCRIPT_DATA, data => {\n this._stats.setFpsFromScriptData(data)\n })\n\n this._core.on(EVENT.METADATA_PARSED, e => {\n if (e.type === 'video') {\n this._stats.setVideoMeta(e.track)\n } else {\n this._stats.setAudioMeta(e.track)\n }\n })\n\n this._core.on(EVENT.TTFB, e => {\n this._stats.setDomain(e.responseUrl)\n })\n\n }\n\n reset () {\n this._samples = []\n this._stats = new Stats(this._timescale)\n }\n\n}\n\nexport { MediaStatsService }\n","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m'\n}\n\n/** @enum {string} */\nexport const WarningType = {\n LARGE_AV_SHIFT: 'LARGE_AV_SHIFT',\n LARGE_VIDEO_GAP: 'LARGE_VIDEO_GAP',\n LARGE_VIDEO_GAP_BETWEEN_CHUNK: 'LARGE_VIDEO_GAP_BETWEEN_CHUNK',\n LARGE_AUDIO_GAP: 'LARGE_AUDIO_GAP',\n AUDIO_FILLED: 'AUDIO_FILLED',\n AUDIO_DROPPED: 'AUDIO_DROPPED'\n}\n","import { TrackType, VideoCodecType } from './types'\n\nexport class VideoTrack {\n id = 1\n\n /** @readonly */\n type = TrackType.VIDEO\n\n codecType = VideoCodecType.AVC\n\n pid = -1 // ts use\n\n /** @type {Uint8Array | Object} */\n hvcC = undefined\n\n codec = ''\n\n timescale = 0\n\n formatTimescale = 0\n\n sequenceNumber = 0\n\n baseMediaDecodeTime = 0\n\n baseDts = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./video-sample').VideoSample[]} */\n samples = []\n\n /** @type {Uint8Array[]} */\n pps = []\n\n /** @type {Uint8Array[]} */\n sps = []\n\n /** @type {Uint8Array[]} */\n vps = []\n\n fpsNum = 0\n\n fpsDen = 0\n\n /** @type {[number, number]} */\n sarRatio = [] // [hSpacing, vSpacing]\n\n width = 0\n\n height = 0\n\n nalUnitSize = 4\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n isVideo = true\n\n kid = null\n\n pssh = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber =\n this.width =\n this.height =\n this.fpsDen =\n this.fpsNum =\n this.duration =\n this.baseMediaDecodeTime =\n this.timescale = 0\n this.codec = ''\n this.present = false\n this.pid = -1\n this.pps = []\n this.sps = []\n this.vps = []\n this.sarRatio = []\n this.samples = []\n this.warnings = []\n this.hvcC = null\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.pps.length && this.sps.length && this.codec)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isVideoEncryption\n }\n}\n","import { TrackType, AudioCodecType } from './types'\n\nexport class AudioTrack {\n id = 2\n\n /** @readonly */\n type = TrackType.AUDIO\n\n codecType = AudioCodecType.AAC\n\n pid = -1\n\n codec = ''\n\n sequenceNumber = 0\n\n sampleDuration = 0\n\n timescale = 0\n\n formatTimescale = 0\n\n baseMediaDecodeTime = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./audio-sample').AudioSample[]} */\n samples = []\n\n baseDts = 0\n\n sampleSize = 16\n\n sampleRate = 0\n\n channelCount = 0\n\n objectType = 0\n\n sampleRateIndex = 0\n\n /** @type {number[]} */\n config = []\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n kid = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber = 0\n this.timescale = 0\n this.sampleDuration = 0\n this.sampleRate = 0\n this.channelCount = 0\n this.baseMediaDecodeTime = 0\n this.present = false\n this.pid = -1\n this.codec = ''\n this.samples = []\n this.config = []\n this.warnings = []\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isAudioEncryption\n }\n}\n","/**\n * @typedef {Object} VideoFlag\n * @property {number} [isLeading=0]\n * @property {number} [dependsOn=1]\n * @property {number} [isDependedOn=0]\n * @property {number} [hasRedundancy=0]\n * @property {number} [paddingValue=0]\n * @property {number} [degradationPriority=0]\n * @property {number} [isNonSyncSample=1]\n */\n\nexport class VideoSample {\n /** @type {VideoFlag} */\n flag = {}\n\n keyframe = false\n\n gopId = 0\n\n duration = 0\n\n size = 0\n\n units = []\n\n chromaFormat = 420\n\n // sampleOffset = 0\n\n /**\n * @param {number} pts\n * @param {number} dts\n * @param {Uint8Array[]} [units]\n */\n constructor (pts, dts, units) {\n this.originPts = this.pts = pts\n this.originDts = this.dts = dts\n if (units) this.units = units\n }\n\n /**\n * @returns {number}\n */\n get cts () {\n return this.pts - this.dts\n }\n\n setToKeyframe () {\n this.keyframe = true\n this.flag.dependsOn = 2\n this.flag.isNonSyncSample = 0\n }\n}\n","export class AudioSample {\n duration = 1024\n\n flag = { dependsOn: 2, isNonSyncSample: 0 }\n keyframe = true\n\n /**\n * @param {number} pts\n * @param {Uint8Array} data\n * @param {number} [duration=1024]\n */\n constructor (pts, data, duration, sampleOffset) {\n this.originPts = this.pts = this.dts = pts\n this.data = data\n this.size = data.byteLength\n this.sampleOffset = sampleOffset\n if (duration) this.duration = duration\n }\n}\n","import { TrackType } from './types'\n\nclass Sample {\n time = 0 // second\n\n /**\n * @param {Object} data\n * @param {number} pts\n */\n constructor (data, pts) {\n this.data = data\n this.originPts = this.pts = pts\n }\n}\n\nexport class FlvScriptSample extends Sample {}\n\nexport class SeiSample extends Sample {}\n\nexport class MetadataTrack {\n /** @readonly */\n id = 3\n\n /** @readonly */\n type = TrackType.METADATA\n\n timescale = 0\n\n /** @type {FlvScriptSample[]} */\n flvScriptSamples = []\n\n /** @type {SeiSample[]} */\n seiSamples = []\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!((this.flvScriptSamples.length || this.seiSamples.length) && this.timescale)\n }\n\n reset () {\n this.timescale = 0\n this.flvScriptSamples = []\n this.seiSamples = []\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!(this.flvScriptSamples.length || this.seiSamples.length)\n }\n}\n","export class ExpGolomb {\n _bytesAvailable\n\n _bitsAvailable = 0\n\n _word = 0\n\n constructor (data) {\n if (!data) throw new Error('ExpGolomb data params is required')\n this._data = data\n this._bytesAvailable = data.byteLength\n if (this._bytesAvailable) this._loadWord()\n }\n\n _loadWord () {\n const position = this._data.byteLength - this._bytesAvailable\n const availableBytes = Math.min(4, this._bytesAvailable)\n if (availableBytes === 0) throw new Error('No bytes available')\n\n const workingBytes = new Uint8Array(4)\n workingBytes.set(this._data.subarray(position, position + availableBytes))\n\n this._word = new DataView(workingBytes.buffer).getUint32(0)\n this._bitsAvailable = availableBytes * 8\n this._bytesAvailable -= availableBytes\n }\n\n skipBits (count) {\n if (this._bitsAvailable > count) {\n this._word <<= count\n this._bitsAvailable -= count\n } else {\n count -= this._bitsAvailable\n const skipBytes = Math.floor(count / 8)\n count -= (skipBytes * 8)\n this._bytesAvailable -= skipBytes\n this._loadWord()\n this._word <<= count\n this._bitsAvailable -= count\n }\n }\n\n readBits (size) {\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits')\n }\n\n let bits = Math.min(this._bitsAvailable, size)\n const val = this._word >>> (32 - bits)\n\n this._bitsAvailable -= bits\n if (this._bitsAvailable > 0) {\n this._word <<= bits\n } else if (this._bytesAvailable > 0) {\n this._loadWord()\n }\n\n bits = size - bits\n if (bits > 0 && this._bitsAvailable) {\n return (val << bits) | this.readBits(bits)\n }\n return val\n }\n\n skipLZ () {\n let leadingZeroCount\n for (\n leadingZeroCount = 0;\n leadingZeroCount < this._bitsAvailable;\n ++leadingZeroCount\n ) {\n if ((this._word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n this._word <<= leadingZeroCount\n this._bitsAvailable -= leadingZeroCount\n return leadingZeroCount\n }\n }\n this._loadWord()\n return leadingZeroCount + this.skipLZ()\n }\n\n skipUEG () {\n this.skipBits(1 + this.skipLZ())\n }\n\n readUEG () {\n const clz = this.skipLZ()\n return this.readBits(clz + 1) - 1\n }\n\n readEG () {\n const val = this.readUEG()\n if (1 & val) {\n return (1 + val) >>> 1\n }\n return -1 * (val >>> 1)\n }\n\n readBool () {\n return this.readBits(1) === 1\n }\n\n readUByte () {\n return this.readBits(8)\n }\n\n skipScalingList (count) {\n let lastScale = 8\n let nextScale = 8\n let deltaScale\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = this.readEG()\n nextScale = (lastScale + deltaScale + 256) % 256\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n}\n","export class Logger {\n constructor (name) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","export class UTF8 {\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {string}\n */\n static decode (uint8array) {\n const out = []\n const input = uint8array\n let i = 0\n const length = uint8array.length\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]))\n ++i\n continue\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (UTF8._checkContinuation(input, i, 1)) {\n const ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F)\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 2\n continue\n }\n }\n } else if (input[i] < 0xF0) {\n if (UTF8._checkContinuation(input, i, 2)) {\n const ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 3\n continue\n }\n }\n } else if (input[i] < 0xF8) {\n if (UTF8._checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 |\n (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F)\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800))\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00))\n i += 4\n continue\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD))\n ++i\n }\n\n return out.join('')\n }\n\n static _checkContinuation (uint8array, start, checkLength) {\n const array = uint8array\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80) {\n return false\n }\n }\n return true\n } else {\n return false\n }\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n\nconst ua = isBrowser && navigator.userAgent.toLocaleLowerCase()\n\n// eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\nexport const isSafari = isBrowser && /^((?!chrome|android).)*safari/.test(ua)\nexport const isFirefox = isBrowser && ua.includes('firefox')\nexport const isAndroid = isBrowser && ua.includes('android')\n","/* c8 ignore next 4 */\nexport { ExpGolomb } from './exp-golomb'\nexport { Logger } from './logger'\nexport { UTF8 } from './utf8'\nexport * from './env'\n\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport const MAX_SIZE = Math.pow(2, 32)\n\nexport function readBig16 (data, i = 0) {\n return (data[i] << 8) + (data[i + 1] || 0)\n}\n\nexport function readBig24 (data, i = 0) {\n return (data[i] << 16) + (data[i + 1] << 8) + (data[i + 2] || 0)\n}\n\nexport function readBig32 (data, i = 0) {\n return (data[i] << 24 >>> 0) + (data[i + 1] << 16) + (data[i + 2] << 8) + (data[i + 3] || 0)\n}\n\nexport function readBig64 (data, i = 0) {\n return readBig32(data, i) * MAX_SIZE + readBig32(data, i + 4)\n}\n\nexport function getAvcCodec (codecs) {\n let codec = 'avc1.'\n let h\n for (let i = 0; i < 3; i++) {\n h = codecs[i].toString(16)\n if (h.length < 2) h = `0${h}`\n codec += h\n }\n return codec\n}\n\nexport function formatIV (arr) {\n let iv = ''\n arr.forEach(value => {\n iv += bufferToString(value)\n })\n if (iv.length <= 32) {\n const len = 32 - iv.length\n for (let i = 0; i < len; i++) {\n iv += '0'\n }\n }\n return iv\n}\n\nexport function parse (a) {\n if (!Array.isArray(a)) {\n const arr = []\n let value = ''\n for (let i = 0; i < a.length; i++) {\n if (i % 2) {\n value = a[i - 1] + a[i]\n arr.push(parseInt(value, 16))\n value = ''\n }\n }\n return arr\n }\n return a.map(item => { return parseInt(item, 16) })\n}\nfunction bufferToString (value) {\n return ('0' + (Number(value).toString(16))).slice(-2).toUpperCase()\n}\n\nexport function hashVal (str) {\n let hash = 0; let i; let chr\n if (str.length === 0) return hash\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + chr\n hash |= 0\n }\n return hash\n}\n","import { readBig32 } from '../utils'\n\nexport class NALu {\n static parseAnnexB (data) {\n const len = data.length\n let start = 2\n let end = 0\n while (data[start] !== null && data[start] !== undefined && data[start] !== 1) {\n start++\n }\n start++\n end = start + 2\n\n if (end >= len) return []\n\n const units = []\n\n while (end < len) {\n switch (data[end]) {\n case 0:\n if (data[end - 1] !== 0) {\n end += 2\n break\n } else if (data[end - 2] !== 0) {\n end++\n break\n }\n\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n\n do {\n end++\n } while (data[end] !== 1 && end < len)\n start = end + 1\n end = start + 2\n break\n case 1:\n if (data[end - 1] !== 0 || data[end - 2] !== 0) {\n end += 3\n break\n }\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n start = end + 1\n end = start + 2\n break\n default:\n end += 3\n break\n }\n }\n\n if (start < len) units.push(data.subarray(start))\n\n return units\n }\n\n static parseAvcC (data, size = 4) {\n if (data.length < 4) return\n const dataLen = data.length\n const units = []\n\n let offset = 0\n let length\n while ((offset + size) < dataLen) {\n length = readBig32(data, offset)\n if (size === 3) length >>>= 8\n offset += size\n\n if (!length) continue\n if (offset + length > dataLen) {\n break\n }\n\n units.push(data.subarray(offset, offset + length))\n offset += length\n }\n\n return units\n }\n\n static parseSEI (unit, isHevc) {\n const len = unit.length\n let i = isHevc ? 2 : 1\n let type = 0\n let size = 0\n let uuid = ''\n\n while (unit[i] === 255) {\n type += 255\n i++\n }\n\n type += unit[i++]\n\n while (unit[i] === 255) {\n size += 255\n i++\n }\n size += unit[i++]\n\n if (type === 5 && len > i + 16) {\n for (let j = 0; j < 16; j++) {\n uuid += unit[i].toString(16)\n i++\n }\n }\n\n return {\n payload: unit.subarray(i), type, size, uuid\n }\n }\n\n static removeEPB (uint) {\n const length = uint.byteLength\n const emulationPreventionBytesPositions = []\n let i = 1\n\n while (i < length - 2) {\n if (uint[i] === 0 && uint[i + 1] === 0 && uint[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2)\n i += 2\n } else {\n i++\n }\n }\n\n if (!emulationPreventionBytesPositions.length) return uint\n\n const newLength = length - emulationPreventionBytesPositions.length\n const newData = new Uint8Array(newLength)\n\n let sourceIndex = 0\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n sourceIndex++\n emulationPreventionBytesPositions.shift()\n }\n newData[i] = uint[sourceIndex]\n }\n\n return newData\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb, getAvcCodec } from '../utils'\n\nexport class AVC {\n static parseAVCDecoderConfigurationRecord (data) {\n if (data.length < 7) return\n const nalUnitSize = (data[4] & 3) + 1\n\n let spsParsed\n const spsArr = []\n const ppsArr = []\n\n let offset = 6\n const spsCount = data[5] & 0x1f\n let spsSize\n for (let i = 0; i < spsCount; i++) {\n spsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!spsSize) continue\n\n const sps = data.subarray(offset, offset + spsSize)\n offset += spsSize\n spsArr.push(sps)\n\n if (!spsParsed) {\n spsParsed = AVC.parseSPS(NALu.removeEPB(sps))\n }\n }\n\n const ppsCount = data[offset]\n offset++\n let ppsSize\n for (let i = 0; i < ppsCount; i++) {\n ppsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!ppsSize) continue\n ppsArr.push(data.subarray(offset, offset + ppsSize))\n offset += ppsSize\n }\n\n return {\n sps: spsParsed,\n spsArr,\n ppsArr,\n nalUnitSize\n }\n }\n\n static parseSPS (unit) {\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n\n const profileIdc = eg.readUByte()\n const profileCompatibility = eg.readUByte()\n const levelIdc = eg.readUByte()\n eg.skipUEG()\n\n let chromaFormat = 420\n if (\n profileIdc === 100 ||\n profileIdc === 110 ||\n profileIdc === 122 ||\n profileIdc === 244 ||\n profileIdc === 44 ||\n profileIdc === 83 ||\n profileIdc === 86 ||\n profileIdc === 118 ||\n profileIdc === 128 ||\n profileIdc === 138 ||\n profileIdc === 144\n ) {\n const chromaFormatIdc = eg.readUEG()\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n if (chromaFormatIdc === 3) eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n eg.skipBits(1)\n if (eg.readBool()) {\n const scalingListCount = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < scalingListCount; i++) {\n if (eg.readBool()) {\n if (i < 6) {\n eg.skipScalingList(16)\n } else {\n eg.skipScalingList(64)\n }\n }\n }\n }\n }\n\n eg.skipUEG()\n const picOrderCntType = eg.readUEG()\n if (picOrderCntType === 0) {\n eg.readUEG()\n } else if (picOrderCntType === 1) {\n eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n const numRefFramesInPicOrderCntCycle = eg.readUEG()\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n eg.skipUEG()\n }\n }\n\n eg.skipUEG()\n eg.skipBits(1)\n const picWidthInMbsMinus1 = eg.readUEG()\n const picHeightInMapUnitsMinus1 = eg.readUEG()\n const frameMbsOnlyFlag = eg.readBits(1)\n if (frameMbsOnlyFlag === 0) eg.skipBits(1)\n eg.skipBits(1)\n\n let frameCropLeftOffset = 0\n let frameCropRightOffset = 0\n let frameCropTopOffset = 0\n let frameCropBottomOffset = 0\n\n if (eg.readBool()) {\n frameCropLeftOffset = eg.readUEG()\n frameCropRightOffset = eg.readUEG()\n frameCropTopOffset = eg.readUEG()\n frameCropBottomOffset = eg.readUEG()\n }\n\n let sarRatio\n let fixedFrame\n let fpsNum\n let fpsDen\n let fps\n if (eg.readBool()) {\n if (eg.readBool()) {\n const aspectRatioIdc = eg.readUByte()\n switch (aspectRatioIdc) {\n case 1: sarRatio = [1, 1]; break\n case 2: sarRatio = [12, 11]; break\n case 3: sarRatio = [10, 11]; break\n case 4: sarRatio = [16, 11]; break\n case 5: sarRatio = [40, 33]; break\n case 6: sarRatio = [24, 11]; break\n case 7: sarRatio = [20, 11]; break\n case 8: sarRatio = [32, 11]; break\n case 9: sarRatio = [80, 33]; break\n case 10: sarRatio = [18, 11]; break\n case 11: sarRatio = [15, 11]; break\n case 12: sarRatio = [64, 33]; break\n case 13: sarRatio = [160, 99]; break\n case 14: sarRatio = [4, 3]; break\n case 15: sarRatio = [3, 2]; break\n case 16: sarRatio = [2, 1]; break\n case 255: {\n sarRatio = [\n (eg.readUByte() << 8) | eg.readUByte(),\n (eg.readUByte() << 8) | eg.readUByte()\n ]\n break\n }\n default:\n }\n }\n\n if (eg.readBool()) eg.readBool()\n\n if (eg.readBool()) {\n eg.readBits(4)\n if (eg.readBool()) eg.readBits(24)\n }\n\n if (eg.readBool()) {\n eg.readUEG()\n eg.readUEG()\n }\n\n if (eg.readBool()) {\n const numUnitsInTick = eg.readBits(32)\n const timeScale = eg.readBits(32)\n fixedFrame = eg.readBool()\n\n fpsNum = timeScale\n fpsDen = numUnitsInTick * 2\n fps = fpsNum / fpsDen\n }\n }\n\n return {\n codec: getAvcCodec(unit.subarray(1, 4)),\n profileIdc,\n profileCompatibility,\n levelIdc,\n chromaFormat,\n width: Math.ceil(\n (picWidthInMbsMinus1 + 1) * 16 -\n 2 * (frameCropLeftOffset + frameCropRightOffset)\n ),\n height:\n (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n (frameMbsOnlyFlag ? 2 : 4) *\n (frameCropTopOffset + frameCropBottomOffset),\n sarRatio,\n fpsNum,\n fpsDen,\n fps,\n fixedFrame\n }\n }\n}\n","import { isFirefox, isAndroid } from '../utils'\n\nexport class AAC {\n static FREQ = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350\n ];\n\n static getRateIndexByRate (rate) {\n return AAC.FREQ.indexOf(rate)\n }\n\n static parseADTS (data, pts) {\n const len = data.length\n let i = 0\n\n while ((i + 2) < len) {\n if (data[i] === 0xff && (data[i + 1] & 0xf6) === 0xf0) {\n break\n }\n i++\n }\n\n if (i >= len) return\n\n const skip = i\n const frames = []\n const samplingFrequencyIndex = (data[i + 2] & 0x3c) >>> 2\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n if (!sampleRate) throw new Error(`Invalid sampling index: ${samplingFrequencyIndex}`)\n const objectType = ((data[i + 2] & 0xc0) >>> 6) + 1\n const channelCount = ((data[i + 2] & 1) << 2) | ((data[i + 3] & 0xc0) >>> 6)\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n let protectionSkipBytes\n let frameLength\n let frameIndex = 0\n const duration = AAC.getFrameDuration(sampleRate)\n\n while ((i + 7) < len) {\n if ((data[i] !== 0xff) || (data[i + 1] & 0xF6) !== 0xf0) {\n i++\n continue\n }\n\n frameLength = ((data[i + 3] & 0x03) << 11) | (data[i + 4] << 3) | ((data[i + 5] & 0xe0) >> 5)\n if ((len - i) < frameLength) break\n\n protectionSkipBytes = (~data[i + 1] & 0x01) * 2\n frames.push({\n pts: pts + frameIndex * duration,\n data: data.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n })\n\n frameIndex++\n i += frameLength\n }\n\n return {\n skip,\n remaining: i >= len ? undefined : data.subarray(i),\n frames,\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n codec,\n config,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static parseAudioSpecificConfig (data) {\n if (!data.length) return\n const objectType = data[0] >>> 3\n const samplingFrequencyIndex = ((data[0] & 0x07) << 1) | (data[1] >>> 7)\n const channelCount = (data[1] & 0x78) >>> 3\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n // play as no audio track stream\n if (!sampleRate) return\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n return {\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n config,\n codec,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static getFrameDuration (rate, timescale = 90000) {\n return 1024 * timescale / rate\n }\n\n static _getConfig (samplingIndex, channelCount, originObjectType) {\n const config = []\n let objectType\n let extensionSamplingIndex\n if (isFirefox) {\n if (samplingIndex >= 6) { // use SBR (HE-AAC)\n objectType = 5\n extensionSamplingIndex = samplingIndex - 3\n } else { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n } else if (isAndroid) { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n } else { // use HE-AAC\n objectType = (originObjectType === 2 || originObjectType === 5) ? originObjectType : 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb } from '../utils'\n\nexport class HEVC {\n static parseHEVCDecoderConfigurationRecord (data, hvcC = {}) {\n if (data.length < 23) return\n hvcC = hvcC || {}\n const nalUnitSize = (data[21] & 3) + 1\n\n let vpsParsed\n let spsParsed\n const spsArr = []\n const ppsArr = []\n const vpsArr = []\n\n let offset = 23\n const numOfArrays = data[22]\n\n let nalUnitType\n let numNalus\n let nalSize\n for (let i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f\n numNalus = (data[offset + 1] << 8) | data[offset + 2]\n\n offset += 3\n\n for (let j = 0; j < numNalus; j++) {\n nalSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!nalSize) continue\n switch (nalUnitType) {\n case 32: {\n const vps = data.subarray(offset, offset + nalSize)\n if (!vpsParsed) vpsParsed = HEVC.parseVPS(NALu.removeEPB(vps), hvcC)\n vpsArr.push(vps)\n }\n break\n case 33: {\n const sps = data.subarray(offset, offset + nalSize)\n if (!spsParsed) spsParsed = HEVC.parseSPS(NALu.removeEPB(sps), hvcC)\n spsArr.push(sps)\n }\n break\n case 34:\n ppsArr.push(data.subarray(offset, offset + nalSize))\n break\n default:\n }\n\n offset += nalSize\n }\n }\n\n return {\n hvcC,\n sps: spsParsed,\n spsArr,\n ppsArr,\n vpsArr,\n nalUnitSize\n }\n }\n\n static parseVPS (unit, hvcC) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(12)\n const vpsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(hvcC.numTemporalLayers || 0, vpsMaxSubLayersMinus1 + 1)\n eg.readBits(17)\n HEVC._parseProfileTierLevel(eg, vpsMaxSubLayersMinus1, hvcC)\n\n return hvcC\n }\n\n static parseSPS (unit, hvcC = {}) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(4)\n const spsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(spsMaxSubLayersMinus1 + 1, hvcC.numTemporalLayers || 0)\n hvcC.temporalIdNested = eg.readBits(1)\n HEVC._parseProfileTierLevel(eg, spsMaxSubLayersMinus1, hvcC)\n\n eg.readUEG() // sps_seq_parameter_set_id\n\n const chromaFormatIdc = hvcC.chromaFormatIdc = eg.readUEG()\n let chromaFormat = 420\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n\n let separateColourPlaneFlag = 0\n if (chromaFormatIdc === 3) {\n separateColourPlaneFlag = eg.readBits(1)\n }\n\n let width = eg.readUEG() // pic_width_in_luma_samples\n let height = eg.readUEG() // pic_height_in_luma_samples\n\n const conformanceWindowFlag = eg.readBits(1)\n\n let confWinLeftOffset\n let confWinRightOffset\n let confWinTopOffset\n let confWinBottomOffset\n if (conformanceWindowFlag === 1) {\n confWinLeftOffset = eg.readUEG() // conf_win_left_offset\n confWinRightOffset = eg.readUEG() // conf_win_right_offset\n confWinTopOffset = eg.readUEG() // conf_win_top_offset\n confWinBottomOffset = eg.readUEG() // conf_win_bottom_offset\n }\n\n hvcC.bitDepthLumaMinus8 = eg.readUEG() // bit_depth_luma_minus8\n hvcC.bitDepthChromaMinus8 = eg.readUEG() // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n const subWidthC = (((chromaFormatIdc === 1) || (chromaFormatIdc === 2)) && (separateColourPlaneFlag === 0)) ? 2 : 1\n const subHeightC = ((chromaFormatIdc === 1) && (separateColourPlaneFlag === 0)) ? 2 : 1\n width -= (subWidthC * (confWinRightOffset + confWinLeftOffset))\n height -= (subHeightC * (confWinBottomOffset + confWinTopOffset))\n }\n\n return {\n codec: 'hev1.1.6.L93.B0',\n width,\n height,\n chromaFormat,\n hvcC\n }\n }\n\n static _parseProfileTierLevel (eg, maxSubLayersMinus1, hvcC) {\n const generalTierFlag = hvcC.generalTierFlag || 0\n hvcC.generalProfileSpace = eg.readBits(2)\n hvcC.generalTierFlag = Math.max(eg.readBits(1), generalTierFlag)\n hvcC.generalProfileIdc = Math.max(eg.readBits(5), hvcC.generalProfileIdc || 0)\n hvcC.generalProfileCompatibilityFlags = eg.readBits(32)\n hvcC.generalConstraintIndicatorFlags = [eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8)]\n const generalLevelIdc = eg.readBits(8)\n if (generalTierFlag < hvcC.generalTierFlag) {\n hvcC.generalLevelIdc = generalLevelIdc\n } else {\n hvcC.generalLevelIdc = Math.max(generalLevelIdc, hvcC.generalLevelIdc || 0)\n }\n\n const subLayerProfilePresentFlag = []\n const subLayerLevelPresentFlag = []\n for (let j = 0; j < maxSubLayersMinus1; j++) {\n subLayerProfilePresentFlag[j] = eg.readBits(1)\n subLayerLevelPresentFlag[j] = eg.readBits(1)\n }\n\n if (maxSubLayersMinus1 > 0) {\n eg.readBits((8 - maxSubLayersMinus1) * 2)\n }\n\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i] !== 0) {\n eg.readBits(2)\n eg.readBits(1)\n eg.readBits(5)\n\n eg.readBits(16)\n eg.readBits(16)\n\n eg.readBits(4)\n\n eg.readBits(16)\n eg.readBits(16)\n eg.readBits(12)\n }\n if (subLayerLevelPresentFlag[i] !== 0) {\n eg.readBits(8)\n }\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 500 // ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 1000 // ms\nconst AUDIO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BREACKED_CHECK_TIME = 5\n\nexport class FlvFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastVideoDuration = 0\n\n // 在视频帧遇到下一个关键帧之前,如果音频时间戳发生了跳变,不能确定是否音视频都发生跳变还是单纯音频发生跳变.\n // 这里记录关键帧标识, 从下一个关键帧开始,如果视频没有跳变,才能判断是只有音频发生了跳变\n this._keyFrameInNextChunk = false\n\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n /**\n * @param {number} startTime 点播seek到的时间点\n * @param {boolean} discontinuity 是否换流\n * @param {boolean} contiguous 前后chunk时间戳是否连续\n */\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 1000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n if (discontinuity || !contiguous) {\n this._videoLastSample = null\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n if (discontinuity && !contiguous) {\n this._baseDtsInited = false\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(audioTrack, videoTrack)\n }\n\n if (!contiguous && startTime) {\n this._audioNextPts = this._videoNextDts = startTime\n }\n\n const resetBaseDts = this._baseDtsInited &&\n (this._videoTimestampBreak || !this.videoTrack.exist()) &&\n (this._audioTimestampBreak || !this.audioTrack.exist())\n\n if (resetBaseDts) {\n this._resetBaseDtsWhenStreamBreaked()\n }\n\n this._fixAudio(audioTrack)\n\n this._keyFrameInNextChunk = false\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n this.metadataTrack.flvScriptSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 1000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n if (x.keyframe) this._keyFrameInNextChunk = true\n })\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else if (videoTrack.length > 1) {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[samples.length - 1]\n refSampleDurationInt = Math.floor((last.dts - first.dts) / (samples.length - 1))\n } else {\n refSampleDurationInt = this._lastVideoDuration || 40\n }\n\n const lastSample = samples.pop()\n\n if (this._videoLastSample) {\n samples.unshift(this._videoLastSample)\n }\n\n this._videoLastSample = lastSample\n\n if (!samples.length) return\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // emit large delta of first sample with expect\n if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n }\n\n // only video breaked\n if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {\n this._videoNextDts = firstSample.dts\n this._videoTimestampBreak = 0\n } else {\n // resolve first frame only\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n if (!this.audioTrack.exist()) {\n this._videoTimestampBreak = 1\n }\n }\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (lastSample) {\n sampleDuration = lastSample.dts - dts\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n this._videoTimestampBreak++\n // emit stream breaked\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionLargeGapDot = dts\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n sampleDuration = refSampleDurationInt\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n this._lastVideoDuration = sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n if (!samples.length) return\n\n // offset origin timestamp\n samples.forEach(x => {\n x.dts = x.pts -= this._baseDts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 1000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n /**\n * timestamp breaked\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n if (!this.audioTrack.exist()){\n this._baseDts -= this._videoNextDts\n } else if (!this.videoTrack.exist()){\n this._baseDts -= this._audioNextPts\n } else {\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n }\n this._videoTimestampBreak = 0\n this._audioTimestampBreak = 0\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) {\n audioTrack.sampleDuration = audioTrack.codecType === AudioCodecType.AAC\n ? AAC.getFrameDuration(audioTrack.timescale, timescale)\n : this._getG711Duration(audioTrack)\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1000\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n let nextPts = this._audioNextPts\n const sample = samples[i]\n let delta = sample.pts - nextPts\n\n // only audio breaked\n if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {\n nextPts = this._audioNextPts = sample.dts\n delta = 0\n this._audioTimestampBreak = 0\n }\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n }\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(this._audioNextPts + refSampleDuration) - Math.floor(this._audioNextPts), silentFrame, sampleDurationInSampleRate)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak++\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n this._audioNextPts += refSampleDuration\n }\n }\n }\n\n _getG711Duration (track) {\n const { sampleSize, channelCount, sampleRate } = track\n const samp0 = track.samples[0]\n if (!samp0) return\n return samp0.data.byteLength * 2 / channelCount / (sampleSize / 8) / sampleRate * 1000\n }\n\n _getSilentFrame (track) {\n if (track.codecType === AudioCodecType.AAC) return AAC.getSilentFrame(track.codec, track.channelCount)\n return new Uint8Array(8 * track.sampleDuration * track.channelCount)\n }\n}\n","import { UTF8 } from '../utils'\n\nexport class AMF {\n static parse (data) {\n if (data.length < 3) return\n\n const ret = {}\n const name = AMF._parseValue(new DataView(data.buffer, data.byteOffset, data.byteLength))\n const value = AMF._parseValue(new DataView(data.buffer, data.byteOffset + name.size, data.byteLength - name.size))\n ret[name.data] = value.data\n\n return ret\n }\n\n static _parseValue (view) {\n const dataLen = view.byteLength\n const type = view.getUint8(0)\n let offset = 1\n let isEnd = false\n let value\n\n switch (type) {\n case 0: // Number(Double) type\n value = view.getFloat64(1)\n offset += 8\n break\n case 1: { // Boolean type\n value = !!view.getUint8(1)\n offset += 1\n break\n }\n case 2: { // String type\n const { data, size } = AMF._parseString(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value = data\n offset += size\n }\n break\n case 3: { // Object(s) type\n value = {}\n let terminal = 0\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) offset += 3\n }\n }\n break\n case 8: { // ECMA array type (Mixed array)\n value = {}\n offset += 4 // ECMAArrayLength(UI32)\n let terminal = 0 // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) {\n offset += 3\n }\n }\n }\n break\n case 9: // ScriptDataObjectEnd\n value = undefined\n offset = 1\n isEnd = true\n break\n case 10: { // Strict array type\n value = []\n const strictArrayLength = view.getUint32(1)\n offset += 4\n for (let i = 0; i < strictArrayLength; i++) {\n const { data, size } = AMF._parseValue(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value.push(data)\n offset += size\n }\n }\n break\n case 11: { // Date type\n const timestamp = view.getFloat64(offset) + view.getInt16(offset + 8) * 60000\n value = new Date(timestamp)\n offset += 10\n }\n break\n case 12: { // Long string type\n const length = view.getUint32(1)\n offset += 4\n value = ''\n if (length > 0) {\n value = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + offset, length))\n }\n offset += length\n }\n break\n default:\n offset = dataLen\n break\n }\n\n return {\n data: value,\n size: offset,\n isEnd\n }\n }\n\n static _parseString (view) {\n const length = view.getUint16(0)\n let data = ''\n if (length > 0) {\n data = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + 2, length))\n }\n\n return {\n data,\n size: 2 + length\n }\n }\n\n static _parseObject (view) {\n if (view.byteLength < 3) return\n\n const name = AMF._parseString(view)\n const value = AMF._parseValue(new DataView(view.buffer, view.byteOffset + name.size, view.byteLength - name.size))\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n isEnd: value.isEnd\n }\n }\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample, VideoCodecType, AudioCodecType, FlvScriptSample, SeiSample } from '../model'\nimport { FlvFixer } from './fixer'\nimport { concatUint8Array, Logger, readBig32 } from '../utils'\nimport { AAC, AVC, HEVC, NALu } from '../codec'\nimport { AMF } from './amf'\n\nconst logger = new Logger('FlvDemuxer')\n\n/**\n * @typedef {Object} DemuxResult\n * @property {VideoTrack} videoTrack\n * @property {AudioTrack} audioTrack\n * @property {MetadataTrack} metadataTrack\n */\n\nexport class FlvDemuxer {\n _headerParsed = false\n _remainingData = null\n _gopId = 0\n _needAddMetaBeforeKeyFrameNal = true // 标识H265流中关键帧Nal之前是否需要插入vps、sps、pps Nal\n\n static AUDIO_RATE = [5500, 11000, 22000, 44000]\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new FlvFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n this._headerParsed = false\n }\n\n if (discontinuity) {\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n metadataTrack.flvScriptSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingData) {\n data = concatUint8Array(this._remainingData, data)\n this._remainingData = null\n }\n }\n\n if (!data.length) {\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n let offset = 0\n if (!this._headerParsed) {\n if (!FlvDemuxer.probe(data)) {\n throw new Error('Invalid flv file')\n }\n audioTrack.present = ((data[4] & 4) >>> 2) !== 0\n videoTrack.present = (data[4] & 1) !== 0\n this._headerParsed = true\n offset = readBig32(data, 5) + 4 // skip prev tag size\n }\n\n const dataLen = data.length\n\n let tagType\n let dataSize\n let timestamp\n let bodyData\n let prevTagSize\n while ((offset + 15) < dataLen) { // header and prev tag size\n tagType = data[offset]\n dataSize = (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]\n if (offset + 15 + dataSize > dataLen) break\n timestamp = (\n (data[offset + 7] << 24 >>> 0) +\n (data[offset + 4] << 16) +\n (data[offset + 5] << 8) +\n data[offset + 6]\n )\n\n offset += 11\n bodyData = data.subarray(offset, offset + dataSize)\n if (tagType === 8) {\n this._parseAudio(bodyData, timestamp)\n } else if (tagType === 9) {\n this._parseVideo(bodyData, timestamp)\n } else if (tagType === 18) {\n this._parseScript(bodyData, timestamp)\n } else {\n logger.warn(`Invalid tag type: ${tagType}`)\n }\n\n offset += dataSize\n prevTagSize = readBig32(data, offset)\n if (prevTagSize !== 11 + dataSize) {\n logger.warn(`Invalid PrevTagSize ${prevTagSize} (${11 + dataSize})`)\n }\n\n offset += 4\n }\n\n if (offset < dataLen) {\n this._remainingData = data.subarray(offset)\n }\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1000\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n if (!audioTrack.exist() && audioTrack.hasSample()) {\n audioTrack.reset()\n }\n if (!videoTrack.exist() && videoTrack.hasSample()) {\n videoTrack.reset()\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n * @returns {DemuxResult}\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return false\n }\n return readBig32(data, 5) >= 9\n }\n\n _parseAudio (data, pts) {\n if (!data.length) return\n\n const format = (data[0] & 0xf0) >>> 4\n const track = this.audioTrack\n\n if (\n format !== 10 && // AAC\n format !== 7 && // G.711 A-law logarithmic PCM\n format !== 8 // G.711 mu-law logarithmic PCM\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== 10) {\n const soundRate = (data[0] & 0x0c) >> 2\n const soundSize = (data[0] & 0x02) >> 1\n const soundType = (data[0] & 0x01)\n track.sampleRate = FlvDemuxer.AUDIO_RATE[soundRate]\n track.sampleSize = soundSize ? 16 : 8\n track.channelCount = soundType + 1\n }\n\n if (format === 10) {\n this._parseAac(data, pts)\n } else {\n this._parseG711(data, pts, format)\n }\n }\n\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(new AudioSample(pts, data.subarray(1)))\n }\n\n _parseAac (data, pts) {\n const track = this.audioTrack\n track.codecType = AudioCodecType.AAC\n\n if (data[1] === 0) { // AACPacketType\n const ret = AAC.parseAudioSpecificConfig(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n } else if (data[1] === 1) { // Raw AAC frame data\n if (pts === undefined || pts === null) return\n track.samples.push(new AudioSample(pts, data.subarray(2)))\n } else {\n logger.warn(`Unknown AACPacketType: ${data[1]}`)\n }\n }\n\n _parseVideo (data, dts) {\n if (data.length < 6) return\n\n const frameType = (data[0] & 0xf0) >>> 4\n const codecId = data[0] & 0x0f\n\n const track = this.videoTrack\n\n if (\n codecId !== 7 && // AVC\n codecId !== 12 // HEVC\n ) {\n track.reset()\n logger.warn(`Unsupported codecId: ${codecId}`)\n return\n }\n\n const isHevc = codecId === 12\n track.codecType = isHevc ? VideoCodecType.HEVC : VideoCodecType.AVC\n\n const packetType = data[1]\n const cts = (((data[2] << 16) | (data[3] << 8) | (data[4])) << 8) >> 8\n\n if (packetType === 0) { // DecoderConfigurationRecord\n const configData = data.subarray(5)\n const ret = isHevc\n ? HEVC.parseHEVCDecoderConfigurationRecord(configData)\n : AVC.parseAVCDecoderConfigurationRecord(configData)\n if (ret) {\n const { hvcC, sps, ppsArr, spsArr, vpsArr, nalUnitSize } = ret\n if (hvcC) {\n track.hvcC = track.hvcC || hvcC\n }\n if (sps) {\n track.codec = sps.codec\n track.width = sps.width\n track.height = sps.height\n track.sarRatio = sps.sarRatio\n track.fpsNum = sps.fpsNum\n track.fpsDen = sps.fpsDen\n }\n if (spsArr.length) track.sps = spsArr\n if (ppsArr.length) track.pps = ppsArr\n if (vpsArr && vpsArr.length) track.vps = vpsArr\n if (nalUnitSize) track.nalUnitSize = nalUnitSize\n } else {\n logger.warn(`Cannot parse ${isHevc ? 'HEVC' : 'AVC'}DecoderConfigurationRecord`, data)\n }\n } else if (packetType === 1) { // One or more NALUs\n let units = NALu.parseAvcC(data.subarray(5), track.nalUnitSize)\n\n units = this._checkAddMetaNalToUnits(isHevc, units, track)\n\n if (units && units.length) {\n const sample = new VideoSample(dts + cts, dts, units)\n if (frameType === 1) {\n sample.setToKeyframe()\n }\n track.samples.push(sample)\n\n units.forEach(unit => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n dts + cts\n ))\n break\n default:\n }\n })\n\n if (sample.keyframe) {\n this._gopId++\n }\n sample.gopId = this._gopId\n } else {\n logger.warn('Cannot parse NALUs', data)\n }\n } else if (packetType === 2) {\n // AVC end of sequence, Empty\n } else {\n logger.warn(`Unknown AVCPacketType: ${packetType}`)\n }\n }\n\n _checkAddMetaNalToUnits (hevc, units, track) {\n if (!hevc || !this._needAddMetaBeforeKeyFrameNal) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n const nalTypes = units.map(x => (x[0] >>> 1) & 0x3f)\n\n if (nalTypes.includes(32)) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n units.unshift(track.pps[0])\n units.unshift(track.sps[0])\n units.unshift(track.vps[0])\n\n return units.filter(Boolean)\n }\n\n _parseScript (data, pts) {\n this.metadataTrack.flvScriptSamples.push(new FlvScriptSample(AMF.parse(data), pts))\n }\n}\n","import { AudioSample, WarningType } from '../model'\nimport { AAC } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 90000 / 2 // 500ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 90000 // 1s\nconst AUDIO_EXCETION_LOG_EMIT_DURATION = 5 * 90000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 90000 // 1s\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 90000 / 2 // 500ms\n\nexport class TsFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = false\n this._videoTimestampBreak = false\n\n this._lastAudioExceptionGapDot = 0\n this._lastAudioExceptionOverlapDot = 0\n this._lastAudioExceptionLargeGapDot = 0\n }\n\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 90000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n const vSamples = videoTrack.samples\n const aSamples = audioTrack.samples\n\n if (!vSamples.length && !aSamples.length) return\n\n const firstVideoSample = vSamples[0]\n const firstAudioSample = aSamples[0]\n\n // consider av delta\n let vaDelta = 0\n\n if (vSamples.length && aSamples.length) {\n vaDelta = firstVideoSample.dts - firstAudioSample.pts\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n }\n\n // recalc baseDts\n if (discontinuity) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n this._baseDts -= startTime\n }\n\n // id discontinue, recalc nextDts, consider av delta of firstframe\n if (!contiguous) {\n /**\n * segment.start = min(a, v)\n * segment.start\n * |\n * a\n * -- vaDelta --\n * v\n */\n this._videoNextDts = vaDelta > 0 ? startTime + vaDelta : startTime\n this._audioNextPts = vaDelta > 0 ? startTime : startTime - vaDelta\n\n const vDeltaToNextDts = firstVideoSample ? firstVideoSample.dts - this._baseDts - this._videoNextDts : 0\n const aDeltaToNextDts = firstAudioSample ? firstAudioSample.pts - this._baseDts - this._audioNextPts : 0\n\n if (Math.abs(vDeltaToNextDts || aDeltaToNextDts) > MAX_VIDEO_FRAME_DURATION) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n this._baseDts -= startTime\n }\n }\n\n this._resetBaseDtsWhenStreamBreaked()\n\n // fix audio first\n this._fixAudio(audioTrack)\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 90000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n })\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const nextSample = samples[1]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // resolve first frame first\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n\n // check to ajust the whole segment\n if (nextSample && Math.abs(nextSample.dts - firstSample.dts) > MAX_VIDEO_FRAME_DURATION) {\n this._videoTimestampBreak = true\n samples.forEach((x, i) => {\n if (i === 0) return\n x.dts += vDelta\n x.pts += vDelta\n })\n }\n }\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[len - 1]\n // 100ms default\n refSampleDurationInt = len === 1 ? 9000 : Math.floor((last.dts - first.dts) / (len - 1))\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (samples[i - 1]) {\n sampleDuration = Math.min(dts - samples[i - 1].dts, refSampleDurationInt)\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n // dts exception of adjacent frame\n this._videoTimestampBreak = true\n\n // check if only video breaked!\n sampleDuration = this._audioTimestampBreak ? refSampleDurationInt : Math.max(sampleDuration, 30 * 90) // 30ms\n\n // check if sample breaked within current fragment\n const expectFragEnd = (this._audioNextPts || 0)\n if (nextSample && nextSample.dts > expectFragEnd) {\n sampleDuration = refSampleDurationInt\n }\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n\n if (!samples.length) return\n samples.forEach(x => {\n x.pts -= this._baseDts\n x.dts = x.pts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 90000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n if (this._baseDtsInited && this._videoTimestampBreak && this._audioTimestampBreak) {\n /**\n * timestamp breaked\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n this._audioLastSample = null\n this._videoLastSample = null\n this._videoTimestampBreak = false\n this._audioTimestampBreak = false\n }\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n const refSampleDuration = audioTrack.sampleDuration\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n const nextPts = this._audioNextPts\n const sample = samples[i]\n const delta = sample.pts - nextPts\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = AAC.getSilentFrame(audioTrack.codec, audioTrack.channelCount) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n }\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(nextPts), silentFrame)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) >= MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak = true\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n sample.dts = sample.pts = nextPts\n this._audioNextPts += refSampleDuration\n }\n }\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\n\nconst logger = new Logger('TsDemuxer')\n\nexport class TsDemuxer {\n _pmtId = -1\n _remainingPacketData = null\n _videoPesData = []\n _audioPesData = []\n _gopId = 0\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {import('../flv').DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity) {\n this._pmtId = -1\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n }\n\n if (!contiguous || discontinuity) {\n this._remainingPacketData = null\n this._videoPesData = []\n this._audioPesData = []\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingPacketData) {\n data = concatUint8Array(this._remainingPacketData, data)\n this._remainingPacketData = null\n }\n }\n\n let dataLen = data.length\n const remainingLength = dataLen % 188\n if (remainingLength) {\n this._remainingPacketData = data.subarray(dataLen - remainingLength)\n dataLen -= remainingLength\n }\n\n let videoPid = videoTrack.pid\n let audioPid = audioTrack.pid\n\n for (let start = 0; start < dataLen; start += 188) {\n if (data[start] !== 0x47) throw new Error('TS packet did not start with 0x47')\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40)\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]\n const adaptationFiledControl = (data[start + 3] & 0x30) >> 4\n\n let offset\n if (adaptationFiledControl > 1) {\n offset = start + 5 + data[start + 4]\n if (offset === start + 188) continue\n } else {\n offset = start + 4\n }\n\n switch (pid) {\n case 0: // PAT\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n this._pmtId = ((data[offset + 10] & 0x1f) << 8) | data[offset + 11]\n break\n case this._pmtId: {\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n const tableEnd = offset + 3 + (((data[offset + 1] & 0x0f) << 8) | data[offset + 2]) - 4\n const programInfoLength = ((data[offset + 10] & 0x0f) << 8) | data[offset + 11]\n offset += 12 + programInfoLength\n\n while (offset < tableEnd) {\n const esPid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2]\n switch (data[offset]) {\n case 0x0f: // AAC ADTS\n audioTrack.pid = audioPid = esPid\n break\n case 0x1b: // AVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.AVC\n videoTrack.pid = videoPid = esPid\n break\n case 0x24: // HEVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.HEVC\n videoTrack.pid = videoPid = esPid\n break\n default:\n logger.warn(`Unsupported stream. type: ${data[offset]}, pid: ${esPid}`)\n }\n\n offset += (((data[offset + 3] & 0x0f) << 8) | data[offset + 4]) + 5\n }\n }\n break\n case videoPid:\n if (payloadUnitStartIndicator && this._videoPesData.length) {\n this._parseVideoData()\n }\n this._videoPesData.push(data.subarray(offset, start + 188))\n break\n case audioPid:\n if (payloadUnitStartIndicator && this._audioPesData.length) {\n this._parseAudioData()\n }\n this._audioPesData.push(data.subarray(offset, start + 188))\n break\n case 17:\n case 0x1fff:\n break\n default:\n logger.warn(`Unknown pid: ${pid}`)\n }\n }\n\n this._parseVideoData()\n this._parseAudioData()\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 90000\n\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (!data.length) return false\n return data[0] === 0x47 && data[188] === 0x47 && data[376] === 0x47\n }\n\n _parseVideoData () {\n if (!this._videoPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._videoPesData))\n if (!pes) {\n logger.warn('Cannot parse video pes', this._videoPesData)\n return\n }\n\n const units = NALu.parseAnnexB(pes.data)\n if (units) {\n this._createVideoSample(units, pes.pts, pes.dts)\n } else {\n logger.warn('Cannot parse avc units', pes)\n }\n\n this._videoPesData = []\n }\n\n _createVideoSample (units, pts, dts) {\n if (!units.length) return\n const track = this.videoTrack\n const isHevc = track.codecType === VideoCodecType.HEVC\n\n const sample = new VideoSample(pts, dts)\n units.forEach((unit) => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n this._gopId++\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n pts\n ))\n // fix 分割nal之前只要sei信息被当做单独一个sample\n return\n case 32: // HEVC VPS\n if (!isHevc) break\n if (!track.vps.length) {\n const hvcC = HEVC.parseVPS(NALu.removeEPB(unit), track.hvcC)\n track.hvcC = track.hvcC || hvcC\n track.vps = [unit]\n }\n break\n case 7: // SPS\n case 33: // HEVC SPS\n if ((!isHevc && type !== 7) || (isHevc && type === 7)) break\n if (!track.sps.length) {\n const data = NALu.removeEPB(unit)\n const spsInfo = isHevc ? HEVC.parseSPS(data, track.hvcC) : AVC.parseSPS(data)\n track.sps = [unit]\n track.hvcC = track.hvcC || spsInfo.hvcC\n track.codec = spsInfo.codec\n track.width = spsInfo.width\n track.height = spsInfo.height\n track.sarRatio = spsInfo.sarRatio\n track.fpsNum = spsInfo.fpsNum\n track.fpsDen = spsInfo.fpsDen\n }\n break\n case 8: // PPS\n case 34: // HEVC PPS\n if ((!isHevc && type !== 8) || (isHevc && type === 8)) break\n if (!track.pps.length) track.pps = [unit]\n break\n case 9: // AUD\n case 35: // HEVC AUD\n // if ((!isHevc && type !== 9) || (isHevc && type === 9)) break\n // sample.gopId = this._gopId\n // if (sample.units.length && !keyFrame) {\n // this._pushVideoSample(track, sample)\n // sample = this.prevAvcSample = new VideoSample(pts, dts)\n // }\n break\n default:\n }\n sample.units.push(unit)\n })\n sample.gopId = this._gopId\n this._pushVideoSample(track, sample)\n }\n\n _pushVideoSample (track, sample) {\n if (sample.units.length) {\n if (sample.pts === null || sample.pts === undefined) {\n logger.warn('Video sample no pts', sample)\n const lastSample = track.samples[track.samples.length - 1]\n if (lastSample) {\n sample.pts = lastSample.pts\n sample.dts = lastSample.dts\n } else {\n logger.warn('Drop video sample', sample)\n }\n } else {\n track.samples.push(sample)\n }\n }\n }\n\n _parseAudioData () {\n if (!this._audioPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._audioPesData))\n if (!pes) {\n logger.warn('Cannot parse audio pes', this._audioPesData)\n return\n }\n\n this._parseAacData(pes)\n\n this._audioPesData = []\n }\n\n _parseAacData (pes) {\n const track = this.audioTrack\n let pts = pes.pts\n if (pts === null || pts === undefined) {\n logger.warn('AAC pes not pts', track)\n if (!track.samples.length || !track.sampleRate) {\n return\n }\n pts = track.samples[track.samples.length - 1].pts + AAC.getFrameDuration(track.sampleRate)\n }\n\n const ret = AAC.parseADTS(pes.data, pts)\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n track.config = ret.config\n track.samples.push(...ret.frames.map((s) => new AudioSample(s.pts, s.data)))\n\n if (ret.skip) {\n logger.warn(`Skip aac adts ${ret.skip} bits`)\n }\n if (ret.remaining) {\n logger.warn(`Remaining aac adts ${ret.remaining} bits`)\n }\n } else {\n logger.warn('Cannot parse aac adts', pes)\n }\n }\n\n static _parsePES (data) {\n const headerDataLen = data[8]\n if (headerDataLen === null || headerDataLen === undefined || data.length < (headerDataLen + 9)) return\n const startPrefix = data[0] << 16 | data[1] << 8 | data[2]\n if (startPrefix !== 1) return\n const pesLen = (data[4] << 8) + data[5]\n if (pesLen && pesLen > data.length - 6) return\n\n let pts\n let dts\n const ptsDtsFlags = data[7]\n if (ptsDtsFlags & 0xc0) {\n pts = (data[9] & 0x0e) * 536870912 +\n (data[10] & 0xff) * 4194304 +\n (data[11] & 0xfe) * 16384 +\n (data[12] & 0xff) * 128 +\n (data[13] & 0xfe) / 2\n\n if (ptsDtsFlags & 0x40) {\n dts = (data[14] & 0x0e) * 536870912 +\n (data[15] & 0xff) * 4194304 +\n (data[16] & 0xfe) * 16384 +\n (data[17] & 0xff) * 128 +\n (data[18] & 0xfe) / 2\n if (pts - dts > 60 * 90000) pts = dts\n } else {\n dts = pts\n }\n }\n\n return { data: data.subarray(9 + headerDataLen), pts, dts }\n }\n}\n","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64 } from '../utils'\nimport { AAC } from '../codec'\nexport class MP4Parser {\n static findBox (data, names, start = 0) {\n const ret = []\n if (!data) return ret\n\n let size = 0\n let type = ''\n let headerSize = 0\n while (data.length > 7) {\n size = readBig32(data)\n type = String.fromCharCode.apply(null, data.subarray(4, 8))\n headerSize = 8\n if (size === 1) {\n size = readBig64(data, 8)\n headerSize += 8\n } else if (!size) {\n size = data.length\n }\n if (!names[0] || type === names[0]) {\n const subData = data.subarray(0, size)\n if (names.length < 2) {\n ret.push({\n start,\n size,\n headerSize,\n type,\n data: subData\n })\n } else {\n return MP4Parser.findBox(subData.subarray(headerSize), names.slice(1), start + headerSize)\n }\n }\n\n start += size\n data = data.subarray(size)\n }\n\n return ret\n }\n\n static tfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.trackId = readBig32(data)\n let start = 4\n const baseDataOffsetPresent = (ret.flags & 0xff) & 0x01\n const sampleDescriptionIndexPresent = (ret.flags & 0xff) & 0x02\n const defaultSampleDurationPresent = (ret.flags & 0xff) & 0x08\n const defaultSampleSizePresent = (ret.flags & 0xff) & 0x10\n const defaultSampleFlagsPresent = (ret.flags & 0xff) & 0x20\n\n if (baseDataOffsetPresent) {\n start += 4 // truncate top 4 bytes\n ret.baseDataOffset = readBig32(data, start)\n start += 4\n }\n if (sampleDescriptionIndexPresent) {\n ret.sampleDescriptionIndex = readBig32(data, start)\n start += 4\n }\n if (defaultSampleDurationPresent) {\n ret.defaultSampleDuration = readBig32(data, start)\n start += 4\n }\n if (defaultSampleSizePresent) {\n ret.defaultSampleSize = readBig32(data, start)\n start += 4\n }\n if (defaultSampleFlagsPresent) {\n ret.defaultSampleFlags = readBig32(data, start)\n }\n })\n }\n\n static sidx (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n ret.reference_ID = readBig32(data, start)// stream.readUint32();\n start += 4\n ret.timescale = readBig32(data, start)\n start += 4\n if (ret.version === 0) {\n ret.earliest_presentation_time = readBig32(data, start)\n start += 4\n ret.first_offset = readBig32(data, start)\n start += 4\n } else {\n ret.earliest_presentation_time = readBig64(data, start)\n start += 8\n ret.first_offset = readBig64(data, start)\n start += 8\n }\n start += 2\n ret.references = []\n const count = readBig16(data, start)\n start += 2\n for (let i = 0; i < count; i++) {\n const ref = {}\n ret.references.push(ref)\n let tmp32 = readBig32(data, start)\n start += 4\n ref.reference_type = (tmp32 >> 31) & 0x1\n ref.referenced_size = tmp32 & 0x7FFFFFFF\n ref.subsegment_duration = readBig32(data, start)\n start += 4\n tmp32 = readBig32(data, start)\n start += 4\n ref.starts_with_SAP = (tmp32 >> 31) & 0x1\n ref.SAP_type = (tmp32 >> 28) & 0x7\n ref.SAP_delta_time = tmp32 & 0xFFFFFFF\n }\n })\n }\n\n static moov (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mvhd = MP4Parser.mvhd(MP4Parser.findBox(data, ['mvhd'], start)[0])\n ret.trak = MP4Parser.findBox(data, ['trak'], start).map(trak => MP4Parser.trak(trak))\n ret.pssh = MP4Parser.pssh(MP4Parser.findBox(data, ['pssh'], start)[0])\n })\n }\n\n static mvhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n ret.nextTrackId = readBig32(data, start + 76)\n })\n }\n\n static trak (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tkhd = MP4Parser.tkhd(MP4Parser.findBox(data, ['tkhd'], start)[0])\n ret.mdia = MP4Parser.mdia(MP4Parser.findBox(data, ['mdia'], start)[0])\n })\n }\n\n static tkhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.trackId = readBig32(data, 16)\n ret.duration = readBig64(data, 24)\n start += 32\n } else {\n ret.trackId = readBig32(data, 8)\n ret.duration = readBig32(data, 16)\n start += 20\n }\n ret.width = readBig32(data, start + 52)\n ret.height = readBig32(data, start + 56)\n })\n }\n\n static mdia (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mdhd = MP4Parser.mdhd(MP4Parser.findBox(data, ['mdhd'], start)[0])\n ret.hdlr = MP4Parser.hdlr(MP4Parser.findBox(data, ['hdlr'], start)[0])\n ret.minf = MP4Parser.minf(MP4Parser.findBox(data, ['minf'], start)[0])\n })\n }\n\n static mdhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n const lang = readBig16(data, start)\n ret.language = String.fromCharCode(((lang >> 10) & 0x1F) + 0x60, ((lang >> 5) & 0x1F) + 0x60, (lang & 0x1F) + 0x60)\n })\n }\n\n static hdlr (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 0) {\n ret.handlerType = String.fromCharCode.apply(null, data.subarray(4, 8))\n }\n })\n }\n\n static minf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.vmhd = MP4Parser.vmhd(MP4Parser.findBox(data, ['vmhd'], start)[0])\n ret.smhd = MP4Parser.smhd(MP4Parser.findBox(data, ['smhd'], start)[0])\n ret.stbl = MP4Parser.stbl(MP4Parser.findBox(data, ['stbl'], start)[0])\n })\n }\n\n static vmhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.graphicsmode = readBig16(data)\n ret.opcolor = [readBig16(data, 2), readBig16(data, 4), readBig16(data, 6)]\n })\n }\n\n static smhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.balance = readBig16(data)\n })\n }\n\n static stbl (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.stsd = MP4Parser.stsd(MP4Parser.findBox(data, ['stsd'], start)[0])\n ret.stts = MP4Parser.stts(MP4Parser.findBox(data, ['stts'], start)[0])\n ret.ctts = MP4Parser.ctts(MP4Parser.findBox(data, ['ctts'], start)[0])\n ret.stsc = MP4Parser.stsc(MP4Parser.findBox(data, ['stsc'], start)[0])\n ret.stsz = MP4Parser.stsz(MP4Parser.findBox(data, ['stsz'], start)[0])\n ret.stco = MP4Parser.stco(MP4Parser.findBox(data, ['stco'], start)[0])\n if (!ret.stco) {\n ret.co64 = MP4Parser.co64(MP4Parser.findBox(data, ['co64'], start)[0])\n ret.stco = ret.co64\n }\n const default_IV_size = ret.stsd.entries[0]?.sinf?.schi?.tenc.default_IV_size\n ret.stss = MP4Parser.stss(MP4Parser.findBox(data, ['stss'], start)[0])\n ret.senc = MP4Parser.senc(MP4Parser.findBox(data, ['senc'], start)[0], default_IV_size)\n })\n }\n\n static senc (box, iv = 8) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n const sampleCount = readBig32(data, start)\n start += 4\n ret.samples = []\n for (let i = 0; i < sampleCount; i++) {\n const sample = {}\n sample.InitializationVector = []\n for (let j = 0; j < iv; j++){\n sample.InitializationVector[j] = data[start + j]\n }\n start += iv\n if (ret.flags & 0x2) {\n sample.subsamples = []\n const subsampleCount = readBig16(data, start)\n start += 2\n for (let j = 0; j < subsampleCount; j++) {\n const subsample = {}\n subsample.BytesOfClearData = readBig16(data, start)\n start += 2\n subsample.BytesOfProtectedData = readBig32(data, start)\n start += 4\n sample.subsamples.push(subsample)\n }\n }\n ret.samples.push(sample)\n }\n })\n }\n\n static pssh (box) {\n return parseBox(box, true, (ret, data) => {\n const keyIds = []\n const systemId = []\n let start = 0\n for (let i = 0; i < 16; i++) {\n systemId.push(toHex(data[start + i]))\n }\n start += 16\n if (ret.version > 0) {\n const numKeyIds = readBig32(data, start)\n start += 4\n for (let i = 0; i < ('' + numKeyIds).length; i++) {\n for (let j = 0; j < 16; j++) {\n const keyId = data[start]\n start += 1\n keyIds.push(toHex(keyId))\n }\n }\n }\n const dataSize = readBig32(data, start)\n ret.data_size = dataSize\n start += 4\n ret.kid = keyIds\n ret.system_id = systemId\n ret.buffer = data\n })\n }\n\n static stsd (box) {\n return parseBox(box, true, (ret, data, start) => {\n ret.entryCount = readBig32(data)\n ret.entries = MP4Parser.findBox(data.subarray(4), [], start + 4).map(b => {\n switch (b.type) {\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4':\n return MP4Parser.avc1(b)\n case 'hvc1':\n case 'hev1':\n return MP4Parser.hvc1(b)\n case 'mp4a':\n return MP4Parser.mp4a(b)\n case 'alaw':\n case 'ulaw':\n return MP4Parser.alaw(b)\n case 'enca':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.channelCount = readBig16(data, 16)\n ret.samplesize = readBig16(data, 18)\n ret.sampleRate = (readBig32(data, 24) / (1 << 16))\n data = data.subarray(28)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data, ['esds'], start)[0])\n })\n case 'encv':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n data = data.subarray(78)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(data, ['avcC'], start)[0])\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(data, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(data, ['pasp'], start)[0])\n })\n default:\n }\n }).filter(Boolean)\n })\n }\n\n static tenc (box) {\n return parseBox(box, false, (ret, data) => {\n let start = 6\n ret.default_IsEncrypted = data[start]\n start += 1\n ret.default_IV_size = data[start]\n start += 1\n ret.default_KID = []\n for (let i = 0; i < 16; i++) {\n ret.default_KID.push(toHex(data[start]))\n start += 1\n }\n })\n }\n\n static schi (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tenc = MP4Parser.tenc(MP4Parser.findBox(data, ['tenc'], start)[0])\n })\n }\n\n static sinf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.schi = MP4Parser.schi(MP4Parser.findBox(data, ['schi'], start)[0])\n ret.frma = MP4Parser.frma(MP4Parser.findBox(data, ['frma'], start)[0])\n })\n }\n\n static frma (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data_format = ''\n for (let i = 0; i < 4; i++) {\n ret.data_format += String.fromCharCode(data[i])\n }\n })\n }\n\n static avc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(bodyData, ['avcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static avcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.configurationVersion = data[0]\n ret.AVCProfileIndication = data[1]\n ret.profileCompatibility = data[2]\n ret.AVCLevelIndication = data[3]\n ret.codec = getAvcCodec([data[1], data[2], data[3]])\n ret.lengthSizeMinusOne = data[4] & 0x3\n ret.spsLength = data[5] & 0x1F\n ret.sps = []\n let start = 6\n for (let i = 0; i < ret.spsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.sps.push(data.subarray(start, start + size))\n // ret.spsInfo = SpsParser.parseSPS(ret.sps[i])\n // ret.pixelRatio = ret.spsInfo.par_ratio\n start += size\n }\n ret.ppsLength = data[start]\n start += 1\n ret.pps = []\n for (let i = 0; i < ret.ppsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.pps.push(data.subarray(start, start += size))\n start += size\n }\n })\n }\n\n static hvc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(bodyData, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static hvcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.codec = 'hev1.1.6.L93.B0'\n ret.configurationVersion = data[0]\n const tmp = data[1]\n ret.generalProfileSpace = tmp >> 6\n ret.generalTierFlag = (tmp & 0x20) >> 5\n ret.generalProfileIdc = tmp & 0x1F\n ret.generalProfileCompatibility = readBig32(data, 2)\n ret.generalConstraintIndicatorFlags = data.subarray(6, 12)\n ret.generalLevelIdc = data[12]\n ret.avgFrameRate = readBig16(data, 19)\n ret.numOfArrays = data[22]\n ret.vps = []\n ret.sps = []\n ret.pps = []\n let start = 23\n let type = 0\n let numNalus = 0\n let size = 0\n for (let i = 0; i < ret.numOfArrays; i++) {\n type = data[start] & 0x3F\n numNalus = readBig16(data, start + 1)\n start += 3\n const nalus = []\n for (let j = 0; j < numNalus; j++) {\n size = readBig16(data, start)\n start += 2\n nalus.push(data.subarray(start, start + size))\n start += size\n }\n\n if (type === 32) {\n ret.vps.push(...nalus)\n } else if (type === 33) {\n ret.sps.push(...nalus)\n } else if (type === 34) {\n ret.pps.push(...nalus)\n }\n }\n })\n }\n\n static pasp (box) {\n return parseBox(box, false, (ret, data) => {\n ret.hSpacing = readBig32(data)\n ret.vSpacing = readBig32(data, 4)\n })\n }\n\n static mp4a (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseAudioSampleEntry(ret, data)\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data.subarray(bodyStart), ['esds'], start + bodyStart)[0])\n })\n }\n\n static esds (box) {\n return parseBox(box, true, (ret, data) => {\n ret.codec = 'mp4a.'\n let start = 0\n let byteRead = 0\n let size = 0\n let tag = 0\n while (data.length) {\n start = 0\n tag = data[start]\n byteRead = data[start + 1]\n start += 2\n while (byteRead & 0x80) {\n size = (byteRead & 0x7F) << 7\n byteRead = data[start]\n start += 1\n }\n size += byteRead & 0x7F\n if (tag === 3) {\n data = data.subarray(start + 3)\n } else if (tag === 4) {\n ret.codec += (data[start].toString(16) + '.').padStart(3, '0')\n data = data.subarray(start + 13)\n } else if (tag === 5) {\n const config = ret.config = data.subarray(start, start + size)\n let objectType = (config[0] & 0xF8) >> 3\n if (objectType === 31 && config.length >= 2) {\n objectType = 32 + ((config[0] & 0x7) << 3) + ((config[1] & 0xE0) >> 5)\n }\n ret.objectType = objectType\n ret.codec += objectType.toString(16)\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n } else {\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n }\n }\n })\n }\n\n static alaw (box) {\n return parseBox(box, false, (ret, data) => {\n parseAudioSampleEntry(ret, data)\n })\n }\n\n static stts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n delta: readBig32(data, start + 4)\n })\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static ctts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n if (ret.version === 1) {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: readBig32(data, start + 4)\n })\n start += 8\n }\n } else {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: -(~readBig32(data, start + 4) + 1)\n })\n start += 8\n }\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsc (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n firstChunk: readBig32(data, start),\n samplesPerChunk: readBig32(data, start + 4),\n sampleDescriptionIndex: readBig32(data, start + 8)\n })\n start += 12\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsz (box) {\n return parseBox(box, true, (ret, data) => {\n const sampleSize = readBig32(data)\n const sampleCount = readBig32(data, 4)\n const entrySizes = []\n if (!sampleSize) {\n let start = 8\n for (let i = 0; i < sampleCount; i++) {\n entrySizes.push(readBig32(data, start))\n start += 4\n }\n }\n ret.sampleSize = sampleSize\n ret.sampleCount = sampleCount\n ret.entrySizes = entrySizes\n })\n }\n\n static stco (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static co64 (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig64(data, start))\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stss (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static moof (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mfhd = MP4Parser.mfhd(MP4Parser.findBox(data, ['mfhd'], start)[0])\n ret.traf = MP4Parser.findBox(data, ['traf'], start).map(t => MP4Parser.traf(t))\n })\n }\n\n static mfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.sequenceNumber = readBig32(data)\n })\n }\n\n static traf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tfhd = MP4Parser.tfhd(MP4Parser.findBox(data, ['tfhd'], start)[0])\n ret.tfdt = MP4Parser.tfdt(MP4Parser.findBox(data, ['tfdt'], start)[0])\n ret.trun = MP4Parser.trun(MP4Parser.findBox(data, ['trun'], start)[0])\n })\n }\n\n static trun (box) {\n return parseBox(box, true, (ret, data) => {\n const { version, flags } = ret\n const dataLen = data.length\n const sampleCount = ret.sampleCount = readBig32(data)\n let offset = 4\n if (dataLen > offset && flags & 1) {\n ret.dataOffset = -(~readBig32(data, offset) + 1)\n offset += 4\n }\n if (dataLen > offset && flags & 4) {\n ret.firstSampleFlags = readBig32(data, offset)\n offset += 4\n }\n ret.samples = []\n if (dataLen > offset) {\n let sample\n for (let i = 0; i < sampleCount; i++) {\n sample = {}\n if (flags & 0x100) {\n sample.duration = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x200) {\n sample.size = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x400) {\n sample.flags = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x800) {\n if (version) {\n sample.cts = -(~readBig32(data, offset + 4) + 1)\n } else {\n sample.cts = readBig32(data, offset)\n }\n offset += 4\n }\n ret.samples.push(sample)\n }\n }\n })\n }\n\n static tfdt (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 1) {\n ret.baseMediaDecodeTime = readBig64(data)\n } else {\n ret.baseMediaDecodeTime = readBig32(data)\n }\n })\n }\n\n static probe (data) {\n return !!MP4Parser.findBox(data, ['ftyp'])\n }\n\n static parseSampleFlags (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: (flags[2] << 8) | flags[3]\n }\n }\n\n static moovToTrack (moov, videoTrack, audioTrack) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (vTrack && videoTrack) {\n const v = videoTrack\n const _vTrackId = vTrack.tkhd?.trackId\n if (_vTrackId !== null && _vTrackId !== undefined) v.id = vTrack.tkhd.trackId\n v.tkhdDuration = vTrack.tkhd.duration\n v.mvhdDurtion = moov.mvhd.duration\n v.mvhdTimecale = moov.mvhd.timescale\n v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale\n v.duration = vTrack.mdia.mdhd.duration || (v.mvhdDurtion / v.mvhdTimecale * v.timescale)\n const e1 = vTrack.mdia.minf.stbl.stsd.entries[0]\n v.width = e1.width\n v.height = e1.height\n if (e1.pasp) {\n v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing]\n }\n if (e1.hvcC) {\n v.codecType = VideoCodecType.HEVC\n v.codec = e1.hvcC.codec\n v.vps = e1.hvcC.vps\n v.sps = e1.hvcC.sps\n v.pps = e1.hvcC.pps\n v.hvcC = e1.hvcC.data\n } else if (e1.avcC) {\n v.codec = e1.avcC.codec\n v.sps = e1.avcC.sps\n v.pps = e1.avcC.pps\n } else {\n throw new Error('unknown video stsd entry')\n }\n v.present = true\n v.ext = {}\n v.ext.stss = vTrack.mdia?.minf?.stbl?.stss\n v.ext.ctts = vTrack.mdia?.minf?.stbl?.ctts\n\n if (e1 && e1.type === 'encv') {\n v.isVideoEncryption = true\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n v.videoSenc = vTrack.mdia.minf.stbl.senc && vTrack.mdia.minf.stbl.senc.samples\n e1.data_format = e1.sinf?.frma?.data_format\n v.useEME = moov.useEME\n v.kidValue = moov.kidValue\n v.pssh = moov.pssh\n v.encv = e1\n }\n }\n\n if (aTrack && audioTrack) {\n const a = audioTrack\n const _aTrackId = aTrack.tkhd?.trackId\n if (_aTrackId !== null && _aTrackId !== undefined) a.id = aTrack.tkhd.trackId\n a.tkhdDuration = aTrack.tkhd.duration\n a.mvhdDurtion = moov.mvhd.duration\n a.mvhdTimecale = moov.mvhd.timescale\n a.timescale = a.formatTimescale = aTrack.mdia.mdhd.timescale\n a.duration = aTrack.mdia.mdhd.duration || (a.mvhdDurtion / a.mvhdTimecale * a.timescale)\n const e1 = aTrack.mdia.minf.stbl.stsd.entries[0]\n a.sampleSize = e1.sampleSize\n a.sampleRate = e1.sampleRate\n a.channelCount = e1.channelCount\n a.present = true\n\n switch (e1.type) {\n case 'alaw':\n a.codecType = a.codec = AudioCodecType.G711PCMA\n a.sampleRate = 8000\n break\n case 'ulaw':\n a.codecType = a.codec = AudioCodecType.G711PCMU\n a.sampleRate = 8000\n break\n default:\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) a.config = Array.from(e1.esds.config)\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n break\n }\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) {\n if (e1.esds.config) {\n a.config = Array.from(e1.esds.config)\n } else {\n console.warn('esds config is null')\n }\n }\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.ext = {}\n a.ext.stss = aTrack.mdia?.minf?.stbl?.stss\n a.ext.ctts = aTrack.mdia?.minf?.stbl?.ctts\n a.present = true\n if (e1 && e1.type === 'enca') {\n a.isAudioEncryption = true\n e1.data_format = e1.sinf?.frma?.data_format\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n a.audioSenc = aTrack.mdia.minf.stbl.senc && aTrack.mdia.minf.stbl.senc.samples\n a.useEME = moov.useEME\n a.kidValue = moov.kidValue\n a.enca = e1\n }\n }\n\n audioTrack && (audioTrack.isVideoEncryption = videoTrack ? videoTrack.isVideoEncryption : false)\n videoTrack && (videoTrack.isAudioEncryption = audioTrack ? audioTrack.isAudioEncryption : false)\n\n if (videoTrack?.encv || audioTrack?.enca) {\n const vkid = videoTrack?.encv?.default_KID\n const akid = audioTrack?.enca?.default_KID\n const kid = (vkid || akid) ? (vkid || akid).join('') : null\n videoTrack && (videoTrack.kid = kid)\n audioTrack && (audioTrack.kid = kid)\n }\n\n videoTrack && (videoTrack.flags = 0xf01)\n audioTrack && (audioTrack.flags = 0x701)\n\n return {\n videoTrack,\n audioTrack\n }\n }\n\n static evaluateDefaultDuration (videoTrack, audioTrack, videoSampleCount) {\n const audioSampleCount = audioTrack?.samples?.length\n\n // audio\n if (!audioSampleCount) return 1024\n\n const segmentDuration = 1024 * audioSampleCount / audioTrack.timescale\n\n return segmentDuration * videoTrack.timescale / videoSampleCount\n }\n\n static moofToSamples (moof, videoTrack, audioTrack) {\n const ret = {}\n\n if (moof.mfhd) {\n if (videoTrack) videoTrack.sequenceNumber = moof.mfhd.sequenceNumber\n if (audioTrack) audioTrack.sequenceNumber = moof.mfhd.sequenceNumber\n }\n\n moof.traf.forEach(({ tfhd, tfdt, trun }) => {\n if (!tfhd || !trun) return\n if (tfdt) {\n if (videoTrack && videoTrack.id === tfhd.trackId) videoTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n if (audioTrack && audioTrack.id === tfhd.trackId) audioTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n }\n const defaultSize = tfhd.defaultSampleSize || 0\n const defaultDuration = tfhd.defaultSampleDuration || MP4Parser.evaluateDefaultDuration(videoTrack, audioTrack, trun.samples.length || trun.sampleCount)\n let offset = trun.dataOffset || 0\n let dts = 0\n let gopId = -1\n if (!trun.samples.length && trun.sampleCount) {\n ret[tfhd.trackId] = []\n for (let i = 0; i < trun.sampleCount; i++) {\n ret[tfhd.trackId].push({\n offset,\n dts,\n duration: defaultDuration,\n size: defaultSize\n })\n dts += defaultDuration\n offset += defaultSize\n }\n } else {\n ret[tfhd.trackId] = trun.samples.map((s, index) => {\n s = {\n offset,\n dts,\n pts: dts + (s.cts || 0),\n duration: s.duration || defaultDuration,\n size: s.size || defaultSize,\n gopId,\n keyframe: index === 0 || ((s.flags !== null && s.flags !== undefined) && ((s.flags & 65536) >>> 0) !== 65536)\n }\n if (s.keyframe) {\n gopId++\n s.gopId = gopId\n }\n dts += s.duration\n offset += s.size\n return s\n })\n }\n })\n\n return ret\n }\n\n static moovToSamples (moov) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!vTrack && !aTrack) return\n let videoSamples\n let audioSamples\n if (vTrack) {\n const videoStbl = vTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!stts || !stsc || !stsz || !stco || !stss) return\n videoSamples = getSamples(stts, stsc, stsz, stco, ctts, stss)\n }\n if (aTrack) {\n const audioStbl = aTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = aTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSamples = getSamples(stts, stsc, stsz, stco)\n }\n\n return {\n videoSamples,\n audioSamples\n }\n }\n}\n\nfunction getSamples (stts, stsc, stsz, stco, ctts, stss) {\n const samples = []\n const cttsEntries = ctts?.entries\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n\n let sample\n let gopId = -1\n let dts = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n stts.entries.forEach(({ count, delta }) => {\n for (let i = 0; i < count; i++) {\n sample = {\n dts,\n duration: delta,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n sample.keyframe = keyframeMap[pos]\n if (sample.keyframe) {\n gopId++\n }\n sample.gopId = gopId\n }\n // sample.timeOffset = 0\n if (cttsArr && pos < cttsArr.length) {\n sample.pts = sample.dts + cttsArr[pos]\n // sample.timeOffset = cttsArr[pos]\n // if (pos === 0) {\n // sample.pts = sample.dts\n // sample.timeOffset = 0\n // }\n }\n samples.push(sample)\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += sample.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n return samples\n}\n\nfunction parseVisualSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n ret.frameCount = readBig16(data, 40)\n ret.depth = readBig16(data, 74)\n return 78\n}\n\nfunction parseAudioSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.channelCount = readBig16(data, 16)\n ret.sampleSize = readBig16(data, 18)\n ret.sampleRate = readBig32(data, 24) / (1 << 16)\n return 28\n}\n\nfunction parseBox (box, isFullBox, parse) {\n if (!box) return\n if (box.size !== box.data.length) throw new Error(`box ${box.type} size !== data.length`)\n const ret = {\n start: box.start,\n size: box.size,\n headerSize: box.headerSize,\n type: box.type\n }\n if (isFullBox) {\n ret.version = box.data[box.headerSize]\n ret.flags = readBig24(box.data, box.headerSize + 1)\n ret.headerSize += 4\n }\n parse(ret, box.data.subarray(ret.headerSize), ret.start + ret.headerSize)\n return ret\n}\n\nconst padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\nconst toHex = function (...value) {\n const hex = []\n value.forEach(item => {\n hex.push(padStart(Number(item).toString(16), 2, 0))\n })\n return hex[0]\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, VideoSample, AudioSample } from '../model'\nimport { readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\n\nexport class FMP4Demuxer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n }\n\n demux (videoData, audioData) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n videoTrack.samples = []\n audioTrack.samples = []\n\n if (audioData) {\n if (!audioExist) {\n const moovBox = MP4Parser.findBox(audioData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), null, audioTrack)\n }\n const moofBox = MP4Parser.findBox(audioData, ['moof'])[0]\n if (moofBox) {\n const samples = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), null, audioTrack)[audioTrack.id]\n const baseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n if (samples) {\n const baseOffset = moofBox.start\n samples.map(x => {\n x.offset += baseOffset\n const sampleData = audioData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + baseMediaDecodeTime, sampleData, x.duration))\n })\n }\n }\n }\n\n if (videoData) {\n if (!videoExist && !audioExist) {\n const moovBox = MP4Parser.findBox(videoData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), videoTrack, audioTrack)\n }\n const moofBox = MP4Parser.findBox(videoData, ['moof'])[0]\n if (moofBox) {\n const tracks = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), videoTrack, audioTrack)\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n const baseOffset = moofBox.start\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line eqeqeq\n if (videoTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n sample.data = sampleData\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n })\n }\n })\n }\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse /* hashVal */ } from '../utils'\nimport Buffer from './buffer'\n// import Crypto from './crypto/crypto'\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'avc1',\n 'avcC',\n 'hvc1',\n 'hvcC',\n 'dinf',\n 'dref',\n 'esds',\n 'ftyp',\n 'hdlr',\n 'mdat',\n 'mdhd',\n 'mdia',\n 'mfhd',\n 'minf',\n 'moof',\n 'moov',\n 'mp4a',\n 'mvex',\n 'mvhd',\n 'pasp',\n 'stbl',\n 'stco',\n 'stsc',\n 'stsd',\n 'stsz',\n 'stts',\n 'tfdt',\n 'tfhd',\n 'traf',\n 'trak',\n 'trex',\n 'tkhd',\n 'vmhd',\n 'smhd',\n 'ctts',\n 'stss',\n 'styp',\n 'pssh',\n 'sidx',\n 'sbgp',\n 'saiz',\n 'saio',\n 'senc',\n 'trun',\n 'encv',\n 'enca',\n 'sinf',\n 'btrt',\n 'frma',\n 'tenc',\n 'schm',\n 'schi',\n 'mehd',\n 'fiel',\n 'sdtp'\n ].reduce((p, c) => {\n p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)]\n return p\n }, Object.create(null));\n\n static HDLR_TYPES = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ])\n }\n\n static FTYPAVC1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 97, 118, 99, 49 // avc1\n ]))\n\n static FTYPHEV1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 104, 101, 118, 49 // hev1\n ]))\n\n static DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version\n 0x00, 0x00, 0x01 // entry_flags\n ])))\n\n static VMHD = MP4.box(MP4.types.vmhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // op color\n ]))\n\n static SMHD = MP4.box(MP4.types.smhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]))\n\n static StblTable = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ])\n\n static STTS = MP4.box(MP4.types.stts, MP4.StblTable)\n\n static STSC = MP4.box(MP4.types.stsc, MP4.StblTable)\n\n static STSZ = MP4.box(MP4.types.stsz, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]))\n\n static STCO = MP4.box(MP4.types.stco, MP4.StblTable)\n\n static box (type, ...payload) {\n payload = payload.filter(Boolean)\n const size = 8 + payload.reduce((p, c) => (p + c.byteLength), 0)\n const ret = new Uint8Array(size)\n ret[0] = (size >> 24) & 0xff\n ret[1] = (size >> 16) & 0xff\n ret[2] = (size >> 8) & 0xff\n ret[3] = size & 0xff\n ret.set(type, 4)\n let offset = 8\n payload.forEach((data) => {\n ret.set(data, offset)\n offset += data.byteLength\n })\n return ret\n }\n\n static ftyp (tracks) {\n const isHevc = tracks.find(t => t.type === TrackType.VIDEO && t.codecType === VideoCodecType.HEVC)\n return isHevc ? MP4.FTYPHEV1 : MP4.FTYPAVC1\n }\n\n static initSegment (tracks) {\n const ftyp = MP4.ftyp(tracks)\n // console.log('[remux],ftyp ,len ', ftyp.byteLength, hashVal(ftyp.toString()))\n const init = concatUint8Array(ftyp, MP4.moov(tracks))\n // console.log('[remux],init ,len ', init.byteLength, hashVal(init.toString()))\n return init\n }\n\n static pssh (data) {\n // const buffer = new Buffer()\n const content = new Uint8Array(\n [\n 0x01, 0x00, 0x00, 0x00 // version\n ].concat(\n [\n 0x10, 0x77, 0xef, 0xec,\n 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e,\n 0x52, 0xe2, 0xfb, 0x4b\n ],\n [0x00, 0x00, 0x00, 0x01],\n parse(data.kid),\n [0x00, 0x00, 0x00, 0x00]\n )\n )\n return MP4.box(MP4.types.pssh, content)\n }\n\n static moov (tracks) {\n if (tracks[0].useEME && (tracks[0].encv || tracks[0].enca)) {\n if (!tracks[0].pssh) {\n tracks[0].pssh = {\n kid: tracks[0].kid\n }\n }\n const pssh = this.pssh(tracks[0].pssh)\n // console.log('[remux],pssh,', hashVal(pssh.toString()))\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n MP4.mvex(tracks),\n ...tracks.map((t) => MP4.trak(t)),\n pssh)\n } else {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n ...tracks.map((t) => MP4.trak(t)),\n MP4.mvex(tracks)\n )\n }\n }\n\n static mvhd (duration, timescale = 90000) {\n const mvhd = MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x01, 0x00, 0x00, // rate\n 0x01, 0x00, // volume\n 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff // todo 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]))\n // console.log('[remux],mvhd, len,', mvhd.byteLength, hashVal(mvhd.toString()))\n return mvhd\n }\n\n static trak (track) {\n const trak = MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.tkhdDuration || 0, track.width, track.height),\n MP4.mdia(track)\n )\n // console.log('[remux],trak, len,', trak.byteLength, track.id, hashVal(trak.toString()))\n return trak\n }\n\n static tkhd (id, duration, width = 0, height = 0) {\n const tkhd = MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x07, // flags、todo 0x07\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time todo\n (id >> 24) & 0xff, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff,\n 0x00, 0x00, 0x00, 0x00,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // todo (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // /*0x00*/ alternate_group //todo type === 'video' ? 0x01 : 0x00(第二个位置)\n 0x01, 0x00, // /* 0x01 */, 0x00, // non-audio track volume //todo type === 'audio' ? 0x01 : 0x00(第一个位置)\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n (width >> 8) & 0xff, width & 0xff, 0x00, 0x00,\n (height >> 8) & 0xff, height & 0xff, 0x00, 0x00\n ]))\n // console.log('[remux],tkhd, len,', tkhd.byteLength, hashVal(tkhd.toString()))\n return tkhd\n }\n\n static mdia (track) {\n const mdia = MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minf(track))\n // console.log('[remux],mdia, len,', mdia.byteLength, hashVal(mdia.toString()))\n return mdia\n }\n\n static mdhd (duration, timescale = 90000) {\n const mdhd = MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // todo 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,//todo\n 0x55, 0xc4, // 'und' language (undetermined) //todo 0x15, 0xC7\n 0x00, 0x00 // pre_defined\n ]))\n // console.log('[remux],mdhd, len,', mdhd.byteLength, hashVal(mdhd.toString()))\n return mdhd\n }\n\n static hdlr (type) {\n const hdlr = MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type])\n // console.log('[remux],hdlr, len,', hdlr.byteLength, hashVal(hdlr.toString()))\n return hdlr\n }\n\n static minf (track) {\n const minf = MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stbl(track))\n // console.log('[remux],minf, len,', minf.byteLength, hashVal(minf.toString()))\n return minf\n }\n\n static stbl (track) {\n const extBox = []\n if (track && track.ext) {\n track.ext.stss && extBox.push(MP4.stss(track.ext.stss.entries))\n // track.ext.stss && extBox.push(MP4.ctts(track.ext.stss.entries))\n }\n const stbl = MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.STTS, extBox[0], MP4.STSC, MP4.STSZ, MP4.STCO)\n // console.log('[remux],stbl, len,', stbl.byteLength, hashVal(stbl.toString()))\n return stbl\n }\n\n static stsd (track) {\n let content\n if (track.type === 'audio') {\n if (track.useEME && track.enca) {\n content = MP4.enca(track)\n // console.log('[remux],enca, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.mp4a(track)\n // console.log('[remux],mp4a, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n } else if (track.useEME && track.encv) {\n content = MP4.encv(track)\n // console.log('[remux],encv, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.avc1hev1(track)\n // console.log('[remux],avc1hev1, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n const stsd = MP4.box(MP4.types.stsd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]), content)\n // console.log('[remux],stsd, len,', stsd.byteLength, hashVal(stsd.toString()))\n return stsd\n }\n\n static enca (data) {\n const channelCount = data.enca.channelCount\n const sampleRate = data.enca.sampleRate\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n (sampleRate >> 8) & 0xff,\n sampleRate & 0xff, //\n 0x00, 0x00\n ])\n const esds = MP4.esds(data.config)\n // console.log('[remux],esds, len,', esds.byteLength, hashVal(esds.toString()))\n const sinf = MP4.sinf(data.enca)\n // console.log('[remux],sinf, len,', sinf.byteLength, hashVal(sinf.toString()))\n return MP4.box(MP4.types.enca, content, esds, sinf)\n }\n\n static encv (track) {\n const sps = track.sps.length > 0 ? track.sps[0] : []\n const pps = track.pps.length > 0 ? track.pps[0] : []\n const width = track.width\n const height = track.height\n const hSpacing = track.sarRatio[0]\n const vSpacing = track.sarRatio[1]\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n\n 0x12,\n 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74,\n 0x69, 0x6F, 0x6E, 0x2F,\n 0x68, 0x6C, 0x73, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]) // pre_defined = -1;\n const avcc = new Uint8Array([\n 0x01, // version\n sps[1], // profile\n sps[2], // profile compatible\n sps[3], // level\n 0xfc | 3,\n 0xE0 | 1, // 目前只处理一个sps\n sps.length >>> 8 & 0xff,\n sps.length & 0xff\n ].concat(...sps).concat([\n 0x01,\n pps.length >>> 8 & 0xff,\n pps.length & 0xff\n ]).concat(...pps))\n const btrt = new Uint8Array([\n 0x00, 0x00, 0x58, 0x39,\n 0x00, 0x0F, 0xC8, 0xC0,\n 0x00, 0x04, 0x56, 0x48\n ])\n const sinf = MP4.sinf(track.encv)\n const pasp = new Uint8Array([\n (hSpacing >> 24), // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n (vSpacing >> 24), // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff\n ])\n return MP4.box(MP4.types.encv, content, MP4.box(MP4.types.avcC, avcc), MP4.box(MP4.types.btrt, btrt), sinf, MP4.box(MP4.types.pasp, pasp))\n }\n\n static schi (data) {\n const content = new Uint8Array([])\n const tenc = MP4.tenc(data)\n return MP4.box(MP4.types.schi, content, tenc)\n }\n\n static tenc (data) {\n // 用于每个track的加密参数(包括KID、初始化向量、加密标志位),包含在TrackEncryptionBox(‘tenc’)中。\n const content = new Uint8Array(\n [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // skip\n data.default_IsEncrypted & 0xff, // default_isProtected\n data.default_IV_size & 0xff // default_Per_Sample_IV_Size\n ].concat(parse(data.default_KID)))\n return MP4.box(MP4.types.tenc, content)\n }\n\n static sinf (data) {\n const content = new Uint8Array([])\n const frma = new Uint8Array([\n data.data_format.charCodeAt(0),\n data.data_format.charCodeAt(1),\n data.data_format.charCodeAt(2),\n data.data_format.charCodeAt(3)\n ])\n const schm = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x63, 0x65, 0x6E, 0x63, // cenc\n 0x00, 0x01, 0x00, 0x00 // version\n ])\n const schi = MP4.schi(data)\n return MP4.box(MP4.types.sinf, content, MP4.box(MP4.types.frma, frma), MP4.box(MP4.types.schm, schm), schi)\n }\n\n static avc1hev1 (track) {\n const isHevc = track.codecType === VideoCodecType.HEVC\n const typ = isHevc ? MP4.types.hvc1 : MP4.types.avc1\n const config = isHevc ? MP4.hvcC(track) : MP4.avcC(track)\n const boxes = [\n new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), config\n ]\n // console.log('[remux],avc1hev1_0, len,', boxes[0].byteLength, hashVal(boxes[0].toString()))\n // console.log('[remux],avc1hev1_1, len,', boxes[1].byteLength, hashVal(boxes[1].toString()))\n if (isHevc) {\n boxes.push(MP4.box(MP4.types.fiel, new Uint8Array([0x01, 0x00])))\n // console.log('[remux],fiel, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n } else if (track.sarRatio && track.sarRatio.length > 1) {\n boxes.push(MP4.pasp(track.sarRatio))\n // console.log('[remux],pasp, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n }\n return MP4.box(typ, ...boxes)\n }\n\n static avcC (track) {\n const sps = []\n const pps = []\n\n let len\n track.sps.forEach((s) => {\n len = s.byteLength\n sps.push((len >>> 8) & 0xff)\n sps.push(len & 0xff)\n sps.push(...s)\n })\n\n track.pps.forEach((p) => {\n len = p.byteLength\n pps.push((len >>> 8) & 0xff)\n pps.push(len & 0xff)\n pps.push(...p)\n })\n\n return MP4.box(MP4.types.avcC, new Uint8Array([\n 0x01, // configurationVersion\n sps[3], // AVCProfileIndication\n sps[4], // profile_compatibility\n sps[5], // AVCLevelIndication\n 0xfc | 3, // lengthSizeMinusOne\n 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(...sps)\n .concat([track.pps.length]) // numOfPictureParameterSets\n .concat(...pps)))\n }\n\n static hvcC (track) {\n const hvcC = track.hvcC\n if (hvcC instanceof ArrayBuffer || hvcC instanceof Uint8Array) return hvcC\n const { vps, sps, pps } = track\n let data\n if (hvcC) {\n const pcf = hvcC.generalProfileCompatibilityFlags\n const cif = hvcC.generalConstraintIndicatorFlags\n const numOfArrays = (vps.length && 1) + (sps.length && 1) + (pps.length && 1)\n data = [\n 0x01, // configurationVersion\n hvcC.generalProfileSpace << 6 | hvcC.generalTierFlag << 5 | hvcC.generalProfileIdc,\n pcf >>> 24, pcf >>> 16, pcf >>> 8, pcf,\n cif[0], cif[1], cif[2], cif[3], cif[4], cif[5],\n hvcC.generalLevelIdc,\n 0xF0, 0x00, // min_spatial_segmentation_idc\n 0xFC, // parallelismType\n hvcC.chromaFormatIdc | 0xFC,\n hvcC.bitDepthLumaMinus8 | 0xF8,\n hvcC.bitDepthChromaMinus8 | 0xF8,\n 0x00, 0x00, // avgFrameRate\n hvcC.numTemporalLayers << 3 | hvcC.temporalIdNested << 2 | 3,\n numOfArrays\n ]\n const write = (x) => {\n data.push(x.length >> 8, x.length)\n data.push(...x)\n }\n if (vps.length) {\n data.push(0xA0, 0x00, vps.length)\n vps.forEach(write)\n }\n if (sps.length) {\n data.push(0xA1, 0x00, sps.length)\n sps.forEach(write)\n }\n if (pps.length) {\n data.push(0xA2, 0x00, pps.length)\n pps.forEach(write)\n }\n } else {\n data = [\n 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02,\n 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,\n 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40\n ]\n }\n return MP4.box(MP4.types.hvcC, new Uint8Array(data))\n }\n\n static pasp ([hSpacing, vSpacing]) {\n return MP4.box(MP4.types.pasp, new Uint8Array([\n hSpacing >> 24, (hSpacing >> 16) & 0xff, (hSpacing >> 8) & 0xff, hSpacing & 0xff,\n vSpacing >> 24, (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff\n ]))\n }\n\n static mp4a (track) {\n return MP4.box(MP4.types.mp4a, new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, track.channelCount,\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff, track.sampleRate & 0xff,\n 0x00, 0x00\n ]), track.config.length ? MP4.esds(track.config) : undefined)\n }\n\n static esds (config) {\n const len = config.length\n const esds = MP4.box(MP4.types.esds, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x03, // tag\n 0x17 + len, // length\n 0x00, 0x00, // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n 0x04, // tag\n 0x0f + len, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x06, 0x00, // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0, // maxBitrate\n 0x00, 0x00, 0xda, 0xc0, // avgBitrate\n 0x05 // tag, DecoderSpecificInfoTag\n ].concat([len])\n .concat(config)\n .concat(\n [0x06, 0x01, 0x02]// GASpecificConfig\n )\n ))\n // console.log('[remux],esds ,len ', esds.byteLength, hashVal(esds.toString()))\n return esds\n }\n\n static mvex (tracks) {\n // const mehd = MP4.box(MP4.types.mehd, this.extension(0, 0), Buffer.writeUint32(tracks[0].tkhdDuration))\n // const mvex = MP4.box(MP4.types.mvex, mehd, MP4.trex1(1), MP4.trex2(2))\n // // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n // const mvex = MP4.box(MP4.types.mvex, MP4.trex1(1), MP4.trex2(2))\n const mvex = MP4.box(MP4.types.mvex, ...tracks.map((t) => MP4.trex(t.id)))\n // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n return mvex\n }\n\n static trex (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex1 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x02, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex2 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x04, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x02, 0x00, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static moof (tracks) {\n const moof = MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].samples ? tracks[0].samples[0].gopId : 0), ...tracks.map((t) => MP4.traf(t)))\n // console.log('[remux],moof, len', moof.byteLength)\n return moof\n // return MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].gopId), ...tracks.map((t) => MP4.traf(t)))\n }\n\n static mfhd (sequenceNumber) {\n // sequenceNumber += 1\n const mfhd = MP4.box(MP4.types.mfhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n sequenceNumber >> 24, (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff\n ]))\n // console.log('[remux],mfhd, len,', mfhd.byteLength, hashVal(mfhd.toString()))\n return mfhd\n }\n\n static traf (track) {\n const tfhd = MP4.tfhd(track.id)\n // console.log('[remux],tfhd, len,', tfhd.byteLength, hashVal(tfhd.toString()), ', trackid = ', track.id)\n // console.log('[remux],tfdt,baseMediaDecodeTime,', track.baseMediaDecodeTime)\n const tfdt = MP4.tfdt(track, track.baseMediaDecodeTime)\n let sencLength = 0\n let samples\n if (track.isVideo && track.videoSenc) {\n samples = track.videoSenc\n samples.forEach(function (item) {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n track.videoSencLength = sencLength\n // console.log('[remux],tfdt, len,', tfdt.toString().length)\n // console.log('[remux],tfdt, len,', tfdt.byteLength, hashVal(tfdt.toString()))\n if (!track.useEME || (!track.isVideoEncryption && !track.isAudioEncryption)) {\n const sdtp = MP4.sdtp(track)\n // console.log('[remux],sdtp, len,', sdtp.byteLength, hashVal(sdtp.toString()))\n const offset = 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8 // mdat header\n return MP4.box(MP4.types.traf, tfhd, tfdt, sdtp, MP4.trun(track.samples, sdtp.byteLength + offset))\n } else if (track.isVideoEncryption) {\n if (track.isVideo) {\n // 加密视频\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const trun = MP4.trun1(track)\n const senc = MP4.senc(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, saiz, saio, trun, senc)\n // console.log('[remux],trex_video, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n } else {\n // 视频加密,音频加密和未加密处理\n if (!track.isAudioEncryption) {\n // 音频未加密\n const sbgp = MP4.sbgp()\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, trun)\n } else {\n // 音频加密\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex_audio, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n } else {\n // 视频未加密,音频加密\n if (track.isVideo) {\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun)\n } else {\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n }\n\n static sdtp (data) {\n const buffer = new Buffer()\n data.samples.forEach(item => {\n buffer.write(new Uint8Array(data.isVideo ? [item.keyframe ? 32 : 16] : [16]))\n })\n return MP4.box(MP4.types.sdtp, this.extension(0, 0), buffer.buffer)\n }\n\n static trun1 (data) {\n // const id = data.id\n // const ceil = id === 1 ? 12 : 4\n const buffer = new Buffer()\n const sampleCount = Buffer.writeUint32(data.samples.length)\n let offset = null\n if (data.isVideo) {\n const sencLength = data.videoSencLength\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 17 + //saiz\n 24 + //saio\n data.samples.length*16\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 12(header) + sencLength //senc\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n = 149+data.samples.length * 16 + sencLength\n */\n offset = Buffer.writeUint32(data.samples.length * 16 + sencLength + 149)\n if (!data.isVideoEncryption && data.isAudioEncryption) {\n offset = Buffer.writeUint32(data.samples.length * 16 + 92)\n }\n } else {\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 28 + //sbgp\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n */\n let len = data.samples.length * 12 + 124\n if (data.isAudioEncryption) {\n len = data.samples.length * 12 + 8 * data.audioSenc.length + 177\n }\n offset = Buffer.writeUint32(len)\n }\n\n data.samples.forEach(item => {\n buffer.write(Buffer.writeUint32(item.duration))\n buffer.write(Buffer.writeUint32(item.size))\n buffer.write(Buffer.writeUint32(item.keyframe ? 0x02000000 : 0x00010000))\n if (data.isVideo) {\n buffer.write(Buffer.writeUint32(item.cts ? item.cts : 0))\n }\n })\n\n return MP4.box(MP4.types.trun, this.extension(0, data.flags), sampleCount, offset, buffer.buffer)\n }\n\n static senc (data) {\n const buffer = new Buffer()\n const len = data.samples.length\n const ceil = data.isVideo ? 16 : 8\n const flag = data.isVideo ? 2 : 0\n let samples = []\n let samplesLength = 0\n if (data.isVideo) {\n samples = data.videoSenc\n samplesLength = data.videoSencLength\n } else {\n samples = data.audioSenc\n }\n samplesLength = samplesLength || ceil * len\n buffer.write(\n Buffer.writeUint32(16 + samplesLength), MP4.types.senc, this.extension(0, flag)\n )\n buffer.write(Buffer.writeUint32(len))\n samples.forEach(item => {\n for (let i = 0; i < item.InitializationVector.length; i++) {\n buffer.write(new Uint8Array([item.InitializationVector[i]]))\n }\n if (item.subsamples && item.subsamples.length) {\n buffer.write(Buffer.writeUint16(item.subsamples.length))\n item.subsamples.forEach(value => {\n buffer.write(Buffer.writeUint16(value.BytesOfClearData))\n buffer.write(Buffer.writeUint32(value.BytesOfProtectedData))\n })\n }\n })\n return buffer.buffer\n // return MP4.box(MP4.types.senc, this.extension(0, flag), buffer.buffer)\n }\n\n static saio (data) {\n let length = data.samples.length * 12 + 141\n if (!data.isVideo && data.isAudioEncryption) {\n length = 149\n }\n const content = new Uint8Array([\n 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00,\n (length >> 24) & 0xff,\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff\n ])\n return MP4.box(MP4.types.saio, content)\n }\n\n static saiz (data) {\n const samplesLength = data.samples.length\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x10, // default sample info size\n (samplesLength >> 24) & 0xff,\n (samplesLength >> 16) & 0xff,\n (samplesLength >> 8) & 0xff,\n samplesLength & 0xff\n ])\n return MP4.box(MP4.types.saiz, content)\n }\n\n static sbgp () {\n const content = new Uint8Array([\n 0x72, 0x6F, 0x6C, 0x6C, // sgpd, grouping_type\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x01, 0x19,\n 0x00, 0x00, 0x00, 0x01\n ])\n return MP4.box(MP4.types.sbgp, this.extension(0, 0), content)\n }\n\n static extension (version, flag) {\n return new Uint8Array([\n version,\n (flag >> 16) & 0xff,\n (flag >> 8) & 0xff,\n flag & 0xff\n ])\n }\n\n static tfhd (id) {\n return MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags todo 0x00\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff // track_ID\n ]))\n }\n\n static tfdt (data, baseMediaDecodeTime) {\n const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1))\n const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1))\n if (data.useEME && (data.isVideoEncryption || data.isAudioEncryption)) {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n } else {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n }\n }\n\n static trun (samples, offset) {\n const sampleLen = samples.length\n const dataLen = 12 + (16 * sampleLen)\n offset += 8 + dataLen\n const data = new Uint8Array(dataLen)\n data.set([\n 0x00, // version\n 0x00, 0x0f, 0x01, // flags\n (sampleLen >>> 24) & 0xff, (sampleLen >>> 16) & 0xff, (sampleLen >>> 8) & 0xff, sampleLen & 0xff,\n (offset >>> 24) & 0xff, (offset >>> 16) & 0xff, (offset >>> 8) & 0xff, offset & 0xff // data_offset\n ], 0)\n for (let i = 0; i < sampleLen; i++) {\n const {\n duration, size, flag = {}, cts = 0\n } = samples[i]\n data.set([\n (duration >>> 24) & 0xff, (duration >>> 16) & 0xff, (duration >>> 8) & 0xff, duration & 0xff,\n (size >>> 24) & 0xff, (size >>> 16) & 0xff, (size >>> 8) & 0xff, size & 0xff,\n (flag.isLeading << 2) | (flag.dependsOn === null || flag.dependsOn === undefined ? 1 : flag.dependsOn),\n (flag.isDependedOn << 6) | (flag.hasRedundancy << 4) | (flag.paddingValue << 1) | (flag.isNonSyncSample === null || flag.isNonSyncSample === undefined ? 1 : flag.isNonSyncSample),\n flag.degradationPriority & (0xf0 << 8), flag.degradationPriority & 0x0f, // sample_flags\n (cts >>> 24) & 0xff, (cts >>> 16) & 0xff, (cts >>> 8) & 0xff, cts & 0xff // sample_composition_time_offset\n ], 12 + 16 * i)\n }\n\n return MP4.box(MP4.types.trun, data)\n }\n\n static moovMP4 (tracks) {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].duration, tracks[0].timescale),\n ...tracks.map((t) => MP4.trackMP4(t)))\n }\n\n static trackMP4 (track) {\n return MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.duration, track.width, track.height),\n MP4.mdiaMP4(track)\n )\n }\n\n static mdiaMP4 (track) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minfMP4(track))\n }\n\n static minfMP4 (track) {\n return MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stblMP4(track))\n }\n\n static stblMP4 (track) {\n const { ext } = track\n const boxes = [\n MP4.stsd(track),\n MP4.stts(ext.stts),\n MP4.stsc(ext.stsc),\n MP4.stsz(ext.stsz),\n MP4.stco(ext.stco)\n ]\n\n if (ext.stss.length) {\n boxes.push(MP4.stss(ext.stss))\n }\n\n if (ext.ctts.length) {\n boxes.push(MP4.ctts(ext.ctts))\n }\n\n return MP4.box(MP4.types.stbl, ...boxes)\n }\n\n static stts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n\n return MP4.box(MP4.types.stts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsc (entries) {\n const len = entries.length\n const data = new Uint8Array(12 * len)\n let offset = 0\n entries.forEach(({ firstChunk, samplesPerChunk, sampleDescIndex }) => {\n data.set([\n firstChunk >> 24, (firstChunk >> 16) & 0xff, (firstChunk >> 8) & 0xff, firstChunk & 0xff,\n samplesPerChunk >> 24, (samplesPerChunk >> 16) & 0xff, (samplesPerChunk >> 8) & 0xff, samplesPerChunk & 0xff,\n sampleDescIndex >> 24, (sampleDescIndex >> 16) & 0xff, (sampleDescIndex >> 8) & 0xff, sampleDescIndex & 0xff\n ], offset)\n offset += 12\n })\n return MP4.box(MP4.types.stsc, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsz (samplesSizes) {\n const len = samplesSizes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n samplesSizes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stsz, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stco (offsets) {\n const len = offsets.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n offsets.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stco, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stss (keyframeIndexes) {\n const len = keyframeIndexes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n keyframeIndexes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stss, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static ctts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n return MP4.box(MP4.types.ctts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static styp () {\n return MP4.box(MP4.types.styp, new Uint8Array([\n 0x6D, 0x73, 0x64, 0x68,\n 0x00, 0x00, 0x00, 0x00,\n 0x6D, 0x73, 0x64, 0x68,\n 0x6D, 0x73, 0x69, 0x78\n ]))\n }\n\n // data.sampleOffset 指的是samples的序列号。_samples[0].idx\n static sidx (data) {\n // const buffer = new Buffer()\n const timescale = data.timescale\n const duration = data.samples[0].duration\n const durationCount = duration * data.samples.length\n const earliestTime = data.samples[0].sampleOffset * duration\n let mdatSize = 8\n data.samples.forEach(item => {\n mdatSize += item.size\n })\n let length = 0\n if (data.isVideo) {\n let sencLength = 0\n let samples\n if (data.videoSenc) {\n samples = data.videoSenc\n }\n if (data.isVideo) {\n samples.forEach(item => {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n data.videoSencLength = sencLength\n length = mdatSize + 141 + data.samples.length * 16 + sencLength\n if (data.useEME && data.isAudioEncryption && !data.isVideoEncryption) {\n length = mdatSize + (data.samples.length * 16) + 84\n }\n } else {\n length = mdatSize + 116 + data.samples.length * 12\n if (data.useEME && data.isAudioEncryption) {\n length = mdatSize + 169 + data.samples.length * 12 + 8 * data.audioSenc.length\n }\n }\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, data.id & 0xff, // ref_id\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n (earliestTime >> 24) & 0xff,\n (earliestTime >> 16) & 0xff,\n (earliestTime >> 8) & 0xff,\n earliestTime & 0xff, // earliest_presentation_time\n 0x00, 0x00, 0x00, 0x00, // first_offset\n 0x00, 0x00, // reserved\n 0x00, 0x01, // ref_count\n // 0x00, 0x04, 0x11, 0xCF, // ref_size + ref_type\n // 0x00, 0x01, 0x0A, 0xA6, // ref_size + ref_type\n 0x00, // ref_size + ref_type ref_size = moof.size + mdat.size\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff,\n (durationCount >> 24) & 0xff,\n (durationCount >> 16) & 0xff,\n (durationCount >> 8) & 0xff,\n durationCount & 0xff,\n 0x90, 0x00, 0x00, 0x00\n ])\n return MP4.box(MP4.types.sidx, content)\n }\n\n static mdat (data) {\n const mdat = MP4.box(MP4.types.mdat, data)\n // console.log('[remux],mdat ,len ', mdat.byteLength, hashVal(mdat.toString()))\n return mdat\n }\n}\n","\nexport class Logger {\n constructor (name, enable) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n Logger.disabled = enable\n }\n\n debug (...args) {\n if (Logger.disabled) return\n console.debug(this._prefix, ...args)\n }\n\n log (...args) {\n if (Logger.disabled) return\n console.log(this._prefix, ...args)\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n error (...args) {\n if (Logger.disabled) return\n console.error(this._prefix, ...args)\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","import {\n WordArray,\n Hasher,\n} from './core.js';\n\n// Constants table\nconst T = [];\n\n// Compute constants\nfor (let i = 0; i < 64; i += 1) {\n T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n}\n\nconst FF = (a, b, c, d, x, s, t) => {\n const n = a + ((b & c) | (~b & d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst GG = (a, b, c, d, x, s, t) => {\n const n = a + ((b & d) | (c & ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst HH = (a, b, c, d, x, s, t) => {\n const n = a + (b ^ c ^ d) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst II = (a, b, c, d, x, s, t) => {\n const n = a + (c ^ (b | ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\n/**\n * MD5 hash algorithm.\n */\nexport class MD5Algo extends Hasher {\n _doReset() {\n this._hash = new WordArray([\n 0x67452301,\n 0xefcdab89,\n 0x98badcfe,\n 0x10325476,\n ]);\n }\n\n _doProcessBlock(M, offset) {\n const _M = M;\n\n // Swap endian\n for (let i = 0; i < 16; i += 1) {\n // Shortcuts\n const offset_i = offset + i;\n const M_offset_i = M[offset_i];\n\n _M[offset_i] = (\n (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)\n | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n );\n }\n\n // Shortcuts\n const H = this._hash.words;\n\n const M_offset_0 = _M[offset + 0];\n const M_offset_1 = _M[offset + 1];\n const M_offset_2 = _M[offset + 2];\n const M_offset_3 = _M[offset + 3];\n const M_offset_4 = _M[offset + 4];\n const M_offset_5 = _M[offset + 5];\n const M_offset_6 = _M[offset + 6];\n const M_offset_7 = _M[offset + 7];\n const M_offset_8 = _M[offset + 8];\n const M_offset_9 = _M[offset + 9];\n const M_offset_10 = _M[offset + 10];\n const M_offset_11 = _M[offset + 11];\n const M_offset_12 = _M[offset + 12];\n const M_offset_13 = _M[offset + 13];\n const M_offset_14 = _M[offset + 14];\n const M_offset_15 = _M[offset + 15];\n\n // Working varialbes\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n\n // Computation\n a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n a = II(a, b, c, d, M_offset_0, 6, T[48]);\n d = II(d, a, b, c, M_offset_7, 10, T[49]);\n c = II(c, d, a, b, M_offset_14, 15, T[50]);\n b = II(b, c, d, a, M_offset_5, 21, T[51]);\n a = II(a, b, c, d, M_offset_12, 6, T[52]);\n d = II(d, a, b, c, M_offset_3, 10, T[53]);\n c = II(c, d, a, b, M_offset_10, 15, T[54]);\n b = II(b, c, d, a, M_offset_1, 21, T[55]);\n a = II(a, b, c, d, M_offset_8, 6, T[56]);\n d = II(d, a, b, c, M_offset_15, 10, T[57]);\n c = II(c, d, a, b, M_offset_6, 15, T[58]);\n b = II(b, c, d, a, M_offset_13, 21, T[59]);\n a = II(a, b, c, d, M_offset_4, 6, T[60]);\n d = II(d, a, b, c, M_offset_11, 10, T[61]);\n c = II(c, d, a, b, M_offset_2, 15, T[62]);\n b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n // Intermediate hash value\n H[0] = (H[0] + a) | 0;\n H[1] = (H[1] + b) | 0;\n H[2] = (H[2] + c) | 0;\n H[3] = (H[3] + d) | 0;\n }\n /* eslint-ensable no-param-reassign */\n\n _doFinalize() {\n // Shortcuts\n const data = this._data;\n const dataWords = data.words;\n\n const nBitsTotal = this._nDataBytes * 8;\n const nBitsLeft = data.sigBytes * 8;\n\n // Add padding\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n const nBitsTotalL = nBitsTotal;\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n );\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n );\n\n data.sigBytes = (dataWords.length + 1) * 4;\n\n // Hash final blocks\n this._process();\n\n // Shortcuts\n const hash = this._hash;\n const H = hash.words;\n\n // Swap endian\n for (let i = 0; i < 4; i += 1) {\n // Shortcut\n const H_i = H[i];\n\n H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)\n | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n }\n\n // Return final computed hash\n return hash;\n }\n\n clone() {\n const clone = super.clone.call(this);\n clone._hash = this._hash.clone();\n\n return clone;\n }\n}\n\n/**\n * Shortcut function to the hasher's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n *\n * @return {WordArray} The hash.\n *\n * @static\n *\n * @example\n *\n * var hash = CryptoJS.MD5('message');\n * var hash = CryptoJS.MD5(wordArray);\n */\nexport const MD5 = Hasher._createHelper(MD5Algo);\n\n/**\n * Shortcut function to the HMAC's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n * @param {WordArray|string} key The secret key.\n *\n * @return {WordArray} The HMAC.\n *\n * @static\n *\n * @example\n *\n * var hmac = CryptoJS.HmacMD5(message, key);\n */\nexport const HmacMD5 = Hasher._createHmacHelper(MD5Algo);\n","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n\n let mdatSize = 0\n\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n\n const mdata = new Uint8Array(mdatSize)\n const mdatView = new DataView(mdata.buffer)\n\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","import { concatUint8Array } from 'xgplayer-streaming-shared'\n\n/**\n * @interface\n */\nexport class IExternalDecryptor {\n /**\n * @param {Uint8Array} data\n * @param {BufferSource} key\n * @param {BufferSource} iv\n * @returns {Promise.}\n */\n async decrypt (data, key, iv) {}\n}\n\nexport class Decryptor {\n constructor () {\n const crypto = window.crypto || window.msCrypto\n this.subtle = crypto && (crypto.subtle || crypto.webkitSubtle)\n\n /**\n * @type {IExternalDecryptor}\n */\n this.externalDecryptor = null\n }\n\n destroy () {\n if (this.externalDecryptor?.destroy) {\n this.externalDecryptor.destroy()\n }\n }\n\n decrypt (video, audio) {\n if (!video && !audio) return\n const ret = []\n if (video) {\n ret[0] = this._decryptSegment(video)\n }\n if (audio) {\n ret[1] = this._decryptSegment(audio)\n }\n return Promise.all(ret)\n }\n\n async _decryptSegment (seg) {\n let data = seg.data\n if (seg.key) {\n data = await this._decryptData(seg.data, seg.key, seg.keyIv)\n }\n if (!seg.map) return data\n return concatUint8Array(seg.map, data)\n }\n\n async _decryptData (data, key, iv) {\n if (this.externalDecryptor) {\n return await this.externalDecryptor.decrypt(data, key, iv)\n } else {\n if (!this.subtle) throw new Error('crypto is not defined')\n const aesKey = await this.subtle.importKey('raw', key, { name: 'AES-CBC' }, false, ['encrypt', 'decrypt'])\n return new Uint8Array(\n await this.subtle.decrypt({ name: 'AES-CBC', iv }, aesKey, data)\n )\n }\n }\n}\n","import { EVENT } from 'xgplayer-streaming-shared'\n\nexport const Event = {\n ...EVENT,\n STREAM_PARSED: 'core.streamparsed',\n NO_AUDIO_TRACK: 'core.noaudiotrack',\n SUBTITLE_SEGMENTS: 'core.subtitlesegments',\n SUBTITLE_PLAYLIST: 'core.subtitleplaylist',\n SEI_PAYLOAD_TIME: 'core.seipayloadtime',\n APPEND_COST: 'core.appendcost'\n}\n","import { TsDemuxer, FMP4Demuxer, FMP4Remuxer, WarningType } from 'xgplayer-transmuxer'\nimport { ERR, StreamingError, Logger, concatUint8Array } from 'xgplayer-streaming-shared'\nimport { Event } from '../../constants'\n\nconst logger = new Logger('Transmuxer')\n\nexport class Transmuxer {\n _initSegmentId = ''\n\n constructor (hls, isMP4, needRemux) {\n this.hls = hls\n this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer()\n this._isMP4 = isMP4\n if (needRemux) this._remuxer = new FMP4Remuxer(this._demuxer.videoTrack, this._demuxer.audioTrack)\n }\n\n transmux (videoChunk, audioChunk, discontinuity, contiguous, startTime, needInit) {\n const demuxer = this._demuxer\n try {\n if (this._isMP4) {\n demuxer.demux(videoChunk, audioChunk)\n } else {\n demuxer.demuxAndFix(concatUint8Array(videoChunk, audioChunk), discontinuity, contiguous, startTime)\n }\n } catch (error) {\n throw new StreamingError(ERR.DEMUX, ERR.SUB_TYPES.HLS, error)\n }\n\n const { videoTrack, audioTrack, metadataTrack } = demuxer\n\n const newId = `${videoTrack.codec}/${videoTrack.width}/${videoTrack.height}/${audioTrack.codec}/${audioTrack.config}`\n if (newId !== this._initSegmentId) {\n this._initSegmentId = newId\n needInit = true\n }\n\n this._fireEvents(videoTrack, audioTrack, metadataTrack, discontinuity || needInit)\n\n this.hls.emit(Event.DEMUXED_TRACK, {videoTrack, audioTrack})\n\n if (this._remuxer) {\n try {\n const {\n videoInitSegment,\n videoSegment,\n audioInitSegment,\n audioSegment\n } = this._remuxer.remux(needInit)\n const v = concatUint8Array(videoInitSegment, videoSegment)\n const a = concatUint8Array(audioInitSegment, audioSegment)\n return [v ? { codec: videoTrack.codec, data: v } : undefined, a ? { codec: audioTrack.codec, data: a } : undefined]\n } catch (error) {\n throw new StreamingError(ERR.REMUX, ERR.SUB_TYPES.FMP4, error)\n }\n } else {\n return [videoTrack, audioTrack]\n }\n }\n\n _fireEvents (videoTrack, audioTrack, metadataTrack, discontinuity) {\n logger.debug(videoTrack.samples, audioTrack.samples)\n\n if (discontinuity) {\n if (videoTrack.exist()) {\n this.hls.emit(Event.METADATA_PARSED, {\n type: 'video',\n track: videoTrack,\n meta: {\n codec: videoTrack.codec,\n timescale: videoTrack.timescale,\n width: videoTrack.width,\n height: videoTrack.height,\n sarRatio: videoTrack.sarRatio,\n baseDts: videoTrack.baseDts\n }\n })\n }\n\n if (audioTrack.exist()) {\n this.hls.emit(Event.METADATA_PARSED, {\n type: 'audio',\n track: audioTrack,\n meta: {\n codec: audioTrack.codec,\n channelCount: audioTrack.channelCount,\n sampleRate: audioTrack.sampleRate,\n timescale: audioTrack.timescale,\n baseDts: audioTrack.baseDts\n }\n })\n }\n\n logger.debug('discontinuity', videoTrack, audioTrack)\n }\n\n videoTrack.warnings.forEach(warn => {\n let type\n switch (warn.type) {\n case WarningType.LARGE_AV_SHIFT:\n type = Event.LARGE_AV_FIRST_FRAME_GAP_DETECT\n break\n case WarningType.LARGE_VIDEO_GAP:\n type = Event.LARGE_VIDEO_DTS_GAP_DETECT\n break\n case WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK:\n type = Event.MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT\n break\n default:\n }\n\n if (type) this.hls.emit(Event.STREAM_EXCEPTION, { ...warn, type })\n logger.warn('video exception', warn)\n })\n\n audioTrack.warnings.forEach(warn => {\n let type\n switch (warn.type) {\n case WarningType.LARGE_AUDIO_GAP:\n type = Event.LARGE_AUDIO_DTS_GAP_DETECT\n break\n case WarningType.AUDIO_FILLED:\n type = Event.AUDIO_GAP_DETECT\n break\n case WarningType.AUDIO_DROPPED:\n type = Event.AUDIO_OVERLAP_DETECT\n break\n default:\n }\n\n if (type) this.hls.emit(Event.STREAM_EXCEPTION, { ...warn, type })\n logger.warn('audio exception', warn)\n })\n\n videoTrack.samples.forEach((sample) => {\n if (sample.keyframe) {\n this.hls.emit(Event.KEYFRAME, { pts: sample.pts })\n }\n })\n\n metadataTrack.seiSamples.forEach(sei => {\n this.hls.emit(Event.SEI, {\n ...sei,\n originPts: sei.originPts / 90, // sei 统一时间单位为毫秒\n sei: {\n code: sei.data.type,\n content: sei.data.payload,\n dts: sei.pts\n }\n })\n })\n }\n}\n","import { TsDemuxer, MP4Parser } from 'xgplayer-transmuxer'\nimport { MSE, Buffer, ERR, StreamingError, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { Decryptor } from './decrypt'\nimport { Transmuxer } from './transmuxer'\nimport { Event } from '../constants'\n\nconst logger = new Logger('BufferService')\n\nexport class BufferService {\n _decryptor = new Decryptor()\n /** @type {Transmuxer} */\n _transmuxer = null\n /** @type {MSE} */\n _mse = null\n _softVideo = null\n _sourceCreated = false\n _needInitSegment = true\n _directAppend = false\n\n constructor (hls) {\n this.hls = hls\n if (hls.config.softDecode) { // soft decode\n this._softVideo = hls.media\n } else {\n this._mse = new MSE()\n\n if (hls.config.url) {\n this._mse.bindMedia(hls.media)\n }\n }\n\n // If a third-party decryption module is configured, use it\n if (hls.config.decryptor) {\n this._decryptor.externalDecryptor = hls.config.decryptor\n }\n }\n\n get baseDts () {\n return this._transmuxer?._demuxer?._fixer?._baseDts\n }\n\n get nbSb () {\n if (!this._mse?._sourceBuffer) return 0\n\n return Object.keys(this._mse._sourceBuffer).length\n }\n\n get msIsOpend () {\n return this._mse?.isOpened\n }\n\n async updateDuration (duration) {\n logger.debug('update duration', duration)\n if (this._mse) {\n if (!this._mse.isOpened) {\n await this._mse.open()\n }\n await this._mse.updateDuration(duration)\n } else if (this._softVideo) {\n this._softVideo.duration = duration\n }\n }\n\n createSource (videoChunk, audioChunk, videoCodec, audioCodec) {\n if (this._sourceCreated) return\n const chunk = videoChunk || audioChunk\n if (!chunk) return\n if (TsDemuxer.probe(chunk)) {\n if (!this._transmuxer) this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo)\n } else if (MP4Parser.probe(chunk)) {\n if (this._softVideo) {\n if (!this._transmuxer) this._transmuxer = new Transmuxer(this.hls, true)\n } else {\n this._directAppend = true\n let mix = false\n if (videoChunk && !videoCodec) {\n MP4Parser.findBox(videoChunk, ['moov', 'trak']).forEach(t => {\n const box = MP4Parser.findBox(t.data, ['trak', 'mdia', 'minf', 'stbl', 'stsd'])[0]\n if (box) {\n const e = MP4Parser.stsd(box).entries[0]\n if (e) {\n if (e.hvcC) {\n videoCodec = e.hvcC.codec || 'hev1.1.6.L93.B0'\n } else if (e.avcC) {\n videoCodec = e.avcC.codec\n } else if (e.sampleRate || e.esds) {\n audioCodec = e.esds?.codec || 'mp4a.40.2'\n mix = true\n }\n }\n }\n })\n }\n if (audioChunk && !audioCodec) {\n MP4Parser.findBox(audioChunk, ['moov', 'trak', 'mdia', 'minf', 'stbl', 'stsd']).forEach(stsd => {\n const e = MP4Parser.stsd(stsd).entries[0]\n if (e && e.esds) audioCodec = e.esds.codec\n })\n }\n if (videoChunk && !videoCodec) videoCodec = 'avc1.42e01e'\n if (audioChunk && !audioCodec) audioCodec = 'mp4a.40.2'\n if (mix) {\n videoCodec += `, ${audioCodec}`\n audioCodec = ''\n }\n this._createMseSource(videoCodec, audioCodec)\n }\n } else {\n throw new StreamingError(ERR.OTHER, null, null, null, 'unsupported stream')\n }\n if (this._softVideo) this._sourceCreated = true\n }\n\n async appendBuffer (segment, audioSegment, videoChunk, audioChunk, discontinuity, contiguous, startTime) {\n if (!videoChunk?.length && !audioChunk?.length) return\n if (this._directAppend) {\n const p = []\n if (videoChunk) p.push(this._mse.append(MSE.VIDEO, videoChunk))\n if (audioChunk) p.push(this._mse.append(MSE.AUDIO, audioChunk))\n return Promise.all(p)\n }\n const needInit = this._needInitSegment || discontinuity\n const [video, audio] = this._transmuxer.transmux(videoChunk, audioChunk, discontinuity, contiguous, startTime, this._needInitSegment || discontinuity)\n\n if (audioChunk && audioSegment) {\n audioSegment?.setTrackExist(false, true)\n }\n\n if (audioChunk && segment) {\n segment?.setTrackExist(true, false)\n }\n\n if (!audioSegment) {\n segment?.setTrackExist(!!video, !!audio)\n }\n\n\n if (video && !audio) {\n this.hls.emit(Event.NO_AUDIO_TRACK)\n }\n\n if (this._softVideo) {\n this._softVideo.appendBuffer(video, audio)\n this._needInitSegment = false\n } else if (this._mse) {\n const isFirstAppend = !this._sourceCreated\n if (isFirstAppend) {\n this._createMseSource(video?.codec, audio?.codec)\n }\n this._needInitSegment = false\n const mse = this._mse\n const p = []\n\n if (needInit && !isFirstAppend) {\n // handle codec change during midstream\n this._handleCodecChange(video, audio)\n }\n\n if (video) p.push(mse.append(MSE.VIDEO, video.data))\n if (audio) p.push(mse.append(MSE.AUDIO, audio.data))\n return Promise.all(p)\n }\n }\n\n async removeBuffer (start = 0, end = Infinity) {\n const media = this.hls.media\n if (!this._mse || !media || start < 0 || end < start || start >= this._mse.duration) return\n\n return this._mse\n .clearBuffer(start, end)\n .then(() => this.hls.emit(EVENT.REMOVE_BUFFER, { start, end, removeEnd: end }))\n }\n\n async evictBuffer (bufferBehind) {\n const media = this.hls.media\n if (!this._mse || !media || !bufferBehind || bufferBehind < 0) return\n const currentTime = media.currentTime\n const removeEnd = currentTime - bufferBehind\n if (removeEnd <= 0) return\n const start = Buffer.start(Buffer.get(media))\n if (start + 1 >= removeEnd) return\n return this.removeBuffer(0, removeEnd)\n }\n\n async clearAllBuffer () {\n if (this._mse) return this._mse.clearAllBuffer()\n }\n\n decryptBuffer (video, audio) {\n return this._decryptor.decrypt(video, audio)\n }\n\n async reset (reuseMse = false) {\n if (this._mse && !reuseMse) {\n this._transmuxer = null\n this._sourceCreated = false\n await this._mse.unbindMedia()\n await this._mse.bindMedia(this.hls.media)\n }\n this._needInitSegment = true\n this._directAppend = false\n }\n\n async endOfStream () {\n if (this._mse) {\n if (this._sourceCreated) {\n await this._mse.endOfStream()\n this.hls.emit(EVENT.BUFFEREOS)\n }\n }\n if (this._softVideo) {\n this._softVideo.endOfStream()\n }\n }\n\n async setLiveSeekableRange (start, end) {\n if (this._mse) this._mse.setLiveSeekableRange(start, end)\n }\n\n async destroy () {\n this._decryptor?.destroy()\n if (this._mse) {\n await this._mse.unbindMedia()\n }\n\n this._decryptor = null\n this._mse = null\n this._softVideo = null\n }\n\n /**\n * @private\n */\n _createMseSource (videoCodec, audioCodec) {\n logger.debug(`create mse source, videoCodec=${videoCodec}, audioCodec=${audioCodec}`)\n const mse = this._mse\n if (!mse) return\n if (videoCodec) {\n mse.createSource(MSE.VIDEO, `video/mp4;codecs=${videoCodec}`)\n this._sourceCreated = true\n }\n if (audioCodec) {\n mse.createSource(MSE.AUDIO, `audio/mp4;codecs=${audioCodec}`)\n this._sourceCreated = true\n }\n this.hls.emit(EVENT.SOURCEBUFFER_CREATED)\n }\n\n /**\n * This makes it possible to change codecs or container type mid-stream.\n * @private\n */\n _handleCodecChange (video, audio) {\n const mse = this._mse\n const codecList = [{\n type: MSE.VIDEO,\n codecs: video?.codec\n }, {\n type: MSE.AUDIO,\n codecs: audio?.codec\n }]\n\n codecList.filter(item => !!item.codecs).forEach(({type, codecs}) => {\n const sourceBuffer = mse.getSourceBuffer(type)\n if (sourceBuffer) {\n const codec = codecs.split(',')[0]\n if (!new RegExp(codec, 'ig').test(sourceBuffer.mimeType)) {\n mse.changeType(type, `${type}/mp4;codecs=${codecs}`)\n }\n }\n })\n }\n\n seamlessSwitch () {\n this._needInitSegment = true\n }\n}\n","export class MasterPlaylist {\n version = 0\n streams = [] // MasterStream\n /**\n * @readonly\n */\n isMaster = true\n}\n\n\nconst MediaType = {\n Audio: 'AUDIO',\n Video: 'VIDEO',\n SubTitle: 'SUBTITLE',\n ClosedCaptions: 'CLOSED-CAPTIONS'\n}\n\nexport class MediaStream {\n id = 0\n url = ''\n default = false\n autoSelect = false\n forced = false\n group = ''\n name = ''\n lang = ''\n segments = []\n endSN = 0\n}\n\nexport class AudioStream extends MediaStream {\n mediaType = MediaType.Audio\n channels = 0\n}\n\nexport class VideoStream extends MediaStream {\n mediaType = MediaType.Video\n}\n\nexport class SubTitleStream extends MediaStream {\n mediaType = MediaType.SubTitle\n}\n\nexport class ClosedCaptionsStream extends MediaStream {\n mediaType = MediaType.ClosedCaptions\n}\n\nexport class MasterStream {\n id = 0\n bitrate = 0\n width = 0\n height = 0\n name = ''\n url = ''\n audioCodec = ''\n videoCodec = ''\n textCodec = ''\n audioGroup = ''\n\n /** @type {AudioStream[]} */\n audioStreams = []\n\n /** @type {SubTitleStream[]} */\n subtitleStreams = []\n\n /** @type {ClosedCaptionsStream[]} */\n closedCaptionsStream = []\n}\n\nexport class MediaPlaylist {\n version = 0\n url = ''\n type = '' // upper case\n startCC = 0\n endCC = 0\n startSN = 0\n endSN = 0\n totalDuration = 0\n targetDuration = 0\n live = true\n /** @type {Array.} */\n segments = []\n}\n\nexport class MediaSegment {\n sn = 0 // Media Sequence Number\n cc = 0\n url = ''\n title = ''\n start = 0\n duration = 0\n /** @type {?MediaSegmentKey} */\n key = null\n byteRange = null // [start, end]\n isInitSegment = false\n /** @type {?MediaSegment} */\n initSegment = null\n isLast = false\n hasAudio = false\n hasVideo = false\n\n get end () {\n return this.start + this.duration\n }\n\n setTrackExist (v, a) {\n this.hasVideo = v\n this.hasAudio = a\n }\n\n setByteRange (data, prevSegment) {\n this.byteRange = [0]\n const bytes = data.split('@')\n if (bytes.length === 1 && prevSegment && prevSegment.byteRange) {\n this.byteRange[0] = prevSegment.byteRange[1] || 0\n if (this.byteRange[0]) this.byteRange[0] += 1\n } else {\n this.byteRange[0] = parseInt(bytes[1])\n }\n this.byteRange[1] = this.byteRange[0] + parseInt(bytes[0]) - 1\n }\n}\n\nexport class MediaSegmentKey {\n method = ''\n url = ''\n /** @type {?Uint8Array} */\n iv = null\n keyFormat = ''\n keyFormatVersions = ''\n\n constructor (segKey) {\n if (segKey instanceof MediaSegmentKey) {\n this.method = segKey.method\n this.url = segKey.url\n this.keyFormat = segKey.keyFormat\n this.keyFormatVersions = segKey.keyFormatVersions\n if (segKey.iv) this.iv = new Uint8Array(segKey.iv)\n }\n }\n\n clone (sn) {\n const key = new MediaSegmentKey(this)\n if (sn !== null && sn !== undefined) key.setIVFromSN(sn)\n return key\n }\n\n setIVFromSN (sn) {\n if (!this.iv && this.method === 'AES-128' && typeof sn === 'number' && this.url) {\n this.iv = new Uint8Array(16)\n for (let i = 12; i < 16; i++) {\n this.iv[i] = (sn >> (8 * (15 - i))) & 0xff\n }\n }\n }\n}\n","const REGEXP_TAG = /^#(EXT[^:]*)(?::(.*))?$/\nconst REGEXP_ATTR = /([^=]+)=(?:\"([^\"]*)\"|([^\",]*))(?:,|$)/g\nconst REGEXP_ABSOLUTE_URL = /^(?:[a-zA-Z0-9+\\-.]+:)?\\/\\//\nconst REGEXP_URL_PAIR = /^((?:[a-zA-Z0-9+\\-.]+:)?\\/\\/[^/?#]*)?([^?#]*\\/)?/\n\nexport function getLines (text) {\n return text.split(/[\\r\\n]/).map((x) => x.trim()).filter(Boolean)\n}\n\nexport function parseTag (text) {\n const ret = text.match(REGEXP_TAG)\n if (!ret || !ret[1]) return\n return [ret[1].replace('EXT-X-', ''), ret[2]]\n}\n\nexport function parseAttr (text) {\n const ret = {}\n let match = REGEXP_ATTR.exec(text)\n while (match) {\n ret[match[1]] = match[2] || match[3]\n match = REGEXP_ATTR.exec(text)\n }\n return ret\n}\n\nexport function getAbsoluteUrl (url, parentUrl) {\n if (!parentUrl || !url || REGEXP_ABSOLUTE_URL.test(url)) return url\n const pairs = REGEXP_URL_PAIR.exec(parentUrl)\n if (!pairs) return url\n if (url[0] === '/') return pairs[1] + url\n return pairs[1] + pairs[2] + url\n}\n\nconst CODECS_REGEXP = {\n audio: [/^mp4a/, /^vorbis$/, /^opus$/, /^flac$/, /^[ae]c-3$/],\n video: [/^avc/, /^hev/, /^hvc/, /^vp0?[89]/, /^av1$/],\n text: [/^vtt$/, /^wvtt/, /^stpp/]\n}\n\n/**\n * @param {'audio' | 'video' | 'text'} type\n * @param {Array} codecs\n * @returns {string | undefined}\n */\nexport function getCodecs (type, codecs) {\n const re = CODECS_REGEXP[type]\n if (!re || !codecs || !codecs.length) return\n for (let i = 0; i < re.length; i++) {\n for (let j = 0; j < codecs.length; j++) {\n if (re[i].test(codecs[j])) return codecs[j]\n }\n }\n}\n","import { MasterPlaylist, MasterStream, AudioStream, SubTitleStream, MediaStream } from './model'\nimport { parseAttr, parseTag, getAbsoluteUrl, getCodecs } from './utils'\n\n/**\n * @param {Array} lines\n * @param {string} parentUrl\n * @returns {MasterPlaylist}\n */\nexport function parseMasterPlaylist (lines, parentUrl) {\n const master = new MasterPlaylist()\n let index = 0\n let line\n const audioStreams = []\n const subtitleStreams = []\n\n // eslint-disable-next-line no-cond-assign\n while (line = lines[index++]) {\n const tag = parseTag(line)\n if (!tag) continue\n const [name, data] = tag\n if (name === 'VERSION') {\n master.version = parseInt(data)\n } else if (name === 'MEDIA' && data) {\n const attr = parseAttr(data)\n let stream\n switch (attr.TYPE) {\n case 'AUDIO':\n stream = new AudioStream()\n break\n case 'SUBTITLES':\n stream = new SubTitleStream()\n break\n default:\n stream = new MediaStream()\n }\n\n stream.url = getAbsoluteUrl(attr.URI, parentUrl)\n stream.default = attr.DEFAULT === 'YES'\n stream.autoSelect = attr.AUTOSELECT === 'YES'\n stream.group = attr['GROUP-ID']\n stream.name = attr.NAME\n stream.lang = attr.LANGUAGE\n if (attr.CHANNELS) {\n stream.channels = Number(attr.CHANNELS.split('/')[0])\n if (Number.isNaN(stream.channels)) stream.channels = 0\n }\n\n if (attr.TYPE === 'AUDIO' && attr.URI) {\n audioStreams.push(stream)\n }\n\n if (attr.TYPE === 'SUBTITLES') {\n subtitleStreams.push(stream)\n }\n\n } else if (name === 'STREAM-INF' && data) {\n const stream = new MasterStream()\n const attr = parseAttr(data)\n\n stream.bitrate = parseInt(attr['AVERAGE-BANDWIDTH'] || attr.BANDWIDTH)\n stream.name = attr.NAME\n stream.url = getAbsoluteUrl(lines[index++], parentUrl)\n if (attr.RESOLUTION) {\n const [w, h] = attr.RESOLUTION.split('x')\n stream.width = parseInt(w)\n stream.height = parseInt(h)\n }\n if (attr.CODECS) {\n const codecs = attr.CODECS.split(/[ ,]+/).filter(Boolean)\n stream.videoCodec = getCodecs('video', codecs)\n stream.audioCodec = getCodecs('audio', codecs)\n stream.textCodec = getCodecs('text', codecs)\n }\n stream.audioGroup = attr.AUDIO\n stream.subtitleGroup = attr.SUBTITLES\n\n master.streams.push(stream)\n }\n }\n master.streams.forEach((s, i) => { s.id = i })\n\n if (audioStreams.length) {\n audioStreams.forEach((s, i) => { s.id = i })\n master.streams.forEach((stream) => {\n if (stream.audioGroup) {\n stream.audioStreams = audioStreams.filter(x => x.group === stream.audioGroup)\n }\n })\n }\n\n if (subtitleStreams.length) {\n subtitleStreams.forEach((s, i) => { s.id = i })\n master.streams.forEach((stream) => {\n if (stream.subtitleGroup) {\n stream.subtitleStreams = subtitleStreams.filter(x => x.group === stream.subtitleGroup)\n }\n })\n }\n\n return master\n}\n","import { MediaPlaylist, MediaSegment, MediaSegmentKey } from './model'\nimport { getAbsoluteUrl, parseAttr, parseTag } from './utils'\n\nexport function parseMediaPlaylist (lines, parentUrl) {\n const media = new MediaPlaylist()\n media.url = parentUrl\n let curSegment = new MediaSegment()\n let curInitSegment = null\n let curKey = null\n let totalDuration = 0\n let curSN = 0\n let curCC = 0\n let index = 0\n let line\n let endOfList = false\n\n\n // eslint-disable-next-line no-cond-assign\n while (line = lines[index++]) {\n if (endOfList) {\n break\n }\n if (line[0] !== '#') { // url\n curSegment.sn = curSN\n curSegment.cc = curCC\n curSegment.url = getAbsoluteUrl(line, parentUrl)\n if (curKey) curSegment.key = curKey.clone(curSN)\n if (curInitSegment) curSegment.initSegment = curInitSegment\n media.segments.push(curSegment)\n curSegment = new MediaSegment()\n curSN++\n continue\n }\n\n const tag = parseTag(line)\n if (!tag) continue\n const [name, data] = tag\n\n switch (name) {\n case 'VERSION':\n media.version = parseInt(data)\n break\n case 'PLAYLIST-TYPE':\n media.type = data?.toUpperCase()\n break\n case 'TARGETDURATION':\n media.targetDuration = parseFloat(data)\n break\n case 'ENDLIST': {\n const lastSegment = media.segments[media.segments.length - 1]\n if (lastSegment) {\n lastSegment.isLast = true\n }\n media.live = false\n endOfList = true\n }\n break\n case 'MEDIA-SEQUENCE':\n curSN = media.startSN = parseInt(data)\n break\n case 'DISCONTINUITY-SEQUENCE':\n curCC = media.startCC = parseInt(data)\n break\n case 'DISCONTINUITY':\n curCC++\n break\n case 'BYTERANGE':\n curSegment.setByteRange(data, media.segments[media.segments.length - 1])\n break\n case 'EXTINF': {\n const [duration, title] = data.split(',')\n curSegment.start = totalDuration\n curSegment.duration = parseFloat(duration)\n totalDuration += curSegment.duration\n curSegment.title = title\n }\n break\n case 'KEY': {\n const attr = parseAttr(data)\n if (attr.METHOD === 'NONE') {\n curKey = null\n break\n }\n if (attr.METHOD !== 'AES-128') throw new Error(`encrypt ${attr.METHOD}/${attr.KEYFORMAT} is not supported`)\n curKey = new MediaSegmentKey()\n curKey.method = attr.METHOD\n curKey.url = /^blob:/.test(attr.URI) ? attr.URI : getAbsoluteUrl(attr.URI, parentUrl)\n curKey.keyFormat = attr.KEYFORMAT || 'identity'\n curKey.keyFormatVersions = attr.KEYFORMATVERSIONS\n if (attr.IV) {\n let str = attr.IV.slice(2)\n str = (str.length & 1 ? '0' : '') + str\n curKey.iv = new Uint8Array(str.length / 2)\n for (let i = 0, l = str.length / 2; i < l; i++) {\n curKey.iv[i] = parseInt(str.slice(i * 2, i * 2 + 2), 16)\n }\n }\n }\n break\n case 'MAP': {\n const attr = parseAttr(data)\n curSegment.url = getAbsoluteUrl(attr.URI, parentUrl)\n if (attr.BYTERANGE) curSegment.setByteRange(attr.BYTERANGE)\n curSegment.isInitSegment = true\n curSegment.sn = 0\n if (curKey) {\n curSegment.key = curKey.clone(0)\n }\n curInitSegment = curSegment\n curSegment = new MediaSegment()\n }\n break\n default:\n }\n }\n\n media.segments = media.segments.filter(x => x.duration !== 0)\n\n const lastSegment = media.segments[media.segments.length - 1]\n if (lastSegment) media.endSN = lastSegment.sn\n\n media.totalDuration = totalDuration\n media.endCC = curCC\n\n return media\n}\n","import { parseMasterPlaylist } from './master'\nimport { parseMediaPlaylist } from './media'\nimport { getLines } from './utils'\n\nexport class M3U8Parser {\n static parse (text = '', parentUrl) {\n if (!text.includes('#EXTM3U')) throw new Error('Invalid m3u8 file')\n\n const lines = getLines(text)\n\n if (M3U8Parser.isMediaPlaylist(text)) {\n return parseMediaPlaylist(lines, parentUrl)\n }\n return parseMasterPlaylist(lines, parentUrl)\n }\n\n static isMediaPlaylist (text) {\n return text.includes('#EXTINF:') || text.includes('#EXT-X-TARGETDURATION:')\n }\n}\n","import { NetLoader, StreamingError, EVENT, ERR } from 'xgplayer-streaming-shared'\nimport { M3U8Parser } from './parser'\nimport { Event } from '../constants'\n\nexport class ManifestLoader {\n constructor (hls) {\n this.hls = hls\n this._timer = null\n\n const { retryCount, retryDelay, loadTimeout, fetchOptions } = this.hls.config\n this._loader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._audioLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n\n this._subtitleLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n\n }\n\n async load (url, audioUrl, subtitleUrl) {\n const toLoad = [this._loader.load(url)]\n if (audioUrl) {\n toLoad.push(this._audioLoader.load(audioUrl))\n }\n\n if (subtitleUrl) {\n toLoad.push(this._subtitleLoader.load(subtitleUrl))\n }\n\n let videoText\n let audioText\n let subtitleText\n\n try {\n const [video, audio, subtitle] = await Promise.all(toLoad)\n if (!video) return []\n\n this._emitOnLoaded(video, url)\n\n videoText = video.data\n\n if (audioUrl) {\n audioText = audio?.data\n subtitleText = subtitle?.data\n audioText && this._emitOnLoaded(audio, audioUrl)\n subtitleText && this._emitOnLoaded(subtitle, subtitleUrl)\n } else {\n subtitleText = subtitle?.data\n subtitleText && this._emitOnLoaded(subtitle, subtitleUrl)\n }\n\n } catch (error) {\n throw StreamingError.network(error)\n }\n\n const { onPreM3U8Parse } = this.hls.config\n\n let playlist\n let audioPlaylist\n let subtitlePlaylist\n try {\n if (onPreM3U8Parse) {\n videoText = onPreM3U8Parse(videoText) || videoText\n if (audioText) audioText = onPreM3U8Parse(audioText, true) || audioText\n if (subtitleText) subtitleText = onPreM3U8Parse(subtitleText, true) || subtitleText\n }\n playlist = M3U8Parser.parse(videoText, url)\n if (playlist?.live === false && playlist.segments && !playlist.segments.length) {\n throw new Error('empty segments list')\n }\n if (audioText) {\n audioPlaylist = M3U8Parser.parse(audioText, audioUrl)\n }\n if (subtitleText) {\n subtitlePlaylist = M3U8Parser.parse(subtitleText, subtitleUrl)\n }\n\n } catch (error) {\n throw new StreamingError(ERR.MANIFEST, ERR.SUB_TYPES.HLS, error)\n }\n if (playlist) {\n if (playlist.isMaster) {\n this.hls.emit(Event.HLS_MANIFEST_LOADED, { playlist })\n } else {\n this.hls.emit(Event.HLS_LEVEL_LOADED, { playlist })\n }\n }\n\n return [playlist, audioPlaylist, subtitlePlaylist]\n }\n\n parseText (videoText, url) {\n const { onPreM3U8Parse } = this.hls.config\n\n let playlist\n try {\n if (onPreM3U8Parse) {\n videoText = onPreM3U8Parse(videoText) || videoText\n }\n playlist = M3U8Parser.parse(videoText, url)\n if (playlist?.live === false && playlist.segments && !playlist.segments.length) {\n throw new Error('empty segments list')\n }\n } catch (error) {\n throw new StreamingError(ERR.MANIFEST, ERR.SUB_TYPES.HLS, error)\n }\n if (playlist) {\n if (playlist.isMaster) {\n this.hls.emit(Event.HLS_MANIFEST_LOADED, { playlist })\n } else {\n this.hls.emit(Event.HLS_LEVEL_LOADED, { playlist })\n }\n }\n return [playlist]\n }\n\n poll (url, audioUrl, subtitleUrl, cb, errorCb, time) {\n clearTimeout(this._timer)\n time = time || 3000\n let retryCount = this.hls.config.pollRetryCount\n const fn = async () => {\n clearTimeout(this._timer)\n try {\n const res = await this.load(url, audioUrl, subtitleUrl)\n if (!res[0]) return\n retryCount = this.hls.config.pollRetryCount\n cb(res[0], res[1], res[2])\n } catch (e) {\n retryCount--\n if (retryCount <= 0) {\n errorCb(e)\n }\n }\n this._timer = setTimeout(fn, time)\n }\n this._timer = setTimeout(fn, time)\n }\n\n stopPoll () {\n clearTimeout(this._timer)\n return this.cancel()\n }\n\n cancel () {\n return Promise.all([\n this._loader.cancel(),\n this._audioLoader.cancel()\n ])\n }\n\n _emitOnLoaded = (res, url) => {\n const { response, options } = res\n const { firstByteTime, startTime, endTime, contentLength } = options || {}\n const time = endTime - startTime\n\n this.hls.emit(EVENT.SPEED, { time, byteLength: contentLength, url })\n this.hls.emit(EVENT.LOAD_COMPLETE, { url, elapsed: time || 0 })\n this.hls.emit(EVENT.TTFB, { url, responseUrl: response.url, elapsed: firstByteTime - startTime })\n this.hls.emit(EVENT.LOAD_RESPONSE_HEADERS, { headers: response.headers, url })\n }\n\n _onLoaderRetry = (error, retryTime) => {\n this.hls.emit(Event.LOAD_RETRY, {\n error: StreamingError.network(error),\n retryTime\n })\n }\n}\n","export function clamp (num, min, max) {\n if (min > max) {\n max = min\n }\n return Math.min(Math.max(num, min), max)\n}\n","export class Stream {\n live = undefined\n id = 0\n bitrate = 0\n width = 0\n height = 0\n name = ''\n url = ''\n audioCodec = ''\n videoCodec = ''\n textCodec = ''\n\n startCC = 0\n endCC = 0\n startSN = 0\n endSN = -1\n totalDuration = 0\n targetDuration = 0\n\n snDiff = null // number\n\n segments = []\n\n /** @type {import('../../parser/model').AudioStream[]} */\n audioStreams = []\n\n /** @type {import('../../parser/model').SubTitleStream[]} */\n subtitleStreams = []\n\n /** @type {import('../../parser/model').ClosedCaptionsStream[]} */\n closedCaptions = []\n\n /** @type {import('../../parser/model').AudioStream | null} */\n currentAudioStream = null\n\n /** @type {import('../../parser/model').subtitleStreams | null} */\n currentSubtitleStream = null\n\n /**\n * asdasd {@link AudioStream}\n */\n get lastSegment () {\n if (this.segments.length) {\n return this.segments[this.segments.length - 1]\n }\n return null\n }\n\n get segmentDuration () {\n return this.targetDuration || this.segments[0]?.duration || 0\n }\n\n get liveEdge () {\n return this.endTime\n }\n\n get endTime () {\n return this.lastSegment?.end || 0\n }\n\n get currentSubtitleEndSn () {\n return this.currentSubtitleStream?.endSN || 0\n }\n\n constructor (playlist, audioPlaylist, subtitlePlaylist) {\n this.update(playlist, audioPlaylist, subtitlePlaylist)\n }\n\n clearOldSegment (startTime, pointer) {\n if (this.currentAudioStream) {\n this._clearSegments(startTime, pointer)\n }\n\n return this._clearSegments(startTime, pointer)\n }\n\n getAudioSegment (seg) {\n if (!seg || !this.currentAudioStream) return\n const sn = seg.sn - this.snDiff\n return this.currentAudioStream.segments.find(x => x.sn === sn)\n }\n\n update (playlist, audioPlaylist) {\n this.url = playlist.url\n if (Array.isArray(playlist.segments)) { // media\n if (this.live === null || this.live === undefined) this.live = playlist.live\n this._updateSegments(playlist, this)\n\n this.startCC = playlist.startCC\n this.endCC = playlist.endCC\n this.startSN = playlist.startSN\n this.endSN = playlist.endSN || -1\n this.totalDuration = playlist.totalDuration\n this.targetDuration = playlist.targetDuration\n this.live = playlist.live\n\n if (audioPlaylist && this.currentAudioStream && Array.isArray(audioPlaylist.segments)) {\n this._updateSegments(audioPlaylist, this.currentAudioStream)\n if ((this.snDiff === null || this.snDiff === undefined) && playlist.segments.length && audioPlaylist.segments.length) {\n this.snDiff = playlist.segments[0].sn - audioPlaylist.segments[0].sn\n }\n }\n\n } else { // master stream\n this.id = playlist.id\n this.bitrate = playlist.bitrate\n this.width = playlist.width\n this.height = playlist.height\n this.name = playlist.name\n this.audioCodec = playlist.audioCodec\n this.videoCodec = playlist.videoCodec\n this.textCodec = playlist.textCodec\n this.audioStreams = playlist.audioStreams\n this.subtitleStreams = playlist.subtitleStreams\n if (!this.currentAudioStream && this.audioStreams.length) {\n this.currentAudioStream = this.audioStreams.find(x => x.default) || this.audioStreams[0]\n }\n\n if (!this.currentSubtitleStream && this.subtitleStreams.length) {\n this.currentSubtitleStream = this.subtitleStreams.find(x => x.default) || this.subtitleStreams[0]\n }\n }\n }\n\n updateSubtitle (subtitlePlaylist) {\n if (!(subtitlePlaylist && this.currentSubtitleStream && Array.isArray(subtitlePlaylist.segments))) return\n\n const newSegs = this._updateSegments(subtitlePlaylist, this.currentSubtitleStream)\n const segs = this.currentSubtitleStream.segments\n if (segs.length > 100 ) {\n this.currentSubtitleStream.segments = segs.slice(100)\n }\n\n if (!newSegs) return\n\n return newSegs.map(x => {\n return {\n sn: x.sn,\n url: x.url,\n duration: x.duration,\n start: x.start,\n end: x.end,\n lang: this.currentSubtitleStream.lang\n }\n })\n }\n\n\n switchSubtitle (lang) {\n const toSwitch = this.subtitleStreams.find(x => x.lang === lang)\n const origin = this.currentSubtitleStream\n if (toSwitch) {\n this.currentSubtitleStream = toSwitch\n origin.segments = []\n }\n }\n\n _clearSegments (startTime, pointer) {\n let sliceStart = 0\n const segments = this.segments\n for (let i = 0, l = segments.length; i < l; i++) {\n if (segments[i].end >= startTime) {\n sliceStart = i\n break\n }\n }\n\n if (sliceStart > pointer) {\n sliceStart = pointer\n }\n\n if (sliceStart) {\n this.segments = this.segments.slice(sliceStart)\n if (this.currentAudioStream) {\n this.currentAudioStream.segments = this.currentAudioStream.segments.slice(sliceStart)\n }\n }\n\n return pointer - sliceStart\n }\n\n _updateSegments (playlist, segObj) {\n const segments = segObj.segments\n if (this.live) {\n const endSeg = segments[segments.length - 1]\n const endSN = endSeg?.sn || -1\n if (endSN < playlist.endSN && playlist.segments.length) {\n const index = playlist.segments.findIndex(x => x.sn === endSN)\n const toAppend = index < 0 ? playlist.segments : playlist.segments.slice(index + 1)\n\n if (segments.length && toAppend.length) {\n let endTime = endSeg.end\n toAppend.forEach(seg => {\n seg.start = endTime\n endTime = seg.end\n })\n\n const lastCC = endSeg?.cc || -1\n if (lastCC > toAppend[0].cc) {\n toAppend.forEach(seg => (seg.cc += lastCC))\n }\n }\n segObj.endSN = playlist.endSN\n segObj.segments = segments.concat(toAppend)\n\n return toAppend\n }\n } else {\n segObj.segments = playlist.segments\n }\n }\n\n}\n","import { clamp } from '../utils'\nimport { Stream } from './stream'\nimport { Event } from '../constants'\n\nexport class Playlist {\n /** @type {import('./stream').Stream[]} */\n streams = []\n\n /** @type {import('./stream').Stream} */\n currentStream = null\n\n dvrWindow = 0\n\n _segmentPointer = -1\n\n constructor (hls) {\n this.hls = hls\n }\n\n get lastSegment () {\n return this.currentStream?.lastSegment\n }\n\n get currentSegment () {\n return this.currentSegments?.[this._segmentPointer]\n }\n\n get nextSegment () {\n return this.currentSegments?.[this._segmentPointer + 1]\n }\n\n get currentSegments () {\n return this.currentStream?.segments\n }\n\n get currentSubtitleEndSn () {\n return this.currentStream?.currentSubtitleEndSn\n }\n\n get liveEdge () {\n return this.currentStream?.liveEdge\n }\n\n get totalDuration () {\n return this.currentStream?.totalDuration || 0\n }\n\n get seekRange () {\n const segments = this.currentSegments\n if (!segments || !segments.length) return\n return [\n segments[0].start,\n segments[segments.length - 1].end\n ]\n }\n\n get isEmpty () {\n return !this.currentSegments?.length\n }\n\n get isLive () {\n return this.currentStream?.live\n }\n\n get hasSubtitle () {\n return !!this.currentStream?.currentSubtitleStream\n }\n\n getAudioSegment (seg) {\n return this.currentStream?.getAudioSegment(seg)\n }\n\n moveSegmentPointer (pos) {\n if (pos === null || pos === undefined) pos = this._segmentPointer + 1\n this._segmentPointer = clamp(pos, -1, this.currentSegments?.length)\n }\n\n reset () {\n this.streams = []\n this.currentStream = null\n this.dvrWindow = 0\n this._segmentPointer = -1\n }\n\n getSegmentByIndex (index) {\n return this.currentSegments?.[index]\n }\n\n setNextSegmentByIndex (index = 0) {\n this._segmentPointer = index - 1\n }\n\n findSegmentIndexByTime (time) {\n const segments = this.currentSegments\n if (segments) {\n for (let i = 0, l = segments.length, seg; i < l; i++) {\n seg = segments[i]\n if (time >= seg.start && time < seg.end) {\n return i\n }\n }\n\n const lastSegment = segments[segments.length - 1]\n if (Math.abs(time - lastSegment.end) < 0.2) return segments.length - 1\n }\n }\n\n upsertPlaylist (playlist, audioPlaylist, subtitlePlaylist) {\n if (!playlist) return\n if (playlist.isMaster) {\n this.streams.length = playlist.streams.length\n playlist.streams.filter(x => x.url).forEach((stream, i) => {\n if (this.streams[i]) {\n this.streams[i].update(stream)\n } else {\n this.streams[i] = new Stream(stream)\n }\n })\n this.currentStream = this.streams[0]\n // update media\n } else if (Array.isArray(playlist.segments)) {\n const stream = this.currentStream\n if (stream) {\n stream.update(playlist, audioPlaylist, subtitlePlaylist)\n const newSubtitleSegs = stream.updateSubtitle(subtitlePlaylist)\n if (newSubtitleSegs) {\n this.hls.emit(Event.SUBTITLE_SEGMENTS, {\n list: newSubtitleSegs\n })\n }\n } else {\n this.reset()\n this.currentStream = this.streams[0] = new Stream(playlist, audioPlaylist, subtitlePlaylist)\n }\n }\n\n const currentStream = this.currentStream\n\n if (currentStream) {\n if (this.hls.isLive && !this.dvrWindow) {\n this.dvrWindow = this.currentSegments.reduce((a, c) => {\n a += c.duration\n return a\n }, 0)\n }\n }\n }\n\n switchSubtitle (lang) {\n this.currentStream?.switchSubtitle(lang)\n }\n\n clearOldSegment (maxPlaylistSize = 50) {\n const stream = this.currentStream\n if (!this.dvrWindow || !stream) return\n const startTime = stream.endTime - this.dvrWindow\n if (startTime <= 0) return\n const segments = stream.segments\n if (segments.length <= maxPlaylistSize) return\n\n this._segmentPointer = stream.clearOldSegment(startTime, this._segmentPointer)\n }\n\n checkSegmentTrackChange (cTime, nbSb) {\n const index = this.findSegmentIndexByTime(cTime)\n const seg = this.getSegmentByIndex(index)\n\n if (!seg) return\n\n if (!seg.hasAudio && !seg.hasVideo) return\n\n // when seek\n if (nbSb !== 2 && seg.hasAudio && seg.hasVideo) return seg\n\n // continuous play\n if (seg.end - cTime > 0.3) return\n\n const next = this.getSegmentByIndex(index + 1)\n\n if (!next) return\n\n if (!next.hasAudio && !next.hasVideo) return\n\n if ((next.hasAudio !== seg.hasAudio || next.hasVideo !== seg.hasVideo)) return next\n\n }\n\n}\n","import { NetLoader, EVENT, BandwidthService, StreamingError } from 'xgplayer-streaming-shared'\n\n\n/**\n * @typedef {import('../manifest-loader/parser/model').MediaSegment} MediaSegment\n */\n\nexport class SegmentLoader {\n /** @type {Error} */\n error = null\n\n constructor (hls) {\n this.hls = hls\n this._bandwidthService = new BandwidthService()\n this._mapCache = {}\n this._keyCache = {}\n\n const { retryCount, retryDelay, loadTimeout, fetchOptions } = this.hls.config\n this._segmentLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._audioSegmentLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._keyLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n }\n\n speedInfo () {\n return {\n speed: this._bandwidthService.getLatestSpeed(),\n avgSpeed: this._bandwidthService.getAvgSpeed()\n }\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {MediaSegment} audioSeg\n * @param {boolean} loadInit\n * @param {boolean} loadAudioInit\n */\n load (seg, audioSeg, loadInit, loadAudioInit = loadInit) {\n const toLoad = []\n if (seg) toLoad[0] = this.loadVideoSegment(seg, loadInit)\n if (audioSeg) toLoad[1] = this.loadAudioSegment(audioSeg, loadAudioInit)\n return Promise.all(toLoad)\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n loadVideoSegment (seg, loadInit) {\n return this._loadSegment(this._segmentLoader, seg, loadInit)\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n loadAudioSegment (seg, loadInit) {\n return this._loadSegment(this._audioSegmentLoader, seg, loadInit)\n }\n\n /**\n * @param {NetLoader} segLoader\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n async _loadSegment (segLoader, seg, loadInit) {\n let map\n let key\n let keyIv\n let mapKey\n let mapKeyIv\n const toLoad = []\n\n this.hls.emit(EVENT.LOAD_START, { url: seg.url })\n toLoad[0] = segLoader.load(seg.url)\n if (loadInit && seg.initSegment) {\n const mapUrl = seg.initSegment.url\n map = this._mapCache[mapUrl]\n if (!map) {\n this.hls.emit(EVENT.LOAD_START, { url: mapUrl })\n toLoad[1] = segLoader.load(mapUrl).then(r => {\n if (r) {\n const l = Object.keys(this._mapCache)\n if (l > 30) this._mapCache = {}\n map = this._mapCache[mapUrl] = r.data\n this._emitOnLoaded(r, mapUrl)\n }\n })\n }\n const keyUrl = seg.initSegment.key?.url\n if (keyUrl) {\n mapKeyIv = seg.initSegment.key.iv\n mapKey = this._keyCache[keyUrl]\n if (!mapKey) {\n this.hls.emit(EVENT.LOAD_START, { url: keyUrl })\n toLoad[2] = this._keyLoader.load(keyUrl).then(r => {\n if (r) {\n mapKey = this._keyCache[keyUrl] = r.data\n this._emitOnLoaded(r, keyUrl)\n }\n })\n }\n }\n }\n\n const keyUrl = seg.key?.url\n if (keyUrl) {\n keyIv = seg.key.iv\n key = this._keyCache[keyUrl]\n if (!key) {\n this.hls.emit(EVENT.LOAD_START, { url: keyUrl })\n toLoad[3] = this._keyLoader.load(keyUrl).then(r => {\n if (r) {\n key = this._keyCache[keyUrl] = r.data\n this._emitOnLoaded(r, keyUrl)\n }\n })\n }\n }\n\n const [s] = await Promise.all(toLoad)\n if (!s) return\n const data = s.data\n this._emitOnLoaded(s, seg.url)\n\n return {\n data,\n map,\n key,\n mapKey,\n keyIv,\n mapKeyIv\n }\n }\n\n reset () {\n this.error = null\n this._mapCache = {}\n this._keyCache = {}\n this._bandwidthService.reset()\n }\n\n async cancel () {\n await Promise.all([this._keyLoader.cancel(), this._segmentLoader.cancel(), this._audioSegmentLoader.cancel()])\n }\n\n _emitOnLoaded = (res, url) => {\n const { data, response, options } = res\n const { firstByteTime, startTime, endTime, contentLength } = options || {}\n const time = endTime - startTime\n\n this._bandwidthService.addRecord(contentLength || data.byteLength, time)\n this.hls.emit(EVENT.SPEED, { time, byteLength: contentLength, url })\n this.hls.emit(EVENT.LOAD_COMPLETE, { url, elapsed: time || 0 })\n this.hls.emit(EVENT.TTFB, { url, responseUrl: response.url, elapsed: firstByteTime - startTime })\n this.hls.emit(EVENT.LOAD_RESPONSE_HEADERS, { headers: response.headers, url })\n }\n\n _onLoaderRetry = (error, retryTime) => {\n this.hls.emit(EVENT.LOAD_RETRY, {\n error: StreamingError.network(error),\n retryTime\n })\n }\n}\n","import EventEmitter from 'eventemitter3'\nimport { Buffer, ERR, GapService, getVideoPlaybackQuality, isMediaPlaying, Logger, MediaStatsService, MSE, SeiService, StreamingError } from 'xgplayer-streaming-shared'\nimport { Logger as TransmuxerLogger } from 'xgplayer-transmuxer'\nimport { BufferService } from './buffer-service'\nimport { getConfig } from './config'\nimport { Event } from './constants'\nimport { ManifestLoader } from './manifest-loader'\nimport { Playlist } from './playlist'\nimport { SegmentLoader } from './segment-loader'\nimport { clamp } from './utils'\n\n/**\n * @typedef {import('./manifest-loader/parser/model').MediaSegment} MediaSegment\n */\n/**\n * @typedef {import(\"../../../xgplayer-streaming-shared/es/services/stats\").StatsInfo} Stats\n */\n/**\n * @typedef {{\n * seamless?: boolean,\n * startTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\nconst logger = new Logger('hls')\n\nexport class Hls extends EventEmitter {\n static version = __VERSION__\n version = Hls.version\n /** @type {HTMLMediaElement | null} */\n media = null\n /** @type {import('./config').HlsOption} */\n config = null\n\n /** @type {ManifestLoader} */\n _manifestLoader = null\n\n /** @type {SegmentLoader} */\n _segmentLoader = null\n\n /** @type {Playlist} */\n _playlist = null\n\n /** @type {BufferService} */\n _bufferService = null\n\n /** @type {GapService} */\n _gapService = null\n\n /** @type {SeiService} */\n _seiService = null\n\n /** @type {MediaStatsService} */\n _stats = null\n\n _prevSegSn = null\n _prevSegCc = null\n\n _tickTimer = null\n _tickInterval = 500\n\n _segmentProcessing = false\n _reloadOnPlay = false\n\n _switchUrlOpts = null\n\n constructor (cfg) {\n super()\n this.config = cfg = getConfig(cfg)\n this.media = this.config.media\n\n this._manifestLoader = new ManifestLoader(this)\n this._segmentLoader = new SegmentLoader(this)\n this._playlist = new Playlist(this)\n this._bufferService = new BufferService(this)\n if (cfg.seiInTime) {\n this._seiService = new SeiService(this)\n }\n if (!cfg.softDecode) this._gapService = new GapService()\n\n this._stats = new MediaStatsService(this, 90000)\n\n this.media.addEventListener('play', this._onPlay)\n this.media.addEventListener('pause', this._onPause)\n this.media.addEventListener('seeking', this._onSeeking)\n this.media.addEventListener('timeupdate', this._onTimeupdate)\n }\n\n get isLive () { return this._playlist.isLive }\n get streams () { return this._playlist.streams }\n get currentStream () { return this._playlist.currentStream }\n get hasSubtitle () { return this._playlist.hasSubtitle}\n\n get baseDts () {\n return this._bufferService?.baseDts\n }\n\n speedInfo () {\n return this._segmentLoader.speedInfo()\n }\n\n bufferInfo (maxHole = 0.1) {\n return Buffer.info(Buffer.get(this.media), this.media?.currentTime, maxHole)\n }\n\n /**\n * @returns {Stats}\n */\n getStats () {\n return this._stats.getStats()\n }\n\n playbackQuality () {\n return getVideoPlaybackQuality(this.media)\n }\n\n async load (url, reuseMse = false) {\n if (url) this.config.url = url\n url = this.config.url\n await this._reset(reuseMse)\n await this._loadData(url)\n this._startTick()\n }\n\n /**\n * @param {string} url\n * @private\n */\n async _loadData (url) {\n try {\n if (url) url = url.trim()\n } catch (e) {}\n\n if (!url) throw this._emitError(new StreamingError(ERR.OTHER, ERR.SUB_TYPES.OPTION, null, null, 'm3u8 url is missing'))\n\n const manifest = await this._loadM3U8(url)\n const { currentStream } = this._playlist\n\n if (this._urlSwitching) {\n if (currentStream.bitrate === 0 && this._switchUrlOpts?.bitrate) {\n currentStream.bitrate = this._switchUrlOpts?.bitrate\n }\n const switchTimePoint = this._getSeamlessSwitchPoint()\n this.config.startTime = switchTimePoint\n\n const segIdx = this._playlist.findSegmentIndexByTime(switchTimePoint)\n const nextSeg = this._playlist.getSegmentByIndex(segIdx + 1)\n\n if (nextSeg) {\n // move to next segment in case of media stall\n const bufferClearStartPoint = nextSeg.start\n await this._bufferService.removeBuffer(bufferClearStartPoint)\n }\n }\n\n if (manifest) {\n if (this.isLive) {\n this._bufferService.setLiveSeekableRange(0, 0xffffffff)\n logger.log('totalDuration first time got', this._playlist.totalDuration)\n\n // 配置的目标延迟小于首次获取分片总时长\n if (this.config.targetLatency < this._playlist.totalDuration) {\n this.config.targetLatency = this._playlist.totalDuration\n this.config.maxLatency = 1.5 * this.config.targetLatency\n }\n\n if (!manifest.isMaster) this._pollM3U8(url)\n } else {\n await this._bufferService.updateDuration(currentStream.totalDuration)\n\n const { startTime } = this.config\n if (startTime) {\n if (!this._switchUrlOpts?.seamless) {\n this.media.currentTime = startTime\n }\n\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(startTime) || 0)\n }\n }\n }\n\n await this._loadSegment()\n }\n\n async replay (isPlayEmit) {\n this.config.startTime = 0\n await this.load()\n this._reloadOnPlay = false\n return this.media.play(!isPlayEmit)\n }\n\n /**\n * @param {string} url\n * @param {?SwitchUrlOptions} options\n * @returns\n */\n async switchURL (url, options = {}) {\n const defaultOpts = {\n seamless: false,\n startTime: 0,\n bitrate: 0\n }\n switch (typeof options) {\n case 'number':\n options = {startTime: options}\n break\n case 'boolean':\n options = {seamless: options}\n break\n case 'object':\n for (const key in options) {\n if (options[key] === undefined || options[key] === null) {\n delete options[key]\n }\n }\n break\n default:\n throw `unsupported switchURL args: ${options}`\n }\n\n options = Object.assign({}, defaultOpts, options)\n const { seamless, startTime } = options\n this.config.url = url\n this.config.startTime = startTime\n this._switchUrlOpts = options\n\n if (!seamless) {\n let appended\n try {\n appended = this.config.softDecode ? this.load(url) : (await this.load(url))\n } catch (error) {\n this.emit(Event.SWITCH_URL_FAILED, error)\n throw error\n }\n this._reloadOnPlay = false\n\n if (appended) {\n this.emit(Event.SWITCH_URL_SUCCESS, { url })\n }\n return this.media.play(true)\n } else {\n this._urlSwitching = true\n this._prevSegSn = null\n this._prevSegCc = null\n\n this._playlist.reset()\n this._bufferService.seamlessSwitch()\n await this._clear()\n await this._loadData(url)\n this._startTick()\n }\n\n this._switchUrlOpts = null\n }\n\n async switchStream (id, force = true) {\n const curStream = this.currentStream\n const streams = this.streams\n if (!curStream || curStream.id === id || !streams || streams.length < 2) return\n const toSwitch = streams.find(x => x.id === id)\n if (!toSwitch) return\n\n try {\n await this._clear()\n if (force) await this._bufferService.clearAllBuffer()\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n\n // 同步更新\n if (curStream.currentAudioStream && toSwitch.audioStreams.length > 2) {\n const curId = curStream.currentAudioStream.id\n toSwitch.currentAudioStream = toSwitch.audioStreams.find(x => x.id === curId) || toSwitch.currentAudioStream\n }\n\n this._playlist.currentStream = toSwitch\n\n try {\n if (this.isLive || !toSwitch.segments.length) await this._refreshM3U8()\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(this.media.currentTime) || 0)\n this._prevSegCc = null\n await this._loadSegmentDirect()\n } catch (error) {\n this._playlist.currentStream = curStream\n throw error\n }\n\n this._startTick()\n return toSwitch\n }\n\n async switchAudioStream (id, force = true) {\n const curStream = this.currentStream\n if (!curStream) return\n const audioStream = curStream.currentAudioStream\n if (!audioStream || audioStream.id === id || curStream.audioStreams.length < 2) return\n const toSwitch = curStream.audioStreams.find(x => x.id === id)\n if (!toSwitch) return\n\n try {\n await this._clear()\n if (force) await this._bufferService.clearAllBuffer()\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n\n curStream.currentAudioStream = toSwitch\n\n try {\n if (this.isLive || !toSwitch.segments.length) await this._refreshM3U8()\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(this.media.currentTime) || 0)\n this._prevSegCc = null\n await this._loadSegmentDirect()\n } catch (error) {\n curStream.currentAudioStream = audioStream\n throw error\n }\n\n this._startTick()\n return toSwitch\n }\n\n async switchSubtitleStream (lang) {\n this._playlist.switchSubtitle(lang)\n await this._manifestLoader.stopPoll()\n await this._refreshM3U8()\n }\n\n async destroy () {\n if (!this.media) return\n this.removeAllListeners()\n this._playlist.reset()\n this._segmentLoader.reset()\n this._seiService?.reset()\n this.media.removeEventListener('play', this._onPlay)\n this.media.removeEventListener('pause', this._onPause)\n this.media.removeEventListener('seeking', this._onSeeking)\n this.media.removeEventListener('timeupdate', this._onTimeupdate)\n await Promise.all([this._clear(), this._bufferService.destroy()])\n this.media = null\n }\n\n /**\n * @param {('video'|'audio')?} mediaType\n * @returns {Boolean}\n */\n static isSupported (mediaType) {\n if (!mediaType || mediaType === 'video' || mediaType === 'audio') {\n return MSE.isSupported()\n }\n\n return typeof WebAssembly !== 'undefined'\n }\n\n static enableLogger () {\n Logger.enable()\n TransmuxerLogger.enable()\n }\n\n static disableLogger () {\n Logger.disable()\n TransmuxerLogger.disable()\n }\n\n /**\n * @private\n */\n async _loadM3U8 (url) {\n let playlist\n try {\n const manifest = this.config.manifestList?.filter(x => x.url === url)[0]?.manifest;\n\n [playlist] = manifest\n ? this._manifestLoader.parseText(manifest, url) :\n await this._manifestLoader.load(url)\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n if (!playlist) return\n this._playlist.upsertPlaylist(playlist)\n\n if (playlist.isMaster) {\n if (this._playlist.currentStream.subtitleStreams?.length) {\n this.emit(Event.SUBTITLE_PLAYLIST, {\n list: this._playlist.currentStream.subtitleStreams\n })\n }\n await this._refreshM3U8()\n }\n this.emit(Event.STREAM_PARSED)\n return playlist\n }\n\n /**\n * @private 首次更新 master playlist 的 media level\n */\n _refreshM3U8 () {\n const stream = this._playlist.currentStream\n if (!stream || !stream.url) throw this._emitError(StreamingError.create(null, null, new Error('m3u8 url is not defined')))\n const url = stream.url\n const audioUrl = stream.currentAudioStream?.url\n const subtitleUrl = stream.currentSubtitleStream?.url\n return this._manifestLoader.load(url, audioUrl, subtitleUrl).then(([mediaPlaylist, audioPlaylist, subtitlePlaylist]) => {\n if (!mediaPlaylist) return\n this._playlist.upsertPlaylist(mediaPlaylist, audioPlaylist, subtitlePlaylist)\n if (!this.isLive) return\n this._pollM3U8(url, audioUrl, subtitleUrl)\n }).catch(err => {\n throw this._emitError(StreamingError.create(err))\n })\n }\n\n /**\n * @private\n */\n _pollM3U8 (url, audioUrl, subtitleUrl) {\n let isEmpty = this._playlist.isEmpty\n this._manifestLoader.poll(\n url,\n audioUrl,\n subtitleUrl,\n (p1, p2, p3) => {\n this._playlist.upsertPlaylist(p1, p2, p3)\n this._playlist.clearOldSegment()\n if (p1 && isEmpty && !this._playlist.isEmpty) {\n this._loadSegment()\n }\n if (isEmpty) isEmpty = this._playlist.isEmpty\n }, (err) => {\n this._emitError(StreamingError.create(err))\n },\n // 刷新时间\n (this._playlist.lastSegment?.duration || 0) * 1000)\n }\n\n /**\n * @private\n */\n _loadSegment = async () => {\n if (this._segmentProcessing || !this.media) return\n const nextSeg = this._playlist.nextSegment\n\n if (!nextSeg) return\n\n if (!this.isLive) {\n const bInfo = this.bufferInfo()\n const bufferThroughout = Math.abs(bInfo.end - this.media.duration) < 0.1\n if (bInfo.remaining >= this.config.preloadTime || bufferThroughout) {\n if (bufferThroughout && this._bufferService.msIsOpend) {\n this._bufferService.endOfStream()\n }\n return\n }\n\n // reset segment pointer by buffer end\n if (!this._urlSwitching &&\n this._prevSegSn !== nextSeg.sn - 1 &&\n bInfo.end &&\n Math.abs(nextSeg.start - bInfo.end) > 1) {\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(bInfo.end + 0.1))\n }\n }\n\n return this._loadSegmentDirect()\n }\n\n\n /**\n * @private\n */\n async _loadSegmentDirect (loadOnce) {\n const seg = this._playlist.nextSegment\n if (!seg) return\n\n let appended = false\n let cachedError = null\n try {\n this._segmentProcessing = true\n appended = await this._reqAndBufferSegment(seg, this._playlist.getAudioSegment(seg))\n } catch (error) {\n // If an exception is thrown here, other reference functions\n // need to handle the exception, so the error stops here\n cachedError = error\n } finally {\n this._segmentProcessing = false\n }\n\n if (cachedError) {\n return this._emitError(StreamingError.create(cachedError))\n }\n if (appended) {\n if (this._urlSwitching) {\n this._urlSwitching = false\n this.emit(Event.SWITCH_URL_SUCCESS, { url: this.config.url })\n }\n\n this._playlist.moveSegmentPointer()\n if (seg.isLast) {\n this._end()\n } else if (!loadOnce) {\n this._loadSegment()\n }\n }\n\n return appended\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {MediaSegment} audioSeg\n * @private\n */\n async _reqAndBufferSegment (seg, audioSeg) {\n const cc = seg ? seg.cc : audioSeg.cc\n const discontinuity = this._prevSegCc !== cc\n let responses = []\n try {\n responses = await this._segmentLoader.load(seg, audioSeg, discontinuity)\n } catch (e) {\n e.fatal = false\n this._segmentLoader.error = e\n throw e\n }\n if (!responses[0]) return\n const data = await this._bufferService.decryptBuffer(...responses)\n if (!data) return\n const sn = seg ? seg.sn : audioSeg.sn\n const start = seg ? seg.start : audioSeg.start\n const stream = this._playlist.currentStream\n this._bufferService.createSource(data[0], data[1], stream?.videoCodec, stream?.audioCodec)\n const before = Date.now()\n await this._bufferService.appendBuffer(seg, audioSeg, data[0], data[1], discontinuity, this._prevSegSn === sn - 1, start)\n this.emit(Event.APPEND_COST, {elapsed: Date.now() - before, url: seg.url})\n await this._bufferService.evictBuffer(this.config.bufferBehind)\n this._prevSegCc = cc\n this._prevSegSn = sn\n return true\n }\n\n /**\n * @private\n */\n _onPlay = async () => {\n clearTimeout(this._disconnectTimer)\n if (this._reloadOnPlay) {\n this._reloadOnPlay = false\n this.replay(true)\n } else {\n await this._loadSegment()\n this._startTick()\n }\n }\n\n /**\n * @private\n */\n _onPause = () => {\n if (this.isLive) {\n if (!this._reloadOnPlay) {\n let { disconnectTime } = this.config\n if (disconnectTime === null || disconnectTime === undefined) disconnectTime = this._playlist.dvrWindow\n if (!Number.isFinite(disconnectTime)) return\n clearTimeout(this._disconnectTimer)\n this._disconnectTimer = setTimeout(() => {\n this._reloadOnPlay = true\n this._clear()\n }, disconnectTime || 0)\n }\n } else {\n this._stopTick()\n }\n }\n\n /**\n * @private\n */\n _onSeeking = async () => {\n if (!this.media) return\n\n const seekTime = this.media.currentTime\n const seekRange = this._playlist.seekRange\n\n if (seekRange) {\n const newSeekTime = clamp(seekTime, seekRange[0], this.isLive ? seekRange[1] : this.media.duration)\n if (\n // if newSeekTime less than 0, media.currentTime will be 0, this causes an infinite loop\n newSeekTime >= 0 &&\n Math.abs(seekTime - newSeekTime) >= 0.1\n ) {\n this.media.currentTime = newSeekTime\n return\n }\n }\n\n const curSeg = this._playlist.currentSegment\n const info = Buffer.info(Buffer.get(this.media), seekTime, 0.1)\n if (curSeg) {\n if (info.end && Math.abs(info.end - curSeg.end) < 0.2) return\n }\n\n const segIndex = this._playlist.findSegmentIndexByTime(seekTime)\n const seg = this._playlist.getSegmentByIndex(segIndex)\n if (segIndex === null || segIndex === undefined || !seg || (this._segmentProcessing && seg === this._playlist.nextSegment)) return\n\n logger.debug('seek to', seekTime, seg)\n\n this._playlist.setNextSegmentByIndex(segIndex)\n\n this._stopTick()\n await this._segmentLoader.cancel()\n this._segmentProcessing = false\n if (!info.end || this.isLive) {\n await this._loadSegmentDirect(true)\n }\n this._startTick()\n }\n\n /**\n * @private\n */\n _onTimeupdate = () => {\n if (!this.media) return\n const cfg = this.config\n if (cfg.isLive && cfg.maxLatency && cfg.targetLatency && this.media) {\n const liveEdge = this._playlist.liveEdge\n if (!liveEdge) return\n const latency = liveEdge - this.media.currentTime\n if (latency >= cfg.maxLatency) {\n logger.debug(`latency jump, currentTime:${this.media.currentTime}, liveEdge:${liveEdge}, latency=${latency}`)\n this.media.currentTime = liveEdge - cfg.targetLatency\n }\n }\n\n if (cfg.seiInTime) {\n this._seiService?.throw(this.media.currentTime)\n }\n\n if (this.config.allowedStreamTrackChange && !this.config.softDecode) {\n this._checkStreamTrackChange(this.media.currentTime)\n }\n\n }\n\n _checkStreamTrackChange (time) {\n const changedSeg = this._playlist.checkSegmentTrackChange(time, this._bufferService.nbSb)\n if (!changedSeg) return\n this.switchURL(this.config.url, changedSeg.start + 0.2)\n }\n\n /**\n * @private\n */\n async _clear () {\n clearTimeout(this._disconnectTimer)\n this._stopTick()\n await Promise.all([\n this._segmentLoader.cancel(),\n this._manifestLoader.stopPoll()\n ])\n this._segmentProcessing = false\n }\n\n /**\n * @private\n */\n async _reset (reuseMse = false) {\n this._reloadOnPlay = false\n this._prevSegSn = null\n this._prevSegCc = null\n this._switchUrlOpts = null\n this._playlist.reset()\n this._segmentLoader.reset()\n this._seiService?.reset()\n this._stats.reset()\n await this._clear()\n return this._bufferService.reset(reuseMse)\n }\n\n /**\n * @private\n */\n _end () {\n this._clear()\n this._bufferService.endOfStream()\n if (this.media.readyState <= 2 || this.media.buffered.length > 1) {\n this._startTick()\n }\n }\n\n /**\n * @private\n */\n _stopTick () {\n if (this._tickTimer) {\n clearTimeout(this._tickTimer)\n }\n this._tickTimer = null\n }\n\n /**\n * @private\n */\n _startTick () {\n this._stopTick()\n this._tickTimer = setTimeout(this._tick, this._tickInterval)\n }\n\n /**\n * @private\n */\n _tick = () => {\n if (!this.media) return\n this._startTick()\n const media = this.media\n const buffered = Buffer.get(media)\n const segLoaderError = this._segmentLoader.error\n\n if (segLoaderError) {\n // Compatible with the case where the buffer does not start from 0\n const bufferMaxHoleTolerance = 0.5\n\n if (!media.readyState || this.bufferInfo(bufferMaxHoleTolerance).remaining < 1) {\n segLoaderError.fatal = true\n this._emitError(StreamingError.network(segLoaderError))\n }\n return\n }\n\n if (Buffer.end(buffered) < 0.1 || !media.readyState) return\n\n if (isMediaPlaying(media)) {\n this._loadSegment()\n if (this._gapService) {\n this._gapService.do(media, this.config.maxJumpDistance, this.isLive)\n }\n } else {\n if (media.readyState < 2 && this._gapService) {\n this._gapService.do(media, this.config.maxJumpDistance, !media.currentTime ? true : this.isLive)\n }\n }\n }\n\n /**\n * @param {StreamingError} error\n * @param {boolean?} endOfStream\n * @private\n */\n _emitError (error, endOfStream = false) {\n if (error.originError?.fatal === false) {\n logger.warn(error)\n } else {\n logger.table(error)\n logger.error(error)\n logger.error(this.media?.error)\n\n if (this.media?.readyState) {\n this.media.pause()\n }\n this._stopTick()\n if (this._urlSwitching) {\n this._urlSwitching = false\n this.emit(Event.SWITCH_URL_FAILED, error)\n }\n this.emit(Event.ERROR, error)\n if (endOfStream) this._end()\n this._seiService?.reset()\n }\n return error\n }\n\n /**\n * @private\n */\n _getSeamlessSwitchPoint () {\n const { media } = this\n let nextLoadPoint = media.currentTime\n if (!media.paused) {\n const segIdx = this._playlist.findSegmentIndexByTime(media.currentTime)\n const curSeg = this._playlist.getSegmentByIndex(segIdx)\n const latestKbps = this._stats?.getStats().downloadSpeed // latest download speed\n if (latestKbps && curSeg) {\n const delay = (curSeg.duration * this._playlist.currentStream.bitrate) / latestKbps + 1\n\n nextLoadPoint += delay\n } else {\n nextLoadPoint += 5\n }\n }\n\n return nextLoadPoint\n }\n}\n\ntry {\n if (localStorage.getItem('xgd')) {\n Hls.enableLogger()\n } else {\n Hls.disableLogger()\n }\n} catch (error) {\n // ignore\n}\n","/**\n * @typedef {{\n * media: HTMLMediaElement,\n * url?: string,\n * isLive?: boolean,\n * softDecode?: boolean,\n * targetLatency?: number,\n * maxPlaylistSize?: number,\n * maxLatency?: number,\n * bufferBehind?: number,\n * maxJumpDistance?: number,\n * startTime?: number,\n * retryCount?: number,\n * retryDelay?: number,\n * loadTimeout?: number,\n * preloadTime?: number,\n * disconnectTime?: number,\n * allowedStreamTrackChange?: boolean,\n * seiInTime?: boolean,\n * manifestList?: Array<{url: string, manifest: string}>\n * fetchOptions?: RequestInit\n * onPreM3U8Parse?: (m3u8: string) => string | void\n * decryptor?: Decryptor\n * }} HlsOption\n */\n\n/**\n * @param {HlsOption} cfg\n * @returns {HlsOption}\n */\nexport function getConfig (cfg) {\n const media = cfg?.media || document.createElement('video')\n return {\n maxPlaylistSize: 50,\n retryCount: 3,\n retryDelay: 1000,\n pollRetryCount: 2,\n loadTimeout: 10000,\n preloadTime: 30,\n softDecode: false,\n bufferBehind: 10,\n maxJumpDistance: 3,\n startTime: 0,\n targetLatency: 10,\n maxLatency: 20,\n allowedStreamTrackChange: true,\n seiInTime: false,\n manifestList: [],\n ...cfg,\n media\n }\n}\n","import { Event } from './hls/constants'\n\nexport default class PluginExtension {\n _opts = null\n _plugin = null\n\n constructor (opts, plugin) {\n this._opts = opts\n this._plugin = plugin\n this._init()\n }\n\n _init () {\n const { media, preloadTime, innerDegrade, isLive } = this._opts\n\n if (!media) return\n\n if (!isLive && media.setPlayMode) {\n media.setPlayMode('VOD')\n return\n }\n\n if (innerDegrade) {\n media.setAttribute('innerdegrade', innerDegrade)\n }\n if (preloadTime) {\n media.setAttribute('preloadtime', preloadTime)\n }\n\n this._bindEvents()\n }\n\n _bindEvents () {\n const { media } = this._opts\n\n media.addEventListener('lowdecode', this._onLowDecode)\n }\n\n _onLowDecode = () => {\n const { media, innerDegrade } = this._opts\n\n this._plugin?.player?.emit('lowdecode', media.degradeInfo)\n this._plugin?.player?.emit('core_event', {\n ...media.degradeInfo,\n eventName: Event.LOWDECODE\n })\n\n if (innerDegrade === 1) {\n this._degrade(media.src)\n }\n }\n\n /**\n * @param {string | undefined} url\n */\n _degrade = (url) => {\n const { player } = this._plugin\n const originVideo = player.video\n\n if (originVideo && originVideo.TAG !== 'MVideo') return\n\n const newVideo = player.video.degradeVideo\n\n player.video = newVideo\n\n originVideo.degrade(url)\n\n if (url) {\n player.config.url = url\n }\n\n // replace live-video to video element\n const firstChild = player.root.firstChild\n\n if (firstChild.TAG === 'MVideo') {\n player.root.replaceChild(newVideo, firstChild)\n }\n const hlsPlugin = this._plugin.constructor.pluginName.toLowerCase()\n player.unRegisterPlugin(hlsPlugin)\n\n // play\n player.once('canplay', () => {\n player.play()\n })\n }\n\n forceDegradeToVideo = (url) => {\n const { innerDegrade } = this._opts\n\n // 降级to video+m3u8\n if (innerDegrade === 1) {\n this._degrade(url)\n }\n }\n\n destroy () {\n this._opts?.media?.removeEventListener('lowdecode', this._onLowDecode)\n this._plugin = null\n }\n}\n","import { BasePlugin, Events, Errors } from 'xgplayer'\nimport { EVENT } from 'xgplayer-streaming-shared'\nimport { Hls } from './hls'\nimport { Event } from './hls/constants'\nimport PluginExtension from './plugin-extension'\n\nexport function parseSwitchUrlArgs (args, plugin) {\n const { player } = plugin\n const curTime = player.currentTime\n const options = {\n startTime: curTime\n }\n\n switch (typeof args) {\n case 'boolean':\n options.seamless = args\n break\n case 'object':\n Object.assign(options, args)\n break\n default:\n break\n }\n return options\n}\n\nexport class HlsPlugin extends BasePlugin {\n static Hls = Hls\n\n static EVENT = Event\n\n /**\n * @type {Hls}\n */\n hls = null\n\n pluginExtension = null\n\n static get pluginName () {\n return 'hls'\n }\n\n get core () {\n return this.hls\n }\n\n get version () {\n return this.hls?.version\n }\n\n get softDecode () {\n const mediaType = this.player?.config?.mediaType\n return !!mediaType && mediaType !== 'video' && mediaType !== 'audio'\n }\n\n beforePlayerInit () {\n const config = this.player.config\n\n if (!config.url &&\n // private config key\n !config.__allowHlsEmptyUrl__) {\n return\n }\n\n if (this.hls) this.hls.destroy()\n this.player.switchURL = this._onSwitchURL\n\n const hlsOpts = config.hls || {}\n hlsOpts.innerDegrade = hlsOpts.innerDegrade || config.innerDegrade\n if (hlsOpts.disconnectTime === null || hlsOpts.disconnectTime === undefined) hlsOpts.disconnectTime = 0\n\n this.hls = new Hls({\n softDecode: this.softDecode,\n isLive: config.isLive,\n media: this.player.media || this.player.video,\n startTime: config.startTime,\n url: config.url,\n ...hlsOpts\n })\n\n if (!this.softDecode) {\n BasePlugin.defineGetterOrSetter(this.player, {\n url: {\n get: () => this.hls?.media?.src,\n configurable: true\n }\n })\n }\n\n if (this.softDecode) {\n this.pluginExtension = new PluginExtension({\n isLive: config.isLive,\n media: this.player.video,\n ...hlsOpts\n }, this)\n this.player.forceDegradeToVideo = (...args) => this.pluginExtension?.forceDegradeToVideo(...args)\n }\n\n if (config.isLive) {\n // This is a heavy operation for the vod flow, which may cause seeked event never emit\n this.player?.useHooks('replay', () => this.hls?.replay())\n }\n\n this.on(Events.SWITCH_SUBTITLE || 'switch_subtitle', this._onSwitchSubtitle)\n this.on(Events.URL_CHANGE, this._onSwitchURL)\n this.on(Events.DESTROY, this.destroy.bind(this))\n\n this._transError()\n this._transCoreEvent(EVENT.TTFB)\n this._transCoreEvent(EVENT.LOAD_START)\n this._transCoreEvent(EVENT.LOAD_RESPONSE_HEADERS)\n this._transCoreEvent(EVENT.LOAD_COMPLETE)\n this._transCoreEvent(EVENT.LOAD_RETRY)\n this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED)\n this._transCoreEvent(EVENT.REMOVE_BUFFER)\n this._transCoreEvent(EVENT.BUFFEREOS)\n this._transCoreEvent(EVENT.KEYFRAME)\n this._transCoreEvent(EVENT.METADATA_PARSED)\n this._transCoreEvent(EVENT.DEMUXED_TRACK)\n this._transCoreEvent(EVENT.SEI)\n this._transCoreEvent(EVENT.SEI_IN_TIME)\n this._transCoreEvent(EVENT.SPEED)\n this._transCoreEvent(EVENT.HLS_MANIFEST_LOADED)\n this._transCoreEvent(EVENT.HLS_LEVEL_LOADED)\n this._transCoreEvent(EVENT.STREAM_EXCEPTION)\n this._transCoreEvent(EVENT.SWITCH_URL_SUCCESS)\n this._transCoreEvent(EVENT.SWITCH_URL_FAILED)\n this._transCoreEvent(Event.NO_AUDIO_TRACK)\n this._transCoreEvent(Event.STREAM_PARSED)\n this._transCoreEvent(Event.SUBTITLE_SEGMENTS)\n this._transCoreEvent(Event.SUBTITLE_PLAYLIST)\n this._transCoreEvent(Event.APPEND_COST)\n\n if (config.url) {\n this.hls.load(config.url, true).catch(e => {})\n }\n }\n\n /**\n * It needs to be supported as a subclass to be inherited externally, so don't write it as an attribute here\n */\n destroy () {\n if (this.hls) {\n this.hls.destroy()\n this.hls = null\n }\n\n this.pluginExtension?.destroy()\n this.pluginExtension = null\n }\n\n /**\n * @returns {import('./hls').Stats | undefined}\n */\n getStats = () => {\n return this.hls?.getStats()\n }\n\n\n /**\n * @param {string | boolean} [mediaType]\n * @param {string} [codec]\n * @returns {boolean}\n * - mediaType: 默认检测 MSE 对 H264 codec是否支持,传入 true 或者配置参数的mediaType的取值检测 WebAssembly是否支持\n * - codec: 暂无使用\n */\n static isSupported (mediaType, codec) {\n return Hls.isSupported(mediaType, codec)\n }\n\n _onSwitchSubtitle = ({lang}) => {\n this.hls?.switchSubtitleStream(lang)\n }\n\n _onSwitchURL = (url, args) => {\n const { player, hls } = this\n if (hls) {\n const options = parseSwitchUrlArgs(args, this)\n player.config.url = url\n hls.switchURL(url, options).catch(e => {})\n\n if (!options.seamless && this.player.config?.hls?.keepStatusAfterSwitch) {\n this._keepPauseStatus()\n }\n }\n }\n\n _keepPauseStatus = () => {\n const paused = this.player.paused\n if (!paused) return\n this.player.once('canplay', () => {\n this.player.pause()\n })\n }\n\n _transError () {\n this.hls.on(Event.ERROR, (err) => {\n if (this.player) {\n this.player.emit(Events.ERROR, new Errors(this.player, err))\n }\n })\n }\n\n _transCoreEvent (eventName) {\n this.hls.on(eventName, (e) => {\n if (this.player) {\n this.player.emit('core_event', {\n ...e,\n eventName\n })\n\n if (eventName === EVENT.SEI_IN_TIME && this.hls.hasSubtitle) {\n this._emitSeiPaylodTime(e)\n }\n }\n })\n }\n\n _emitSeiPaylodTime (e) {\n try {\n const seiJson = JSON.parse(Array.from(e.data.payload).map(x=>String.fromCharCode(x)).join('').slice(0,-1))\n if (!seiJson['rtmp_dts']) return\n this.player.emit('core_event', {\n eventName: Event.SEI_PAYLOAD_TIME,\n time: seiJson['rtmp_dts']\n })\n } catch (e) {}\n }\n\n}\n"],"names":["createPublicPromise","res","rej","promise","Promise","resolve","reject","used","apply","arguments","nowTime","parseInt","performance","now","e","Date","getTime","Buffer","_classCallCheck","key","value","buf","length","end","start","b","buffered","error","maxHole","buffers","i","l","bufLen","last","lastEnd","push","reduce","a","c","pos","undefined","index","nextStart","nextEnd","prevStart","prevEnd","item","currentTime","behind","remaining","totalLength","ERR","FLV","HLS","MP4","FMP4","MSE_ADD_SB","MSE_APPEND_BUFFER","MSE_OTHER","MSE_FULL","OPTION","DASH","LICENSE","CUSTOM_LICENSE","MSE_HIJACK","EME_HIJACK","SIDX","NO_CANPLAY_ERROR","BUFFERBREAK_ERROR","WAITING_TIMEOUT_ERROR","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_CODEC_NOT_SUPPORTED","MEDIA_ERR_URL_EMPTY","ERR_CODE","_defineProperty","_ERR_CODE","StreamingError","_Error","_inherits","_super","_createSuper","type","subType","origin","payload","msg","_this","call","message","errorType","originError","ext","errorCode","errorMessage","Error","_error$response","isTimeout","url","response","httpCode","status","isBrowser","window","LogCacheLevel","DEBUG","LOG","WARN","ERROR","SIMPLE_TYPE","Logger","name","config","this","_prefix","concat","logCacheLevel","logMaxSize","logSize","logTextArray","_createClass","_console","_len","args","Array","_key","logCache","disabled","console","debug","_console2","_len2","_key2","log","_console3","_len3","_key3","warn","_console4","_len4","_key4","text","_len5","logText","_key5","finLogText","map","logable","JSON","stringify","delLog","shift","join","reset","_console5","group","table","groupEnd","val","toLocaleString","reduceDepth","_typeof","objType","Object","prototype","toString","slice","obj","maxDepth","depth","result","includes","hasOwnProperty","MediaSource","getMediaSource","OP_NAME","MSE","media","_this2","create","queue","_queue","op","opName","costtime","_opst","_logger","context","_startQueue","event","_config","assign","getDefaultConfig","bindMedia","openLog","enable","_enqueueBlockingOp2","_unbindMedia","_bindMedia","get","_this$mediaSource","mediaSource","readyState","_url","_this$mediaSource2","duration","_mseFullFlag","VIDEO","_this3","isReduceDuration","bufferEnd","keys","_sourceBuffer","forEach","k","Math","max","_enqueueBlockingOp","isEnded","_this4","_openPromise","isOpened","ms","addEventListener","onOpen","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_this5","wrap","_context","prev","next","unbindMedia","revokeObjectURL","src","URL","createObjectURL","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this6","_context2","t","x","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this7","changeType","_enqueueOp","createSource","buffer","_this8","byteLength","_this8$_sourceBuffer$","appendBuffer","startTime","endTime","_this9","isInsertHead","remove","p","_this10","_this11","allClear","_this$_queue$type","initOpque","isinit","reason","_this12","setLiveSeekableRange","exec","_this13","splice","then","_callee3","types","waiters","_this14","_context3","prom","all","updating","_x2","_x3","_x4","indexOf","timestampOffset","_this15","_this16","abort","mime","isTypeSupported","LoaderType","ResponseType","NetError","request","_assertThisInitialized","isPlainObject","getPrototypeOf","getRangeValue","ret","encode","encodeURIComponent","replace","setUrlParams","params","v","str","isArray","toISOString","isObject","filter","Boolean","hashIndex","createResponse","data","done","contentLength","age","firstByteTime","range","vid","priOptions","parseFloat","Number","isNaN","options","calculateSpeed","byteLen","millisec","round","EVENT","TTFB","LOAD_START","LOAD_RESPONSE_HEADERS","LOAD_COMPLETE","LOAD_RETRY","SOURCEBUFFER_CREATED","ANALYZE_DURATION_EXCEEDED","REMOVE_BUFFER","BUFFEREOS","KEYFRAME","METADATA_PARSED","SEI","SEI_IN_TIME","FLV_SCRIPT_DATA","LOWDECODE","SWITCH_URL_SUCCESS","SWITCH_URL_FAILED","SPEED","HLS_MANIFEST_LOADED","HLS_LEVEL_LOADED","DEMUXED_TRACK","STREAM_EXCEPTION","LARGE_AV_FIRST_FRAME_GAP_DETECT","LARGE_VIDEO_DTS_GAP_DETECT","LARGE_AUDIO_DTS_GAP_DETECT","AUDIO_GAP_DETECT","AUDIO_OVERLAP_DETECT","MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT","REAL_TIME_SPEED","has","prefix","Events","EE","fn","once","addListener","emitter","TypeError","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","ee","listenerCount","emit","a1","a2","a3","a4","a5","len","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","CACHESIZE","FetchLoader","_EventEmitter","_cancel","_ref","_this$_abortControlle","timeout","responseType","onProgress","onTimeout","onCancel","transformResponse","logger","method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","onProcessMinLen","_aborted","_onProcessMinLen","_onCancel","_abortController","AbortController","_running","_index","_range","_vid","_priOptions","init","signal","clearTimeout","_timeoutTimer","rangeValue","Headers","append","Range","setTimeout","cancel","fetch","_ref2","costTime","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","Uint8Array","time","catch","_error","_reader","t0","st","getReader","err","_cache","_writeIdx","reader","pump","_ref3","_this3$_range","startRange","startByte","curLen","retData","temp","read","_receivedLength","set","XhrLoader","req","_onProgress","_headers","_withCredentials","_body","_method","_timeout","_runing","_responseType","_firstRtt","_onTimeout","_request","_loadCompleteResolve","_loadCompleteReject","_startLoad","chunkSize","_currentChunkSizeKB","from","to","_internalOpen","_startTime","xhr","_xhr","XMLHttpRequest","open","withCredentials","onload","_onLoad","onreadystatechange","_onReadyStatechange","onerror","errorEvent","_errorEvent$currentTa","_errorEvent$currentTa2","_errorEvent$currentTa3","currentTarget","statusText","ontimeout","setRequestHeader","send","target","_this$_range","_objectSpread","byteStart","_this$_range2","chunk","responseURL","_getHeaders","_transformResponse","_getPrototypeOf","_step","_iterator","_createForOfIteratorHelper","getAllResponseHeaders","trim","split","s","n","parts","toLowerCase","f","Task","alive","_loaderType","_loader","_retryCount","_retryTimer","_canceled","_retryCheckFunc","retryCheckFunc","_this$_config","retry","retryDelay","onRetryError","transformError","rest","_objectWithoutProperties","_excluded","isRetry","running","loaderType","retryCount","concatUint8Array","arr","prevLen","d","sleep","NetLoader","cfg","transformRequest","integrity","getConfig","isSupported","task","loader","_currentTask","_processTask","cancels","_alive","finally","_this3$_currentTask","_this3$_alive","GapService","maxJumpDistance","isLive","seekThreshold","jumpTo","_prevCurrentTime","info","seeking","SeiService","Set","sei","_seiSet","add","size","min","toThrow","delete","clear","BandwidthService","totalByte","_speeds","_chunkSpeeds","Stats","timescale","_timescale","encodeType","audioCodec","videoCodec","domain","fps","bitrate","width","height","samplerate","channelCount","gop","_data$onMetaData","onMetaData","framerate","track","codec","codecType","fpsNum","fpsDen","sampleRate","responseUrl","samples","sample","gopId","_bitsAccumulateDuration","_bitsAccumulateSize","units","MediaStatsService","core","_core","_stats","_bindEvents","_this$_core","_this$_core2","_this$_core2$speedInf","_this$_core3","_this$_core3$speedInf","_this$_core4","_this$_core4$bufferIn","_ref2$currentTime","_ref2$decodeFps","decodeFps","getStats","downloadSpeed","speedInfo","avgSpeed","bufferInfo","videoTrack","updateBitrate","setFpsFromScriptData","setVideoMeta","setAudioMeta","setDomain","_samples","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","sequenceNumber","baseMediaDecodeTime","present","pid","pps","sps","vps","sarRatio","warnings","hvcC","isVideoEncryption","AudioTrack","sampleDuration","isAudioEncryption","VideoSample","pts","dts","originPts","originDts","keyframe","flag","dependsOn","isNonSyncSample","AudioSample","sampleOffset","Sample","FlvScriptSample","_Sample","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","_data","_bytesAvailable","_loadWord","position","availableBytes","workingBytes","subarray","_word","DataView","getUint32","_bitsAvailable","count","skipBytes","floor","bits","readBits","leadingZeroCount","skipLZ","skipBits","clz","readUEG","lastScale","nextScale","readEG","UTF8","uint8array","out","input","String","fromCharCode","_checkContinuation","ucs4","_ucs2","checkLength","array","ua","navigator","userAgent","toLocaleLowerCase","isSafari","test","isFirefox","isAndroid","MAX_SIZE","pow","readBig16","readBig32","readBig64","getAvcCodec","codecs","h","parse","NALu","offset","dataLen","unit","isHevc","uuid","uint","emulationPreventionBytesPositions","newLength","newData","sourceIndex","AVC","nalUnitSize","spsParsed","spsSize","spsArr","ppsArr","spsCount","parseSPS","removeEPB","ppsSize","ppsCount","eg","readUByte","profileIdc","profileCompatibility","levelIdc","skipUEG","chromaFormat","chromaFormatIdc","readBool","scalingListCount","skipScalingList","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","fixedFrame","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","AAC","rate","FREQ","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","HEVC","vpsParsed","nalUnitType","numNalus","nalSize","vpsArr","numOfArrays","parseVPS","vpsMaxSubLayersMinus1","numTemporalLayers","_parseProfileTierLevel","spsMaxSubLayersMinus1","temporalIdNested","separateColourPlaneFlag","confWinLeftOffset","confWinRightOffset","confWinTopOffset","confWinBottomOffset","conformanceWindowFlag","bitDepthLumaMinus8","bitDepthChromaMinus8","subWidthC","subHeightC","maxSubLayersMinus1","generalTierFlag","generalProfileSpace","generalProfileIdc","generalProfileCompatibilityFlags","generalConstraintIndicatorFlags","generalLevelIdc","subLayerProfilePresentFlag","subLayerLevelPresentFlag","MAX_SILENT_FRAME_DURATION","AUDIO_EXCETION_LOG_EMIT_DURATION","FlvFixer","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","discontinuity","contiguous","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","refSampleDurationInt","first","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","_getG711Duration","sampleDurationInSampleRate","nextPts","silentFrame","_getSilentFrame","silentSample","sampleSize","getSilentFrame","AMF","_parseValue","byteOffset","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","getInt16","decode","getUint16","FlvDemuxer","_fixer","_remainingData","_headerParsed","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","_parseAac","_parseG711","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","packetType","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","setToKeyframe","parseSEI","_gopId","hevc","_needAddMetaBeforeKeyFrameNal","MAX_VIDEO_FRAME_DURATION","TsFixer","vSamples","aSamples","firstVideoSample","firstAudioSample","vaDelta","vDeltaToNextDts","aDeltaToNextDts","expectFragEnd","_audioLastSample","TsDemuxer","_pmtId","_remainingPacketData","_videoPesData","_audioPesData","remainingLength","videoPid","audioPid","payloadUnitStartIndicator","adaptationFiledControl","tableEnd","programInfoLength","esPid","_parseVideoData","_parseAudioData","pes","_parsePES","_toConsumableArray","parseAnnexB","_createVideoSample","spsInfo","_pushVideoSample","_parseAacData","_track$samples","parseADTS","headerDataLen","pesLen","ptsDtsFlags","MP4Parser","headerSize","subData","findBox","box","parseBox","trackId","baseDataOffsetPresent","flags","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","baseDataOffset","sampleDescriptionIndex","defaultSampleDuration","defaultSampleSize","defaultSampleFlags","reference_ID","version","earliest_presentation_time","first_offset","references","ref","tmp32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","mvhd","trak","pssh","nextTrackId","tkhd","mdia","mdhd","hdlr","minf","lang","language","handlerType","vmhd","smhd","stbl","graphicsmode","opcolor","balance","_ret$stsd$entries$","_ret$stsd$entries$$si","_ret$stsd$entries$$si2","stsd","stts","ctts","stsc","stsz","stco","co64","default_IV_size","entries","sinf","schi","tenc","stss","senc","iv","sampleCount","InitializationVector","subsamples","subsampleCount","subsample","BytesOfClearData","BytesOfProtectedData","keyIds","systemId","toHex","numKeyIds","keyId","data_size","kid","system_id","entryCount","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","bodyStart","parseVisualSampleEntry","configurationVersion","AVCProfileIndication","AVCLevelIndication","lengthSizeMinusOne","spsLength","ppsLength","tmp","generalProfileCompatibility","avgFrameRate","_ret$vps","nalus","_ret$sps","_ret$pps","hSpacing","vSpacing","parseAudioSampleEntry","byteRead","tag","substring","padStart","firstChunk","samplesPerChunk","entrySizes","mfhd","traf","tfhd","tfdt","trun","dataOffset","firstSampleFlags","isLeading","isDependedOn","hasRedundancy","paddingValue","degradationPriority","moov","_e$esds","_e$esds2","tracks","vTrack","find","_t$mdia","_t$mdia$hdlr","aTrack","_t$mdia2","_t$mdia2$hdlr","_vTrack$tkhd","_vTrack$mdia","_vTrack$mdia$minf","_vTrack$mdia$minf$stb","_vTrack$mdia2","_vTrack$mdia2$minf","_vTrack$mdia2$minf$st","_vTrackId","id","tkhdDuration","mvhdDurtion","mvhdTimecale","_e1$sinf","_e1$sinf$schi","_e1$sinf2","_e1$sinf2$schi","_e1$sinf3","_e1$sinf3$schi","_e1$sinf4","_e1$sinf4$frma","e1","videoSenc","useEME","kidValue","encv","_aTrack$tkhd","_e$esds3","_e$esds4","_aTrack$mdia","_aTrack$mdia$minf","_aTrack$mdia$minf$stb","_aTrack$mdia2","_aTrack$mdia2$minf","_aTrack$mdia2$minf$st","_aTrackId","_e$sinf","_e$sinf$frma","_e$sinf2","_e$sinf2$schi","_e$sinf3","_e$sinf3$schi","_e$sinf4","_e$sinf4$schi","getRateIndexByRate","audioSenc","enca","_videoTrack$encv","_audioTrack$enca","vkid","akid","videoSampleCount","_audioTrack$samples","audioSampleCount","moof","defaultSize","defaultDuration","evaluateDefaultDuration","_t$mdia3","_t$mdia3$hdlr","_t$mdia4","_t$mdia4$hdlr","videoSamples","audioSamples","_vTrack$mdia3","_vTrack$mdia3$minf","videoStbl","getSamples","_aTrack$mdia3","_aTrack$mdia3$minf","_aTrack$mdia$mdhd","audioStbl","keyframeMap","cttsArr","cttsEntries","stscEntries","stcoEntries","stszEntrySizes","stssEntries","chunkIndex","chunkRunIndex","offsetInChunk","lastSampleInChunk","lastChunkInRun","dataReferenceIndex","frameCount","isFullBox","readBig24","pad","charstr","maxlen","chars","r","hex","FMP4Demuxer","videoData","audioData","videoExist","audioExist","moovBox","moovToTrack","moofBox","moofToSamples","baseOffset","sampleData","videoBaseMediaDecodeTime","audioBaseMediaDecodeTime","Concat","ResultConstructor","arrays","self","UINT32_MAX","FTYPHEV1","FTYPAVC1","ftyp","content","mvex","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","trex","sencLength","isVideo","videoSencLength","saiz","saio","trun1","sbgp","sdtp","extension","writeUint32","samplesLength","writeUint16","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","sampleLen","_samples$i","_samples$i$flag","_samples$i$cts","trackMP4","mdiaMP4","minfMP4","stblMP4","_ref5","_ref6","sampleDescIndex","samplesSizes","offsets","keyframeIndexes","_ref7","styp","durationCount","earliestTime","mdatSize","sidx","mdat","video","audio","dinf","dref","StblTable","FMP4Remuxer","browserVersions","forceFirstIDR","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_loop","_offset","_sample","u","setUint32","Base","properties","clone","constructor","_construct","WordArray","_Base","words","sigBytes","typedArray","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","typedArrayByteLength","_words","encoder","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","_get","nBytes","rcache","m_w","_m_w","_m_z","mask","random","_r","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Str","latin1StrLength","Utf8","utf8Str","unescape","BufferedBlockAlgorithm","_Base2","_minBufferSize","_nDataBytes","m_data","doFlush","processedWords","blockSize","dataWords","dataSigBytes","nBlocksReady","nWordsReady","nBytesReady","_doProcessBlock","Hasher","_BufferedBlockAlgorit","_super3","_doReset","messageUpdate","_append","_process","hash","_doFinalize","SubHasher","finalize","HMAC","_Base3","_super4","hasher","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","update","innerHash","hmac","Base64","_map","base64Chars","triplet","charAt","paddingChar","base64Str","base64StrLength","reverseMap","_reverseMap","paddingIndex","parseLoop","bits1","bitsCombined","T","sin","FF","GG","HH","II","MD5Algo","_Hasher","_hash","M","_M","offset_i","M_offset_i","H","M_offset_0","M_offset_1","M_offset_2","M_offset_3","M_offset_4","M_offset_5","M_offset_6","M_offset_7","M_offset_8","M_offset_9","M_offset_10","M_offset_11","M_offset_12","M_offset_13","M_offset_14","M_offset_15","nBitsTotal","nBitsLeft","nBitsTotalH","nBitsTotalL","H_i","_createHelper","_createHmacHelper","EvpKDFAlgo","keySize","iterations","password","salt","derivedKeyWords","block","derivedKey","Cipher","xformMode","_xformMode","dataUpdate","finalProcessedData","_ENC_XFORM_MODE","_DEC_XFORM_MODE","SubCipher","selectCipherStrategy","PasswordBasedCipher","SerializableCipher","encrypt","decrypt","ciphertext","ivSize","BlockCipherMode","cipher","_cipher","_iv","Encryptor","Decryptor","xorBlock","_prevBlock","CBC","_BlockCipherMode","_CBC","_class","_super5","encryptBlock","_CBC2","_class2","_super6","thisBlock","decryptBlock","Pkcs7","blockSizeBytes","nPaddingBytes","paddingWord","paddingWords","padding","unpad","BlockCipher","_Cipher2","_super7","modeCreator","createEncryptor","createDecryptor","_mode","__creator","processBlock","finalProcessedBlocks","CipherParams","_super8","cipherParams","mixIn","formatter","OpenSSLFormatter","openSSLStr","ciphertextWords","_super9","_cfg","encryptor","cipherCfg","algorithm","_ciphertext","plaintext","_parse","OpenSSLKdf","execute","_salt","compute","_SerializableCipher","_super10","derivedParams","kdf","_SBOX","INV_SBOX","_SUB_MIX_0","_SUB_MIX_1","_SUB_MIX_2","_SUB_MIX_3","INV_SUB_MIX_0","INV_SUB_MIX_1","INV_SUB_MIX_2","INV_SUB_MIX_3","xi","sx","x2","x4","x8","RCON","AESAlgo","_BlockCipher","_nRounds","_keyPriorReset","keyWords","ksRows","_keySchedule","keySchedule","ksRow","_invKeySchedule","invKeySchedule","invKsRow","_doCryptBlock","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","SBOX","nRounds","s0","s1","s2","s3","t1","t2","t3","CTR","_CTR","counter","_counter","keystream","crypto","msCrypto","subtle","webkitSubtle","externalDecryptor","_decryptData2","_decryptSegment2","_this$externalDecrypt","destroy","_decryptSegment","seg","_decryptData","keyIv","aesKey","importKey","_x5","_x6","_x7","Event","STREAM_PARSED","NO_AUDIO_TRACK","SUBTITLE_SEGMENTS","SUBTITLE_PLAYLIST","SEI_PAYLOAD_TIME","APPEND_COST","Transmuxer","hls","isMP4","needRemux","_demuxer","_isMP4","_remuxer","videoChunk","audioChunk","needInit","demuxer","demuxAndFix","newId","_initSegmentId","_fireEvents","_this$_remuxer$remux","remux","meta","code","BufferService","softDecode","_softVideo","_mse","decryptor","_decryptor","_destroy","_setLiveSeekableRange","_endOfStream","_reset","_clearAllBuffer","_evictBuffer","_removeBuffer","_appendBuffer","_updateDuration","_this$_transmuxer","_this$_transmuxer$_de","_this$_transmuxer$_de2","_transmuxer","_this$_mse","_this$_mse2","updateDuration","_sourceCreated","_directAppend","mix","_createMseSource","segment","_this$_transmuxer$tra","_this$_transmuxer$tra2","isFirstAppend","mse","_p","AUDIO","_needInitSegment","transmux","setTrackExist","_handleCodecChange","_x8","_args3","clearBuffer","removeEnd","_callee4","bufferBehind","_context4","removeBuffer","_x9","_callee5","_context5","clearAllBuffer","_callee6","reuseMse","_args6","_context6","_callee7","_context7","_callee8","_context8","_x10","_x11","_callee9","_this$_decryptor","_context9","sourceBuffer","getSourceBuffer","RegExp","MasterPlaylist","MediaType","MediaStream","AudioStream","_MediaStream","SubTitleStream","_MediaStream3","MasterStream","MediaPlaylist","MediaSegment","prevSegment","byteRange","bytes","MediaSegmentKey","segKey","keyFormat","keyFormatVersions","sn","setIVFromSN","REGEXP_TAG","REGEXP_ATTR","REGEXP_ABSOLUTE_URL","REGEXP_URL_PAIR","getLines","parseTag","match","parseAttr","getAbsoluteUrl","parentUrl","pairs","CODECS_REGEXP","getCodecs","re","parseMasterPlaylist","lines","line","master","audioStreams","subtitleStreams","_tag","attr","stream","TYPE","URI","default","DEFAULT","autoSelect","AUTOSELECT","NAME","LANGUAGE","CHANNELS","channels","BANDWIDTH","RESOLUTION","_attr$RESOLUTION$spli2","w","CODECS","textCodec","audioGroup","subtitleGroup","SUBTITLES","streams","parseMediaPlaylist","curSegment","curInitSegment","curKey","totalDuration","curSN","curCC","endOfList","toUpperCase","targetDuration","lastSegment","segments","isLast","live","startSN","startCC","setByteRange","_data$split2","title","METHOD","KEYFORMAT","KEYFORMATVERSIONS","IV","BYTERANGE","isInitSegment","cc","endSN","endCC","M3U8Parser","isMediaPlaylist","ManifestLoader","elapsed","retryTime","network","_timer","_this$hls$config","loadTimeout","fetchOptions","_onLoaderRetry","_audioLoader","_subtitleLoader","_load","audioUrl","subtitleUrl","toLoad","videoText","audioText","subtitleText","_yield$Promise$all","_yield$Promise$all2","subtitle","onPreM3U8Parse","playlist","audioPlaylist","subtitlePlaylist","_playlist","_emitOnLoaded","isMaster","_playlist2","cb","errorCb","pollRetryCount","num","Stream","_this$segments$","_this$lastSegment","_this$currentSubtitle","currentSubtitleStream","pointer","currentAudioStream","_clearSegments","snDiff","_updateSegments","newSegs","segs","toSwitch","sliceStart","segObj","endSeg","findIndex","toAppend","lastCC","Playlist","_this$currentStream","currentStream","_this$currentSegments","currentSegments","_segmentPointer","_this$currentSegments2","_this$currentStream2","_this$currentStream3","currentSubtitleEndSn","_this$currentStream4","liveEdge","_this$currentStream5","_this$currentSegments3","_this$currentStream6","_this$currentStream7","_this$currentStream8","getAudioSegment","_this$currentSegments4","dvrWindow","_this$currentSegments5","newSubtitleSegs","updateSubtitle","list","_this$currentStream9","switchSubtitle","maxPlaylistSize","clearOldSegment","cTime","nbSb","findSegmentIndexByTime","getSegmentByIndex","SegmentLoader","_bandwidthService","addRecord","_mapCache","_keyCache","_segmentLoader","_audioSegmentLoader","_keyLoader","_loadSegment2","getLatestSpeed","getAvgSpeed","audioSeg","loadInit","loadAudioInit","loadVideoSegment","loadAudioSegment","_loadSegment","segLoader","_seg$key","mapKey","mapKeyIv","_seg$initSegment$key","mapUrl","_keyUrl","keyUrl","Hls","_reset2","_clear2","_reqAndBufferSegment2","_loadSegmentDirect2","_loadM3U","_switchSubtitleStream","_switchAudioStream","_switchStream","_switchURL","_replay","_loadData2","nextSeg","bInfo","bufferThroughout","_segmentProcessing","nextSegment","preloadTime","_bufferService","msIsOpend","_urlSwitching","_prevSegSn","setNextSegmentByIndex","_loadSegmentDirect","_disconnectTimer","_reloadOnPlay","replay","_startTick","disconnectTime","_clear","_stopTick","seekTime","seekRange","newSeekTime","curSeg","segIndex","currentSegment","_this$_seiService","maxLatency","targetLatency","latency","seiInTime","_seiService","throw","allowedStreamTrackChange","_checkStreamTrackChange","segLoaderError","fatal","_emitError","paused","ended","playbackRate","isMediaPlaying","_gapService","do","document","createElement","manifestList","_manifestLoader","_onPlay","_onPause","_onSeeking","_onTimeupdate","hasSubtitle","_this$_bufferService","_this$media","getVideoPlaybackQuality","droppedVideoFrames","corruptedVideoFrames","totalVideoFrames","creationTime","webkitDroppedFrameCount","webkitDecodedFrameCount","_args4","_loadData","manifest","_this$_switchUrlOpts","_this$_switchUrlOpts2","switchTimePoint","segIdx","bufferClearStartPoint","_this$_switchUrlOpts3","_loadM3U8","_switchUrlOpts","_getSeamlessSwitchPoint","_pollM3U8","seamless","isPlayEmit","play","defaultOpts","_options","appended","_args7","_prevSegCc","seamlessSwitch","force","curStream","curId","_args8","_refreshM3U8","audioStream","_args9","_callee10","_context10","stopPoll","_callee11","_this$_seiService2","_context11","_callee12","_this$config$manifest","_this$config$manifest2","_this$_playlist$curre","_context12","parseText","upsertPlaylist","_stream$currentAudioS","_stream$currentSubtit","mediaPlaylist","_this$_playlist$lastS","isEmpty","poll","p1","p2","p3","_callee13","loadOnce","cachedError","_context13","_reqAndBufferSegment","finish","moveSegmentPointer","_end","_callee14","_this$_bufferService2","responses","before","_context14","decryptBuffer","evictBuffer","changedSeg","checkSegmentTrackChange","switchURL","_callee15","_context15","_callee16","_this$_seiService3","_args16","_context16","_tickTimer","_tick","_tickInterval","_error$originError","_this$media2","_this$media3","_this$_seiService4","pause","nextLoadPoint","_this$_stats","latestKbps","delay","mediaType","WebAssembly","TransmuxerLogger","disable","localStorage","getItem","enableLogger","disableLogger","PluginExtension","opts","plugin","_this$_plugin","_this$_plugin$player","_this$_plugin2","_this$_plugin2$player","_this$_opts","_opts","innerDegrade","_plugin","player","degradeInfo","eventName","_degrade","originVideo","TAG","newVideo","degradeVideo","degrade","firstChild","root","replaceChild","hlsPlugin","pluginName","unRegisterPlugin","_init","_this$_opts2","setPlayMode","setAttribute","_onLowDecode","_this$_opts3","_this$_opts3$media","parseSwitchUrlArgs","HlsPlugin","_BasePlugin","_args","_this$hls","_this$hls2","switchSubtitleStream","_assertThisInitialize","_this$player$config","_this$player$config$h","keepStatusAfterSwitch","_keepPauseStatus","_this$hls3","_this$player","_this$player$config2","__allowHlsEmptyUrl__","_onSwitchURL","hlsOpts","_this$player2","defineGetterOrSetter","_this2$hls","_this2$hls$media","configurable","pluginExtension","forceDegradeToVideo","_this2$pluginExtensio","useHooks","_this2$hls2","SWITCH_SUBTITLE","_onSwitchSubtitle","URL_CHANGE","DESTROY","_transError","_transCoreEvent","_this$pluginExtension","Errors","_emitSeiPaylodTime","seiJson","BasePlugin"],"mappings":"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"}