{"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-streaming-shared/src/services/gap.js","../../xgplayer-streaming-shared/src/services/sei.js","../../xgplayer-streaming-shared/src/services/bandwidth.js","../../xgplayer-streaming-shared/src/services/stats.js","../../xgplayer-transmuxer/src/model/types.js","../../xgplayer-transmuxer/src/model/video-track.js","../../xgplayer-transmuxer/src/model/audio-track.js","../../xgplayer-transmuxer/src/model/video-sample.js","../../xgplayer-transmuxer/src/model/audio-sample.js","../../xgplayer-transmuxer/src/model/metadata-track.js","../../xgplayer-transmuxer/src/utils/exp-golomb.js","../../xgplayer-transmuxer/src/utils/logger.js","../../xgplayer-transmuxer/src/utils/utf8.js","../../xgplayer-transmuxer/src/utils/env.js","../../xgplayer-transmuxer/src/utils/index.js","../../xgplayer-transmuxer/src/codec/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/codec/mpeg.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/fixer.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/fmp4-demuxer.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../xgplayer-transmuxer/src/mp4/fmp4-remuxer.js","../../../node_modules/crypto-es/lib/core.js","../../../node_modules/crypto-es/lib/enc-base64.js","../../../node_modules/crypto-es/lib/evpkdf.js","../../../node_modules/crypto-es/lib/cipher-core.js","../../../node_modules/crypto-es/lib/aes.js","../../../node_modules/crypto-es/lib/mode-ctr.js","../src/hls/buffer-service/decrypt/index.js","../src/hls/constants.js","../src/hls/buffer-service/transmuxer/index.js","../src/hls/buffer-service/index.js","../src/hls/manifest-loader/parser/model.js","../src/hls/manifest-loader/parser/utils.js","../src/hls/manifest-loader/parser/master.js","../src/hls/manifest-loader/parser/media.js","../src/hls/manifest-loader/parser/index.js","../src/hls/manifest-loader/index.js","../src/hls/utils.js","../src/hls/playlist/stream.js","../src/hls/playlist/index.js","../src/hls/segment-loader/index.js","../src/hls/index.js","../src/hls/config.js","../src/plugin-extension.js","../src/plugin.js"],"sourcesContent":["export 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.} 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","import { Buffer } from '../buffer'\n\nexport class GapService {\n _prevCurrentTime = 0\n\n do (media, maxJumpDistance = 3, isLive, seekThreshold = 1) {\n if (!media) return\n\n const currentTime = media.currentTime\n let jumpTo = 0\n\n if (this._prevCurrentTime === currentTime) {\n const info = Buffer.info(Buffer.get(media), currentTime)\n if (!info.buffers.length) return\n if (\n (isLive && info.nextStart) ||\n (info.nextStart && info.nextStart - currentTime < maxJumpDistance)\n ) {\n jumpTo = info.nextStart + 0.1\n } else if (info.end && info.end - currentTime > seekThreshold && !media.seeking) {\n jumpTo = currentTime + 0.1\n }\n }\n\n this._prevCurrentTime = currentTime\n\n if (jumpTo && currentTime !== jumpTo) {\n media.currentTime = jumpTo\n }\n }\n}\n","import { EVENT } from '../event'\n\nexport class SeiService {\n _seiSet = new Set()\n\n constructor (emitter) {\n this.emitter = emitter\n\n emitter.on(EVENT.SEI, sei => {\n if (sei) this._seiSet.add(sei)\n })\n }\n\n throw (currentTime, isLive) {\n if (currentTime === null || currentTime === undefined || !this._seiSet.size) return\n const min = currentTime - 0.2\n const max = currentTime + 0.2\n const toThrow = []\n this._seiSet.forEach(sei => {\n if (sei.time >= min && sei.time <= max) {\n toThrow.push(sei)\n }\n })\n\n toThrow.forEach(sei => {\n this._seiSet.delete(sei)\n this.emitter.emit(EVENT.SEI_IN_TIME, sei)\n })\n\n if (!isLive) return\n\n this._seiSet.forEach(s => {\n if (s.time < currentTime - 5) {\n this._seiSet.delete(s)\n }\n })\n }\n\n reset () {\n this._seiSet.clear()\n }\n}\n","\n\nconst SKIP_SMALL_CHUNK = 1000\nconst MAX_CHUNK_SAVE_SIZE = 50\nconst MAX_SEGMENT_SAVE_SIZE = 3\nconst LONGTIME_NO_RECEIVE = 3000\n\nexport class BandwidthService {\n _chunkSpeed = 0 // bps\n _chunkCache = []\n _speeds = [] // bps\n _totalSize = 0\n _totalCost = 0\n\n /**\n * @typedef {{\n * chunkCountForSpeed?: number,\n * skipChunkSize?: number,\n * longtimeNoReceived?: number\n * }} Opts\n *\n * @param {Opts} opts\n */\n constructor (opts) {\n this._opts = opts || {}\n }\n\n addRecord (totalByte, ms) {\n if (!totalByte || !ms) return\n this._speeds.push(8000 * totalByte / ms)\n this._speeds = this._speeds.slice(-MAX_SEGMENT_SAVE_SIZE)\n }\n\n addChunkRecord (totalByte, ms) {\n if (!totalByte || !ms || totalByte < (this._opts?.skipChunkSize || SKIP_SMALL_CHUNK)) return\n\n this._totalSize += totalByte\n this._totalCost += ms\n\n this._chunkSpeed = 8000 * totalByte / ms\n this._chunkCache.push({\n size: totalByte,\n duration: ms,\n timestamp: performance.now()\n })\n\n const size = this._opts?.chunkCountForSpeed || MAX_CHUNK_SAVE_SIZE\n\n if (this._chunkCache.length > size) {\n this._chunkCache = this._chunkCache.slice(-size)\n }\n }\n\n /**\n *\n * @returns { number }\n */\n getAvgSpeed () {\n if (!this._chunkCache.length && !this._speeds.length) return 0\n if (this._speeds.length) {\n return this._speeds.reduce((a, c) => (a += c)) / this._speeds.length\n }\n\n // for long time no chunk received, append 0 size chunk\n const lastSample = this._chunkCache[this._chunkCache.length - 1]\n const cost = performance.now() - lastSample.timestamp\n if ( cost > (this._opts?.longtimeNoReceived || LONGTIME_NO_RECEIVE)) {\n this._chunkCache.push({\n size: 0,\n duration: cost,\n timestamp: performance.now()\n })\n }\n\n const totalSize = this._chunkCache.reduce((a, c) => a += c.size, 0)\n const totalDuration = this._chunkCache.reduce((a, c) => a += c.duration, 0)\n return 8000 * totalSize / totalDuration\n }\n\n /**\n *\n * @returns { number }\n */\n getLatestSpeed () {\n if (!this._chunkCache.length && !this._speeds.length) return 0\n if (this._speeds.length) {\n return this._speeds[this._speeds.length - 1]\n }\n return this._chunkSpeed\n }\n\n /**\n *\n * @returns { number }\n */\n getTotalSize () {\n return this._totalSize\n }\n\n /**\n *\n * @returns { number }\n */\n getTotalCost () {\n return this._totalCost\n }\n\n reset () {\n this._chunkCache = []\n this._speeds = []\n this._totalSize = 0\n this._totalCost = 0\n }\n}\n\n","import { EVENT } from 'xgplayer-streaming-shared'\n\nclass Stats {\n encodeType = '' // hevc | avc\n audioCodec = ''\n videoCodec = ''\n domain = '' // stream url domain\n fps = 0\n bitrate = 0 // 最新1s下载数据的码率\n width = 0\n height = 0\n samplerate = 0\n channelCount = 0\n gop = 0 // 第一个gop帧数\n\n _bitsAccumulateSize = 0\n _bitsAccumulateDuration = 0\n _startGopId = -1\n\n constructor (timescale) {\n this._timescale = timescale\n }\n\n getStats () {\n return {\n encodeType: this.encodeType,\n audioCodec: this.audioCodec,\n videoCodec: this.videoCodec,\n domain: this.domain,\n fps: this.fps,\n bitrate: this.bitrate,\n width: this.width,\n height: this.height,\n samplerate: this.samplerate,\n channelCount: this.channelCount,\n gop: this.gop\n }\n }\n\n setEncodeType (encode) {\n this.encodeType = encode\n }\n\n setFpsFromScriptData ({data}) {\n const fps = data?.onMetaData?.framerate\n if (fps && fps > 0 && fps < 100) {\n this.fps = fps\n }\n }\n\n setVideoMeta (track) {\n this.width = track.width\n this.height = track.height\n this.videoCodec = track.codec\n this.encodeType = track.codecType\n if (track.fpsNum && track.fpsDen) {\n const fps = track.fpsNum / track.fpsDen\n if (fps > 0 && fps < 100) {\n this.fps = fps\n }\n }\n }\n\n setAudioMeta (track) {\n this.audioCodec = track.codec\n this.samplerate = track.sampleRate\n this.channelCount = track.channelCount\n }\n\n setDomain (responseUrl) {\n this.domain = responseUrl.split('/').slice(2, 3)[0]\n }\n\n updateBitrate (samples) {\n if (!this.fps || this.fps >= 100) {\n if (samples.length) {\n const duration = samples.reduce((a,b) => a += b.duration, 0) / samples.length\n this.fps = Math.round(this._timescale / duration)\n }\n }\n samples.forEach(sample => {\n if (this._startGopId === -1) {\n this._startGopId = sample.gopId\n }\n if (sample.gopId === this._startGopId) {\n this.gop++\n }\n this._bitsAccumulateDuration += sample.duration / (this._timescale / 1000)\n this._bitsAccumulateSize += sample.units.reduce((a, c) => (a += c.length), 0)\n if (this._bitsAccumulateDuration >= 1000) {\n this.bitrate = this._bitsAccumulateSize * 8\n this._bitsAccumulateDuration = 0\n this._bitsAccumulateSize = 0\n }\n })\n }\n}\n\n\n/**\n * @typedef {Object} StatsInfo\n * @property {number} downloadSpeed\n * @property {number} avgSpeed\n * @property {number} currentTime\n * @property {number} bufferEnd\n * @property {number} decodeFps\n * @property {string} encodeType\n * @property {string} audioCodec\n * @property {string} videoCodec\n * @property {string} domain\n * @property {number} fps\n * @property {number} bitrate\n * @property {number} width\n * @property {number} height\n * @property {number} samplerate\n * @property {number} channelCount\n * @property {number} gop\n */\nclass MediaStatsService {\n\n _core = null\n\n _samples = []\n\n constructor (core, timescale = 1000) {\n this._core = core\n this._timescale = timescale\n this._stats = new Stats(timescale)\n this._bindEvents()\n }\n\n\n /** @returns {StatsInfo} */\n getStats () {\n const { currentTime = 0, decodeFps = 0 } = this._core?.media || {}\n return {\n ...this._stats.getStats(),\n downloadSpeed: this._core?.speedInfo?.().speed || 0,\n avgSpeed: this._core?.speedInfo?.().avgSpeed || 0,\n totalReceivedByte: this._core?.speedInfo?.().totalSize || 0,\n totalReceivedCost: this._core?.speedInfo?.().totalCost || 0,\n currentTime,\n bufferEnd: this._core?.bufferInfo()?.remaining || 0,\n decodeFps\n }\n }\n\n _bindEvents () {\n this._core.on(EVENT.DEMUXED_TRACK, ({videoTrack}) => this._stats.updateBitrate(videoTrack.samples))\n\n this._core.on(EVENT.FLV_SCRIPT_DATA, data => {\n this._stats.setFpsFromScriptData(data)\n })\n\n this._core.on(EVENT.METADATA_PARSED, e => {\n if (e.type === 'video') {\n this._stats.setVideoMeta(e.track)\n } else {\n this._stats.setAudioMeta(e.track)\n }\n })\n\n this._core.on(EVENT.TTFB, e => {\n this._stats.setDomain(e.responseUrl)\n })\n\n }\n\n reset () {\n this._samples = []\n this._stats = new Stats(this._timescale)\n }\n\n}\n\nexport { MediaStatsService }\n","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n 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 = (originObjectType === 2 || originObjectType === 5) ? originObjectType : 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { readBig32 } from '../utils'\n\nexport class NALu {\n static parseAnnexB (data) {\n const len = data.length\n let start = 2\n let end = 0\n while (data[start] !== null && data[start] !== undefined && data[start] !== 1) {\n start++\n }\n start++\n end = start + 2\n\n if (end >= len) return []\n\n const units = []\n\n while (end < len) {\n switch (data[end]) {\n case 0:\n if (data[end - 1] !== 0) {\n end += 2\n break\n } else if (data[end - 2] !== 0) {\n end++\n break\n }\n\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n\n do {\n end++\n } while (data[end] !== 1 && end < len)\n start = end + 1\n end = start + 2\n break\n case 1:\n if (data[end - 1] !== 0 || data[end - 2] !== 0) {\n end += 3\n break\n }\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n start = end + 1\n end = start + 2\n break\n default:\n end += 3\n break\n }\n }\n\n if (start < len) units.push(data.subarray(start))\n\n return units\n }\n\n static parseAvcC (data, size = 4) {\n if (data.length < 4) return\n const dataLen = data.length\n const units = []\n\n let offset = 0\n let length\n while ((offset + size) < dataLen) {\n length = readBig32(data, offset)\n if (size === 3) length >>>= 8\n offset += size\n\n if (!length) continue\n if (offset + length > dataLen) {\n break\n }\n\n units.push(data.subarray(offset, offset + length))\n offset += length\n }\n\n return units\n }\n\n static parseSEI (unit, isHevc) {\n const len = unit.length\n let i = isHevc ? 2 : 1\n let type = 0\n let size = 0\n let uuid = ''\n\n while (unit[i] === 255) {\n type += 255\n i++\n }\n\n type += unit[i++]\n\n while (unit[i] === 255) {\n size += 255\n i++\n }\n size += unit[i++]\n\n if (type === 5 && len > i + 16) {\n for (let j = 0; j < 16; j++) {\n uuid += unit[i].toString(16)\n i++\n }\n }\n\n return {\n payload: unit.subarray(i, 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 { isFirefox } from '../utils'\n\nconst BitratesMap = [\n 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56,\n 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80,\n 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144,\n 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144,\n 160\n]\n\nconst FREQ = [\n 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000\n]\n\nconst SamplesCoefficients = [\n // MPEG 2.5\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12 // Layer1\n ],\n // Reserved\n [\n 0, // Reserved\n 0, // Layer3\n 0, // Layer2\n 0 // Layer1\n ],\n // MPEG 2\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12 // Layer1\n ],\n // MPEG 1\n [\n 0, // Reserved\n 144, // Layer3\n 144, // Layer2\n 12 // Layer1\n ]\n]\n\nconst BytesInSlot = [\n 0, // Reserved\n 1, // Layer3\n 1, // Layer2\n 4 // Layer1\n]\n\nlet chromeVersion = null\n\nexport class MPEG {\n static isHeader (data, offset) {\n return offset + 1 < data.length && (\n data[offset] === 0xff &&\n (data[offset + 1] & 0xe0) === 0xe0 &&\n (data[offset + 1] & 0x06) !== 0x00\n )\n }\n\n static appendFrame (\n track,\n data,\n offset,\n pts,\n frameIndex\n ) {\n if (offset + 24 > data.length) {\n return\n }\n\n const header = MPEG.parseHeader(data, offset)\n if (header && offset + header.frameLength <= data.length) {\n const frameDuration = (header.samplesPerFrame * 90000) / header.sampleRate\n const stamp = pts + frameIndex * frameDuration\n const sample = {\n data: data.subarray(offset, offset + header.frameLength),\n pts: stamp,\n dts: stamp\n }\n sample.size = sample.data.byteLength\n track.config = []\n track.channelCount = header.channelCount\n track.sampleRate = header.sampleRate\n if (isFirefox) {\n track.codec = 'mp3'\n } else {\n track.container = 'audio/mpeg'\n }\n track.samples.push(sample)\n\n return { length: header.frameLength }\n }\n }\n\n static parseHeader (data, offset) {\n const mpegVersion = (data[offset + 1] >> 3) & 3\n const mpegLayer = (data[offset + 1] >> 1) & 3\n const bitRateIndex = (data[offset + 2] >> 4) & 15\n const sampleRateIndex = (data[offset + 2] >> 2) & 3\n if (\n mpegVersion !== 1 &&\n bitRateIndex !== 0 &&\n bitRateIndex !== 15 &&\n sampleRateIndex !== 3\n ) {\n const paddingBit = (data[offset + 2] >> 1) & 1\n const channelMode = data[offset + 3] >> 6\n const columnInBitrates =\n mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4\n const bitRate =\n BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1000\n const columnInSampleRates =\n mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2\n const sampleRate = FREQ[columnInSampleRates * 3 + sampleRateIndex]\n const channelCount = channelMode === 3 ? 1 : 2\n const sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer]\n const bytesInSlot = BytesInSlot[mpegLayer]\n const samplesPerFrame = sampleCoefficient * 8 * bytesInSlot\n const frameLength =\n Math.floor((sampleCoefficient * bitRate) / sampleRate + paddingBit) *\n bytesInSlot\n\n if (chromeVersion === null) {\n const userAgent = navigator.userAgent || ''\n const result = userAgent.match(/Chrome\\/(\\d+)/i)\n chromeVersion = result ? parseInt(result[1]) : 0\n }\n const needChromeFix = !!chromeVersion && chromeVersion <= 87\n\n if (\n needChromeFix &&\n mpegLayer === 2 &&\n bitRate >= 224000 &&\n channelMode === 0\n ) {\n data[offset + 3] = data[offset + 3] | 0x80\n }\n\n return { sampleRate, channelCount, frameLength, samplesPerFrame }\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 { AudioSample, WarningType } from '../model'\nimport { AAC } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 90000 / 2 // 500ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 90000 // 1s\nconst AUDIO_EXCETION_LOG_EMIT_DURATION = 5 * 90000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 90000 // 1s\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 90000 / 2 // 500ms\nconst LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD = 90000 * 5 // 5s\n\nexport class TsFixer {\n constructor (videoTrack, audioTrack, metadataTrack, fixerConfig) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseVideoDts = -1\n this._baseAudioDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = false\n this._videoTimestampBreak = false\n\n this._lastAudioExceptionGapDot = 0\n this._lastAudioExceptionOverlapDot = 0\n this._lastAudioExceptionLargeGapDot = 0\n\n this._needForceFixLargeGap = fixerConfig?.forceFixLargeGap\n this._largeGapThreshold = fixerConfig?.largeGapThreshold || LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD\n }\n\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 90000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n const vSamples = videoTrack.samples\n const aSamples = audioTrack.samples\n\n if (!vSamples.length && !aSamples.length) return\n\n const firstVideoSample = vSamples[0]\n const firstAudioSample = aSamples[0]\n // consider av delta\n let vaDelta = 0\n\n if (vSamples.length && aSamples.length) {\n vaDelta = firstVideoSample.dts - firstAudioSample.pts\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n }\n\n // recalc baseDts\n if (discontinuity) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n this._baseDts -= startTime\n this._baseAudioDts -= startTime\n this._baseVideoDts -= startTime\n }\n\n // id discontinue, recalc nextDts, consider av delta of firstframe\n if (!contiguous) {\n /**\n * segment.start = min(a, v)\n * segment.start\n * |\n * a\n * -- vaDelta --\n * v\n */\n this._videoNextDts = vaDelta > 0 ? startTime + vaDelta : startTime\n this._audioNextPts = vaDelta > 0 ? startTime : startTime - vaDelta\n\n if (this._needForceFixLargeGap){\n this._videoNextDts = 0\n this._audioNextPts = 0\n }\n const vDeltaToNextDts = firstVideoSample ? firstVideoSample.dts - this._baseDts - this._videoNextDts : 0\n const aDeltaToNextDts = firstAudioSample ? firstAudioSample.pts - this._baseDts - this._audioNextPts : 0\n\n if (Math.abs(vDeltaToNextDts || aDeltaToNextDts) > MAX_VIDEO_FRAME_DURATION) {\n this._calculateBaseDts(this.audioTrack, this.videoTrack)\n this._baseDts -= startTime\n }\n }\n\n this._resetBaseDtsWhenStreamBreaked()\n\n // fix audio first\n this._fixAudio(audioTrack)\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 90000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n samples.forEach(x => {\n x.dts -= this._needForceFixLargeGap ? this._baseVideoDts : this._baseDts\n x.pts -= this._needForceFixLargeGap ? this._baseVideoDts : this._baseDts\n })\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const nextSample = samples[1]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts / 90,\n firstSampleDts: firstSample.dts / 90,\n nextSampleDts: (samples[1]?.dts || 0) / 90,\n sampleDuration: vDelta / 90\n })\n\n // resolve first frame first\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n\n\n // check to ajust the whole segment\n if (nextSample && Math.abs(nextSample.dts - firstSample.dts) > MAX_VIDEO_FRAME_DURATION) {\n this._videoTimestampBreak = true\n samples.forEach((x, i) => {\n if (i === 0) return\n x.dts += vDelta\n x.pts += vDelta\n })\n } else {\n for (let i = 1; i < len - 1; i++) {\n const dts = samples[i]?.dts\n const prevDts = samples[i - 1 ].dts\n if (dts && dts - prevDts < 0) {\n samples[i].dts += vDelta\n samples[i].pts += vDelta\n }\n }\n }\n }\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n }\n\n // fps inaccuracy\n if (refSampleDurationInt < 90 * 10) { // < 10ms per frame\n refSampleDurationInt = 0\n }\n\n if (!refSampleDurationInt) {\n const first = videoTrack.samples[0]\n const second = videoTrack.samples[1]\n // 100ms default\n refSampleDurationInt = len === 1 ? 9000 : Math.floor((second.dts - first.dts))\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (samples[i - 1]) {\n sampleDuration = Math.min(dts - samples[i - 1].dts, refSampleDurationInt)\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n // dts exception of adjacent frame\n this._videoTimestampBreak = true\n\n // check if only video breaked!\n sampleDuration = this._audioTimestampBreak ? refSampleDurationInt : Math.max(sampleDuration, 30 * 90) // 30ms\n\n // check if sample breaked within current fragment\n const expectFragEnd = (this._audioNextPts || 0)\n if (nextSample && nextSample.dts > expectFragEnd) {\n sampleDuration = refSampleDurationInt\n }\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n\n if (!samples.length) return\n samples.forEach(x => {\n x.pts -= this._needForceFixLargeGap ? this._baseAudioDts : this._baseDts\n x.dts = x.pts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 90000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n this._baseAudioDts = audioBasePts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n this._baseVideoDts = videoBaseDts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n let largeGap = false\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 if (Number.isFinite(delta) && Math.abs(delta) > this._largeGapThreshold * MAX_SILENT_FRAME_DURATION) {\n largeGap = true\n }\n if (!this._baseDtsInited){\n if (largeGap && this._needForceFixLargeGap) {\n this._needForceFixLargeGap = true\n } else {\n this._needForceFixLargeGap = false\n }\n }\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n if (this._baseDtsInited && this._videoTimestampBreak && this._audioTimestampBreak) {\n /**\n * timestamp breaked\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n this._audioLastSample = null\n this._videoLastSample = null\n this._videoTimestampBreak = false\n this._audioTimestampBreak = false\n }\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n const refSampleDuration = audioTrack.sampleDuration\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n const nextPts = this._audioNextPts\n const sample = samples[i]\n const delta = sample.pts - nextPts\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = AAC.getSilentFrame(audioTrack.codec, audioTrack.channelCount) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n }\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts / 90,\n originPts: sample.originPts,\n count,\n nextPts: nextPts / 90,\n refSampleDuration\n })\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(nextPts), silentFrame)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts / 90,\n originPts: sample.originPts,\n nextPts: nextPts / 90,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) >= MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak = true\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts / 90,\n originPts: sample.originPts,\n nextPts: nextPts / 90,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n sample.dts = sample.pts = nextPts\n this._audioNextPts += refSampleDuration\n }\n }\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu, 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","import { VideoTrack, AudioTrack, MetadataTrack, VideoSample, AudioSample } from '../model'\nimport { concatUint8Array, readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\n\nexport class FMP4Demuxer {\n __loadedMoofWraps = []\n __lastRemainData = null\n __lastRemainDataStart = 0\n __nextMoofStart = -1\n\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 }\n\n demuxPart (partData, partDataStart, moov) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n\n const isAV01 = /av01/.test(videoTrack.codec)\n videoTrack.samples = []\n audioTrack.samples = []\n\n let data = partData\n let dataStart = partDataStart\n if (this.__lastRemainData) {\n const lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength\n // 如果遗留数据和新数据之间存在非包含关系的重叠,则需要合并,否则丢弃遗留数据\n // 如果遗留数据和新数据之间不存在重叠,需要丢弃遗留数据,保证后续的新数据可以连续的解析\n const continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd\n if (continuous) {\n // data = 遗留数据 + 新数据,为了程序健壮性,即可能存在重复的range,需要subarray规避\n const noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart)\n data = concatUint8Array(this.__lastRemainData, noDuplicateData)\n dataStart = this.__lastRemainDataStart\n this.__lastRemainData = null\n } else {\n this.__lastRemainData = null\n this.__lastRemainDataStart = 0\n this.__nextMoofStart = -1\n }\n }\n\n if (!moov) {\n const moovBox = MP4Parser.findBox(data, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n moov = MP4Parser.moov(moovBox)\n }\n\n if (data) {\n const dataEnd = dataStart + data.byteLength\n if (!videoExist && !audioExist) {\n MP4Parser.moovToTrack(moov, videoTrack, audioTrack)\n }\n // findBox要求参数由box header作为起始,故需要定位到moof的起始点,通过前一个moof计算出下一个moof的start位置,并保证解析的内容大于header的长度(8)\n const moofBoxes = []\n if (this.__nextMoofStart < 0) {\n MP4Parser.findBox(data, ['moof'], dataStart).forEach(v => moofBoxes.push(v))\n } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {\n MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ['moof'], this.__nextMoofStart).forEach(v => moofBoxes.push(v))\n }\n moofBoxes.filter(moofBox => moofBox.size <= moofBox.data.length).forEach(moofBox => {\n const moof = MP4Parser.moof(moofBox)\n // 通过(trun.dataOffset + all samples的合并值)最大值计算得到下一个moof.start,也可以通过mdat box获取,此处为前者逻辑\n this.__nextMoofStart = moof.start + Math.max(...moof.traf.map(v => v.trun.samples.reduce((ret, w) => ret + w.size, v.trun.dataOffset || 0)))\n this.__loadedMoofWraps.push({\n start: moof.start,\n nextMoofStart: this.__nextMoofStart,\n moof\n })\n this.__loadedMoofWraps.sort((p, n) => p.start - n.start) // 排序,兼容seek\n })\n\n for (const moofWrap of this.__loadedMoofWraps) {\n // 跳过不需要解析的moof,减少非必要的损耗\n if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {\n continue\n }\n const moofStart = moofWrap.start\n const tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack)\n\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line\n if (videoTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset += moofStart\n if (xStart < dataStart) {\n return\n }\n // 如果当前sample已经超过了数据范围,则中断遍历\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n sample.data = sampleData\n if (!isAV01) { // av1编码的数据不需要解析nals\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n }\n this.__lastRemainDataStart = xStart + x.size\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset + moofStart\n if (xStart < dataStart) {\n return\n }\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n this.__lastRemainDataStart = xStart + x.size\n })\n }\n })\n }\n }\n\n // 保存未解析的数据,下次解析时合并使用\n if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {\n this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart)\n } else {\n this.__lastRemainData = data\n this.__lastRemainDataStart = dataStart\n }\n\n // fmp4中sample.pts是通过tfdt的baseMediaDecodeTime + sample.duration计算得出的\n // 所以此处sample的pts是多少不重要,反而需要确保demuxPart中baseMediaDecodeTime的值为起始帧的pts,才能保证remux后解析的结果与原始数据一致\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n demux (videoData, audioData) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n videoTrack.samples = []\n audioTrack.samples = []\n\n if (audioData) {\n if (!audioExist) {\n const moovBox = MP4Parser.findBox(audioData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), null, audioTrack)\n }\n const moofBox = MP4Parser.findBox(audioData, ['moof'])[0]\n if (moofBox) {\n const samples = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), null, audioTrack)[audioTrack.id]\n const baseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n if (samples) {\n const baseOffset = moofBox.start\n samples.map(x => {\n x.offset += baseOffset\n const sampleData = audioData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + baseMediaDecodeTime, sampleData, x.duration))\n })\n }\n }\n }\n\n if (videoData) {\n if (!videoExist && !audioExist) {\n const moovBox = MP4Parser.findBox(videoData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), videoTrack, audioTrack)\n }\n const moofBox = MP4Parser.findBox(videoData, ['moof'])[0]\n if (moofBox) {\n const tracks = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), videoTrack, audioTrack)\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n const baseOffset = moofBox.start\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line eqeqeq\n if (videoTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n sample.data = sampleData\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n })\n }\n })\n }\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { 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","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n const isAV01 = /av01/.test(track.codec)\n\n let mdatSize = 0\n\n if (isAV01) {\n samples.forEach((s) => {\n mdatSize += s.data.byteLength\n })\n } else {\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n }\n\n const mdata = new Uint8Array(mdatSize)\n\n // av1没有uints,直接写入data即可\n // todo: H.265/H.264为什么要拼接nals/uints而不直接用data?\n if (isAV01) {\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n mdata.set(sample.data, offset)\n sample.size = sample.data.byteLength\n offset += sample.size\n }\n } else {\n const mdatView = new DataView(mdata.buffer)\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","import { concatUint8Array } from 'xgplayer-streaming-shared'\n\n/**\n * @interface\n */\nexport class IExternalDecryptor {\n /**\n * @param {Uint8Array} data\n * @param {BufferSource} key\n * @param {BufferSource} iv\n * @returns {Promise.}\n */\n async decrypt (data, key, iv) {}\n}\n\nexport class Decryptor {\n constructor () {\n const crypto = window.crypto || window.msCrypto\n this.subtle = crypto && (crypto.subtle || crypto.webkitSubtle)\n\n /**\n * @type {IExternalDecryptor}\n */\n this.externalDecryptor = null\n }\n\n destroy () {\n if (this.externalDecryptor?.destroy) {\n this.externalDecryptor.destroy()\n }\n }\n\n decrypt (video, audio) {\n if (!video && !audio) return\n const ret = []\n if (video) {\n ret[0] = this._decryptSegment(video)\n }\n if (audio) {\n ret[1] = this._decryptSegment(audio)\n }\n return Promise.all(ret)\n }\n\n async _decryptSegment (seg) {\n let data = seg.data\n if (seg.key) {\n data = await this._decryptData(seg.data, seg.key, seg.keyIv)\n }\n if (!seg.map) return data\n return concatUint8Array(seg.map, data)\n }\n\n async _decryptData (data, key, iv) {\n if (this.externalDecryptor) {\n return await this.externalDecryptor.decrypt(data, key, iv)\n } else {\n if (!this.subtle) throw new Error('crypto is not defined')\n const aesKey = await this.subtle.importKey('raw', key, { name: 'AES-CBC' }, false, ['encrypt', 'decrypt'])\n return new Uint8Array(\n await this.subtle.decrypt({ name: 'AES-CBC', iv }, aesKey, data)\n )\n }\n }\n}\n","import { EVENT } from 'xgplayer-streaming-shared'\n\nexport const Event = {\n ...EVENT,\n STREAM_PARSED: 'core.streamparsed',\n NO_AUDIO_TRACK: 'core.noaudiotrack',\n SUBTITLE_SEGMENTS: 'core.subtitlesegments',\n SUBTITLE_PLAYLIST: 'core.subtitleplaylist',\n SEI_PAYLOAD_TIME: 'core.seipayloadtime',\n APPEND_COST: 'core.appendcost'\n}\n","import { ERR, Logger, StreamingError, concatUint8Array } from 'xgplayer-streaming-shared'\nimport { FMP4Demuxer, FMP4Remuxer, TrackType, TsDemuxer, WarningType } from 'xgplayer-transmuxer'\nimport { Event } from '../../constants'\n\nconst logger = new Logger('Transmuxer')\n\nexport class Transmuxer {\n _initSegmentId = ''\n\n constructor (hls, isMP4, needRemux, fixerConfig) {\n this.hls = hls\n this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer(null, null, null, fixerConfig)\n this._isMP4 = isMP4\n if (needRemux) this._remuxer = new FMP4Remuxer(this._demuxer.videoTrack, this._demuxer.audioTrack)\n }\n\n transmux (videoChunk, audioChunk, discontinuity, contiguous, startTime, needInit) {\n const demuxer = this._demuxer\n try {\n if (this._isMP4) {\n demuxer.demux(videoChunk, audioChunk)\n } else {\n demuxer.demuxAndFix(concatUint8Array(videoChunk, audioChunk), discontinuity, contiguous, startTime)\n }\n } catch (error) {\n throw new StreamingError(ERR.DEMUX, ERR.SUB_TYPES.HLS, error)\n }\n\n const { videoTrack, audioTrack, metadataTrack } = demuxer\n const vParsed = {\n codec: videoTrack.codec,\n timescale: videoTrack.timescale,\n firstDts: videoTrack.firstDts / videoTrack.timescale,\n firstPts: videoTrack.firstPts / videoTrack.timescale,\n duration: videoTrack.samplesDuration / videoTrack.timescale\n }\n const aParsed = {\n codec: audioTrack.codec,\n timescale: audioTrack.timescale,\n firstDts: audioTrack.firstDts / videoTrack.timescale,\n firstPts: audioTrack.firstPts / videoTrack.timescale,\n duration: audioTrack.samplesDuration / videoTrack.timescale,\n container: audioTrack.container\n }\n const newId = `${videoTrack.codec}/${videoTrack.width}/${videoTrack.height}/${audioTrack.codec}/${audioTrack.config}`\n if (newId !== this._initSegmentId) {\n this._initSegmentId = newId\n needInit = true\n }\n\n this._fireEvents(videoTrack, audioTrack, metadataTrack, discontinuity || needInit)\n\n this.hls.emit(Event.DEMUXED_TRACK, {videoTrack, audioTrack})\n\n if (this._remuxer) {\n // LG webos5.4系统上发现, 直播流开启low latency mode渲染的话,出首帧后需要等一段时间才触发loadeddata、canplay事件,影响首帧统计\n // low latency mode通过解析封装的fmp4中对媒体播放时长的描述判断 https://issues.chromium.org/issues/41161663\n if (needInit && this.hls.isLive && !this.hls.config.mseLowLatency) {\n videoTrack.duration = this.hls.totalDuration * videoTrack.timescale\n audioTrack.duration = this.hls.totalDuration * audioTrack.timescale\n }\n\n try {\n const {\n videoInitSegment,\n videoSegment,\n audioInitSegment,\n audioSegment\n } = this._remuxer.remux(needInit)\n const v = concatUint8Array(videoInitSegment, videoSegment)\n const a = concatUint8Array(audioInitSegment, audioSegment)\n return [\n v ? { ...vParsed, data: v } : undefined,\n a ? { ...aParsed, data: a } : undefined\n ]\n } catch (error) {\n throw new StreamingError(ERR.REMUX, ERR.SUB_TYPES.FMP4, error)\n }\n } else {\n return [videoTrack, audioTrack]\n }\n }\n\n _fireEvents (videoTrack, audioTrack, metadataTrack, discontinuity) {\n const tracks = [videoTrack, audioTrack]\n let logCC = `discontinuity: ${discontinuity}`\n\n tracks.forEach(track => {\n if (track.samples?.length) {\n logCC += `; ${track.samples.length} ${\n track.type === TrackType.VIDEO ? 'video' : 'audio'\n } samples, firstDts/firstPts/duration: ${(\n track.firstDts / track.timescale\n ).toFixed(3)}/${(track.firstPts / track.timescale).toFixed(3)}/${(\n track.samplesDuration / track.timescale\n ).toFixed(3)}`\n }\n\n if (discontinuity && track.exist()) {\n this.hls.emit(Event.METADATA_PARSED, {\n type: track.type,\n track,\n meta: {\n codec: track.codec,\n timescale: track.timescale,\n baseDts: track.baseDts,\n ... (track.type === TrackType.VIDEO\n ? {width: track.width,\n height: track.height,\n sarRatio: track.sarRatio\n }\n : {\n codec: track.codec,\n channelCount: track.channelCount,\n sampleRate: track.sampleRate\n })\n }\n })\n }\n })\n logger.debug(logCC)\n\n videoTrack.warnings.forEach(warn => {\n let type\n switch (warn.type) {\n case WarningType.LARGE_AV_SHIFT:\n type = Event.LARGE_AV_FIRST_FRAME_GAP_DETECT\n break\n case WarningType.LARGE_VIDEO_GAP:\n type = Event.LARGE_VIDEO_DTS_GAP_DETECT\n break\n case WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK:\n type = Event.MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT\n break\n default:\n }\n\n if (type) this.hls.emit(Event.STREAM_EXCEPTION, { ...warn, type })\n logger.warn('video exception', warn)\n })\n\n audioTrack.warnings.forEach(warn => {\n let type\n switch (warn.type) {\n case WarningType.LARGE_AUDIO_GAP:\n type = Event.LARGE_AUDIO_DTS_GAP_DETECT\n break\n case WarningType.AUDIO_FILLED:\n type = Event.AUDIO_GAP_DETECT\n break\n case WarningType.AUDIO_DROPPED:\n type = Event.AUDIO_OVERLAP_DETECT\n break\n default:\n }\n\n if (type) this.hls.emit(Event.STREAM_EXCEPTION, { ...warn, type })\n logger.warn('audio exception', warn)\n })\n\n videoTrack.samples.forEach((sample) => {\n if (sample.keyframe) {\n this.hls.emit(Event.KEYFRAME, { pts: sample.pts })\n }\n })\n\n metadataTrack.seiSamples.forEach(sei => {\n this.hls.emit(Event.SEI, {\n ...sei,\n originPts: sei.originPts / 90, // sei 统一时间单位为毫秒\n sei: {\n code: sei.data.type,\n content: sei.data.payload,\n dts: sei.pts\n }\n })\n })\n }\n}\n","import { TsDemuxer, MP4Parser } from 'xgplayer-transmuxer'\nimport { MSE, Buffer, ERR, StreamingError, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { Decryptor } from './decrypt'\nimport { Transmuxer } from './transmuxer'\nimport { Event } from '../constants'\n\nconst logger = new Logger('BufferService')\n\nexport class BufferService {\n _decryptor = new Decryptor()\n /** @type {Transmuxer} */\n _transmuxer = null\n /** @type {MSE} */\n _mse = null\n _softVideo = null\n _sourceCreated = false\n _needInitSegment = true\n _directAppend = false\n\n constructor (hls) {\n this.hls = hls\n if (hls.config.softDecode) { // soft decode\n this._softVideo = hls.media\n } else {\n this._mse = new MSE(null, {\n preferMMS: hls.config.preferMMS\n })\n\n if (hls.config.url) {\n this._mse.bindMedia(hls.media).then((e) => {\n this.hls.emit(EVENT.MEDIASOURCE_OPENED, e)\n })\n }\n }\n\n // If a third-party decryption module is configured, use it\n if (hls.config.decryptor) {\n this._decryptor.externalDecryptor = hls.config.decryptor\n }\n }\n\n get baseDts () {\n return this._transmuxer?._demuxer?._fixer?._baseDts\n }\n\n get nbSb () {\n if (!this._mse?._sourceBuffer) return 0\n\n return Object.keys(this._mse._sourceBuffer).length\n }\n\n get msIsOpened () {\n return this._mse?.isOpened\n }\n\n get msHasOpTasks () {\n return this._mse?.hasOpTasks\n }\n\n get msStreaming () {\n return this._mse?.streaming\n }\n\n async updateDuration (duration) {\n logger.debug('update duration', duration)\n if (this._mse) {\n if (!this._mse.isOpened) {\n await this._mse.open()\n }\n await this._mse.updateDuration(duration)\n } else if (this._softVideo) {\n this._softVideo.duration = duration\n }\n }\n\n createSource (videoChunk, audioChunk, videoCodec, audioCodec) {\n if (this._sourceCreated) return\n const chunk = videoChunk || audioChunk\n if (!chunk) return\n if (TsDemuxer.probe(chunk)) {\n if (!this._transmuxer) this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo, this.hls.config.fixerConfig)\n } else if (MP4Parser.probe(chunk)) {\n if (this._softVideo) {\n if (!this._transmuxer) this._transmuxer = new Transmuxer(this.hls, true, null, this.hls.config.fixerConfig)\n } else {\n this._directAppend = true\n let mix = false\n if (videoChunk && !videoCodec) {\n MP4Parser.findBox(videoChunk, ['moov', 'trak']).forEach(t => {\n const box = MP4Parser.findBox(t.data, ['trak', 'mdia', 'minf', 'stbl', 'stsd'])[0]\n if (box) {\n const e = MP4Parser.stsd(box).entries[0]\n if (e) {\n if (e.hvcC) {\n videoCodec = e.hvcC.codec || 'hev1.1.6.L93.B0'\n } else if (e.avcC) {\n videoCodec = e.avcC.codec\n } else if (e.sampleRate || e.esds) {\n audioCodec = e.esds?.codec || 'mp4a.40.2'\n mix = true\n }\n }\n }\n })\n }\n if (audioChunk && !audioCodec) {\n MP4Parser.findBox(audioChunk, ['moov', 'trak', 'mdia', 'minf', 'stbl', 'stsd']).forEach(stsd => {\n const e = MP4Parser.stsd(stsd).entries[0]\n if (e && e.esds) audioCodec = e.esds.codec\n })\n }\n if (videoChunk && !videoCodec) videoCodec = 'avc1.42e01e'\n if (audioChunk && !audioCodec) audioCodec = 'mp4a.40.2'\n if (mix) {\n videoCodec += `, ${audioCodec}`\n audioCodec = ''\n }\n this._createMseSource(videoCodec, audioCodec)\n }\n } else {\n throw new StreamingError(ERR.OTHER, null, null, null, 'unsupported stream')\n }\n if (this._softVideo) this._sourceCreated = true\n }\n\n async appendBuffer (segment, audioSegment, videoChunk, audioChunk, discontinuity, contiguous, startTime) {\n if (!videoChunk?.length && !audioChunk?.length) return\n\n const afterAppend = () => {\n if (this.hls?.emit) {\n this.hls?.emit(EVENT.APPEND_BUFFER, {\n start: segment.start,\n end: segment.end\n })\n }\n }\n\n if (this._directAppend) {\n const p = []\n if (videoChunk) p.push(this._mse.append(MSE.VIDEO, videoChunk))\n if (audioChunk) p.push(this._mse.append(MSE.AUDIO, audioChunk))\n return Promise.all(p).then(afterAppend)\n }\n const needInit = this._needInitSegment || discontinuity\n const [video, audio] = this._transmuxer.transmux(videoChunk, audioChunk, needInit, contiguous, startTime, this._needInitSegment || discontinuity)\n\n if (audioChunk && audioSegment) {\n audioSegment?.setTrackExist(false, true)\n }\n\n if (audioChunk && segment) {\n segment?.setTrackExist(true, false)\n }\n\n if (!audioSegment) {\n segment?.setTrackExist(!!video, !!audio)\n }\n\n\n if (video && !audio) {\n this.hls.emit(Event.NO_AUDIO_TRACK)\n }\n\n if (this._softVideo) {\n this._softVideo.appendBuffer(video, audio)\n this._needInitSegment = false\n\n afterAppend()\n } else if (this._mse) {\n const isFirstAppend = !this._sourceCreated\n if (isFirstAppend) {\n this._createMseSource(video?.codec, audio?.codec, audio?.container)\n }\n this._needInitSegment = false\n const mse = this._mse\n const p = []\n\n if (needInit && !isFirstAppend) {\n // handle codec change during midstream\n this._handleCodecChange(video, audio).forEach(task => p.push(task))\n }\n\n if (video) {\n const {data: videoData, ...videoRest} = video\n p.push(mse.append(MSE.VIDEO, videoData, videoRest))\n }\n if (audio) {\n const {data: audioData, ...audioRest} = audio\n p.push(mse.append(MSE.AUDIO, audioData, audioRest))\n }\n return Promise.all(p).then(afterAppend)\n }\n }\n\n async removeBuffer (start = 0, end = Infinity) {\n const media = this.hls.media\n if (!this._mse || !media || start < 0 || end < start || start >= this._mse.duration) return\n\n return this._mse\n .clearBuffer(start, end)\n .then(() => this.hls.emit(EVENT.REMOVE_BUFFER, { start, end, removeEnd: end }))\n }\n\n async evictBuffer (bufferBehind) {\n const media = this.hls.media\n if (!this._mse || !media || !bufferBehind || bufferBehind < 0) return\n const currentTime = media.currentTime\n const removeEnd = currentTime - bufferBehind\n if (removeEnd <= 0) return\n const start = Buffer.start(Buffer.get(media))\n if (start + 1 >= removeEnd) return\n return this.removeBuffer(0, removeEnd)\n }\n\n async clearAllBuffer () {\n if (this._mse) return this._mse.clearAllBuffer()\n }\n\n decryptBuffer (video, audio) {\n return this._decryptor.decrypt(video, audio)\n }\n\n async reset (reuseMse = false) {\n if (this._mse && !reuseMse) {\n this._transmuxer = null\n this._sourceCreated = false\n await this._mse.unbindMedia()\n await this._mse.bindMedia(this.hls.media)\n }\n this._needInitSegment = true\n this._directAppend = false\n }\n\n async endOfStream () {\n if (this._mse) {\n if (this._sourceCreated) {\n await this._mse.endOfStream()\n this.hls.emit(EVENT.BUFFEREOS)\n }\n }\n if (this._softVideo) {\n this._softVideo.endOfStream()\n }\n }\n\n async setLiveSeekableRange (start, end) {\n if (this._mse) this._mse.setLiveSeekableRange(start, end)\n }\n\n async detachMedia () {\n if (this._mse) {\n await this._mse.unbindMedia()\n }\n }\n\n async destroy () {\n this._decryptor?.destroy()\n await this.detachMedia()\n\n this._decryptor = null\n this._mse = null\n this._softVideo = null\n }\n\n /**\n * @private\n */\n _createMseSource (videoCodec, audioCodec, container) {\n logger.debug(`create mse source, videoCodec=${videoCodec}, audioCodec=${audioCodec}`)\n const mse = this._mse\n if (!mse) return\n if (videoCodec) {\n mse.createSource(MSE.VIDEO, `video/mp4;codecs=${videoCodec}`)\n this._sourceCreated = true\n }\n if (audioCodec) {\n mse.createSource(MSE.AUDIO, `audio/mp4;codecs=${audioCodec}`)\n this._sourceCreated = true\n } else if (container) {\n mse.createSource(MSE.AUDIO, `${container};codecs=\"\"`)\n this._sourceCreated = true\n }\n this.hls.emit(EVENT.SOURCEBUFFER_CREATED)\n }\n\n /**\n * This makes it possible to change codecs or container type mid-stream.\n * @private\n */\n _handleCodecChange (video, audio) {\n const tasks = []\n const mse = this._mse\n const codecList = [{\n type: MSE.VIDEO,\n codecs: video?.codec\n }, {\n type: MSE.AUDIO,\n codecs: audio?.codec\n }]\n\n codecList.filter(item => !!item.codecs).forEach(({type, codecs}) => {\n const sourceBuffer = mse.getSourceBuffer(type)\n if (sourceBuffer) {\n const codec = codecs.split(',')[0]\n if (!new RegExp(codec, 'ig').test(sourceBuffer.mimeType)) {\n tasks.push(\n mse.changeType(type, `${type}/mp4;codecs=${codecs}`)\n )\n }\n }\n })\n return tasks\n }\n\n seamlessSwitch () {\n this._needInitSegment = true\n }\n\n isFull (mediaType = MSE.VIDEO){\n return this._mse?.isFull(mediaType)\n }\n}\n","export class MasterPlaylist {\n version = 0\n streams = [] // MasterStream\n /**\n * @readonly\n */\n isMaster = true\n}\n\nconst MediaType = {\n Audio: 'AUDIO',\n Video: 'VIDEO',\n SubTitle: 'SUBTITLE',\n ClosedCaptions: 'CLOSED-CAPTIONS'\n}\n\n// #EXT-X-KEY KEYFORMAT values\n// urn:uuid: https://dashif.org/identifiers/content_protection/\nconst KeySystems = {\n CLEAR_KEY: 'org.w3.clearkey',\n FAIRPLAY: ['urn:uuid:94ce86fb-07ff-4f43-adb8-93d2fa968ca2', 'com.apple.streamingkeydelivery'],\n WIDEVINE: ['urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed', 'com.widevine.alpha', 'com.widevine'],\n PLAYREADY: ['urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95', 'com.microsoft.playready']\n}\n\nfunction flatArray (arr) {\n let ret = []\n\n for (let i = 0; i < arr.length; i++) {\n if (Array.isArray(arr[i])) {\n ret = ret.concat(flatArray(arr[i]))\n } else {\n ret.push(arr[i])\n }\n }\n\n return ret\n}\n\nexport class MediaStream {\n id = 0\n url = ''\n default = false\n autoSelect = false\n forced = false\n group = ''\n name = ''\n lang = ''\n segments = []\n endSN = 0\n}\n\nexport class AudioStream extends MediaStream {\n mediaType = MediaType.Audio\n channels = 0\n}\n\nexport class VideoStream extends MediaStream {\n mediaType = MediaType.Video\n}\n\nexport class SubTitleStream extends MediaStream {\n mediaType = MediaType.SubTitle\n}\n\nexport class ClosedCaptionsStream extends MediaStream {\n mediaType = MediaType.ClosedCaptions\n}\n\nexport class MasterStream {\n id = 0\n bitrate = 0\n width = 0\n height = 0\n name = ''\n url = ''\n audioCodec = ''\n videoCodec = ''\n textCodec = ''\n audioGroup = ''\n\n /** @type {AudioStream[]} */\n audioStreams = []\n\n /** @type {SubTitleStream[]} */\n subtitleStreams = []\n\n /** @type {ClosedCaptionsStream[]} */\n closedCaptionsStream = []\n}\n\nexport class MediaPlaylist {\n version = 0\n url = ''\n type = '' // upper case\n startCC = 0\n endCC = 0\n startSN = 0\n endSN = 0\n totalDuration = 0\n targetDuration = 0\n partTargetDuration = 0\n canSkipUntil = 0\n canSkipDateRanges = false\n skippedSegments = 0\n canBlockReload = false\n partHoldBack = 0\n live = true\n lowLatency = false\n endPartIndex = 0\n /** @type {Array.} */\n segments = []\n dateRanges = {}\n skippedSegments = 0\n}\n\nexport class MediaSegment {\n sn = 0 // Media Sequence Number\n cc = 0\n url = ''\n parentUrl = ''\n title = ''\n start = 0\n duration = 0\n dataTime = ''\n /** @type {?MediaSegmentKey} */\n key = null\n byteRange = null // [start, end]\n isInitSegment = false\n /** @type {?MediaSegment} */\n initSegment = null\n isLast = false\n hasAudio = false\n hasVideo = false\n\n independent = false\n partIndex = 0\n\n constructor (parentUrl) {\n this.parentUrl = parentUrl\n }\n\n get end () {\n return this.start + this.duration\n }\n\n setTrackExist (v, a) {\n this.hasVideo = v\n this.hasAudio = a\n }\n\n setByteRange (data, prevSegment) {\n this.byteRange = [0]\n const bytes = data.split('@')\n if (bytes.length === 1 && prevSegment && prevSegment.byteRange) {\n this.byteRange[0] = prevSegment.byteRange[1] || 0\n if (this.byteRange[0]) this.byteRange[0] += 1\n } else {\n this.byteRange[0] = parseInt(bytes[1])\n }\n this.byteRange[1] = this.byteRange[0] + parseInt(bytes[0]) - 1\n }\n}\n\nexport class MediaSegmentKey {\n method = ''\n url = ''\n /** @type {?Uint8Array} */\n iv = null\n keyFormat = ''\n keyFormatVersions = ''\n\n constructor (segKey) {\n if (segKey instanceof MediaSegmentKey) {\n this.method = segKey.method\n this.url = segKey.url\n this.keyFormat = segKey.keyFormat\n this.keyFormatVersions = segKey.keyFormatVersions\n if (segKey.iv) this.iv = new Uint8Array(segKey.iv)\n }\n }\n\n clone (sn) {\n const key = new MediaSegmentKey(this)\n if (sn !== null && sn !== undefined) key.setIVFromSN(sn)\n return key\n }\n\n setIVFromSN (sn) {\n if (!this.iv && this.method === 'AES-128' && typeof sn === 'number' && this.url) {\n this.iv = new Uint8Array(16)\n for (let i = 12; i < 16; i++) {\n this.iv[i] = (sn >> (8 * (15 - i))) & 0xff\n }\n }\n }\n\n isSegmentEncrypted () {\n const { method } = this\n return method === 'AES-128' // || method === 'AES-256' || method === 'AES-256-CTR'\n }\n\n isValidKeySystem () {\n const isKeyFormatValid =\n flatArray([\n KeySystems.CLEAR_KEY,\n KeySystems.FAIRPLAY,\n KeySystems.WIDEVINE,\n KeySystems.PLAYREADY\n ]).indexOf(this.keyFormat) > -1\n if (!isKeyFormatValid) {\n return false\n }\n\n const isMethodValid =\n ['SAMPLE-AES', 'SAMPLE-AES-CENC', 'SAMPLE-AES-CTR'].indexOf(this.method) > -1\n if (!isMethodValid) {\n return false\n }\n return true\n }\n\n isSupported () {\n if (!this.method) {\n return false\n }\n if (this.isSegmentEncrypted()) {\n return true\n } else if (this.isValidKeySystem()) {\n return true\n }\n return false\n }\n}\n\nexport class HlsUrlParameters {\n constructor (msn, part, skip) {\n this.msn = msn\n this.part = part\n this.skip = skip\n }\n\n addDirectives (uri) {\n const url = new self.URL(uri)\n if (this.msn !== undefined) {\n url.searchParams.set('_HLS_msn', this.msn.toString())\n }\n if (this.part) {\n url.searchParams.set('_HLS_part', this.part.toString())\n }\n if (this.skip) {\n url.searchParams.set('_HLS_skip', this.skip)\n }\n return url.href\n }\n}\n","const REGEXP_TAG = /^#(EXT[^:]*)(?::(.*))?$/\nconst REGEXP_ATTR = /([^=]+)=(?:\"([^\"]*)\"|([^\",]*))(?:,|$)/g\nconst REGEXP_ABSOLUTE_URL = /^(?:[a-zA-Z0-9+\\-.]+:)?\\/\\//\nconst REGEXP_URL_PAIR = /^((?:[a-zA-Z0-9+\\-.]+:)?\\/\\/[^/?#]*)?([^?#]*\\/)?/\n\nexport function getLines (text) {\n return text.split(/[\\r\\n]/).map((x) => x.trim()).filter(Boolean)\n}\n\nexport function parseTag (text) {\n const ret = text.match(REGEXP_TAG)\n if (!ret || !ret[1]) return\n return [ret[1].replace('EXT-X-', ''), ret[2]]\n}\n\nexport function parseAttr (text) {\n const ret = {}\n let match = REGEXP_ATTR.exec(text)\n while (match) {\n ret[match[1]] = match[2] || match[3]\n match = REGEXP_ATTR.exec(text)\n }\n return ret\n}\n\nexport function getAbsoluteUrl (url, parentUrl) {\n if (!parentUrl || !url || REGEXP_ABSOLUTE_URL.test(url)) return url\n const pairs = REGEXP_URL_PAIR.exec(parentUrl)\n if (!pairs) return url\n if (url[0] === '/') return pairs[1] + url\n return pairs[1] + pairs[2] + url\n}\n\nconst CODECS_REGEXP = {\n audio: [/^mp4a/, /^vorbis$/, /^opus$/, /^flac$/, /^[ae]c-3$/],\n video: [/^avc/, /^hev/, /^hvc/, /^vp0?[89]/, /^av1$/],\n text: [/^vtt$/, /^wvtt/, /^stpp/]\n}\n\n/**\n * @param {'audio' | 'video' | 'text'} type\n * @param {Array} codecs\n * @returns {string | undefined}\n */\nexport function getCodecs (type, codecs) {\n const re = CODECS_REGEXP[type]\n if (!re || !codecs || !codecs.length) return\n for (let i = 0; i < re.length; i++) {\n for (let j = 0; j < codecs.length; j++) {\n if (re[i].test(codecs[j])) return codecs[j]\n }\n }\n}\n\nexport function isValidDaterange (attr, dateRangeWithSameId) {\n let _badValueForSameId\n if (dateRangeWithSameId) {\n for (const key in dateRangeWithSameId) {\n if (\n Object.prototype.hasOwnProperty.call(dateRangeWithSameId, key) &&\n attr[key] !== dateRangeWithSameId[key]\n ) {\n _badValueForSameId = key\n break\n }\n }\n }\n\n let duration = null\n if (attr.DURATION) {\n duration = parseFloat(attr.DURATION)\n if (!Number.isFinite(duration)) {\n duration = null\n } else if (attr._endDate) {\n duration = (attr._endDate.getTime() - attr._startDate.getTime()) / 1000\n }\n }\n\n const cue = enumeratedStringList(attr.CUE || attr['X-CUE'], {\n pre: false,\n post: false,\n once: false\n })\n\n return (\n !!attr.ID &&\n !_badValueForSameId &&\n Number.isFinite(attr._startDate.getTime()) &&\n (duration === null || duration >= 0) &&\n (!(attr.END_ON_NEXT === 'YES') || !!attr.CLASS) &&\n (!attr.CUE ||\n (!cue.pre && !cue.post) ||\n cue.pre !== cue.post) &&\n (!(attr.CLASS === 'com.apple.hls.interstitial') ||\n 'X-ASSET-URI' in attr ||\n 'X-ASSET-LIST' in attr)\n )\n}\n\nfunction enumeratedStringList (attrValue, dict) {\n return (attrValue ? attrValue.split(/[ ,]+/) : []).reduce(\n (result, identifier) => {\n result[identifier.toLowerCase()] = true\n return result\n },\n dict\n )\n}\n","import { MasterPlaylist, MasterStream, AudioStream, SubTitleStream, MediaStream } from './model'\nimport { parseAttr, parseTag, getAbsoluteUrl, getCodecs } from './utils'\n\n/**\n * @param {Array} lines\n * @param {string} parentUrl\n * @returns {MasterPlaylist}\n */\nexport function parseMasterPlaylist (lines, parentUrl) {\n const master = new MasterPlaylist()\n let index = 0\n let line\n const audioStreams = []\n const subtitleStreams = []\n\n // eslint-disable-next-line no-cond-assign\n while (line = lines[index++]) {\n const tag = parseTag(line)\n if (!tag) continue\n const [name, data] = tag\n if (name === 'VERSION') {\n master.version = parseInt(data)\n } else if (name === 'MEDIA' && data) {\n const attr = parseAttr(data)\n let stream\n switch (attr.TYPE) {\n case 'AUDIO':\n stream = new AudioStream()\n break\n case 'SUBTITLES':\n stream = new SubTitleStream()\n break\n default:\n stream = new MediaStream()\n }\n\n stream.url = getAbsoluteUrl(attr.URI, parentUrl)\n stream.default = attr.DEFAULT === 'YES'\n stream.autoSelect = attr.AUTOSELECT === 'YES'\n stream.group = attr['GROUP-ID']\n stream.name = attr.NAME\n stream.lang = attr.LANGUAGE\n if (attr.CHANNELS) {\n stream.channels = Number(attr.CHANNELS.split('/')[0])\n if (Number.isNaN(stream.channels)) stream.channels = 0\n }\n\n if (attr.TYPE === 'AUDIO' && attr.URI) {\n audioStreams.push(stream)\n }\n\n if (attr.TYPE === 'SUBTITLES') {\n subtitleStreams.push(stream)\n }\n\n } else if (name === 'STREAM-INF' && data) {\n const stream = new MasterStream()\n const attr = parseAttr(data)\n\n stream.bitrate = parseInt(attr['AVERAGE-BANDWIDTH'] || attr.BANDWIDTH)\n stream.name = attr.NAME\n stream.url = getAbsoluteUrl(lines[index++], parentUrl)\n if (attr.RESOLUTION) {\n const [w, h] = attr.RESOLUTION.split('x')\n stream.width = parseInt(w)\n stream.height = parseInt(h)\n }\n if (attr.CODECS) {\n const codecs = attr.CODECS.split(/[ ,]+/).filter(Boolean)\n stream.videoCodec = getCodecs('video', codecs)\n stream.audioCodec = getCodecs('audio', codecs)\n stream.textCodec = getCodecs('text', codecs)\n }\n stream.audioGroup = attr.AUDIO\n stream.subtitleGroup = attr.SUBTITLES\n\n master.streams.push(stream)\n }\n }\n master.streams.forEach((s, i) => { s.id = i })\n\n if (audioStreams.length) {\n audioStreams.forEach((s, i) => { s.id = i })\n master.streams.forEach((stream) => {\n if (stream.audioGroup) {\n stream.audioStreams = audioStreams.filter(x => x.group === stream.audioGroup)\n }\n })\n }\n\n if (subtitleStreams.length) {\n subtitleStreams.forEach((s, i) => { s.id = i })\n master.streams.forEach((stream) => {\n if (stream.subtitleGroup) {\n stream.subtitleStreams = subtitleStreams.filter(x => x.group === stream.subtitleGroup)\n }\n })\n }\n\n return master\n}\n","import { MediaPlaylist, MediaSegment, MediaSegmentKey } from './model'\nimport { getAbsoluteUrl, parseAttr, parseTag, isValidDaterange } from './utils'\n\nexport function parseMediaPlaylist (lines, parentUrl, useLowLatency) {\n const media = new MediaPlaylist()\n media.url = parentUrl\n let curSegment = new MediaSegment(parentUrl)\n let curInitSegment = null\n let curKey = null\n let totalDuration = 0\n let curSN = 0\n let curCC = 0\n let index = 0\n let line\n let endOfList = false\n let partSegmentIndex = 0\n\n\n // eslint-disable-next-line no-cond-assign\n while (line = lines[index++]) {\n if (line[0] !== '#') { // url\n if (media.lowLatency) {\n curSN++\n continue\n }\n\n curSegment.sn = curSN\n curSegment.cc = curCC\n curSegment.url = getAbsoluteUrl(line, parentUrl)\n if (curKey) curSegment.key = curKey.clone(curSN)\n if (curInitSegment) curSegment.initSegment = curInitSegment\n media.segments.push(curSegment)\n curSegment = new MediaSegment(parentUrl)\n curSN++\n continue\n }\n\n const tag = parseTag(line)\n if (!tag) continue\n const [name, data] = tag\n switch (name) {\n case 'VERSION':\n media.version = parseInt(data)\n break\n case 'PLAYLIST-TYPE':\n media.type = data?.toUpperCase()\n break\n case 'TARGETDURATION':\n media.targetDuration = parseFloat(data)\n break\n case 'PART-INF': {\n if (useLowLatency) {\n media.lowLatency = true\n }\n const attr = parseAttr(data)\n if (attr['PART-TARGET']) {\n media.partTargetDuration = parseFloat(attr['PART-TARGET'])\n }\n }\n break\n case 'SERVER-CONTROL':{\n const attr = parseAttr(data)\n media.canBlockReload = attr['CAN-BLOCK-RELOAD'] === 'YES'\n media.partHoldBack = parseFloat(attr['PART-HOLD-BACK'] || 0)\n media.canSkipUntil = parseFloat(attr['CAN-SKIP-UNTIL'] || 0)\n media.canSkipDateRanges = media.canSkipUntil > 0 && (attr['CAN-SKIP-DATERANGES'] === 'YES')\n }\n break\n case 'ENDLIST': {\n endOfList = true\n }\n break\n case 'MEDIA-SEQUENCE':\n curSN = media.startSN = parseInt(data)\n break\n case 'DISCONTINUITY-SEQUENCE':\n curCC = media.startCC = parseInt(data)\n break\n case 'DISCONTINUITY':\n curCC++\n break\n case 'BYTERANGE':\n curSegment.setByteRange(data, media.segments[media.segments.length - 1])\n break\n case 'PART': {\n if (!media.lowLatency) break\n const attr = parseAttr(data)\n curSegment.duration = parseFloat(attr['DURATION'])\n curSegment.independent = attr['INDEPENDENT'] === 'YES'\n curSegment.sn = curSN\n curSegment.cc = curCC\n curSegment.partIndex = partSegmentIndex\n curSegment.start = totalDuration\n curSegment.duration = parseFloat(attr['DURATION'])\n totalDuration += curSegment.duration\n curSegment.url = getAbsoluteUrl(attr['URI'], parentUrl)\n if (curKey) curSegment.key = curKey.clone(curSN)\n if (curInitSegment) curSegment.initSegment = curInitSegment\n media.segments.push(curSegment)\n curSegment = new MediaSegment(parentUrl)\n partSegmentIndex++\n }\n\n break\n case 'PRELOAD-HINT': {\n const attr = parseAttr(data)\n media.preloadHint = attr\n if (attr['TYPE'] === 'PART' && attr['URI']) {\n const tmp = attr['URI'].split('.ts')[0].split('-')\n media.nextSN = tmp[3]\n media.nextIndex = tmp[tmp.length - 1]\n }\n }\n break\n case 'PROGRAM-DATE-TIME':\n curSegment.dataTime = data\n break\n case 'EXTINF': {\n if (media.lowLatency) {\n partSegmentIndex = 0\n break\n }\n const [duration, title] = data.split(',')\n curSegment.start = totalDuration\n curSegment.duration = parseFloat(duration)\n totalDuration += curSegment.duration\n curSegment.title = title\n }\n break\n case 'KEY': {\n const attr = parseAttr(data)\n if (attr.METHOD === 'NONE') {\n curKey = null\n break\n }\n curKey = new MediaSegmentKey()\n curKey.method = attr.METHOD\n curKey.url = /^blob:/.test(attr.URI) ? attr.URI : getAbsoluteUrl(attr.URI, parentUrl)\n curKey.keyFormat = attr.KEYFORMAT || 'identity'\n curKey.keyFormatVersions = attr.KEYFORMATVERSIONS\n if (!curKey.isSupported()) {\n throw new Error(`encrypt ${attr.METHOD}/${attr.KEYFORMAT} is not supported`)\n }\n if (attr.IV) {\n let str = attr.IV.slice(2)\n str = (str.length & 1 ? '0' : '') + str\n curKey.iv = new Uint8Array(str.length / 2)\n for (let i = 0, l = str.length / 2; i < l; i++) {\n curKey.iv[i] = parseInt(str.slice(i * 2, i * 2 + 2), 16)\n }\n }\n }\n break\n case 'MAP': {\n const attr = parseAttr(data)\n curSegment.url = getAbsoluteUrl(attr.URI, parentUrl)\n if (attr.BYTERANGE) curSegment.setByteRange(attr.BYTERANGE)\n curSegment.isInitSegment = true\n curSegment.sn = 0\n if (curKey) {\n curSegment.key = curKey.clone(0)\n }\n curInitSegment = curSegment\n curSegment = new MediaSegment(parentUrl)\n }\n break\n case 'SKIP': {\n const attr = parseAttr(data)\n const skippedSegments = parseInt(attr['SKIPPED-SEGMENTS'], 10)\n if (skippedSegments <= Number.MAX_SAFE_INTEGER) {\n media.skippedSegments += skippedSegments\n curSN += skippedSegments\n }\n }\n break\n case 'DATERANGE': {\n const attr = parseAttr(data)\n const dateRangeWithSameId = media.dateRanges[attr.ID]\n attr._startDate = dateRangeWithSameId ? dateRangeWithSameId._startDate : new Date(attr['START-DATE'])\n const endDate = dateRangeWithSameId?._endDate || new Date(attr.END_DATE)\n if (Number.isFinite(endDate)) {\n attr._endDate = endDate\n }\n if (isValidDaterange(attr, dateRangeWithSameId) || media.skippedSegments) {\n media.dateRanges[attr.ID] = attr\n }\n }\n break\n default:\n }\n }\n\n media.segments = media.segments.filter(x => x.duration !== 0)\n const lastSegment = media.segments[media.segments.length - 1]\n\n if (lastSegment) {\n if (endOfList) {\n lastSegment.isLast = true\n }\n media.endSN = lastSegment.sn\n media.endPartIndex = lastSegment.partIndex\n }\n if (endOfList) {\n media.live = false\n }\n media.totalDuration = totalDuration\n media.endCC = curCC\n\n return media\n}\n","import { parseMasterPlaylist } from './master'\nimport { parseMediaPlaylist } from './media'\nimport { getLines } from './utils'\n\nexport class M3U8Parser {\n static parse (text = '', parentUrl, useLowLatency) {\n if (!text.includes('#EXTM3U')) throw new Error('Invalid m3u8 file')\n\n const lines = getLines(text)\n\n if (M3U8Parser.isMediaPlaylist(text)) {\n return parseMediaPlaylist(lines, parentUrl, useLowLatency)\n }\n return parseMasterPlaylist(lines, parentUrl)\n }\n\n static isMediaPlaylist (text) {\n return text.includes('#EXTINF:') || text.includes('#EXT-X-TARGETDURATION:')\n }\n}\n","import { NetLoader, StreamingError, EVENT, ERR } from 'xgplayer-streaming-shared'\nimport { M3U8Parser } from './parser'\nimport { Event } from '../constants'\nimport { HlsUrlParameters } from './parser/model'\n\nexport class ManifestLoader {\n constructor (hls) {\n this.hls = hls\n this._timer = null\n this._useLowLatency = hls.config.useLowLatency\n\n const { retryCount, retryDelay, manifestLoadTimeout, fetchOptions } = this.hls.config\n this._loader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: manifestLoadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._audioLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: manifestLoadTimeout,\n onRetryError: this._onLoaderRetry\n })\n\n this._subtitleLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'text',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: manifestLoadTimeout,\n onRetryError: this._onLoaderRetry\n })\n\n }\n\n async load (url, audioUrl, subtitleUrl) {\n const toLoad = [this._loader.load(url)]\n if (audioUrl) {\n toLoad.push(this._audioLoader.load(audioUrl))\n }\n\n if (subtitleUrl) {\n toLoad.push(this._subtitleLoader.load(subtitleUrl))\n }\n\n let videoText\n let audioText\n let subtitleText\n let videoResUrl\n let audioResUrl\n let subtitleResUrl\n\n try {\n const [video, audio, subtitle] = await Promise.all(toLoad)\n if (!video) return []\n\n this._emitOnLoaded(video, url)\n\n videoText = video.data\n videoResUrl = video.response.url || url\n\n if (audioUrl) {\n audioText = audio?.data\n subtitleText = subtitle?.data\n audioResUrl = audio?.response?.url || audioUrl\n subtitleResUrl = subtitle?.response?.url || subtitleUrl\n audioText && this._emitOnLoaded(audio, audioUrl)\n subtitleText && this._emitOnLoaded(subtitle, subtitleUrl)\n } else {\n subtitleText = audio?.data\n subtitleResUrl = audio?.response?.url || subtitleUrl\n subtitleText && this._emitOnLoaded(audio, subtitleUrl)\n }\n\n } catch (error) {\n throw StreamingError.network(error)\n }\n\n const { onPreM3U8Parse } = this.hls.config\n\n let playlist\n let audioPlaylist\n let subtitlePlaylist\n try {\n if (onPreM3U8Parse) {\n videoText = onPreM3U8Parse(videoText) || videoText\n if (audioText) audioText = onPreM3U8Parse(audioText, true) || audioText\n if (subtitleText) subtitleText = onPreM3U8Parse(subtitleText, true) || subtitleText\n }\n playlist = M3U8Parser.parse(videoText, videoResUrl, this._useLowLatency)\n if (playlist?.live === false && playlist.segments && !playlist.segments.length) {\n throw new Error('empty segments list')\n }\n if (audioText) {\n audioPlaylist = M3U8Parser.parse(audioText, audioResUrl, this._useLowLatency)\n }\n if (subtitleText) {\n subtitlePlaylist = M3U8Parser.parse(subtitleText, subtitleResUrl, this._useLowLatency)\n }\n\n } catch (error) {\n throw new StreamingError(ERR.MANIFEST, ERR.SUB_TYPES.HLS, error)\n }\n if (playlist) {\n if (playlist.isMaster) {\n this.hls.emit(Event.HLS_MANIFEST_LOADED, { playlist })\n } else {\n if (this._useLowLatency) {\n if (playlist.canBlockReload) {\n this.deliveryDirectives = new HlsUrlParameters(playlist.nextSN, playlist.nextIndex, '')\n } else {\n this.deliveryDirectives = null\n }\n }\n this.hls.emit(Event.HLS_LEVEL_LOADED, { playlist })\n }\n }\n\n return [playlist, audioPlaylist, subtitlePlaylist]\n }\n\n parseText (videoText, url) {\n const { onPreM3U8Parse } = this.hls.config\n\n let playlist\n try {\n if (onPreM3U8Parse) {\n videoText = onPreM3U8Parse(videoText) || videoText\n }\n playlist = M3U8Parser.parse(videoText, url, this._useLowLatency)\n if (playlist?.live === false && playlist.segments && !playlist.segments.length) {\n throw new Error('empty segments list')\n }\n } catch (error) {\n throw new StreamingError(ERR.MANIFEST, ERR.SUB_TYPES.HLS, error)\n }\n if (playlist) {\n if (playlist.isMaster) {\n this.hls.emit(Event.HLS_MANIFEST_LOADED, { playlist })\n } else {\n this.hls.emit(Event.HLS_LEVEL_LOADED, { playlist })\n }\n }\n return [playlist]\n }\n\n poll (url, audioUrl, subtitleUrl, cb, errorCb, time) {\n clearTimeout(this._timer)\n time = time || 3000\n let retryCount = this.hls.config.pollRetryCount\n const fn = async () => {\n clearTimeout(this._timer)\n let reqUrl = url\n try {\n if (this.deliveryDirectives) {\n reqUrl = this.deliveryDirectives.addDirectives(url)\n }\n const res = await this.load(reqUrl, audioUrl, subtitleUrl)\n if (!res[0]) return\n retryCount = this.hls.config.pollRetryCount\n cb(res[0], res[1], res[2])\n } catch (e) {\n retryCount--\n if (retryCount <= 0) {\n errorCb(e)\n }\n }\n this._timer = setTimeout(fn, time)\n }\n this._timer = setTimeout(fn, time)\n }\n\n stopPoll () {\n clearTimeout(this._timer)\n return this.cancel()\n }\n\n cancel () {\n return Promise.all([\n this._loader.cancel(),\n this._audioLoader.cancel()\n ])\n }\n\n _emitOnLoaded = (res, url) => {\n const { response, options } = res\n const { firstByteTime, startTime, endTime, contentLength } = options || {}\n const time = endTime - startTime\n\n this.hls.emit(EVENT.SPEED, { time, byteLength: contentLength, url })\n this.hls.emit(EVENT.LOAD_COMPLETE, { url, elapsed: time || 0 })\n this.hls.emit(EVENT.TTFB, { url, responseUrl: response.url, elapsed: firstByteTime - startTime })\n this.hls.emit(EVENT.LOAD_RESPONSE_HEADERS, { headers: response.headers, url })\n }\n\n _onLoaderRetry = (error, retryTime) => {\n this.hls.emit(Event.LOAD_RETRY, {\n error: StreamingError.network(error),\n retryTime\n })\n }\n}\n","export function clamp (num, min, max) {\n if (min > max) {\n max = min\n }\n return Math.min(Math.max(num, min), max)\n}\n","import { Logger } from 'xgplayer-streaming-shared'\n\nconst logger = new Logger('playlist')\n\nexport class Stream {\n live = undefined\n id = 0\n bitrate = 0\n width = 0\n height = 0\n name = ''\n url = ''\n audioCodec = ''\n videoCodec = ''\n textCodec = ''\n\n startCC = 0\n endCC = 0\n startSN = 0\n endSN = -1\n totalDuration = 0\n targetDuration = 0\n\n partTargetDuration = 0\n canSkipUntil = 0\n canSkipDateRanges = false\n skippedSegments = 0\n canBlockReload = false\n partHoldBack = 0\n lowLatency = false\n endPartIndex = 0\n\n snDiff = null // number\n\n segments = []\n\n /** @type {import('../../parser/model').AudioStream[]} */\n audioStreams = []\n\n /** @type {import('../../parser/model').SubTitleStream[]} */\n subtitleStreams = []\n\n /** @type {import('../../parser/model').ClosedCaptionsStream[]} */\n closedCaptions = []\n\n /** @type {import('../../parser/model').AudioStream | null} */\n currentAudioStream = null\n\n /** @type {import('../../parser/model').subtitleStreams | null} */\n currentSubtitleStream = null\n\n /**\n * asdasd {@link AudioStream}\n */\n get lastSegment () {\n if (this.segments.length) {\n return this.segments[this.segments.length - 1]\n }\n return null\n }\n\n get segmentDuration () {\n return this.targetDuration || this.segments[0]?.duration || 0\n }\n\n get liveEdge () {\n return this.endTime\n }\n\n set liveEdge (end) {\n this.endTime = end\n }\n\n get endTime () {\n return this.lastSegment?.end || 0\n }\n\n set endTime (end) {\n const lastSeg = this.lastSegment\n if (lastSeg)\n lastSeg.duration = end - lastSeg.start\n }\n\n get currentSubtitleEndSn () {\n return this.currentSubtitleStream?.endSN || 0\n }\n\n constructor (playlist, audioPlaylist, subtitlePlaylist) {\n this.update(this._setLLPlaybackPoint(playlist), audioPlaylist, subtitlePlaylist)\n }\n\n clearOldSegment (startTime, pointer) {\n if (this.currentAudioStream) {\n this._clearSegments(startTime, pointer)\n }\n\n return this._clearSegments(startTime, pointer)\n }\n\n getAudioSegment (seg) {\n if (!seg || !this.currentAudioStream) return\n const sn = seg.sn - this.snDiff\n return this.currentAudioStream.segments.find(x => x.sn === sn)\n }\n\n update (playlist, audioPlaylist) {\n this.url = playlist.url\n if (Array.isArray(playlist.segments)) { // media\n if (this.live === null || this.live === undefined) this.live = playlist.live\n this._updateSegments(playlist, this)\n\n this.startCC = playlist.startCC\n this.endCC = playlist.endCC\n this.startSN = playlist.startSN\n this.endSN = playlist.endSN || -1\n this.totalDuration = playlist.totalDuration\n this.targetDuration = playlist.targetDuration\n this.live = playlist.live\n\n this.lowLatency = playlist.lowLatency\n this.canBlockReload = playlist.canBlockReload\n this.canSkipDateRanges = playlist.canSkipDateRanges\n this.canSkipUntil = playlist.canSkipUntil\n this.partHoldBack = playlist.partHoldBack\n this.partTargetDuration = playlist.partTargetDuration\n this.skippedSegments = playlist.skippedSegments\n this.endPartIndex = playlist.endPartIndex\n\n if (audioPlaylist && this.currentAudioStream && Array.isArray(audioPlaylist.segments)) {\n this._updateSegments(audioPlaylist, this.currentAudioStream)\n if ((this.snDiff === null || this.snDiff === undefined) && playlist.segments.length && audioPlaylist.segments.length) {\n this.snDiff = playlist.segments[0].sn - audioPlaylist.segments[0].sn\n }\n }\n\n } else { // master stream\n this.id = playlist.id\n this.bitrate = playlist.bitrate\n this.width = playlist.width\n this.height = playlist.height\n this.name = playlist.name\n this.audioCodec = playlist.audioCodec\n this.videoCodec = playlist.videoCodec\n this.textCodec = playlist.textCodec\n this.audioStreams = playlist.audioStreams\n this.subtitleStreams = playlist.subtitleStreams\n if (!this.currentAudioStream && this.audioStreams.length) {\n this.currentAudioStream = this.audioStreams.find(x => x.default) || this.audioStreams[0]\n }\n\n if (!this.currentSubtitleStream && this.subtitleStreams.length) {\n this.currentSubtitleStream = this.subtitleStreams.find(x => x.default) || this.subtitleStreams[0]\n }\n }\n }\n\n updateSubtitle (subtitlePlaylist) {\n if (!(subtitlePlaylist && this.currentSubtitleStream && Array.isArray(subtitlePlaylist.segments))) return\n\n const newSegs = this._updateSegments(subtitlePlaylist, this.currentSubtitleStream)\n const segs = this.currentSubtitleStream.segments\n if (segs.length > 100 ) {\n this.currentSubtitleStream.segments = segs.slice(100)\n }\n\n if (!newSegs) return\n\n return newSegs.map(x => {\n return {\n sn: x.sn,\n url: x.url,\n duration: x.duration,\n start: x.start,\n end: x.end,\n lang: this.currentSubtitleStream.lang\n }\n })\n }\n\n\n switchSubtitle (lang) {\n const toSwitch = this.subtitleStreams.find(x => x.lang === lang)\n const origin = this.currentSubtitleStream\n if (toSwitch) {\n this.currentSubtitleStream = toSwitch\n origin.segments = []\n }\n }\n\n _setLLPlaybackPoint (playlist) {\n if (!playlist.lowLatency || !playlist.segments.length) return playlist\n\n const maxStartPoint = playlist.totalDuration - playlist.partHoldBack\n const segs = playlist.segments\n let index = 0\n\n for (let i = 0, l = segs.length; i < l; i++) {\n if (segs[i].start <= maxStartPoint && segs[i].independent) {\n index = i\n }\n }\n\n const usefulSegs = segs.slice(index)\n let endTime = 0\n\n usefulSegs.forEach(s => {\n s.start = endTime\n endTime = s.end\n })\n\n playlist.segments = usefulSegs\n playlist.totalDuration = endTime\n playlist.startSN = usefulSegs[0].sn\n playlist.startCC = usefulSegs[0].cc\n\n logger.log(`set ll-hls playback point: SN=${playlist.startSN} partIndex=${usefulSegs[0].partIndex}, duration=${endTime}`)\n\n return playlist\n\n }\n\n _clearSegments (startTime, pointer) {\n let sliceStart = 0\n const segments = this.segments\n for (let i = 0, l = segments.length; i < l; i++) {\n if (segments[i].end >= startTime) {\n sliceStart = i\n break\n }\n }\n\n if (sliceStart > pointer) {\n sliceStart = pointer\n }\n\n if (sliceStart) {\n this.segments = this.segments.slice(sliceStart)\n if (this.currentAudioStream) {\n this.currentAudioStream.segments = this.currentAudioStream.segments.slice(sliceStart)\n }\n }\n\n return pointer - sliceStart\n }\n\n _updateSegments (playlist, segObj) {\n const segments = segObj.segments\n if (this.live) {\n const lowLatency = playlist.lowLatency\n const endSeg = segments[segments.length - 1]\n const endSN = endSeg?.sn ?? -1\n const endPartIndex = endSeg?.partIndex || 0\n\n let hasNew = endSN < playlist.endSN && playlist.segments.length\n\n if (lowLatency) {\n hasNew = hasNew || endPartIndex < playlist.endPartIndex\n }\n\n if (hasNew) {\n logger.log(`update segments: endSN:${endSN}, partIndex:${endPartIndex} --> endSN:${playlist.endSN}, partIndex:${playlist.endPartIndex}`)\n const index = playlist.segments.findIndex(x => x.sn === endSN && x.partIndex === endPartIndex)\n const toAppend = index < 0 ? playlist.segments : playlist.segments.slice(index + 1)\n\n if (segments.length && toAppend.length) {\n let endTime = endSeg.end\n const endTimeBeforeAppend = endTime\n toAppend.forEach(seg => {\n seg.start = endTime\n endTime = seg.end\n })\n\n logger.log(`liveEdge: ${endTimeBeforeAppend} -> ${endTime}`)\n\n const lastCC = endSeg?.cc || -1\n if (lastCC > toAppend[0].cc) {\n toAppend.forEach(seg => (seg.cc += lastCC))\n }\n }\n segObj.endSN = playlist.endSN\n segObj.segments = segments.concat(toAppend)\n\n return toAppend\n }\n } else {\n segObj.segments = playlist.segments\n }\n }\n\n}\n","import { clamp } from '../utils'\nimport { Stream } from './stream'\nimport { Event } from '../constants'\n\nexport class Playlist {\n /** @type {import('./stream').Stream[]} */\n streams = []\n\n /** @type {import('./stream').Stream} */\n currentStream = null\n\n dvrWindow = 0\n\n _segmentPointer = -1\n\n constructor (hls) {\n this.hls = hls\n }\n\n get lowLatency () {\n return this.currentStream?.lowLatency\n }\n\n get lastSegment () {\n return this.currentStream?.lastSegment\n }\n\n get currentSegment () {\n return this.currentSegments?.[this._segmentPointer]\n }\n\n get nextSegment () {\n return this.currentSegments?.[this._segmentPointer + 1]\n }\n\n get currentSegments () {\n return this.currentStream?.segments\n }\n\n get currentSubtitleEndSn () {\n return this.currentStream?.currentSubtitleEndSn\n }\n\n get liveEdge () {\n return this.currentStream?.liveEdge\n }\n\n set liveEdge (end) {\n if (this.currentStream) {\n this.currentStream.liveEdge = end\n }\n }\n\n get totalDuration () {\n return this.currentStream?.totalDuration || 0\n }\n\n get seekRange () {\n const segments = this.currentSegments\n if (!segments || !segments.length) return\n return [\n segments[0].start,\n segments[segments.length - 1].end\n ]\n }\n\n get nbSegments () {\n return this.currentSegments?.length || 0\n }\n\n get isEmpty () {\n return !this.currentSegments?.length\n }\n\n get isLive () {\n return this.currentStream?.live\n }\n\n get hadSegmentLoaded () {\n return this._segmentPointer !== -1\n }\n\n get hasSubtitle () {\n return !!this.currentStream?.currentSubtitleStream\n }\n\n getAudioSegment (seg) {\n return this.currentStream?.getAudioSegment(seg)\n }\n\n moveSegmentPointer (pos) {\n if (pos === null || pos === undefined) pos = this._segmentPointer + 1\n this._segmentPointer = clamp(pos, -1, this.currentSegments?.length)\n }\n\n reset () {\n this.streams = []\n this.currentStream = null\n this.dvrWindow = 0\n this._segmentPointer = -1\n }\n\n getSegmentByIndex (index) {\n return this.currentSegments?.[index]\n }\n\n setNextSegmentByIndex (index = 0) {\n this._segmentPointer = index - 1\n }\n\n setNextSegmentBySN (sn = 0) {\n const preIndex = this.currentSegments?.findIndex(x => x.sn === sn)\n if (preIndex !== -1) {\n this.setNextSegmentByIndex(preIndex + 1)\n }\n return preIndex\n }\n\n findSegmentIndexByTime (time) {\n const segments = this.currentSegments\n if (segments) {\n for (let i = 0, l = segments.length, seg; i < l; i++) {\n seg = segments[i]\n if (time >= seg.start && time < seg.end) {\n return i\n }\n }\n\n const lastSegment = segments[segments.length - 1]\n if (Math.abs(time - lastSegment?.end) < 0.2) return segments.length - 1\n }\n }\n\n upsertPlaylist (playlist, audioPlaylist, subtitlePlaylist) {\n if (!playlist) return\n if (playlist.isMaster) {\n this.streams.length = playlist.streams.length\n playlist.streams.filter(x => x.url).forEach((stream, i) => {\n if (this.streams[i]) {\n this.streams[i].update(stream)\n } else {\n this.streams[i] = new Stream(stream)\n }\n })\n this.currentStream = this.streams[0]\n // update media\n } else if (Array.isArray(playlist.segments)) {\n const stream = this.currentStream\n if (stream) {\n stream.update(playlist, audioPlaylist, subtitlePlaylist)\n const newSubtitleSegs = stream.updateSubtitle(subtitlePlaylist)\n if (newSubtitleSegs) {\n this.hls.emit(Event.SUBTITLE_SEGMENTS, {\n list: newSubtitleSegs\n })\n }\n } else {\n this.reset()\n this.currentStream = this.streams[0] = new Stream(playlist, audioPlaylist, subtitlePlaylist)\n }\n }\n\n const currentStream = this.currentStream\n\n if (currentStream) {\n if (this.hls.isLive && !this.dvrWindow) {\n this.dvrWindow = this.currentSegments.reduce((a, c) => {\n a += c.duration\n return a\n }, 0)\n }\n }\n }\n\n updateSegmentsRanges (sn, start) {\n const segs = this.currentSegments?.filter(x => x.sn >= sn)\n segs.forEach(s => {\n s.start = start\n start = s.end\n })\n }\n\n switchSubtitle (lang) {\n this.currentStream?.switchSubtitle(lang)\n }\n\n clearOldSegment (maxPlaylistSize = (this.hls.config.maxPlaylistSize || 50)) {\n const stream = this.currentStream\n if (!this.dvrWindow || !stream) return\n const startTime = stream.endTime - this.dvrWindow\n if (startTime <= 0) return\n const segments = stream.segments\n if (segments.length <= maxPlaylistSize) return\n\n this._segmentPointer = stream.clearOldSegment(startTime, this._segmentPointer)\n }\n\n checkSegmentTrackChange (cTime, nbSb) {\n const index = this.findSegmentIndexByTime(cTime)\n const seg = this.getSegmentByIndex(index)\n\n if (!seg) return\n\n if (!seg.hasAudio && !seg.hasVideo) return\n\n // when seek\n if (nbSb !== 2 && seg.hasAudio && seg.hasVideo) return seg\n\n // continuous play\n if (seg.end - cTime > 0.3) return\n\n const next = this.getSegmentByIndex(index + 1)\n\n if (!next) return\n\n if (!next.hasAudio && !next.hasVideo) return\n\n if ((next.hasAudio !== seg.hasAudio || next.hasVideo !== seg.hasVideo)) return next\n }\n\n feedbackLiveEdge (segment, bufferEnd) {\n const segs = this.currentSegments\n if (!segs) return\n const isLast = this.lastSegment?.sn === segment.sn\n if (isLast) {\n this.liveEdge = bufferEnd\n return\n }\n\n this.updateSegmentsRanges(segment.sn + 1, bufferEnd)\n }\n\n}\n","import { NetLoader, EVENT, BandwidthService, StreamingError } from 'xgplayer-streaming-shared'\n\n\n/**\n * @typedef {import('../manifest-loader/parser/model').MediaSegment} MediaSegment\n */\n\nexport class SegmentLoader {\n /** @type {Error} */\n error = null\n\n constructor (hls) {\n this.hls = hls\n this._bandwidthService = new BandwidthService()\n this._mapCache = {}\n this._keyCache = {}\n\n const { retryCount, retryDelay, loadTimeout, fetchOptions } = this.hls.config\n this._segmentLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._audioSegmentLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n this._keyLoader = new NetLoader({\n ...fetchOptions,\n responseType: 'arraybuffer',\n retry: retryCount,\n retryDelay: retryDelay,\n timeout: loadTimeout,\n onRetryError: this._onLoaderRetry\n })\n }\n\n speedInfo () {\n return {\n speed: this._bandwidthService.getLatestSpeed(),\n avgSpeed: this._bandwidthService.getAvgSpeed()\n }\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {MediaSegment} audioSeg\n * @param {boolean} loadInit\n * @param {boolean} loadAudioInit\n */\n load (seg, audioSeg, loadInit, loadAudioInit = loadInit) {\n const toLoad = []\n if (seg) toLoad[0] = this.loadVideoSegment(seg, loadInit)\n if (audioSeg) toLoad[1] = this.loadAudioSegment(audioSeg, loadAudioInit)\n return Promise.all(toLoad)\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n loadVideoSegment (seg, loadInit) {\n return this._loadSegment(this._segmentLoader, seg, loadInit)\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n loadAudioSegment (seg, loadInit) {\n return this._loadSegment(this._audioSegmentLoader, seg, loadInit)\n }\n\n /**\n * @param {NetLoader} segLoader\n * @param {MediaSegment} seg\n * @param {boolean} loadInit\n */\n async _loadSegment (segLoader, seg, loadInit) {\n let map\n let key\n let keyIv\n let mapKey\n let mapKeyIv\n const toLoad = []\n\n this.hls.emit(EVENT.LOAD_START, { url: seg.url })\n toLoad[0] = segLoader.load(seg.url)\n if (loadInit && seg.initSegment) {\n const mapUrl = seg.initSegment.url\n map = this._mapCache[mapUrl]\n if (!map) {\n this.hls.emit(EVENT.LOAD_START, { url: mapUrl })\n toLoad[1] = segLoader.load(mapUrl).then(r => {\n if (r) {\n const l = Object.keys(this._mapCache)\n if (l > 30) this._mapCache = {}\n map = this._mapCache[mapUrl] = r.data\n this._emitOnLoaded(r, mapUrl)\n }\n })\n }\n const keyUrl = seg.initSegment.key?.url\n if (keyUrl) {\n mapKeyIv = seg.initSegment.key.iv\n mapKey = this._keyCache[keyUrl]\n if (!mapKey) {\n this.hls.emit(EVENT.LOAD_START, { url: keyUrl })\n toLoad[2] = this._keyLoader.load(keyUrl).then(r => {\n if (r) {\n mapKey = this._keyCache[keyUrl] = r.data\n this._emitOnLoaded(r, keyUrl)\n }\n })\n }\n }\n }\n\n const keyUrl = seg.key?.url\n if (keyUrl && seg.key.isSegmentEncrypted()) {\n keyIv = seg.key.iv\n key = this._keyCache[keyUrl]\n if (!key) {\n this.hls.emit(EVENT.LOAD_START, { url: keyUrl })\n toLoad[3] = this._keyLoader.load(keyUrl).then(r => {\n if (r) {\n key = this._keyCache[keyUrl] = r.data\n this._emitOnLoaded(r, keyUrl)\n }\n })\n }\n }\n\n const [s] = await Promise.all(toLoad)\n if (!s) return\n const data = s.data\n this._emitOnLoaded(s, seg.url)\n\n return {\n data,\n map,\n key,\n mapKey,\n keyIv,\n mapKeyIv\n }\n }\n\n reset () {\n this.error = null\n this._mapCache = {}\n this._keyCache = {}\n this._bandwidthService.reset()\n }\n\n async cancel () {\n await Promise.all([this._keyLoader.cancel(), this._segmentLoader.cancel(), this._audioSegmentLoader.cancel()])\n }\n\n _emitOnLoaded = (res, url) => {\n const { data, response, options } = res\n const { firstByteTime, startTime, endTime, contentLength } = options || {}\n const time = endTime - startTime\n\n this._bandwidthService.addRecord(contentLength || data.byteLength, time)\n this.hls.emit(EVENT.SPEED, { time, byteLength: contentLength, url })\n this.hls.emit(EVENT.LOAD_COMPLETE, { url, elapsed: time || 0 })\n this.hls.emit(EVENT.TTFB, { url, responseUrl: response.url, elapsed: firstByteTime - startTime })\n this.hls.emit(EVENT.LOAD_RESPONSE_HEADERS, { headers: response.headers, url })\n }\n\n _onLoaderRetry = (error, retryTime) => {\n this.hls.emit(EVENT.LOAD_RETRY, {\n error: StreamingError.network(error),\n retryTime\n })\n }\n}\n","import EventEmitter from 'eventemitter3'\nimport { Buffer, ERR, GapService, Logger, MSE, MediaStatsService, SeiService, StreamingError, getVideoPlaybackQuality, isMediaPlaying } from 'xgplayer-streaming-shared'\nimport { Logger as TransmuxerLogger } from 'xgplayer-transmuxer'\nimport { BufferService } from './buffer-service'\nimport { getConfig } from './config'\nimport { Event } from './constants'\nimport { ManifestLoader } from './manifest-loader'\nimport { Playlist } from './playlist'\nimport { SegmentLoader } from './segment-loader'\nimport { clamp } from './utils'\n\nexport { ManifestLoader, Playlist, SegmentLoader, getConfig }\n/**\n * @typedef {import('./manifest-loader/parser/model').MediaSegment} MediaSegment\n */\n/**\n * @typedef {import(\"../../../xgplayer-streaming-shared/es/services/stats\").StatsInfo} Stats\n */\n/**\n * @typedef {{\n * seamless?: boolean,\n * startTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n/**\n * @typedef {{\n* reuseMse?: boolean,\n* clearSwitchStatus?: boolean,\n* }} LoadOptions\n*/\n\nexport const logger = new Logger('hls')\n\nexport class Hls extends EventEmitter {\n static version = __VERSION__\n version = Hls.version\n /** @type {HTMLMediaElement | null} */\n media = null\n /** @type {import('./config').HlsOption} */\n config = null\n\n /** @type {ManifestLoader} */\n _manifestLoader = null\n\n /** @type {SegmentLoader} */\n _segmentLoader = null\n\n /** @type {Playlist} */\n _playlist = null\n\n /** @type {BufferService} */\n _bufferService = null\n\n /** @type {GapService} */\n _gapService = null\n\n /** @type {SeiService} */\n _seiService = null\n\n /** @type {MediaStatsService} */\n _stats = null\n\n _prevSegSn = null\n _prevSegCc = null\n\n _tickTimer = null\n _tickInterval = 500\n\n _segmentProcessing = false\n _reloadOnPlay = false\n\n _switchUrlOpts = null\n _isProcessQuotaExceeded = false\n\n constructor (cfg) {\n super()\n this.config = cfg = getConfig(cfg)\n this.media = this.config.media\n\n this._manifestLoader = new ManifestLoader(this)\n this._segmentLoader = new SegmentLoader(this)\n this._playlist = new Playlist(this)\n this._bufferService = new BufferService(this)\n if (cfg.seiInTime) {\n this._seiService = new SeiService(this)\n }\n if (!cfg.softDecode) this._gapService = new GapService()\n\n this._stats = new MediaStatsService(this, 90000)\n\n this.media.addEventListener('loadeddata', this._onLoadeddata)\n this.media.addEventListener('play', this._onPlay)\n this.media.addEventListener('pause', this._onPause)\n this.media.addEventListener('seeking', this._onSeeking)\n this.media.addEventListener('timeupdate', this._onTimeupdate)\n }\n\n get isLive () { return this._playlist.isLive }\n get streams () { return this._playlist.streams }\n get currentStream () { return this._playlist.currentStream }\n get hasSubtitle () { return this._playlist.hasSubtitle}\n get totalDuration () { return this._playlist.totalDuration}\n get baseDts () { return this._bufferService?.baseDts }\n get abrSwitchPoint () {\n const targetSeg = this._urlSwitching\n ? this._playlist.currentSegment\n : this._playlist.nextSegment\n return targetSeg ? targetSeg.start + targetSeg.duration / 2 : null\n }\n\n speedInfo () {\n return this._segmentLoader.speedInfo()\n }\n\n bufferInfo (maxHole = 0.1) {\n return Buffer.info(Buffer.get(this.media), this.media?.currentTime, maxHole)\n }\n\n /**\n * @returns {Stats}\n */\n getStats () {\n return this._stats.getStats()\n }\n\n playbackQuality () {\n return getVideoPlaybackQuality(this.media)\n }\n\n /**\n * @param {string} url\n * @param {LoadOptions | boolean} options\n */\n async load (url = '', options = {}) {\n const reuseMse = typeof options === 'boolean' ? options : !!options?.reuseMse\n\n if (typeof options === 'object' && options?.clearSwitchStatus) {\n this._urlSwitching = false\n this._switchUrlOpts = null\n this.config.startTime = undefined\n }\n\n if (url) this.config.url = url\n url = this.config.url\n await this._reset(reuseMse)\n await this._loadData(url)\n this._startTick()\n }\n\n /**\n * @param {string} url\n * @private\n */\n async _loadData (url) {\n try {\n if (url) url = url.trim()\n } catch (e) {}\n\n if (!url) throw this._emitError(new StreamingError(ERR.OTHER, ERR.SUB_TYPES.OPTION, null, null, 'm3u8 url is missing'))\n\n const manifest = await this._loadM3U8(url)\n const { currentStream } = this._playlist\n\n if (this._urlSwitching) {\n if (this.isLive) {\n // skip loaded segment\n const preIndex = this._playlist.setNextSegmentBySN(this._prevSegSn)\n logger.log(`segment nb=${this._prevSegSn} index of ${preIndex} in the new playlist`)\n // the new stream no matched with old one\n if (preIndex === -1) {\n this._prevSegCc = null\n this._prevSegSn = null\n }\n } else {\n if (currentStream.bitrate === 0 && this._switchUrlOpts?.bitrate) {\n currentStream.bitrate = this._switchUrlOpts?.bitrate\n }\n const switchTimePoint = typeof this._switchUrlOpts?.startTime === 'number'\n ? this._switchUrlOpts?.startTime\n : this._getSeamlessSwitchPoint()\n this.config.startTime = switchTimePoint\n\n const segIdx = this._playlist.findSegmentIndexByTime(switchTimePoint)\n const nextSeg = this._playlist.getSegmentByIndex(segIdx + 1)\n\n if (nextSeg) {\n // move to next segment in case of media stall\n const bufferClearStartPoint = nextSeg.start\n await this._bufferService.removeBuffer(bufferClearStartPoint)\n }\n }\n }\n\n if (!manifest) return\n\n if (this.isLive) {\n this._bufferService.setLiveSeekableRange(0, 0xffffffff)\n logger.log('totalDuration first time got:', this._playlist.totalDuration)\n logger.log('nb segments got:', this._playlist.nbSegments)\n\n // 配置的目标延迟小于首次获取分片总时长\n if (this.config.targetLatency < this._playlist.totalDuration) {\n this.config.targetLatency = this._playlist.totalDuration\n this.config.maxLatency = 1.5 * this.config.targetLatency\n }\n\n if (!manifest.isMaster) this._pollM3U8(url)\n if (this._playlist.nbSegments < this.config.minSegmentsStartPlay) return\n\n await this._loadSegment()\n return\n }\n\n await this._bufferService.updateDuration(currentStream.totalDuration)\n\n const { startTime } = this.config\n if (startTime) {\n if (!this._switchUrlOpts?.seamless) {\n this.media.currentTime = startTime\n }\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(startTime) || 0)\n }\n\n await this._loadSegment()\n }\n\n async replay (isPlayEmit) {\n this.config.startTime = 0\n this._urlSwitching = false\n this._switchUrlOpts = null\n await this.load()\n this._reloadOnPlay = false\n return this.media.play(!isPlayEmit)\n }\n\n /**\n * @param {string} url\n * @param {?SwitchUrlOptions} options\n * @returns\n */\n async switchURL (url, options = {}) {\n const defaultOpts = {\n seamless: false,\n startTime: 0,\n bitrate: 0\n }\n switch (typeof options) {\n case 'number':\n options = {startTime: options}\n break\n case 'boolean':\n options = {seamless: options}\n break\n case 'object':\n for (const key in options) {\n if (options[key] === undefined || options[key] === null) {\n delete options[key]\n }\n }\n break\n default:\n throw `unsupported switchURL args: ${options}`\n }\n\n options = Object.assign({}, defaultOpts, options)\n const { seamless, startTime } = options\n this.config.url = url\n this.config.startTime = startTime\n this._switchUrlOpts = options\n\n if (!seamless) {\n let appended\n try {\n appended = this.config.softDecode ? this.load(url) : (await this.load(url))\n } catch (error) {\n this.emit(Event.SWITCH_URL_FAILED, error)\n throw error\n }\n this._reloadOnPlay = false\n\n if (appended) {\n this.emit(Event.SWITCH_URL_SUCCESS, { url })\n }\n return this.media.play(true)\n } else {\n this._urlSwitching = true\n if (!this.isLive) {\n this._prevSegSn = null\n this._prevSegCc = null\n }\n\n this._playlist.reset()\n this._bufferService.seamlessSwitch()\n await this._clear()\n await this._loadData(url)\n this._startTick()\n }\n\n this._switchUrlOpts = null\n }\n\n async switchStream (id, force = true) {\n const curStream = this.currentStream\n const streams = this.streams\n if (!curStream || curStream.id === id || !streams || streams.length < 2) return\n const toSwitch = streams.find(x => x.id === id)\n if (!toSwitch) return\n\n try {\n await this._clear()\n if (force) await this._bufferService.clearAllBuffer()\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n\n // 同步更新\n if (curStream.currentAudioStream && toSwitch.audioStreams.length > 2) {\n const curId = curStream.currentAudioStream.id\n toSwitch.currentAudioStream = toSwitch.audioStreams.find(x => x.id === curId) || toSwitch.currentAudioStream\n }\n\n this._playlist.currentStream = toSwitch\n\n try {\n if (this.isLive || !toSwitch.segments.length) await this._refreshM3U8()\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(this.media.currentTime) || 0)\n this._prevSegCc = null\n await this._loadSegmentDirect()\n } catch (error) {\n this._playlist.currentStream = curStream\n throw error\n }\n\n this._startTick()\n return toSwitch\n }\n\n async switchAudioStream (id, force = true) {\n const curStream = this.currentStream\n if (!curStream) return\n const audioStream = curStream.currentAudioStream\n if (!audioStream || audioStream.id === id || curStream.audioStreams.length < 2) return\n const toSwitch = curStream.audioStreams.find(x => x.id === id)\n if (!toSwitch) return\n\n try {\n await this._clear()\n if (force) await this._bufferService.clearAllBuffer()\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n\n curStream.currentAudioStream = toSwitch\n\n try {\n if (this.isLive || !toSwitch.segments.length) await this._refreshM3U8()\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(this.media.currentTime) || 0)\n this._prevSegCc = null\n await this._loadSegmentDirect()\n } catch (error) {\n curStream.currentAudioStream = audioStream\n throw error\n }\n\n this._startTick()\n return toSwitch\n }\n\n async switchSubtitleStream (lang) {\n this._playlist.switchSubtitle(lang)\n await this._manifestLoader.stopPoll()\n await this._refreshM3U8()\n }\n\n async detachMedia () {\n if (this._bufferService) {\n await this._bufferService.detachMedia()\n }\n }\n\n async destroy () {\n if (!this.media) return\n this.removeAllListeners()\n this._playlist.reset()\n this._segmentLoader.reset()\n this._seiService?.reset()\n this.media.removeEventListener('loadeddata', this._onLoadeddata)\n this.media.removeEventListener('play', this._onPlay)\n this.media.removeEventListener('pause', this._onPause)\n this.media.removeEventListener('seeking', this._onSeeking)\n this.media.removeEventListener('timeupdate', this._onTimeupdate)\n await Promise.all([this._clear(), this._bufferService.destroy()])\n this.media = null\n }\n\n /**\n * @param {('video'|'audio')?} mediaType\n * @returns {Boolean}\n */\n static isSupported (mediaType) {\n if (!mediaType || mediaType === 'video' || mediaType === 'audio') {\n return MSE.isSupported()\n }\n\n return typeof WebAssembly !== 'undefined'\n }\n\n static enableLogger () {\n Logger.enable()\n TransmuxerLogger.enable()\n }\n\n static disableLogger () {\n Logger.disable()\n TransmuxerLogger.disable()\n }\n\n /**\n * @private\n */\n async _loadM3U8 (url) {\n let playlist\n try {\n const manifest = this.config.manifestList?.filter(x => x.url === url)[0]?.manifest;\n\n [playlist] = manifest\n ? this._manifestLoader.parseText(manifest, url) :\n await this._manifestLoader.load(url)\n } catch (error) {\n throw this._emitError(StreamingError.create(error))\n }\n if (!playlist) return\n this._playlist.upsertPlaylist(playlist)\n\n if (playlist.isMaster) {\n if (this._playlist.currentStream.subtitleStreams?.length) {\n this.emit(Event.SUBTITLE_PLAYLIST, {\n list: this._playlist.currentStream.subtitleStreams\n })\n }\n await this._refreshM3U8()\n }\n this.emit(Event.STREAM_PARSED)\n return playlist\n }\n\n /**\n * @private 首次更新 master playlist 的 media level\n */\n _refreshM3U8 () {\n const stream = this._playlist.currentStream\n if (!stream || !stream.url) throw this._emitError(StreamingError.create(null, null, new Error('m3u8 url is not defined')))\n const url = stream.url\n const audioUrl = stream.currentAudioStream?.url\n const subtitleUrl = stream.currentSubtitleStream?.url\n return this._manifestLoader.load(url, audioUrl, subtitleUrl).then(([mediaPlaylist, audioPlaylist, subtitlePlaylist]) => {\n if (!mediaPlaylist) return\n this._playlist.upsertPlaylist(mediaPlaylist, audioPlaylist, subtitlePlaylist)\n if (!this.isLive) return\n this._pollM3U8(url, audioUrl, subtitleUrl)\n }).catch(err => {\n throw this._emitError(StreamingError.create(err))\n })\n }\n\n /**\n * @private\n */\n _pollM3U8 (url, audioUrl, subtitleUrl) {\n let isEmpty = this._playlist.isEmpty\n let pollInterval\n\n if (this._playlist.lowLatency) {\n pollInterval = (this._playlist.currentStream.partTargetDuration || 0) * 1000\n } else {\n pollInterval = (this._playlist.lastSegment?.duration || 0) * 1000\n }\n\n this._manifestLoader.poll(\n url,\n audioUrl,\n subtitleUrl,\n (p1, p2, p3) => {\n this._playlist.upsertPlaylist(p1, p2, p3)\n this._playlist.clearOldSegment()\n const switchToNoEmpty = p1 && isEmpty && !this._playlist.isEmpty\n if (switchToNoEmpty || (!this._playlist.hadSegmentLoaded && this._playlist.nbSegments >= this.config.minSegmentsStartPlay)) {\n this._loadSegment()\n }\n if (isEmpty) isEmpty = this._playlist.isEmpty\n }, (err) => {\n this._emitError(StreamingError.create(err))\n },\n // 刷新时间\n pollInterval\n )\n }\n\n /**\n * @private\n */\n _loadSegment = async () => {\n if (this._segmentProcessing || !this.media) return\n const { nextSegment, lastSegment } = this._playlist\n const { config } = this\n const minFrameDuration = 0.016\n // Constrain in the range of 0.016 ~ 0.1, 0.016 is the duration of 1 frame at 60fps\n // “minFrameDuration / 2” is to handle the media buffer precision deviation problem\n const maxBufferThroughout = Math.min(\n Math.max(lastSegment?.duration - minFrameDuration / 2 || 0, minFrameDuration),\n 0.1\n )\n\n if (!nextSegment) return\n\n if (!this.isLive) {\n let bInfo = this.bufferInfo()\n if (this.media.paused && !this.media.currentTime) {\n bInfo = this.bufferInfo(bInfo.nextStart || 0.5)\n }\n const bufferThroughout = Math.abs(bInfo.end - this.media.duration) < maxBufferThroughout\n if (bInfo.remaining >= config.preloadTime || bufferThroughout) {\n this._tryEos()\n return\n }\n\n if (config.preferMMSStreaming && !this._bufferService.msStreaming) {\n return\n }\n\n // reset segment pointer by buffer end\n if (!this._urlSwitching &&\n this._prevSegSn !== nextSegment.sn - 1 &&\n bInfo.end &&\n Math.abs(nextSegment.start - bInfo.end) > 1) {\n this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(bInfo.end + 0.1))\n }\n }\n\n return this._loadSegmentDirect()\n }\n\n\n /**\n * @private\n */\n async _loadSegmentDirect (loadOnce) {\n const seg = this._playlist.nextSegment\n if (!seg) return\n\n let appended = false\n let cachedError = null\n try {\n this._segmentProcessing = true\n logger.log(`load segment, sn:${seg.sn}, [${seg.start}, ${seg.end}], partIndex:${seg.partIndex}`)\n appended = await this._reqAndBufferSegment(seg, this._playlist.getAudioSegment(seg))\n } catch (error) {\n // If an exception is thrown here, other reference functions\n // need to handle the exception, so the error stops here\n cachedError = error\n } finally {\n this._segmentProcessing = false\n }\n\n if (cachedError) {\n if (this._bufferService.isFull()) {\n logger.log(`load segment, sn:${seg.sn}, partIndex:${seg.partIndex}`)\n // if buffer is full, stop request new fragments\n this._segmentProcessing = true\n this._isProcessQuotaExceeded = true\n return false\n }\n return this._emitError(StreamingError.create(cachedError))\n }\n if (appended) {\n const bufferEnd = this.bufferInfo().end\n if (this.isLive && !this.media.seeking && bufferEnd && Math.abs(seg.end - bufferEnd) > 1) {\n logger.warn(`segment: ${seg.sn} expected end=${seg.end}, real end=${bufferEnd}`)\n this._playlist.feedbackLiveEdge(seg, bufferEnd)\n }\n\n const sameStream = this._playlist.currentStream?.url === seg.parentUrl\n // switching -> pre playlist segment appended -> new playlist loaded -> new playlist segment appended\n // _needInitSegment status maybe reset by pre playlist segment appendBuffer()\n if (this._urlSwitching && !sameStream) {\n logger.warn('pre playlist segment appended!')\n this._bufferService.seamlessSwitch()\n }\n\n // switching -> new playlist loaded -> new playlist segment appended\n if (this.isLive && this._urlSwitching && sameStream) {\n this._urlSwitching = false\n this.emit(Event.SWITCH_URL_SUCCESS, { url: this.config.url })\n }\n\n this._playlist.moveSegmentPointer()\n if (seg.isLast) {\n this._end()\n } else if (!loadOnce) {\n this._loadSegment()\n }\n }\n\n return appended\n }\n\n /**\n * @param {MediaSegment} seg\n * @param {MediaSegment} audioSeg\n * @private\n */\n async _reqAndBufferSegment (seg, audioSeg) {\n const cc = seg ? seg.cc : audioSeg.cc\n const discontinuity = this._prevSegCc !== cc\n let responses = []\n try {\n responses = await this._segmentLoader.load(seg, audioSeg, discontinuity)\n } catch (e) {\n e.fatal = false\n this._segmentLoader.error = e\n throw e\n }\n if (!responses[0]) return\n const data = await this._bufferService.decryptBuffer(...responses)\n if (!data) return\n const sn = seg ? seg.sn : audioSeg.sn\n let start = seg ? seg.start : audioSeg.start\n const stream = this._playlist.currentStream\n this._bufferService.createSource(data[0], data[1], stream?.videoCodec, stream?.audioCodec)\n const before = Date.now()\n const contiguous = this._prevSegSn === sn - 1\n if (this.isLive && this._urlSwitching) {\n const segStart = this.bufferInfo().end\n // update the new segements [start、end] to match timeline.\n // (this appended segment duration maybe not matched with m3u8 description)\n this._playlist.updateSegmentsRanges(sn, segStart)\n logger.warn(`update the new playlist liveEdge, segment id=${sn}, buffer start=${segStart}, liveEdge=${this._playlist.liveEdge}`)\n start = segStart\n }\n await this._bufferService.appendBuffer(seg, audioSeg, data[0], data[1], discontinuity, contiguous, start)\n this.emit(Event.APPEND_COST, {elapsed: Date.now() - before, url: seg.url})\n await this._bufferService.evictBuffer(this.config.bufferBehind)\n this._prevSegCc = cc\n this._prevSegSn = sn\n return true\n }\n\n /**\n * @private\n */\n _onLoadeddata = () => {\n if (this.isLive && !this.config.mseLowLatency) {\n // update duration to Infinity\n if (this.media.duration !== Infinity) {\n this._bufferService.updateDuration(Infinity).catch(e=>{})\n }\n }\n }\n\n /**\n * @private\n */\n _onPlay = async () => {\n // fix replay 重复请求问题\n if (this.media.seeking && this.media.currentTime === 0){\n logger.debug('replay currentTime 0, return')\n return\n }\n clearTimeout(this._disconnectTimer)\n if (this._reloadOnPlay) {\n this._reloadOnPlay = false\n this.replay(true)\n } else {\n await this._loadSegment()\n this._startTick()\n }\n }\n\n /**\n * @private\n */\n _onPause = () => {\n if (this.isLive) {\n if (!this._reloadOnPlay) {\n let { disconnectTime } = this.config\n if (disconnectTime === null || disconnectTime === undefined) disconnectTime = this._playlist.dvrWindow\n if (!Number.isFinite(disconnectTime)) return\n clearTimeout(this._disconnectTimer)\n this._disconnectTimer = setTimeout(() => {\n this._reloadOnPlay = true\n this._clear()\n }, disconnectTime || 0)\n }\n } else {\n this._stopTick()\n }\n }\n\n /**\n * @private\n */\n _onSeeking = async () => {\n if (!this.media) return\n this._onCheckQuotaExceeded()\n const seekTime = this.media.currentTime\n const seekRange = this._playlist.seekRange\n if (seekRange) {\n const newSeekTime = clamp(seekTime, seekRange[0], this.isLive ? seekRange[1] : this.media.duration)\n if (\n // if newSeekTime less than 0, media.currentTime will be 0, this causes an infinite loop\n newSeekTime >= 0 &&\n Math.abs(seekTime - newSeekTime) >= 0.1\n ) {\n this.media.currentTime = newSeekTime\n return\n }\n }\n\n const curSeg = this._playlist.currentSegment\n const info = Buffer.info(Buffer.get(this.media), seekTime, 0.1)\n if (curSeg) {\n if (info.end && Math.abs(info.end - curSeg.end) < 0.2) return\n if (this.isLive && info.end) return\n }\n\n const segIndex = this._playlist.findSegmentIndexByTime(seekTime)\n const seg = this._playlist.getSegmentByIndex(segIndex)\n if (segIndex === null || segIndex === undefined || !seg || (this._segmentProcessing && seg === this._playlist.nextSegment)) return\n\n logger.debug('seek to', seekTime, seg)\n\n this._playlist.setNextSegmentByIndex(segIndex)\n\n this._stopTick()\n await this._segmentLoader.cancel()\n\n this._segmentProcessing = false\n if (!info.end || this.isLive) {\n await this._loadSegmentDirect(true)\n }\n this._startTick()\n }\n\n async _onCheckQuotaExceeded (){\n const seekTime = this.media.currentTime\n // handle buffer QuotaExceeded when seek\n const buffered = this.media.buffered\n let inBuffered = false\n for (let i = 0; i < buffered.length; i++){\n if (buffered.start(0) >= seekTime && seekTime < buffered.end(i)){\n inBuffered = true\n break\n }\n }\n if (this._bufferService.isFull() ) {\n const bufferBehind = inBuffered ? this.config.bufferBehind : 5\n const mediaTime = this.media.currentTime\n if (mediaTime - bufferBehind > 0){\n await this._bufferService.removeBuffer(0, mediaTime - bufferBehind)\n }\n }\n }\n\n /**\n * @private\n */\n _onTimeupdate = () => {\n if (!this.media) return\n const cfg = this.config\n if (cfg.isLive && cfg.maxLatency && cfg.targetLatency && this.media) {\n const liveEdge = this._playlist.liveEdge\n if (!liveEdge) return\n const latency = liveEdge - this.media.currentTime\n if (latency >= cfg.maxLatency) {\n logger.debug(`latency jump, currentTime:${this.media.currentTime}, liveEdge:${liveEdge}, latency=${latency}`)\n this.media.currentTime = liveEdge - cfg.targetLatency\n }\n }\n\n if (cfg.seiInTime) {\n this._seiService?.throw(this.media.currentTime)\n }\n\n if (this.config.allowedStreamTrackChange && !this.config.softDecode) {\n this._checkStreamTrackChange(this.media.currentTime)\n }\n\n }\n\n _checkStreamTrackChange (time) {\n const changedSeg = this._playlist.checkSegmentTrackChange(time, this._bufferService.nbSb)\n if (!changedSeg) return\n this.switchURL(this.config.url, changedSeg.start + 0.2)\n }\n\n /**\n * @private\n */\n async _clear () {\n clearTimeout(this._disconnectTimer)\n this._stopTick()\n await Promise.all([\n this._segmentLoader.cancel(),\n this._manifestLoader.stopPoll()\n ])\n this._segmentProcessing = false\n }\n\n /**\n * @private\n */\n async _reset (reuseMse = false) {\n this._reloadOnPlay = false\n this._prevSegSn = null\n this._prevSegCc = null\n this._switchUrlOpts = null\n this._playlist.reset()\n this._segmentLoader.reset()\n this._seiService?.reset()\n this._stats.reset()\n await this._clear()\n return this._bufferService.reset(reuseMse)\n }\n\n /**\n * @private\n */\n _end () {\n this._clear()\n this._bufferService.endOfStream()\n if (this.media.readyState <= 2 || this.media.buffered.length > 1) {\n this._startTick()\n }\n }\n\n /**\n * @private\n */\n _stopTick () {\n if (this._tickTimer) {\n clearTimeout(this._tickTimer)\n }\n this._tickTimer = null\n }\n\n /**\n * @private\n */\n _startTick () {\n this._stopTick()\n this._tickTimer = setTimeout(this._tick, this._tickInterval)\n }\n\n /**\n * @private\n */\n _tick = () => {\n if (!this.media) return\n this._startTick()\n const media = this.media\n // const buffered = Buffer.get(media)\n const segLoaderError = this._segmentLoader.error\n this._onCheckQuotaExceeded()\n // change _segmentProcessing to false\n if (this._isProcessQuotaExceeded){\n if (!this._bufferService.isFull()){\n this._isProcessQuotaExceeded = false\n this._segmentProcessing = false\n }\n }\n if (segLoaderError) {\n // Compatible with the case where the buffer does not start from 0\n const bufferMaxHoleTolerance = 0.5\n\n if (!media.readyState || this.bufferInfo(bufferMaxHoleTolerance).remaining < 1) {\n segLoaderError.fatal = true\n this._emitError(StreamingError.network(segLoaderError))\n }\n return\n }\n\n if (media.readyState) {\n if (isMediaPlaying(media)) {\n this._loadSegment()\n if (this._gapService) {\n this._gapService.do(media, this.config.maxJumpDistance, this.isLive)\n }\n } else {\n if (media.readyState < 2 && this._gapService) {\n this._gapService.do(media, this.config.maxJumpDistance, !media.currentTime ? true : this.isLive)\n }\n }\n }\n\n if (!this.isLive) {\n this._tryEos()\n }\n }\n\n /**\n * @param {StreamingError} error\n * @param {boolean?} endOfStream\n * @private\n */\n _emitError (error, endOfStream = false) {\n if (error.originError?.fatal === false) {\n logger.warn(error)\n } else {\n logger.table(error)\n logger.error(error)\n logger.error(this.media?.error)\n\n if (this.media?.readyState) {\n this.media.pause()\n }\n this._stopTick()\n if (this._urlSwitching) {\n this._urlSwitching = false\n this.emit(Event.SWITCH_URL_FAILED, error)\n }\n this.emit(Event.ERROR, error)\n if (endOfStream) this._end()\n this._seiService?.reset()\n }\n return error\n }\n\n /**\n * @private\n */\n _getSeamlessSwitchPoint () {\n const { media } = this\n let nextLoadPoint = media.currentTime\n if (!media.paused) {\n const segIdx = this._playlist.findSegmentIndexByTime(media.currentTime)\n const curSeg = this._playlist.getSegmentByIndex(segIdx)\n const latestKbps = this._stats?.getStats().downloadSpeed // latest download speed\n if (latestKbps && curSeg) {\n const delay = (curSeg.duration * this._playlist.currentStream.bitrate) / latestKbps + 1\n\n nextLoadPoint += delay\n } else {\n nextLoadPoint += 5\n }\n }\n\n return nextLoadPoint\n }\n\n /**\n * @private\n */\n _tryEos () {\n const { media } = this\n const { nextSegment, lastSegment } = this._playlist\n const eosAllowed =\n (!nextSegment ||\n (lastSegment &&\n // Use the mid-time of lastSegment to determine\n // whether the Media Buffer has been buffered to the end\n Buffer.isBuffered(media, lastSegment.start + lastSegment.duration / 2))) &&\n media.readyState &&\n media.duration > 0 &&\n this._bufferService?.msIsOpened &&\n !this._bufferService?.msHasOpTasks\n\n if (!eosAllowed) {\n return\n }\n\n let bInfo = this.bufferInfo()\n if (media.paused && !media.currentTime) {\n bInfo = this.bufferInfo(bInfo.nextStart || 0.5)\n }\n\n const bufferThroughout = Math.abs(bInfo.end - media.duration) < 0.1 ||\n (!this.isLive && lastSegment && bInfo.end >= (lastSegment.start + lastSegment.duration))\n if (bufferThroughout) {\n this._bufferService.endOfStream()\n }\n }\n}\n\ntry {\n if (localStorage.getItem('xgd')) {\n Hls.enableLogger()\n } else {\n Hls.disableLogger()\n }\n} catch (error) {\n // ignore\n}\n","/**\n * @callback m3u8ParseCallback\n * @param {string} m3u8\n * @returns {string?}\n */\n\n/**\n * @typedef {{\n * media: HTMLMediaElement,\n * url?: string,\n * isLive?: boolean,\n * softDecode?: boolean,\n * targetLatency?: number,\n * maxPlaylistSize?: number,\n * maxLatency?: number,\n * bufferBehind?: number,\n * maxJumpDistance?: number,\n * startTime?: number,\n * retryCount?: number,\n * retryDelay?: number,\n * loadTimeout?: number,\n * manifestLoadTimeout?:number,\n * preloadTime?: number,\n * disconnectTime?: number,\n * allowedStreamTrackChange?: boolean,\n * seiInTime?: boolean,\n * manifestList?: Array<{url: string, manifest: string}>\n * fetchOptions?: RequestInit\n * onPreM3U8Parse?: m3u8ParseCallback,\n * decryptor?: Decryptor,\n * minSegmentsStartPlay?: number,\n * preferMMS?: boolean,\n * preferMMSStreaming?: boolean,\n * mseLowLatency?: boolean,\n * forceFixLargeGap?:boolean,\n * }} HlsOption\n */\n\n/**\n * @param {HlsOption} cfg\n * @returns {HlsOption}\n */\nexport function getConfig (cfg) {\n const media = cfg?.media || document.createElement('video')\n return {\n maxPlaylistSize: 50,\n retryCount: 3,\n retryDelay: 1000,\n pollRetryCount: 2,\n loadTimeout: 10000,\n manifestLoadTimeout:10000,\n preloadTime: 30,\n softDecode: false,\n bufferBehind: 10,\n maxJumpDistance: 3,\n startTime: 0,\n useLowLatency: true,\n targetLatency: 10,\n maxLatency: 20,\n allowedStreamTrackChange: true,\n seiInTime: false,\n manifestList: [],\n minSegmentsStartPlay: 3,\n preferMMS: false,\n preferMMSStreaming: false,\n mseLowLatency: true, // mse 低延迟模式渲染 https://issues.chromium.org/issues/41161663\n fixerConfig: {\n forceFixLargeGap:false, // 强制修复音视频PTS LargeGap, PTS从0开始\n largeGapThreshold: 5 // 单位s\n },\n ...cfg,\n media\n }\n}\n","import { Event } from './hls/constants'\n\nexport default class PluginExtension {\n _opts = null\n _plugin = null\n\n constructor (opts, plugin) {\n this._opts = opts\n this._plugin = plugin\n this._init()\n }\n\n _init () {\n const { media, preloadTime, innerDegrade, isLive } = this._opts\n\n if (!media) return\n\n if (!isLive && media.setPlayMode) {\n media.setPlayMode('VOD')\n return\n }\n\n if (innerDegrade) {\n media.setAttribute('innerdegrade', innerDegrade)\n }\n if (preloadTime) {\n media.setAttribute('preloadtime', preloadTime)\n }\n\n this._bindEvents()\n }\n\n _bindEvents () {\n const { media } = this._opts\n\n media.addEventListener('lowdecode', this._onLowDecode)\n }\n\n _onLowDecode = () => {\n const { media, innerDegrade } = this._opts\n\n this._plugin?.player?.emit('lowdecode', media.degradeInfo)\n this._plugin?.player?.emit('core_event', {\n ...media.degradeInfo,\n eventName: Event.LOWDECODE\n })\n\n if (innerDegrade === 1) {\n this._degrade(media.src)\n }\n }\n\n /**\n * @param {string | undefined} url\n */\n _degrade = (url) => {\n const { player } = this._plugin\n const originVideo = player.video\n\n if (originVideo && originVideo.TAG !== 'MVideo') return\n\n const newVideo = player.video.degradeVideo\n\n player.video = newVideo\n\n originVideo.degrade(url)\n\n if (url) {\n player.config.url = url\n }\n\n // replace live-video to video element\n const firstChild = player.root.firstChild\n\n if (firstChild.TAG === 'MVideo') {\n player.root.replaceChild(newVideo, firstChild)\n }\n const hlsPlugin = this._plugin.constructor.pluginName.toLowerCase()\n player.unRegisterPlugin(hlsPlugin)\n\n // play\n player.once('canplay', () => {\n player.play()\n })\n }\n\n forceDegradeToVideo = (url) => {\n const { innerDegrade } = this._opts\n\n // 降级to video+m3u8\n if (innerDegrade === 1) {\n this._degrade(url)\n }\n }\n\n destroy () {\n this._opts?.media?.removeEventListener('lowdecode', this._onLowDecode)\n this._plugin = null\n }\n}\n","import { BasePlugin, Errors, Events } from 'xgplayer'\nimport { EVENT, MSE } from 'xgplayer-streaming-shared'\nimport { Hls, logger } from './hls'\nimport { Event } from './hls/constants'\nimport PluginExtension from './plugin-extension'\n\n/**\n * @param { import('xgplayer').SwitchUrlOptions } args\n * @param { HlsPlugin } plugin\n * @returns\n */\nexport function parseSwitchUrlArgs (args, plugin) {\n const { player } = plugin\n const curTime = player.currentTime\n\n /**\n * @type {{\n * startTime: number\n * seamless?: boolean\n * }}\n */\n const options = {\n startTime: curTime\n }\n\n switch (typeof args) {\n case 'boolean':\n options.seamless = args\n break\n case 'object': {\n const { currentTime, ...rest } = args\n Object.assign(options, rest)\n if (typeof currentTime === 'number') {\n options.startTime = currentTime\n }\n break\n }\n default:\n break\n }\n return options\n}\n\nexport class HlsPlugin extends BasePlugin {\n static Hls = Hls\n\n static EVENT = Event\n\n logger = logger\n\n /**\n * @type {Hls}\n */\n hls = null\n\n pluginExtension = null\n\n static get pluginName () {\n return 'hls'\n }\n\n get core () {\n return this.hls\n }\n\n get version () {\n return this.hls?.version\n }\n\n get softDecode () {\n const mediaType = this.player?.config?.mediaType\n return !!mediaType && mediaType !== 'video' && mediaType !== 'audio' && mediaType !== 'offscreen-video'\n }\n\n beforePlayerInit () {\n const config = this.player.config\n const mediaElem = this.player.media || this.player.video\n const hlsOpts = config.hls || {}\n\n if (\n (!config.url &&\n // private config key\n !config.__allowHlsEmptyUrl__) ||\n (!this.softDecode && !hlsOpts.preferMMS && MSE.isMMSOnly())\n ) {\n return\n }\n\n if (this.hls) this.hls.destroy()\n\n /**\n * 支持被继承时,指定不可写的属性。用来实现外部 switchURL 逻辑\n */\n const descriptor = Object.getOwnPropertyDescriptor(this.player, 'switchURL')\n if (!descriptor || descriptor.writable) {\n this.player.switchURL = (url, args) => {\n return new Promise((resolve, reject) => {\n const { player, hls } = this\n if (hls) {\n const options = parseSwitchUrlArgs(args, this)\n player.config.url = url\n hls.switchURL(url, options)\n .then(() => resolve(true))\n .catch(reject)\n\n if (!options.seamless && this.player.config?.hls?.keepStatusAfterSwitch) {\n this._keepPauseStatus()\n }\n } else {\n reject()\n }\n })\n }\n }\n const onSwitchUrl = this.player.switchURL\n this.player.handleSource = false // disable player source handle\n\n hlsOpts.innerDegrade = hlsOpts.innerDegrade || config.innerDegrade\n if (hlsOpts.disconnectTime === null || hlsOpts.disconnectTime === undefined) hlsOpts.disconnectTime = 0\n\n this.hls = new Hls({\n softDecode: this.softDecode,\n isLive: config.isLive,\n media: mediaElem,\n startTime: config.startTime,\n url: config.url,\n ...hlsOpts\n })\n\n if (!this.softDecode) {\n BasePlugin.defineGetterOrSetter(this.player, {\n url: {\n get: () => this.hls?.media?.src,\n configurable: true\n }\n })\n }\n\n if (this.softDecode) {\n this.pluginExtension = new PluginExtension({\n isLive: config.isLive,\n media: mediaElem,\n ...hlsOpts\n }, this)\n this.player.forceDegradeToVideo = (...args) => this.pluginExtension?.forceDegradeToVideo(...args)\n }\n\n if (config.isLive) {\n // This is a heavy operation for the vod flow, which may cause seeked event never emit\n this.player?.useHooks('replay', () => this.hls?.replay())\n }\n\n this.on(Events.URL_CHANGE, onSwitchUrl)\n this.on(Events.SWITCH_SUBTITLE || 'switch_subtitle', this._onSwitchSubtitle)\n this.on(Events.DESTROY, this.destroy.bind(this))\n\n this._transError()\n this._transCoreEvent(EVENT.TTFB)\n this._transCoreEvent(EVENT.LOAD_START)\n this._transCoreEvent(EVENT.LOAD_RESPONSE_HEADERS)\n this._transCoreEvent(EVENT.LOAD_COMPLETE)\n this._transCoreEvent(EVENT.LOAD_RETRY)\n this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED)\n this._transCoreEvent(EVENT.MEDIASOURCE_OPENED)\n this._transCoreEvent(EVENT.APPEND_BUFFER)\n this._transCoreEvent(EVENT.REMOVE_BUFFER)\n this._transCoreEvent(EVENT.BUFFEREOS)\n this._transCoreEvent(EVENT.KEYFRAME)\n this._transCoreEvent(EVENT.METADATA_PARSED)\n this._transCoreEvent(EVENT.DEMUXED_TRACK)\n this._transCoreEvent(EVENT.SEI)\n this._transCoreEvent(EVENT.SEI_IN_TIME)\n this._transCoreEvent(EVENT.SPEED)\n this._transCoreEvent(EVENT.HLS_MANIFEST_LOADED)\n this._transCoreEvent(EVENT.HLS_LEVEL_LOADED)\n this._transCoreEvent(EVENT.STREAM_EXCEPTION)\n this._transCoreEvent(EVENT.SWITCH_URL_SUCCESS)\n this._transCoreEvent(EVENT.SWITCH_URL_FAILED)\n this._transCoreEvent(Event.NO_AUDIO_TRACK)\n this._transCoreEvent(Event.STREAM_PARSED)\n this._transCoreEvent(Event.SUBTITLE_SEGMENTS)\n this._transCoreEvent(Event.SUBTITLE_PLAYLIST)\n this._transCoreEvent(Event.APPEND_COST)\n\n if (config.url) {\n this.hls.load(config.url, {\n reuseMse: true\n }).catch(e => {})\n }\n }\n\n /**\n * It needs to be supported as a subclass to be inherited externally, so don't write it as an attribute here\n */\n destroy () {\n if (this.hls) {\n this.hls.destroy()\n this.hls = null\n }\n\n this.pluginExtension?.destroy()\n this.pluginExtension = null\n }\n\n /**\n * @returns {import('./hls').Stats | undefined}\n */\n getStats = () => {\n return this.hls?.getStats()\n }\n\n\n /**\n * @param {string | boolean} [mediaType]\n * @param {string} [codec]\n * @returns {boolean}\n * - mediaType: 默认检测 MSE 对 H264 codec是否支持,传入 true 或者配置参数的mediaType的取值检测 WebAssembly是否支持\n * - codec: 暂无使用\n */\n static isSupported (mediaType, codec) {\n return Hls.isSupported(mediaType, codec)\n }\n\n _onSwitchSubtitle = ({lang}) => {\n this.hls?.switchSubtitleStream(lang)\n }\n\n _keepPauseStatus = () => {\n const paused = this.player.paused\n if (!paused) return\n this.player.once('canplay', () => {\n this.player.pause()\n })\n }\n\n _transError () {\n this.hls.on(Event.ERROR, (err) => {\n if (this.player) {\n this.player.emit(Events.ERROR, new Errors(this.player, err))\n }\n })\n }\n\n _transCoreEvent (eventName) {\n this.hls.on(eventName, (e) => {\n if (this.player) {\n this.player.emit('core_event', {\n ...e,\n eventName\n })\n\n if (eventName === EVENT.SEI_IN_TIME && this.hls.hasSubtitle) {\n this._emitSeiPaylodTime(e)\n }\n }\n })\n }\n\n _emitSeiPaylodTime (e) {\n try {\n const seiJson = JSON.parse(Array.from(e.data.payload).map(x=>String.fromCharCode(x)).join('').slice(0,-1))\n if (!seiJson['rtmp_dts']) return\n this.player.emit('core_event', {\n eventName: Event.SEI_PAYLOAD_TIME,\n time: seiJson['rtmp_dts']\n })\n } catch (e) {}\n }\n\n}\n"],"names":["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","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","TTFB","LOAD_START","LOAD_RESPONSE_HEADERS","LOAD_COMPLETE","LOAD_RETRY","SOURCEBUFFER_CREATED","MEDIASOURCE_OPENED","ANALYZE_DURATION_EXCEEDED","APPEND_BUFFER","REMOVE_BUFFER","BUFFEREOS","KEYFRAME","CHASEFRAME","METADATA_PARSED","SEI","SEI_IN_TIME","FLV_SCRIPT_DATA","LOWDECODE","SWITCH_URL_SUCCESS","SWITCH_URL_FAILED","SPEED","HLS_MANIFEST_LOADED","HLS_LEVEL_LOADED","DEMUXED_TRACK","STREAM_EXCEPTION","LARGE_AV_FIRST_FRAME_GAP_DETECT","LARGE_VIDEO_DTS_GAP_DETECT","LARGE_AUDIO_DTS_GAP_DETECT","AUDIO_GAP_DETECT","AUDIO_OVERLAP_DETECT","MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT","REAL_TIME_SPEED","has","prefix","Events","EE","fn","once","addListener","emitter","TypeError","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","ee","listenerCount","emit","a1","a2","a3","a4","a5","len","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","CACHESIZE","FetchLoader","_EventEmitter","_cancel","_ref","_this$_abortControlle","timeout","responseType","onProgress","onTimeout","onCancel","transformResponse","logger","method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","onProcessMinLen","_aborted","_onProcessMinLen","_onCancel","_abortController","AbortController","_running","_index","_range","_vid","_priOptions","init","signal","clearTimeout","_timeoutTimer","rangeValue","Headers","append","Range","setTimeout","cancel","fetch","_ref2","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","Uint8Array","time","catch","_error","_reader","t0","st","getReader","err","_cache","_writeIdx","reader","pump","_ref3","_this3$_range","startRange","startByte","curLen","retData","temp","read","_receivedLength","set","XhrLoader","req","_onProgress","_headers","_withCredentials","_body","_method","_timeout","_runing","_responseType","_firstRtt","_onTimeout","_request","_loadCompleteResolve","_loadCompleteReject","_startLoad","chunkSize","_currentChunkSizeKB","from","to","_internalOpen","_startTime","xhr","_xhr","XMLHttpRequest","open","withCredentials","onload","_onLoad","onreadystatechange","_onReadyStatechange","onerror","errorEvent","_errorEvent$currentTa","_errorEvent$currentTa2","_errorEvent$currentTa3","currentTarget","statusText","ontimeout","setRequestHeader","send","target","_this$_range","_objectSpread","byteStart","_this$_range2","chunk","responseURL","_getHeaders","_transformResponse","_getPrototypeOf","_step","_iterator","_createForOfIteratorHelper","getAllResponseHeaders","trim","split","s","n","parts","toLowerCase","f","Task","alive","_loaderType","_loader","_retryCount","_retryTimer","_canceled","_retryCheckFunc","retryCheckFunc","_this$_config","retry","retryDelay","onRetryError","transformError","rest","_objectWithoutProperties","_excluded","isRetry","running","loaderType","retryCount","concatUint8Array","arr","prevLen","d","sleep","NetLoader","cfg","transformRequest","integrity","getConfig","isSupported","task","loader","_currentTask","_processTask","cancels","_alive","finally","_this3$_currentTask","_this3$_alive","GapService","maxJumpDistance","isLive","seekThreshold","jumpTo","_prevCurrentTime","info","seeking","SeiService","Set","sei","_seiSet","add","size","min","toThrow","delete","clear","BandwidthService","opts","_opts","totalByte","_speeds","_this$_opts","_this$_opts2","skipChunkSize","_totalSize","_totalCost","_chunkSpeed","_chunkCache","timestamp","chunkCountForSpeed","_this$_opts3","lastSample","cost","longtimeNoReceived","Stats","timescale","_timescale","encodeType","audioCodec","videoCodec","domain","fps","bitrate","width","height","samplerate","channelCount","gop","_data$onMetaData","onMetaData","framerate","track","codec","codecType","fpsNum","fpsDen","sampleRate","responseUrl","samples","sample","_startGopId","gopId","_bitsAccumulateDuration","_bitsAccumulateSize","units","MediaStatsService","core","_core","_stats","_bindEvents","_this$_core","_this$_core2","_this$_core2$speedInf","_this$_core3","_this$_core3$speedInf","_this$_core4","_this$_core4$speedInf","_this$_core5","_this$_core5$speedInf","_this$_core6","_this$_core6$bufferIn","_ref2$currentTime","_ref2$decodeFps","decodeFps","getStats","downloadSpeed","speedInfo","avgSpeed","totalReceivedByte","totalSize","totalReceivedCost","totalCost","bufferInfo","videoTrack","updateBitrate","setFpsFromScriptData","setVideoMeta","setAudioMeta","setDomain","_samples","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","sequenceNumber","baseMediaDecodeTime","present","pid","pps","sps","vps","sarRatio","warnings","hvcC","dts","pts","first","isVideoEncryption","AudioTrack","sampleDuration","container","isAudioEncryption","VideoSample","originPts","originDts","keyframe","dependsOn","isNonSyncSample","AudioSample","sampleOffset","Sample","FlvScriptSample","_Sample","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","_data","_bytesAvailable","_loadWord","_bitsAvailable","position","availableBytes","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","offset","dataLen","unit","isHevc","uuid","uint","emulationPreventionBytesPositions","newLength","newData","sourceIndex","AVC","nalUnitSize","spsParsed","spsSize","spsArr","ppsArr","spsCount","parseSPS","removeEPB","ppsSize","ppsCount","eg","readUByte","profileIdc","profileCompatibility","levelIdc","skipUEG","chromaFormat","chromaFormatIdc","readBool","scalingListCount","skipScalingList","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","fixedFrame","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","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","BitratesMap","SamplesCoefficients","BytesInSlot","chromeVersion","MPEG","header","parseHeader","stamp","samplesPerFrame","mpegVersion","mpegLayer","bitRateIndex","sampleRateIndex","paddingBit","channelMode","bitRate","sampleCoefficient","bytesInSlot","match","MAX_SILENT_FRAME_DURATION","AUDIO_EXCEPTION_LOG_EMIT_DURATION","FlvFixer","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","discontinuity","contiguous","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","refSampleDurationInt","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","G711PCMA","_getG711Duration","sampleDurationInSampleRate","nextPts","silentFrame","_getSilentFrame","silentSample","sampleSize","getSilentFrame","AMF","_parseValue","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","decode","getUint16","FlvSoundFormat","FlvDemuxer","_fixer","_scriptDataObject$dat","seamlessLoadingSwitching","_remainingData","_headerParsed","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","scriptDataObject","metaData","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","G711A","_parseG711","_parseAac","_parseOpus","packetType","parseHeaderPackets","newSample","audioData","parseAudioSpecificConfig","frameType","codecId","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","lastKeyFrameDts","setToKeyframe","parseSEI","_gopId","hevc","_needAddMetaBeforeKeyFrameNal","AUDIO_EXCETION_LOG_EMIT_DURATION","MAX_VIDEO_FRAME_DURATION","TsFixer","fixerConfig","_baseVideoDts","_baseAudioDts","_needForceFixLargeGap","forceFixLargeGap","_largeGapThreshold","largeGapThreshold","vSamples","aSamples","firstVideoSample","firstAudioSample","vaDelta","vDeltaToNextDts","aDeltaToNextDts","_samples$i","prevDts","second","expectFragEnd","largeGap","_audioLastSample","TsDemuxer","_pmtId","_remainingPacketData","_videoPesData","_audioPesData","remainingLength","videoPid","audioPid","payloadUnitStartIndicator","adaptationFiledControl","tableEnd","programInfoLength","esPid","_parseVideoData","_parseAudioData","pes","_parsePES","_toConsumableArray","parseAnnexB","_createVideoSample","spsInfo","ffByteFound","_pushVideoSample","_parseAacData","_parseMPEG","_track$samples","parseADTS","isHeader","frame","appendFrame","headerDataLen","pesLen","ptsDtsFlags","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","FMP4Demuxer","partData","partDataStart","videoExist","audioExist","isAV01","dataStart","__lastRemainData","lastRemainDataEnd","__lastRemainDataStart","noDuplicateData","__nextMoofStart","moovBox","dataEnd","moovToTrack","moofBoxes","moofBox","w","__loadedMoofWraps","nextMoofStart","sort","_loop","moofWrap","moofStart","moofToSamples","videoBaseMediaDecodeTime","audioBaseMediaDecodeTime","some","xStart","sampleData","videoData","baseOffset","Concat","ResultConstructor","arrays","self","UINT32_MAX","FTYPHEV1","FTYPAVC1","ftyp","content","mvex","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$flag","_samples$i$cts","trackMP4","mdiaMP4","minfMP4","stblMP4","_ref5","_ref6","sampleDescIndex","samplesSizes","offsets","keyframeIndexes","_ref7","styp","durationCount","earliestTime","mdatSize","sidx","mdat","video","audio","dinf","dref","StblTable","FMP4Remuxer","browserVersions","forceFirstIDR","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_offset2","_sample2","u","_offset","_sample","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","crypto","msCrypto","subtle","webkitSubtle","externalDecryptor","_decryptData2","_decryptSegment2","_this$externalDecrypt","destroy","_decryptSegment","seg","_decryptData","keyIv","aesKey","importKey","_x5","_x6","_x7","Event","STREAM_PARSED","NO_AUDIO_TRACK","SUBTITLE_SEGMENTS","SUBTITLE_PLAYLIST","SEI_PAYLOAD_TIME","APPEND_COST","Transmuxer","hls","isMP4","needRemux","_demuxer","_isMP4","_remuxer","videoChunk","audioChunk","needInit","demuxer","demuxAndFix","vParsed","firstDts","firstPts","samplesDuration","aParsed","newId","_initSegmentId","_fireEvents","mseLowLatency","totalDuration","_this$_remuxer$remux","remux","logCC","toFixed","meta","code","BufferService","softDecode","_softVideo","_mse","decryptor","_decryptor","_destroy","_detachMedia","_setLiveSeekableRange","_endOfStream","_reset","_clearAllBuffer","_evictBuffer","_removeBuffer","_appendBuffer","_updateDuration","_this$_transmuxer","_this$_transmuxer$_de","_this$_transmuxer$_de2","_transmuxer","_this$_mse","_this$_mse2","_this$_mse3","hasOpTasks","_this$_mse4","updateDuration","_sourceCreated","_directAppend","mix","_createMseSource","segment","afterAppend","_this$_transmuxer$tra","_this$_transmuxer$tra2","isFirstAppend","mse","_p","videoRest","audioRest","_this2$hls","_this2$hls2","AUDIO","_needInitSegment","transmux","setTrackExist","_handleCodecChange","_excluded2","_x8","_args3","clearBuffer","removeEnd","_callee4","bufferBehind","_context4","removeBuffer","_x9","_callee5","_context5","clearAllBuffer","_callee6","reuseMse","_args6","_context6","_callee7","_context7","_callee8","_context8","_x10","_x11","_callee9","_context9","_callee10","_this$_decryptor","_context10","detachMedia","tasks","sourceBuffer","getSourceBuffer","RegExp","_this$_mse5","mediaType","MasterPlaylist","MediaType","KeySystems","CLEAR_KEY","FAIRPLAY","WIDEVINE","PLAYREADY","flatArray","MediaStream","AudioStream","_MediaStream","SubTitleStream","_MediaStream3","MasterStream","MediaPlaylist","MediaSegment","parentUrl","prevSegment","byteRange","bytes","MediaSegmentKey","segKey","keyFormat","keyFormatVersions","sn","setIVFromSN","isSegmentEncrypted","isValidKeySystem","HlsUrlParameters","msn","part","uri","searchParams","href","REGEXP_TAG","REGEXP_ATTR","REGEXP_ABSOLUTE_URL","REGEXP_URL_PAIR","getLines","parseTag","parseAttr","getAbsoluteUrl","pairs","CODECS_REGEXP","getCodecs","re","isValidDaterange","attr","dateRangeWithSameId","_badValueForSameId","DURATION","_endDate","_startDate","attrValue","dict","cue","CUE","pre","post","identifier","ID","END_ON_NEXT","CLASS","parseMasterPlaylist","lines","line","master","audioStreams","subtitleStreams","_tag","stream","TYPE","URI","default","DEFAULT","autoSelect","AUTOSELECT","NAME","LANGUAGE","CHANNELS","channels","BANDWIDTH","RESOLUTION","_attr$RESOLUTION$spli2","CODECS","textCodec","audioGroup","subtitleGroup","SUBTITLES","streams","parseMediaPlaylist","useLowLatency","curSegment","curInitSegment","curKey","curSN","curCC","endOfList","partSegmentIndex","toUpperCase","targetDuration","lowLatency","partTargetDuration","canBlockReload","partHoldBack","canSkipUntil","canSkipDateRanges","startSN","startCC","setByteRange","segments","independent","cc","partIndex","preloadHint","nextSN","nextIndex","dataTime","_data$split2","title","METHOD","KEYFORMAT","KEYFORMATVERSIONS","IV","BYTERANGE","isInitSegment","skippedSegments","MAX_SAFE_INTEGER","dateRanges","endDate","END_DATE","lastSegment","isLast","endSN","endPartIndex","live","endCC","M3U8Parser","isMediaPlaylist","ManifestLoader","elapsed","retryTime","network","_timer","_useLowLatency","_this$hls$config","manifestLoadTimeout","fetchOptions","_onLoaderRetry","_audioLoader","_subtitleLoader","_load","audioUrl","subtitleUrl","toLoad","videoText","audioText","subtitleText","videoResUrl","audioResUrl","subtitleResUrl","_yield$Promise$all","_yield$Promise$all2","subtitle","_audio$response","_subtitle$response","_audio$response2","onPreM3U8Parse","playlist","audioPlaylist","subtitlePlaylist","_playlist","_emitOnLoaded","isMaster","deliveryDirectives","_playlist2","cb","errorCb","pollRetryCount","reqUrl","addDirectives","num","Stream","_setLLPlaybackPoint","_this$segments$","_this$lastSegment","lastSeg","_this$currentSubtitle","currentSubtitleStream","pointer","currentAudioStream","_clearSegments","snDiff","_updateSegments","newSegs","segs","toSwitch","maxStartPoint","usefulSegs","sliceStart","segObj","_endSeg$sn","endSeg","hasNew","findIndex","toAppend","endTimeBeforeAppend","lastCC","Playlist","_this$currentStream","currentStream","_this$currentStream2","_this$currentSegments","currentSegments","_segmentPointer","_this$currentSegments2","_this$currentStream3","_this$currentStream4","currentSubtitleEndSn","_this$currentStream5","liveEdge","_this$currentStream6","_this$currentSegments3","_this$currentSegments4","_this$currentStream7","_this$currentStream8","_this$currentStream9","getAudioSegment","_this$currentSegments5","dvrWindow","_this$currentSegments6","_this$currentSegments7","preIndex","setNextSegmentByIndex","newSubtitleSegs","updateSubtitle","list","_this$currentSegments8","_this$currentStream10","switchSubtitle","maxPlaylistSize","clearOldSegment","cTime","nbSb","findSegmentIndexByTime","getSegmentByIndex","updateSegmentsRanges","SegmentLoader","_bandwidthService","addRecord","_mapCache","_keyCache","loadTimeout","_segmentLoader","_audioSegmentLoader","_keyLoader","_loadSegment2","getLatestSpeed","getAvgSpeed","audioSeg","loadInit","loadAudioInit","loadVideoSegment","loadAudioSegment","_loadSegment","segLoader","_seg$key","mapKey","mapKeyIv","_seg$initSegment$key","mapUrl","_keyUrl","keyUrl","Hls","_reset2","_clear2","_onCheckQuotaExceeded2","_reqAndBufferSegment2","_loadSegmentDirect2","_loadM3U","_switchSubtitleStream","_switchAudioStream","_switchStream","_switchURL","_replay","_loadData2","_this$_playlist","nextSegment","_assertThisInitialize","maxBufferThroughout","bInfo","bufferThroughout","_segmentProcessing","minFrameDuration","paused","preloadTime","_tryEos","preferMMSStreaming","_bufferService","msStreaming","_urlSwitching","_prevSegSn","_loadSegmentDirect","_disconnectTimer","_reloadOnPlay","replay","_startTick","disconnectTime","_clear","_stopTick","seekTime","seekRange","newSeekTime","curSeg","segIndex","_onCheckQuotaExceeded","currentSegment","_this$_seiService","maxLatency","targetLatency","latency","seiInTime","_seiService","throw","allowedStreamTrackChange","_checkStreamTrackChange","segLoaderError","_isProcessQuotaExceeded","fatal","_emitError","ended","playbackRate","isMediaPlaying","_gapService","do","document","createElement","manifestList","minSegmentsStartPlay","_manifestLoader","_onLoadeddata","_onPlay","_onPause","_onSeeking","_onTimeupdate","hasSubtitle","_this$_bufferService","targetSeg","_this$media","getVideoPlaybackQuality","droppedVideoFrames","corruptedVideoFrames","totalVideoFrames","creationTime","webkitDroppedFrameCount","webkitDecodedFrameCount","_args4","clearSwitchStatus","_switchUrlOpts","_loadData","manifest","_this$_switchUrlOpts","_this$_switchUrlOpts3","_this$_switchUrlOpts4","_this$_switchUrlOpts2","switchTimePoint","segIdx","nextSeg","bufferClearStartPoint","_this$_switchUrlOpts5","_loadM3U8","setNextSegmentBySN","_prevSegCc","_getSeamlessSwitchPoint","nbSegments","_pollM3U8","seamless","isPlayEmit","play","defaultOpts","_options","appended","_args7","seamlessSwitch","force","curStream","curId","_args8","_refreshM3U8","audioStream","_args9","stopPoll","_callee11","_context11","_callee12","_this$_seiService2","_context12","_callee13","_this$config$manifest","_this$config$manifest2","_this$_playlist$curre","_context13","parseText","upsertPlaylist","_stream$currentAudioS","_stream$currentSubtit","mediaPlaylist","pollInterval","_this$_playlist$lastS","isEmpty","poll","p1","p2","p3","hadSegmentLoaded","_callee14","loadOnce","cachedError","_this$_playlist$curre2","sameStream","_context14","_reqAndBufferSegment","finish","feedbackLiveEdge","moveSegmentPointer","_end","_callee15","_this$_bufferService2","responses","before","segStart","_context15","decryptBuffer","evictBuffer","_callee16","inBuffered","mediaTime","_context16","changedSeg","checkSegmentTrackChange","switchURL","_callee17","_context17","_callee18","_this$_seiService3","_args18","_context18","_tickTimer","_tick","_tickInterval","_error$originError","_this$media2","_this$media3","_this$_seiService4","pause","nextLoadPoint","_this$_stats","latestKbps","delay","_this$_bufferService3","_this$_bufferService4","_this$_playlist2","isBuffered","msIsOpened","msHasOpTasks","WebAssembly","TransmuxerLogger","disable","localStorage","getItem","enableLogger","disableLogger","PluginExtension","plugin","_this$_plugin","_this$_plugin$player","_this$_plugin2","_this$_plugin2$player","innerDegrade","_plugin","player","degradeInfo","eventName","_degrade","originVideo","TAG","newVideo","degradeVideo","degrade","firstChild","root","replaceChild","hlsPlugin","pluginName","unRegisterPlugin","_init","setPlayMode","setAttribute","_onLowDecode","_this$_opts3$media","HlsPlugin","_BasePlugin","_this$hls","_this$hls2","switchSubtitleStream","_this$hls3","_this$player","_this$player$config","mediaElem","hlsOpts","__allowHlsEmptyUrl__","isMMSOnly","descriptor","getOwnPropertyDescriptor","writable","_this2$player$config","_this2$player$config$","parseSwitchUrlArgs","keepStatusAfterSwitch","_keepPauseStatus","onSwitchUrl","_this$player2","handleSource","defineGetterOrSetter","_this2$hls$media","configurable","pluginExtension","forceDegradeToVideo","_this2$pluginExtensio","useHooks","URL_CHANGE","SWITCH_SUBTITLE","_onSwitchSubtitle","DESTROY","_transError","_transCoreEvent","_this$pluginExtension","Errors","_emitSeiPaylodTime","seiJson","BasePlugin"],"mappings":"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"}