xgplayer-mp4-loader 3.0.21 → 3.0.22-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../../xgplayer-streaming-shared/src/buffer.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/utils.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-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/aac.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/codec/opus.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/soundFormat.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/utils/byte-reader.ts","../../xgplayer-transmuxer/src/utils/bit-reader.ts","../../xgplayer-transmuxer/src/mp4/mp4-parser.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","../../../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/error.js","../src/cache.js","../src/utils.js","../src/loader.js","../src/config.js"],"sourcesContent":["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 /**\n *\n * @param {HTMLMediaElement} media\n * @param {number} pos\n * @returns {Boolean}\n */\n static isBuffered (media, pos) {\n if (media) {\n const buffered = Buffer.get(media)\n\n if (buffered?.length) {\n for (let i = 0; i < buffered.length; i++) {\n if (pos >= buffered.start(i) && pos <= buffered.end(i)) {\n return true\n }\n }\n }\n }\n return false\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\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 MSE_CHANGE_TYPE: 'MSE_CHANGE_TYPE',\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 MSE_CHANGE_TYPE: 5205,\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\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","\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(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(`[${nowTime()}]`, this._prefix, ...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 = `[${nowTime()}]` + this._prefix + (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","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\n\nexport const SafeJSON = {\n stringify (obj) {\n try {\n return JSON.stringify(obj)\n } catch (e) {\n return ''\n }\n },\n parse (obj) {\n try {\n return JSON.parse(obj)\n } catch (e) {\n return undefined\n }\n }\n}\n","/* eslint-disable no-undef */\nimport { Buffer } from './buffer'\nimport { isBrowser } from './env'\nimport { ERR, StreamingError } from './error'\nimport { Logger } from './logger'\nimport { createPublicPromise, nowTime, SafeJSON } from './utils'\n\nfunction getMediaSource (preferMMS = true) {\n try {\n if (!isBrowser) return null\n\n if (preferMMS && typeof ManagedMediaSource !== 'undefined') return ManagedMediaSource\n\n return window.MediaSource\n } catch (e) {}\n}\n\nfunction isMMS (mediaSource) {\n return /ManagedMediaSource/gi.test(Object.prototype.toString.call(mediaSource))\n}\n\n/**\n * @param {TimeRanges} buffered\n */\nfunction getTimeRanges (buffered) {\n const ranges = []\n\n if (buffered instanceof TimeRanges) {\n for (let i = 0; i < buffered.length; i++) {\n ranges.push({\n start: buffered.start(i),\n end: buffered.end(i)\n })\n }\n }\n return ranges\n}\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 static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @param { boolean} preferMMS\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n const MediaSource = getMediaSource()\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 static isMMSOnly () {\n return typeof ManagedMediaSource !== 'undefined' && typeof MediaSource === 'undefined'\n }\n\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 _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 preferMMS: 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 hasOpTasks () {\n let flag = false\n Object.keys(this._queue).forEach(k => {\n const queue = this._queue[k]\n if (Array.isArray(queue)) {\n flag ||= queue.length > 0\n }\n })\n return flag\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 get streaming () {\n return isMMS(this.mediaSource) ? this.mediaSource.streaming : true\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('setDuration but ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('setDuration', duration)\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('sourceopen', costTime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @private\n */\n _onStartStreaming = () => {\n this._logger.debug('startstreaming')\n }\n\n /**\n * @private\n */\n _onEndStreaming = () => {\n this._logger.debug('endstreaming')\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\n const MediaSource = getMediaSource(this._config.preferMMS)\n\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 const useMMS = isMMS(ms)\n this._st = nowTime()\n\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n if (useMMS) {\n ms.addEventListener('startstreaming', this._onStartStreaming)\n ms.addEventListener('endstreaming', this._onEndStreaming)\n }\n\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n media.disableRemotePlayback = useMMS\n\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 if (isMMS(ms)) {\n ms.removeEventListener('startstreaming', this._onStartStreaming)\n ms.removeEventListener('endstreaming', this._onEndStreaming)\n }\n }\n\n if (this.media) {\n this.media.disableRemotePlayback = false\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') {\n return Promise.reject(\n new StreamingError(\n ERR.MEDIA,\n ERR.SUB_TYPES.MSE_CHANGE_TYPE,\n new Error('changeType is not a function')\n )\n )\n }\n\n return this._enqueueOp(type, () => {\n try {\n sb.changeType(mimeType)\n } catch (e) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_CHANGE_TYPE, e)\n }\n\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.remove(k, startTime, endTime)\n })\n return p || Promise.resolve()\n }\n\n clearAllBuffer () {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n const sb = this._sourceBuffer[k]\n p = this.remove(k, 0, Buffer.end(Buffer.get(sb)))\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 initQueue = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initQueue.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initQueue.length > 0 && this._queue[type].push(...initQueue)\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 if (op.context && typeof op.context === 'object'){\n op.context.isFull = true\n }\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(\n error.constructor === StreamingError\n ? error\n : new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error)\n )\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(${type}/${op.opName})`, SafeJSON.stringify(getTimeRanges(this._sourceBuffer[type]?.buffered)), costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n const callback = op.context?.callback\n if (callback && typeof callback === 'function'){\n callback(op.context)\n }\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 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, milliSecond) {\n return Math.round(byteLen * 8 * 1000 / milliSecond / 1024) // Kb/s\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 MEDIASOURCE_OPENED: 'core.mediasourceopened',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n APPEND_BUFFER: 'core.appendbuffer',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n CHASEFRAME: 'core.chaseframe',\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 && typeof fetch !== 'undefined' ? 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.<Uint8Array>} 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 _finnalUrl = ''\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\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","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n AV1: 'av1',\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m',\n OPUS: 'opus',\n MP3: 'mp3'\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 lastKeyFrameDts = 0\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 get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n if (/av01/.test(this.codec)) {\n return true\n }\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 container = ''\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 !!(\n this.sampleRate &&\n this.channelCount &&\n (this.codec || this.container) &&\n (this.codecType === AudioCodecType.AAC ||\n this.codecType === AudioCodecType.G711PCMA ||\n this.codecType === AudioCodecType.G711PCMU ||\n this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3)\n )\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 get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\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 get bitsAvailable () {\n return this._bitsAvailable\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\nexport function combineToFloat (integer, decimal) {\n return Number(integer + '.' + decimal)\n}\n\nexport function toDegree (matrix) {\n if (matrix.length < 5)\n return 0\n const scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4])\n return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI\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 (!frameLength || (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 = 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 { readBig32 } from '../utils'\n\nexport class NALu {\n /**\n * @param {Uint8Array} data\n * @returns {Uint8Array[]}\n */\n static parseAnnexB (data) {\n let j = data.byteLength - 1\n let dropZerosLength = 0\n // Collect tailing zeros.\n // end with 0x000000 and more...\n do {\n if (data[j] === 0x00) {\n dropZerosLength++\n } else {\n break\n }\n\n j--\n } while (j > 0)\n\n if (dropZerosLength >= 3) {\n // drop tailing zeros.\n data = data.subarray(0, j + 1)\n }\n\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 } else if (end < len - 1 && data[end + 1] !== 1) {\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, i + size), 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 { 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\n if (maxSubLayersMinus1 > eg.bitsAvailable) {\n throw new Error(`maxSubLayersMinus inavlid size ${maxSubLayersMinus1}`)\n }\n\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","/**\n * Opus documentation, https://opus-codec.org/docs/\n * Ogg Encapsulation for the Opus Audio Codec, https://datatracker.ietf.org/doc/html/rfc7845.html\n *\n * Packet Organization:\n *\n * Page 0 Pages 1 ... n Pages (n+1) ...\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * | | | | | | | | | | | | |\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * |||ID Header|| || Comment Header || ||Audio Data Packet 1| | ...\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * | | | | | | | | | | | | |\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * ^ ^ ^\n * | | |\n * | | Mandatory Page Break\n * | |\n * | ID header is contained on a single page\n * |\n * 'Beginning Of Stream'\n */\nexport class OPUS {\n static getFrameDuration (samples, timescale = 1000) {\n return 20\n }\n\n /**\n * Identification Header + Comment Header\n * @param {Uint8Array} data\n */\n static parseHeaderPackets (data) {\n if (!data.length) return\n\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\n // Identification Header\n let magicSignature = ''\n for (let i = 0; i < 8; i++) {\n magicSignature += String.fromCodePoint(data[i])\n }\n if (magicSignature !== 'OpusHead') {\n throw new Error('Invalid Opus MagicSignature')\n }\n\n // skip version\n // data[8]\n // console.log('Pre-skip', data[8])\n\n const channelCount = data[9]\n\n // skip Pre-skip\n // data[10] & data[11]\n console.log('Pre-skip', data[10], data[11])\n\n const sampleRate = dv.getUint32(12, true)\n const outputGain = dv.getInt16(16, true)\n\n // const mappingFamily = dv.getUint8(18)\n\n // play as no audio track stream\n if (!sampleRate) return\n\n const codec = 'opus'\n const originCodec = 'opus'\n const config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8)\n\n return {\n outputGain,\n sampleRate,\n channelCount,\n config,\n codec,\n originCodec\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC, OPUS } 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_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BROKEN_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_EXCEPTION_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 break\n if (this._videoTimestampBreak >= TRACK_BROKEN_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 break\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_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 break\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 switch (audioTrack.codecType) {\n case AudioCodecType.AAC: {\n audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n break\n }\n case AudioCodecType.OPUS: {\n audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale)\n break\n }\n case AudioCodecType.G711PCMA:\n case AudioCodecType.G711PCMU: {\n audioTrack.sampleDuration = this._getG711Duration(audioTrack)\n break\n }\n default:\n console.error('can\\'t fix audio codecType:', audioTrack.codecType)\n break\n }\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate =\n audioTrack.codecType === AudioCodecType.OPUS\n ? 20\n : audioTrack.codecType === AudioCodecType.AAC\n ? 1024\n : (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 break\n if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_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_EXCEPTION_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_EXCEPTION_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_EXCEPTION_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 if (audioTrack.codecType === AudioCodecType.OPUS) {\n const lastSample = samples[samples.length - 1]\n if (lastSample) {\n lastSample.duration = sample.pts - lastSample.pts\n }\n } else {\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n }\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","/**\n * AudioData\n * @property {number} FlvSoundFormat\n */\nexport const FlvSoundFormat = {\n MP3: 2,\n G711A: 7, // G.711 A-law logarithmic PCM\n G711M: 8, // G.711 mu-law logarithmic PCM\n AAC: 10, // AAC\n OPUS: 13\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'\nimport { FlvSoundFormat } from './soundFormat'\nimport { OPUS } from '../codec/opus'\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, seamlessLoadingSwitching) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\n\n if (discontinuity) {\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 if (seamlessLoadingSwitching) this.seamlessLoadingSwitching = true\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.codecType === AudioCodecType.OPUS ? 1000 : 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 const scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1]\n const metaData = scriptDataObject?.data?.onMetaData\n\n if (metaData) {\n if (videoTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n videoTrack.duration = metaData.duration * 1000\n }\n\n if (metaData.hasOwnProperty('width') && metaData.hasOwnProperty('height')) {\n videoTrack.width = metaData.width\n videoTrack.height = metaData.height\n }\n }\n\n if (audioTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n audioTrack.duration = metaData.duration * 1000\n }\n }\n }\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, seamlessLoadingSwitching) {\n this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching)\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 /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\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 !== FlvSoundFormat.AAC &&\n format !== FlvSoundFormat.G711A &&\n format !== FlvSoundFormat.G711M &&\n format !== FlvSoundFormat.OPUS\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {\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 switch (format) {\n case FlvSoundFormat.G711A:\n case FlvSoundFormat.G711M:\n this._parseG711(data, pts, format)\n break\n case FlvSoundFormat.AAC:\n this._parseAac(data, pts)\n break\n case FlvSoundFormat.OPUS:\n this._parseOpus(data, pts)\n break\n default:\n break\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseOpus (data, pts) {\n const track = this.audioTrack\n const packetType = data[1]\n\n track.codecType = AudioCodecType.OPUS\n\n switch (packetType) {\n case 0 /* Header Packets */: {\n const ret = OPUS.parseHeaderPackets(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.sampleDuration = OPUS.getFrameDuration([], track.timescale)\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n break\n }\n case 1 /* Raw OPUS frame data */: {\n if (pts === undefined || pts === null) return\n\n const newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration)\n track.samples.push(newSample)\n break\n }\n default:\n logger.warn(`Unknown OpusPacketType: ${packetType}`)\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @param {import('./soundFormat').FlvSoundFormat} format\n */\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n const audioData = data.subarray(1)\n\n if (audioData.byteLength < 1) return\n\n const sample = new AudioSample(pts, audioData)\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(sample)\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 (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {\n return\n }\n this.seamlessLoadingSwitching = false\n if (frameType === 1) {\n sample.setToKeyframe()\n track.lastKeyFrameDts = dts\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 { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu, MPEG } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\nimport { AudioCodecType } from '../model/types'\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, fixerConfig = {}) {\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, fixerConfig)\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 0x03:\n case 0x04:\n if (audioTrack.pid === -1) {\n audioTrack.pid = audioPid = esPid\n audioTrack.codecType = AudioCodecType.MP3\n }\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 case 38: // HEVC FD_NUT\n if (isHevc) {\n let ffByteFound = false\n for (let i = 2; i < unit.byteLength; i++) {\n if (unit[i] === 0xff) {\n ffByteFound = true\n break\n }\n }\n if (!ffByteFound) {\n return\n }\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 switch (this.audioTrack.codecType) {\n case AudioCodecType.AAC:\n this._parseAacData(pes)\n break\n case AudioCodecType.MP3:\n this._parseMPEG(pes)\n break\n default:\n }\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 _parseMPEG (pes) {\n const data = pes.data\n const length = data.length\n let frameIndex = 0\n let offset = 0\n const pts = pes.pts\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: MPEG PES unknown PTS')\n return\n }\n\n while (offset < length) {\n if (MPEG.isHeader(data, offset)) {\n const frame = MPEG.appendFrame(\n this.audioTrack,\n data,\n offset,\n pts,\n frameIndex\n )\n if (frame) {\n offset += frame.length\n frameIndex++\n } else {\n break\n }\n } else {\n offset++\n }\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","export class ByteReader {\n private dv: DataView\n start: number\n offset: number\n end: number\n constructor(buf: ArrayBuffer, offset: number, len: number) {\n this.dv = new DataView(buf)\n this.start = this.offset = offset || this.dv.byteOffset\n this.end = len ? this.start + len : this.start + this.dv.byteLength\n }\n static fromUint8(uint8: Uint8Array) {\n return new ByteReader(uint8.buffer, uint8.byteOffset, uint8.byteLength)\n }\n static concatUint8s(args: Uint8Array[]) {\n const uint8 = new Uint8Array(args.reduce((ret, v) => ret + v.byteLength, 0))\n let offset = 0\n args.forEach((v) => {\n uint8.set(v, offset)\n offset += v.byteLength\n })\n return uint8\n }\n static concatUint8(...args: Uint8Array[]) {\n return this.concatUint8s(args)\n }\n get buffer() {\n return this.dv.buffer\n }\n get unreadLength() {\n return Math.max(this.end - this.offset, 0)\n }\n get size() {\n return this.end - this.start\n }\n readFloat(byteNum: number) {\n let val = 0\n switch (byteNum) {\n case 4:\n val = this.dv.getFloat32(this.offset)\n break\n case 8:\n val = this.dv.getFloat64(this.offset)\n break\n default:\n throw new Error(`read ${byteNum}-byte float is not supported`)\n }\n this.offset += byteNum\n return val\n }\n back(byteNum: number) {\n this.offset -= byteNum\n }\n skip(byteNum: number) {\n this.offset += byteNum\n }\n readInt(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getInt8(offset)\n case 2:\n return this.dv.getInt16(offset)\n case 4:\n return this.dv.getInt32(offset)\n default:\n throw new Error(`read ${byteNum}-byte integers is not supported`)\n }\n }\n read(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getUint8(offset)\n case 2:\n return this.dv.getUint16(offset)\n case 3:\n return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2)\n case 4:\n return this.dv.getUint32(offset)\n default:\n this.back(byteNum - 4)\n // js不支持32位左移,可通过+、Math.pow运算达到64位以内运算的目的\n return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4)\n }\n }\n write(byteNum: number, val: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.setUint8(offset, val)\n case 2:\n return this.dv.setUint16(offset, val)\n case 3:\n return this.dv.setUint8(offset, val >>> 16),\n this.dv.setUint16(offset + 1, 0xffff & val)\n case 4:\n return this.dv.setUint32(offset, val)\n default:\n throw new Error(`write ${byteNum}-byte integers is not supported`)\n }\n }\n readToBuffer(len?: number) {\n let buffer: ArrayBuffer\n if (this.offset || len) {\n buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end)\n } else {\n buffer = this.dv.buffer\n }\n this.offset += buffer.byteLength\n return buffer\n }\n readToUint8(len?: number) {\n const uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength)\n this.offset += uint8.byteLength\n return uint8\n }\n readString(len: number) {\n let i = 0, str = ''\n for (; i < len; i++) {\n str += String.fromCharCode(this.dv.getUint8(this.offset))\n this.offset++\n }\n return str\n }\n}","import { ByteReader } from './byte-reader'\n\nexport class BitReader {\n private val: number\n size: number\n offset = 0\n constructor(val: number, size: number) {\n this.val = val\n this.size = size\n }\n static fromByte(byte: ByteReader, len: number) {\n return new BitReader(byte.read(len), len << 3)\n }\n skip(len: number) {\n this.offset += len\n }\n read(len: number) {\n const unreadLength = this.size - this.offset - len\n\n if (unreadLength >= 0) {\n let bits = 0, i = 0\n this.offset += len\n // 32位及以上的整数不支持位移运算,使用 / + Math.pow 规避\n if (this.size > 31) {\n for (; i < len; i++) {\n bits += Math.pow(2, i)\n }\n return this.val / Math.pow(2, unreadLength) & bits\n } else {\n for (; i < len; i++) {\n bits += 1 << i\n }\n return this.val >>> unreadLength & bits\n }\n }\n throw new Error(`the number of the read operation exceeds the total length limit of bits`)\n }\n}","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64, combineToFloat, toDegree } from '../utils'\nimport { AAC } from '../codec'\nimport { ByteReader } from '../utils/byte-reader'\nimport { BitReader } from '../utils/bit-reader'\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 const byte = ByteReader.fromUint8(data)\n if (ret.version === 1) {\n byte.read(8) // createTime\n byte.read(8) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(8)\n } else {\n byte.read(4) // createTime\n byte.read(4) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(4)\n }\n byte.skip(16) // reserved(8) + layer(2) + alternateGroup(2) + volume(2) + reserved(2)\n ret.matrix = [] // for remux\n for (let i = 0; i < 36; i++) {\n ret.matrix.push(byte.read(1))\n }\n byte.back(36)\n const caculatedMatrix = [] // for caculation of rotation\n for (let i = 0, int32; i < 3; i++) {\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n int32 = byte.readInt(4)\n caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 0x3fffffff)) // 2.30 fixed point\n }\n ret.rotation = toDegree(caculatedMatrix)\n ret.width = byte.read(4) // 16.16 fixed point, no parsed\n ret.height = byte.read(4) // 16.16 fixed point, no parsed\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 'av01':\n return MP4Parser.av01(b)\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 colr (box) {\n return parseBox(box, false, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n ret.data = box.data\n ret.colorType = byte.readString(4)\n // Array.from(data.subarray(0, 4)).map(v => String.fromCharCode(v)).join('')\n if (ret.colorType === 'nclx') {\n ret.colorPrimaries = byte.read(2)\n ret.transferCharacteristics = byte.read(2)\n ret.matrixCoefficients = byte.read(2)\n ret.fullRangeFlag = byte.read(1) >> 7\n } else if (ret.colorType === 'rICC' || ret.colorType === 'prof') {\n ret.iccProfile = data.readToUint8()\n }\n })\n }\n\n static av01 (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.av1C = MP4Parser.av1C(MP4Parser.findBox(bodyData, ['av1C'], start)[0])\n ret.colr = MP4Parser.colr(MP4Parser.findBox(bodyData, ['colr'], start)[0])\n })\n }\n\n static av1C (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n\n const byte = ByteReader.fromUint8(data)\n const bit = BitReader.fromByte(byte, 4)\n\n ret.marker = bit.read(1)\n ret.version = bit.read(7)\n\n ret.seqProfile = bit.read(3)\n ret.seqLevelIdx0 = bit.read(5)\n\n ret.seqTier0 = bit.read(1)\n ret.highBitdepth = bit.read(1)\n ret.twelveBit = bit.read(1)\n ret.monochrome = bit.read(1)\n ret.chromaSubsamplingX = bit.read(1)\n ret.chromaSubsamplingY = bit.read(1)\n ret.chromaSamplePosition = bit.read(2)\n ret.reserved = bit.read(3)\n ret.initialPresentationDelayPresent = bit.read(1)\n\n if (ret.initialPresentationDelayPresent) {\n ret.initialPresentationDelayMinusOne = bit.read(4)\n } else {\n ret.initialPresentationDelayMinusOne = 0\n }\n ret.configOBUs = byte.readToUint8()\n\n let bitdepth\n if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {\n bitdepth = ret.twelveBit === 1 ? '12' : '10'\n } else if (ret.seqProfile <= 2) {\n bitdepth = ret.highBitdepth === 1 ? '10' : '08'\n }\n ret.codec = [\n 'av01',\n ret.seqProfile,\n (ret.seqLevelIdx0 < 10 ? '0' + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? 'H' : 'M'),\n bitdepth\n ].join('.')\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.data = box.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 v.rotation = vTrack.tkhd.rotation\n v.matrix = vTrack.tkhd.matrix\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.av1C) {\n v.codecType = VideoCodecType.AV1\n v.codec = e1.av1C.codec\n v.av1C = e1.av1C.data\n v.colr = e1.colr.data\n } else 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) {\n throw new Error(`box ${box.type} size !== data.length`)\n }\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","\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 { AudioCodecType, TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse } from '../utils'\nimport Buffer from './buffer'\n\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'Opus',\n 'dOps',\n 'av01',\n 'av1C',\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\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 if (track.codecType === AudioCodecType.OPUS) {\n content = MP4.opus(track)\n } else {\n content = MP4.mp4a(track)\n }\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 if (track.av1C) {\n content = MP4.av01(track)\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 static av01 (track) {\n return MP4.box(MP4.types.av01, 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 ]), track.av1C, track.colr)\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 /**\n * https://opus-codec.org/docs/opus_in_isobmff.html\n */\n static opus (track) {\n const opusAudioDescription = new Uint8Array([\n 0x00, 0x00, 0x00, // version\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n track.channelCount,\n 0x00, 0x10, // sampleSize\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff,\n track.sampleRate & 0xff, // sampleRate\n 0x00, 0x00\n ])\n\n const opusSpecificConfig = track.config.length ? MP4.dOps(track) : []\n return MP4.box(MP4.types.Opus, opusAudioDescription, opusSpecificConfig)\n }\n\n static dOps (track) {\n if (track.config) {\n track.config[4] = (track.sampleRate >>> 24) & 0xFF\n track.config[5] = (track.sampleRate >>> 16) & 0xFF\n track.config[6] = (track.sampleRate >>> 8) & 0xFF\n track.config[7] = (track.sampleRate) & 0xFF\n\n return MP4.box(MP4.types.dOps, track.config)\n }\n\n // const {channelCount, channelConfigCode, sampleRate } = track\n\n // const mapping = channelConfigCode?.map((c) => {\n // return [\n // (c >>> 4) & 0xFF, // Channel mapping family\n // c & 0xFF // Channel mapping index\n // ]\n // }).flat() || []\n\n // const data = new Uint8Array([\n // 0x00, // version\n // channelCount, // channelCount\n // 0x00, 0x00, // preSkip\n // (sampleRate >>> 24) & 0xFF,\n // (sampleRate >>> 17) & 0xFF,\n // (sampleRate >>> 8) & 0xFF,\n // (sampleRate >>> 0) & 0xFF,\n // 0x00, 0x00, // Global Gain\n // ... mapping\n // ])\n\n // return data\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","/* 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","export class MediaError {\n constructor (msg, data) {\n this.type = 'file'\n this.message = msg\n this.data = data\n }\n}\n","export class Cache {\n _data = Object.create(null)\n\n set (id, data) {\n this._data[id] = data\n }\n\n get (id) {\n return this._data[id]\n }\n\n clear () {\n this._data = Object.create(null)\n }\n}\n","const TFHDFlag = {\n BASE_DATA_OFFSET: 1,\n SAMPLE_DESC: 2,\n SAMPLE_DUR: 8,\n SAMPLE_SIZE: 16,\n SAMPLE_FLAG: 32,\n DUR_EMPTY: 65536,\n DEFAULT_BASE_IS_MOOF: 131072\n}\nconst TRUNFlag = {\n DATA_OFFSET: 1,\n FIRST_FLAG: 4,\n DURATION: 256,\n SIZE: 512,\n FLAG: 1024,\n CTS_OFFSET: 2048\n}\nconst SampleFlag = {\n DEGRADATION_PRIORITY_MASK: 65535,\n IS_NON_SYNC: 65536,\n PADDING_MASK: 917504,\n REDUNDANCY_MASK: 3145728,\n DEPENDED_MASK: 12582912,\n DEPENDS_MASK: 50331648,\n DEPENDS_NO: 33554432,\n DEPENDS_YES: 16777216\n}\n\nexport function trafToSegments (traf, trex = {}, moofOffset, segDuration, timescale) {\n const { tfhd, trun, tfdt } = traf\n const { samples: trunSamples, flags: trunFlags } = trun\n const { flags: tfhdFlags } = tfhd\n\n // const defaultSampleDescriptionIndex = tfhdFlags & TFHDFlag.SAMPLE_DESC ? tfhd.sampleDescriptionIndex : (trex.defaultSampleDescriptionIndex || 1)\n const defaultSampleDuration = tfhdFlags & TFHDFlag.SAMPLE_DUR ? tfhd.defaultSampleDuration : (trex.defaultSampleDuration || 0)\n const defaultSampleSize = tfhdFlags & TFHDFlag.SAMPLE_SIZE ? tfhd.defaultSampleSize : (trex.defaultSampleSize || 0)\n const defaultSampleFlags = tfhdFlags & TFHDFlag.SAMPLE_FLAG ? tfhd.defaultSampleFlags : (trex.defaultSampleFlags || 0)\n const startOffset = tfhdFlags & TFHDFlag.BASE_DATA_OFFSET ? tfhd.baseDataOffset : (tfhdFlags & TFHDFlag.DEFAULT_BASE_IS_MOOF ? moofOffset : 0)\n\n const frames = []\n const gops = []\n\n for (let lastDts = 0, startTime = 0, gopId = 0, totalOffset = startOffset, i = 0; i < trunSamples.length; i++) {\n const frame = {}\n frame.index = i\n frame.size = trunFlags & TRUNFlag.SIZE ? trunSamples[i].size : defaultSampleSize\n frame.duration = trunFlags & TRUNFlag.DURATION ? trunSamples[i].duration : defaultSampleDuration\n frame.dts = lastDts > 0 ? lastDts : (tfdt ? tfdt.baseMediaDecodeTime : 0)\n frame.startTime = startTime\n if (trunFlags & TRUNFlag.CTS_OFFSET) {\n frame.pts = frame.dts + trunSamples[i].cts\n } else {\n frame.pts = frame.dts\n }\n lastDts = frame.dts + frame.duration\n startTime += frame.duration\n\n let sampleFlags = defaultSampleFlags\n if (trunFlags & TRUNFlag.FLAG) {\n sampleFlags = trunSamples[i].flags\n } else if (0 === i && trunFlags & TRUNFlag.FIRST_FLAG) {\n sampleFlags = trun.firstSampleFlag\n }\n frame.offset = totalOffset\n frame.keyframe = !(sampleFlags & (SampleFlag.IS_NON_SYNC | SampleFlag.DEPENDS_YES))\n totalOffset += frame.size\n frames.push(frame)\n if (frame.keyframe) {\n gopId++\n gops.push([frame])\n } else if (gops.length) {\n gops[gops.length - 1].push(frame)\n }\n frame.gopId = gopId\n }\n\n const len = frames.length\n if (!len || (!frames[0].keyframe)) return []\n\n let time = 0\n let lastFrame\n const segments = []\n const scaledDuration = segDuration * timescale\n let segmentFrames = []\n\n // 合并gop至segments,以segDuration作为参考\n for (let i = 0, len = gops.length; i < len; i++) {\n time += gops[i].reduce((wret, w) => wret + w.duration, 0)\n segmentFrames = segmentFrames.concat(gops[i])\n\n if (time >= scaledDuration || i === gops.length - 1) {\n lastFrame = segmentFrames[segmentFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segmentFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: time / timescale,\n range: [segmentFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segmentFrames\n })\n time = 0\n segmentFrames = []\n }\n }\n\n return segments\n}\n\nexport function sidxToSegments (moov, sidx) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let audioSegments = []\n let videoSegments = []\n if (sidx) {\n const segments = []\n let prevTime = 0\n let prevOffset = sidx.start + sidx.size\n sidx.references.forEach((ref, i) => {\n segments.push({\n index: i,\n startTime: prevTime,\n endTime: prevTime + (ref.subsegment_duration / sidx.timescale),\n duration: ref.subsegment_duration / sidx.timescale,\n range: [prevOffset, prevOffset + ref.referenced_size],\n frames: []\n })\n prevTime += ref.subsegment_duration / sidx.timescale\n prevOffset += ref.referenced_size\n })\n audioSegments = segments\n videoSegments = segments\n } else {\n // 如果sidx不存在,则代表后续的segments无法通过seek读取\n // 把整段fmp4当作一个segment,使用开区间range即可\n const getTrakSegments = (box) => {\n if (!box) return []\n return [{\n index: 0,\n startTime: 0,\n endTime: box.duration / box.timescale,\n duration: box.duration / box.timescale,\n range: [moov.start + moov.size, ''],\n frames: []\n }]\n }\n videoSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : videoTrack.mdia?.mdhd)\n audioSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : audioTrack.mdia?.mdhd)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\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 let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 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 let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.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 const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return []\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n return segments\n}\n\nexport function moovToMeta (moov, isFragmentMP4) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC || e1.av1C)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov,\n isFragmentMP4\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments, sidxToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n\n // 当box存在但不完整时,补全box\n const getCompletedBox = async (name) => {\n const box = MP4Parser.findBox(this.buffer, [name])[0]\n if (box) {\n if (box.size > box.data.length) {\n const res = await this.loadData([box.start, box.start + box.size - 1], cache, config)\n if (res) {\n return MP4Parser.findBox(res.data, [name])[0]\n }\n } else {\n return box\n }\n }\n }\n\n // 现在的分段式range加载逻辑不适用于fmp4,需要判断太多条件\n // 因为fmp4的samples信息存放在moof中,而解析moof的range需要依赖sidx\n // 而sidx和moof的size都是动态的(且sidx不一定存在),导致每个环节都需要判断是否满足解析条件以及对应的兜底处理\n // todo: 后续加载逻辑需要改为【开区间range+主动取消】才能更好的处理fmp4\n let isFragmentMP4 = false\n if (!(segments && segments.videoSegments.length && segments.audioSegments.length)) {\n const sidx = await getCompletedBox('sidx')\n if (sidx) {\n const parsedSidx = MP4Parser.sidx(sidx)\n if (parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx)\n isFragmentMP4 = true\n }\n } else {\n // 无 sidx box 场景,当前架构只能通过模拟加载完整的fmp4来解析出segments,这样会导致fetch加载的数据量特别大,loading时间长\n // 更倾向于使用【开区间range+主动取消】方案异步读取,todo\n }\n }\n\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov, isFragmentMP4)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n let parsedSidx\n if (!(segments.videoSegments.length && segments.audioSegments.length)) {\n const moof = MP4Parser.findBox(this.buffer, ['moof'])[0]\n const sidx = MP4Parser.findBox(this.buffer, ['sidx'])[0]\n if (moof && moof.size <= moof.data.length && sidx) {\n const parsedMoof = MP4Parser.moof(moof)\n\n parsedSidx = MP4Parser.sidx(sidx)\n if (parsedMoof && parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx, parsedMoof)\n }\n }\n }\n\n this.meta = moovToMeta(parsedMoov, parsedSidx)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n"],"names":["Buffer","_classCallCheck","key","value","buf","length","end","start","b","buffered","error","maxHole","buffers","i","l","bufLen","last","lastEnd","push","reduce","a","c","pos","arguments","undefined","index","nextStart","nextEnd","prevStart","prevEnd","item","currentTime","behind","remaining","totalLength","media","get","isBrowser","window","ERR","FLV","HLS","MP4","FMP4","MSE_ADD_SB","MSE_APPEND_BUFFER","MSE_OTHER","MSE_FULL","MSE_CHANGE_TYPE","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","LogCacheLevel","DEBUG","LOG","WARN","ERROR","SIMPLE_TYPE","Logger","name","config","this","_prefix","concat","logCacheLevel","logMaxSize","logSize","logTextArray","_createClass","_console","_len","args","Array","_key","logCache","apply","disabled","console","debug","nowTime","_console2","_len2","_key2","log","_console3","_len3","_key3","warn","_console4","_len4","_key4","text","_len5","logText","_key5","finLogText","map","logable","JSON","stringify","e","delLog","shift","join","reset","_console5","group","table","groupEnd","val","Date","toLocaleString","reduceDepth","_typeof","objType","Object","prototype","toString","slice","obj","maxDepth","depth","result","includes","hasOwnProperty","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","parseInt","performance","now","getTime","SafeJSON","getMediaSource","preferMMS","ManagedMediaSource","MediaSource","isMMS","mediaSource","test","OP_NAME","MSE","_this2","create","_logger","queue","_queue","op","opName","_this2$_sourceBuffer$","_op$context","costtime","_opst","ranges","TimeRanges","getTimeRanges","_sourceBuffer","context","callback","_startQueue","event","_config","assign","getDefaultConfig","bindMedia","openLog","enable","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","readyState","_this3","flag","keys","forEach","k","isArray","_url","_this$mediaSource2","duration","streaming","_mseFullFlag","VIDEO","_this4","isReduceDuration","bufferEnd","Math","max","_enqueueBlockingOp","isEnded","_this5","_openPromise","isOpened","ms","addEventListener","onOpen","costTime","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","useMMS","_this6","wrap","_context","prev","next","unbindMedia","revokeObjectURL","src","_onStartStreaming","_onEndStreaming","URL","createObjectURL","disableRemotePlayback","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this7","_context2","t","x","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this8","changeType","_enqueueOp","createSource","buffer","_this9","byteLength","_this9$_sourceBuffer$","appendBuffer","startTime","endTime","_this10","isInsertHead","remove","p","_this11","_this12","allClear","_this$_queue$type","initQueue","isinit","reason","_this13","setLiveSeekableRange","exec","_this14","splice","then","_callee3","types","waiters","_this15","_context3","prom","all","updating","_x2","_x3","_x4","_op$promise","_op$promise2","indexOf","isFull","constructor","timestampOffset","_this16","_this17","abort","mime","isTypeSupported","LoaderType","ResponseType","NetError","request","_assertThisInitialized","isPlainObject","getPrototypeOf","getRangeValue","ret","encode","encodeURIComponent","replace","setUrlParams","params","v","str","toISOString","isObject","filter","Boolean","hashIndex","createResponse","data","done","contentLength","age","firstByteTime","range","vid","priOptions","parseFloat","Number","isNaN","options","calculateSpeed","byteLen","milliSecond","round","EVENT","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","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","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","sequenceNumber","width","height","fpsDen","fpsNum","baseMediaDecodeTime","timescale","codec","present","pid","pps","sps","vps","sarRatio","samples","warnings","hvcC","dts","pts","first","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","container","codecType","isAudioEncryption","VideoSample","units","originPts","originDts","keyframe","dependsOn","isNonSyncSample","AudioSample","sampleOffset","size","Sample","FlvScriptSample","_Sample","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","_data","_bytesAvailable","_loadWord","_bitsAvailable","position","availableBytes","min","workingBytes","subarray","_word","DataView","getUint32","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","isFirefox","isAndroid","MAX_SIZE","pow","readBig16","readBig32","readBig64","getAvcCodec","codecs","h","parse","combineToFloat","integer","decimal","AAC","rate","FREQ","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","NALu","dropZerosLength","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","fps","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","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","bitsAvailable","OPUS","dv","byteOffset","magicSignature","fromCodePoint","outputGain","getInt16","MAX_SILENT_FRAME_DURATION","AUDIO_EXCEPTION_LOG_EMIT_DURATION","FlvFixer","videoTrack","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","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","G711PCMA","_getG711Duration","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","track","sampleSize","getSilentFrame","AMF","_parseValue","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","decode","getUint16","FlvSoundFormat","FlvDemuxer","_fixer","_scriptDataObject$dat","seamlessLoadingSwitching","_remainingData","_headerParsed","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","scriptDataObject","metaData","onMetaData","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","G711A","_parseG711","_parseAac","_parseOpus","packetType","parseHeaderPackets","newSample","audioData","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","lastKeyFrameDts","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","ByteReader","byteNum","getFloat32","getInt8","getInt32","back","setUint8","setUint16","setUint32","uint8","unreadLength","concatUint8s","BitReader","byte","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","fromUint8","matrix","int32","caculatedMatrix","readInt","rotation","scaled0","hypot","scaled1","atan2","PI","toDegree","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","av01","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","colorType","readString","colorPrimaries","transferCharacteristics","matrixCoefficients","fullRangeFlag","iccProfile","readToUint8","bodyStart","parseVisualSampleEntry","av1C","colr","bitdepth","bit","fromByte","marker","seqProfile","seqLevelIdx0","seqTier0","highBitdepth","twelveBit","monochrome","chromaSubsamplingX","chromaSubsamplingY","chromaSamplePosition","reserved","initialPresentationDelayPresent","initialPresentationDelayMinusOne","configOBUs","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","Concat","ResultConstructor","arrays","self","UINT32_MAX","FTYPHEV1","FTYPAVC1","ftyp","content","mvex","_toConsumableArray","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","opus","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","opusAudioDescription","opusSpecificConfig","dOps","Opus","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","Base","properties","clone","_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","MediaError","Cache","sidxToSegments","audioSegments","videoSegments","segments","prevTime","prevOffset","_videoTrack$mdia","_audioTrack$mdia","getTrakSegments","moovToSegments","segmentDurations","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia$mdhd","segDuration","_stscEntries$","frame","gop","gopDuration","lastFrame","segFrames","adjust","pushSegment","_segments2","_segFrames","curTime","moovToMeta","isFragmentMP4","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia3","_videoTrack$mdia3$min","_videoTrack$mdia3$min2","_videoTrack$mdia4","_videoTrack$mdia4$mdh","_audioTrack$mdia3","_audioTrack$mdia3$min","_audioTrack$mdia3$min2","_e1$esds","_audioTrack$mdia4","_audioTrack$mdia4$mdh","_t$mdia5","_t$mdia5$hdlr","_t$mdia6","_t$mdia6$hdlr","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee5","moovStart","OnProgressHandle","_context5","_callee4","state","_moovStart","parsedMoov","getCompletedBox","parsedSidx","_segments","_context4","loadData","loadMetaProcess","_res","_x10","_x7","_x8","_x9","_x5","_x6","_callee6","responses","parsedMoof","_context6","_x11","_x12","_x13","segmentIndex","_callee7","changeCurrent","_this$getSegmentByTim","_args7","_context7","getSegmentByTime","_loadSegment","loadSegmentByTime","_x14","_x15","_callee8","_args8","_context8","_x16","_callee10","_this$getSegmentByTim2","videos","audios","_context10","_callee9","_context9","_x18","_x17","_callee11","_args11","_context11","downloadInfo","_callee12","_context12","clear","_callee13","_context13","finish","_x19","_x20","_x21","_x22","_x23","_callee14","cacheKey","_context14","_getCacheKey","fromCache","_x24","_x25","_x26"],"mappings":"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"}
1
+ {"version":3,"file":"index.min.js","sources":["../../xgplayer-streaming-shared/src/buffer.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/utils.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-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/aac.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/codec/opus.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/soundFormat.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/utils/byte-reader.ts","../../xgplayer-transmuxer/src/utils/bit-reader.ts","../../xgplayer-transmuxer/src/mp4/mp4-parser.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","../../../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/error.js","../src/cache.js","../src/utils.js","../src/loader.js","../src/config.js"],"sourcesContent":["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 /**\n *\n * @param {HTMLMediaElement} media\n * @param {number} pos\n * @returns {Boolean}\n */\n static isBuffered (media, pos) {\n if (media) {\n const buffered = Buffer.get(media)\n\n if (buffered?.length) {\n for (let i = 0; i < buffered.length; i++) {\n if (pos >= buffered.start(i) && pos <= buffered.end(i)) {\n return true\n }\n }\n }\n }\n return false\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\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 MSE_CHANGE_TYPE: 'MSE_CHANGE_TYPE',\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 MSE_CHANGE_TYPE: 5205,\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\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","\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(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(`[${nowTime()}]`, this._prefix, ...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 = `[${nowTime()}]` + this._prefix + (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","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\n\nexport const SafeJSON = {\n stringify (obj) {\n try {\n return JSON.stringify(obj)\n } catch (e) {\n return ''\n }\n },\n parse (obj) {\n try {\n return JSON.parse(obj)\n } catch (e) {\n return undefined\n }\n }\n}\n","/* eslint-disable no-undef */\nimport { Buffer } from './buffer'\nimport { isBrowser } from './env'\nimport { ERR, StreamingError } from './error'\nimport { Logger } from './logger'\nimport { createPublicPromise, nowTime, SafeJSON } from './utils'\n\nfunction getMediaSource (preferMMS = true) {\n try {\n if (!isBrowser) return null\n\n if (preferMMS && typeof ManagedMediaSource !== 'undefined') return ManagedMediaSource\n\n return window.MediaSource\n } catch (e) {}\n}\n\nfunction isMMS (mediaSource) {\n return /ManagedMediaSource/gi.test(Object.prototype.toString.call(mediaSource))\n}\n\n/**\n * @param {TimeRanges} buffered\n */\nfunction getTimeRanges (buffered) {\n const ranges = []\n\n if (buffered instanceof TimeRanges) {\n for (let i = 0; i < buffered.length; i++) {\n ranges.push({\n start: buffered.start(i),\n end: buffered.end(i)\n })\n }\n }\n return ranges\n}\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 static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @param { boolean} preferMMS\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n const MediaSource = getMediaSource()\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 static isMMSOnly () {\n return typeof ManagedMediaSource !== 'undefined' && typeof MediaSource === 'undefined'\n }\n\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 _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 preferMMS: 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 hasOpTasks () {\n let flag = false\n Object.keys(this._queue).forEach(k => {\n const queue = this._queue[k]\n if (Array.isArray(queue)) {\n flag ||= queue.length > 0\n }\n })\n return flag\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 get streaming () {\n return isMMS(this.mediaSource) ? this.mediaSource.streaming : true\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('setDuration but ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('setDuration', duration)\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('sourceopen', costTime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @private\n */\n _onStartStreaming = () => {\n this._logger.debug('startstreaming')\n }\n\n /**\n * @private\n */\n _onEndStreaming = () => {\n this._logger.debug('endstreaming')\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\n const MediaSource = getMediaSource(this._config.preferMMS)\n\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 const useMMS = isMMS(ms)\n this._st = nowTime()\n\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n if (useMMS) {\n ms.addEventListener('startstreaming', this._onStartStreaming)\n ms.addEventListener('endstreaming', this._onEndStreaming)\n }\n\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n media.disableRemotePlayback = useMMS\n\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 if (isMMS(ms)) {\n ms.removeEventListener('startstreaming', this._onStartStreaming)\n ms.removeEventListener('endstreaming', this._onEndStreaming)\n }\n }\n\n if (this.media) {\n this.media.disableRemotePlayback = false\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') {\n return Promise.reject(\n new StreamingError(\n ERR.MEDIA,\n ERR.SUB_TYPES.MSE_CHANGE_TYPE,\n new Error('changeType is not a function')\n )\n )\n }\n\n return this._enqueueOp(type, () => {\n try {\n sb.changeType(mimeType)\n } catch (e) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_CHANGE_TYPE, e)\n }\n\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.remove(k, startTime, endTime)\n })\n return p || Promise.resolve()\n }\n\n clearAllBuffer () {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n const sb = this._sourceBuffer[k]\n p = this.remove(k, 0, Buffer.end(Buffer.get(sb)))\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 initQueue = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initQueue.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initQueue.length > 0 && this._queue[type].push(...initQueue)\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 if (op.context && typeof op.context === 'object'){\n op.context.isFull = true\n }\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(\n error.constructor === StreamingError\n ? error\n : new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error)\n )\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(${type}/${op.opName})`, SafeJSON.stringify(getTimeRanges(this._sourceBuffer[type]?.buffered)), costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n const callback = op.context?.callback\n if (callback && typeof callback === 'function'){\n callback(op.context)\n }\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 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, milliSecond) {\n return Math.round(byteLen * 8 * 1000 / milliSecond / 1024) // Kb/s\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 MEDIASOURCE_OPENED: 'core.mediasourceopened',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n APPEND_BUFFER: 'core.appendbuffer',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n CHASEFRAME: 'core.chaseframe',\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 && typeof fetch !== 'undefined' ? 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.<Uint8Array>} 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 _finnalUrl = ''\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\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","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n AV1: 'av1',\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m',\n OPUS: 'opus',\n MP3: 'mp3'\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 lastKeyFrameDts = 0\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 get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n if (/av01/.test(this.codec)) {\n return true\n }\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 container = ''\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 !!(\n this.sampleRate &&\n this.channelCount &&\n (this.codec || this.container) &&\n (this.codecType === AudioCodecType.AAC ||\n this.codecType === AudioCodecType.G711PCMA ||\n this.codecType === AudioCodecType.G711PCMU ||\n this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3)\n )\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 get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\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 get bitsAvailable () {\n return this._bitsAvailable\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\nexport function combineToFloat (integer, decimal) {\n return Number(integer + '.' + decimal)\n}\n\nexport function toDegree (matrix) {\n if (matrix.length < 5)\n return 0\n const scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4])\n return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI\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 (!frameLength || (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 = 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 { readBig32 } from '../utils'\n\nexport class NALu {\n /**\n * @param {Uint8Array} data\n * @returns {Uint8Array[]}\n */\n static parseAnnexB (data) {\n let j = data.byteLength - 1\n let dropZerosLength = 0\n // Collect tailing zeros.\n // end with 0x000000 and more...\n do {\n if (data[j] === 0x00) {\n dropZerosLength++\n } else {\n break\n }\n\n j--\n } while (j > 0)\n\n if (dropZerosLength >= 3) {\n // drop tailing zeros.\n data = data.subarray(0, j + 1)\n }\n\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 } else if (end < len - 1 && data[end + 1] !== 1) {\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, i + size), 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 { 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\n if (maxSubLayersMinus1 > eg.bitsAvailable) {\n throw new Error(`maxSubLayersMinus inavlid size ${maxSubLayersMinus1}`)\n }\n\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","/**\n * Opus documentation, https://opus-codec.org/docs/\n * Ogg Encapsulation for the Opus Audio Codec, https://datatracker.ietf.org/doc/html/rfc7845.html\n *\n * Packet Organization:\n *\n * Page 0 Pages 1 ... n Pages (n+1) ...\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * | | | | | | | | | | | | |\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * |||ID Header|| || Comment Header || ||Audio Data Packet 1| | ...\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * | | | | | | | | | | | | |\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * ^ ^ ^\n * | | |\n * | | Mandatory Page Break\n * | |\n * | ID header is contained on a single page\n * |\n * 'Beginning Of Stream'\n */\nexport class OPUS {\n static getFrameDuration (samples, timescale = 1000) {\n return 20\n }\n\n /**\n * Identification Header + Comment Header\n * @param {Uint8Array} data\n */\n static parseHeaderPackets (data) {\n if (!data.length) return\n\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\n // Identification Header\n let magicSignature = ''\n for (let i = 0; i < 8; i++) {\n magicSignature += String.fromCodePoint(data[i])\n }\n if (magicSignature !== 'OpusHead') {\n throw new Error('Invalid Opus MagicSignature')\n }\n\n // skip version\n // data[8]\n // console.log('Pre-skip', data[8])\n\n const channelCount = data[9]\n\n // skip Pre-skip\n // data[10] & data[11]\n console.log('Pre-skip', data[10], data[11])\n\n const sampleRate = dv.getUint32(12, true)\n const outputGain = dv.getInt16(16, true)\n\n // const mappingFamily = dv.getUint8(18)\n\n // play as no audio track stream\n if (!sampleRate) return\n\n const codec = 'opus'\n const originCodec = 'opus'\n const config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8)\n\n return {\n outputGain,\n sampleRate,\n channelCount,\n config,\n codec,\n originCodec\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC, OPUS } 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_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BROKEN_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_EXCEPTION_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 break\n if (this._videoTimestampBreak >= TRACK_BROKEN_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 break\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_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 break\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 switch (audioTrack.codecType) {\n case AudioCodecType.AAC: {\n audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n break\n }\n case AudioCodecType.OPUS: {\n audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale)\n break\n }\n case AudioCodecType.G711PCMA:\n case AudioCodecType.G711PCMU: {\n audioTrack.sampleDuration = this._getG711Duration(audioTrack)\n break\n }\n default:\n console.error('can\\'t fix audio codecType:', audioTrack.codecType)\n break\n }\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate =\n audioTrack.codecType === AudioCodecType.OPUS\n ? 20\n : audioTrack.codecType === AudioCodecType.AAC\n ? 1024\n : (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 break\n if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_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_EXCEPTION_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_EXCEPTION_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_EXCEPTION_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 if (audioTrack.codecType === AudioCodecType.OPUS) {\n const lastSample = samples[samples.length - 1]\n if (lastSample) {\n lastSample.duration = sample.pts - lastSample.pts\n }\n } else {\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n }\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","/**\n * AudioData\n * @property {number} FlvSoundFormat\n */\nexport const FlvSoundFormat = {\n MP3: 2,\n G711A: 7, // G.711 A-law logarithmic PCM\n G711M: 8, // G.711 mu-law logarithmic PCM\n AAC: 10, // AAC\n OPUS: 13\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'\nimport { FlvSoundFormat } from './soundFormat'\nimport { OPUS } from '../codec/opus'\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, seamlessLoadingSwitching) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\n\n if (discontinuity) {\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 if (seamlessLoadingSwitching) this.seamlessLoadingSwitching = true\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.codecType === AudioCodecType.OPUS ? 1000 : 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 const scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1]\n const metaData = scriptDataObject?.data?.onMetaData\n\n if (metaData) {\n if (videoTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n videoTrack.duration = metaData.duration * 1000\n }\n\n if (metaData.hasOwnProperty('width') && metaData.hasOwnProperty('height')) {\n videoTrack.width = metaData.width\n videoTrack.height = metaData.height\n }\n }\n\n if (audioTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n audioTrack.duration = metaData.duration * 1000\n }\n }\n }\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, seamlessLoadingSwitching) {\n this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching)\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 /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\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 !== FlvSoundFormat.AAC &&\n format !== FlvSoundFormat.G711A &&\n format !== FlvSoundFormat.G711M &&\n format !== FlvSoundFormat.OPUS\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {\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 switch (format) {\n case FlvSoundFormat.G711A:\n case FlvSoundFormat.G711M:\n this._parseG711(data, pts, format)\n break\n case FlvSoundFormat.AAC:\n this._parseAac(data, pts)\n break\n case FlvSoundFormat.OPUS:\n this._parseOpus(data, pts)\n break\n default:\n break\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseOpus (data, pts) {\n const track = this.audioTrack\n const packetType = data[1]\n\n track.codecType = AudioCodecType.OPUS\n\n switch (packetType) {\n case 0 /* Header Packets */: {\n const ret = OPUS.parseHeaderPackets(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.sampleDuration = OPUS.getFrameDuration([], track.timescale)\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n break\n }\n case 1 /* Raw OPUS frame data */: {\n if (pts === undefined || pts === null) return\n\n const newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration)\n track.samples.push(newSample)\n break\n }\n default:\n logger.warn(`Unknown OpusPacketType: ${packetType}`)\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @param {import('./soundFormat').FlvSoundFormat} format\n */\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n const audioData = data.subarray(1)\n\n if (audioData.byteLength < 1) return\n\n const sample = new AudioSample(pts, audioData)\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(sample)\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 (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {\n return\n }\n this.seamlessLoadingSwitching = false\n if (frameType === 1) {\n sample.setToKeyframe()\n track.lastKeyFrameDts = dts\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 { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu, MPEG } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\nimport { AudioCodecType } from '../model/types'\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, fixerConfig = {}) {\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, fixerConfig)\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 0x03:\n case 0x04:\n if (audioTrack.pid === -1) {\n audioTrack.pid = audioPid = esPid\n audioTrack.codecType = AudioCodecType.MP3\n }\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 case 38: // HEVC FD_NUT\n if (isHevc) {\n let ffByteFound = false\n for (let i = 2; i < unit.byteLength; i++) {\n if (unit[i] === 0xff) {\n ffByteFound = true\n break\n }\n }\n if (!ffByteFound) {\n return\n }\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 switch (this.audioTrack.codecType) {\n case AudioCodecType.AAC:\n this._parseAacData(pes)\n break\n case AudioCodecType.MP3:\n this._parseMPEG(pes)\n break\n default:\n }\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 _parseMPEG (pes) {\n const data = pes.data\n const length = data.length\n let frameIndex = 0\n let offset = 0\n const pts = pes.pts\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: MPEG PES unknown PTS')\n return\n }\n\n while (offset < length) {\n if (MPEG.isHeader(data, offset)) {\n const frame = MPEG.appendFrame(\n this.audioTrack,\n data,\n offset,\n pts,\n frameIndex\n )\n if (frame) {\n offset += frame.length\n frameIndex++\n } else {\n break\n }\n } else {\n offset++\n }\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","export class ByteReader {\n private dv: DataView\n start: number\n offset: number\n end: number\n constructor(buf: ArrayBuffer, offset: number, len: number) {\n this.dv = new DataView(buf)\n this.start = this.offset = offset || this.dv.byteOffset\n this.end = len ? this.start + len : this.start + this.dv.byteLength\n }\n static fromUint8(uint8: Uint8Array) {\n return new ByteReader(uint8.buffer, uint8.byteOffset, uint8.byteLength)\n }\n static concatUint8s(args: Uint8Array[]) {\n const uint8 = new Uint8Array(args.reduce((ret, v) => ret + v.byteLength, 0))\n let offset = 0\n args.forEach((v) => {\n uint8.set(v, offset)\n offset += v.byteLength\n })\n return uint8\n }\n static concatUint8(...args: Uint8Array[]) {\n return this.concatUint8s(args)\n }\n get buffer() {\n return this.dv.buffer\n }\n get unreadLength() {\n return Math.max(this.end - this.offset, 0)\n }\n get size() {\n return this.end - this.start\n }\n readFloat(byteNum: number) {\n let val = 0\n switch (byteNum) {\n case 4:\n val = this.dv.getFloat32(this.offset)\n break\n case 8:\n val = this.dv.getFloat64(this.offset)\n break\n default:\n throw new Error(`read ${byteNum}-byte float is not supported`)\n }\n this.offset += byteNum\n return val\n }\n back(byteNum: number) {\n this.offset -= byteNum\n }\n skip(byteNum: number) {\n this.offset += byteNum\n }\n readInt(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getInt8(offset)\n case 2:\n return this.dv.getInt16(offset)\n case 4:\n return this.dv.getInt32(offset)\n default:\n throw new Error(`read ${byteNum}-byte integers is not supported`)\n }\n }\n read(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getUint8(offset)\n case 2:\n return this.dv.getUint16(offset)\n case 3:\n return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2)\n case 4:\n return this.dv.getUint32(offset)\n default:\n this.back(byteNum - 4)\n // js不支持32位左移,可通过+、Math.pow运算达到64位以内运算的目的\n return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4)\n }\n }\n write(byteNum: number, val: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.setUint8(offset, val)\n case 2:\n return this.dv.setUint16(offset, val)\n case 3:\n return this.dv.setUint8(offset, val >>> 16),\n this.dv.setUint16(offset + 1, 0xffff & val)\n case 4:\n return this.dv.setUint32(offset, val)\n default:\n throw new Error(`write ${byteNum}-byte integers is not supported`)\n }\n }\n readToBuffer(len?: number) {\n let buffer: ArrayBuffer\n if (this.offset || len) {\n buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end)\n } else {\n buffer = this.dv.buffer\n }\n this.offset += buffer.byteLength\n return buffer\n }\n readToUint8(len?: number) {\n const uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength)\n this.offset += uint8.byteLength\n return uint8\n }\n readString(len: number) {\n let i = 0, str = ''\n for (; i < len; i++) {\n str += String.fromCharCode(this.dv.getUint8(this.offset))\n this.offset++\n }\n return str\n }\n}","import { ByteReader } from './byte-reader'\n\nexport class BitReader {\n private val: number\n size: number\n offset = 0\n constructor(val: number, size: number) {\n this.val = val\n this.size = size\n }\n static fromByte(byte: ByteReader, len: number) {\n return new BitReader(byte.read(len), len << 3)\n }\n skip(len: number) {\n this.offset += len\n }\n read(len: number) {\n const unreadLength = this.size - this.offset - len\n\n if (unreadLength >= 0) {\n let bits = 0, i = 0\n this.offset += len\n // 32位及以上的整数不支持位移运算,使用 / + Math.pow 规避\n if (this.size > 31) {\n for (; i < len; i++) {\n bits += Math.pow(2, i)\n }\n return this.val / Math.pow(2, unreadLength) & bits\n } else {\n for (; i < len; i++) {\n bits += 1 << i\n }\n return this.val >>> unreadLength & bits\n }\n }\n throw new Error(`the number of the read operation exceeds the total length limit of bits`)\n }\n}","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64, combineToFloat, toDegree } from '../utils'\nimport { AAC } from '../codec'\nimport { ByteReader } from '../utils/byte-reader'\nimport { BitReader } from '../utils/bit-reader'\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 const byte = ByteReader.fromUint8(data)\n if (ret.version === 1) {\n byte.read(8) // createTime\n byte.read(8) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(8)\n } else {\n byte.read(4) // createTime\n byte.read(4) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(4)\n }\n byte.skip(16) // reserved(8) + layer(2) + alternateGroup(2) + volume(2) + reserved(2)\n ret.matrix = [] // for remux\n for (let i = 0; i < 36; i++) {\n ret.matrix.push(byte.read(1))\n }\n byte.back(36)\n const caculatedMatrix = [] // for caculation of rotation\n for (let i = 0, int32; i < 3; i++) {\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n int32 = byte.readInt(4)\n caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 0x3fffffff)) // 2.30 fixed point\n }\n ret.rotation = toDegree(caculatedMatrix)\n ret.width = byte.read(4) // 16.16 fixed point, no parsed\n ret.height = byte.read(4) // 16.16 fixed point, no parsed\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 'av01':\n return MP4Parser.av01(b)\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 colr (box) {\n return parseBox(box, false, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n ret.data = box.data\n ret.colorType = byte.readString(4)\n // Array.from(data.subarray(0, 4)).map(v => String.fromCharCode(v)).join('')\n if (ret.colorType === 'nclx') {\n ret.colorPrimaries = byte.read(2)\n ret.transferCharacteristics = byte.read(2)\n ret.matrixCoefficients = byte.read(2)\n ret.fullRangeFlag = byte.read(1) >> 7\n } else if (ret.colorType === 'rICC' || ret.colorType === 'prof') {\n ret.iccProfile = data.readToUint8()\n }\n })\n }\n\n static av01 (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.av1C = MP4Parser.av1C(MP4Parser.findBox(bodyData, ['av1C'], start)[0])\n ret.colr = MP4Parser.colr(MP4Parser.findBox(bodyData, ['colr'], start)[0])\n })\n }\n\n static av1C (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n\n const byte = ByteReader.fromUint8(data)\n const bit = BitReader.fromByte(byte, 4)\n\n ret.marker = bit.read(1)\n ret.version = bit.read(7)\n\n ret.seqProfile = bit.read(3)\n ret.seqLevelIdx0 = bit.read(5)\n\n ret.seqTier0 = bit.read(1)\n ret.highBitdepth = bit.read(1)\n ret.twelveBit = bit.read(1)\n ret.monochrome = bit.read(1)\n ret.chromaSubsamplingX = bit.read(1)\n ret.chromaSubsamplingY = bit.read(1)\n ret.chromaSamplePosition = bit.read(2)\n ret.reserved = bit.read(3)\n ret.initialPresentationDelayPresent = bit.read(1)\n\n if (ret.initialPresentationDelayPresent) {\n ret.initialPresentationDelayMinusOne = bit.read(4)\n } else {\n ret.initialPresentationDelayMinusOne = 0\n }\n ret.configOBUs = byte.readToUint8()\n\n let bitdepth\n if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {\n bitdepth = ret.twelveBit === 1 ? '12' : '10'\n } else if (ret.seqProfile <= 2) {\n bitdepth = ret.highBitdepth === 1 ? '10' : '08'\n }\n ret.codec = [\n 'av01',\n ret.seqProfile,\n (ret.seqLevelIdx0 < 10 ? '0' + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? 'H' : 'M'),\n bitdepth\n ].join('.')\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.data = box.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 v.rotation = vTrack.tkhd.rotation\n v.matrix = vTrack.tkhd.matrix\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.av1C) {\n v.codecType = VideoCodecType.AV1\n v.codec = e1.av1C.codec\n v.av1C = e1.av1C.data\n if (e1.colr) {\n v.colr = e1.colr.data\n }\n } else 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) {\n throw new Error(`box ${box.type} size !== data.length`)\n }\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","\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 { AudioCodecType, TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse } from '../utils'\nimport Buffer from './buffer'\n\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'Opus',\n 'dOps',\n 'av01',\n 'av1C',\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\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 if (track.codecType === AudioCodecType.OPUS) {\n content = MP4.opus(track)\n } else {\n content = MP4.mp4a(track)\n }\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 if (track.av1C) {\n content = MP4.av01(track)\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 static av01 (track) {\n return MP4.box(MP4.types.av01, 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 ]), track.av1C, track.colr)\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 /**\n * https://opus-codec.org/docs/opus_in_isobmff.html\n */\n static opus (track) {\n const opusAudioDescription = new Uint8Array([\n 0x00, 0x00, 0x00, // version\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n track.channelCount,\n 0x00, 0x10, // sampleSize\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff,\n track.sampleRate & 0xff, // sampleRate\n 0x00, 0x00\n ])\n\n const opusSpecificConfig = track.config.length ? MP4.dOps(track) : []\n return MP4.box(MP4.types.Opus, opusAudioDescription, opusSpecificConfig)\n }\n\n static dOps (track) {\n if (track.config) {\n track.config[4] = (track.sampleRate >>> 24) & 0xFF\n track.config[5] = (track.sampleRate >>> 16) & 0xFF\n track.config[6] = (track.sampleRate >>> 8) & 0xFF\n track.config[7] = (track.sampleRate) & 0xFF\n\n return MP4.box(MP4.types.dOps, track.config)\n }\n\n // const {channelCount, channelConfigCode, sampleRate } = track\n\n // const mapping = channelConfigCode?.map((c) => {\n // return [\n // (c >>> 4) & 0xFF, // Channel mapping family\n // c & 0xFF // Channel mapping index\n // ]\n // }).flat() || []\n\n // const data = new Uint8Array([\n // 0x00, // version\n // channelCount, // channelCount\n // 0x00, 0x00, // preSkip\n // (sampleRate >>> 24) & 0xFF,\n // (sampleRate >>> 17) & 0xFF,\n // (sampleRate >>> 8) & 0xFF,\n // (sampleRate >>> 0) & 0xFF,\n // 0x00, 0x00, // Global Gain\n // ... mapping\n // ])\n\n // return data\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","/* 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","export class MediaError {\n constructor (msg, data) {\n this.type = 'file'\n this.message = msg\n this.data = data\n }\n}\n","export class Cache {\n _data = Object.create(null)\n\n set (id, data) {\n this._data[id] = data\n }\n\n get (id) {\n return this._data[id]\n }\n\n clear () {\n this._data = Object.create(null)\n }\n}\n","const TFHDFlag = {\n BASE_DATA_OFFSET: 1,\n SAMPLE_DESC: 2,\n SAMPLE_DUR: 8,\n SAMPLE_SIZE: 16,\n SAMPLE_FLAG: 32,\n DUR_EMPTY: 65536,\n DEFAULT_BASE_IS_MOOF: 131072\n}\nconst TRUNFlag = {\n DATA_OFFSET: 1,\n FIRST_FLAG: 4,\n DURATION: 256,\n SIZE: 512,\n FLAG: 1024,\n CTS_OFFSET: 2048\n}\nconst SampleFlag = {\n DEGRADATION_PRIORITY_MASK: 65535,\n IS_NON_SYNC: 65536,\n PADDING_MASK: 917504,\n REDUNDANCY_MASK: 3145728,\n DEPENDED_MASK: 12582912,\n DEPENDS_MASK: 50331648,\n DEPENDS_NO: 33554432,\n DEPENDS_YES: 16777216\n}\n\nexport function trafToSegments (traf, trex = {}, moofOffset, segDuration, timescale) {\n const { tfhd, trun, tfdt } = traf\n const { samples: trunSamples, flags: trunFlags } = trun\n const { flags: tfhdFlags } = tfhd\n\n // const defaultSampleDescriptionIndex = tfhdFlags & TFHDFlag.SAMPLE_DESC ? tfhd.sampleDescriptionIndex : (trex.defaultSampleDescriptionIndex || 1)\n const defaultSampleDuration = tfhdFlags & TFHDFlag.SAMPLE_DUR ? tfhd.defaultSampleDuration : (trex.defaultSampleDuration || 0)\n const defaultSampleSize = tfhdFlags & TFHDFlag.SAMPLE_SIZE ? tfhd.defaultSampleSize : (trex.defaultSampleSize || 0)\n const defaultSampleFlags = tfhdFlags & TFHDFlag.SAMPLE_FLAG ? tfhd.defaultSampleFlags : (trex.defaultSampleFlags || 0)\n const startOffset = tfhdFlags & TFHDFlag.BASE_DATA_OFFSET ? tfhd.baseDataOffset : (tfhdFlags & TFHDFlag.DEFAULT_BASE_IS_MOOF ? moofOffset : 0)\n\n const frames = []\n const gops = []\n\n for (let lastDts = 0, startTime = 0, gopId = 0, totalOffset = startOffset, i = 0; i < trunSamples.length; i++) {\n const frame = {}\n frame.index = i\n frame.size = trunFlags & TRUNFlag.SIZE ? trunSamples[i].size : defaultSampleSize\n frame.duration = trunFlags & TRUNFlag.DURATION ? trunSamples[i].duration : defaultSampleDuration\n frame.dts = lastDts > 0 ? lastDts : (tfdt ? tfdt.baseMediaDecodeTime : 0)\n frame.startTime = startTime\n if (trunFlags & TRUNFlag.CTS_OFFSET) {\n frame.pts = frame.dts + trunSamples[i].cts\n } else {\n frame.pts = frame.dts\n }\n lastDts = frame.dts + frame.duration\n startTime += frame.duration\n\n let sampleFlags = defaultSampleFlags\n if (trunFlags & TRUNFlag.FLAG) {\n sampleFlags = trunSamples[i].flags\n } else if (0 === i && trunFlags & TRUNFlag.FIRST_FLAG) {\n sampleFlags = trun.firstSampleFlag\n }\n frame.offset = totalOffset\n frame.keyframe = !(sampleFlags & (SampleFlag.IS_NON_SYNC | SampleFlag.DEPENDS_YES))\n totalOffset += frame.size\n frames.push(frame)\n if (frame.keyframe) {\n gopId++\n gops.push([frame])\n } else if (gops.length) {\n gops[gops.length - 1].push(frame)\n }\n frame.gopId = gopId\n }\n\n const len = frames.length\n if (!len || (!frames[0].keyframe)) return []\n\n let time = 0\n let lastFrame\n const segments = []\n const scaledDuration = segDuration * timescale\n let segmentFrames = []\n\n // 合并gop至segments,以segDuration作为参考\n for (let i = 0, len = gops.length; i < len; i++) {\n time += gops[i].reduce((wret, w) => wret + w.duration, 0)\n segmentFrames = segmentFrames.concat(gops[i])\n\n if (time >= scaledDuration || i === gops.length - 1) {\n lastFrame = segmentFrames[segmentFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segmentFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: time / timescale,\n range: [segmentFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segmentFrames\n })\n time = 0\n segmentFrames = []\n }\n }\n\n return segments\n}\n\nexport function sidxToSegments (moov, sidx) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let audioSegments = []\n let videoSegments = []\n if (sidx) {\n const segments = []\n let prevTime = 0\n let prevOffset = sidx.start + sidx.size\n sidx.references.forEach((ref, i) => {\n segments.push({\n index: i,\n startTime: prevTime,\n endTime: prevTime + (ref.subsegment_duration / sidx.timescale),\n duration: ref.subsegment_duration / sidx.timescale,\n range: [prevOffset, prevOffset + ref.referenced_size],\n frames: []\n })\n prevTime += ref.subsegment_duration / sidx.timescale\n prevOffset += ref.referenced_size\n })\n audioSegments = segments\n videoSegments = segments\n } else {\n // 如果sidx不存在,则代表后续的segments无法通过seek读取\n // 把整段fmp4当作一个segment,使用开区间range即可\n const getTrakSegments = (box) => {\n if (!box) return []\n return [{\n index: 0,\n startTime: 0,\n endTime: box.duration / box.timescale,\n duration: box.duration / box.timescale,\n range: [moov.start + moov.size, ''],\n frames: []\n }]\n }\n videoSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : videoTrack.mdia?.mdhd)\n audioSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : audioTrack.mdia?.mdhd)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\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 let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 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 let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.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 const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return []\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n return segments\n}\n\nexport function moovToMeta (moov, isFragmentMP4) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC || e1.av1C)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov,\n isFragmentMP4\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments, sidxToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n\n // 当box存在但不完整时,补全box\n const getCompletedBox = async (name) => {\n const box = MP4Parser.findBox(this.buffer, [name])[0]\n if (box) {\n if (box.size > box.data.length) {\n const res = await this.loadData([box.start, box.start + box.size - 1], cache, config)\n if (res) {\n return MP4Parser.findBox(res.data, [name])[0]\n }\n } else {\n return box\n }\n }\n }\n\n // 现在的分段式range加载逻辑不适用于fmp4,需要判断太多条件\n // 因为fmp4的samples信息存放在moof中,而解析moof的range需要依赖sidx\n // 而sidx和moof的size都是动态的(且sidx不一定存在),导致每个环节都需要判断是否满足解析条件以及对应的兜底处理\n // todo: 后续加载逻辑需要改为【开区间range+主动取消】才能更好的处理fmp4\n let isFragmentMP4 = false\n if (!(segments && segments.videoSegments.length && segments.audioSegments.length)) {\n const sidx = await getCompletedBox('sidx')\n if (sidx) {\n const parsedSidx = MP4Parser.sidx(sidx)\n if (parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx)\n isFragmentMP4 = true\n }\n } else {\n // 无 sidx box 场景,当前架构只能通过模拟加载完整的fmp4来解析出segments,这样会导致fetch加载的数据量特别大,loading时间长\n // 更倾向于使用【开区间range+主动取消】方案异步读取,todo\n }\n }\n\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov, isFragmentMP4)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n let parsedSidx\n if (!(segments.videoSegments.length && segments.audioSegments.length)) {\n const moof = MP4Parser.findBox(this.buffer, ['moof'])[0]\n const sidx = MP4Parser.findBox(this.buffer, ['sidx'])[0]\n if (moof && moof.size <= moof.data.length && sidx) {\n const parsedMoof = MP4Parser.moof(moof)\n\n parsedSidx = MP4Parser.sidx(sidx)\n if (parsedMoof && parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx, parsedMoof)\n }\n }\n }\n\n this.meta = moovToMeta(parsedMoov, parsedSidx)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n"],"names":["Buffer","_classCallCheck","key","value","buf","length","end","start","b","buffered","error","maxHole","buffers","i","l","bufLen","last","lastEnd","push","reduce","a","c","pos","arguments","undefined","index","nextStart","nextEnd","prevStart","prevEnd","item","currentTime","behind","remaining","totalLength","media","get","isBrowser","window","ERR","FLV","HLS","MP4","FMP4","MSE_ADD_SB","MSE_APPEND_BUFFER","MSE_OTHER","MSE_FULL","MSE_CHANGE_TYPE","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","LogCacheLevel","DEBUG","LOG","WARN","ERROR","SIMPLE_TYPE","Logger","name","config","this","_prefix","concat","logCacheLevel","logMaxSize","logSize","logTextArray","_createClass","_console","_len","args","Array","_key","logCache","apply","disabled","console","debug","nowTime","_console2","_len2","_key2","log","_console3","_len3","_key3","warn","_console4","_len4","_key4","text","_len5","logText","_key5","finLogText","map","logable","JSON","stringify","e","delLog","shift","join","reset","_console5","group","table","groupEnd","val","Date","toLocaleString","reduceDepth","_typeof","objType","Object","prototype","toString","slice","obj","maxDepth","depth","result","includes","hasOwnProperty","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","parseInt","performance","now","getTime","SafeJSON","getMediaSource","preferMMS","ManagedMediaSource","MediaSource","isMMS","mediaSource","test","OP_NAME","MSE","_this2","create","_logger","queue","_queue","op","opName","_this2$_sourceBuffer$","_op$context","costtime","_opst","ranges","TimeRanges","getTimeRanges","_sourceBuffer","context","callback","_startQueue","event","_config","assign","getDefaultConfig","bindMedia","openLog","enable","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","readyState","_this3","flag","keys","forEach","k","isArray","_url","_this$mediaSource2","duration","streaming","_mseFullFlag","VIDEO","_this4","isReduceDuration","bufferEnd","Math","max","_enqueueBlockingOp","isEnded","_this5","_openPromise","isOpened","ms","addEventListener","onOpen","costTime","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","useMMS","_this6","wrap","_context","prev","next","unbindMedia","revokeObjectURL","src","_onStartStreaming","_onEndStreaming","URL","createObjectURL","disableRemotePlayback","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this7","_context2","t","x","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this8","changeType","_enqueueOp","createSource","buffer","_this9","byteLength","_this9$_sourceBuffer$","appendBuffer","startTime","endTime","_this10","isInsertHead","remove","p","_this11","_this12","allClear","_this$_queue$type","initQueue","isinit","reason","_this13","setLiveSeekableRange","exec","_this14","splice","then","_callee3","types","waiters","_this15","_context3","prom","all","updating","_x2","_x3","_x4","_op$promise","_op$promise2","indexOf","isFull","constructor","timestampOffset","_this16","_this17","abort","mime","isTypeSupported","LoaderType","ResponseType","NetError","request","_assertThisInitialized","isPlainObject","getPrototypeOf","getRangeValue","ret","encode","encodeURIComponent","replace","setUrlParams","params","v","str","toISOString","isObject","filter","Boolean","hashIndex","createResponse","data","done","contentLength","age","firstByteTime","range","vid","priOptions","parseFloat","Number","isNaN","options","calculateSpeed","byteLen","milliSecond","round","EVENT","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","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","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","sequenceNumber","width","height","fpsDen","fpsNum","baseMediaDecodeTime","timescale","codec","present","pid","pps","sps","vps","sarRatio","samples","warnings","hvcC","dts","pts","first","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","container","codecType","isAudioEncryption","VideoSample","units","originPts","originDts","keyframe","dependsOn","isNonSyncSample","AudioSample","sampleOffset","size","Sample","FlvScriptSample","_Sample","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","_data","_bytesAvailable","_loadWord","_bitsAvailable","position","availableBytes","min","workingBytes","subarray","_word","DataView","getUint32","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","isFirefox","isAndroid","MAX_SIZE","pow","readBig16","readBig32","readBig64","getAvcCodec","codecs","h","parse","combineToFloat","integer","decimal","AAC","rate","FREQ","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","NALu","dropZerosLength","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","fps","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","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","bitsAvailable","OPUS","dv","byteOffset","magicSignature","fromCodePoint","outputGain","getInt16","MAX_SILENT_FRAME_DURATION","AUDIO_EXCEPTION_LOG_EMIT_DURATION","FlvFixer","videoTrack","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","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","G711PCMA","_getG711Duration","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","track","sampleSize","getSilentFrame","AMF","_parseValue","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","decode","getUint16","FlvSoundFormat","FlvDemuxer","_fixer","_scriptDataObject$dat","seamlessLoadingSwitching","_remainingData","_headerParsed","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","scriptDataObject","metaData","onMetaData","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","G711A","_parseG711","_parseAac","_parseOpus","packetType","parseHeaderPackets","newSample","audioData","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","lastKeyFrameDts","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","ByteReader","byteNum","getFloat32","getInt8","getInt32","back","setUint8","setUint16","setUint32","uint8","unreadLength","concatUint8s","BitReader","byte","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","fromUint8","matrix","int32","caculatedMatrix","readInt","rotation","scaled0","hypot","scaled1","atan2","PI","toDegree","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","av01","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","colorType","readString","colorPrimaries","transferCharacteristics","matrixCoefficients","fullRangeFlag","iccProfile","readToUint8","bodyStart","parseVisualSampleEntry","av1C","colr","bitdepth","bit","fromByte","marker","seqProfile","seqLevelIdx0","seqTier0","highBitdepth","twelveBit","monochrome","chromaSubsamplingX","chromaSubsamplingY","chromaSamplePosition","reserved","initialPresentationDelayPresent","initialPresentationDelayMinusOne","configOBUs","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","Concat","ResultConstructor","arrays","self","UINT32_MAX","FTYPHEV1","FTYPAVC1","ftyp","content","mvex","_toConsumableArray","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","opus","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","opusAudioDescription","opusSpecificConfig","dOps","Opus","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","Base","properties","clone","_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","MediaError","Cache","sidxToSegments","audioSegments","videoSegments","segments","prevTime","prevOffset","_videoTrack$mdia","_audioTrack$mdia","getTrakSegments","moovToSegments","segmentDurations","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia$mdhd","segDuration","_stscEntries$","frame","gop","gopDuration","lastFrame","segFrames","adjust","pushSegment","_segments2","_segFrames","curTime","moovToMeta","isFragmentMP4","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia3","_videoTrack$mdia3$min","_videoTrack$mdia3$min2","_videoTrack$mdia4","_videoTrack$mdia4$mdh","_audioTrack$mdia3","_audioTrack$mdia3$min","_audioTrack$mdia3$min2","_e1$esds","_audioTrack$mdia4","_audioTrack$mdia4$mdh","_t$mdia5","_t$mdia5$hdlr","_t$mdia6","_t$mdia6$hdlr","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee5","moovStart","OnProgressHandle","_context5","_callee4","state","_moovStart","parsedMoov","getCompletedBox","parsedSidx","_segments","_context4","loadData","loadMetaProcess","_res","_x10","_x7","_x8","_x9","_x5","_x6","_callee6","responses","parsedMoof","_context6","_x11","_x12","_x13","segmentIndex","_callee7","changeCurrent","_this$getSegmentByTim","_args7","_context7","getSegmentByTime","_loadSegment","loadSegmentByTime","_x14","_x15","_callee8","_args8","_context8","_x16","_callee10","_this$getSegmentByTim2","videos","audios","_context10","_callee9","_context9","_x18","_x17","_callee11","_args11","_context11","downloadInfo","_callee12","_context12","clear","_callee13","_context13","finish","_x19","_x20","_x21","_x22","_x23","_callee14","cacheKey","_context14","_getCacheKey","fromCache","_x24","_x25","_x26"],"mappings":"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"}