xgplayer-mp4 3.0.12-alpha.7 → 3.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../../../node_modules/concat-typed-array/lib/index.js","../../../node_modules/concat-typed-array/lib/concat.js","../../xgplayer-transmuxer/src/model/types.js","../../xgplayer-transmuxer/src/model/video-track.js","../../xgplayer-transmuxer/src/model/audio-track.js","../../xgplayer-transmuxer/src/model/video-sample.js","../../xgplayer-transmuxer/src/model/audio-sample.js","../../xgplayer-transmuxer/src/model/metadata-track.js","../../xgplayer-transmuxer/src/utils/exp-golomb.js","../../xgplayer-transmuxer/src/utils/logger.js","../../xgplayer-transmuxer/src/utils/utf8.js","../../xgplayer-transmuxer/src/utils/env.js","../../xgplayer-transmuxer/src/utils/index.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/aac.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/mp4/mp4-parser.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../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","../../../node_modules/crypto-es/lib/pad-nopadding.js","../../xgplayer-transmuxer/src/mp4/crypto/crypto.js","../../xgplayer-transmuxer/src/mp4/mp4-demuxer.js","../src/version.js","../../xgplayer-streaming-shared/src/utils.js","../../xgplayer-streaming-shared/src/buffer.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/mse.js","../../xgplayer-streaming-shared/src/net/types.js","../../xgplayer-streaming-shared/src/net/error.js","../../xgplayer-streaming-shared/src/is.js","../../xgplayer-streaming-shared/src/net/helper.js","../../xgplayer-streaming-shared/src/event.js","../../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","../src/error.js","../src/util/index.js","../../xgplayer-mp4-loader/src/error.js","../../xgplayer-mp4-loader/src/cache.js","../../xgplayer-mp4-loader/src/utils.js","../../xgplayer-mp4-loader/src/loader.js","../../xgplayer-mp4-loader/src/config.js","../src/util/logger.js","../src/worker/index.js","../src/mp4.js","../src/util/timer.js","../src/util/proxy-promise.js","../src/mp4Plugin.js"],"sourcesContent":["'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","'use strict';\n\nvar _concat = require('./concat');\n\nvar _concat2 = _interopRequireDefault(_concat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = _concat2.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ResultConstructor) {\n var totalLength = 0;\n\n for (var _len = arguments.length, arrays = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n arrays[_key - 1] = arguments[_key];\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = arrays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var arr = _step.value;\n\n totalLength += arr.length;\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var result = new ResultConstructor(totalLength);\n var offset = 0;\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = arrays[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _arr = _step2.value;\n\n result.set(_arr, offset);\n offset += _arr.length;\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return result;\n};","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m'\n}\n\n/** @enum {string} */\nexport const WarningType = {\n LARGE_AV_SHIFT: 'LARGE_AV_SHIFT',\n LARGE_VIDEO_GAP: 'LARGE_VIDEO_GAP',\n LARGE_VIDEO_GAP_BETWEEN_CHUNK: 'LARGE_VIDEO_GAP_BETWEEN_CHUNK',\n LARGE_AUDIO_GAP: 'LARGE_AUDIO_GAP',\n AUDIO_FILLED: 'AUDIO_FILLED',\n AUDIO_DROPPED: 'AUDIO_DROPPED'\n}\n","import { TrackType, VideoCodecType } from './types'\n\nexport class VideoTrack {\n id = 1\n\n /** @readonly */\n type = TrackType.VIDEO\n\n codecType = VideoCodecType.AVC\n\n pid = -1 // ts use\n\n /** @type {Uint8Array | Object} */\n hvcC = undefined\n\n codec = ''\n\n timescale = 0\n\n formatTimescale = 0\n\n sequenceNumber = 0\n\n baseMediaDecodeTime = 0\n\n baseDts = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./video-sample').VideoSample[]} */\n samples = []\n\n /** @type {Uint8Array[]} */\n pps = []\n\n /** @type {Uint8Array[]} */\n sps = []\n\n /** @type {Uint8Array[]} */\n vps = []\n\n fpsNum = 0\n\n fpsDen = 0\n\n /** @type {[number, number]} */\n sarRatio = [] // [hSpacing, vSpacing]\n\n width = 0\n\n height = 0\n\n nalUnitSize = 4\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n isVideo = true\n\n kid = null\n\n pssh = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber =\n this.width =\n this.height =\n this.fpsDen =\n this.fpsNum =\n this.duration =\n this.baseMediaDecodeTime =\n this.timescale = 0\n this.codec = ''\n this.present = false\n this.pid = -1\n this.pps = []\n this.sps = []\n this.vps = []\n this.sarRatio = []\n this.samples = []\n this.warnings = []\n this.hvcC = null\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.pps.length && this.sps.length && this.codec)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isVideoEncryption\n }\n}\n","import { TrackType, AudioCodecType } from './types'\n\nexport class AudioTrack {\n id = 2\n\n /** @readonly */\n type = TrackType.AUDIO\n\n codecType = AudioCodecType.AAC\n\n pid = -1\n\n codec = ''\n\n sequenceNumber = 0\n\n sampleDuration = 0\n\n timescale = 0\n\n formatTimescale = 0\n\n baseMediaDecodeTime = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./audio-sample').AudioSample[]} */\n samples = []\n\n baseDts = 0\n\n sampleSize = 16\n\n sampleRate = 0\n\n channelCount = 0\n\n objectType = 0\n\n sampleRateIndex = 0\n\n /** @type {number[]} */\n config = []\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n kid = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber = 0\n this.timescale = 0\n this.sampleDuration = 0\n this.sampleRate = 0\n this.channelCount = 0\n this.baseMediaDecodeTime = 0\n this.present = false\n this.pid = -1\n this.codec = ''\n this.samples = []\n this.config = []\n this.warnings = []\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isAudioEncryption\n }\n}\n","/**\n * @typedef {Object} VideoFlag\n * @property {number} [isLeading=0]\n * @property {number} [dependsOn=1]\n * @property {number} [isDependedOn=0]\n * @property {number} [hasRedundancy=0]\n * @property {number} [paddingValue=0]\n * @property {number} [degradationPriority=0]\n * @property {number} [isNonSyncSample=1]\n */\n\nexport class VideoSample {\n /** @type {VideoFlag} */\n flag = {}\n\n keyframe = false\n\n gopId = 0\n\n duration = 0\n\n size = 0\n\n units = []\n\n chromaFormat = 420\n\n // sampleOffset = 0\n\n /**\n * @param {number} pts\n * @param {number} dts\n * @param {Uint8Array[]} [units]\n */\n constructor (pts, dts, units) {\n this.originPts = this.pts = pts\n this.originDts = this.dts = dts\n if (units) this.units = units\n }\n\n /**\n * @returns {number}\n */\n get cts () {\n return this.pts - this.dts\n }\n\n setToKeyframe () {\n this.keyframe = true\n this.flag.dependsOn = 2\n this.flag.isNonSyncSample = 0\n }\n}\n","export class AudioSample {\n duration = 1024\n\n flag = { dependsOn: 2, isNonSyncSample: 0 }\n keyframe = true\n\n /**\n * @param {number} pts\n * @param {Uint8Array} data\n * @param {number} [duration=1024]\n */\n constructor (pts, data, duration, sampleOffset) {\n this.originPts = this.pts = this.dts = pts\n this.data = data\n this.size = data.byteLength\n this.sampleOffset = sampleOffset\n if (duration) this.duration = duration\n }\n}\n","import { TrackType } from './types'\n\nclass Sample {\n time = 0 // second\n\n /**\n * @param {Object} data\n * @param {number} pts\n */\n constructor (data, pts) {\n this.data = data\n this.originPts = this.pts = pts\n }\n}\n\nexport class FlvScriptSample extends Sample {}\n\nexport class SeiSample extends Sample {}\n\nexport class MetadataTrack {\n /** @readonly */\n id = 3\n\n /** @readonly */\n type = TrackType.METADATA\n\n timescale = 0\n\n /** @type {FlvScriptSample[]} */\n flvScriptSamples = []\n\n /** @type {SeiSample[]} */\n seiSamples = []\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!((this.flvScriptSamples.length || this.seiSamples.length) && this.timescale)\n }\n\n reset () {\n this.timescale = 0\n this.flvScriptSamples = []\n this.seiSamples = []\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!(this.flvScriptSamples.length || this.seiSamples.length)\n }\n}\n","export class ExpGolomb {\n _bytesAvailable\n\n _bitsAvailable = 0\n\n _word = 0\n\n constructor (data) {\n if (!data) throw new Error('ExpGolomb data params is required')\n this._data = data\n this._bytesAvailable = data.byteLength\n if (this._bytesAvailable) this._loadWord()\n }\n\n _loadWord () {\n const position = this._data.byteLength - this._bytesAvailable\n const availableBytes = Math.min(4, this._bytesAvailable)\n if (availableBytes === 0) throw new Error('No bytes available')\n\n const workingBytes = new Uint8Array(4)\n workingBytes.set(this._data.subarray(position, position + availableBytes))\n\n this._word = new DataView(workingBytes.buffer).getUint32(0)\n this._bitsAvailable = availableBytes * 8\n this._bytesAvailable -= availableBytes\n }\n\n skipBits (count) {\n if (this._bitsAvailable > count) {\n this._word <<= count\n this._bitsAvailable -= count\n } else {\n count -= this._bitsAvailable\n const skipBytes = Math.floor(count / 8)\n count -= (skipBytes * 8)\n this._bytesAvailable -= skipBytes\n this._loadWord()\n this._word <<= count\n this._bitsAvailable -= count\n }\n }\n\n readBits (size) {\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits')\n }\n\n let bits = Math.min(this._bitsAvailable, size)\n const val = this._word >>> (32 - bits)\n\n this._bitsAvailable -= bits\n if (this._bitsAvailable > 0) {\n this._word <<= bits\n } else if (this._bytesAvailable > 0) {\n this._loadWord()\n }\n\n bits = size - bits\n if (bits > 0 && this._bitsAvailable) {\n return (val << bits) | this.readBits(bits)\n }\n return val\n }\n\n skipLZ () {\n let leadingZeroCount\n for (\n leadingZeroCount = 0;\n leadingZeroCount < this._bitsAvailable;\n ++leadingZeroCount\n ) {\n if ((this._word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n this._word <<= leadingZeroCount\n this._bitsAvailable -= leadingZeroCount\n return leadingZeroCount\n }\n }\n this._loadWord()\n return leadingZeroCount + this.skipLZ()\n }\n\n skipUEG () {\n this.skipBits(1 + this.skipLZ())\n }\n\n readUEG () {\n const clz = this.skipLZ()\n return this.readBits(clz + 1) - 1\n }\n\n readEG () {\n const val = this.readUEG()\n if (1 & val) {\n return (1 + val) >>> 1\n }\n return -1 * (val >>> 1)\n }\n\n readBool () {\n return this.readBits(1) === 1\n }\n\n readUByte () {\n return this.readBits(8)\n }\n\n skipScalingList (count) {\n let lastScale = 8\n let nextScale = 8\n let deltaScale\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = this.readEG()\n nextScale = (lastScale + deltaScale + 256) % 256\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n}\n","export class Logger {\n constructor (name) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","export class UTF8 {\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {string}\n */\n static decode (uint8array) {\n const out = []\n const input = uint8array\n let i = 0\n const length = uint8array.length\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]))\n ++i\n continue\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (UTF8._checkContinuation(input, i, 1)) {\n const ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F)\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 2\n continue\n }\n }\n } else if (input[i] < 0xF0) {\n if (UTF8._checkContinuation(input, i, 2)) {\n const ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 3\n continue\n }\n }\n } else if (input[i] < 0xF8) {\n if (UTF8._checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 |\n (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F)\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800))\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00))\n i += 4\n continue\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD))\n ++i\n }\n\n return out.join('')\n }\n\n static _checkContinuation (uint8array, start, checkLength) {\n const array = uint8array\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80) {\n return false\n }\n }\n return true\n } else {\n return false\n }\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n\nconst ua = isBrowser && navigator.userAgent.toLocaleLowerCase()\n\n// eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\nexport const isSafari = isBrowser && /^((?!chrome|android).)*safari/.test(ua)\nexport const isFirefox = isBrowser && ua.includes('firefox')\nexport const isAndroid = isBrowser && ua.includes('android')\n","/* c8 ignore next 4 */\nexport { ExpGolomb } from './exp-golomb'\nexport { Logger } from './logger'\nexport { UTF8 } from './utf8'\nexport * from './env'\n\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport const MAX_SIZE = Math.pow(2, 32)\n\nexport function readBig16 (data, i = 0) {\n return (data[i] << 8) + (data[i + 1] || 0)\n}\n\nexport function readBig24 (data, i = 0) {\n return (data[i] << 16) + (data[i + 1] << 8) + (data[i + 2] || 0)\n}\n\nexport function readBig32 (data, i = 0) {\n return (data[i] << 24 >>> 0) + (data[i + 1] << 16) + (data[i + 2] << 8) + (data[i + 3] || 0)\n}\n\nexport function readBig64 (data, i = 0) {\n return readBig32(data, i) * MAX_SIZE + readBig32(data, i + 4)\n}\n\nexport function getAvcCodec (codecs) {\n let codec = 'avc1.'\n let h\n for (let i = 0; i < 3; i++) {\n h = codecs[i].toString(16)\n if (h.length < 2) h = `0${h}`\n codec += h\n }\n return codec\n}\n\nexport function formatIV (arr) {\n let iv = ''\n arr.forEach(value => {\n iv += bufferToString(value)\n })\n if (iv.length <= 32) {\n const len = 32 - iv.length\n for (let i = 0; i < len; i++) {\n iv += '0'\n }\n }\n return iv\n}\n\nexport function parse (a) {\n if (!Array.isArray(a)) {\n const arr = []\n let value = ''\n for (let i = 0; i < a.length; i++) {\n if (i % 2) {\n value = a[i - 1] + a[i]\n arr.push(parseInt(value, 16))\n value = ''\n }\n }\n return arr\n }\n return a.map(item => { return parseInt(item, 16) })\n}\nfunction bufferToString (value) {\n return ('0' + (Number(value).toString(16))).slice(-2).toUpperCase()\n}\n\nexport function hashVal (str) {\n let hash = 0; let i; let chr\n if (str.length === 0) return hash\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + chr\n hash |= 0\n }\n return hash\n}\n","import { readBig32 } from '../utils'\n\nexport class NALu {\n static parseAnnexB (data) {\n const len = data.length\n let start = 2\n let end = 0\n while (data[start] !== null && data[start] !== undefined && data[start] !== 1) {\n start++\n }\n start++\n end = start + 2\n\n if (end >= len) return []\n\n const units = []\n\n while (end < len) {\n switch (data[end]) {\n case 0:\n if (data[end - 1] !== 0) {\n end += 2\n break\n } else if (data[end - 2] !== 0) {\n end++\n break\n }\n\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n\n do {\n end++\n } while (data[end] !== 1 && end < len)\n start = end + 1\n end = start + 2\n break\n case 1:\n if (data[end - 1] !== 0 || data[end - 2] !== 0) {\n end += 3\n break\n }\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n start = end + 1\n end = start + 2\n break\n default:\n end += 3\n break\n }\n }\n\n if (start < len) units.push(data.subarray(start))\n\n return units\n }\n\n static parseAvcC (data, size = 4) {\n if (data.length < 4) return\n const dataLen = data.length\n const units = []\n\n let offset = 0\n let length\n while ((offset + size) < dataLen) {\n length = readBig32(data, offset)\n if (size === 3) length >>>= 8\n offset += size\n\n if (!length) continue\n if (offset + length > dataLen) {\n break\n }\n\n units.push(data.subarray(offset, offset + length))\n offset += length\n }\n\n return units\n }\n\n static parseSEI (unit, isHevc) {\n const len = unit.length\n let i = isHevc ? 2 : 1\n let type = 0\n let size = 0\n let uuid = ''\n\n while (unit[i] === 255) {\n type += 255\n i++\n }\n\n type += unit[i++]\n\n while (unit[i] === 255) {\n size += 255\n i++\n }\n size += unit[i++]\n\n if (type === 5 && len > i + 16) {\n for (let j = 0; j < 16; j++) {\n uuid += unit[i].toString(16)\n i++\n }\n }\n\n return {\n payload: unit.subarray(i, 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 { isFirefox, isAndroid } from '../utils'\n\nexport class AAC {\n static FREQ = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350\n ];\n\n static getRateIndexByRate (rate) {\n return AAC.FREQ.indexOf(rate)\n }\n\n static parseADTS (data, pts) {\n const len = data.length\n let i = 0\n\n while ((i + 2) < len) {\n if (data[i] === 0xff && (data[i + 1] & 0xf6) === 0xf0) {\n break\n }\n i++\n }\n\n if (i >= len) return\n\n const skip = i\n const frames = []\n const samplingFrequencyIndex = (data[i + 2] & 0x3c) >>> 2\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n if (!sampleRate) throw new Error(`Invalid sampling index: ${samplingFrequencyIndex}`)\n const objectType = ((data[i + 2] & 0xc0) >>> 6) + 1\n const channelCount = ((data[i + 2] & 1) << 2) | ((data[i + 3] & 0xc0) >>> 6)\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n let protectionSkipBytes\n let frameLength\n let frameIndex = 0\n const duration = AAC.getFrameDuration(sampleRate)\n\n while ((i + 7) < len) {\n if ((data[i] !== 0xff) || (data[i + 1] & 0xF6) !== 0xf0) {\n i++\n continue\n }\n\n frameLength = ((data[i + 3] & 0x03) << 11) | (data[i + 4] << 3) | ((data[i + 5] & 0xe0) >> 5)\n if ((len - i) < frameLength) break\n\n protectionSkipBytes = (~data[i + 1] & 0x01) * 2\n frames.push({\n pts: pts + frameIndex * duration,\n data: data.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n })\n\n frameIndex++\n i += frameLength\n }\n\n return {\n skip,\n remaining: i >= len ? undefined : data.subarray(i),\n frames,\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n codec,\n config,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static parseAudioSpecificConfig (data) {\n if (!data.length) return\n const objectType = data[0] >>> 3\n const samplingFrequencyIndex = ((data[0] & 0x07) << 1) | (data[1] >>> 7)\n const channelCount = (data[1] & 0x78) >>> 3\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n // play as no audio track stream\n if (!sampleRate) return\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n return {\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n config,\n codec,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static getFrameDuration (rate, timescale = 90000) {\n return 1024 * timescale / rate\n }\n\n static _getConfig (samplingIndex, channelCount, originObjectType) {\n const config = []\n let objectType\n let extensionSamplingIndex\n if (isFirefox) {\n if (samplingIndex >= 6) { // use SBR (HE-AAC)\n objectType = 5\n extensionSamplingIndex = samplingIndex - 3\n } else { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n } else if (isAndroid) { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n } else { // use HE-AAC\n objectType = (originObjectType === 2 || originObjectType === 5) ? originObjectType : 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb } from '../utils'\n\nexport class HEVC {\n static parseHEVCDecoderConfigurationRecord (data, hvcC = {}) {\n if (data.length < 23) return\n hvcC = hvcC || {}\n const nalUnitSize = (data[21] & 3) + 1\n\n let vpsParsed\n let spsParsed\n const spsArr = []\n const ppsArr = []\n const vpsArr = []\n\n let offset = 23\n const numOfArrays = data[22]\n\n let nalUnitType\n let numNalus\n let nalSize\n for (let i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f\n numNalus = (data[offset + 1] << 8) | data[offset + 2]\n\n offset += 3\n\n for (let j = 0; j < numNalus; j++) {\n nalSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!nalSize) continue\n switch (nalUnitType) {\n case 32: {\n const vps = data.subarray(offset, offset + nalSize)\n if (!vpsParsed) vpsParsed = HEVC.parseVPS(NALu.removeEPB(vps), hvcC)\n vpsArr.push(vps)\n }\n break\n case 33: {\n const sps = data.subarray(offset, offset + nalSize)\n if (!spsParsed) spsParsed = HEVC.parseSPS(NALu.removeEPB(sps), hvcC)\n spsArr.push(sps)\n }\n break\n case 34:\n ppsArr.push(data.subarray(offset, offset + nalSize))\n break\n default:\n }\n\n offset += nalSize\n }\n }\n\n return {\n hvcC,\n sps: spsParsed,\n spsArr,\n ppsArr,\n vpsArr,\n nalUnitSize\n }\n }\n\n static parseVPS (unit, hvcC) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(12)\n const vpsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(hvcC.numTemporalLayers || 0, vpsMaxSubLayersMinus1 + 1)\n eg.readBits(17)\n HEVC._parseProfileTierLevel(eg, vpsMaxSubLayersMinus1, hvcC)\n\n return hvcC\n }\n\n static parseSPS (unit, hvcC = {}) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(4)\n const spsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(spsMaxSubLayersMinus1 + 1, hvcC.numTemporalLayers || 0)\n hvcC.temporalIdNested = eg.readBits(1)\n HEVC._parseProfileTierLevel(eg, spsMaxSubLayersMinus1, hvcC)\n\n eg.readUEG() // sps_seq_parameter_set_id\n\n const chromaFormatIdc = hvcC.chromaFormatIdc = eg.readUEG()\n let chromaFormat = 420\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n\n let separateColourPlaneFlag = 0\n if (chromaFormatIdc === 3) {\n separateColourPlaneFlag = eg.readBits(1)\n }\n\n let width = eg.readUEG() // pic_width_in_luma_samples\n let height = eg.readUEG() // pic_height_in_luma_samples\n\n const conformanceWindowFlag = eg.readBits(1)\n\n let confWinLeftOffset\n let confWinRightOffset\n let confWinTopOffset\n let confWinBottomOffset\n if (conformanceWindowFlag === 1) {\n confWinLeftOffset = eg.readUEG() // conf_win_left_offset\n confWinRightOffset = eg.readUEG() // conf_win_right_offset\n confWinTopOffset = eg.readUEG() // conf_win_top_offset\n confWinBottomOffset = eg.readUEG() // conf_win_bottom_offset\n }\n\n hvcC.bitDepthLumaMinus8 = eg.readUEG() // bit_depth_luma_minus8\n hvcC.bitDepthChromaMinus8 = eg.readUEG() // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n const subWidthC = (((chromaFormatIdc === 1) || (chromaFormatIdc === 2)) && (separateColourPlaneFlag === 0)) ? 2 : 1\n const subHeightC = ((chromaFormatIdc === 1) && (separateColourPlaneFlag === 0)) ? 2 : 1\n width -= (subWidthC * (confWinRightOffset + confWinLeftOffset))\n height -= (subHeightC * (confWinBottomOffset + confWinTopOffset))\n }\n\n return {\n codec: 'hev1.1.6.L93.B0',\n width,\n height,\n chromaFormat,\n hvcC\n }\n }\n\n static _parseProfileTierLevel (eg, maxSubLayersMinus1, hvcC) {\n const generalTierFlag = hvcC.generalTierFlag || 0\n hvcC.generalProfileSpace = eg.readBits(2)\n hvcC.generalTierFlag = Math.max(eg.readBits(1), generalTierFlag)\n hvcC.generalProfileIdc = Math.max(eg.readBits(5), hvcC.generalProfileIdc || 0)\n hvcC.generalProfileCompatibilityFlags = eg.readBits(32)\n hvcC.generalConstraintIndicatorFlags = [eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8)]\n const generalLevelIdc = eg.readBits(8)\n if (generalTierFlag < hvcC.generalTierFlag) {\n hvcC.generalLevelIdc = generalLevelIdc\n } else {\n hvcC.generalLevelIdc = Math.max(generalLevelIdc, hvcC.generalLevelIdc || 0)\n }\n\n const subLayerProfilePresentFlag = []\n const subLayerLevelPresentFlag = []\n for (let j = 0; j < maxSubLayersMinus1; j++) {\n subLayerProfilePresentFlag[j] = eg.readBits(1)\n subLayerLevelPresentFlag[j] = eg.readBits(1)\n }\n\n if (maxSubLayersMinus1 > 0) {\n eg.readBits((8 - maxSubLayersMinus1) * 2)\n }\n\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i] !== 0) {\n eg.readBits(2)\n eg.readBits(1)\n eg.readBits(5)\n\n eg.readBits(16)\n eg.readBits(16)\n\n eg.readBits(4)\n\n eg.readBits(16)\n eg.readBits(16)\n eg.readBits(12)\n }\n if (subLayerLevelPresentFlag[i] !== 0) {\n eg.readBits(8)\n }\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 500 // ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 1000 // ms\nconst AUDIO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BREACKED_CHECK_TIME = 5\n\nexport class FlvFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastVideoDuration = 0\n\n // 在视频帧遇到下一个关键帧之前,如果音频时间戳发生了跳变,不能确定是否音视频都发生跳变还是单纯音频发生跳变.\n // 这里记录关键帧标识, 从下一个关键帧开始,如果视频没有跳变,才能判断是只有音频发生了跳变\n this._keyFrameInNextChunk = false\n\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n /**\n * @param {number} startTime 点播seek到的时间点\n * @param {boolean} discontinuity 是否换流\n * @param {boolean} contiguous 前后chunk时间戳是否连续\n */\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 1000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n if (discontinuity || !contiguous) {\n this._videoLastSample = null\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n if (discontinuity && !contiguous) {\n this._baseDtsInited = false\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(audioTrack, videoTrack)\n }\n\n if (!contiguous && startTime) {\n this._audioNextPts = this._videoNextDts = startTime\n }\n\n const resetBaseDts = this._baseDtsInited &&\n (this._videoTimestampBreak || !this.videoTrack.exist()) &&\n (this._audioTimestampBreak || !this.audioTrack.exist())\n\n if (resetBaseDts) {\n this._resetBaseDtsWhenStreamBreaked()\n }\n\n this._fixAudio(audioTrack)\n\n this._keyFrameInNextChunk = false\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n this.metadataTrack.flvScriptSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 1000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n if (x.keyframe) this._keyFrameInNextChunk = true\n })\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else if (videoTrack.length > 1) {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[samples.length - 1]\n refSampleDurationInt = Math.floor((last.dts - first.dts) / (samples.length - 1))\n } else {\n refSampleDurationInt = this._lastVideoDuration || 40\n }\n\n const lastSample = samples.pop()\n\n if (this._videoLastSample) {\n samples.unshift(this._videoLastSample)\n }\n\n this._videoLastSample = lastSample\n\n if (!samples.length) return\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // emit large delta of first sample with expect\n if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n }\n\n // only video breaked\n if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {\n this._videoNextDts = firstSample.dts\n this._videoTimestampBreak = 0\n } else {\n // resolve first frame only\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n if (!this.audioTrack.exist()) {\n this._videoTimestampBreak = 1\n }\n }\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (lastSample) {\n sampleDuration = lastSample.dts - dts\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n this._videoTimestampBreak++\n // emit stream breaked\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionLargeGapDot = dts\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n sampleDuration = refSampleDurationInt\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n this._lastVideoDuration = sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n if (!samples.length) return\n\n // offset origin timestamp\n samples.forEach(x => {\n x.dts = x.pts -= this._baseDts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 1000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n /**\n * timestamp breaked\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n if (!this.audioTrack.exist()){\n this._baseDts -= this._videoNextDts\n } else if (!this.videoTrack.exist()){\n this._baseDts -= this._audioNextPts\n } else {\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n }\n this._videoTimestampBreak = 0\n this._audioTimestampBreak = 0\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) {\n audioTrack.sampleDuration = audioTrack.codecType === AudioCodecType.AAC\n ? AAC.getFrameDuration(audioTrack.timescale, timescale)\n : this._getG711Duration(audioTrack)\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1000\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n let nextPts = this._audioNextPts\n const sample = samples[i]\n let delta = sample.pts - nextPts\n\n // only audio breaked\n if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {\n nextPts = this._audioNextPts = sample.dts\n delta = 0\n this._audioTimestampBreak = 0\n }\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n }\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(this._audioNextPts + refSampleDuration) - Math.floor(this._audioNextPts), silentFrame, sampleDurationInSampleRate)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak++\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n this._audioNextPts += refSampleDuration\n }\n }\n }\n\n _getG711Duration (track) {\n const { sampleSize, channelCount, sampleRate } = track\n const samp0 = track.samples[0]\n if (!samp0) return\n return samp0.data.byteLength * 2 / channelCount / (sampleSize / 8) / sampleRate * 1000\n }\n\n _getSilentFrame (track) {\n if (track.codecType === AudioCodecType.AAC) return AAC.getSilentFrame(track.codec, track.channelCount)\n return new Uint8Array(8 * track.sampleDuration * track.channelCount)\n }\n}\n","import { UTF8 } from '../utils'\n\nexport class AMF {\n static parse (data) {\n if (data.length < 3) return\n\n const ret = {}\n const name = AMF._parseValue(new DataView(data.buffer, data.byteOffset, data.byteLength))\n const value = AMF._parseValue(new DataView(data.buffer, data.byteOffset + name.size, data.byteLength - name.size))\n ret[name.data] = value.data\n\n return ret\n }\n\n static _parseValue (view) {\n const dataLen = view.byteLength\n const type = view.getUint8(0)\n let offset = 1\n let isEnd = false\n let value\n\n switch (type) {\n case 0: // Number(Double) type\n value = view.getFloat64(1)\n offset += 8\n break\n case 1: { // Boolean type\n value = !!view.getUint8(1)\n offset += 1\n break\n }\n case 2: { // String type\n const { data, size } = AMF._parseString(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value = data\n offset += size\n }\n break\n case 3: { // Object(s) type\n value = {}\n let terminal = 0\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) offset += 3\n }\n }\n break\n case 8: { // ECMA array type (Mixed array)\n value = {}\n offset += 4 // ECMAArrayLength(UI32)\n let terminal = 0 // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) {\n offset += 3\n }\n }\n }\n break\n case 9: // ScriptDataObjectEnd\n value = undefined\n offset = 1\n isEnd = true\n break\n case 10: { // Strict array type\n value = []\n const strictArrayLength = view.getUint32(1)\n offset += 4\n for (let i = 0; i < strictArrayLength; i++) {\n const { data, size } = AMF._parseValue(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value.push(data)\n offset += size\n }\n }\n break\n case 11: { // Date type\n const timestamp = view.getFloat64(offset) + view.getInt16(offset + 8) * 60000\n value = new Date(timestamp)\n offset += 10\n }\n break\n case 12: { // Long string type\n const length = view.getUint32(1)\n offset += 4\n value = ''\n if (length > 0) {\n value = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + offset, length))\n }\n offset += length\n }\n break\n default:\n offset = dataLen\n break\n }\n\n return {\n data: value,\n size: offset,\n isEnd\n }\n }\n\n static _parseString (view) {\n const length = view.getUint16(0)\n let data = ''\n if (length > 0) {\n data = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + 2, length))\n }\n\n return {\n data,\n size: 2 + length\n }\n }\n\n static _parseObject (view) {\n if (view.byteLength < 3) return\n\n const name = AMF._parseString(view)\n const value = AMF._parseValue(new DataView(view.buffer, view.byteOffset + name.size, view.byteLength - name.size))\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n isEnd: value.isEnd\n }\n }\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample, VideoCodecType, AudioCodecType, FlvScriptSample, SeiSample } from '../model'\nimport { FlvFixer } from './fixer'\nimport { concatUint8Array, Logger, readBig32 } from '../utils'\nimport { AAC, AVC, HEVC, NALu } from '../codec'\nimport { AMF } from './amf'\n\nconst logger = new Logger('FlvDemuxer')\n\n/**\n * @typedef {Object} DemuxResult\n * @property {VideoTrack} videoTrack\n * @property {AudioTrack} audioTrack\n * @property {MetadataTrack} metadataTrack\n */\n\nexport class FlvDemuxer {\n _headerParsed = false\n _remainingData = null\n _gopId = 0\n _needAddMetaBeforeKeyFrameNal = true // 标识H265流中关键帧Nal之前是否需要插入vps、sps、pps Nal\n\n static AUDIO_RATE = [5500, 11000, 22000, 44000]\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new FlvFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false] 切流\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\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 this._parseVideo(bodyData, timestamp)\n } else if (tagType === 18) {\n this._parseScript(bodyData, timestamp)\n } else {\n logger.warn(`Invalid tag type: ${tagType}`)\n }\n\n offset += dataSize\n prevTagSize = readBig32(data, offset)\n if (prevTagSize !== 11 + dataSize) {\n logger.warn(`Invalid PrevTagSize ${prevTagSize} (${11 + dataSize})`)\n }\n\n offset += 4\n }\n\n if (offset < dataLen) {\n this._remainingData = data.subarray(offset)\n }\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1000\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n if (!audioTrack.exist() && audioTrack.hasSample()) {\n audioTrack.reset()\n }\n if (!videoTrack.exist() && videoTrack.hasSample()) {\n videoTrack.reset()\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n * @returns {DemuxResult}\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return false\n }\n return readBig32(data, 5) >= 9\n }\n\n _parseAudio (data, pts) {\n if (!data.length) return\n\n const format = (data[0] & 0xf0) >>> 4\n const track = this.audioTrack\n\n if (\n format !== 10 && // AAC\n format !== 7 && // G.711 A-law logarithmic PCM\n format !== 8 // G.711 mu-law logarithmic PCM\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== 10) {\n const soundRate = (data[0] & 0x0c) >> 2\n const soundSize = (data[0] & 0x02) >> 1\n const soundType = (data[0] & 0x01)\n track.sampleRate = FlvDemuxer.AUDIO_RATE[soundRate]\n track.sampleSize = soundSize ? 16 : 8\n track.channelCount = soundType + 1\n }\n\n if (format === 10) {\n this._parseAac(data, pts)\n } else {\n this._parseG711(data, pts, format)\n }\n }\n\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(new AudioSample(pts, data.subarray(1)))\n }\n\n _parseAac (data, pts) {\n const track = this.audioTrack\n track.codecType = AudioCodecType.AAC\n\n if (data[1] === 0) { // AACPacketType\n const ret = AAC.parseAudioSpecificConfig(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n } else if (data[1] === 1) { // Raw AAC frame data\n if (pts === undefined || pts === null) return\n track.samples.push(new AudioSample(pts, data.subarray(2)))\n } else {\n logger.warn(`Unknown AACPacketType: ${data[1]}`)\n }\n }\n\n _parseVideo (data, dts) {\n if (data.length < 6) return\n\n const frameType = (data[0] & 0xf0) >>> 4\n const codecId = data[0] & 0x0f\n\n const track = this.videoTrack\n\n if (\n codecId !== 7 && // AVC\n codecId !== 12 // HEVC\n ) {\n track.reset()\n logger.warn(`Unsupported codecId: ${codecId}`)\n return\n }\n\n const isHevc = codecId === 12\n track.codecType = isHevc ? VideoCodecType.HEVC : VideoCodecType.AVC\n\n const packetType = data[1]\n const cts = (((data[2] << 16) | (data[3] << 8) | (data[4])) << 8) >> 8\n\n if (packetType === 0) { // DecoderConfigurationRecord\n const configData = data.subarray(5)\n const ret = isHevc\n ? HEVC.parseHEVCDecoderConfigurationRecord(configData)\n : AVC.parseAVCDecoderConfigurationRecord(configData)\n if (ret) {\n const { hvcC, sps, ppsArr, spsArr, vpsArr, nalUnitSize } = ret\n if (hvcC) {\n track.hvcC = track.hvcC || hvcC\n }\n if (sps) {\n track.codec = sps.codec\n track.width = sps.width\n track.height = sps.height\n track.sarRatio = sps.sarRatio\n track.fpsNum = sps.fpsNum\n track.fpsDen = sps.fpsDen\n }\n if (spsArr.length) track.sps = spsArr\n if (ppsArr.length) track.pps = ppsArr\n if (vpsArr && vpsArr.length) track.vps = vpsArr\n if (nalUnitSize) track.nalUnitSize = nalUnitSize\n } else {\n logger.warn(`Cannot parse ${isHevc ? 'HEVC' : 'AVC'}DecoderConfigurationRecord`, data)\n }\n } else if (packetType === 1) { // One or more NALUs\n let units = NALu.parseAvcC(data.subarray(5), track.nalUnitSize)\n\n units = this._checkAddMetaNalToUnits(isHevc, units, track)\n\n if (units && units.length) {\n const sample = new VideoSample(dts + cts, dts, units)\n if (frameType === 1) {\n sample.setToKeyframe()\n }\n track.samples.push(sample)\n\n units.forEach(unit => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n dts + cts\n ))\n break\n default:\n }\n })\n\n if (sample.keyframe) {\n this._gopId++\n }\n sample.gopId = this._gopId\n } else {\n logger.warn('Cannot parse NALUs', data)\n }\n } else if (packetType === 2) {\n // AVC end of sequence, Empty\n } else {\n logger.warn(`Unknown AVCPacketType: ${packetType}`)\n }\n }\n\n _checkAddMetaNalToUnits (hevc, units, track) {\n if (!hevc || !this._needAddMetaBeforeKeyFrameNal) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n const nalTypes = units.map(x => (x[0] >>> 1) & 0x3f)\n\n if (nalTypes.includes(32)) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n units.unshift(track.pps[0])\n units.unshift(track.sps[0])\n units.unshift(track.vps[0])\n\n return units.filter(Boolean)\n }\n\n _parseScript (data, pts) {\n this.metadataTrack.flvScriptSamples.push(new FlvScriptSample(AMF.parse(data), pts))\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\n\nconst logger = new Logger('TsDemuxer')\n\nexport class TsDemuxer {\n _pmtId = -1\n _remainingPacketData = null\n _videoPesData = []\n _audioPesData = []\n _gopId = 0\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {import('../flv').DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity) {\n this._pmtId = -1\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n }\n\n if (!contiguous || discontinuity) {\n this._remainingPacketData = null\n this._videoPesData = []\n this._audioPesData = []\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingPacketData) {\n data = concatUint8Array(this._remainingPacketData, data)\n this._remainingPacketData = null\n }\n }\n\n let dataLen = data.length\n const remainingLength = dataLen % 188\n if (remainingLength) {\n this._remainingPacketData = data.subarray(dataLen - remainingLength)\n dataLen -= remainingLength\n }\n\n let videoPid = videoTrack.pid\n let audioPid = audioTrack.pid\n\n for (let start = 0; start < dataLen; start += 188) {\n if (data[start] !== 0x47) throw new Error('TS packet did not start with 0x47')\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40)\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]\n const adaptationFiledControl = (data[start + 3] & 0x30) >> 4\n\n let offset\n if (adaptationFiledControl > 1) {\n offset = start + 5 + data[start + 4]\n if (offset === start + 188) continue\n } else {\n offset = start + 4\n }\n\n switch (pid) {\n case 0: // PAT\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n this._pmtId = ((data[offset + 10] & 0x1f) << 8) | data[offset + 11]\n break\n case this._pmtId: {\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n const tableEnd = offset + 3 + (((data[offset + 1] & 0x0f) << 8) | data[offset + 2]) - 4\n const programInfoLength = ((data[offset + 10] & 0x0f) << 8) | data[offset + 11]\n offset += 12 + programInfoLength\n\n while (offset < tableEnd) {\n const esPid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2]\n switch (data[offset]) {\n case 0x0f: // AAC ADTS\n audioTrack.pid = audioPid = esPid\n break\n case 0x1b: // AVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.AVC\n videoTrack.pid = videoPid = esPid\n break\n case 0x24: // HEVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.HEVC\n videoTrack.pid = videoPid = esPid\n break\n default:\n logger.warn(`Unsupported stream. type: ${data[offset]}, pid: ${esPid}`)\n }\n\n offset += (((data[offset + 3] & 0x0f) << 8) | data[offset + 4]) + 5\n }\n }\n break\n case videoPid:\n if (payloadUnitStartIndicator && this._videoPesData.length) {\n this._parseVideoData()\n }\n this._videoPesData.push(data.subarray(offset, start + 188))\n break\n case audioPid:\n if (payloadUnitStartIndicator && this._audioPesData.length) {\n this._parseAudioData()\n }\n this._audioPesData.push(data.subarray(offset, start + 188))\n break\n case 17:\n case 0x1fff:\n break\n default:\n logger.warn(`Unknown pid: ${pid}`)\n }\n }\n\n this._parseVideoData()\n this._parseAudioData()\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 90000\n\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (!data.length) return false\n return data[0] === 0x47 && data[188] === 0x47 && data[376] === 0x47\n }\n\n _parseVideoData () {\n if (!this._videoPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._videoPesData))\n if (!pes) {\n logger.warn('Cannot parse video pes', this._videoPesData)\n return\n }\n\n const units = NALu.parseAnnexB(pes.data)\n if (units) {\n this._createVideoSample(units, pes.pts, pes.dts)\n } else {\n logger.warn('Cannot parse avc units', pes)\n }\n\n this._videoPesData = []\n }\n\n _createVideoSample (units, pts, dts) {\n if (!units.length) return\n const track = this.videoTrack\n const isHevc = track.codecType === VideoCodecType.HEVC\n\n const sample = new VideoSample(pts, dts)\n units.forEach((unit) => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n this._gopId++\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n pts\n ))\n // fix 分割nal之前只要sei信息被当做单独一个sample\n return\n case 32: // HEVC VPS\n if (!isHevc) break\n if (!track.vps.length) {\n const hvcC = HEVC.parseVPS(NALu.removeEPB(unit), track.hvcC)\n track.hvcC = track.hvcC || hvcC\n track.vps = [unit]\n }\n break\n case 7: // SPS\n case 33: // HEVC SPS\n if ((!isHevc && type !== 7) || (isHevc && type === 7)) break\n if (!track.sps.length) {\n const data = NALu.removeEPB(unit)\n const spsInfo = isHevc ? HEVC.parseSPS(data, track.hvcC) : AVC.parseSPS(data)\n track.sps = [unit]\n track.hvcC = track.hvcC || spsInfo.hvcC\n track.codec = spsInfo.codec\n track.width = spsInfo.width\n track.height = spsInfo.height\n track.sarRatio = spsInfo.sarRatio\n track.fpsNum = spsInfo.fpsNum\n track.fpsDen = spsInfo.fpsDen\n }\n break\n case 8: // PPS\n case 34: // HEVC PPS\n if ((!isHevc && type !== 8) || (isHevc && type === 8)) break\n if (!track.pps.length) track.pps = [unit]\n break\n case 9: // AUD\n case 35: // HEVC AUD\n // if ((!isHevc && type !== 9) || (isHevc && type === 9)) break\n // sample.gopId = this._gopId\n // if (sample.units.length && !keyFrame) {\n // this._pushVideoSample(track, sample)\n // sample = this.prevAvcSample = new VideoSample(pts, dts)\n // }\n break\n default:\n }\n sample.units.push(unit)\n })\n sample.gopId = this._gopId\n this._pushVideoSample(track, sample)\n }\n\n _pushVideoSample (track, sample) {\n if (sample.units.length) {\n if (sample.pts === null || sample.pts === undefined) {\n logger.warn('Video sample no pts', sample)\n const lastSample = track.samples[track.samples.length - 1]\n if (lastSample) {\n sample.pts = lastSample.pts\n sample.dts = lastSample.dts\n } else {\n logger.warn('Drop video sample', sample)\n }\n } else {\n track.samples.push(sample)\n }\n }\n }\n\n _parseAudioData () {\n if (!this._audioPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._audioPesData))\n if (!pes) {\n logger.warn('Cannot parse audio pes', this._audioPesData)\n return\n }\n\n this._parseAacData(pes)\n\n this._audioPesData = []\n }\n\n _parseAacData (pes) {\n const track = this.audioTrack\n let pts = pes.pts\n if (pts === null || pts === undefined) {\n logger.warn('AAC pes not pts', track)\n if (!track.samples.length || !track.sampleRate) {\n return\n }\n pts = track.samples[track.samples.length - 1].pts + AAC.getFrameDuration(track.sampleRate)\n }\n\n const ret = AAC.parseADTS(pes.data, pts)\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n track.config = ret.config\n track.samples.push(...ret.frames.map((s) => new AudioSample(s.pts, s.data)))\n\n if (ret.skip) {\n logger.warn(`Skip aac adts ${ret.skip} bits`)\n }\n if (ret.remaining) {\n logger.warn(`Remaining aac adts ${ret.remaining} bits`)\n }\n } else {\n logger.warn('Cannot parse aac adts', pes)\n }\n }\n\n static _parsePES (data) {\n const headerDataLen = data[8]\n if (headerDataLen === null || headerDataLen === undefined || data.length < (headerDataLen + 9)) return\n const startPrefix = data[0] << 16 | data[1] << 8 | data[2]\n if (startPrefix !== 1) return\n const pesLen = (data[4] << 8) + data[5]\n if (pesLen && pesLen > data.length - 6) return\n\n let pts\n let dts\n const ptsDtsFlags = data[7]\n if (ptsDtsFlags & 0xc0) {\n pts = (data[9] & 0x0e) * 536870912 +\n (data[10] & 0xff) * 4194304 +\n (data[11] & 0xfe) * 16384 +\n (data[12] & 0xff) * 128 +\n (data[13] & 0xfe) / 2\n\n if (ptsDtsFlags & 0x40) {\n dts = (data[14] & 0x0e) * 536870912 +\n (data[15] & 0xff) * 4194304 +\n (data[16] & 0xfe) * 16384 +\n (data[17] & 0xff) * 128 +\n (data[18] & 0xfe) / 2\n if (pts - dts > 60 * 90000) pts = dts\n } else {\n dts = pts\n }\n }\n\n return { data: data.subarray(9 + headerDataLen), pts, dts }\n }\n}\n","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64 } from '../utils'\nimport { AAC } from '../codec'\nexport class MP4Parser {\n static findBox (data, names, start = 0) {\n const ret = []\n if (!data) return ret\n\n let size = 0\n let type = ''\n let headerSize = 0\n while (data.length > 7) {\n size = readBig32(data)\n type = String.fromCharCode.apply(null, data.subarray(4, 8))\n headerSize = 8\n if (size === 1) {\n size = readBig64(data, 8)\n headerSize += 8\n } else if (!size) {\n size = data.length\n }\n if (!names[0] || type === names[0]) {\n const subData = data.subarray(0, size)\n if (names.length < 2) {\n ret.push({\n start,\n size,\n headerSize,\n type,\n data: subData\n })\n } else {\n return MP4Parser.findBox(subData.subarray(headerSize), names.slice(1), start + headerSize)\n }\n }\n\n start += size\n data = data.subarray(size)\n }\n\n return ret\n }\n\n static tfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.trackId = readBig32(data)\n let start = 4\n const baseDataOffsetPresent = (ret.flags & 0xff) & 0x01\n const sampleDescriptionIndexPresent = (ret.flags & 0xff) & 0x02\n const defaultSampleDurationPresent = (ret.flags & 0xff) & 0x08\n const defaultSampleSizePresent = (ret.flags & 0xff) & 0x10\n const defaultSampleFlagsPresent = (ret.flags & 0xff) & 0x20\n\n if (baseDataOffsetPresent) {\n start += 4 // truncate top 4 bytes\n ret.baseDataOffset = readBig32(data, start)\n start += 4\n }\n if (sampleDescriptionIndexPresent) {\n ret.sampleDescriptionIndex = readBig32(data, start)\n start += 4\n }\n if (defaultSampleDurationPresent) {\n ret.defaultSampleDuration = readBig32(data, start)\n start += 4\n }\n if (defaultSampleSizePresent) {\n ret.defaultSampleSize = readBig32(data, start)\n start += 4\n }\n if (defaultSampleFlagsPresent) {\n ret.defaultSampleFlags = readBig32(data, start)\n }\n })\n }\n\n static sidx (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n ret.reference_ID = readBig32(data, start)// stream.readUint32();\n start += 4\n ret.timescale = readBig32(data, start)\n start += 4\n if (ret.version === 0) {\n ret.earliest_presentation_time = readBig32(data, start)\n start += 4\n ret.first_offset = readBig32(data, start)\n start += 4\n } else {\n ret.earliest_presentation_time = readBig64(data, start)\n start += 8\n ret.first_offset = readBig64(data, start)\n start += 8\n }\n start += 2\n ret.references = []\n const count = readBig16(data, start)\n start += 2\n for (let i = 0; i < count; i++) {\n const ref = {}\n ret.references.push(ref)\n let tmp32 = readBig32(data, start)\n start += 4\n ref.reference_type = (tmp32 >> 31) & 0x1\n ref.referenced_size = tmp32 & 0x7FFFFFFF\n ref.subsegment_duration = readBig32(data, start)\n start += 4\n tmp32 = readBig32(data, start)\n start += 4\n ref.starts_with_SAP = (tmp32 >> 31) & 0x1\n ref.SAP_type = (tmp32 >> 28) & 0x7\n ref.SAP_delta_time = tmp32 & 0xFFFFFFF\n }\n })\n }\n\n static moov (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mvhd = MP4Parser.mvhd(MP4Parser.findBox(data, ['mvhd'], start)[0])\n ret.trak = MP4Parser.findBox(data, ['trak'], start).map(trak => MP4Parser.trak(trak))\n ret.pssh = MP4Parser.pssh(MP4Parser.findBox(data, ['pssh'], start)[0])\n })\n }\n\n static mvhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n ret.nextTrackId = readBig32(data, start + 76)\n })\n }\n\n static trak (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tkhd = MP4Parser.tkhd(MP4Parser.findBox(data, ['tkhd'], start)[0])\n ret.mdia = MP4Parser.mdia(MP4Parser.findBox(data, ['mdia'], start)[0])\n })\n }\n\n static tkhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.trackId = readBig32(data, 16)\n ret.duration = readBig64(data, 24)\n start += 32\n } else {\n ret.trackId = readBig32(data, 8)\n ret.duration = readBig32(data, 16)\n start += 20\n }\n ret.width = readBig32(data, start + 52)\n ret.height = readBig32(data, start + 56)\n })\n }\n\n static mdia (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mdhd = MP4Parser.mdhd(MP4Parser.findBox(data, ['mdhd'], start)[0])\n ret.hdlr = MP4Parser.hdlr(MP4Parser.findBox(data, ['hdlr'], start)[0])\n ret.minf = MP4Parser.minf(MP4Parser.findBox(data, ['minf'], start)[0])\n })\n }\n\n static mdhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n const lang = readBig16(data, start)\n ret.language = String.fromCharCode(((lang >> 10) & 0x1F) + 0x60, ((lang >> 5) & 0x1F) + 0x60, (lang & 0x1F) + 0x60)\n })\n }\n\n static hdlr (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 0) {\n ret.handlerType = String.fromCharCode.apply(null, data.subarray(4, 8))\n }\n })\n }\n\n static minf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.vmhd = MP4Parser.vmhd(MP4Parser.findBox(data, ['vmhd'], start)[0])\n ret.smhd = MP4Parser.smhd(MP4Parser.findBox(data, ['smhd'], start)[0])\n ret.stbl = MP4Parser.stbl(MP4Parser.findBox(data, ['stbl'], start)[0])\n })\n }\n\n static vmhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.graphicsmode = readBig16(data)\n ret.opcolor = [readBig16(data, 2), readBig16(data, 4), readBig16(data, 6)]\n })\n }\n\n static smhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.balance = readBig16(data)\n })\n }\n\n static stbl (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.stsd = MP4Parser.stsd(MP4Parser.findBox(data, ['stsd'], start)[0])\n ret.stts = MP4Parser.stts(MP4Parser.findBox(data, ['stts'], start)[0])\n ret.ctts = MP4Parser.ctts(MP4Parser.findBox(data, ['ctts'], start)[0])\n ret.stsc = MP4Parser.stsc(MP4Parser.findBox(data, ['stsc'], start)[0])\n ret.stsz = MP4Parser.stsz(MP4Parser.findBox(data, ['stsz'], start)[0])\n ret.stco = MP4Parser.stco(MP4Parser.findBox(data, ['stco'], start)[0])\n if (!ret.stco) {\n ret.co64 = MP4Parser.co64(MP4Parser.findBox(data, ['co64'], start)[0])\n ret.stco = ret.co64\n }\n const default_IV_size = ret.stsd.entries[0]?.sinf?.schi?.tenc.default_IV_size\n ret.stss = MP4Parser.stss(MP4Parser.findBox(data, ['stss'], start)[0])\n ret.senc = MP4Parser.senc(MP4Parser.findBox(data, ['senc'], start)[0], default_IV_size)\n })\n }\n\n static senc (box, iv = 8) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n const sampleCount = readBig32(data, start)\n start += 4\n ret.samples = []\n for (let i = 0; i < sampleCount; i++) {\n const sample = {}\n sample.InitializationVector = []\n for (let j = 0; j < iv; j++){\n sample.InitializationVector[j] = data[start + j]\n }\n start += iv\n if (ret.flags & 0x2) {\n sample.subsamples = []\n const subsampleCount = readBig16(data, start)\n start += 2\n for (let j = 0; j < subsampleCount; j++) {\n const subsample = {}\n subsample.BytesOfClearData = readBig16(data, start)\n start += 2\n subsample.BytesOfProtectedData = readBig32(data, start)\n start += 4\n sample.subsamples.push(subsample)\n }\n }\n ret.samples.push(sample)\n }\n })\n }\n\n static pssh (box) {\n return parseBox(box, true, (ret, data) => {\n const keyIds = []\n const systemId = []\n let start = 0\n for (let i = 0; i < 16; i++) {\n systemId.push(toHex(data[start + i]))\n }\n start += 16\n if (ret.version > 0) {\n const numKeyIds = readBig32(data, start)\n start += 4\n for (let i = 0; i < ('' + numKeyIds).length; i++) {\n for (let j = 0; j < 16; j++) {\n const keyId = data[start]\n start += 1\n keyIds.push(toHex(keyId))\n }\n }\n }\n const dataSize = readBig32(data, start)\n ret.data_size = dataSize\n start += 4\n ret.kid = keyIds\n ret.system_id = systemId\n ret.buffer = data\n })\n }\n\n static stsd (box) {\n return parseBox(box, true, (ret, data, start) => {\n ret.entryCount = readBig32(data)\n ret.entries = MP4Parser.findBox(data.subarray(4), [], start + 4).map(b => {\n switch (b.type) {\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4':\n return MP4Parser.avc1(b)\n case 'hvc1':\n case 'hev1':\n return MP4Parser.hvc1(b)\n case 'mp4a':\n return MP4Parser.mp4a(b)\n case 'alaw':\n case 'ulaw':\n return MP4Parser.alaw(b)\n case 'enca':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.channelCount = readBig16(data, 16)\n ret.samplesize = readBig16(data, 18)\n ret.sampleRate = (readBig32(data, 24) / (1 << 16))\n data = data.subarray(28)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data, ['esds'], start)[0])\n })\n case 'encv':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n data = data.subarray(78)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(data, ['avcC'], start)[0])\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(data, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(data, ['pasp'], start)[0])\n })\n default:\n }\n }).filter(Boolean)\n })\n }\n\n static tenc (box) {\n return parseBox(box, false, (ret, data) => {\n let start = 6\n ret.default_IsEncrypted = data[start]\n start += 1\n ret.default_IV_size = data[start]\n start += 1\n ret.default_KID = []\n for (let i = 0; i < 16; i++) {\n ret.default_KID.push(toHex(data[start]))\n start += 1\n }\n })\n }\n\n static schi (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tenc = MP4Parser.tenc(MP4Parser.findBox(data, ['tenc'], start)[0])\n })\n }\n\n static sinf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.schi = MP4Parser.schi(MP4Parser.findBox(data, ['schi'], start)[0])\n ret.frma = MP4Parser.frma(MP4Parser.findBox(data, ['frma'], start)[0])\n })\n }\n\n static frma (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data_format = ''\n for (let i = 0; i < 4; i++) {\n ret.data_format += String.fromCharCode(data[i])\n }\n })\n }\n\n static avc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(bodyData, ['avcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static avcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.configurationVersion = data[0]\n ret.AVCProfileIndication = data[1]\n ret.profileCompatibility = data[2]\n ret.AVCLevelIndication = data[3]\n ret.codec = getAvcCodec([data[1], data[2], data[3]])\n ret.lengthSizeMinusOne = data[4] & 0x3\n ret.spsLength = data[5] & 0x1F\n ret.sps = []\n let start = 6\n for (let i = 0; i < ret.spsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.sps.push(data.subarray(start, start + size))\n // ret.spsInfo = SpsParser.parseSPS(ret.sps[i])\n // ret.pixelRatio = ret.spsInfo.par_ratio\n start += size\n }\n ret.ppsLength = data[start]\n start += 1\n ret.pps = []\n for (let i = 0; i < ret.ppsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.pps.push(data.subarray(start, start += size))\n start += size\n }\n })\n }\n\n static hvc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(bodyData, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static hvcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.codec = 'hev1.1.6.L93.B0'\n ret.configurationVersion = data[0]\n const tmp = data[1]\n ret.generalProfileSpace = tmp >> 6\n ret.generalTierFlag = (tmp & 0x20) >> 5\n ret.generalProfileIdc = tmp & 0x1F\n ret.generalProfileCompatibility = readBig32(data, 2)\n ret.generalConstraintIndicatorFlags = data.subarray(6, 12)\n ret.generalLevelIdc = data[12]\n ret.avgFrameRate = readBig16(data, 19)\n ret.numOfArrays = data[22]\n ret.vps = []\n ret.sps = []\n ret.pps = []\n let start = 23\n let type = 0\n let numNalus = 0\n let size = 0\n for (let i = 0; i < ret.numOfArrays; i++) {\n type = data[start] & 0x3F\n numNalus = readBig16(data, start + 1)\n start += 3\n const nalus = []\n for (let j = 0; j < numNalus; j++) {\n size = readBig16(data, start)\n start += 2\n nalus.push(data.subarray(start, start + size))\n start += size\n }\n\n if (type === 32) {\n ret.vps.push(...nalus)\n } else if (type === 33) {\n ret.sps.push(...nalus)\n } else if (type === 34) {\n ret.pps.push(...nalus)\n }\n }\n })\n }\n\n static pasp (box) {\n return parseBox(box, false, (ret, data) => {\n ret.hSpacing = readBig32(data)\n ret.vSpacing = readBig32(data, 4)\n })\n }\n\n static mp4a (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseAudioSampleEntry(ret, data)\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data.subarray(bodyStart), ['esds'], start + bodyStart)[0])\n })\n }\n\n static esds (box) {\n return parseBox(box, true, (ret, data) => {\n ret.codec = 'mp4a.'\n let start = 0\n let byteRead = 0\n let size = 0\n let tag = 0\n while (data.length) {\n start = 0\n tag = data[start]\n byteRead = data[start + 1]\n start += 2\n while (byteRead & 0x80) {\n size = (byteRead & 0x7F) << 7\n byteRead = data[start]\n start += 1\n }\n size += byteRead & 0x7F\n if (tag === 3) {\n data = data.subarray(start + 3)\n } else if (tag === 4) {\n ret.codec += (data[start].toString(16) + '.').padStart(3, '0')\n data = data.subarray(start + 13)\n } else if (tag === 5) {\n const config = ret.config = data.subarray(start, start + size)\n let objectType = (config[0] & 0xF8) >> 3\n if (objectType === 31 && config.length >= 2) {\n objectType = 32 + ((config[0] & 0x7) << 3) + ((config[1] & 0xE0) >> 5)\n }\n ret.objectType = objectType\n ret.codec += objectType.toString(16)\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n } else {\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n }\n }\n })\n }\n\n static alaw (box) {\n return parseBox(box, false, (ret, data) => {\n parseAudioSampleEntry(ret, data)\n })\n }\n\n static stts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n delta: readBig32(data, start + 4)\n })\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static ctts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n if (ret.version === 1) {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: readBig32(data, start + 4)\n })\n start += 8\n }\n } else {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: -(~readBig32(data, start + 4) + 1)\n })\n start += 8\n }\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsc (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n firstChunk: readBig32(data, start),\n samplesPerChunk: readBig32(data, start + 4),\n sampleDescriptionIndex: readBig32(data, start + 8)\n })\n start += 12\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsz (box) {\n return parseBox(box, true, (ret, data) => {\n const sampleSize = readBig32(data)\n const sampleCount = readBig32(data, 4)\n const entrySizes = []\n if (!sampleSize) {\n let start = 8\n for (let i = 0; i < sampleCount; i++) {\n entrySizes.push(readBig32(data, start))\n start += 4\n }\n }\n ret.sampleSize = sampleSize\n ret.sampleCount = sampleCount\n ret.entrySizes = entrySizes\n })\n }\n\n static stco (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static co64 (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig64(data, start))\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stss (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static moof (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mfhd = MP4Parser.mfhd(MP4Parser.findBox(data, ['mfhd'], start)[0])\n ret.traf = MP4Parser.findBox(data, ['traf'], start).map(t => MP4Parser.traf(t))\n })\n }\n\n static mfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.sequenceNumber = readBig32(data)\n })\n }\n\n static traf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tfhd = MP4Parser.tfhd(MP4Parser.findBox(data, ['tfhd'], start)[0])\n ret.tfdt = MP4Parser.tfdt(MP4Parser.findBox(data, ['tfdt'], start)[0])\n ret.trun = MP4Parser.trun(MP4Parser.findBox(data, ['trun'], start)[0])\n })\n }\n\n static trun (box) {\n return parseBox(box, true, (ret, data) => {\n const { version, flags } = ret\n const dataLen = data.length\n const sampleCount = ret.sampleCount = readBig32(data)\n let offset = 4\n if (dataLen > offset && flags & 1) {\n ret.dataOffset = -(~readBig32(data, offset) + 1)\n offset += 4\n }\n if (dataLen > offset && flags & 4) {\n ret.firstSampleFlags = readBig32(data, offset)\n offset += 4\n }\n ret.samples = []\n if (dataLen > offset) {\n let sample\n for (let i = 0; i < sampleCount; i++) {\n sample = {}\n if (flags & 0x100) {\n sample.duration = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x200) {\n sample.size = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x400) {\n sample.flags = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x800) {\n if (version) {\n sample.cts = -(~readBig32(data, offset + 4) + 1)\n } else {\n sample.cts = readBig32(data, offset)\n }\n offset += 4\n }\n ret.samples.push(sample)\n }\n }\n })\n }\n\n static tfdt (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 1) {\n ret.baseMediaDecodeTime = readBig64(data)\n } else {\n ret.baseMediaDecodeTime = readBig32(data)\n }\n })\n }\n\n static probe (data) {\n return !!MP4Parser.findBox(data, ['ftyp'])\n }\n\n static parseSampleFlags (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: (flags[2] << 8) | flags[3]\n }\n }\n\n static moovToTrack (moov, videoTrack, audioTrack) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (vTrack && videoTrack) {\n const v = videoTrack\n const _vTrackId = vTrack.tkhd?.trackId\n if (_vTrackId !== null && _vTrackId !== undefined) v.id = vTrack.tkhd.trackId\n v.tkhdDuration = vTrack.tkhd.duration\n v.mvhdDurtion = moov.mvhd.duration\n v.mvhdTimecale = moov.mvhd.timescale\n v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale\n v.duration = vTrack.mdia.mdhd.duration || (v.mvhdDurtion / v.mvhdTimecale * v.timescale)\n const e1 = vTrack.mdia.minf.stbl.stsd.entries[0]\n v.width = e1.width\n v.height = e1.height\n if (e1.pasp) {\n v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing]\n }\n if (e1.hvcC) {\n v.codecType = VideoCodecType.HEVC\n v.codec = e1.hvcC.codec\n v.vps = e1.hvcC.vps\n v.sps = e1.hvcC.sps\n v.pps = e1.hvcC.pps\n v.hvcC = e1.hvcC.data\n } else if (e1.avcC) {\n v.codec = e1.avcC.codec\n v.sps = e1.avcC.sps\n v.pps = e1.avcC.pps\n } else {\n throw new Error('unknown video stsd entry')\n }\n v.present = true\n v.ext = {}\n v.ext.stss = vTrack.mdia?.minf?.stbl?.stss\n v.ext.ctts = vTrack.mdia?.minf?.stbl?.ctts\n\n if (e1 && e1.type === 'encv') {\n v.isVideoEncryption = true\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n v.videoSenc = vTrack.mdia.minf.stbl.senc && vTrack.mdia.minf.stbl.senc.samples\n e1.data_format = e1.sinf?.frma?.data_format\n v.useEME = moov.useEME\n v.kidValue = moov.kidValue\n v.pssh = moov.pssh\n v.encv = e1\n }\n }\n\n if (aTrack && audioTrack) {\n const a = audioTrack\n const _aTrackId = aTrack.tkhd?.trackId\n if (_aTrackId !== null && _aTrackId !== undefined) a.id = aTrack.tkhd.trackId\n a.tkhdDuration = aTrack.tkhd.duration\n a.mvhdDurtion = moov.mvhd.duration\n a.mvhdTimecale = moov.mvhd.timescale\n a.timescale = a.formatTimescale = aTrack.mdia.mdhd.timescale\n a.duration = aTrack.mdia.mdhd.duration || (a.mvhdDurtion / a.mvhdTimecale * a.timescale)\n const e1 = aTrack.mdia.minf.stbl.stsd.entries[0]\n a.sampleSize = e1.sampleSize\n a.sampleRate = e1.sampleRate\n a.channelCount = e1.channelCount\n a.present = true\n\n switch (e1.type) {\n case 'alaw':\n a.codecType = a.codec = AudioCodecType.G711PCMA\n a.sampleRate = 8000\n break\n case 'ulaw':\n a.codecType = a.codec = AudioCodecType.G711PCMU\n a.sampleRate = 8000\n break\n default:\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) a.config = Array.from(e1.esds.config)\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n break\n }\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) {\n if (e1.esds.config) {\n a.config = Array.from(e1.esds.config)\n } else {\n console.warn('esds config is null')\n }\n }\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.ext = {}\n a.ext.stss = aTrack.mdia?.minf?.stbl?.stss\n a.ext.ctts = aTrack.mdia?.minf?.stbl?.ctts\n a.present = true\n if (e1 && e1.type === 'enca') {\n a.isAudioEncryption = true\n e1.data_format = e1.sinf?.frma?.data_format\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n a.audioSenc = aTrack.mdia.minf.stbl.senc && aTrack.mdia.minf.stbl.senc.samples\n a.useEME = moov.useEME\n a.kidValue = moov.kidValue\n a.enca = e1\n }\n }\n\n audioTrack && (audioTrack.isVideoEncryption = videoTrack ? videoTrack.isVideoEncryption : false)\n videoTrack && (videoTrack.isAudioEncryption = audioTrack ? audioTrack.isAudioEncryption : false)\n\n if (videoTrack?.encv || audioTrack?.enca) {\n const vkid = videoTrack?.encv?.default_KID\n const akid = audioTrack?.enca?.default_KID\n const kid = (vkid || akid) ? (vkid || akid).join('') : null\n videoTrack && (videoTrack.kid = kid)\n audioTrack && (audioTrack.kid = kid)\n }\n\n videoTrack && (videoTrack.flags = 0xf01)\n audioTrack && (audioTrack.flags = 0x701)\n\n return {\n videoTrack,\n audioTrack\n }\n }\n\n static evaluateDefaultDuration (videoTrack, audioTrack, videoSampleCount) {\n const audioSampleCount = audioTrack?.samples?.length\n\n // audio\n if (!audioSampleCount) return 1024\n\n const segmentDuration = 1024 * audioSampleCount / audioTrack.timescale\n\n return segmentDuration * videoTrack.timescale / videoSampleCount\n }\n\n static moofToSamples (moof, videoTrack, audioTrack) {\n const ret = {}\n\n if (moof.mfhd) {\n if (videoTrack) videoTrack.sequenceNumber = moof.mfhd.sequenceNumber\n if (audioTrack) audioTrack.sequenceNumber = moof.mfhd.sequenceNumber\n }\n\n moof.traf.forEach(({ tfhd, tfdt, trun }) => {\n if (!tfhd || !trun) return\n if (tfdt) {\n if (videoTrack && videoTrack.id === tfhd.trackId) videoTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n if (audioTrack && audioTrack.id === tfhd.trackId) audioTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n }\n const defaultSize = tfhd.defaultSampleSize || 0\n const defaultDuration = tfhd.defaultSampleDuration || MP4Parser.evaluateDefaultDuration(videoTrack, audioTrack, trun.samples.length || trun.sampleCount)\n let offset = trun.dataOffset || 0\n let dts = 0\n let gopId = -1\n if (!trun.samples.length && trun.sampleCount) {\n ret[tfhd.trackId] = []\n for (let i = 0; i < trun.sampleCount; i++) {\n ret[tfhd.trackId].push({\n offset,\n dts,\n duration: defaultDuration,\n size: defaultSize\n })\n dts += defaultDuration\n offset += defaultSize\n }\n } else {\n ret[tfhd.trackId] = trun.samples.map((s, index) => {\n s = {\n offset,\n dts,\n pts: dts + (s.cts || 0),\n duration: s.duration || defaultDuration,\n size: s.size || defaultSize,\n gopId,\n keyframe: index === 0 || ((s.flags !== null && s.flags !== undefined) && ((s.flags & 65536) >>> 0) !== 65536)\n }\n if (s.keyframe) {\n gopId++\n s.gopId = gopId\n }\n dts += s.duration\n offset += s.size\n return s\n })\n }\n })\n\n return ret\n }\n\n static moovToSamples (moov) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!vTrack && !aTrack) return\n let videoSamples\n let audioSamples\n if (vTrack) {\n const videoStbl = vTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!stts || !stsc || !stsz || !stco || !stss) return\n videoSamples = getSamples(stts, stsc, stsz, stco, ctts, stss)\n }\n if (aTrack) {\n const audioStbl = aTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = aTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSamples = getSamples(stts, stsc, stsz, stco)\n }\n\n return {\n videoSamples,\n audioSamples\n }\n }\n}\n\nfunction getSamples (stts, stsc, stsz, stco, ctts, stss) {\n const samples = []\n const cttsEntries = ctts?.entries\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n\n let sample\n let gopId = -1\n let dts = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n stts.entries.forEach(({ count, delta }) => {\n for (let i = 0; i < count; i++) {\n sample = {\n dts,\n duration: delta,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n sample.keyframe = keyframeMap[pos]\n if (sample.keyframe) {\n gopId++\n }\n sample.gopId = gopId\n }\n // sample.timeOffset = 0\n if (cttsArr && pos < cttsArr.length) {\n sample.pts = sample.dts + cttsArr[pos]\n // sample.timeOffset = cttsArr[pos]\n // if (pos === 0) {\n // sample.pts = sample.dts\n // sample.timeOffset = 0\n // }\n }\n samples.push(sample)\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += sample.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n return samples\n}\n\nfunction parseVisualSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n ret.frameCount = readBig16(data, 40)\n ret.depth = readBig16(data, 74)\n return 78\n}\n\nfunction parseAudioSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.channelCount = readBig16(data, 16)\n ret.sampleSize = readBig16(data, 18)\n ret.sampleRate = readBig32(data, 24) / (1 << 16)\n return 28\n}\n\nfunction parseBox (box, isFullBox, parse) {\n if (!box) return\n if (box.size !== box.data.length) throw new Error(`box ${box.type} size !== data.length`)\n const ret = {\n start: box.start,\n size: box.size,\n headerSize: box.headerSize,\n type: box.type\n }\n if (isFullBox) {\n ret.version = box.data[box.headerSize]\n ret.flags = readBig24(box.data, box.headerSize + 1)\n ret.headerSize += 4\n }\n parse(ret, box.data.subarray(ret.headerSize), ret.start + ret.headerSize)\n return ret\n}\n\nconst padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\nconst toHex = function (...value) {\n const hex = []\n value.forEach(item => {\n hex.push(padStart(Number(item).toString(16), 2, 0))\n })\n return hex[0]\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse /* hashVal */ } from '../utils'\nimport Buffer from './buffer'\n// import Crypto from './crypto/crypto'\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'avc1',\n 'avcC',\n 'hvc1',\n 'hvcC',\n 'dinf',\n 'dref',\n 'esds',\n 'ftyp',\n 'hdlr',\n 'mdat',\n 'mdhd',\n 'mdia',\n 'mfhd',\n 'minf',\n 'moof',\n 'moov',\n 'mp4a',\n 'mvex',\n 'mvhd',\n 'pasp',\n 'stbl',\n 'stco',\n 'stsc',\n 'stsd',\n 'stsz',\n 'stts',\n 'tfdt',\n 'tfhd',\n 'traf',\n 'trak',\n 'trex',\n 'tkhd',\n 'vmhd',\n 'smhd',\n 'ctts',\n 'stss',\n 'styp',\n 'pssh',\n 'sidx',\n 'sbgp',\n 'saiz',\n 'saio',\n 'senc',\n 'trun',\n 'encv',\n 'enca',\n 'sinf',\n 'btrt',\n 'frma',\n 'tenc',\n 'schm',\n 'schi',\n 'mehd',\n 'fiel',\n 'sdtp'\n ].reduce((p, c) => {\n p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)]\n return p\n }, Object.create(null));\n\n static HDLR_TYPES = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ])\n }\n\n static FTYPAVC1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 97, 118, 99, 49 // avc1\n ]))\n\n static FTYPHEV1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 104, 101, 118, 49 // hev1\n ]))\n\n static DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version\n 0x00, 0x00, 0x01 // entry_flags\n ])))\n\n static VMHD = MP4.box(MP4.types.vmhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // op color\n ]))\n\n static SMHD = MP4.box(MP4.types.smhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]))\n\n static StblTable = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ])\n\n static STTS = MP4.box(MP4.types.stts, MP4.StblTable)\n\n static STSC = MP4.box(MP4.types.stsc, MP4.StblTable)\n\n static STSZ = MP4.box(MP4.types.stsz, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]))\n\n static STCO = MP4.box(MP4.types.stco, MP4.StblTable)\n\n static box (type, ...payload) {\n payload = payload.filter(Boolean)\n const size = 8 + payload.reduce((p, c) => (p + c.byteLength), 0)\n const ret = new Uint8Array(size)\n ret[0] = (size >> 24) & 0xff\n ret[1] = (size >> 16) & 0xff\n ret[2] = (size >> 8) & 0xff\n ret[3] = size & 0xff\n ret.set(type, 4)\n let offset = 8\n payload.forEach((data) => {\n ret.set(data, offset)\n offset += data.byteLength\n })\n return ret\n }\n\n static ftyp (tracks) {\n const isHevc = tracks.find(t => t.type === TrackType.VIDEO && t.codecType === VideoCodecType.HEVC)\n return isHevc ? MP4.FTYPHEV1 : MP4.FTYPAVC1\n }\n\n static initSegment (tracks) {\n const ftyp = MP4.ftyp(tracks)\n // console.log('[remux],ftyp ,len ', ftyp.byteLength, hashVal(ftyp.toString()))\n const init = concatUint8Array(ftyp, MP4.moov(tracks))\n // console.log('[remux],init ,len ', init.byteLength, hashVal(init.toString()))\n return init\n }\n\n static pssh (data) {\n // const buffer = new Buffer()\n const content = new Uint8Array(\n [\n 0x01, 0x00, 0x00, 0x00 // version\n ].concat(\n [\n 0x10, 0x77, 0xef, 0xec,\n 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e,\n 0x52, 0xe2, 0xfb, 0x4b\n ],\n [0x00, 0x00, 0x00, 0x01],\n parse(data.kid),\n [0x00, 0x00, 0x00, 0x00]\n )\n )\n return MP4.box(MP4.types.pssh, content)\n }\n\n static moov (tracks) {\n if (tracks[0].useEME && (tracks[0].encv || tracks[0].enca)) {\n if (!tracks[0].pssh) {\n tracks[0].pssh = {\n kid: tracks[0].kid\n }\n }\n const pssh = this.pssh(tracks[0].pssh)\n // console.log('[remux],pssh,', hashVal(pssh.toString()))\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n MP4.mvex(tracks),\n ...tracks.map((t) => MP4.trak(t)),\n pssh)\n } else {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n ...tracks.map((t) => MP4.trak(t)),\n MP4.mvex(tracks)\n )\n }\n }\n\n static mvhd (duration, timescale = 90000) {\n const mvhd = MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x01, 0x00, 0x00, // rate\n 0x01, 0x00, // volume\n 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff // todo 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]))\n // console.log('[remux],mvhd, len,', mvhd.byteLength, hashVal(mvhd.toString()))\n return mvhd\n }\n\n static trak (track) {\n const trak = MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.tkhdDuration || 0, track.width, track.height),\n MP4.mdia(track)\n )\n // console.log('[remux],trak, len,', trak.byteLength, track.id, hashVal(trak.toString()))\n return trak\n }\n\n static tkhd (id, duration, width = 0, height = 0) {\n const tkhd = MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x07, // flags、todo 0x07\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time todo\n (id >> 24) & 0xff, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff,\n 0x00, 0x00, 0x00, 0x00,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // todo (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // /*0x00*/ alternate_group //todo type === 'video' ? 0x01 : 0x00(第二个位置)\n 0x01, 0x00, // /* 0x01 */, 0x00, // non-audio track volume //todo type === 'audio' ? 0x01 : 0x00(第一个位置)\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n (width >> 8) & 0xff, width & 0xff, 0x00, 0x00,\n (height >> 8) & 0xff, height & 0xff, 0x00, 0x00\n ]))\n // console.log('[remux],tkhd, len,', tkhd.byteLength, hashVal(tkhd.toString()))\n return tkhd\n }\n\n static mdia (track) {\n const mdia = MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minf(track))\n // console.log('[remux],mdia, len,', mdia.byteLength, hashVal(mdia.toString()))\n return mdia\n }\n\n static mdhd (duration, timescale = 90000) {\n const mdhd = MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // todo 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,//todo\n 0x55, 0xc4, // 'und' language (undetermined) //todo 0x15, 0xC7\n 0x00, 0x00 // pre_defined\n ]))\n // console.log('[remux],mdhd, len,', mdhd.byteLength, hashVal(mdhd.toString()))\n return mdhd\n }\n\n static hdlr (type) {\n const hdlr = MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type])\n // console.log('[remux],hdlr, len,', hdlr.byteLength, hashVal(hdlr.toString()))\n return hdlr\n }\n\n static minf (track) {\n const minf = MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stbl(track))\n // console.log('[remux],minf, len,', minf.byteLength, hashVal(minf.toString()))\n return minf\n }\n\n static stbl (track) {\n const extBox = []\n if (track && track.ext) {\n track.ext.stss && extBox.push(MP4.stss(track.ext.stss.entries))\n // track.ext.stss && extBox.push(MP4.ctts(track.ext.stss.entries))\n }\n const stbl = MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.STTS, extBox[0], MP4.STSC, MP4.STSZ, MP4.STCO)\n // console.log('[remux],stbl, len,', stbl.byteLength, hashVal(stbl.toString()))\n return stbl\n }\n\n static stsd (track) {\n let content\n if (track.type === 'audio') {\n if (track.useEME && track.enca) {\n content = MP4.enca(track)\n // console.log('[remux],enca, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.mp4a(track)\n // console.log('[remux],mp4a, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n } else if (track.useEME && track.encv) {\n content = MP4.encv(track)\n // console.log('[remux],encv, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.avc1hev1(track)\n // console.log('[remux],avc1hev1, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n const stsd = MP4.box(MP4.types.stsd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]), content)\n // console.log('[remux],stsd, len,', stsd.byteLength, hashVal(stsd.toString()))\n return stsd\n }\n\n static enca (data) {\n const channelCount = data.enca.channelCount\n const sampleRate = data.enca.sampleRate\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n (sampleRate >> 8) & 0xff,\n sampleRate & 0xff, //\n 0x00, 0x00\n ])\n const esds = MP4.esds(data.config)\n // console.log('[remux],esds, len,', esds.byteLength, hashVal(esds.toString()))\n const sinf = MP4.sinf(data.enca)\n // console.log('[remux],sinf, len,', sinf.byteLength, hashVal(sinf.toString()))\n return MP4.box(MP4.types.enca, content, esds, sinf)\n }\n\n static encv (track) {\n const sps = track.sps.length > 0 ? track.sps[0] : []\n const pps = track.pps.length > 0 ? track.pps[0] : []\n const width = track.width\n const height = track.height\n const hSpacing = track.sarRatio[0]\n const vSpacing = track.sarRatio[1]\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n\n 0x12,\n 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74,\n 0x69, 0x6F, 0x6E, 0x2F,\n 0x68, 0x6C, 0x73, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]) // pre_defined = -1;\n const avcc = new Uint8Array([\n 0x01, // version\n sps[1], // profile\n sps[2], // profile compatible\n sps[3], // level\n 0xfc | 3,\n 0xE0 | 1, // 目前只处理一个sps\n sps.length >>> 8 & 0xff,\n sps.length & 0xff\n ].concat(...sps).concat([\n 0x01,\n pps.length >>> 8 & 0xff,\n pps.length & 0xff\n ]).concat(...pps))\n const btrt = new Uint8Array([\n 0x00, 0x00, 0x58, 0x39,\n 0x00, 0x0F, 0xC8, 0xC0,\n 0x00, 0x04, 0x56, 0x48\n ])\n const sinf = MP4.sinf(track.encv)\n const pasp = new Uint8Array([\n (hSpacing >> 24), // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n (vSpacing >> 24), // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff\n ])\n return MP4.box(MP4.types.encv, content, MP4.box(MP4.types.avcC, avcc), MP4.box(MP4.types.btrt, btrt), sinf, MP4.box(MP4.types.pasp, pasp))\n }\n\n static schi (data) {\n const content = new Uint8Array([])\n const tenc = MP4.tenc(data)\n return MP4.box(MP4.types.schi, content, tenc)\n }\n\n static tenc (data) {\n // 用于每个track的加密参数(包括KID、初始化向量、加密标志位),包含在TrackEncryptionBox(‘tenc’)中。\n const content = new Uint8Array(\n [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // skip\n data.default_IsEncrypted & 0xff, // default_isProtected\n data.default_IV_size & 0xff // default_Per_Sample_IV_Size\n ].concat(parse(data.default_KID)))\n return MP4.box(MP4.types.tenc, content)\n }\n\n static sinf (data) {\n const content = new Uint8Array([])\n const frma = new Uint8Array([\n data.data_format.charCodeAt(0),\n data.data_format.charCodeAt(1),\n data.data_format.charCodeAt(2),\n data.data_format.charCodeAt(3)\n ])\n const schm = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x63, 0x65, 0x6E, 0x63, // cenc\n 0x00, 0x01, 0x00, 0x00 // version\n ])\n const schi = MP4.schi(data)\n return MP4.box(MP4.types.sinf, content, MP4.box(MP4.types.frma, frma), MP4.box(MP4.types.schm, schm), schi)\n }\n\n static avc1hev1 (track) {\n const isHevc = track.codecType === VideoCodecType.HEVC\n const typ = isHevc ? MP4.types.hvc1 : MP4.types.avc1\n const config = isHevc ? MP4.hvcC(track) : MP4.avcC(track)\n const boxes = [\n new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), config\n ]\n // console.log('[remux],avc1hev1_0, len,', boxes[0].byteLength, hashVal(boxes[0].toString()))\n // console.log('[remux],avc1hev1_1, len,', boxes[1].byteLength, hashVal(boxes[1].toString()))\n if (isHevc) {\n boxes.push(MP4.box(MP4.types.fiel, new Uint8Array([0x01, 0x00])))\n // console.log('[remux],fiel, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n } else if (track.sarRatio && track.sarRatio.length > 1) {\n boxes.push(MP4.pasp(track.sarRatio))\n // console.log('[remux],pasp, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n }\n return MP4.box(typ, ...boxes)\n }\n\n static avcC (track) {\n const sps = []\n const pps = []\n\n let len\n track.sps.forEach((s) => {\n len = s.byteLength\n sps.push((len >>> 8) & 0xff)\n sps.push(len & 0xff)\n sps.push(...s)\n })\n\n track.pps.forEach((p) => {\n len = p.byteLength\n pps.push((len >>> 8) & 0xff)\n pps.push(len & 0xff)\n pps.push(...p)\n })\n\n return MP4.box(MP4.types.avcC, new Uint8Array([\n 0x01, // configurationVersion\n sps[3], // AVCProfileIndication\n sps[4], // profile_compatibility\n sps[5], // AVCLevelIndication\n 0xfc | 3, // lengthSizeMinusOne\n 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(...sps)\n .concat([track.pps.length]) // numOfPictureParameterSets\n .concat(...pps)))\n }\n\n static hvcC (track) {\n const hvcC = track.hvcC\n if (hvcC instanceof ArrayBuffer || hvcC instanceof Uint8Array) return hvcC\n const { vps, sps, pps } = track\n let data\n if (hvcC) {\n const pcf = hvcC.generalProfileCompatibilityFlags\n const cif = hvcC.generalConstraintIndicatorFlags\n const numOfArrays = (vps.length && 1) + (sps.length && 1) + (pps.length && 1)\n data = [\n 0x01, // configurationVersion\n hvcC.generalProfileSpace << 6 | hvcC.generalTierFlag << 5 | hvcC.generalProfileIdc,\n pcf >>> 24, pcf >>> 16, pcf >>> 8, pcf,\n cif[0], cif[1], cif[2], cif[3], cif[4], cif[5],\n hvcC.generalLevelIdc,\n 0xF0, 0x00, // min_spatial_segmentation_idc\n 0xFC, // parallelismType\n hvcC.chromaFormatIdc | 0xFC,\n hvcC.bitDepthLumaMinus8 | 0xF8,\n hvcC.bitDepthChromaMinus8 | 0xF8,\n 0x00, 0x00, // avgFrameRate\n hvcC.numTemporalLayers << 3 | hvcC.temporalIdNested << 2 | 3,\n numOfArrays\n ]\n const write = (x) => {\n data.push(x.length >> 8, x.length)\n data.push(...x)\n }\n if (vps.length) {\n data.push(0xA0, 0x00, vps.length)\n vps.forEach(write)\n }\n if (sps.length) {\n data.push(0xA1, 0x00, sps.length)\n sps.forEach(write)\n }\n if (pps.length) {\n data.push(0xA2, 0x00, pps.length)\n pps.forEach(write)\n }\n } else {\n data = [\n 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02,\n 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,\n 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40\n ]\n }\n return MP4.box(MP4.types.hvcC, new Uint8Array(data))\n }\n\n static pasp ([hSpacing, vSpacing]) {\n return MP4.box(MP4.types.pasp, new Uint8Array([\n hSpacing >> 24, (hSpacing >> 16) & 0xff, (hSpacing >> 8) & 0xff, hSpacing & 0xff,\n vSpacing >> 24, (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff\n ]))\n }\n\n static mp4a (track) {\n return MP4.box(MP4.types.mp4a, new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, track.channelCount,\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff, track.sampleRate & 0xff,\n 0x00, 0x00\n ]), track.config.length ? MP4.esds(track.config) : undefined)\n }\n\n static esds (config) {\n const len = config.length\n const esds = MP4.box(MP4.types.esds, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x03, // tag\n 0x17 + len, // length\n 0x00, 0x00, // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n 0x04, // tag\n 0x0f + len, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x06, 0x00, // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0, // maxBitrate\n 0x00, 0x00, 0xda, 0xc0, // avgBitrate\n 0x05 // tag, DecoderSpecificInfoTag\n ].concat([len])\n .concat(config)\n .concat(\n [0x06, 0x01, 0x02]// GASpecificConfig\n )\n ))\n // console.log('[remux],esds ,len ', esds.byteLength, hashVal(esds.toString()))\n return esds\n }\n\n static mvex (tracks) {\n // const mehd = MP4.box(MP4.types.mehd, this.extension(0, 0), Buffer.writeUint32(tracks[0].tkhdDuration))\n // const mvex = MP4.box(MP4.types.mvex, mehd, MP4.trex1(1), MP4.trex2(2))\n // // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n // const mvex = MP4.box(MP4.types.mvex, MP4.trex1(1), MP4.trex2(2))\n const mvex = MP4.box(MP4.types.mvex, ...tracks.map((t) => MP4.trex(t.id)))\n // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n return mvex\n }\n\n static trex (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex1 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x02, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex2 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x04, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x02, 0x00, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static moof (tracks) {\n const moof = MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].samples ? tracks[0].samples[0].gopId : 0), ...tracks.map((t) => MP4.traf(t)))\n // console.log('[remux],moof, len', moof.byteLength)\n return moof\n // return MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].gopId), ...tracks.map((t) => MP4.traf(t)))\n }\n\n static mfhd (sequenceNumber) {\n // sequenceNumber += 1\n const mfhd = MP4.box(MP4.types.mfhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n sequenceNumber >> 24, (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff\n ]))\n // console.log('[remux],mfhd, len,', mfhd.byteLength, hashVal(mfhd.toString()))\n return mfhd\n }\n\n static traf (track) {\n const tfhd = MP4.tfhd(track.id)\n // console.log('[remux],tfhd, len,', tfhd.byteLength, hashVal(tfhd.toString()), ', trackid = ', track.id)\n // console.log('[remux],tfdt,baseMediaDecodeTime,', track.baseMediaDecodeTime)\n const tfdt = MP4.tfdt(track, track.baseMediaDecodeTime)\n let sencLength = 0\n let samples\n if (track.isVideo && track.videoSenc) {\n samples = track.videoSenc\n samples.forEach(function (item) {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n track.videoSencLength = sencLength\n // console.log('[remux],tfdt, len,', tfdt.toString().length)\n // console.log('[remux],tfdt, len,', tfdt.byteLength, hashVal(tfdt.toString()))\n if (!track.useEME || (!track.isVideoEncryption && !track.isAudioEncryption)) {\n const sdtp = MP4.sdtp(track)\n // console.log('[remux],sdtp, len,', sdtp.byteLength, hashVal(sdtp.toString()))\n const offset = 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8 // mdat header\n return MP4.box(MP4.types.traf, tfhd, tfdt, sdtp, MP4.trun(track.samples, sdtp.byteLength + offset))\n } else if (track.isVideoEncryption) {\n if (track.isVideo) {\n // 加密视频\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const trun = MP4.trun1(track)\n const senc = MP4.senc(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, saiz, saio, trun, senc)\n // console.log('[remux],trex_video, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n } else {\n // 视频加密,音频加密和未加密处理\n if (!track.isAudioEncryption) {\n // 音频未加密\n const sbgp = MP4.sbgp()\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, trun)\n } else {\n // 音频加密\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex_audio, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n } else {\n // 视频未加密,音频加密\n if (track.isVideo) {\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun)\n } else {\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n }\n\n static sdtp (data) {\n const buffer = new Buffer()\n data.samples.forEach(item => {\n buffer.write(new Uint8Array(data.isVideo ? [item.keyframe ? 32 : 16] : [16]))\n })\n return MP4.box(MP4.types.sdtp, this.extension(0, 0), buffer.buffer)\n }\n\n static trun1 (data) {\n // const id = data.id\n // const ceil = id === 1 ? 12 : 4\n const buffer = new Buffer()\n const sampleCount = Buffer.writeUint32(data.samples.length)\n let offset = null\n if (data.isVideo) {\n const sencLength = data.videoSencLength\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 17 + //saiz\n 24 + //saio\n data.samples.length*16\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 12(header) + sencLength //senc\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n = 149+data.samples.length * 16 + sencLength\n */\n offset = Buffer.writeUint32(data.samples.length * 16 + sencLength + 149)\n if (!data.isVideoEncryption && data.isAudioEncryption) {\n offset = Buffer.writeUint32(data.samples.length * 16 + 92)\n }\n } else {\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 28 + //sbgp\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n */\n let len = data.samples.length * 12 + 124\n if (data.isAudioEncryption) {\n len = data.samples.length * 12 + 8 * data.audioSenc.length + 177\n }\n offset = Buffer.writeUint32(len)\n }\n\n data.samples.forEach(item => {\n buffer.write(Buffer.writeUint32(item.duration))\n buffer.write(Buffer.writeUint32(item.size))\n buffer.write(Buffer.writeUint32(item.keyframe ? 0x02000000 : 0x00010000))\n if (data.isVideo) {\n buffer.write(Buffer.writeUint32(item.cts ? item.cts : 0))\n }\n })\n\n return MP4.box(MP4.types.trun, this.extension(0, data.flags), sampleCount, offset, buffer.buffer)\n }\n\n static senc (data) {\n const buffer = new Buffer()\n const len = data.samples.length\n const ceil = data.isVideo ? 16 : 8\n const flag = data.isVideo ? 2 : 0\n let samples = []\n let samplesLength = 0\n if (data.isVideo) {\n samples = data.videoSenc\n samplesLength = data.videoSencLength\n } else {\n samples = data.audioSenc\n }\n samplesLength = samplesLength || ceil * len\n buffer.write(\n Buffer.writeUint32(16 + samplesLength), MP4.types.senc, this.extension(0, flag)\n )\n buffer.write(Buffer.writeUint32(len))\n samples.forEach(item => {\n for (let i = 0; i < item.InitializationVector.length; i++) {\n buffer.write(new Uint8Array([item.InitializationVector[i]]))\n }\n if (item.subsamples && item.subsamples.length) {\n buffer.write(Buffer.writeUint16(item.subsamples.length))\n item.subsamples.forEach(value => {\n buffer.write(Buffer.writeUint16(value.BytesOfClearData))\n buffer.write(Buffer.writeUint32(value.BytesOfProtectedData))\n })\n }\n })\n return buffer.buffer\n // return MP4.box(MP4.types.senc, this.extension(0, flag), buffer.buffer)\n }\n\n static saio (data) {\n let length = data.samples.length * 12 + 141\n if (!data.isVideo && data.isAudioEncryption) {\n length = 149\n }\n const content = new Uint8Array([\n 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00,\n (length >> 24) & 0xff,\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff\n ])\n return MP4.box(MP4.types.saio, content)\n }\n\n static saiz (data) {\n const samplesLength = data.samples.length\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x10, // default sample info size\n (samplesLength >> 24) & 0xff,\n (samplesLength >> 16) & 0xff,\n (samplesLength >> 8) & 0xff,\n samplesLength & 0xff\n ])\n return MP4.box(MP4.types.saiz, content)\n }\n\n static sbgp () {\n const content = new Uint8Array([\n 0x72, 0x6F, 0x6C, 0x6C, // sgpd, grouping_type\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x01, 0x19,\n 0x00, 0x00, 0x00, 0x01\n ])\n return MP4.box(MP4.types.sbgp, this.extension(0, 0), content)\n }\n\n static extension (version, flag) {\n return new Uint8Array([\n version,\n (flag >> 16) & 0xff,\n (flag >> 8) & 0xff,\n flag & 0xff\n ])\n }\n\n static tfhd (id) {\n return MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags todo 0x00\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff // track_ID\n ]))\n }\n\n static tfdt (data, baseMediaDecodeTime) {\n const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1))\n const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1))\n if (data.useEME && (data.isVideoEncryption || data.isAudioEncryption)) {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n } else {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n }\n }\n\n static trun (samples, offset) {\n const sampleLen = samples.length\n const dataLen = 12 + (16 * sampleLen)\n offset += 8 + dataLen\n const data = new Uint8Array(dataLen)\n data.set([\n 0x00, // version\n 0x00, 0x0f, 0x01, // flags\n (sampleLen >>> 24) & 0xff, (sampleLen >>> 16) & 0xff, (sampleLen >>> 8) & 0xff, sampleLen & 0xff,\n (offset >>> 24) & 0xff, (offset >>> 16) & 0xff, (offset >>> 8) & 0xff, offset & 0xff // data_offset\n ], 0)\n for (let i = 0; i < sampleLen; i++) {\n const {\n duration, size, flag = {}, cts = 0\n } = samples[i]\n data.set([\n (duration >>> 24) & 0xff, (duration >>> 16) & 0xff, (duration >>> 8) & 0xff, duration & 0xff,\n (size >>> 24) & 0xff, (size >>> 16) & 0xff, (size >>> 8) & 0xff, size & 0xff,\n (flag.isLeading << 2) | (flag.dependsOn === null || flag.dependsOn === undefined ? 1 : flag.dependsOn),\n (flag.isDependedOn << 6) | (flag.hasRedundancy << 4) | (flag.paddingValue << 1) | (flag.isNonSyncSample === null || flag.isNonSyncSample === undefined ? 1 : flag.isNonSyncSample),\n flag.degradationPriority & (0xf0 << 8), flag.degradationPriority & 0x0f, // sample_flags\n (cts >>> 24) & 0xff, (cts >>> 16) & 0xff, (cts >>> 8) & 0xff, cts & 0xff // sample_composition_time_offset\n ], 12 + 16 * i)\n }\n\n return MP4.box(MP4.types.trun, data)\n }\n\n static moovMP4 (tracks) {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].duration, tracks[0].timescale),\n ...tracks.map((t) => MP4.trackMP4(t)))\n }\n\n static trackMP4 (track) {\n return MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.duration, track.width, track.height),\n MP4.mdiaMP4(track)\n )\n }\n\n static mdiaMP4 (track) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minfMP4(track))\n }\n\n static minfMP4 (track) {\n return MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stblMP4(track))\n }\n\n static stblMP4 (track) {\n const { ext } = track\n const boxes = [\n MP4.stsd(track),\n MP4.stts(ext.stts),\n MP4.stsc(ext.stsc),\n MP4.stsz(ext.stsz),\n MP4.stco(ext.stco)\n ]\n\n if (ext.stss.length) {\n boxes.push(MP4.stss(ext.stss))\n }\n\n if (ext.ctts.length) {\n boxes.push(MP4.ctts(ext.ctts))\n }\n\n return MP4.box(MP4.types.stbl, ...boxes)\n }\n\n static stts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n\n return MP4.box(MP4.types.stts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsc (entries) {\n const len = entries.length\n const data = new Uint8Array(12 * len)\n let offset = 0\n entries.forEach(({ firstChunk, samplesPerChunk, sampleDescIndex }) => {\n data.set([\n firstChunk >> 24, (firstChunk >> 16) & 0xff, (firstChunk >> 8) & 0xff, firstChunk & 0xff,\n samplesPerChunk >> 24, (samplesPerChunk >> 16) & 0xff, (samplesPerChunk >> 8) & 0xff, samplesPerChunk & 0xff,\n sampleDescIndex >> 24, (sampleDescIndex >> 16) & 0xff, (sampleDescIndex >> 8) & 0xff, sampleDescIndex & 0xff\n ], offset)\n offset += 12\n })\n return MP4.box(MP4.types.stsc, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsz (samplesSizes) {\n const len = samplesSizes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n samplesSizes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stsz, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stco (offsets) {\n const len = offsets.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n offsets.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stco, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stss (keyframeIndexes) {\n const len = keyframeIndexes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n keyframeIndexes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stss, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static ctts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n return MP4.box(MP4.types.ctts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static styp () {\n return MP4.box(MP4.types.styp, new Uint8Array([\n 0x6D, 0x73, 0x64, 0x68,\n 0x00, 0x00, 0x00, 0x00,\n 0x6D, 0x73, 0x64, 0x68,\n 0x6D, 0x73, 0x69, 0x78\n ]))\n }\n\n // data.sampleOffset 指的是samples的序列号。_samples[0].idx\n static sidx (data) {\n // const buffer = new Buffer()\n const timescale = data.timescale\n const duration = data.samples[0].duration\n const durationCount = duration * data.samples.length\n const earliestTime = data.samples[0].sampleOffset * duration\n let mdatSize = 8\n data.samples.forEach(item => {\n mdatSize += item.size\n })\n let length = 0\n if (data.isVideo) {\n let sencLength = 0\n let samples\n if (data.videoSenc) {\n samples = data.videoSenc\n }\n if (data.isVideo) {\n samples.forEach(item => {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n data.videoSencLength = sencLength\n length = mdatSize + 141 + data.samples.length * 16 + sencLength\n if (data.useEME && data.isAudioEncryption && !data.isVideoEncryption) {\n length = mdatSize + (data.samples.length * 16) + 84\n }\n } else {\n length = mdatSize + 116 + data.samples.length * 12\n if (data.useEME && data.isAudioEncryption) {\n length = mdatSize + 169 + data.samples.length * 12 + 8 * data.audioSenc.length\n }\n }\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, data.id & 0xff, // ref_id\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n (earliestTime >> 24) & 0xff,\n (earliestTime >> 16) & 0xff,\n (earliestTime >> 8) & 0xff,\n earliestTime & 0xff, // earliest_presentation_time\n 0x00, 0x00, 0x00, 0x00, // first_offset\n 0x00, 0x00, // reserved\n 0x00, 0x01, // ref_count\n // 0x00, 0x04, 0x11, 0xCF, // ref_size + ref_type\n // 0x00, 0x01, 0x0A, 0xA6, // ref_size + ref_type\n 0x00, // ref_size + ref_type ref_size = moof.size + mdat.size\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff,\n (durationCount >> 24) & 0xff,\n (durationCount >> 16) & 0xff,\n (durationCount >> 8) & 0xff,\n durationCount & 0xff,\n 0x90, 0x00, 0x00, 0x00\n ])\n return MP4.box(MP4.types.sidx, content)\n }\n\n static mdat (data) {\n const mdat = MP4.box(MP4.types.mdat, data)\n // console.log('[remux],mdat ,len ', mdat.byteLength, hashVal(mdat.toString()))\n return mdat\n }\n}\n","\nexport class Logger {\n constructor (name, enable) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n Logger.disabled = enable\n }\n\n debug (...args) {\n if (Logger.disabled) return\n console.debug(this._prefix, ...args)\n }\n\n log (...args) {\n if (Logger.disabled) return\n console.log(this._prefix, ...args)\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n error (...args) {\n if (Logger.disabled) return\n console.error(this._prefix, ...args)\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","import {\n WordArray,\n Hasher,\n} from './core.js';\n\n// Constants table\nconst T = [];\n\n// Compute constants\nfor (let i = 0; i < 64; i += 1) {\n T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n}\n\nconst FF = (a, b, c, d, x, s, t) => {\n const n = a + ((b & c) | (~b & d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst GG = (a, b, c, d, x, s, t) => {\n const n = a + ((b & d) | (c & ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst HH = (a, b, c, d, x, s, t) => {\n const n = a + (b ^ c ^ d) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst II = (a, b, c, d, x, s, t) => {\n const n = a + (c ^ (b | ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\n/**\n * MD5 hash algorithm.\n */\nexport class MD5Algo extends Hasher {\n _doReset() {\n this._hash = new WordArray([\n 0x67452301,\n 0xefcdab89,\n 0x98badcfe,\n 0x10325476,\n ]);\n }\n\n _doProcessBlock(M, offset) {\n const _M = M;\n\n // Swap endian\n for (let i = 0; i < 16; i += 1) {\n // Shortcuts\n const offset_i = offset + i;\n const M_offset_i = M[offset_i];\n\n _M[offset_i] = (\n (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)\n | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n );\n }\n\n // Shortcuts\n const H = this._hash.words;\n\n const M_offset_0 = _M[offset + 0];\n const M_offset_1 = _M[offset + 1];\n const M_offset_2 = _M[offset + 2];\n const M_offset_3 = _M[offset + 3];\n const M_offset_4 = _M[offset + 4];\n const M_offset_5 = _M[offset + 5];\n const M_offset_6 = _M[offset + 6];\n const M_offset_7 = _M[offset + 7];\n const M_offset_8 = _M[offset + 8];\n const M_offset_9 = _M[offset + 9];\n const M_offset_10 = _M[offset + 10];\n const M_offset_11 = _M[offset + 11];\n const M_offset_12 = _M[offset + 12];\n const M_offset_13 = _M[offset + 13];\n const M_offset_14 = _M[offset + 14];\n const M_offset_15 = _M[offset + 15];\n\n // Working varialbes\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n\n // Computation\n a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n a = II(a, b, c, d, M_offset_0, 6, T[48]);\n d = II(d, a, b, c, M_offset_7, 10, T[49]);\n c = II(c, d, a, b, M_offset_14, 15, T[50]);\n b = II(b, c, d, a, M_offset_5, 21, T[51]);\n a = II(a, b, c, d, M_offset_12, 6, T[52]);\n d = II(d, a, b, c, M_offset_3, 10, T[53]);\n c = II(c, d, a, b, M_offset_10, 15, T[54]);\n b = II(b, c, d, a, M_offset_1, 21, T[55]);\n a = II(a, b, c, d, M_offset_8, 6, T[56]);\n d = II(d, a, b, c, M_offset_15, 10, T[57]);\n c = II(c, d, a, b, M_offset_6, 15, T[58]);\n b = II(b, c, d, a, M_offset_13, 21, T[59]);\n a = II(a, b, c, d, M_offset_4, 6, T[60]);\n d = II(d, a, b, c, M_offset_11, 10, T[61]);\n c = II(c, d, a, b, M_offset_2, 15, T[62]);\n b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n // Intermediate hash value\n H[0] = (H[0] + a) | 0;\n H[1] = (H[1] + b) | 0;\n H[2] = (H[2] + c) | 0;\n H[3] = (H[3] + d) | 0;\n }\n /* eslint-ensable no-param-reassign */\n\n _doFinalize() {\n // Shortcuts\n const data = this._data;\n const dataWords = data.words;\n\n const nBitsTotal = this._nDataBytes * 8;\n const nBitsLeft = data.sigBytes * 8;\n\n // Add padding\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n const nBitsTotalL = nBitsTotal;\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n );\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n );\n\n data.sigBytes = (dataWords.length + 1) * 4;\n\n // Hash final blocks\n this._process();\n\n // Shortcuts\n const hash = this._hash;\n const H = hash.words;\n\n // Swap endian\n for (let i = 0; i < 4; i += 1) {\n // Shortcut\n const H_i = H[i];\n\n H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)\n | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n }\n\n // Return final computed hash\n return hash;\n }\n\n clone() {\n const clone = super.clone.call(this);\n clone._hash = this._hash.clone();\n\n return clone;\n }\n}\n\n/**\n * Shortcut function to the hasher's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n *\n * @return {WordArray} The hash.\n *\n * @static\n *\n * @example\n *\n * var hash = CryptoJS.MD5('message');\n * var hash = CryptoJS.MD5(wordArray);\n */\nexport const MD5 = Hasher._createHelper(MD5Algo);\n\n/**\n * Shortcut function to the HMAC's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n * @param {WordArray|string} key The secret key.\n *\n * @return {WordArray} The HMAC.\n *\n * @static\n *\n * @example\n *\n * var hmac = CryptoJS.HmacMD5(message, key);\n */\nexport const HmacMD5 = Hasher._createHmacHelper(MD5Algo);\n","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n\n let mdatSize = 0\n\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n\n const mdata = new Uint8Array(mdatSize)\n const mdatView = new DataView(mdata.buffer)\n\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","/**\n * A noop padding strategy.\n */\nexport const NoPadding = {\n pad() {\n },\n\n unpad() {\n },\n};\n","import { WordArray, Hex } from 'crypto-es/lib/core'\nimport { CipherParams } from 'crypto-es/lib/cipher-core'\nimport { AES } from 'crypto-es/lib/aes'\nimport { CTR } from 'crypto-es/lib/mode-ctr'\nimport { NoPadding } from 'crypto-es/lib/pad-nopadding'\nimport { formatIV } from '../../utils'\nimport Buffer from '../buffer'\n\nconst Crypto = {\n\n decryptWordArray: function (raw, key, iv) {\n const realKey = Hex.parse(key)\n\n const realIV = Hex.parse(formatIV(iv))\n const message = WordArray.create(new Uint8Array(raw))\n const decryptWord = AES.decrypt(\n CipherParams.create({\n ciphertext: message\n }),\n realKey,\n {\n iv: realIV,\n mode: CTR,\n padding: NoPadding\n }\n )\n return Crypto.wordArrayToUint8Array(decryptWord)\n },\n wordArrayToUint8Array: function (wordArray) {\n const l = wordArray.sigBytes\n const words = wordArray.words\n const result = new Uint8Array(l)\n let i = 0\n let j = 0\n while (true) {\n if (i === l) { break }\n const w = words[j++]\n result[i++] = (w & 0xff000000) >>> 24\n if (i === l) { break }\n result[i++] = (w & 0x00ff0000) >>> 16\n if (i === l) { break }\n result[i++] = (w & 0x0000ff00) >>> 8\n if (i === l) { break }\n result[i++] = (w & 0x000000ff)\n }\n return result\n },\n\n decoderAESCTRData (videoTrack, audioTrack, customDescryptHandler) {\n if (videoTrack.videoSenc) {\n const key = videoTrack.kidValue\n const senc = videoTrack.videoSenc\n videoTrack.samples.forEach((item, index) => {\n const sencBox = senc[index]\n let encodeWord = item.data\n const encodeBuffers = []\n const decodeBuffers = []\n const iv = sencBox.InitializationVector\n if (sencBox.subsamples && sencBox.subsamples.length) {\n sencBox.subsamples.forEach(function (value) {\n const len = value.BytesOfClearData + value.BytesOfProtectedData\n const sampleData = encodeWord.slice(0, len)\n encodeBuffers.push(sampleData.slice(0, value.BytesOfClearData))\n decodeBuffers.push(sampleData.slice(value.BytesOfClearData))\n encodeWord = encodeWord.slice(len)\n })\n } else {\n const len = item.size\n encodeBuffers.push(encodeWord.slice(0, 0))\n decodeBuffers.push(encodeWord.slice(0, len))\n encodeWord = encodeWord.slice(len)\n }\n const tempBuffer = new Buffer()\n tempBuffer.write(...decodeBuffers)\n let decrypted = customDescryptHandler ? customDescryptHandler(tempBuffer.buffer, key, iv) : Crypto.decryptWordArray(tempBuffer.buffer, key, iv)\n const buffer = new Buffer()\n encodeBuffers.forEach((clearDataBuf, i) => {\n const protectedDataLen = decodeBuffers[i].length\n const decodeProtectedData = decrypted.slice(0, protectedDataLen)\n buffer.write(clearDataBuf)\n buffer.write(decodeProtectedData)\n decrypted = decrypted.slice(protectedDataLen)\n })\n videoTrack.samples[index].data = buffer.buffer\n })\n }\n\n if (audioTrack.audioSenc) {\n const key = audioTrack.kidValue\n const senc = audioTrack.audioSenc\n audioTrack.samples.forEach((item, index) => {\n const sencBox = senc[index]\n const dec = customDescryptHandler ? customDescryptHandler(item.data, key, sencBox.InitializationVector) : Crypto.decryptWordArray(item.data, key, sencBox.InitializationVector)\n audioTrack.samples[index].data = dec\n })\n }\n }\n}\n\nexport default Crypto\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample } from '../model'\nimport { readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\nimport { Logger } from './logger'\nimport Crypto from './crypto/crypto'\nconst NEW_ARRAY_MAX_CNT = 20\nexport class MP4Demuxer {\n _videoSamples = []\n _audioSamples = []\n _lastRemainBuffer = []\n _lastRemainBufferStartPos = 0\n\n constructor (videoSegmnents, audioSegmnents, metadataTrack, options) {\n this.videoTrack = new VideoTrack()\n this.audioTrack = new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this.log = new Logger('MP4Demuxer', options && options.openLog ? !options.openLog : true)\n\n videoSegmnents && videoSegmnents.forEach(item => {\n this._videoSamples.push(...item.frames)\n })\n audioSegmnents && audioSegmnents.forEach(item => {\n this._audioSamples.push(...item.frames)\n })\n }\n\n parseSamples (moov) {\n if (!moov) {\n throw new Error('moov is required')\n }\n if (!this.videoTrack.codec && !this.audioTrack.codec) {\n MP4Parser.moovToTrack(moov, this.videoTrack, this.audioTrack)\n this.videoSenc = this.videoTrack.videoSenc\n this.audioSenc = this.audioTrack.audioSenc\n }\n if (!this._audioSamples.length && !this._videoSamples.length) {\n const ret = MP4Parser.moovToSamples(moov)\n if (!ret) throw new Error('cannot parse samples from moov box')\n this._videoSamples = ret.videoSamples || []\n this._audioSamples = ret.audioSamples || []\n }\n }\n\n demux (data, dataStart, videoIndexRange, audioIndexRange, moov) {\n this.parseSamples(moov)\n\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n let sample\n let sampleData\n let startByte\n if (videoIndexRange) {\n let frame\n let nalSize = 0\n for (let i = videoIndexRange[0], l = videoIndexRange[1]; i <= l; i++) {\n sample = this._videoSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n startByte = sample.offset - dataStart\n sampleData = data.subarray(startByte, startByte + sample.size)\n frame = new VideoSample(sample.pts || sample.dts, sample.dts)\n frame.duration = sample.duration\n frame.gopId = sample.gopId\n if (sample.keyframe) frame.setToKeyframe()\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n frame.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(frame)\n }\n\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioIndexRange) {\n for (let i = audioIndexRange[0], l = audioIndexRange[1]; i <= l; i++) {\n sample = this._audioSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n startByte = sample.offset - dataStart\n sampleData = data.subarray(startByte, startByte + sample.size)\n audioTrack.samples.push(new AudioSample(sample.dts, sampleData, sample.duration))\n }\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].dts\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n demuxPart (data, dataStart, videoIndexRange, audioIndexRange, moov, useEME, kidValue, customDescryptHandler) {\n this.parseSamples(moov)\n\n this.videoTrack.useEME = useEME\n this.audioTrack.useEME = useEME\n // this.log.debug('[demuxPart start],dataStart,', dataStart, ',dataLen,', data.byteLength, ', lastRemain,', this._lastRemainBuffer ? this._lastRemainBuffer.byteLength : 0)\n if (this._lastRemainBuffer && this._lastRemainBuffer.byteLength > 0 && dataStart > this._lastRemainBufferStartPos && dataStart <= this._lastRemainBufferStartPos + this._lastRemainBuffer.byteLength) {\n let tryCnt = 0\n while (tryCnt < NEW_ARRAY_MAX_CNT) {\n try {\n const buffer = this._lastRemainBuffer.subarray(0, dataStart - this._lastRemainBufferStartPos)\n const temp = new Uint8Array(data.byteLength + buffer.byteLength)\n temp.set(buffer, 0)\n temp.set(new Uint8Array(data), buffer.byteLength)\n data = temp\n dataStart -= buffer.byteLength\n this._lastRemainBuffer = null\n this._lastRemainBufferStartPos = 0\n // this.log.debug('[demuxPart add lastRemain],dataStart,', dataStart, ',dataLen,', data.byteLength)\n break\n } catch (e) {\n if (tryCnt < NEW_ARRAY_MAX_CNT) {\n tryCnt++\n } else {\n throw new Error('new Uint8Array error:,' + e.errorMessage)\n }\n }\n }\n }\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n videoTrack.samples = []\n audioTrack.samples = []\n videoTrack.videoSenc = null\n audioTrack.audioSenc = null\n\n let sample\n let sampleData\n let startByte\n let videoEndByte = 0\n let audioEndByte = 0\n if (this._videoSamples.length > 0 && videoIndexRange.length > 0) {\n let frame\n const end = data.byteLength + dataStart\n for (let i = videoIndexRange[0]; i <= videoIndexRange[1]; i++) {\n sample = this._videoSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n if (sample.offset >= dataStart && sample.offset + sample.size <= end) {\n startByte = sample.offset - dataStart\n videoEndByte = startByte + sample.size\n sampleData = data.subarray(startByte, videoEndByte)\n frame = new VideoSample(sample.pts || sample.dts, sample.dts)\n frame.duration = sample.duration\n // this.log.debug('[video !!!!!!!!],frame,index,', sample.index, ',segmentIdx', segmentIdx, ', dataStart,', dataStart, ',dataEnd', end, ',Samplestart,', sample.offset, ', SampleEnd,', sample.offset + sample.size, ',size,', sample.size, 'dts,', sample.dts, ',pts,', sample.pts, ', keyframe', sample.keyframe)\n frame.gopId = sample.gopId\n frame.sampleOffset = sample.index\n // frame.timeOffset = sample.timeOffset || sample.timeOffset === 0 ? sample.timeOffset : null\n if (sample.keyframe) frame.setToKeyframe()\n frame.data = sampleData\n frame.size = sample.size\n // this.log.debug('[demux video frame],frame,index,', sample.index, ', size,', sampleData.byteLength, ', hash ', hashVal(sampleData.toString()))\n videoTrack.samples.push(frame)\n }\n }\n if (videoTrack.samples.length > 0) {\n videoTrack.gopId = videoTrack.samples[0].gopId\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n videoTrack.startPts = videoTrack.samples[0].pts / videoTrack.timescale\n videoTrack.endPts = videoTrack.samples[videoTrack.samples.length - 1].pts / videoTrack.timescale\n // this.log.debug('[demux video],frame,startPts,', videoTrack.startPts, ', endPts,', videoTrack.endPts)\n if (this.videoSenc) {\n videoTrack.videoSenc = this.videoSenc.slice(videoTrack.samples[0].sampleOffset, videoTrack.samples[0].sampleOffset + videoTrack.samples.length)\n videoTrack.kidValue = kidValue\n }\n }\n }\n if (this._audioSamples.length > 0 && audioIndexRange.length > 0) {\n for (let i = audioIndexRange[0]; i <= audioIndexRange[1]; i++) {\n sample = this._audioSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n if (sample.offset >= dataStart && sample.offset + sample.size <= data.byteLength + dataStart) {\n startByte = sample.offset - dataStart\n audioEndByte = startByte + sample.size\n sampleData = data.subarray(startByte, audioEndByte)\n // this.log.debug('[audio !!!!!!!!],audio frame,index,', sample.index, ',segmentIdx', segmentIdx, ', Samplestart,', sample.offset, ', SampleEnd,', sample.offset + sample.size, ',size,', sample.size, 'dts,', sample.dts, ',pts,', sample.pts || sample.dts)\n // frame.gopId = sample.gopId\n // this.log.debug('[demux audio frame],index ,', sample.index, ', size,', sampleData.byteLength, ', hash,', hashVal(sampleData.toString()))\n audioTrack.samples.push(new AudioSample(sample.dts, sampleData, sample.duration, sample.index))\n }\n }\n if (audioTrack.samples.length > 0) {\n audioTrack.gopId = audioTrack.samples[0].gopId || videoTrack.gopId\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].dts\n audioTrack.startPts = audioTrack.samples[0].pts / audioTrack.timescale\n audioTrack.endPts = audioTrack.samples[audioTrack.samples.length - 1].pts / audioTrack.timescale\n // this.log.debug('[demux audio],frame,startPts,', audioTrack.startPts, ', endPts,', audioTrack.endPts)\n if (this.audioSenc) {\n audioTrack.audioSenc = this.audioSenc.slice(audioTrack.samples[0].sampleOffset, audioTrack.samples[0].sampleOffset + audioTrack.samples.length)\n audioTrack.kidValue = kidValue\n }\n }\n }\n this.decoderData(videoTrack, audioTrack, customDescryptHandler)\n let nalSize = 0\n for (let i = 0; i < videoTrack.samples.length; i++) {\n let start = 0\n const sampleData = videoTrack.samples[i].data\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n videoTrack.samples[i].units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n }\n this._lastRemainBuffer = data.subarray(Math.max(videoEndByte, audioEndByte))\n if (this._lastRemainBuffer.byteLength > 0) {\n this._lastRemainBufferStartPos = dataStart + data.byteLength - this._lastRemainBuffer.byteLength\n } else {\n this._lastRemainBufferStartPos = 0\n }\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this._videoSamples = []\n this._audioSamples = []\n this._lastRemainBuffer = null\n this._lastRemainBufferStartPos = 0\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n decoderData (videoTrack, audioTrack, customDescryptHandler) {\n if (videoTrack.useEME || audioTrack.useEME) return\n Crypto.decoderAESCTRData(videoTrack, audioTrack, customDescryptHandler)\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","/**\n * @type {string}\n * */\nexport default __VERSION__\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","export class Buffer {\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static start (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n // Edge bug: https://bit.ly/2JYLPeB\n if (buf.length === 1 && buf.start(0) < 0) return 0\n\n return buf.start(0)\n }\n\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static end (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n\n return buf.end(buf.length - 1)\n }\n\n /**\n * @param {{buffered?: TimeRanges}} b\n * @returns {TimeRanges | void}\n */\n static get (b) {\n if (!b) return\n try {\n return b.buffered\n } catch (error) {\n // ignore\n }\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {[number,number][]}\n */\n static buffers (buf, maxHole) {\n if (!buf || !buf.length) return []\n\n const buffers = []\n for (let i = 0, l = buf.length; i < l; i++) {\n const bufLen = buffers.length\n if (!bufLen || !maxHole) {\n buffers.push([buf.start(i), buf.end(i)])\n } else {\n const last = buffers[bufLen - 1]\n const lastEnd = last[1]\n const start = buf.start(i)\n if (start - lastEnd <= maxHole) {\n const end = buf.end(i)\n if (end > lastEnd) {\n last[1] = end\n }\n } else {\n buffers.push([buf.start(i), buf.end(i)])\n }\n }\n }\n return buffers\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {{buffers:[number,number][],length:number}}\n */\n static totalLength (buffers) {\n if (!buffers || !buffers.length) return 0\n return buffers.reduce((a, c) => (a += (c[1] - c[0])), 0)\n }\n\n /**\n *\n * @param {TimeRanges} buf\n * @param {number} [pos=0]\n * @param {number} [maxHole=0]\n * @returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}\n */\n static info (buf, pos = 0, maxHole = 0) {\n if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }\n\n let start = 0\n let end = 0\n let index = 0\n let nextStart = 0\n let nextEnd = 0\n let prevStart = 0\n let prevEnd = 0\n const buffers = Buffer.buffers(buf, maxHole)\n\n for (let i = 0, l = buffers.length; i < l; i++) {\n const item = buffers[i]\n if (pos + maxHole >= item[0] && pos <= item[1]) {\n start = item[0]\n end = item[1]\n index = i\n } else if (pos + maxHole < item[0]) {\n nextStart = item[0]\n nextEnd = item[1]\n break\n } else if (pos + maxHole > item[1]) {\n prevStart = item[0]\n prevEnd = item[1]\n }\n }\n\n return {\n start,\n end,\n index,\n buffers,\n nextStart,\n nextEnd,\n prevStart,\n prevEnd,\n currentTime: pos,\n behind: pos - start,\n remaining: end ? end - pos : 0,\n length: Buffer.totalLength && Buffer.totalLength(buffers)\n }\n }\n}\n","export const ERR = {\n MANIFEST: 'manifest',\n NETWORK: 'network',\n NETWORK_TIMEOUT: 'network_timeout',\n NETWORK_FORBIDDEN:'network_forbidden',\n NETWORK_NOTFOUND: 'network_notfound',\n NETWROK_RANGE_NOT_SATISFIABLE:'network_range_not_satisfiable',\n DEMUX: 'demux',\n REMUX: 'remux',\n MEDIA: 'media',\n DRM: 'drm',\n OTHER: 'other',\n RUNTIME:'runtime',\n\n SUB_TYPES: {\n FLV: 'FLV',\n HLS: 'HLS',\n MP4: 'MP4',\n FMP4: 'FMP4',\n MSE_ADD_SB: 'MSE_ADD_SB',\n MSE_APPEND_BUFFER: 'MSE_APPEND_BUFFER',\n MSE_OTHER: 'MSE_OTHER',\n MSE_FULL: 'MSE_FULL',\n OPTION: 'OPTION',\n DASH:'DASH',\n LICENSE:'LICENSE',\n CUSTOM_LICENSE:'CUSTOM_LICENSE',\n MSE_HIJACK:'MSE_HIJACK',\n EME_HIJACK:'EME_HIJACK',\n SIDX:'SIDX',\n NO_CANPLAY_ERROR:'NO_CANPLAY_ERROR',\n BUFFERBREAK_ERROR:'BUFFERBREAK_ERROR',\n WAITING_TIMEOUT_ERROR: 'WAITING_TIMEOUT_ERROR',\n MEDIA_ERR_ABORTED:'MEDIA_ERR_ABORTED',\n MEDIA_ERR_NETWORK:'MEDIA_ERR_NETWORK',\n MEDIA_ERR_DECODE:'MEDIA_ERR_DECODE',\n MEDIA_ERR_SRC_NOT_SUPPORTED:'MEDIA_ERR_SRC_NOT_SUPPORTED',\n MEDIA_ERR_CODEC_NOT_SUPPORTED:'MEDIA_ERR_CODEC_NOT_SUPPORTED',\n MEDIA_ERR_URL_EMPTY:'MEDIA_ERR_URL_EMPTY'\n }\n}\n\nexport const ERR_CODE = {\n [ERR.MANIFEST]: {\n HLS: 1100,\n DASH:1200\n },\n [ERR.NETWORK]: 2100,\n [ERR.NETWORK_TIMEOUT]: 2101,\n [ERR.NETWORK_FORBIDDEN]:2103,\n [ERR.NETWORK_NOTFOUND]:2104,\n [ERR.NETWROK_RANGE_NOT_SATISFIABLE]:2116,\n [ERR.DEMUX]: {\n FLV: 3100,\n HLS: 3200,\n MP4: 3300,\n FMP4: 3400,\n SIDX: 3410\n },\n [ERR.REMUX]: {\n FMP4: 4100,\n MP4: 4200\n },\n [ERR.MEDIA]: {\n MEDIA_ERR_ABORTED: 5101,\n MEDIA_ERR_NETWORK: 5102,\n MEDIA_ERR_DECODE: 5103,\n MEDIA_ERR_SRC_NOT_SUPPORTED: 5104,\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 5105,\n MEDIA_ERR_URL_EMPTY: 5106,\n MSE_ADD_SB: 5200,\n MSE_APPEND_BUFFER: 5201,\n MSE_OTHER: 5202,\n MSE_FULL: 5203,\n MSE_HIJACK:5204,\n EME_HIJACK:5301\n },\n [ERR.DRM]:{\n LICENSE:7100,\n CUSTOM_LICENSE:7200\n },\n [ERR.OTHER]: 8000,\n [ERR.RUNTIME]:{\n NO_CANPLAY_ERROR:9001,\n BUFFERBREAK_ERROR:9002,\n WAITING_TIMEOUT_ERROR:9003\n }\n}\n\n\n\nexport class StreamingError extends Error {\n constructor (type, subType, origin, payload, msg) {\n super(msg || origin?.message)\n this.errorType = type === ERR.NETWORK_TIMEOUT ? ERR.NETWORK : type\n this.originError = origin\n this.ext = payload\n this.errorCode = ERR_CODE[type][subType] || ERR_CODE[type]\n this.errorMessage = this.message\n if (!this.errorCode) {\n this.errorType = ERR.OTHER\n this.errorCode = ERR_CODE[this.errorType]\n }\n }\n\n static create (type, subType, origin, payload, msg) {\n if (type instanceof StreamingError) {\n return type\n } else if (type instanceof Error) {\n origin = type\n type = ''\n }\n\n if (!type) type = ERR.OTHER\n\n return new StreamingError(type, subType, origin, payload, msg)\n }\n\n static network (error) {\n return new StreamingError(\n error?.isTimeout ? ERR.NETWORK_TIMEOUT : ERR.NETWORK,\n null,\n error instanceof Error ? error : null,\n {\n url: error?.url,\n response: error?.response,\n httpCode: error?.response?.status\n }\n )\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n","\nexport const LogCacheLevel = {\n 'DEBUG': 1,\n 'LOG': 2,\n 'WARN': 3,\n 'ERROR': 4\n}\nconst LOG_MAX_SIZE = 200 * 1024\nconst SIMPLE_TYPE = ['Boolean', 'Number' ,'String', 'Undefined','Null', 'Date','Object']\nexport class Logger {\n constructor (name,config) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n this.logCacheLevel = config?.logCacheLevel || 3\n this.logMaxSize = config?.logMaxSize || LOG_MAX_SIZE\n this.logSize = 0\n this.logTextArray = []\n }\n\n debug (...args) {\n this.logCache(LogCacheLevel.DEBUG,...args)\n if (Logger.disabled) return\n console.debug(this._prefix, nowTime(), ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(this._prefix, nowTime(), ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(this._prefix, nowTime(), ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(this._prefix, nowTime(), ...args)\n }\n\n logCache (logCacheLevel, ...logText) {\n if (logCacheLevel < this.logCacheLevel) return\n let text = ''\n try {\n const finLogText = logText.map( item => logable(item))\n text = this._prefix + nowTime() + (JSON.stringify(finLogText))\n } catch (e) {\n return\n }\n if (logCacheLevel >= this.logCacheLevel) {\n this.logSize += text.length\n this.logTextArray.push(text)\n }\n if (this.logSize > this.logMaxSize) {\n const delLog = this.logTextArray.shift()\n this.logSize -= delLog.length\n }\n }\n\n getLogCache () {\n const logText = this.logTextArray.join('\\n')\n this.reset()\n return logText\n }\n\n reset () {\n this.logTextArray = []\n this.logSize = 0\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n\n setLogLevel (val) {\n this.logCacheLevel = val\n }\n}\nfunction nowTime () {\n return new Date().toLocaleString()\n}\n\nfunction reduceDepth (val) {\n if (typeof val !== 'object') {\n return val\n }\n const objType = Object.prototype.toString.call(val).slice(8, -1)\n switch (objType) {\n case 'Array':\n case 'Uint8Array':\n case 'ArrayBuffer':\n\n return objType + '[' + val.length + ']'\n case 'Object':\n return '{}'\n default:\n return objType\n }\n}\n\nfunction logable (obj, maxDepth, depth) {\n if (!depth) depth = 1\n if (!maxDepth) maxDepth = 2\n const result = {}\n\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n const objType = Object.prototype.toString.call(obj).slice(8, -1)\n if (!SIMPLE_TYPE.includes(objType)) {\n return objType\n }\n\n if (depth > maxDepth) {\n return undefined\n }\n\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (depth === maxDepth) {\n result[key] = reduceDepth(obj[key])\n } else if (typeof obj[key] === 'object') {\n result[key] = logable(obj[key], maxDepth, depth + 1)\n } else {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n","/* eslint-disable no-undef */\nimport { createPublicPromise, nowTime } from './utils'\nimport { Buffer } from './buffer'\nimport { StreamingError, ERR } from './error'\nimport { isBrowser } from './env'\nimport { Logger } from './logger'\n\nfunction getMediaSource () {\n try {\n return isBrowser ? window.MediaSource : null\n } catch (e) {}\n}\n\nconst MediaSource = getMediaSource()\n\n/** @enum {string} */\nexport const MSEErrorType = {\n UPDATE_ERROR: 'updateError'\n}\n\nconst OP_NAME = {\n APPEND: 'appendBuffer',\n REMOVE: 'removeBuffer',\n UPDATE_DURATION:'updateDuration'\n}\n\nexport class MSEError extends Error {\n /**\n * @param {MSEErrorType} type\n * @param {any} [msg]\n */\n constructor (type, msg) {\n super(msg || type)\n this.type = type\n this.msg = msg\n }\n}\n\nexport class MSE {\n /** @type { HTMLMediaElement | null } */\n media = null\n\n /** @type { MediaSource | null } */\n mediaSource = null\n\n _openPromise = createPublicPromise()\n\n _queue = Object.create(null)\n\n _sourceBuffer = Object.create(null)\n\n static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n _mseFullFlag = {}\n\n _st = 0\n\n _opst = 0\n\n _logger = null\n\n _config = null\n _url = null\n\n\n static getDefaultConfig () {\n return {\n openLog: false\n }\n }\n\n /**\n * @param {HTMLMediaElement} [media]\n */\n constructor (media, config) {\n this._config = Object.assign(MSE.getDefaultConfig(), config)\n if (media) this.bindMedia(media)\n this._logger = new Logger('MSE')\n if (this._config.openLog) {\n Logger.enable()\n }\n }\n\n get isOpened () {\n return this.mediaSource?.readyState === 'open'\n }\n\n get url () {\n return this._url\n }\n\n get duration () {\n return this.mediaSource?.duration || -1\n }\n\n get isEnded () {\n return this.mediaSource ? this.mediaSource.readyState === 'ended' : false\n }\n\n isFull (type) {\n return type ? this._mseFullFlag[type] : this._mseFullFlag[MSE.VIDEO]\n }\n\n /**\n * @param { number } duration\n * @return { Promise }\n */\n updateDuration (duration) {\n const isReduceDuration = this.mediaSource && this.mediaSource.duration > duration\n if (this.mediaSource && this.mediaSource.duration > duration) {\n let bufferEnd = 0\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n bufferEnd = Math.max(this.bufferEnd(k) || 0, bufferEnd)\n } catch (error) {\n // ignore\n }\n })\n if (duration < bufferEnd) {\n // 设置值比bufferEnd值小,会导致异常\n return Promise.resolve()\n }\n }\n\n return this._enqueueBlockingOp(() => {\n if (this.isEnded) {\n this._logger.debug('[debug mse] setDuration ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('[debug mse] setDuration')\n }\n }, OP_NAME.UPDATE_DURATION, {isReduceDuration})\n }\n\n /** @return { Promise } */\n open () {\n if (this._openPromise.used && !this.isOpened && this.mediaSource) {\n const ms = this.mediaSource\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN', costtime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @param { HTMLMediaElement } media\n * @return { Promise }\n */\n async bindMedia (media) {\n if (this.mediaSource || this.media) await this.unbindMedia()\n if (!media || !MediaSource) throw new Error('Param media or MediaSource does not exist')\n this.media = media\n const ms = this.mediaSource = new MediaSource()\n this._st = nowTime()\n\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n return this._openPromise\n }\n\n /** @return { Promise } */\n async unbindMedia () {\n if (!this._openPromise.used) this._openPromise.resolve()\n const ms = this.mediaSource\n\n if (ms) {\n Object.keys(this._queue).forEach((t) => {\n const queue = this._queue[t]\n if (queue) {\n queue.forEach(x => x.promise?.resolve?.())\n }\n })\n\n const hasMetadata = !!this.media && this.media.readyState >= 1\n const mseOpen = ms.readyState === 'open'\n\n if (hasMetadata && mseOpen) {\n try {\n ms.endOfStream()\n } catch (error) {\n // ignore\n }\n }\n\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n ms.removeSourceBuffer(this._sourceBuffer[k])\n } catch (error) {\n // ignore\n }\n })\n }\n\n if (this.media) {\n this.media.removeAttribute('src')\n try {\n this.media.load()\n } catch (error) {\n // ignore\n }\n this.media = null\n }\n\n this.mediaSource = null\n this._openPromise = createPublicPromise()\n this._queue = Object.create(null)\n this._sourceBuffer = Object.create(null)\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n */\n createSource (type, mimeType) {\n if (this._sourceBuffer[type] || !this.mediaSource) return\n let sb\n try {\n sb = this._sourceBuffer[type] = this.mediaSource.addSourceBuffer(mimeType)\n } catch (error) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_ADD_SB, error)\n }\n sb.mimeType = mimeType\n sb.addEventListener('updateend', this._onSBUpdateEnd.bind(this, type))\n sb.addEventListener('error', this._onSBUpdateError.bind(this, type))\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n changeType (type, mimeType) {\n const sb = this._sourceBuffer[type]\n if (!this.mediaSource || !sb || sb.mimeType === mimeType) return Promise.resolve()\n\n if (typeof sb.changeType !== 'function') return Promise.reject()\n\n return this._enqueueOp(type, () => {\n sb.changeType(mimeType)\n sb.mimeType = mimeType\n this._onSBUpdateEnd(type)\n }, 'changeType', {mimeType})\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n createOrChangeSource (type, mimeType) {\n this.createSource(type, mimeType)\n return this.changeType(type, mimeType)\n }\n\n /**\n * @param { string } type\n * @param { BufferSource } buffer\n * @return { Promise }\n */\n append (type, buffer, context) {\n if (!buffer || !buffer.byteLength) {\n return Promise.resolve()\n }\n\n if (!this._sourceBuffer[type]) return Promise.resolve()\n\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n this._logger.debug('MSE APPEND START', context)\n this._opst = nowTime()\n this._sourceBuffer[type]?.appendBuffer(buffer)\n }, OP_NAME.APPEND, context)\n\n }\n\n /**\n * @param { string } type\n * @param { number } startTime\n * @param { number } endTime\n * @return { Promise }\n */\n remove (type, startTime, endTime, context) {\n // if (Object.keys(this._sourceBuffer).length === 1) return Promise.resolve()\n let isInsertHead = false\n if (this._mseFullFlag[type]) {\n isInsertHead = true\n }\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[type]\n if (startTime >= endTime || !sb) {\n this._onSBUpdateEnd(type)\n return\n }\n this._opst = nowTime()\n this._logger.debug('MSE REMOVE START', type, startTime, endTime, context)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE, context, isInsertHead)\n }\n\n clearBuffer (startTime, endTime) {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this.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 initOpque = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initOpque.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initOpque.length > 0 && this._queue[type].push(...initOpque)\n }\n\n /**\n * @param {EndOfStreamError} [reason]\n * @returns {Promise}\n */\n endOfStream (reason) {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open') return Promise.resolve()\n return this._enqueueBlockingOp(() => {\n const ms = this.mediaSource\n if (!ms || ms.readyState !== 'open') return\n this._logger.debug('MSE endOfStream START')\n if (reason) {\n ms.endOfStream(reason)\n } else {\n ms.endOfStream()\n }\n }, 'endOfStream')\n }\n\n setLiveSeekableRange (start, end) {\n const ms = this.mediaSource\n if (start < 0 || end < start || !ms?.setLiveSeekableRange || ms.readyState !== 'open') return\n ms.setLiveSeekableRange(start, end)\n }\n\n /**\n * @param {string} type\n * @returns {?SourceBuffer}\n */\n getSourceBuffer (type) {\n return this._sourceBuffer[type]\n }\n\n /**\n * @param { string } type\n * @return { TimeRanges | void }\n */\n buffered (type) {\n return Buffer.get(this._sourceBuffer[type])\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferStart (type) {\n return Buffer.start(this.buffered(type))\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferEnd (type) {\n return Buffer.end(this.buffered(type))\n }\n\n _enqueueOp (type, exec, opName, context, isInsertHead) {\n if (!this.mediaSource) return Promise.resolve()\n const queue = this._queue[type] = this._queue[type] || []\n const op = {\n exec,\n promise: createPublicPromise(),\n opName,\n context\n }\n\n if (isInsertHead) {\n queue.splice(0, 0, op)\n this._mseFullFlag[type] = false\n this._startQueue(type)\n } else {\n queue.push(op)\n }\n\n if (this.isOpened || this.isEnded) {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n } else {\n this._openPromise.then(() => {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n })\n }\n\n\n return op.promise\n }\n\n async _enqueueBlockingOp (exec, opName, context) {\n if (!this.mediaSource) return Promise.resolve()\n const types = Object.keys(this._sourceBuffer)\n if (!types.length) {\n return exec()\n }\n\n const waiters = []\n types.forEach(t => {\n const queue = this._queue[t]\n const prom = createPublicPromise()\n waiters.push(prom)\n queue.push({exec: () => {\n prom.resolve()}, promise: prom, opName, context})\n if (queue.length === 1) {\n this._startQueue(t)\n }\n })\n\n return Promise.all(waiters).then(() => {\n try {\n return exec()\n } finally {\n types.forEach(t => {\n const queue = this._queue[t]\n const sb = this._sourceBuffer[t]\n queue?.shift()\n if (!sb || !sb.updating) {\n this._startQueue(t)\n }\n })\n }\n })\n }\n\n _startQueue (type) {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op && !this._mseFullFlag[type]) {\n try {\n op.exec()\n } catch (error) {\n if (error && error.message && error.message.indexOf('SourceBuffer is full') >= 0) {\n this._mseFullFlag[type] = true\n this._logger.error('[MSE error], context,', op.context, ' ,name,', op.opName, ',err,SourceBuffer is full')\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_FULL, error))\n } else {\n this._logger.error(error)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error))\n queue.shift()\n this._startQueue(type)\n }\n }\n }\n }\n }\n\n _onSBUpdateEnd = (type) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (!(op?.opName === OP_NAME.UPDATE_DURATION)) {\n queue.shift()\n }\n if (op) {\n const costtime = nowTime() - this._opst\n this._logger.debug('UpdateEnd', op.opName, costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n this._startQueue(type)\n }\n }\n }\n\n _onSBUpdateError = (type, event) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op) {\n this._logger.error('UpdateError', type, op.opName, op.context)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_APPEND_BUFFER, event))\n // Do not shift from queue, 'updateend' event will fire next\n }\n }\n }\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (!MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n }\n\n setTimeoffset (type, timestampOffset, context) {\n return this._enqueueOp(type, () => {\n if (timestampOffset < 0) {\n timestampOffset += 0.001\n }\n this._sourceBuffer[type].timestampOffset = timestampOffset\n this._onSBUpdateEnd(type)\n }, 'setTimeoffset', context)\n }\n\n /** *重置decode时间戳 */\n abort (type, context) {\n if (!this.isOpened) {\n return Promise.resolve()\n }\n return this._enqueueOp(type, () => {\n this._sourceBuffer[type].abort()\n this._onSBUpdateEnd(type)\n }, 'abort', context)\n }\n}\n","export const LoaderType = {\n FETCH: 'fetch',\n XHR: 'xhr'\n}\n\nexport const ResponseType = {\n ARRAY_BUFFER: 'arraybuffer',\n TEXT: 'text',\n JSON: 'json'\n}\n","import { LoaderType } from './types'\n\nexport class NetError extends Error {\n retryCount = 0\n isTimeout = false\n loaderType = LoaderType.FETCH\n startTime = 0\n endTime = 0\n options = {}\n\n constructor (url, request, response, msg) {\n super(msg)\n this.url = url\n this.request = request\n this.response = response\n }\n}\n","const toString = Object.prototype.toString\n\nexport function isObject (a) {\n return a !== null && typeof a === 'object'\n}\n\nexport function isPlainObject (val) {\n if (toString.call(val) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(val)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isDate (a) {\n return toString.call(a) === '[object Date]'\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { isDate, isObject } from '../is'\n\nexport function getRangeValue (value) {\n if (!value || value[0] === null || value[0] === undefined || (value[0] === 0 && (value[1] === null || value[1] === undefined))) {\n return\n }\n let ret = 'bytes=' + value[0] + '-'\n if (value[1]) ret += value[1]\n return ret\n}\n\nfunction encode (val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\nexport function setUrlParams (url, params) {\n if (!url) return\n if (!params) return url\n let v\n const str = Object.keys(params).map(k => {\n v = params[k]\n if (v === null || v === undefined) return\n if (Array.isArray(v)) {\n k = k + '[]'\n } else {\n v = [v]\n }\n\n return v.map(x => {\n if (isDate(x)) {\n x = x.toISOString()\n } else if (isObject(x)) {\n x = JSON.stringify(x)\n }\n return `${encode(k)}=${encode(x)}`\n }).join('&')\n }).filter(Boolean).join('&')\n\n if (str) {\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex)\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + str\n }\n\n return url\n}\n\nexport function createResponse (\n data,\n done,\n response,\n contentLength,\n age,\n startTime,\n firstByteTime,\n index,\n range,\n vid,\n priOptions\n) {\n age = (age !== null && age !== undefined) ? parseFloat(age) : null\n contentLength = parseInt(contentLength || '0', 10)\n if (Number.isNaN(contentLength)) contentLength = 0\n const options = { range, vid, index, contentLength, age, startTime, firstByteTime, endTime: Date.now(), priOptions }\n return { data, done, options, response }\n}\n\nexport function calculateSpeed (byteLen, millisec) {\n return Math.round(byteLen * 8 * 1000 / millisec / 1024)\n}\n","export const EVENT = {\n ERROR: 'error',\n\n TTFB: 'core.ttfb',\n LOAD_START: 'core.loadstart',\n LOAD_RESPONSE_HEADERS: 'core.loadresponseheaders',\n LOAD_COMPLETE: 'core.loadcomplete',\n LOAD_RETRY: 'core.loadretry',\n SOURCEBUFFER_CREATED: 'core.sourcebuffercreated',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n METADATA_PARSED: 'core.metadataparsed',\n SEI: 'core.sei',\n SEI_IN_TIME: 'core.seiintime',\n FLV_SCRIPT_DATA: 'core.flvscriptdata',\n LOWDECODE: 'core.lowdecode',\n SWITCH_URL_SUCCESS: 'core.switchurlsuccess',\n SWITCH_URL_FAILED: 'core.switchurlfailed',\n SPEED: 'core.speed',\n HLS_MANIFEST_LOADED: 'core.hlsmanifestloaded',\n HLS_LEVEL_LOADED: 'core.hlslevelloaded',\n DEMUXED_TRACK:'core.demuxedtrack',\n\n STREAM_EXCEPTION: 'core.streamexception',\n LARGE_AV_FIRST_FRAME_GAP_DETECT: 'LARGE_AV_FIRST_FRAME_GAP_DETECT',\n LARGE_VIDEO_DTS_GAP_DETECT: 'LARGE_VIDEO_DTS_GAP_DETECT',\n LARGE_AUDIO_DTS_GAP_DETECT: 'LARGE_AUDIO_DTS_GAP_DETECT',\n AUDIO_GAP_DETECT: 'AUDIO_GAP_DETECT',\n AUDIO_OVERLAP_DETECT: 'AUDIO_OVERLAP_DETECT',\n MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT: 'MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT',\n REAL_TIME_SPEED: 'real_time_speed'\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nconst CACHESIZE = 2 * 1024 * 1024\nexport class FetchLoader extends EventEmitter {\n _abortController = null\n _timeoutTimer = null\n _reader = null\n _response = null\n _aborted = false\n _index = -1\n _range = null\n _receivedLength = 0\n _running = false\n _logger = null\n _vid = ''\n _onProcessMinLen = 0\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n constructor () {\n super()\n }\n\n load ({\n url,\n vid,\n timeout, // ms\n responseType,\n onProgress,\n index,\n onTimeout,\n onCancel,\n range,\n transformResponse,\n request,\n params,\n logger,\n\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n onProcessMinLen,\n priOptions\n }) {\n this._logger = logger\n this._aborted = false\n this._onProcessMinLen = onProcessMinLen\n this._onCancel = onCancel\n this._abortController = typeof AbortController !== 'undefined' && new AbortController()\n this._running = true\n this._index = index\n this._range = range || [0, 0]\n this._vid = vid || url\n this._priOptions = priOptions || {}\n const init = {\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n signal: this._abortController?.signal\n }\n\n let isTimeout = false\n clearTimeout(this._timeoutTimer)\n\n url = setUrlParams(url, params)\n\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n if (request) {\n headers = request.headers\n } else {\n headers = init.headers = init.headers || (Headers ? new Headers() : {})\n }\n if (Headers && headers instanceof Headers) {\n headers.append('Range', rangeValue)\n } else {\n headers.Range = rangeValue\n }\n }\n\n if (timeout) {\n this._timeoutTimer = setTimeout(() => {\n isTimeout = true\n this.cancel()\n if (onTimeout) {\n const error = new NetError(url, init, null, 'timeout')\n error.isTimeout = true\n onTimeout(error, {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }, timeout)\n }\n\n const startTime = Date.now()\n this._logger.debug('[fetch load start], index,', index, ',range,', range)\n return new Promise((resolve, reject) => {\n fetch(request || url, request ? undefined : init).then(async (response) => {\n clearTimeout(this._timeoutTimer)\n this._response = response\n if (this._aborted || !this._running) return\n if (transformResponse) {\n response = transformResponse(response, url) || response\n }\n if (!response.ok) {\n throw new NetError(url, init, response, 'bad network response')\n }\n\n const firstByteTime = Date.now()\n let data\n if (responseType === ResponseType.TEXT) {\n data = await response.text()\n this._running = false\n } else if (responseType === ResponseType.JSON) {\n data = await response.json()\n this._running = false\n } else {\n if (onProgress) {\n this.resolve = resolve\n this.reject = reject\n this._loadChunk(response, onProgress, startTime, firstByteTime)\n return\n } else {\n data = await response.arrayBuffer()\n data = new Uint8Array(data)\n this._running = false\n const costTime = Date.now() - startTime\n const speed = calculateSpeed(data.byteLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: data.byteLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n }\n }\n this._logger.debug('[fetch load end], index,', index, ',range,', range)\n resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n startTime,\n firstByteTime,\n index,\n range,\n this._vid,\n this._priOptions\n ))\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._running = false\n if (this._aborted && !isTimeout) return\n error = error instanceof NetError ? error : new NetError(url, init, null, error?.message)\n error.startTime = startTime\n error.endTime = Date.now()\n error.isTimeout = isTimeout\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n reject(error)\n })\n })\n }\n\n async cancel () {\n if (this._aborted) return\n this._aborted = true\n this._running = false\n if (this._response) {\n try {\n // await this._response.body.cancel()\n if (this._reader) {\n await this._reader.cancel()\n }\n } catch (error) {\n // ignore\n }\n this._response = this._reader = null\n }\n\n if (this._abortController) {\n try {\n this._abortController.abort()\n } catch (error) {\n // ignore\n }\n this._abortController = null\n }\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }\n\n _loadChunk (response, onProgress, st, firstByteTime) {\n if (!response.body || !response.body.getReader) {\n this._running = false\n const err = new NetError(response.url, '', response, 'onProgress of bad response.body.getReader')\n err.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(err)\n return\n }\n if (this._onProcessMinLen > 0) {\n this._cache = new Uint8Array(CACHESIZE)\n this._writeIdx = 0\n }\n const reader = this._reader = response.body.getReader()\n let data\n\n let startTime\n let endTime\n const pump = async () => {\n startTime = Date.now()\n try {\n data = await reader.read()\n endTime = Date.now()\n } catch (e) {\n // request aborted\n endTime = Date.now()\n if (!this._aborted) {\n this._running = false\n e.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(e)\n }\n return\n }\n const startRange = this._range?.length > 0 ? this._range[0] : 0\n const startByte = startRange + this._receivedLength\n if (this._aborted) {\n this._running = false\n onProgress(undefined, false, { range: [startByte, startByte], vid: this._vid, index: this._index, startTime, endTime, st, firstByteTime, priOptions:this._priOptions }, response)\n return\n }\n const curLen = data.value ? data.value.byteLength : 0\n this._receivedLength += curLen\n this._logger.debug('【fetchLoader,onProgress call】,task,', this._range, ', start,', startByte, ', end,', startRange + this._receivedLength, ', done,', data.done)\n let retData\n if (this._onProcessMinLen > 0) {\n if (this._writeIdx + curLen >= this._onProcessMinLen || data.done) {\n retData = new Uint8Array(this._writeIdx + curLen)\n retData.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && retData.set(data.value, this._writeIdx)\n this._writeIdx = 0\n this._logger.debug('【fetchLoader,onProgress enough】,done,', data.done, ',len,', retData.byteLength, ', writeIdx,', this._writeIdx)\n } else {\n if (curLen > 0 && this._writeIdx + curLen < CACHESIZE) {\n this._cache.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n this._logger.debug('【fetchLoader,onProgress cache】,len,', curLen, ', writeIdx,', this._writeIdx)\n } else if (curLen > 0) {\n const temp = new Uint8Array(this._writeIdx + curLen + 2048)\n this._logger.debug('【fetchLoader,onProgress extra start】,size,', this._writeIdx + curLen + 2048, ', datalen,', curLen, ', writeIdx,', this._writeIdx)\n temp.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && temp.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n delete this._cache\n this._cache = temp\n this._logger.debug('【fetchLoader,onProgress extra end】,len,', curLen, ', writeIdx,', this._writeIdx)\n }\n }\n } else {\n retData = data.value\n }\n if (retData && retData.byteLength > 0 || data.done) {\n onProgress(retData, data.done, {\n range: [this._range[0] + this._receivedLength - (retData ? retData.byteLength : 0), this._range[0] + this._receivedLength],\n vid: this._vid,\n index: this._index,\n startTime,\n endTime,\n st,\n firstByteTime,\n priOptions:this._priOptions\n }, response)\n }\n if (!data.done) {\n pump()\n } else {\n const costTime = Date.now() - st\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n this._running = false\n this._logger.debug('[fetchLoader onProgress end],task,', this._range, ',done,', data.done)\n this.resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n st,\n firstByteTime,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n pump()\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n static isSupported () {\n return !!(typeof fetch !== 'undefined')\n }\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nexport class XhrLoader extends EventEmitter {\n\n _xhr = null\n _aborted = false\n _timeoutTimer = null\n _range = null\n _receivedLength = 0\n _url = null\n _onProgress = null\n _index = -1\n _headers = null\n // _chunkSizeKBList = [\n // 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n // ]\n\n _currentChunkSizeKB = 384\n _timeout = null\n _xhr = null\n _withCredentials = null\n _startTime = -1\n // _speedSampler = new SpeedSampler()\n _loadCompleteResolve = null\n _loadCompleteReject = null\n _runing = false\n _logger = false\n _vid = ''\n _responseType\n _credentials\n _method\n _transformResponse\n _firstRtt\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n\n constructor () {\n super()\n }\n\n load (req) {\n clearTimeout(this._timeoutTimer)\n this._logger = req.logger\n this._range = req.range\n this._onProgress = req.onProgress\n this._index = req.index\n this._headers = req.headers\n this._withCredentials = req.credentials === 'include' || req.credentials === 'same-origin'\n this._body = req.body || null\n req.method && (this._method = req.method)\n this._timeout = req.timeout || null\n this._runing = true\n this._vid = req.vid || req.url\n this._responseType = req.responseType\n this._firstRtt = -1\n this._onTimeout = req.onTimeout\n this._onCancel = req.onCancel\n this._request = req.request\n this._priOptions = req.priOptions || {}\n this._logger.debug('【xhrLoader task】, range', this._range)\n\n this._url = setUrlParams(req.url, req.params)\n\n const startTime = Date.now()\n return new Promise((resolve, reject) => {\n this._loadCompleteResolve = resolve\n this._loadCompleteReject = reject\n this._startLoad()\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._runing = false\n if (this._aborted) return\n error = error instanceof NetError ? error : new NetError(this._url, this._request)\n error.startTime = startTime\n error.endTime = Date.now()\n error.options = {index: this._index, vid: this._vid, priOptions: this._priOptions}\n throw error\n })\n }\n\n _startLoad () {\n let range = null\n if (this._responseType === ResponseType.ARRAY_BUFFER && this._range && this._range.length > 1) {\n if (this._onProgress) {\n this._firstRtt = -1\n const chunkSize = this._currentChunkSizeKB * 1024\n const from = this._range[0] + this._receivedLength\n let to = this._range[1]\n if (chunkSize < this._range[1] - from) {\n to = from + chunkSize\n }\n range = [from, to]\n this._logger.debug('[xhr_loader->],tast :', this._range, ', SubRange, ', range)\n } else {\n range = this._range\n this._logger.debug('[xhr_loader->],tast :', this._range, ', allRange, ', range)\n }\n }\n this._internalOpen(range)\n }\n\n _internalOpen (range) {\n try {\n this._startTime = Date.now()\n const xhr = this._xhr = new XMLHttpRequest()\n xhr.open(this._method || 'GET', this._url, true)\n xhr.responseType = this._responseType\n this._timeout && (xhr.timeout = this._timeout)\n xhr.withCredentials = this._withCredentials\n xhr.onload = this._onLoad.bind(this)\n xhr.onreadystatechange = this._onReadyStatechange.bind(this)\n xhr.onerror = (errorEvent) => {\n this._running = false\n const error = new NetError(this._url, this._request, errorEvent?.currentTarget?.response, ('xhr.onerror.status:' + errorEvent?.currentTarget?.status + ',statusText,' + errorEvent?.currentTarget?.statusText))\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n xhr.ontimeout = (event) => {\n this.cancel()\n const error = new NetError(this._url, this._request, {status:408}, 'timeout')\n if (this._onTimeout) {\n error.isTimeout = true\n this._onTimeout(error,{index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n const headers = this._headers || {}\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n headers.Range = rangeValue\n }\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n this._logger.debug('[xhr.send->] tast,', this._range, ',load sub range, ', range)\n xhr.send(this._body)\n } catch (e) {\n e.options = {index: this._index, range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(e)\n }\n }\n\n _onReadyStatechange (e) {\n const xhr = e.target\n if (xhr.readyState === 2) {\n this._firstRtt < 0 && (this._firstRtt = Date.now())\n }\n }\n\n _onLoad (e) {\n const status = e.target.status\n if (status < 200 || status > 299) {\n const error = new NetError(this._url, null, { ...e.target.response, status }, 'bad response,status:' + status)\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n return this._loadCompleteReject(error)\n }\n let data = null\n let done = false\n let byteStart\n const startRange = (this._range?.length > 0 ? this._range [0] : 0 )\n if (this._responseType === ResponseType.ARRAY_BUFFER) {\n const chunk = new Uint8Array(e.target.response)\n byteStart = startRange + this._receivedLength\n if (chunk && chunk.byteLength > 0) {\n this._receivedLength += chunk.byteLength\n const costTime = Date.now() - this._startTime\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed, len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: [byteStart, startRange + this._receivedLength], priOptions: this._priOptions})\n }\n data = chunk\n if (this._range?.length > 1 && this._range[1] && this._receivedLength < this._range[1] - this._range[0]) {\n done = false\n } else {\n done = true\n }\n this._logger.debug('[xhr load done->], tast :', this._range, ', start', byteStart, 'end ', startRange + this._receivedLength, ',dataLen,', (chunk ? chunk.byteLength : 0), ',receivedLength', this._receivedLength, ',index,', this._index, ', done,', done)\n } else {\n done = true\n data = e.target.response\n }\n let response = {\n ok: status >= 200 && status < 300,\n status,\n statusText: this._xhr.statusText,\n url: this._xhr.responseURL,\n headers: this._getHeaders(this._xhr),\n body: this._xhr.response\n }\n if (this._transformResponse) {\n response = this._transformResponse(response, this._url) || response\n }\n if (this._onProgress) {\n this._onProgress(data, done, { index: this._index, vid: this._vid, range: [byteStart, startRange + this._receivedLength], startTime: this._startTime, endTime: Date.now(), priOptions: this._priOptions }, response)\n }\n\n if (!done) {\n this._startLoad()\n } else {\n this._runing = false\n this._loadCompleteResolve && this._loadCompleteResolve(createResponse(\n this._onProgress ? null : data,\n done,\n response,\n response.headers['content-length'],\n response.headers.age,\n this._startTime,\n this._firstRtt,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n\n cancel () {\n if (this._aborted) return\n this._aborted = true\n this._runing = false\n super.removeAllListeners()\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n if (this._xhr) {\n return this._xhr.abort()\n }\n }\n\n static isSupported () {\n return typeof XMLHttpRequest !== 'undefined'\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n _getHeaders (xhr) {\n const headerLines = xhr.getAllResponseHeaders().trim().split('\\r\\n')\n const headers = {}\n for (const header of headerLines) {\n const parts = header.split(': ')\n headers[parts[0].toLowerCase()] = parts.slice(1).join(': ')\n }\n return headers\n }\n}\n","import { FetchLoader } from './fetch'\nimport { XhrLoader } from './xhr'\nimport { LoaderType } from './types'\nimport { createPublicPromise } from '../utils'\nimport { Logger } from '../logger'\n\nexport class Task {\n constructor (type, config) {\n this.promise = createPublicPromise()\n this.alive = !!config.onProgress\n !config.logger && (config.logger = new Logger('Loader'))\n this._loaderType = type\n this._loader = type === LoaderType.FETCH && !!window.fetch ? new FetchLoader() : new XhrLoader()\n this._config = config\n this._retryCount = 0\n this._retryTimer = null\n this._canceled = false\n this._retryCheckFunc = config.retryCheckFunc\n this._logger = config.logger\n }\n\n exec () {\n const {\n retry,\n retryDelay,\n onRetryError,\n transformError,\n ...rest\n } = this._config\n\n const request = async () => {\n try {\n const response = await this._loader.load(rest)\n this.promise.resolve(response)\n } catch (e) {\n this._loader.running = false\n this._logger.debug('[task request catch err]', e)\n if (this._canceled) return\n\n e.loaderType = this._loaderType\n e.retryCount = this._retryCount\n\n let error = e\n if (transformError) {\n error = transformError(error) || error\n }\n\n if (onRetryError && this._retryCount > 0) onRetryError(error, this._retryCount, {index: rest.index, vid: rest.vid, range: rest.range, priOptions: rest.priOptions})\n\n this._retryCount++\n let isRetry = true\n if (this._retryCheckFunc) {\n isRetry = this._retryCheckFunc(e)\n }\n if (isRetry && this._retryCount <= retry) {\n clearTimeout(this._retryTimer)\n this._logger.debug('[task request setTimeout],retry', this._retryCount, ',retry range,', rest.range)\n this._retryTimer = setTimeout(request, retryDelay)\n return\n }\n this.promise.reject(error)\n }\n }\n\n request()\n return this.promise\n }\n\n async cancel () {\n clearTimeout(this._retryTimer)\n this._canceled = true\n this._loader.running = false\n return this._loader.cancel()\n }\n\n get running () {\n return this._loader && this._loader.running\n }\n\n get loader () {\n return this._loader\n }\n}\n","export function isMediaPlaying (media) {\n return media && !media.paused && !media.ended && media.playbackRate !== 0 && media.readyState !== 0\n}\n\nexport function getVideoPlaybackQuality (video) {\n if (!video) return {}\n if (typeof video.getVideoPlaybackQuality === 'function') {\n const info = video.getVideoPlaybackQuality()\n return {\n droppedVideoFrames: info.droppedVideoFrames || info.corruptedVideoFrames,\n totalVideoFrames: info.totalVideoFrames,\n creationTime: info.creationTime\n }\n }\n\n return {\n droppedVideoFrames: video.webkitDroppedFrameCount,\n totalVideoFrames: video.webkitDecodedFrameCount,\n creationTime: performance.now()\n }\n}\n\n/**\n * @param {Array.<Uint8Array>} arr\n * @returns\n */\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n if (arr.length < 2) return arr[0]\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport function sleep (t = 0) {\n return new Promise((resolve) => setTimeout(resolve, t))\n}\n","import { FetchLoader } from './fetch'\nimport { LoaderType, ResponseType } from './types'\nimport { getConfig } from './config'\nimport { Task } from './task'\nimport { isPlainObject } from '../is'\nimport { sleep } from '../streaming-helper'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\n\nexport {\n LoaderType,\n ResponseType\n}\n\nexport class NetLoader extends EventEmitter {\n type = LoaderType.FETCH\n\n _queue = []\n\n _alive = []\n\n _currentTask = null\n\n _finnalUrl = ''\n\n _config\n\n constructor (cfg) {\n super(cfg)\n this._config = getConfig(cfg)\n if (\n this._config.loaderType === LoaderType.XHR ||\n !FetchLoader.isSupported()\n ) {\n this.type = LoaderType.XHR\n }\n this.log = cfg.logger\n }\n\n isFetch () {\n return this.type === LoaderType.FETCH\n }\n\n static isFetchSupport () {\n return FetchLoader.isSupported()\n }\n\n load (url, config = {}) {\n if (typeof url === 'string' || !url) {\n config.url = url || config.url || this._config.url\n } else {\n config = url\n }\n\n config = Object.assign({}, this._config, config)\n\n if (config.params) config.params = Object.assign({}, config.params)\n if (config.headers && isPlainObject(config.headers)) config.headers = Object.assign({}, config.headers)\n if (config.body && isPlainObject(config.body)) config.body = Object.assign({}, config.body)\n\n if (config.transformRequest) {\n config = config.transformRequest(config) || config\n }\n config.logger = this.log\n\n const task = new Task(this.type, config)\n task.loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n this._queue.push(task)\n if (this._queue.length === 1 && (!this._currentTask || !this._currentTask.running)) {\n this._processTask()\n }\n\n return task.promise\n }\n\n async cancel () {\n const cancels = this._queue.map(t => t.cancel()).concat(this._alive.map(t => t.cancel()))\n if (this._currentTask) {\n cancels.push(this._currentTask.cancel())\n }\n this._queue = []\n this._alive = []\n await Promise.all(cancels)\n await sleep()\n }\n\n _processTask () {\n this._currentTask = this._queue.shift()\n if (!this._currentTask) return\n\n if (this._currentTask.alive) {\n this._alive.push(this._currentTask)\n }\n const req = this._currentTask.exec().catch(e => {})\n\n if (!(req && typeof req.finally === 'function')) return\n\n req.finally(() => {\n if (this._currentTask?.alive && this._alive?.length > 0) {\n this._alive = this._alive.filter(task => task && task !== this._currentTask)\n }\n this._processTask()\n })\n\n }\n}\n","import { LoaderType, ResponseType } from './types'\n\nexport function getConfig (cfg) {\n return {\n loaderType: LoaderType.FETCH,\n retry: 0,\n retryDelay: 0, // ms\n timeout: 0,\n request: null, // Request\n onTimeout: undefined,\n onProgress: undefined,\n onRetryError: undefined,\n transformRequest: undefined,\n transformResponse: undefined,\n transformError: undefined,\n responseType: ResponseType.TEXT,\n range: undefined,\n url: '',\n params: undefined,\n method: 'GET',\n headers: {},\n body: undefined,\n mode: undefined,\n credentials: undefined,\n cache: undefined,\n redirect: undefined,\n referrer: undefined,\n referrerPolicy: undefined,\n integrity: undefined,\n onProcessMinLen: 0,\n ...cfg\n }\n}\n","// import { Errors } from 'xgplayer'\nimport version from './version'\nimport { ERR, ERR_CODE } from 'xgplayer-streaming-shared'\nconst ERROR_CODES = {\n 416: ERR_CODE[ERR.NETWROK_RANGE_NOT_SATISFIABLE], // -499899\n 403: ERR_CODE[ERR.NETWORK_FORBIDDEN], // -499897,\n 404: ERR_CODE[ERR.NETWORK_NOTFOUND], // -499896,\n timeout: ERR_CODE[ERR.NETWORK_TIMEOUT], // -499895,\n '4xx': `${ERR_CODE[ERR.NETWORK] }4XX`,// -499894,\n '5xx': `${ERR_CODE[ERR.NETWORK] }5XX`,// -499893,\n networkError: ERR_CODE[ERR.NETWORK],// -499892,\n contentError: `${ERR_CODE[ERR.NETWORK] }contentError`,// -499891,\n mse: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_OTHER], // -499971,\n mseOpen: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_ADD_SB], // -499972,\n mseAppend: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_APPEND_BUFFER], // -499973,\n mse_hijack: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_HIJACK], // -499974,\n eme_hijack: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.EME_HIJACK], // -499975,\n metaError: ERR_CODE[ERR.DEMUX][ERR.SUB_TYPES.MP4],// -499985,\n muxError: ERR_CODE[ERR.REMUX][ERR.SUB_TYPES.FMP4],// -499986,\n other: ERR_CODE[ERR.OTHER], // -499989,\n waitTimeout: ERR_CODE[ERR.RUNTIME][ERR.SUB_TYPES.BUFFERBREAK_ERROR],// -499791,\n waitTimeoutWithHidden : ERR_CODE[ERR.RUNTIME][ERR.SUB_TYPES.WAITING_TIMEOUT_ERROR],\n drm: ERR_CODE[ERR.DRM][ERR.SUB_TYPES.LICENSE],\n}\nconst ERROR_TYPES = ERR\n\n/**\n * 根据httpCode获取对应的错误码\n * @param { number} httpCode\n * @returns { number }\n */\nfunction getErrorCodeByHttpCode (httpCode) {\n return ERROR_CODES[httpCode] || httpCode\n}\nclass NetWorkError {\n constructor (type, httpCode, context) {\n let rangeStart = 0\n let rangeEnd = 0\n if (context && context.range && context.range.length > 1) {\n rangeStart = context.range[0]\n rangeEnd = context.range[1]\n }\n const _errCode = getErrorCodeByHttpCode(httpCode)\n return {\n errorCode: _errCode,\n errorType: type,\n // errorTypeCode: ERROR_TYPES[type],\n errorMessage: context?.httpText || context?.message,\n url: context?.url,\n httpCode,\n version,\n rangeStart,\n rangeEnd,\n ext: context,\n mediaError: {\n code: _errCode,\n message: context?.httpText || context?.message,\n },\n }\n }\n}\n\nclass ParserError {\n constructor (type, errorCode, ext) {\n return {\n errorCode,\n errorType: type,\n // errorTypeCode: ERROR_TYPES[type],\n version,\n errorMessage: ext.msg,\n ext,\n mediaError: {\n code: errorCode,\n message: ext.msg,\n },\n }\n }\n}\n\nexport {\n // Errors as default,\n NetWorkError,\n ParserError,\n ERROR_CODES,\n ERROR_TYPES,\n getErrorCodeByHttpCode,\n}\n","/* eslint-disable camelcase */\nconst util = {}\n\nutil.nowTime = function () {\n try {\n return parseInt(performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n\nutil.concatData = function (video, audio) {\n const resBuffers = []\n let bufferSize = 0\n if (video) {\n resBuffers.push(video)\n }\n if (audio) {\n resBuffers.push(audio)\n }\n resBuffers.every(item => {\n item && (bufferSize += item.byteLength)\n return true\n })\n const buffer = new Uint8Array(bufferSize)\n let offset = 0\n resBuffers.every(item => {\n if (item) {\n buffer.set(item, offset)\n offset += item.byteLength\n }\n return true\n })\n return buffer\n}\n\nexport default util\n","export class MediaError {\n constructor (msg, data) {\n this.type = 'file'\n this.message = msg\n this.data = data\n }\n}\n","export class Cache {\n _data = Object.create(null)\n\n set (id, data) {\n this._data[id] = data\n }\n\n get (id) {\n return this._data[id]\n }\n\n clear () {\n this._data = Object.create(null)\n }\n}\n","\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n\n return segments\n}\n\nexport function moovToMeta (moov) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n const segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n const segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n","import util from './index'\nconst isSupport = _isLocalStorageUsable()\nexport const openLog = checkOpenLog()\nexport const openTestLog = checkTestOpenLog()\nfunction probeSupport () {\n try {\n return (\n typeof localStorage !== 'undefined' &&\n 'setItem' in window.localStorage &&\n !!window.localStorage.setItem\n )\n } catch (e) {\n return false\n }\n}\n\nfunction checkIfLocalStorageThrows () {\n const localStorageTestKey = '_localstorage_support_test'\n\n try {\n window.localStorage.setItem(localStorageTestKey, true)\n window.localStorage.removeItem(localStorageTestKey)\n return false\n } catch (e) {\n return true\n }\n}\n\nexport function checkOpenLog () {\n if (isSupport) {\n try {\n return !!window.localStorage.getItem('playerlog')\n } catch (e) {\n return false\n }\n }\n return false\n}\n\nfunction _isLocalStorageUsable () {\n return probeSupport() && !checkIfLocalStorageThrows()\n}\n\nexport function log ( message, ...optionalParams) {\n openLog && console.log && console.log('[logger]', util.nowTime(), message, ...optionalParams)\n}\n\nexport function checkTestOpenLog () {\n if (isSupport) {\n try {\n return !!window.localStorage.getItem('playertestlog')\n } catch (e) {\n return false\n }\n }\n return false\n}\n\n\n","import EventEmitter from 'eventemitter3'\nimport TransmuxerWorker from './transmuxerworker?worker&inline'\n\nexport default class TransmuxerWorkerControl extends EventEmitter {\n constructor (options) {\n super()\n this.openlog = options.openLog\n this.codecType = options.codecType\n this.supportHevc = options.supportHevc\n this.worker = new TransmuxerWorker()\n this.worker.onmessage = (e) => {\n this.emit(e.data.method, e.data)\n }\n this.worker.postMessage({\n method: 'init',\n id: options.id || 0,\n args: { openlog: this.openlog, supportHevc: this.supportHevc, codecType: this.codecType}\n })\n }\n\n transmux (id, data, start, videoIdx, audioIdx, moov, useEME, kidValue, context) {\n const buffer = data.buffer\n this.worker && this.worker.postMessage({\n method: 'transmux',\n id,\n buffer,\n args: { start, videoIdx, audioIdx, moov, useEME, kidValue, context}\n },[buffer])\n }\n\n reset () {\n this.worker && this.worker.postMessage({\n method: 'reset'\n })\n }\n\n destroy () {\n this.worker && this.worker.terminate()\n }\n\n}\n","import EventEmitter from 'eventemitter3'\nimport Concat from 'concat-typed-array'\nimport { MP4Demuxer, FMP4Remuxer } from 'xgplayer-transmuxer'\nimport { ERROR_CODES, NetWorkError, ParserError, ERROR_TYPES } from './error'\nimport util from './util'\nimport MP4Loader from 'xgplayer-mp4-loader'\nimport { checkOpenLog, log } from './util/logger'\nimport TransmuxerWorkerControl from './worker'\n\nconst MP4_EVENTS = {\n ERROR: 'error',\n META_READY: 'metaReady',\n MOOV_REQ_PROGRESS: 'moov_request_Progress',\n UPDATE_LOAD_IDX: 'update_load_fragmentIdx'\n}\n\nclass MP4 extends EventEmitter {\n\n static getDefaultConfig () {\n return {\n segmentDuration: 5,\n onProcessMinLen: 1024, // 当fetch用onprocess渐进式回调数据时,当收到的数据量最少到配置值时才回调\n chunkSize: 800000, // [请求的数据块大小,对于长视频设置的较大些可以避免二次请求]\n retryCount: 3,\n retryDelay: 1000,\n timeout: 3000,\n enableWorker: false,\n playerId: '',\n vid: '',\n ext: {}\n }\n }\n /**\n * [constructor 构造函数]\n * @param { string } url [视频地址]\n * @param { Object } options\n * @param { Number } [chunk_size=Math.pow(25, 4)] [请求的数据块大小,对于长视频设置的较大些可以避免二次请求]\n * @param { any } preloader [预加载器]\n * @param { any } preloadTimeCache [预加载信息]\n */\n\n constructor (url, options) {\n super()\n this.url = url\n this.options = MP4.getDefaultConfig()\n // eslint-disable-next-line array-callback-return\n Object.keys(options).map(key => {\n options[key] !== undefined && options[key] !== null && (this.options[key] = options[key])\n })\n this.timeRange = []\n this.CHUNK_SIZE = this.options.chunkSize\n this.bufferLoaded = new Uint8Array(0)\n this.bufferLoadedPos = 0\n this.meta = null\n this.videoTrak = null\n this.audioTrak = null\n this.canDownload = true\n this._loadSuccessCallBack = null\n this._isPending = false // 当前流程是否进入错误处理挂起状态\n this._metaLoading = false // meta请求是否进行中\n this.MP4Loader = new MP4Loader({\n segmentDuration: this.options.segmentDuration,\n url: url,\n vid: options.vid,\n retry: this.options.retryCount,\n retryDelay: this.options.retryDelay,\n timeout: this.options.timeout,\n ...options.reqOptions,\n openLog: checkOpenLog()\n })\n this.MP4Demuxer = null\n this.FMP4Remuxer = null\n this._needInitSegment = true\n this._switchBitRate = false\n this.enableWorker = this.options.enableWorker\n if (this.enableWorker && typeof Worker !== 'undefined') {\n try {\n this.workerSequence = 0\n this.transmuxerWorkerControl = new TransmuxerWorkerControl({id: this.workerSequence, codecType : options.codecType, supportHevc: this.options.supportHevc, openLog: checkOpenLog()})\n this.transmuxerWorkerControl.on('transmux', (muxRes) => {\n const res = muxRes.args\n this.log('[transmuxerworker end] ,range, ',JSON.stringify(res.range), ',dataLen,',res.buffer.byteLength, res.context)\n this._loadSuccessCallBack && this._loadSuccessCallBack(res)\n })\n // this.eventListen = false\n } catch (error) {\n this.log('Error in worker:', error)\n this.enableWorker = false\n this.transmuxerWorkerControl = null\n }\n }\n if (!this.enableWorker) {\n this.MP4Demuxer = null\n this.FMP4Remuxer = null\n }\n this.seekTime = -1\n this.changeBitRateTime = -1\n }\n\n\n async changeBitRate (bitRateInfo) {\n this.url = bitRateInfo.url\n await this.MP4Loader.changeUrl(this.url, this.options.vid + Date.now(), this.CHUNK_SIZE)\n this._switchBitRate = true\n this.log('[switchBitrate] changeUrl, bitRate,',this.url)\n }\n\n log (message, ...optionalParams) {\n const { options } = this\n const newMessage = (options && options.vid) ? `[MP4] ${options.vid} ${message}` : `[MP4] ${message}`\n log(newMessage, ...optionalParams)\n }\n\n /**\n * 错误处理\n * @param { Error } error\n * @param { string } state\n */\n async errorHandler (error, state, context = {}) {\n const { response, message } = error\n const vid = this.options ? this.options.vid : ''\n let _error = null\n this._isPending = true\n if (response) {\n _error = new NetWorkError('network', response.status, {\n httpText: response.httpText,\n message: message,\n url: response.url\n })\n this.emit(MP4_EVENTS.ERROR, _error)\n } else {\n // 其他错误信息\n console.log(`[MP4] [${vid}] errorHandler,`, error)\n _error = error\n this.emit(MP4_EVENTS.ERROR, _error)\n }\n }\n\n\n async init () {\n if (this.url) await this.MP4Loader.changeUrl(this.url, this.options.vid + Date.now(), this.CHUNK_SIZE)\n await this.getMetaInfo()\n }\n\n getTimeRange () {\n const range = []\n let timeRange = null\n for (let i = 0; this.videoTrak && i < this.videoTrak.length; i++) {\n timeRange = {\n startTime: this.videoTrak[i].startTime,\n endTime: this.videoTrak[i].endTime,\n downloaded : false,\n isLoading : false\n }\n range.push(timeRange)\n }\n if (this.audioTrak && this.audioTrak.length > range.length) {\n for (let j = range.length; j < this.audioTrak.length; j++) {\n timeRange = {\n startTime: Math.max(this.audioTrak[j].startTime, timeRange ? timeRange.endTime : 0),\n endTime: Math.max(this.audioTrak[j].endTime, timeRange ? timeRange.endTime : 0),\n downloaded : false,\n isLoading : false\n }\n range.push(timeRange)\n }\n }\n return range\n }\n\n async getMetaInfo (isEmitMetaEvent = true) {\n try {\n this._metaLoading = true\n this.log('getMetaInfo start')\n this.bufferLoaded = new Uint8Array(0)\n let startPos = 0\n const onProgressHandle = async (data, state, options) => {\n this.log('getMetaInfo onProgressHandle, dataLen,', data ? data.byteLength : -1, ', state,',state, ',range,',JSON.stringify(options.range))\n if (data) {\n if (options.range[0] === startPos) {\n this.bufferLoaded = Concat(Uint8Array, this.bufferLoaded, new Uint8Array(data))\n startPos += data.byteLength\n }\n }\n if (options.meta && !this.meta) {\n const metaInfo = options.meta\n this.videoTrak = metaInfo.videoSegments\n this.audioTrak = metaInfo.audioSegments\n this.timeRange = this.getTimeRange()\n this.meta = {...metaInfo.meta, ext:{videoTrak: this.videoTrak, audioTrak: this.audioTrak}}\n metaInfo.bufferLoaded = this.bufferLoaded\n this.log('meta reach')\n if (isEmitMetaEvent) {\n this.emit(MP4_EVENTS.META_READY, this.meta)\n }\n }\n if (this.meta && state) {\n this.log('[getMetaInfo req end]')\n this._metaLoading = false\n }\n\n if (this.meta && (data || state)) {\n this.log('emit moov_req_progress')\n this.emit(MP4_EVENTS.MOOV_REQ_PROGRESS)\n }\n }\n await this.MP4Loader.loadMetaProcess(this.MP4Loader.cache, [0, this.CHUNK_SIZE], onProgressHandle)\n } catch (error) {\n console.error('[MP4] trigger errorHandler getMetaInfo',error?.message)\n this.loadError(error, 'getMetaInfo')\n }\n }\n\n getFragmentIdx (time) {\n let video\n let audio\n if (!this.videoTrak.length) {\n audio = this.audioTrak.find(x => x.startTime <= time && x.endTime > time)\n return audio ? audio.index : 0\n } else {\n video = this.videoTrak.find(x => x.startTime <= time && x.endTime > time)\n audio = this.audioTrak.find(x => x.startTime <= time && x.endTime > time)\n if (video && audio) {\n return Math.min(video.index, audio.index)\n } else if (video || audio){\n return video ? video.index : audio.index\n } else {\n let last = Number.MAX_VALUE\n if (this.videoTrak && this.videoTrak.length > 0) {\n last = this.videoTrak.length - 1\n }\n if (this.audioTrak && this.audioTrak.length > 0) {\n last = Math.min(this.audioTrak.length - 1, last)\n }\n return last\n }\n }\n }\n\n async _checkHasMeta () {\n this.log(' loadMeta start')\n this._metaLoading = true\n const metaInfo = await this.MP4Loader.loadMeta(this.MP4Loader.cache, Math.round(this.CHUNK_SIZE / 2))\n this._metaLoading = false\n this.videoTrak = metaInfo.videoSegments\n this.audioTrak = metaInfo.audioSegments\n this.meta = {...metaInfo.meta, ext:{videoTrak: this.videoTrak, audioTrak: this.audioTrak}}\n this.timeRange = this.getTimeRange()\n this.bufferLoaded = new Uint8Array(0)\n metaInfo.bufferLoaded = this.bufferLoaded\n return true\n }\n\n resetFragmentLoadState (fragIndex){\n for (let i = 0; i < this.timeRange.length; i++) {\n if (i < fragIndex) {\n this.timeRange[i].downloaded = true\n this.timeRange[i].isLoading = true\n } else {\n this.timeRange[i].downloaded = false\n this.timeRange[i].isLoading = false\n }\n }\n }\n\n getFragRange (fragIndex) {\n let videoSeg = null\n if (this.videoTrak) {\n videoSeg = fragIndex < this.videoTrak.length ? this.videoTrak[fragIndex] : this.videoTrak[this.videoTrak.length - 1]\n }\n let audioSeg = null\n if ( this.audioTrak) {\n audioSeg = fragIndex < this.audioTrak.length ? this.audioTrak[fragIndex] : this.audioTrak[this.audioTrak.length - 1]\n }\n let videodiff = 0, audiodiff = 0\n if (this.videoTrak && fragIndex >= this.videoTrak.length - 1) {\n videodiff = -1\n }\n if (this.audioTrak && fragIndex >= this.audioTrak.length - 1) {\n audiodiff = -1\n }\n const range = [\n Math.min(videoSeg?.range[0] || Infinity, audioSeg?.range[0] || Infinity),\n Math.max((videoSeg ?.range[1]) + videodiff || 0, (audioSeg?.range[1]) + audiodiff || 0)\n ]\n if (fragIndex < this.timeRange.length) {\n this.timeRange[fragIndex].range = range\n }\n return range\n }\n\n async load (fragIndex, successCallback) {\n this._loadSuccessCallBack = successCallback\n if (this._switchBitRate && !this._metaLoading) {\n this.log('[switchBitrate], switch bitRate start load, time,', fragIndex >= this.videoTrak.length ? this.audioTrak[fragIndex].startTime : this.videoTrak[fragIndex].startTime, ', fragIndex,',fragIndex)\n const metaReady = await this._checkHasMeta()\n if (this.changeBitRateTime > 0) {\n if (this.timeRange[fragIndex].startTime <= this.changeBitRateTime && this.changeBitRateTime < this.timeRange[fragIndex].endTime) {\n this.log('[switchBitrate], not need update load fragIndex', fragIndex,',stTime,',this.changeBitRateTime)\n } else {\n // 需要根据新码率的关键帧列表去找切换后码率的开始下载的fragIndex,修复不同码率关键帧不对齐导致卡播\n fragIndex = this.getFragmentIdx(this.changeBitRateTime)\n this.log('[switchBitrate], need update load fragIndex', fragIndex,',stTime,',this.changeBitRateTime, ',newBitrateTimeRange,',this.timeRange[fragIndex].startTime,'-',this.timeRange[fragIndex].endTime)\n this.emit(MP4_EVENTS.UPDATE_LOAD_IDX, fragIndex)\n }\n this.seekTime = this.changeBitRateTime\n this.changeBitRateTime = -1\n }\n this.resetFragmentLoadState(fragIndex)\n this.log('[switchBitrate], reset timerange state,', fragIndex)\n this._needInitSegment = true\n this.resetTansmuxer()\n if (metaReady) {\n this._switchBitRate = false\n }\n }\n\n if (this._switchBitRate && this._metaLoading) {\n return\n }\n const range = this.getFragRange(fragIndex)\n this.log('loadFragment,',fragIndex, ',range,',JSON.stringify(range))\n if (this.seekTime > 0) {\n const subRange = this.getSubRange(fragIndex, this.seekTime, range)\n this.loadFragment(fragIndex, subRange)\n this.seekTime = -1\n } else {\n this.loadFragment(fragIndex, range)\n }\n }\n\n /**\n * 查找离time最近的左边的关键帧的开始的range\n * @param { fragIndex }\n * @param { time }\n * @param { range }\n * @return {\n * range: array<number>,\n\n * }\n */\n\n getSubRange (fragIndex, time, range) {\n let videoStartRange = range[0]\n let audioStartRange = range[0]\n let i = 1\n let find = false\n this.log('>>>>>getSubRange time,',time, JSON.stringify(range))\n if (this.videoTrak) {\n const videoSeg = fragIndex < this.videoTrak.length ? this.videoTrak[fragIndex] : this.videoTrak[this.videoTrak.length - 1]\n const keyFrameList = videoSeg.frames.filter(getKeyFrameList)\n const videoTimescale = this.meta.videoTimescale\n let startTime = keyFrameList[0].startTime / videoTimescale\n this.log('>>>>>getSubRange video, startTime,',videoSeg.startTime,',endTime,',videoSeg.endTime)\n for (let j = 0; j < keyFrameList.length; j++) {\n this.log('>>>>>getSubRange video keyFrameList, startTime,',keyFrameList[j].startTime / videoTimescale,',range,',keyFrameList[j].offset)\n }\n for (; i < keyFrameList.length; i++) {\n const endTime = keyFrameList[i].startTime / videoTimescale\n if ( startTime <= time && time < endTime && range[0] < keyFrameList[i - 1].offset) {\n videoStartRange = keyFrameList[i - 1].offset\n find = true\n this.log('>>>>>getSubRange video end, startTime,',startTime, ',endTime,',endTime, ',startRange,',videoStartRange, ', keyFrameIndex,',i - 1)\n break\n }\n startTime = endTime\n }\n if (!find && startTime <= time && time < videoSeg.endTime + 0.8) {\n videoStartRange = keyFrameList[i - 1].offset\n this.log('>>>>>getSubRange video last, startTime,',startTime, ',endTime,',videoSeg.endTime, ',startRange,',videoStartRange)\n }\n }\n i = 1\n if (this.audioTrak) {\n const audioSeg = fragIndex < this.audioTrak.length ? this.audioTrak[fragIndex] : this.audioTrak[this.audioTrak.length - 1]\n const frameList = audioSeg.frames\n const audioTimescale = this.meta.audioTimescale\n i = Math.floor((time * audioTimescale - frameList[0].startTime) / audioSeg.frames[0].duration)\n i = Math.min(frameList.length - 1, i)\n let starttime = i > 0 ? frameList[i - 1].startTime / audioTimescale : frameList[0].startTime / audioTimescale\n for ( ; i >= 0 && i < frameList.length; ) {\n if (i > 0 && starttime > time) {\n i -= 1\n starttime = frameList[i].startTime / audioTimescale\n continue\n }\n const endtime = (frameList[i].startTime + frameList[i].duration) / audioTimescale\n if (starttime <= time && time < endtime && range[0] < frameList[i].offset) {\n audioStartRange = frameList[i].offset\n find = true\n this.log('>>>>>getSubRange audio end, startTime,', starttime, ',endTime,', endtime, ',startRange,', audioStartRange, ', index,', i)\n break\n }\n starttime = endtime\n i++\n }\n }\n const finalRange = [Math.min(audioStartRange, videoStartRange), range[1]]\n this.log('>>>>>getSubRange finalRange ', JSON.stringify(finalRange), ',oldRange,',JSON.stringify(range))\n return finalRange\n }\n\n\n onprogressDataArrive = async (data, state, options) => {\n if (data && data.byteLength > 0) {\n const curSegRange = this.timeRange[options.index].range\n if (curSegRange && options.range[1] >= curSegRange[1] && !state) {\n state = true\n }\n this.log('[mp4.loadFragment onprogressDataArrive ] receive data, >>> index,', options.index, ',range,', JSON.stringify(options.range), ', dataLen,', data.byteLength)\n this._mux(data, options.range[0], options.index, state)\n }\n if (state) {\n this.timeRange[options.index].downloaded = true\n this.bufferLoadedPos = -1\n this.log('[FragLoadDowned],fragmentIdx,',options.index,',rangeEnd,',options.range[1])\n }\n }\n\n _mux (buffer, start, fragIndex, state) {\n const videoIndexRange = this.getSamplesRange(fragIndex, 'video')\n const audioIndexRange = this.getSamplesRange(fragIndex, 'audio')\n const range = [start, start + buffer.byteLength]\n if (this.transmuxerWorkerControl) {\n const context = {\n range,\n state,\n fragIndex\n }\n this.log('[transmuxerworker start] ,range, ',JSON.stringify(range), ',dataLen,',buffer.byteLength, context)\n this.transmuxerWorkerControl.transmux(this.workerSequence, buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue, context)\n } else {\n try {\n if (!this.MP4Demuxer) {\n this.MP4Demuxer = new MP4Demuxer(this.videoTrak, this.audioTrak, null,{openLog: checkOpenLog()})\n }\n const demuxRet = this.MP4Demuxer.demuxPart(buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue)\n if (!this.FMP4Remuxer && (!this.checkCodecH265() || this.options.supportHevc)) {\n this.FMP4Remuxer = new FMP4Remuxer(this.MP4Demuxer.videoTrack, this.MP4Demuxer.audioTrack, {openLog: checkOpenLog()})\n }\n let res\n this.log('[mux], videoTimeRange,',demuxRet.videoTrack ? [demuxRet.videoTrack.startPts, demuxRet.videoTrack.endPts] : null, ',audioTimeRange,',demuxRet.audioTrack ? [demuxRet.audioTrack.startPts, demuxRet.audioTrack.endPts] : null)\n const startPts = Math.min(demuxRet.videoTrack.startPts, demuxRet.audioTrack.startPts)\n const endPts = Math.max(demuxRet.videoTrack.endPts, demuxRet.audioTrack.endPts)\n const timeRange = [startPts, endPts]\n if (this.FMP4Remuxer) {\n const remuxRes = this.FMP4Remuxer.remux(this._needInitSegment, {initMerge: true, range: range})\n remuxRes.initSegment && (this._needInitSegment = false)\n const data = util.concatData(remuxRes.audioSegment,remuxRes.videoSegment)\n res = {\n buffer: data,\n range,\n state,\n context: {\n range, fragIndex, timeRange\n },\n initSeg: remuxRes.initSegment\n }\n } else {\n res = {\n videoTrack: demuxRet.videoTrack,\n audioTrack: demuxRet.audioTrack,\n buffer: null,\n range,\n state,\n context: {\n range, fragIndex, timeRange\n }\n }\n }\n this._loadSuccessCallBack && this._loadSuccessCallBack(res)\n } catch (e) {\n console.error('mux err:', e)\n const err = new ParserError(ERROR_TYPES.remux, ERROR_CODES.muxError, {msg:JSON.stringify(e)})\n this.errorHandler(err, 'mux', {fragIndex, range: [start, start + buffer.byteLength]})\n }\n }\n }\n\n getSamplesRange (fragmentIdx, type) {\n const range = []\n switch (type) {\n case 'video':\n if (this.videoTrak && fragmentIdx < this.videoTrak.length ) {\n const frames = this.videoTrak[fragmentIdx].frames\n range.push(frames[0].index)\n range.push(frames[frames.length - 1].index)\n }\n break\n case 'audio':\n if (this.audioTrak && fragmentIdx < this.audioTrak.length ) {\n const frames = this.audioTrak[fragmentIdx].frames\n range.push(frames[0].index)\n range.push(frames[frames.length - 1].index)\n }\n break\n default:\n console.warn('[getSamplesRange] type ', type, ' is invalid')\n break\n }\n return range\n }\n\n async loadFragment (fragIndex, range) {\n if (this._isPending || (range.length > 0 && range[0] === 0 && range[1] === 0) || this.timeRange[fragIndex].isLoading) {\n return\n }\n this.log('[MP4.loadFragment] ,fragIndex,', fragIndex, ',range ', range, ',len ,', range[1] - range[0],', bufferLoaded_Len,', this.bufferLoaded.byteLength)\n if (range.length >= 2 && range[1] && range[1] > 0 && range[1] <= this.bufferLoaded.byteLength) {\n this.timeRange[fragIndex].isLoading = true\n const start = Math.max(range[0], this.bufferLoadedPos)\n const buffer = new Uint8Array(this.bufferLoaded.slice(start, range[1]))\n this.log('[mp4.loadFragment] has all data: ', start, range[1])\n this.timeRange[fragIndex].downloaded = true\n this.bufferLoadedPos = -1\n this._mux(buffer, start, fragIndex, true)\n } else {\n // // 对range进行缩减,已经有的数据不在重复下载\n if (range.length >= 2 && range[0] && range[0] <= this.bufferLoaded.byteLength) {\n if (!this.timeRange[fragIndex].isLoading) {\n const start = Math.max(range[0], this.bufferLoadedPos)\n const buffer = new Uint8Array(this.bufferLoaded.slice(start, range[1]))\n if (buffer.byteLength > 0) {\n this.bufferLoadedPos = start + buffer.byteLength\n this.log('[mp4.loadFragment] has part data: ', start, start + buffer.byteLength)\n this._mux(buffer, start, fragIndex, range[1] <= this.bufferLoadedPos)\n return\n }\n if (!this._metaLoading && !this.timeRange[fragIndex].isLoading) {\n this.log('[mp4.loadFragment] ready to load part data >>> ', this.bufferLoaded.byteLength, range[1])\n this.timeRange[fragIndex].isLoading = true\n await this.startLoad([this.bufferLoaded.byteLength, range[1]],fragIndex)\n }\n }\n } else {\n if ((!this._metaLoading || range[0] >= this.CHUNK_SIZE ) && !this.timeRange[fragIndex].isLoading) {\n this.timeRange[fragIndex].isLoading = true\n this.log('[mp4.loadFragment],ready to load all data ,segmentIdx, ', fragIndex, ',range >>> ', JSON.stringify(range))\n await this.startLoad(range,fragIndex)\n }\n }\n }\n }\n\n async startLoad (range, fragIndex){\n try {\n await this.MP4Loader.loadData(range, this.MP4Loader.cache, {\n index: fragIndex,\n onProgress: this.onprogressDataArrive,\n onProcessMinLen: this.options.onProcessMinLen\n })\n } catch (e) {\n console.error('[MP4] trigger errorHandler getMetaInfo', e?.message)\n this.loadError(e, 'loadFragment', {range, fragIndex})\n }\n }\n\n loadError (e, loadState, context) {\n !e.response && (e.response = {})\n if (e.isTimeout) {\n e.response.status = 'timeout'\n } else if (!e?.response?.status) {\n e.response.status = 'networkError'\n }\n this.errorHandler(e, loadState, context)\n }\n\n async cancelLoading () {\n await this.MP4Loader && this.MP4Loader.cancel()\n }\n\n update (url) {\n this.url = url\n }\n\n\n checkCodecH265 () {\n const isHvc = this.meta && (this.meta.videoCodec.indexOf('hvc1') > -1 ||\n this.meta.videoCodec.indexOf('hev1') > -1\n )\n return isHvc\n }\n\n destroy () {\n if (this.hasDestroyed) {\n return\n }\n this.resetTansmuxer()\n this.transmuxerWorkerControl && this.transmuxerWorkerControl.destroy()\n this._isPending = false\n this._metaLoading = false\n this.bufferLoadedPos = 0\n this.bufferLoaded = new Uint8Array(0)\n if (this.MP4Loader) {\n this.MP4Loader.cancel()\n this.MP4Loader.destroy()\n }\n this.hasDestroyed = true\n }\n\n resetTansmuxer () {\n this.MP4Demuxer && this.MP4Demuxer.reset()\n this.MP4Demuxer = null\n this.FMP4Remuxer && this.FMP4Remuxer.reset()\n this.FMP4Remuxer = null\n this.transmuxerWorkerControl && this.transmuxerWorkerControl.reset()\n }\n}\n\nexport {\n MP4 as default,\n MP4_EVENTS\n}\n\nfunction getKeyFrameList (frame){\n if (frame.keyframe) return frame\n}\n","export default class Timer {\n constructor (onTick) {\n this.onTick_ = onTick\n this.cancelPending_ = null\n }\n\n tickAfter (delayInSeconds, callback = null) {\n this.stop()\n let alive = true\n let timeoutId = null\n\n this.cancelPending_ = () => {\n window.clearTimeout(timeoutId)\n alive = false\n }\n\n const onTick = () => {\n if (alive) {\n this.onTick_()\n if (callback) {\n callback()\n }\n }\n }\n\n timeoutId = window.setTimeout(onTick, delayInSeconds * 1000)\n\n return this\n }\n\n tickEvery (seconds) {\n this.tickAfter(seconds, () => {\n this.tickEvery(seconds)\n })\n }\n\n stop () {\n if (this.cancelPending_) {\n this.cancelPending_()\n this.cancelPending_ = null\n }\n }\n}\n","export default class ProxyPromise {\n constructor () {\n let resolvePromise\n let rejectPromise\n\n const promise = new Promise((resolve, reject) => {\n resolvePromise = resolve\n rejectPromise = reject\n })\n\n const publicPromise = promise\n publicPromise.resolve = function (data) {\n resolvePromise(data)\n publicPromise.state = 'fulfilled'\n }\n publicPromise.reject = function (error) {\n rejectPromise(error)\n publicPromise.state = 'rejected'\n publicPromise.isBreak = error === 'DESTROYED'\n }\n publicPromise.state = 'pending'\n\n return publicPromise\n }\n\n /** @param {T=} value */\n // eslint-disable-next-line no-unused-vars\n resolve (value) {\n //\n }\n\n /** @param {*=} reason */\n // eslint-disable-next-line no-unused-vars\n reject (reason) {\n //\n }\n}\n","/* eslint-disable array-callback-return */\n// import 'core-js/modules/es7.string.pad-start';\nimport { BasePlugin, Events, Sniffer, Errors, Util } from 'xgplayer'\nimport MP4, { MP4_EVENTS } from './mp4'\nimport { ERROR_TYPES, ERROR_CODES } from './error'\nimport { MSE } from 'xgplayer-streaming-shared'\nimport util from './util'\nimport Timer from './util/timer'\nimport ProxyPromise from './util/proxy-promise'\nimport { log } from './util/logger'\n\nconst DESTROYED = 'DESTROYED'\n\nlet _playerPlayNext = null\n\nlet _playerStartInit = null\n\nlet _playerChangeDefinition = null\n\nlet _playerSwitchUrl = null\n\nexport default class Mp4Plugin extends BasePlugin {\n static get pluginName () {\n return 'mp4Plugin'\n }\n\n static get defaultConfig () {\n return {\n maxBufferLength: 40,\n minBufferLength: 5,\n disableBufferBreakCheck: false,\n waitingTimeOut: 15000,\n waitingInBufferTimeOut: 5000,\n waitJampBufferMaxCnt:3,\n tickInSeconds: 0.1,\n reqOptions: null,\n closeDowngrade: false\n }\n }\n\n static get version () {\n return __VERSION__\n }\n\n constructor (options) {\n super(options)\n this.mp4 = null\n this.mse = null\n this._waitAdjustTimeCnt = 0\n this._lastCheckTime = util.nowTime()\n this._removeBuffeEndTime = 0\n this._pendingPromises = []\n }\n\n afterCreate () {\n window.__mp4player = this\n try {\n BasePlugin.defineGetterOrSetter(this.player, {\n __url: {\n get: () => {\n try {\n return this.mse ? this.mse.url : this.config.url\n } catch (error) {\n return null\n }\n }\n }\n })\n } catch (e) {\n // NOOP\n }\n\n this._proxyPlayer()\n }\n\n attachEvents () {\n this.off(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.WAITING, this._onWaiting)\n this.off(Events.URL_CHANGE, this.switchURL)\n this.on(Events.URL_CHANGE, this.switchURL)\n }\n\n detachEvents () {\n this.off(Events.SEEKING, this._onSeeking)\n this.off(Events.WAITING, this._onWaiting)\n this.off(Events.URL_CHANGE, this.switchURL)\n }\n\n /**\n * 代理播放器的相关API\n * platNext、_startInit\n */\n _proxyPlayer () {\n if (typeof this.player.playNext === 'function') {\n _playerPlayNext = this.player.playNext\n }\n this.player.playNext = (...args) => {\n this.playNext(...args)\n }\n\n _playerStartInit = this.player._startInit\n _playerSwitchUrl = this.player.switchURL\n _playerChangeDefinition = this.player.changeDefinition\n\n this.player._startInit = this._playerStartInit.bind(this)\n this.player.switchURL = this.switchURL.bind(this)\n this.player.changeDefinition = this.changeDefinition.bind(this)\n\n this.player.removeHooks('replay', this._replayHook)\n\n this.player.removeHooks('retry', this._retryHook)\n }\n\n _playerStartInit (url) {\n const { config, playerConfig } = this\n if (config.supportHevc === undefined) {\n if (Sniffer?.isHevcSupported && Sniffer.isHevcSupported()) {\n config.supportHevc = true\n }\n }\n const ret = this.initMp4()\n this._initPromise = ret\n this._addPendingPromise(this._initPromise)\n if (this.mse && Util.typeOf(url) === 'String' && /^blob/.test(url) && url !== this.mse.url) {\n url = playerConfig.url\n }\n ret.then(() => {\n if (this.mse) {\n url = this.mse.url\n }\n this.attachEvents()\n this._startProgress()\n }).catch((e) => {\n const isBreak = this._initPromise ? this._initPromise.isBreak : false\n if (this.isDestroy || isBreak) {\n return\n }\n\n let err = e\n if (!err.errorCode) {\n err = new Errors(this.player, {\n errorType: ERROR_TYPES.RUNTIME, // 'runtime',\n // errorTypeCode: e?.errorTypeCode || ERROR_TYPES.runtime,\n errorCode: e?.errorCode || ERROR_CODES.other,\n vid: this.playerConfig.vid,\n errorMessage: e?.errorMessage || e?.message,\n mediaError: {\n code: e?.httpCode || ERROR_CODES.other,\n message: e?.errorMessage || e?.message,\n errorType:e?.errorType\n }\n })\n err.url = url\n }\n this.useVideoLoad = true\n this.player.vtype = 'MP4_1'\n this.player.emit('playCatch', this.player.vtype, err)\n }).finally(() => {\n if (!this._initPromise) {\n return\n }\n const { isBreak } = this._initPromise\n if (isBreak) {\n return\n }\n this._initPromise && this._removePendingPromise(this._initPromise)\n this._initPromise = null\n !this.isDestroy && !isBreak && _playerStartInit.call(this.player, url)\n })\n }\n\n initMp4 () {\n const { player } = this\n if (!player.config.vid) {\n player.config.vid = Date.now()\n }\n const _promise = new ProxyPromise()\n if (this.mp4) {\n this.mp4.off(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.off(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.off(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.destroy()\n this.mp4 = null\n }\n this.mp4 = new MP4(player.config.url, {...this.config, vid: player.config.vid})\n this.mp4.on(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.on(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.on(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.on(MP4_EVENTS.UPDATE_LOAD_IDX, (fragment) => {\n this._curLoadSegmentIdx = fragment\n this.log('[update curLoadSegmentIdx]',fragment)\n })\n this.mp4.init()\n return _promise\n }\n\n _onMp4DataCallBack = () => {\n if (this._isMseInit) {\n this._onTimeUpdate()\n }\n }\n\n _onMp4MetaReady = (meta) => {\n const { config } = this\n const isH265 = this.mp4.checkCodecH265()\n try {\n if (isH265 && !this.config.supportHevc) {\n const message = 'browser not support HEVC'\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.h265Error,\n errorMessage: message,\n vid: config.vid,\n mediaError: { code: ERROR_CODES.h265Error, message: message}\n })\n this._errorHandler(_err)\n } else {\n this._initMse(meta)\n this._initPromise.resolve()\n }\n } catch (e) {\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.mse,\n errorMessage: e?.message,\n vid: config.vid,\n mediaError: { code: ERROR_CODES.other1, message: e?.message}\n })\n this._errorHandler(_err)\n return\n }\n this._loadData()\n }\n\n setConfig (newConfig) {\n this.config = Object.assign(this.config, newConfig)\n }\n\n /**\n * 播放下一个\n * @param { any } newConfig 播放器\n */\n playNext (newConfig) {\n const { player } = this\n this._defInited = false\n\n player.resetState()\n player._currentTime = 0\n player._duration = 0\n player.isPlaying = false\n this._MSEError = false\n player.pause()\n this._reset()\n player.setConfig(newConfig)\n this.log('[Index] playNext', newConfig)\n player.play()\n // 下发播放下一个视频事件\n this.emit('playnext')\n }\n\n checkDegrade (error) {\n const { closeDowngrade } = this.config\n return !closeDowngrade || error.httpCode === 'networkError'\n }\n\n\n _onMp4Error = (err) => {\n const { vid } = this.playerConfig\n console.error('[Index] _onMp4Error', vid, err)\n this._errorHandler(err)\n }\n\n _errorHandler (err) {\n const {player, config} = this\n if (!player || this.useVideoLoad) {\n return\n }\n if (!err.url && this.mp4?.url) {\n err.url = this.mp4.url\n }\n const preState = player.paused\n console.error('final error !!!!, ', config.vid, err)\n this.player.vtype = 'MP4_2'\n this.player.emit('playCatch', this.player.vtype, err)\n const isDegrade = this.checkDegrade(err)\n if (isDegrade) {\n if (this._initPromise) {\n this._removeAndRejectInitPromise(err)\n } else {\n this._startDegradedPlayback(err, preState)\n }\n } else {\n this.player.pause()\n this._reset()\n const { currentTime } = player\n this.destroyMSE()\n player.currentTime = currentTime\n this.emit('error', err)\n }\n }\n\n /**\n * @@description 降级到video播放\n */\n _startDegradedPlayback (err, preState) {\n console.log('>>>_startDegradedPlayback')\n const { player, playerConfig } = this\n this.useVideoLoad = true\n this.destroyMSE()\n this._currentTime = player.currentTime\n this.__onmetadataHandle = () => {\n if (this._currentTime) {\n player.currentTime = this._currentTime\n }\n if (preState) {\n this.player.pause()\n } else {\n this.player.play()\n }\n player.media.removeEventListener('loadedmetadata', this.__onmetadataHandle)\n this.__onmetadataHandle = null\n }\n player.media.addEventListener('loadedmetadata', this.__onmetadataHandle)\n const _url = playerConfig.url\n player.media.src = _url\n }\n\n _addPendingPromise (p) {\n this._pendingPromises.push(p)\n }\n\n _removePendingPromise (p) {\n // this.log(LogCacheLevel.LOG,'removePendingPromise', p?.id)\n const idx = this._pendingPromises.indexOf(p)\n if (idx > -1) {\n this._pendingPromises.splice(idx, 1)\n }\n }\n\n _cancelPendingPromises () {\n if (this._pendingPromises.length > 0) {\n this._pendingPromises.forEach(promise => {\n promise.reject(DESTROYED)\n })\n }\n this._pendingPromises = []\n }\n\n _removeAndRejectInitPromise (error) {\n if (this._initPromise) {\n this._removePendingPromise(this._initPromise)\n this._initPromise.reject(error)\n }\n }\n\n /**\n * 初始化MSE信息\n * @param {*} mp4\n * @param {*} meta\n * @param {*} promise\n * @param {*} preloadTimeCache\n */\n async _initMse (meta) {\n if (this.mse) {\n await this.mse.unbindMedia()\n this.mse = null\n }\n const isHvc = this.mp4 && this.mp4.checkCodecH265()\n const hasVideo = !!meta.videoCodec\n const hasAudio = !!meta.audioCodec\n\n let codec\n if (hasVideo && hasAudio) {\n codec = isHvc ? 'video/mp4; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"' : 'video/mp4; codecs=\"avc1.64001E, mp4a.40.5\"'\n } else if (hasVideo) {\n codec = isHvc ? 'video/mp4; codecs=\"hev1.1.6.L93.B0\"' : 'video/mp4; codecs=\"avc1.64001E\"'\n } else {\n codec = 'video/mp4; codecs=\"mp4a.40.5\"'\n }\n\n const contentTypes = { [MSE.VIDEO]: { mimeType: 'video/mp4', codec } }\n this.mse = new MSE()\n const openPromise = this.mse.bindMedia(this.player.video)\n openPromise.then(()=> {\n const contentTypesLocal = Object.keys(contentTypes)\n try {\n for (let i = 0; i < contentTypesLocal.length; i++) {\n const type = contentTypesLocal[i]\n this.mse.createSource(type, contentTypes[type].codec)\n }\n } catch (e) {\n console.error('MSE error: ',e)\n this._errorHandler(e)\n }\n this._isMseInit = true\n this._onTimeUpdate()\n })\n }\n\n /**\n * 销毁MSE对象 // 在重用MSE的时候,如果降级到video原生播放,单实例复用时,需要重新绑定url.所以降级到video原生的需要删除mse对象\n */\n async destroyMSE() {\n await this.mse?.unbindMedia()\n this.mse = null\n }\n\n _onTimeUpdate () {\n const { mse, mp4, player, config } = this\n if (!mp4) return\n const timeRange = mp4.timeRange\n const range = player.getBufferedRange(player.buffered2)\n if ( mse && mp4 && mp4.canDownload) {\n if (util.nowTime() - this._lastCheckTime > 1000) {\n this._lastCheckTime = util.nowTime()\n this._loadStuckCheck()\n this._checkRemoveSourceBuffer(range, player.currentTime)\n }\n const cacheMaxTime = player.paused ? player.currentTime + config.minBufferLength : player.currentTime + config.maxBufferLength\n if (range[1] - cacheMaxTime < 0) {\n timeRange.every((item, idx) => {\n if (item.downloaded) {\n return true\n }\n // 为了避免切换码率卡顿,仍有一小段旧码率的数据buffer,在此处算有buffer不会下载,所以排除下切换码率\n if (!this._isChangeDefinition && item.endTime - item.startTime > 1 && this._isInBuffer(item)) {\n item.downloaded = true\n item.isLoading = true\n this.log(`onTimeUpdate, ${idx} download segment, has buffer`,item.startTime, item.endTime)\n return true\n }\n if (item.startTime - player.currentTime < config.maxBufferLength) {\n this._curLoadSegmentIdx = idx\n this.log('[onTimeUpdate],load index==>>>, ', idx, ',IdxTimeRange, ', item.startTime, '-', item.endTime, ',buffEnd, ', range[1], ',playCurTime,', player.currentTime, ', bufferLen,', range[1] - player.currentTime, ',bufferRangeList,',this.player.buffered2 ? this.player.buffered2.bufferedList : null)\n this._loadData()\n }\n })\n }\n this._isEnded()\n }\n this.checkRemoveOldBitrateBuffer()\n }\n\n checkRemoveOldBitrateBuffer () {\n const { mse, player } = this\n if ( mse && this._removeBuffeEndTime > 0 && player.currentTime > this._removeBuffeEndTime + 1) {\n this.log('remove old bitrate buffer',this._removeBuffeEndTime)\n mse.remove(MSE.VIDEO, 0, this._removeBuffeEndTime - 1)\n this._removeBuffeEndTime = 0\n }\n }\n\n // 如果item所在的区间有buffer,则不进行重复下载\n _isInBuffer (item, gap = 0) {\n let inbuffer = false\n const buffered = this.player.video.buffered\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i) - gap\n const end = buffered.end(i) + gap\n if (start <= item.startTime && item.endTime <= end) {\n inbuffer = true\n break\n }\n }\n return inbuffer\n }\n\n async _loadData () {\n if (!this.mp4 || !this._isMseInit) {\n this.log('loadData, player.mp4 null', this._isMseInit)\n return\n }\n try {\n await this.mp4.load(this._curLoadSegmentIdx, this._loadDataSuccess)\n } catch (e) {\n console.error('[Index] _loadData error', this.playerConfig.vid , e)\n }\n }\n\n _loadDataSuccess = (data) => {\n if (this.isDestroy || !this.mse) {\n return\n }\n this.log('[loadFragment] _loadDataSuccess ', JSON.stringify(data.context.range), ',dataLen,', data.buffer ? data.buffer.byteLength : 0, data.state)\n try {\n if (data.initSeg) {\n this._appendInitSeg(data.initSeg)\n if (!data.buffer || data.buffer.byteLength < 1) {\n this.log('no data, must load data')\n this._onTimeUpdate()\n }\n }\n const {buffer, state, context } = data\n // 为了修复,可能最后一小部分回来的数据,并没有借出来任何的帧数据,所以没有调用append,不能触发计算bufferEndTime\n if (this.mse && state && (!buffer || buffer.byteLength <= 0) && context.fragIndex === this.mp4.timeRange.length - 1) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('loaded ended !!!==>>>', JSON.stringify(context.range), ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n if (this.mse && state && context.fragIndex === this.mp4.timeRange.length - 1 && (!buffer || buffer.byteLength <= 0)) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('load ended !!!==>>>', this.playerConfig.vid, JSON.stringify(context.range), ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n if (buffer && this.mse) {\n if (buffer && buffer.byteLength > 0) {\n this._appendBuffer(MSE.VIDEO, buffer, context, state)\n }\n }\n } catch (e) {\n // TODO: 测试异常处理逻辑\n this.log('appendBuffer error', e)\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.mse,\n vid: this.player.config.vid,\n errorMessage: e.message,\n mediaError: {code: ERROR_CODES.mse, message: e.message}\n })\n this._errorHandler(_err)\n }\n if (data?.state) {\n this._onTimeUpdate()\n }\n }\n\n _onWaiting = () => {\n const { player, config } = this\n clearTimeout(this._waitInBufferTimer)\n this._waitInBufferTimer = null\n const curTime = player.currentTime\n // console.log('[>>>>onWaiting],currentTime, ',curTime, util.nowTime())\n const buffer = player.bufferedPoint\n if (buffer.end > 0 && buffer.end - player.currentTime >= 2) {\n if (this._waitAdjustTimeCnt < config.waitJampBufferMaxCnt) {\n this._waitInBufferTimer = setTimeout(() => {\n this._waitAdjustTimeCnt++\n player.currentTime = player.currentTime + 0.5\n this.log('[waitInBufferTimeout], waitAdjustTimeCnt,', this._waitAdjustTimeCnt, ',curtime,', curTime, util.nowTime())\n }, config.waitingInBufferTimeOut)\n }\n }\n }\n\n _onSeeking = async () => {\n const { player, mp4 } = this\n const curTime = player.currentTime\n this.log('[seekTime], curTime,',curTime, ',buffer,',player.buffered2.bufferedList)\n if (!mp4 || !mp4.meta) {\n return\n }\n this.endofstream = false\n mp4.bufferLoadedPos = -1\n mp4._metaLoading = false\n const buffered = player.bufferedPoint\n let hasBuffered = false\n let fragIndex = 0\n if (buffered.end > 0) {\n hasBuffered = true\n if (mp4.meta.duration - buffered.end < 0.5) {\n this._startProgress()\n this.log('[seeking in buffered range], buffer end,',buffered.end, ', duration,', mp4.meta.duration)\n return\n }\n fragIndex = mp4.getFragmentIdx(buffered.end)\n if (this._curLoadSegmentIdx === fragIndex) {\n this._startProgress()\n this.log('[seeking in buffered range], seek fragIndex is current load segmentIdx', fragIndex)\n return\n }\n mp4.seekTime = buffered.end\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('[seeking in buffered range], seekTime ', curTime,',bufferRange,',buffered.start, '-',buffered.end, ', fragIndex,', fragIndex)\n }\n if (!hasBuffered) {\n mp4.seekTime = curTime\n fragIndex = mp4.getFragmentIdx(curTime)\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('[seekTime out buffer range], curTime,', curTime, ', Idx,', fragIndex)\n const { mse } = this\n if (mse && mse.isFull()) {\n const bufferList = player.buffered2.bufferedList\n const bufferRange = bufferList[bufferList.length - 1]\n mse.clearOpQueues(MSE.VIDEO)\n this._checkRemoveSourceBuffer([bufferRange.start, bufferRange.end], player.currentTime , true, true)\n }\n }\n await mp4.cancelLoading()\n mp4.resetFragmentLoadState(fragIndex)\n this._curLoadSegmentIdx = fragIndex\n this._onTimeUpdate()\n this._startProgress()\n this._isEnded()\n }\n\n\n _appendInitSeg (initSeg) {\n // 校验是否是h265的视频\n if (!this.mp4 || !this.mse) return\n this.mse.append(MSE.VIDEO, initSeg, {vid: this.playerConfig.vid, range: null, dataLen: initSeg.byteLength, isinit: true}).then((data) => {\n this.log('appendInitSeg end ==>>>', data.context ? data.context : null, ', costTime,', data.costtime)\n })\n }\n\n\n _appendBuffer (codec, buffer, context = {},state) {\n const { mse, config } = this\n mse.append(codec, buffer, {vid:config.vid, fragIndex: context.fragIndex, range: context.range, dataLen: buffer.byteLength, state}).then((data) => {\n this.log('player appendBuffer end ==>>>', data.context ? data.context : null, ', costTime,', data.costtime, ', opt,', data.name,',bufferRange,',this.player.getBufferedRange())\n if (this.mse && context.state && context.fragIndex === this.mp4.timeRange.length - 1) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('loaded ended !!!==>>>', context.range, ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n }).catch((error) => {\n console.log('[MSE error]', error)\n if (error && mse?.isFull()) {\n const bufferRange = this.player.getBufferedRange(this.player.buffered2)\n this._checkRemoveSourceBuffer(bufferRange, this.player.currentTime, true)\n }\n })\n }\n\n /**\n *清除sourcebuffer中播放过的数据\n */\n _checkRemoveSourceBuffer (sourceBufferRange, currentTime, mustClear) {\n const { mse, mp4, player } = this\n if (!mse || !mp4 || !player) return\n if (mustClear) {\n clearTimeout(this._removeBufferTimer)\n this._removeBufferTimer = null\n }\n if (!sourceBufferRange) sourceBufferRange = player.getBufferedRange(player.buffered2)\n if (!currentTime) currentTime = player.currentTime\n if (!mustClear && util.nowTime() - this._checkRemoveBufferLastTime <= this.config.removeBufferLen || this.endofstream) return\n this._checkRemoveBufferLastTime = util.nowTime()\n if (sourceBufferRange && sourceBufferRange[0] >= 0 && (currentTime - sourceBufferRange[0] > this.config.removeBufferLen || mse.isFull())) {\n const time = sourceBufferRange[1]\n const segmentIdx = mp4.getFragmentIdx(time)\n if (segmentIdx >= 0 && (mp4.timeRange[segmentIdx].startTime < currentTime)) {\n const clearEnd = Math.floor(Math.min(mp4.timeRange[segmentIdx].startTime, sourceBufferRange[1]))\n if (sourceBufferRange[0] < clearEnd) {\n this.log('[checkremoveSourceBuffer], remove range==>>>', sourceBufferRange[0], clearEnd)\n mse.remove(MSE.VIDEO, sourceBufferRange[0], clearEnd)\n } else if (mse.isFull() && !this._removeBufferTimer) {\n this._removeBufferTimer = setTimeout( () => {this._checkRemoveSourceBuffer( null, null, true)}, 10 * 1000)\n }\n }\n }\n }\n\n /**\n * 检查是否播放完成\n * @returns {Boolean}\n */\n _isEnded () {\n const { player, mp4 } = this\n const buffered = player.bufferedPoint\n const _end = buffered ? buffered.end : 0\n if (!this.endofstream && this.mse && mp4.meta.duration - player.currentTime < 0.5) {\n this.log('[check player isEnded],deal mse.endOfStream, currentTime,',player.currentTime, ', bufferend,',_end, ', duration,',mp4.meta.duration)\n this.endofstream = true\n this.mse.endOfStream()\n }\n if (mp4 && mp4.meta && mp4.meta.duration - player.currentTime < 0.5) {\n this._stopProgress()\n this.log('[check player isEnded],stopProgress and endOfStream,currentTime, ',player.currentTime, ', bufferend,',_end, ', duration,',mp4.meta.duration)\n this.mse && this.mse.endOfStream()\n return true\n }\n return false\n }\n\n\n /**\n * 切换播放源,用于同一个视频的不同播放源切换\n * @param { string || Array<{ src: string, [propName: string]: any; // 扩展定义}> } url\n */\n switchURL (definitionInfo) {\n this.changeDefinition(definitionInfo)\n }\n\n oldChangeDefinition (to, from) {\n const { config, player } = this\n this.log('[oldChangeDefinition],currentTime,',player.currentTime, ',from,',from, ',to,',to)\n const { currentTime, paused} = player\n if (!this._changeDefState) {\n this._changeDefState = {currentTime: currentTime, paused: paused}\n this.log('[oldChangeDefinition],currentTime,',player.currentTime, ',pause,',paused)\n }\n player.config.url = to.url\n config.focusUserDefinition = true\n player.currentTime = 0\n player.pause()\n this._reset()\n this._isMseInit = false\n this._changeDefineCanPlay && player.off('canplay', this._changeDefineCanPlay)\n this._changeDefineCanPlay = () => {\n this.changeDefineCanPlay(currentTime, paused, from, to)\n this._changeDefineCanPlay = null\n }\n player.once('canplay', this._changeDefineCanPlay)\n this.player.video.load()\n this.initMp4()\n }\n\n changeDefineCanPlay = (currentTime, paused, from, to) => {\n const { player } = this\n if (player.ended) {\n player.currentTime = 0\n return\n }\n this.log('[oldChangeDefinition],this._changeDefState,',this._changeDefState)\n player.currentTime = this._changeDefState ? this._changeDefState.currentTime : currentTime\n const isPause = this._changeDefState ? this._changeDefState.paused : paused\n if (isPause) {\n player.pause()\n } else {\n player.play()\n }\n this._changeDefState = null\n player.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n\n changeDefinition = async (to, from ) => {\n const { player, config, mp4 } = this\n\n if (!from) {\n from = player.curDefinition\n }\n this._MSEError = false\n\n if (config.witchBitRateWay) {\n this.oldChangeDefinition(to, from)\n return\n }\n\n player.emit(Events.DEFINITION_CHANGE, {from, to})\n const timeStart = player.currentTime\n let fragIndex = mp4.getFragmentIdx(timeStart)\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('switchBitrate:point,fragIndex,', fragIndex, ',startTime,', mp4.timeRange[fragIndex].startTime, ',currentTime,',player.currentTime)\n if (mp4) {\n this.mp4.changeBitRateTime = timeStart\n await mp4.cancelLoading()\n mp4._metaLoading && (mp4._metaLoading = false)\n }\n this._removeBuffeEndTime = mp4.timeRange[fragIndex].startTime\n this._isChangeDefinition = true\n const buffered = player.getBufferedRange(player.buffered)\n // 保留5s数据\n if (buffered[1] > 0 && buffered[1] - player.currentTime > 5) {\n this.mse.clearOpQueues(MSE.VIDEO)\n this.mse.remove(MSE.VIDEO, player.currentTime + 5, buffered[1])\n }\n this.log('switchBitrate: resetFragmentLoadState,', fragIndex)\n mp4.resetFragmentLoadState(fragIndex)\n this._curLoadSegmentIdx = fragIndex\n await this.mp4.changeBitRate(to)\n this._onTimeUpdate()\n player.emit('RESOLUTION_UPDATE', to)\n }\n\n /**\n * 卡顿超时检查启用\n * 卡顿超过一定时间则至直接降级处理\n */\n _loadStuckCheck () {\n const { config , player } = this\n if (!config.disableBufferBreakCheck) {\n if (player.currentTime - (this._lastCurrentTime || 0) > 0.1 || player.paused) {\n if (this._bufferBreakFlag === 1 || this._bufferBreakFlag === 2) {\n this.log('视频没有卡死,重置卡死标记')\n this._bufferBreakFlag = 0\n clearTimeout(this._bufferBreakTimer)\n this._bufferBreakFlag = null\n }\n } else {\n // 开启卡死计时\n if (!this._bufferBreakFlag) {\n this._bufferBreakFlag = 1\n this.log(`卡死计时开始! 持续${config.waitingTimeOut}毫秒则确认卡死`)\n this._bufferBreakTimer = setTimeout(() => {\n if (this.isDestroy) {\n return\n }\n if (this._bufferBreakFlag === 1) {\n this._bufferBreakFlag = 2\n this.log('确认卡死!!!')\n this._errorHandler(new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.waitTimeout,\n errorMessage: 'wait_timeout',\n vid: config.vid\n }))\n }\n this._bufferBreakTimer = null\n }, config.waitingTimeOut)\n }\n }\n this._lastCurrentTime = player.currentTime\n }\n }\n\n get isDestroy () {\n return !this.player\n }\n\n\n _replayHook = () => {\n this.player?.play()\n return false\n }\n\n _retryHook = () => {\n this.beforePlayerInit()\n return false\n }\n\n _stopProgress () {\n this._hasStartProgress = false\n if (this._requestTimer) {\n this._requestTimer.stop()\n this._requestTimer = null\n }\n if (this._bufferBreakTimer) {\n clearTimeout(this._bufferBreakTimer)\n this._bufferBreakTimer = null\n this._bufferBreakFlag = undefined\n }\n }\n\n _startProgress () {\n if (this._hasStartProgress) {\n return\n }\n this._stopProgress()\n this._requestTimer = new Timer(() => {\n if (this._requestTimer) {\n this._onTimeUpdate()\n }\n })\n this._requestTimer.tickEvery(this.config.tickInSeconds)\n this._hasStartProgress = true\n }\n\n\n log (message, ...optionalParams) {\n const { playerConfig } = this\n const newMessage = (playerConfig && playerConfig.vid) ? `[Index]${playerConfig.vid} ${message}` : `[Index] ${message}`\n log(newMessage, ...optionalParams)\n }\n\n /**\n * 重置当前插件的状态\n */\n _reset () {\n this._isMseInit = false\n this.endofstream = false\n\n this._curLoadSegmentIdx = 0\n this._removeBuffeEndTime = 0\n this._isChangeDefinition = false\n this._stopProgress()\n if (this.mp4) {\n this.mp4.off(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.off(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.off(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.destroy()\n this.mp4 = null\n }\n if (this.mse) {\n this.mse.unbindMedia()\n this.mse = null\n }\n this._unloadVideo()\n }\n\n // 销毁移除当前video的src\n _unloadVideo () {\n const { player } = this\n try {\n this.log(`unloadVideo src ${player.video.src}`)\n if (player.video && player.video.src) {\n player.video.removeAttribute('src') // empty source\n player.video.load()\n }\n } catch (error) {\n this.log('unloadVideo error', error)\n }\n }\n\n\n destroy () {\n const { player } = this\n\n player.removeHooks('replay', this._replayHook)\n\n player.removeHooks('retry', this._retryHook)\n\n this.detachEvents()\n this._reset()\n\n this.player.playNext = _playerPlayNext\n this.player._startInit = _playerStartInit\n this.player.changeDefinition = _playerChangeDefinition\n this.player.switchURL = _playerSwitchUrl\n\n if (this._bufferBreakTimer) {\n clearInterval(this._bufferBreakTimer)\n }\n if (this._removeBufferTimer) {\n clearTimeout(this._removeBufferTimer)\n this._removeBufferTimer = null\n }\n if (this._waitInBufferTimer) {\n clearTimeout(this._waitInBufferTimer)\n this._waitInBufferTimer = null\n }\n }\n}\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","name","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","obj","defineProperty","value","default","ResultConstructor","totalLength","_len","arrays","_key","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","arr","err","return","result","offset","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_arr","set","lib","require$$0","__esModule","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","_classCallCheck","_defineProperty","_createClass","key","sequenceNumber","width","height","fpsDen","fpsNum","duration","baseMediaDecodeTime","timescale","codec","present","pid","pps","sps","vps","sarRatio","samples","warnings","hvcC","get","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","config","codecType","isAudioEncryption","VideoSample","pts","dts","units","originPts","originDts","keyframe","flag","dependsOn","isNonSyncSample","AudioSample","data","sampleOffset","size","byteLength","Sample","FlvScriptSample","_Sample","_inherits","_super","_createSuper","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","Error","_data","_bytesAvailable","_loadWord","position","availableBytes","Math","min","workingBytes","Uint8Array","subarray","_word","DataView","buffer","getUint32","_bitsAvailable","count","skipBytes","floor","bits","val","readBits","leadingZeroCount","skipLZ","skipBits","clz","readUEG","lastScale","nextScale","readEG","Logger","_prefix","_console","disabled","console","warn","UTF8","uint8array","out","input","String","fromCharCode","_checkContinuation","ucs4","_ucs2","join","start","checkLength","array","isBrowser","window","ua","navigator","userAgent","toLocaleLowerCase","isSafari","test","isFirefox","includes","isAndroid","concatUint8Array","filter","Boolean","reduce","p","c","prevLen","forEach","d","MAX_SIZE","pow","readBig16","readBig32","readBig64","getAvcCodec","codecs","h","toString","formatIV","iv","Number","toUpperCase","bufferToString","parse","a","isArray","parseInt","map","item","NALu","end","dataLen","unit","isHevc","type","uuid","payload","uint","emulationPreventionBytesPositions","newLength","newData","sourceIndex","shift","AVC","nalUnitSize","spsParsed","spsSize","spsArr","ppsArr","spsCount","parseSPS","removeEPB","ppsSize","ppsCount","eg","readUByte","profileIdc","profileCompatibility","levelIdc","skipUEG","chromaFormat","chromaFormatIdc","readBool","scalingListCount","skipScalingList","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","fixedFrame","fps","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","AAC","rate","FREQ","indexOf","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","remaining","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","HEVC","vpsParsed","nalUnitType","numNalus","nalSize","vpsArr","numOfArrays","parseVPS","vpsMaxSubLayersMinus1","numTemporalLayers","max","_parseProfileTierLevel","spsMaxSubLayersMinus1","temporalIdNested","separateColourPlaneFlag","confWinLeftOffset","confWinRightOffset","confWinTopOffset","confWinBottomOffset","conformanceWindowFlag","bitDepthLumaMinus8","bitDepthChromaMinus8","subWidthC","subHeightC","maxSubLayersMinus1","generalTierFlag","generalProfileSpace","generalProfileIdc","generalProfileCompatibilityFlags","generalConstraintIndicatorFlags","generalLevelIdc","subLayerProfilePresentFlag","subLayerLevelPresentFlag","MAX_SILENT_FRAME_DURATION","AUDIO_EXCETION_LOG_EMIT_DURATION","FlvFixer","videoTrack","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","_this","startTime","discontinuity","contiguous","round","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","s","time","_this2","refSampleDurationInt","x","first","last","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_this3","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","_getG711Duration","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","splice","track","sampleSize","getSilentFrame","AMF","ret","_parseValue","byteOffset","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","getInt16","Date","decode","getUint16","logger","FlvDemuxer","_fixer","_remainingData","_headerParsed","reset","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","_parseAac","_parseG711","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","packetType","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","MP4Parser","headerSize","subData","findBox","box","parseBox","trackId","baseDataOffsetPresent","flags","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","baseDataOffset","sampleDescriptionIndex","defaultSampleDuration","defaultSampleSize","defaultSampleFlags","reference_ID","version","earliest_presentation_time","first_offset","references","ref","tmp32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","mvhd","trak","pssh","nextTrackId","tkhd","mdia","mdhd","hdlr","minf","lang","language","handlerType","vmhd","smhd","stbl","graphicsmode","opcolor","balance","_ret$stsd$entries$","_ret$stsd$entries$$si","_ret$stsd$entries$$si2","stsd","stts","ctts","stsc","stsz","stco","co64","default_IV_size","entries","sinf","schi","tenc","stss","senc","sampleCount","InitializationVector","subsamples","subsampleCount","subsample","BytesOfClearData","BytesOfProtectedData","keyIds","systemId","toHex","numKeyIds","keyId","data_size","kid","system_id","entryCount","b","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","bodyStart","parseVisualSampleEntry","configurationVersion","AVCProfileIndication","AVCLevelIndication","lengthSizeMinusOne","spsLength","ppsLength","tmp","generalProfileCompatibility","avgFrameRate","_ret$vps","nalus","_ret$sps","_ret$pps","hSpacing","vSpacing","parseAudioSampleEntry","byteRead","tag","substring","padStart","firstChunk","samplesPerChunk","entrySizes","mfhd","traf","t","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","v","_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","ext","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","from","audioSenc","enca","_videoTrack$encv","_audioTrack$enca","vkid","akid","videoSampleCount","_audioTrack$samples","audioSampleCount","moof","_ref","defaultSize","defaultDuration","evaluateDefaultDuration","index","_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","_ref2","pos","chunkIndex","chunkRunIndex","offsetInChunk","lastSampleInChunk","lastChunkInRun","_ref3","dataReferenceIndex","frameCount","depth","isFullBox","readBig24","str","pad","charstr","maxlen","chars","r","hex","Concat","Buffer","self","_len2","_key2","UINT32_MAX","MP4","FTYPHEV1","FTYPAVC1","init","ftyp","content","types","mvex","_toConsumableArray","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","trex","sencLength","isVideo","videoSencLength","saiz","saio","trun1","sbgp","sdtp","extension","writeUint32","samplesLength","writeUint16","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","sampleLen","_samples$i","_samples$i$flag","_samples$i$cts","trackMP4","mdiaMP4","minfMP4","stblMP4","_ref5","_ref6","sampleDescIndex","samplesSizes","offsets","keyframeIndexes","_ref7","styp","durationCount","earliestTime","mdatSize","sidx","mdat","video","audio","dinf","dref","StblTable","enable","debug","_console2","log","_console3","_len3","_key3","_console4","_len4","_key4","error","_console5","group","table","groupEnd","FMP4Remuxer","options","browserVersions","exec","forceFirstIDR","openLog","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_loop","_offset","_sample","u","setUint32","Base","properties","assign","clone","constructor","_construct","WordArray","_Base","words","sigBytes","typedArray","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","typedArrayByteLength","_words","encoder","Hex","stringify","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","_get","_getPrototypeOf","nBytes","rcache","m_w","_m_w","_m_z","mask","random","_r","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Str","latin1StrLength","Utf8","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","_Base2","_minBufferSize","_nDataBytes","m_data","doFlush","processedWords","blockSize","dataWords","dataSigBytes","nBlocksReady","nWordsReady","nBytesReady","_doProcessBlock","Hasher","_BufferedBlockAlgorit","_super3","cfg","_doReset","messageUpdate","_append","_process","hash","_doFinalize","SubHasher","message","finalize","HMAC","_Base3","_super4","_this4","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","n","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","mode","modeCreator","createEncryptor","createDecryptor","_mode","__creator","processBlock","finalProcessedBlocks","CipherParams","_super8","cipherParams","_this5","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","t0","t1","t2","t3","AES","CTR","_CTR","counter","_counter","keystream","NoPadding","Crypto","decryptWordArray","raw","realKey","realIV","decryptWord","wordArrayToUint8Array","w","decoderAESCTRData","customDescryptHandler","sencBox","encodeWord","encodeBuffers","decodeBuffers","sampleData","tempBuffer","decrypted","clearDataBuf","protectedDataLen","decodeProtectedData","dec","MP4Demuxer","videoSegmnents","audioSegmnents","_this$_videoSamples","_videoSamples","_this$_audioSamples","_audioSamples","moovToTrack","moovToSamples","dataStart","videoIndexRange","audioIndexRange","parseSamples","startByte","frame","_lastRemainBuffer","_lastRemainBufferStartPos","tryCnt","temp","e","errorMessage","videoEndByte","audioEndByte","startPts","endPts","decoderData","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","nowTime","performance","now","getTime","buf","buffered","maxHole","buffers","bufLen","lastEnd","nextStart","nextEnd","prevStart","prevEnd","currentTime","behind","ERR","MANIFEST","NETWORK","NETWORK_TIMEOUT","NETWORK_FORBIDDEN","NETWORK_NOTFOUND","NETWROK_RANGE_NOT_SATISFIABLE","DEMUX","REMUX","MEDIA","DRM","OTHER","RUNTIME","SUB_TYPES","FLV","HLS","FMP4","MSE_ADD_SB","MSE_APPEND_BUFFER","MSE_OTHER","MSE_FULL","OPTION","DASH","LICENSE","CUSTOM_LICENSE","MSE_HIJACK","EME_HIJACK","SIDX","NO_CANPLAY_ERROR","BUFFERBREAK_ERROR","WAITING_TIMEOUT_ERROR","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_CODEC_NOT_SUPPORTED","MEDIA_ERR_URL_EMPTY","ERR_CODE","_ERR_CODE","StreamingError","_Error","subType","origin","msg","errorType","originError","errorCode","_error$response","isTimeout","url","response","httpCode","status","LogCacheLevel","DEBUG","LOG","WARN","ERROR","SIMPLE_TYPE","logCacheLevel","logMaxSize","logSize","logTextArray","logCache","text","_len5","logText","_key5","finLogText","logable","JSON","delLog","toLocaleString","reduceDepth","_typeof","objType","maxDepth","MediaSource","getMediaSource","OP_NAME","MSE","media","queue","_queue","op","opName","costtime","_opst","_logger","_startQueue","_config","getDefaultConfig","bindMedia","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","mediaSource","readyState","_url","_this$mediaSource2","_mseFullFlag","VIDEO","isReduceDuration","bufferEnd","keys","_sourceBuffer","k","_enqueueBlockingOp","isEnded","_openPromise","isOpened","ms","addEventListener","onOpen","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_context","prev","unbindMedia","revokeObjectURL","src","URL","createObjectURL","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this6","_context2","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this7","changeType","_enqueueOp","createSource","_this8","_this8$_sourceBuffer$","appendBuffer","endTime","_this9","isInsertHead","remove","_this10","_this11","allClear","_this$_queue$type","initOpque","isinit","reason","_this12","setLiveSeekableRange","_this13","then","_callee3","waiters","_this14","_context3","prom","all","updating","_x2","_x3","_x4","timestampOffset","_this15","_this16","abort","mime","isTypeSupported","LoaderType","ResponseType","NetError","request","_assertThisInitialized","isPlainObject","getPrototypeOf","getRangeValue","encode","replace","setUrlParams","params","toISOString","isObject","hashIndex","createResponse","contentLength","age","firstByteTime","range","vid","priOptions","parseFloat","isNaN","calculateSpeed","byteLen","millisec","EVENT","CACHESIZE","FetchLoader","_EventEmitter","_cancel","_this$_abortControlle","timeout","responseType","onProgress","onTimeout","onCancel","transformResponse","method","headers","body","credentials","cache","redirect","referrer","referrerPolicy","onProcessMinLen","_aborted","_onProcessMinLen","_onCancel","_abortController","AbortController","_running","_index","_range","_vid","_priOptions","signal","clearTimeout","_timeoutTimer","rangeValue","Headers","append","Range","setTimeout","cancel","fetch","costTime","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","catch","_error","_reader","st","getReader","_cache","_writeIdx","reader","pump","_this3$_range","startRange","curLen","retData","read","_receivedLength","XhrLoader","req","_onProgress","_headers","_withCredentials","_body","_method","_timeout","_runing","_responseType","_firstRtt","_onTimeout","_request","_loadCompleteResolve","_loadCompleteReject","_startLoad","chunkSize","_currentChunkSizeKB","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","_createForOfIteratorHelper","getAllResponseHeaders","trim","split","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","sleep","NetLoader","transformRequest","integrity","getConfig","isSupported","task","loader","_currentTask","_processTask","cancels","_alive","finally","_this3$_currentTask","_this3$_alive","ERROR_CODES","networkError","contentError","mse","mseAppend","mse_hijack","eme_hijack","metaError","muxError","other","waitTimeout","waitTimeoutWithHidden","drm","ERROR_TYPES","NetWorkError","rangeStart","rangeEnd","_errCode","getErrorCodeByHttpCode","httpText","mediaError","code","ParserError","util","concatData","resBuffers","bufferSize","every","MediaError","Cache","moovToSegments","segmentDurations","videoSegments","audioSegments","_videoTrack$mdia","_videoTrack$mdia$minf","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia","_audioTrack$mdia$minf","_audioTrack$mdia$mdhd","segDuration","gop","gopDuration","lastFrame","segments","segFrames","adjust","pushSegment","_segments","_segFrames","curTime","moovToMeta","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia2$min2","_videoTrack$mdia3","_videoTrack$mdia3$mdh","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia2$min2","_e1$esds","_audioTrack$mdia3","_audioTrack$mdia3$mdh","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee4","moovStart","OnProgressHandle","_context4","state","_moovStart","parsedMoov","loadData","loadMetaProcess","_x7","_x8","_x9","_x5","_x6","_callee5","responses","_context5","_x10","_x11","_x12","segmentIndex","_callee6","changeCurrent","_this$getSegmentByTim","_args6","_context6","getSegmentByTime","_loadSegment","loadSegmentByTime","_x13","_x14","_callee7","_args7","_context7","_x15","_callee9","_this$getSegmentByTim2","videos","audios","_context9","_callee8","_context8","_x17","_x16","_callee10","_args10","_context10","downloadInfo","_callee11","_context11","clear","_callee12","_context12","finish","_x18","_x19","_x20","_x21","_x22","_callee13","cacheKey","_context13","_getCacheKey","fromCache","_x23","_x24","_x25","isSupport","localStorage","setItem","probeSupport","localStorageTestKey","removeItem","checkIfLocalStorageThrows","checkOpenLog","getItem","optionalParams","checkTestOpenLog","TransmuxerWorkerControl","openlog","supportHevc","worker","TransmuxerWorker","onmessage","postMessage","videoIdx","audioIdx","terminate","MP4_EVENTS","_cancelLoading","_loadFragment","_load","_checkHasMeta2","_getMetaInfo","_init","_errorHandler","_changeBitRate","curSegRange","timeRange","_mux","downloaded","bufferLoadedPos","CHUNK_SIZE","bufferLoaded","videoTrak","audioTrak","canDownload","_loadSuccessCallBack","_isPending","_metaLoading","reqOptions","_needInitSegment","_switchBitRate","enableWorker","Worker","workerSequence","transmuxerWorkerControl","muxRes","seekTime","changeBitRateTime","bitRateInfo","changeUrl","newMessage","errorHandler","getMetaInfo","isLoading","isEmitMetaEvent","startPos","onProgressHandle","metaInfo","getTimeRange","loadError","MAX_VALUE","fragIndex","_videoSeg","_audioSeg","_videoSeg2","_audioSeg2","videoSeg","audioSeg","videodiff","audiodiff","successCallback","metaReady","subRange","_checkHasMeta","getFragmentIdx","resetFragmentLoadState","resetTansmuxer","getFragRange","getSubRange","loadFragment","videoStartRange","audioStartRange","keyFrameList","getKeyFrameList","frameList","starttime","endtime","finalRange","getSamplesRange","transmux","demuxRet","demuxPart","checkCodecH265","remuxRes","remux","initSeg","fragmentIdx","_start","_buffer","startLoad","onprogressDataArrive","loadState","_e$response","isHvc","hasDestroyed","destroy","playerId","Timer","onTick","onTick_","cancelPending_","delayInSeconds","callback","timeoutId","seconds","tickAfter","tickEvery","ProxyPromise","resolvePromise","rejectPromise","publicPromise","isBreak","_playerPlayNext","_playerStartInit","_playerChangeDefinition","_playerSwitchUrl","Mp4Plugin","_BasePlugin","_loadData2","_destroyMSE","_initMse2","_isMseInit","_onTimeUpdate","isH265","mp4","_err","Errors","player","errorTypeCode","runtime","h265Error","_initMse","_initPromise","other1","playerConfig","isDestroy","_appendInitSeg","bufferEndTime","_isEnded","_appendBuffer","_assertThisInitialize2","_waitInBufferTimer","bufferedPoint","_waitAdjustTimeCnt","waitJampBufferMaxCnt","waitingInBufferTimeOut","_assertThisInitialize3","hasBuffered","_assertThisInitialize4","bufferList","bufferRange","buffered2","bufferedList","endofstream","_startProgress","_curLoadSegmentIdx","isFull","clearOpQueues","_checkRemoveSourceBuffer","cancelLoading","paused","ended","_changeDefState","pause","play","AFTER_DEFINITION_CHANGE","_assertThisInitialize6","timeStart","curDefinition","_MSEError","witchBitRateWay","oldChangeDefinition","DEFINITION_CHANGE","_removeBuffeEndTime","_isChangeDefinition","getBufferedRange","changeBitRate","_this$player","beforePlayerInit","_lastCheckTime","_pendingPromises","__mp4player","defineGetterOrSetter","__url","_proxyPlayer","SEEKING","_onSeeking","WAITING","_onWaiting","URL_CHANGE","switchURL","playNext","_startInit","changeDefinition","removeHooks","_replayHook","_retryHook","Sniffer","isHevcSupported","initMp4","_addPendingPromise","Util","typeOf","attachEvents","useVideoLoad","vtype","_removePendingPromise","_promise","_onMp4MetaReady","_onMp4Error","_onMp4DataCallBack","fragment","newConfig","_defInited","resetState","_currentTime","_duration","isPlaying","setConfig","closeDowngrade","_this$mp","preState","checkDegrade","_removeAndRejectInitPromise","_startDegradedPlayback","destroyMSE","__onmetadataHandle","idx","contentTypes","contentTypesLocal","_this$mse","_loadStuckCheck","cacheMaxTime","minBufferLength","maxBufferLength","_isInBuffer","checkRemoveOldBitrateBuffer","gap","inbuffer","_loadDataSuccess","sourceBufferRange","mustClear","_removeBufferTimer","_checkRemoveBufferLastTime","removeBufferLen","segmentIdx","clearEnd","_end","_stopProgress","definitionInfo","focusUserDefinition","_changeDefineCanPlay","changeDefineCanPlay","disableBufferBreakCheck","_lastCurrentTime","_bufferBreakFlag","_bufferBreakTimer","waitingTimeOut","_hasStartProgress","_requestTimer","tickInSeconds","_unloadVideo","detachEvents","clearInterval","BasePlugin"],"mappings":"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"}
1
+ {"version":3,"file":"index.min.js","sources":["../../../node_modules/eventemitter3/index.js","../../../node_modules/concat-typed-array/lib/index.js","../../../node_modules/concat-typed-array/lib/concat.js","../../xgplayer-transmuxer/src/model/types.js","../../xgplayer-transmuxer/src/model/video-track.js","../../xgplayer-transmuxer/src/model/audio-track.js","../../xgplayer-transmuxer/src/model/video-sample.js","../../xgplayer-transmuxer/src/model/audio-sample.js","../../xgplayer-transmuxer/src/model/metadata-track.js","../../xgplayer-transmuxer/src/utils/exp-golomb.js","../../xgplayer-transmuxer/src/utils/logger.js","../../xgplayer-transmuxer/src/utils/utf8.js","../../xgplayer-transmuxer/src/utils/env.js","../../xgplayer-transmuxer/src/utils/index.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/aac.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/mp4/mp4-parser.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../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","../../../node_modules/crypto-es/lib/pad-nopadding.js","../../xgplayer-transmuxer/src/mp4/crypto/crypto.js","../../xgplayer-transmuxer/src/mp4/mp4-demuxer.js","../src/version.js","../../xgplayer-streaming-shared/src/utils.js","../../xgplayer-streaming-shared/src/buffer.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/mse.js","../../xgplayer-streaming-shared/src/net/types.js","../../xgplayer-streaming-shared/src/net/error.js","../../xgplayer-streaming-shared/src/is.js","../../xgplayer-streaming-shared/src/net/helper.js","../../xgplayer-streaming-shared/src/event.js","../../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","../src/error.js","../src/util/index.js","../../xgplayer-mp4-loader/src/error.js","../../xgplayer-mp4-loader/src/cache.js","../../xgplayer-mp4-loader/src/utils.js","../../xgplayer-mp4-loader/src/loader.js","../../xgplayer-mp4-loader/src/config.js","../src/util/logger.js","../src/worker/index.js","../src/mp4.js","../src/util/timer.js","../src/util/proxy-promise.js","../src/mp4Plugin.js"],"sourcesContent":["'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","'use strict';\n\nvar _concat = require('./concat');\n\nvar _concat2 = _interopRequireDefault(_concat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = _concat2.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ResultConstructor) {\n var totalLength = 0;\n\n for (var _len = arguments.length, arrays = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n arrays[_key - 1] = arguments[_key];\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = arrays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var arr = _step.value;\n\n totalLength += arr.length;\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var result = new ResultConstructor(totalLength);\n var offset = 0;\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = arrays[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _arr = _step2.value;\n\n result.set(_arr, offset);\n offset += _arr.length;\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return result;\n};","/** @enum {string} */\nexport const TrackType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n METADATA: 'metadata'\n}\n\n/** @enum {string} */\nexport const VideoCodecType = {\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m'\n}\n\n/** @enum {string} */\nexport const WarningType = {\n LARGE_AV_SHIFT: 'LARGE_AV_SHIFT',\n LARGE_VIDEO_GAP: 'LARGE_VIDEO_GAP',\n LARGE_VIDEO_GAP_BETWEEN_CHUNK: 'LARGE_VIDEO_GAP_BETWEEN_CHUNK',\n LARGE_AUDIO_GAP: 'LARGE_AUDIO_GAP',\n AUDIO_FILLED: 'AUDIO_FILLED',\n AUDIO_DROPPED: 'AUDIO_DROPPED'\n}\n","import { TrackType, VideoCodecType } from './types'\n\nexport class VideoTrack {\n id = 1\n\n /** @readonly */\n type = TrackType.VIDEO\n\n codecType = VideoCodecType.AVC\n\n pid = -1 // ts use\n\n /** @type {Uint8Array | Object} */\n hvcC = undefined\n\n codec = ''\n\n timescale = 0\n\n formatTimescale = 0\n\n sequenceNumber = 0\n\n baseMediaDecodeTime = 0\n\n baseDts = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./video-sample').VideoSample[]} */\n samples = []\n\n /** @type {Uint8Array[]} */\n pps = []\n\n /** @type {Uint8Array[]} */\n sps = []\n\n /** @type {Uint8Array[]} */\n vps = []\n\n fpsNum = 0\n\n fpsDen = 0\n\n /** @type {[number, number]} */\n sarRatio = [] // [hSpacing, vSpacing]\n\n width = 0\n\n height = 0\n\n nalUnitSize = 4\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n isVideo = true\n\n kid = null\n\n pssh = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber =\n this.width =\n this.height =\n this.fpsDen =\n this.fpsNum =\n this.duration =\n this.baseMediaDecodeTime =\n this.timescale = 0\n this.codec = ''\n this.present = false\n this.pid = -1\n this.pps = []\n this.sps = []\n this.vps = []\n this.sarRatio = []\n this.samples = []\n this.warnings = []\n this.hvcC = null\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.pps.length && this.sps.length && this.codec)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isVideoEncryption\n }\n}\n","import { TrackType, AudioCodecType } from './types'\n\nexport class AudioTrack {\n id = 2\n\n /** @readonly */\n type = TrackType.AUDIO\n\n codecType = AudioCodecType.AAC\n\n pid = -1\n\n codec = ''\n\n sequenceNumber = 0\n\n sampleDuration = 0\n\n timescale = 0\n\n formatTimescale = 0\n\n baseMediaDecodeTime = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./audio-sample').AudioSample[]} */\n samples = []\n\n baseDts = 0\n\n sampleSize = 16\n\n sampleRate = 0\n\n channelCount = 0\n\n objectType = 0\n\n sampleRateIndex = 0\n\n /** @type {number[]} */\n config = []\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n kid = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber = 0\n this.timescale = 0\n this.sampleDuration = 0\n this.sampleRate = 0\n this.channelCount = 0\n this.baseMediaDecodeTime = 0\n this.present = false\n this.pid = -1\n this.codec = ''\n this.samples = []\n this.config = []\n this.warnings = []\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isAudioEncryption\n }\n}\n","/**\n * @typedef {Object} VideoFlag\n * @property {number} [isLeading=0]\n * @property {number} [dependsOn=1]\n * @property {number} [isDependedOn=0]\n * @property {number} [hasRedundancy=0]\n * @property {number} [paddingValue=0]\n * @property {number} [degradationPriority=0]\n * @property {number} [isNonSyncSample=1]\n */\n\nexport class VideoSample {\n /** @type {VideoFlag} */\n flag = {}\n\n keyframe = false\n\n gopId = 0\n\n duration = 0\n\n size = 0\n\n units = []\n\n chromaFormat = 420\n\n // sampleOffset = 0\n\n /**\n * @param {number} pts\n * @param {number} dts\n * @param {Uint8Array[]} [units]\n */\n constructor (pts, dts, units) {\n this.originPts = this.pts = pts\n this.originDts = this.dts = dts\n if (units) this.units = units\n }\n\n /**\n * @returns {number}\n */\n get cts () {\n return this.pts - this.dts\n }\n\n setToKeyframe () {\n this.keyframe = true\n this.flag.dependsOn = 2\n this.flag.isNonSyncSample = 0\n }\n}\n","export class AudioSample {\n duration = 1024\n\n flag = { dependsOn: 2, isNonSyncSample: 0 }\n keyframe = true\n\n /**\n * @param {number} pts\n * @param {Uint8Array} data\n * @param {number} [duration=1024]\n */\n constructor (pts, data, duration, sampleOffset) {\n this.originPts = this.pts = this.dts = pts\n this.data = data\n this.size = data.byteLength\n this.sampleOffset = sampleOffset\n if (duration) this.duration = duration\n }\n}\n","import { TrackType } from './types'\n\nclass Sample {\n time = 0 // second\n\n /**\n * @param {Object} data\n * @param {number} pts\n */\n constructor (data, pts) {\n this.data = data\n this.originPts = this.pts = pts\n }\n}\n\nexport class FlvScriptSample extends Sample {}\n\nexport class SeiSample extends Sample {}\n\nexport class MetadataTrack {\n /** @readonly */\n id = 3\n\n /** @readonly */\n type = TrackType.METADATA\n\n timescale = 0\n\n /** @type {FlvScriptSample[]} */\n flvScriptSamples = []\n\n /** @type {SeiSample[]} */\n seiSamples = []\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!((this.flvScriptSamples.length || this.seiSamples.length) && this.timescale)\n }\n\n reset () {\n this.timescale = 0\n this.flvScriptSamples = []\n this.seiSamples = []\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!(this.flvScriptSamples.length || this.seiSamples.length)\n }\n}\n","export class ExpGolomb {\n _bytesAvailable\n\n _bitsAvailable = 0\n\n _word = 0\n\n constructor (data) {\n if (!data) throw new Error('ExpGolomb data params is required')\n this._data = data\n this._bytesAvailable = data.byteLength\n if (this._bytesAvailable) this._loadWord()\n }\n\n 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","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 { isFirefox, isAndroid } from '../utils'\n\nexport class AAC {\n static FREQ = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350\n ];\n\n static getRateIndexByRate (rate) {\n return AAC.FREQ.indexOf(rate)\n }\n\n static parseADTS (data, pts) {\n const len = data.length\n let i = 0\n\n while ((i + 2) < len) {\n if (data[i] === 0xff && (data[i + 1] & 0xf6) === 0xf0) {\n break\n }\n i++\n }\n\n if (i >= len) return\n\n const skip = i\n const frames = []\n const samplingFrequencyIndex = (data[i + 2] & 0x3c) >>> 2\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n if (!sampleRate) throw new Error(`Invalid sampling index: ${samplingFrequencyIndex}`)\n const objectType = ((data[i + 2] & 0xc0) >>> 6) + 1\n const channelCount = ((data[i + 2] & 1) << 2) | ((data[i + 3] & 0xc0) >>> 6)\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n let protectionSkipBytes\n let frameLength\n let frameIndex = 0\n const duration = AAC.getFrameDuration(sampleRate)\n\n while ((i + 7) < len) {\n if ((data[i] !== 0xff) || (data[i + 1] & 0xF6) !== 0xf0) {\n i++\n continue\n }\n\n frameLength = ((data[i + 3] & 0x03) << 11) | (data[i + 4] << 3) | ((data[i + 5] & 0xe0) >> 5)\n if ((len - i) < frameLength) break\n\n protectionSkipBytes = (~data[i + 1] & 0x01) * 2\n frames.push({\n pts: pts + frameIndex * duration,\n data: data.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n })\n\n frameIndex++\n i += frameLength\n }\n\n return {\n skip,\n remaining: i >= len ? undefined : data.subarray(i),\n frames,\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n codec,\n config,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static parseAudioSpecificConfig (data) {\n if (!data.length) return\n const objectType = data[0] >>> 3\n const samplingFrequencyIndex = ((data[0] & 0x07) << 1) | (data[1] >>> 7)\n const channelCount = (data[1] & 0x78) >>> 3\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n // play as no audio track stream\n if (!sampleRate) return\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n return {\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n config,\n codec,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static getFrameDuration (rate, timescale = 90000) {\n return 1024 * timescale / rate\n }\n\n static _getConfig (samplingIndex, channelCount, originObjectType) {\n const config = []\n let objectType\n let extensionSamplingIndex\n if (isFirefox) {\n if (samplingIndex >= 6) { // use SBR (HE-AAC)\n objectType = 5\n extensionSamplingIndex = samplingIndex - 3\n } else { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n } else if (isAndroid) { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n } else { // use HE-AAC\n objectType = (originObjectType === 2 || originObjectType === 5) ? originObjectType : 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb } from '../utils'\n\nexport class HEVC {\n static parseHEVCDecoderConfigurationRecord (data, hvcC = {}) {\n if (data.length < 23) return\n hvcC = hvcC || {}\n const nalUnitSize = (data[21] & 3) + 1\n\n let vpsParsed\n let spsParsed\n const spsArr = []\n const ppsArr = []\n const vpsArr = []\n\n let offset = 23\n const numOfArrays = data[22]\n\n let nalUnitType\n let numNalus\n let nalSize\n for (let i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f\n numNalus = (data[offset + 1] << 8) | data[offset + 2]\n\n offset += 3\n\n for (let j = 0; j < numNalus; j++) {\n nalSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!nalSize) continue\n switch (nalUnitType) {\n case 32: {\n const vps = data.subarray(offset, offset + nalSize)\n if (!vpsParsed) vpsParsed = HEVC.parseVPS(NALu.removeEPB(vps), hvcC)\n vpsArr.push(vps)\n }\n break\n case 33: {\n const sps = data.subarray(offset, offset + nalSize)\n if (!spsParsed) spsParsed = HEVC.parseSPS(NALu.removeEPB(sps), hvcC)\n spsArr.push(sps)\n }\n break\n case 34:\n ppsArr.push(data.subarray(offset, offset + nalSize))\n break\n default:\n }\n\n offset += nalSize\n }\n }\n\n return {\n hvcC,\n sps: spsParsed,\n spsArr,\n ppsArr,\n vpsArr,\n nalUnitSize\n }\n }\n\n static parseVPS (unit, hvcC) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(12)\n const vpsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(hvcC.numTemporalLayers || 0, vpsMaxSubLayersMinus1 + 1)\n eg.readBits(17)\n HEVC._parseProfileTierLevel(eg, vpsMaxSubLayersMinus1, hvcC)\n\n return hvcC\n }\n\n static parseSPS (unit, hvcC = {}) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(4)\n const spsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(spsMaxSubLayersMinus1 + 1, hvcC.numTemporalLayers || 0)\n hvcC.temporalIdNested = eg.readBits(1)\n HEVC._parseProfileTierLevel(eg, spsMaxSubLayersMinus1, hvcC)\n\n eg.readUEG() // sps_seq_parameter_set_id\n\n const chromaFormatIdc = hvcC.chromaFormatIdc = eg.readUEG()\n let chromaFormat = 420\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n\n let separateColourPlaneFlag = 0\n if (chromaFormatIdc === 3) {\n separateColourPlaneFlag = eg.readBits(1)\n }\n\n let width = eg.readUEG() // pic_width_in_luma_samples\n let height = eg.readUEG() // pic_height_in_luma_samples\n\n const conformanceWindowFlag = eg.readBits(1)\n\n let confWinLeftOffset\n let confWinRightOffset\n let confWinTopOffset\n let confWinBottomOffset\n if (conformanceWindowFlag === 1) {\n confWinLeftOffset = eg.readUEG() // conf_win_left_offset\n confWinRightOffset = eg.readUEG() // conf_win_right_offset\n confWinTopOffset = eg.readUEG() // conf_win_top_offset\n confWinBottomOffset = eg.readUEG() // conf_win_bottom_offset\n }\n\n hvcC.bitDepthLumaMinus8 = eg.readUEG() // bit_depth_luma_minus8\n hvcC.bitDepthChromaMinus8 = eg.readUEG() // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n const subWidthC = (((chromaFormatIdc === 1) || (chromaFormatIdc === 2)) && (separateColourPlaneFlag === 0)) ? 2 : 1\n const subHeightC = ((chromaFormatIdc === 1) && (separateColourPlaneFlag === 0)) ? 2 : 1\n width -= (subWidthC * (confWinRightOffset + confWinLeftOffset))\n height -= (subHeightC * (confWinBottomOffset + confWinTopOffset))\n }\n\n return {\n codec: 'hev1.1.6.L93.B0',\n width,\n height,\n chromaFormat,\n hvcC\n }\n }\n\n static _parseProfileTierLevel (eg, maxSubLayersMinus1, hvcC) {\n const generalTierFlag = hvcC.generalTierFlag || 0\n hvcC.generalProfileSpace = eg.readBits(2)\n hvcC.generalTierFlag = Math.max(eg.readBits(1), generalTierFlag)\n hvcC.generalProfileIdc = Math.max(eg.readBits(5), hvcC.generalProfileIdc || 0)\n hvcC.generalProfileCompatibilityFlags = eg.readBits(32)\n hvcC.generalConstraintIndicatorFlags = [eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8)]\n const generalLevelIdc = eg.readBits(8)\n if (generalTierFlag < hvcC.generalTierFlag) {\n hvcC.generalLevelIdc = generalLevelIdc\n } else {\n hvcC.generalLevelIdc = Math.max(generalLevelIdc, hvcC.generalLevelIdc || 0)\n }\n\n const subLayerProfilePresentFlag = []\n const subLayerLevelPresentFlag = []\n\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","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 500 // ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 1000 // ms\nconst AUDIO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCETION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BREACKED_CHECK_TIME = 5\n\nexport class FlvFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastVideoDuration = 0\n\n // 在视频帧遇到下一个关键帧之前,如果音频时间戳发生了跳变,不能确定是否音视频都发生跳变还是单纯音频发生跳变.\n // 这里记录关键帧标识, 从下一个关键帧开始,如果视频没有跳变,才能判断是只有音频发生了跳变\n this._keyFrameInNextChunk = false\n\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n /**\n * @param {number} startTime 点播seek到的时间点\n * @param {boolean} discontinuity 是否换流\n * @param {boolean} contiguous 前后chunk时间戳是否连续\n */\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 1000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n if (discontinuity || !contiguous) {\n this._videoLastSample = null\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n if (discontinuity && !contiguous) {\n this._baseDtsInited = false\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(audioTrack, videoTrack)\n }\n\n if (!contiguous && startTime) {\n this._audioNextPts = this._videoNextDts = startTime\n }\n\n const resetBaseDts = this._baseDtsInited &&\n (this._videoTimestampBreak || !this.videoTrack.exist()) &&\n (this._audioTimestampBreak || !this.audioTrack.exist())\n\n if (resetBaseDts) {\n this._resetBaseDtsWhenStreamBreaked()\n }\n\n this._fixAudio(audioTrack)\n\n this._keyFrameInNextChunk = false\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n this.metadataTrack.flvScriptSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 1000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n if (x.keyframe) this._keyFrameInNextChunk = true\n })\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else if (videoTrack.length > 1) {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[samples.length - 1]\n refSampleDurationInt = Math.floor((last.dts - first.dts) / (samples.length - 1))\n } else {\n refSampleDurationInt = this._lastVideoDuration || 40\n }\n\n const lastSample = samples.pop()\n\n if (this._videoLastSample) {\n samples.unshift(this._videoLastSample)\n }\n\n this._videoLastSample = lastSample\n\n if (!samples.length) return\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // emit large delta of first sample with expect\n if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n }\n\n // only video breaked\n if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {\n this._videoNextDts = firstSample.dts\n this._videoTimestampBreak = 0\n } else {\n // resolve first frame only\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n if (!this.audioTrack.exist()) {\n this._videoTimestampBreak = 1\n }\n }\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (lastSample) {\n sampleDuration = lastSample.dts - dts\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n this._videoTimestampBreak++\n // emit stream breaked\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionLargeGapDot = dts\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n sampleDuration = refSampleDurationInt\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n this._lastVideoDuration = sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n if (!samples.length) return\n\n // offset origin timestamp\n samples.forEach(x => {\n x.dts = x.pts -= this._baseDts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 1000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n /**\n * timestamp breaked\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n if (!this.audioTrack.exist()){\n this._baseDts -= this._videoNextDts\n } else if (!this.videoTrack.exist()){\n this._baseDts -= this._audioNextPts\n } else {\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n }\n this._videoTimestampBreak = 0\n this._audioTimestampBreak = 0\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) {\n audioTrack.sampleDuration = audioTrack.codecType === AudioCodecType.AAC\n ? AAC.getFrameDuration(audioTrack.timescale, timescale)\n : this._getG711Duration(audioTrack)\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1000\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n let nextPts = this._audioNextPts\n const sample = samples[i]\n let delta = sample.pts - nextPts\n\n // only audio breaked\n if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {\n nextPts = this._audioNextPts = sample.dts\n delta = 0\n this._audioTimestampBreak = 0\n }\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n }\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(this._audioNextPts + refSampleDuration) - Math.floor(this._audioNextPts), silentFrame, sampleDurationInSampleRate)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak++\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n this._audioNextPts += refSampleDuration\n }\n }\n }\n\n _getG711Duration (track) {\n const { sampleSize, channelCount, sampleRate } = track\n const samp0 = track.samples[0]\n if (!samp0) return\n return samp0.data.byteLength * 2 / channelCount / (sampleSize / 8) / sampleRate * 1000\n }\n\n _getSilentFrame (track) {\n if (track.codecType === AudioCodecType.AAC) return AAC.getSilentFrame(track.codec, track.channelCount)\n return new Uint8Array(8 * track.sampleDuration * track.channelCount)\n }\n}\n","import { UTF8 } from '../utils'\n\nexport class AMF {\n static parse (data) {\n if (data.length < 3) return\n\n const ret = {}\n const name = AMF._parseValue(new DataView(data.buffer, data.byteOffset, data.byteLength))\n const value = AMF._parseValue(new DataView(data.buffer, data.byteOffset + name.size, data.byteLength - name.size))\n ret[name.data] = value.data\n\n return ret\n }\n\n static _parseValue (view) {\n const dataLen = view.byteLength\n const type = view.getUint8(0)\n let offset = 1\n let isEnd = false\n let value\n\n switch (type) {\n case 0: // Number(Double) type\n value = view.getFloat64(1)\n offset += 8\n break\n case 1: { // Boolean type\n value = !!view.getUint8(1)\n offset += 1\n break\n }\n case 2: { // String type\n const { data, size } = AMF._parseString(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value = data\n offset += size\n }\n break\n case 3: { // Object(s) type\n value = {}\n let terminal = 0\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) offset += 3\n }\n }\n break\n case 8: { // ECMA array type (Mixed array)\n value = {}\n offset += 4 // ECMAArrayLength(UI32)\n let terminal = 0 // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) {\n offset += 3\n }\n }\n }\n break\n case 9: // ScriptDataObjectEnd\n value = undefined\n offset = 1\n isEnd = true\n break\n case 10: { // Strict array type\n value = []\n const strictArrayLength = view.getUint32(1)\n offset += 4\n for (let i = 0; i < strictArrayLength; i++) {\n const { data, size } = AMF._parseValue(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value.push(data)\n offset += size\n }\n }\n break\n case 11: { // Date type\n const timestamp = view.getFloat64(offset) + view.getInt16(offset + 8) * 60000\n value = new Date(timestamp)\n offset += 10\n }\n break\n case 12: { // Long string type\n const length = view.getUint32(1)\n offset += 4\n value = ''\n if (length > 0) {\n value = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + offset, length))\n }\n offset += length\n }\n break\n default:\n offset = dataLen\n break\n }\n\n return {\n data: value,\n size: offset,\n isEnd\n }\n }\n\n static _parseString (view) {\n const length = view.getUint16(0)\n let data = ''\n if (length > 0) {\n data = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + 2, length))\n }\n\n return {\n data,\n size: 2 + length\n }\n }\n\n static _parseObject (view) {\n if (view.byteLength < 3) return\n\n const name = AMF._parseString(view)\n const value = AMF._parseValue(new DataView(view.buffer, view.byteOffset + name.size, view.byteLength - name.size))\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n isEnd: value.isEnd\n }\n }\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample, VideoCodecType, AudioCodecType, FlvScriptSample, SeiSample } from '../model'\nimport { FlvFixer } from './fixer'\nimport { concatUint8Array, Logger, readBig32 } from '../utils'\nimport { AAC, AVC, HEVC, NALu } from '../codec'\nimport { AMF } from './amf'\n\nconst logger = new Logger('FlvDemuxer')\n\n/**\n * @typedef {Object} DemuxResult\n * @property {VideoTrack} videoTrack\n * @property {AudioTrack} audioTrack\n * @property {MetadataTrack} metadataTrack\n */\n\nexport class FlvDemuxer {\n _headerParsed = false\n _remainingData = null\n _gopId = 0\n _needAddMetaBeforeKeyFrameNal = true // 标识H265流中关键帧Nal之前是否需要插入vps、sps、pps Nal\n\n static AUDIO_RATE = [5500, 11000, 22000, 44000]\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new FlvFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false] 切流\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\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 this._parseVideo(bodyData, timestamp)\n } else if (tagType === 18) {\n this._parseScript(bodyData, timestamp)\n } else {\n logger.warn(`Invalid tag type: ${tagType}`)\n }\n\n offset += dataSize\n prevTagSize = readBig32(data, offset)\n if (prevTagSize !== 11 + dataSize) {\n logger.warn(`Invalid PrevTagSize ${prevTagSize} (${11 + dataSize})`)\n }\n\n offset += 4\n }\n\n if (offset < dataLen) {\n this._remainingData = data.subarray(offset)\n }\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1000\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n if (!audioTrack.exist() && audioTrack.hasSample()) {\n audioTrack.reset()\n }\n if (!videoTrack.exist() && videoTrack.hasSample()) {\n videoTrack.reset()\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n * @returns {DemuxResult}\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return false\n }\n return readBig32(data, 5) >= 9\n }\n\n _parseAudio (data, pts) {\n if (!data.length) return\n\n const format = (data[0] & 0xf0) >>> 4\n const track = this.audioTrack\n\n if (\n format !== 10 && // AAC\n format !== 7 && // G.711 A-law logarithmic PCM\n format !== 8 // G.711 mu-law logarithmic PCM\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== 10) {\n const soundRate = (data[0] & 0x0c) >> 2\n const soundSize = (data[0] & 0x02) >> 1\n const soundType = (data[0] & 0x01)\n track.sampleRate = FlvDemuxer.AUDIO_RATE[soundRate]\n track.sampleSize = soundSize ? 16 : 8\n track.channelCount = soundType + 1\n }\n\n if (format === 10) {\n this._parseAac(data, pts)\n } else {\n this._parseG711(data, pts, format)\n }\n }\n\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(new AudioSample(pts, data.subarray(1)))\n }\n\n _parseAac (data, pts) {\n const track = this.audioTrack\n track.codecType = AudioCodecType.AAC\n\n if (data[1] === 0) { // AACPacketType\n const ret = AAC.parseAudioSpecificConfig(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n } else if (data[1] === 1) { // Raw AAC frame data\n if (pts === undefined || pts === null) return\n track.samples.push(new AudioSample(pts, data.subarray(2)))\n } else {\n logger.warn(`Unknown AACPacketType: ${data[1]}`)\n }\n }\n\n _parseVideo (data, dts) {\n if (data.length < 6) return\n\n const frameType = (data[0] & 0xf0) >>> 4\n const codecId = data[0] & 0x0f\n\n const track = this.videoTrack\n\n if (\n codecId !== 7 && // AVC\n codecId !== 12 // HEVC\n ) {\n track.reset()\n logger.warn(`Unsupported codecId: ${codecId}`)\n return\n }\n\n const isHevc = codecId === 12\n track.codecType = isHevc ? VideoCodecType.HEVC : VideoCodecType.AVC\n\n const packetType = data[1]\n const cts = (((data[2] << 16) | (data[3] << 8) | (data[4])) << 8) >> 8\n\n if (packetType === 0) { // DecoderConfigurationRecord\n const configData = data.subarray(5)\n const ret = isHevc\n ? HEVC.parseHEVCDecoderConfigurationRecord(configData)\n : AVC.parseAVCDecoderConfigurationRecord(configData)\n if (ret) {\n const { hvcC, sps, ppsArr, spsArr, vpsArr, nalUnitSize } = ret\n if (hvcC) {\n track.hvcC = track.hvcC || hvcC\n }\n if (sps) {\n track.codec = sps.codec\n track.width = sps.width\n track.height = sps.height\n track.sarRatio = sps.sarRatio\n track.fpsNum = sps.fpsNum\n track.fpsDen = sps.fpsDen\n }\n if (spsArr.length) track.sps = spsArr\n if (ppsArr.length) track.pps = ppsArr\n if (vpsArr && vpsArr.length) track.vps = vpsArr\n if (nalUnitSize) track.nalUnitSize = nalUnitSize\n } else {\n logger.warn(`Cannot parse ${isHevc ? 'HEVC' : 'AVC'}DecoderConfigurationRecord`, data)\n }\n } else if (packetType === 1) { // One or more NALUs\n let units = NALu.parseAvcC(data.subarray(5), track.nalUnitSize)\n\n units = this._checkAddMetaNalToUnits(isHevc, units, track)\n\n if (units && units.length) {\n const sample = new VideoSample(dts + cts, dts, units)\n if (frameType === 1) {\n sample.setToKeyframe()\n }\n track.samples.push(sample)\n\n units.forEach(unit => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n dts + cts\n ))\n break\n default:\n }\n })\n\n if (sample.keyframe) {\n this._gopId++\n }\n sample.gopId = this._gopId\n } else {\n logger.warn('Cannot parse NALUs', data)\n }\n } else if (packetType === 2) {\n // AVC end of sequence, Empty\n } else {\n logger.warn(`Unknown AVCPacketType: ${packetType}`)\n }\n }\n\n _checkAddMetaNalToUnits (hevc, units, track) {\n if (!hevc || !this._needAddMetaBeforeKeyFrameNal) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n const nalTypes = units.map(x => (x[0] >>> 1) & 0x3f)\n\n if (nalTypes.includes(32)) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n units.unshift(track.pps[0])\n units.unshift(track.sps[0])\n units.unshift(track.vps[0])\n\n return units.filter(Boolean)\n }\n\n _parseScript (data, pts) {\n this.metadataTrack.flvScriptSamples.push(new FlvScriptSample(AMF.parse(data), pts))\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\n\nconst logger = new Logger('TsDemuxer')\n\nexport class TsDemuxer {\n _pmtId = -1\n _remainingPacketData = null\n _videoPesData = []\n _audioPesData = []\n _gopId = 0\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {import('../flv').DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity) {\n this._pmtId = -1\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n }\n\n if (!contiguous || discontinuity) {\n this._remainingPacketData = null\n this._videoPesData = []\n this._audioPesData = []\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingPacketData) {\n data = concatUint8Array(this._remainingPacketData, data)\n this._remainingPacketData = null\n }\n }\n\n let dataLen = data.length\n const remainingLength = dataLen % 188\n if (remainingLength) {\n this._remainingPacketData = data.subarray(dataLen - remainingLength)\n dataLen -= remainingLength\n }\n\n let videoPid = videoTrack.pid\n let audioPid = audioTrack.pid\n\n for (let start = 0; start < dataLen; start += 188) {\n if (data[start] !== 0x47) throw new Error('TS packet did not start with 0x47')\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40)\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]\n const adaptationFiledControl = (data[start + 3] & 0x30) >> 4\n\n let offset\n if (adaptationFiledControl > 1) {\n offset = start + 5 + data[start + 4]\n if (offset === start + 188) continue\n } else {\n offset = start + 4\n }\n\n switch (pid) {\n case 0: // PAT\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n this._pmtId = ((data[offset + 10] & 0x1f) << 8) | data[offset + 11]\n break\n case this._pmtId: {\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n const tableEnd = offset + 3 + (((data[offset + 1] & 0x0f) << 8) | data[offset + 2]) - 4\n const programInfoLength = ((data[offset + 10] & 0x0f) << 8) | data[offset + 11]\n offset += 12 + programInfoLength\n\n while (offset < tableEnd) {\n const esPid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2]\n switch (data[offset]) {\n case 0x0f: // AAC ADTS\n audioTrack.pid = audioPid = esPid\n break\n case 0x1b: // AVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.AVC\n videoTrack.pid = videoPid = esPid\n break\n case 0x24: // HEVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.HEVC\n videoTrack.pid = videoPid = esPid\n break\n default:\n logger.warn(`Unsupported stream. type: ${data[offset]}, pid: ${esPid}`)\n }\n\n offset += (((data[offset + 3] & 0x0f) << 8) | data[offset + 4]) + 5\n }\n }\n break\n case videoPid:\n if (payloadUnitStartIndicator && this._videoPesData.length) {\n this._parseVideoData()\n }\n this._videoPesData.push(data.subarray(offset, start + 188))\n break\n case audioPid:\n if (payloadUnitStartIndicator && this._audioPesData.length) {\n this._parseAudioData()\n }\n this._audioPesData.push(data.subarray(offset, start + 188))\n break\n case 17:\n case 0x1fff:\n break\n default:\n logger.warn(`Unknown pid: ${pid}`)\n }\n }\n\n this._parseVideoData()\n this._parseAudioData()\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 90000\n\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (!data.length) return false\n return data[0] === 0x47 && data[188] === 0x47 && data[376] === 0x47\n }\n\n _parseVideoData () {\n if (!this._videoPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._videoPesData))\n if (!pes) {\n logger.warn('Cannot parse video pes', this._videoPesData)\n return\n }\n\n const units = NALu.parseAnnexB(pes.data)\n if (units) {\n this._createVideoSample(units, pes.pts, pes.dts)\n } else {\n logger.warn('Cannot parse avc units', pes)\n }\n\n this._videoPesData = []\n }\n\n _createVideoSample (units, pts, dts) {\n if (!units.length) return\n const track = this.videoTrack\n const isHevc = track.codecType === VideoCodecType.HEVC\n\n const sample = new VideoSample(pts, dts)\n units.forEach((unit) => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n this._gopId++\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n pts\n ))\n // fix 分割nal之前只要sei信息被当做单独一个sample\n return\n case 32: // HEVC VPS\n if (!isHevc) break\n if (!track.vps.length) {\n const hvcC = HEVC.parseVPS(NALu.removeEPB(unit), track.hvcC)\n track.hvcC = track.hvcC || hvcC\n track.vps = [unit]\n }\n break\n case 7: // SPS\n case 33: // HEVC SPS\n if ((!isHevc && type !== 7) || (isHevc && type === 7)) break\n if (!track.sps.length) {\n const data = NALu.removeEPB(unit)\n const spsInfo = isHevc ? HEVC.parseSPS(data, track.hvcC) : AVC.parseSPS(data)\n track.sps = [unit]\n track.hvcC = track.hvcC || spsInfo.hvcC\n track.codec = spsInfo.codec\n track.width = spsInfo.width\n track.height = spsInfo.height\n track.sarRatio = spsInfo.sarRatio\n track.fpsNum = spsInfo.fpsNum\n track.fpsDen = spsInfo.fpsDen\n }\n break\n case 8: // PPS\n case 34: // HEVC PPS\n if ((!isHevc && type !== 8) || (isHevc && type === 8)) break\n if (!track.pps.length) track.pps = [unit]\n break\n case 9: // AUD\n case 35: // HEVC AUD\n // if ((!isHevc && type !== 9) || (isHevc && type === 9)) break\n // sample.gopId = this._gopId\n // if (sample.units.length && !keyFrame) {\n // this._pushVideoSample(track, sample)\n // sample = this.prevAvcSample = new VideoSample(pts, dts)\n // }\n break\n default:\n }\n sample.units.push(unit)\n })\n sample.gopId = this._gopId\n this._pushVideoSample(track, sample)\n }\n\n _pushVideoSample (track, sample) {\n if (sample.units.length) {\n if (sample.pts === null || sample.pts === undefined) {\n logger.warn('Video sample no pts', sample)\n const lastSample = track.samples[track.samples.length - 1]\n if (lastSample) {\n sample.pts = lastSample.pts\n sample.dts = lastSample.dts\n } else {\n logger.warn('Drop video sample', sample)\n }\n } else {\n track.samples.push(sample)\n }\n }\n }\n\n _parseAudioData () {\n if (!this._audioPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._audioPesData))\n if (!pes) {\n logger.warn('Cannot parse audio pes', this._audioPesData)\n return\n }\n\n this._parseAacData(pes)\n\n this._audioPesData = []\n }\n\n _parseAacData (pes) {\n const track = this.audioTrack\n let pts = pes.pts\n if (pts === null || pts === undefined) {\n logger.warn('AAC pes not pts', track)\n if (!track.samples.length || !track.sampleRate) {\n return\n }\n pts = track.samples[track.samples.length - 1].pts + AAC.getFrameDuration(track.sampleRate)\n }\n\n const ret = AAC.parseADTS(pes.data, pts)\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n track.config = ret.config\n track.samples.push(...ret.frames.map((s) => new AudioSample(s.pts, s.data)))\n\n if (ret.skip) {\n logger.warn(`Skip aac adts ${ret.skip} bits`)\n }\n if (ret.remaining) {\n logger.warn(`Remaining aac adts ${ret.remaining} bits`)\n }\n } else {\n logger.warn('Cannot parse aac adts', pes)\n }\n }\n\n static _parsePES (data) {\n const headerDataLen = data[8]\n if (headerDataLen === null || headerDataLen === undefined || data.length < (headerDataLen + 9)) return\n const startPrefix = data[0] << 16 | data[1] << 8 | data[2]\n if (startPrefix !== 1) return\n const pesLen = (data[4] << 8) + data[5]\n if (pesLen && pesLen > data.length - 6) return\n\n let pts\n let dts\n const ptsDtsFlags = data[7]\n if (ptsDtsFlags & 0xc0) {\n pts = (data[9] & 0x0e) * 536870912 +\n (data[10] & 0xff) * 4194304 +\n (data[11] & 0xfe) * 16384 +\n (data[12] & 0xff) * 128 +\n (data[13] & 0xfe) / 2\n\n if (ptsDtsFlags & 0x40) {\n dts = (data[14] & 0x0e) * 536870912 +\n (data[15] & 0xff) * 4194304 +\n (data[16] & 0xfe) * 16384 +\n (data[17] & 0xff) * 128 +\n (data[18] & 0xfe) / 2\n if (pts - dts > 60 * 90000) pts = dts\n } else {\n dts = pts\n }\n }\n\n return { data: data.subarray(9 + headerDataLen), pts, dts }\n }\n}\n","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64 } from '../utils'\nimport { AAC } from '../codec'\nexport class MP4Parser {\n static findBox (data, names, start = 0) {\n const ret = []\n if (!data) return ret\n\n let size = 0\n let type = ''\n let headerSize = 0\n while (data.length > 7) {\n size = readBig32(data)\n type = String.fromCharCode.apply(null, data.subarray(4, 8))\n headerSize = 8\n if (size === 1) {\n size = readBig64(data, 8)\n headerSize += 8\n } else if (!size) {\n size = data.length\n }\n if (!names[0] || type === names[0]) {\n const subData = data.subarray(0, size)\n if (names.length < 2) {\n ret.push({\n start,\n size,\n headerSize,\n type,\n data: subData\n })\n } else {\n return MP4Parser.findBox(subData.subarray(headerSize), names.slice(1), start + headerSize)\n }\n }\n\n start += size\n data = data.subarray(size)\n }\n\n return ret\n }\n\n static tfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.trackId = readBig32(data)\n let start = 4\n const baseDataOffsetPresent = (ret.flags & 0xff) & 0x01\n const sampleDescriptionIndexPresent = (ret.flags & 0xff) & 0x02\n const defaultSampleDurationPresent = (ret.flags & 0xff) & 0x08\n const defaultSampleSizePresent = (ret.flags & 0xff) & 0x10\n const defaultSampleFlagsPresent = (ret.flags & 0xff) & 0x20\n\n if (baseDataOffsetPresent) {\n start += 4 // truncate top 4 bytes\n ret.baseDataOffset = readBig32(data, start)\n start += 4\n }\n if (sampleDescriptionIndexPresent) {\n ret.sampleDescriptionIndex = readBig32(data, start)\n start += 4\n }\n if (defaultSampleDurationPresent) {\n ret.defaultSampleDuration = readBig32(data, start)\n start += 4\n }\n if (defaultSampleSizePresent) {\n ret.defaultSampleSize = readBig32(data, start)\n start += 4\n }\n if (defaultSampleFlagsPresent) {\n ret.defaultSampleFlags = readBig32(data, start)\n }\n })\n }\n\n static sidx (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n ret.reference_ID = readBig32(data, start)// stream.readUint32();\n start += 4\n ret.timescale = readBig32(data, start)\n start += 4\n if (ret.version === 0) {\n ret.earliest_presentation_time = readBig32(data, start)\n start += 4\n ret.first_offset = readBig32(data, start)\n start += 4\n } else {\n ret.earliest_presentation_time = readBig64(data, start)\n start += 8\n ret.first_offset = readBig64(data, start)\n start += 8\n }\n start += 2\n ret.references = []\n const count = readBig16(data, start)\n start += 2\n for (let i = 0; i < count; i++) {\n const ref = {}\n ret.references.push(ref)\n let tmp32 = readBig32(data, start)\n start += 4\n ref.reference_type = (tmp32 >> 31) & 0x1\n ref.referenced_size = tmp32 & 0x7FFFFFFF\n ref.subsegment_duration = readBig32(data, start)\n start += 4\n tmp32 = readBig32(data, start)\n start += 4\n ref.starts_with_SAP = (tmp32 >> 31) & 0x1\n ref.SAP_type = (tmp32 >> 28) & 0x7\n ref.SAP_delta_time = tmp32 & 0xFFFFFFF\n }\n })\n }\n\n static moov (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mvhd = MP4Parser.mvhd(MP4Parser.findBox(data, ['mvhd'], start)[0])\n ret.trak = MP4Parser.findBox(data, ['trak'], start).map(trak => MP4Parser.trak(trak))\n ret.pssh = MP4Parser.pssh(MP4Parser.findBox(data, ['pssh'], start)[0])\n })\n }\n\n static mvhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n ret.nextTrackId = readBig32(data, start + 76)\n })\n }\n\n static trak (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tkhd = MP4Parser.tkhd(MP4Parser.findBox(data, ['tkhd'], start)[0])\n ret.mdia = MP4Parser.mdia(MP4Parser.findBox(data, ['mdia'], start)[0])\n })\n }\n\n static tkhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.trackId = readBig32(data, 16)\n ret.duration = readBig64(data, 24)\n start += 32\n } else {\n ret.trackId = readBig32(data, 8)\n ret.duration = readBig32(data, 16)\n start += 20\n }\n ret.width = readBig32(data, start + 52)\n ret.height = readBig32(data, start + 56)\n })\n }\n\n static mdia (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mdhd = MP4Parser.mdhd(MP4Parser.findBox(data, ['mdhd'], start)[0])\n ret.hdlr = MP4Parser.hdlr(MP4Parser.findBox(data, ['hdlr'], start)[0])\n ret.minf = MP4Parser.minf(MP4Parser.findBox(data, ['minf'], start)[0])\n })\n }\n\n static mdhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n const lang = readBig16(data, start)\n ret.language = String.fromCharCode(((lang >> 10) & 0x1F) + 0x60, ((lang >> 5) & 0x1F) + 0x60, (lang & 0x1F) + 0x60)\n })\n }\n\n static hdlr (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 0) {\n ret.handlerType = String.fromCharCode.apply(null, data.subarray(4, 8))\n }\n })\n }\n\n static minf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.vmhd = MP4Parser.vmhd(MP4Parser.findBox(data, ['vmhd'], start)[0])\n ret.smhd = MP4Parser.smhd(MP4Parser.findBox(data, ['smhd'], start)[0])\n ret.stbl = MP4Parser.stbl(MP4Parser.findBox(data, ['stbl'], start)[0])\n })\n }\n\n static vmhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.graphicsmode = readBig16(data)\n ret.opcolor = [readBig16(data, 2), readBig16(data, 4), readBig16(data, 6)]\n })\n }\n\n static smhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.balance = readBig16(data)\n })\n }\n\n static stbl (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.stsd = MP4Parser.stsd(MP4Parser.findBox(data, ['stsd'], start)[0])\n ret.stts = MP4Parser.stts(MP4Parser.findBox(data, ['stts'], start)[0])\n ret.ctts = MP4Parser.ctts(MP4Parser.findBox(data, ['ctts'], start)[0])\n ret.stsc = MP4Parser.stsc(MP4Parser.findBox(data, ['stsc'], start)[0])\n ret.stsz = MP4Parser.stsz(MP4Parser.findBox(data, ['stsz'], start)[0])\n ret.stco = MP4Parser.stco(MP4Parser.findBox(data, ['stco'], start)[0])\n if (!ret.stco) {\n ret.co64 = MP4Parser.co64(MP4Parser.findBox(data, ['co64'], start)[0])\n ret.stco = ret.co64\n }\n const default_IV_size = ret.stsd.entries[0]?.sinf?.schi?.tenc.default_IV_size\n ret.stss = MP4Parser.stss(MP4Parser.findBox(data, ['stss'], start)[0])\n ret.senc = MP4Parser.senc(MP4Parser.findBox(data, ['senc'], start)[0], default_IV_size)\n })\n }\n\n static senc (box, iv = 8) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n const sampleCount = readBig32(data, start)\n start += 4\n ret.samples = []\n for (let i = 0; i < sampleCount; i++) {\n const sample = {}\n sample.InitializationVector = []\n for (let j = 0; j < iv; j++){\n sample.InitializationVector[j] = data[start + j]\n }\n start += iv\n if (ret.flags & 0x2) {\n sample.subsamples = []\n const subsampleCount = readBig16(data, start)\n start += 2\n for (let j = 0; j < subsampleCount; j++) {\n const subsample = {}\n subsample.BytesOfClearData = readBig16(data, start)\n start += 2\n subsample.BytesOfProtectedData = readBig32(data, start)\n start += 4\n sample.subsamples.push(subsample)\n }\n }\n ret.samples.push(sample)\n }\n })\n }\n\n static pssh (box) {\n return parseBox(box, true, (ret, data) => {\n const keyIds = []\n const systemId = []\n let start = 0\n for (let i = 0; i < 16; i++) {\n systemId.push(toHex(data[start + i]))\n }\n start += 16\n if (ret.version > 0) {\n const numKeyIds = readBig32(data, start)\n start += 4\n for (let i = 0; i < ('' + numKeyIds).length; i++) {\n for (let j = 0; j < 16; j++) {\n const keyId = data[start]\n start += 1\n keyIds.push(toHex(keyId))\n }\n }\n }\n const dataSize = readBig32(data, start)\n ret.data_size = dataSize\n start += 4\n ret.kid = keyIds\n ret.system_id = systemId\n ret.buffer = data\n })\n }\n\n static stsd (box) {\n return parseBox(box, true, (ret, data, start) => {\n ret.entryCount = readBig32(data)\n ret.entries = MP4Parser.findBox(data.subarray(4), [], start + 4).map(b => {\n switch (b.type) {\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4':\n return MP4Parser.avc1(b)\n case 'hvc1':\n case 'hev1':\n return MP4Parser.hvc1(b)\n case 'mp4a':\n return MP4Parser.mp4a(b)\n case 'alaw':\n case 'ulaw':\n return MP4Parser.alaw(b)\n case 'enca':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.channelCount = readBig16(data, 16)\n ret.samplesize = readBig16(data, 18)\n ret.sampleRate = (readBig32(data, 24) / (1 << 16))\n data = data.subarray(28)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data, ['esds'], start)[0])\n })\n case 'encv':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n data = data.subarray(78)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(data, ['avcC'], start)[0])\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(data, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(data, ['pasp'], start)[0])\n })\n default:\n }\n }).filter(Boolean)\n })\n }\n\n static tenc (box) {\n return parseBox(box, false, (ret, data) => {\n let start = 6\n ret.default_IsEncrypted = data[start]\n start += 1\n ret.default_IV_size = data[start]\n start += 1\n ret.default_KID = []\n for (let i = 0; i < 16; i++) {\n ret.default_KID.push(toHex(data[start]))\n start += 1\n }\n })\n }\n\n static schi (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tenc = MP4Parser.tenc(MP4Parser.findBox(data, ['tenc'], start)[0])\n })\n }\n\n static sinf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.schi = MP4Parser.schi(MP4Parser.findBox(data, ['schi'], start)[0])\n ret.frma = MP4Parser.frma(MP4Parser.findBox(data, ['frma'], start)[0])\n })\n }\n\n static frma (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data_format = ''\n for (let i = 0; i < 4; i++) {\n ret.data_format += String.fromCharCode(data[i])\n }\n })\n }\n\n static avc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(bodyData, ['avcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static avcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.configurationVersion = data[0]\n ret.AVCProfileIndication = data[1]\n ret.profileCompatibility = data[2]\n ret.AVCLevelIndication = data[3]\n ret.codec = getAvcCodec([data[1], data[2], data[3]])\n ret.lengthSizeMinusOne = data[4] & 0x3\n ret.spsLength = data[5] & 0x1F\n ret.sps = []\n let start = 6\n for (let i = 0; i < ret.spsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.sps.push(data.subarray(start, start + size))\n // ret.spsInfo = SpsParser.parseSPS(ret.sps[i])\n // ret.pixelRatio = ret.spsInfo.par_ratio\n start += size\n }\n ret.ppsLength = data[start]\n start += 1\n ret.pps = []\n for (let i = 0; i < ret.ppsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.pps.push(data.subarray(start, start += size))\n start += size\n }\n })\n }\n\n static hvc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(bodyData, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static hvcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.codec = 'hev1.1.6.L93.B0'\n ret.configurationVersion = data[0]\n const tmp = data[1]\n ret.generalProfileSpace = tmp >> 6\n ret.generalTierFlag = (tmp & 0x20) >> 5\n ret.generalProfileIdc = tmp & 0x1F\n ret.generalProfileCompatibility = readBig32(data, 2)\n ret.generalConstraintIndicatorFlags = data.subarray(6, 12)\n ret.generalLevelIdc = data[12]\n ret.avgFrameRate = readBig16(data, 19)\n ret.numOfArrays = data[22]\n ret.vps = []\n ret.sps = []\n ret.pps = []\n let start = 23\n let type = 0\n let numNalus = 0\n let size = 0\n for (let i = 0; i < ret.numOfArrays; i++) {\n type = data[start] & 0x3F\n numNalus = readBig16(data, start + 1)\n start += 3\n const nalus = []\n for (let j = 0; j < numNalus; j++) {\n size = readBig16(data, start)\n start += 2\n nalus.push(data.subarray(start, start + size))\n start += size\n }\n\n if (type === 32) {\n ret.vps.push(...nalus)\n } else if (type === 33) {\n ret.sps.push(...nalus)\n } else if (type === 34) {\n ret.pps.push(...nalus)\n }\n }\n })\n }\n\n static pasp (box) {\n return parseBox(box, false, (ret, data) => {\n ret.hSpacing = readBig32(data)\n ret.vSpacing = readBig32(data, 4)\n })\n }\n\n static mp4a (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseAudioSampleEntry(ret, data)\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data.subarray(bodyStart), ['esds'], start + bodyStart)[0])\n })\n }\n\n static esds (box) {\n return parseBox(box, true, (ret, data) => {\n ret.codec = 'mp4a.'\n let start = 0\n let byteRead = 0\n let size = 0\n let tag = 0\n while (data.length) {\n start = 0\n tag = data[start]\n byteRead = data[start + 1]\n start += 2\n while (byteRead & 0x80) {\n size = (byteRead & 0x7F) << 7\n byteRead = data[start]\n start += 1\n }\n size += byteRead & 0x7F\n if (tag === 3) {\n data = data.subarray(start + 3)\n } else if (tag === 4) {\n ret.codec += (data[start].toString(16) + '.').padStart(3, '0')\n data = data.subarray(start + 13)\n } else if (tag === 5) {\n const config = ret.config = data.subarray(start, start + size)\n let objectType = (config[0] & 0xF8) >> 3\n if (objectType === 31 && config.length >= 2) {\n objectType = 32 + ((config[0] & 0x7) << 3) + ((config[1] & 0xE0) >> 5)\n }\n ret.objectType = objectType\n ret.codec += objectType.toString(16)\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n } else {\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n }\n }\n })\n }\n\n static alaw (box) {\n return parseBox(box, false, (ret, data) => {\n parseAudioSampleEntry(ret, data)\n })\n }\n\n static stts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n delta: readBig32(data, start + 4)\n })\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static ctts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n if (ret.version === 1) {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: readBig32(data, start + 4)\n })\n start += 8\n }\n } else {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: -(~readBig32(data, start + 4) + 1)\n })\n start += 8\n }\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsc (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n firstChunk: readBig32(data, start),\n samplesPerChunk: readBig32(data, start + 4),\n sampleDescriptionIndex: readBig32(data, start + 8)\n })\n start += 12\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsz (box) {\n return parseBox(box, true, (ret, data) => {\n const sampleSize = readBig32(data)\n const sampleCount = readBig32(data, 4)\n const entrySizes = []\n if (!sampleSize) {\n let start = 8\n for (let i = 0; i < sampleCount; i++) {\n entrySizes.push(readBig32(data, start))\n start += 4\n }\n }\n ret.sampleSize = sampleSize\n ret.sampleCount = sampleCount\n ret.entrySizes = entrySizes\n })\n }\n\n static stco (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static co64 (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig64(data, start))\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stss (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static moof (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mfhd = MP4Parser.mfhd(MP4Parser.findBox(data, ['mfhd'], start)[0])\n ret.traf = MP4Parser.findBox(data, ['traf'], start).map(t => MP4Parser.traf(t))\n })\n }\n\n static mfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.sequenceNumber = readBig32(data)\n })\n }\n\n static traf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tfhd = MP4Parser.tfhd(MP4Parser.findBox(data, ['tfhd'], start)[0])\n ret.tfdt = MP4Parser.tfdt(MP4Parser.findBox(data, ['tfdt'], start)[0])\n ret.trun = MP4Parser.trun(MP4Parser.findBox(data, ['trun'], start)[0])\n })\n }\n\n static trun (box) {\n return parseBox(box, true, (ret, data) => {\n const { version, flags } = ret\n const dataLen = data.length\n const sampleCount = ret.sampleCount = readBig32(data)\n let offset = 4\n if (dataLen > offset && flags & 1) {\n ret.dataOffset = -(~readBig32(data, offset) + 1)\n offset += 4\n }\n if (dataLen > offset && flags & 4) {\n ret.firstSampleFlags = readBig32(data, offset)\n offset += 4\n }\n ret.samples = []\n if (dataLen > offset) {\n let sample\n for (let i = 0; i < sampleCount; i++) {\n sample = {}\n if (flags & 0x100) {\n sample.duration = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x200) {\n sample.size = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x400) {\n sample.flags = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x800) {\n if (version) {\n sample.cts = -(~readBig32(data, offset + 4) + 1)\n } else {\n sample.cts = readBig32(data, offset)\n }\n offset += 4\n }\n ret.samples.push(sample)\n }\n }\n })\n }\n\n static tfdt (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 1) {\n ret.baseMediaDecodeTime = readBig64(data)\n } else {\n ret.baseMediaDecodeTime = readBig32(data)\n }\n })\n }\n\n static probe (data) {\n return !!MP4Parser.findBox(data, ['ftyp'])\n }\n\n static parseSampleFlags (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: (flags[2] << 8) | flags[3]\n }\n }\n\n static moovToTrack (moov, videoTrack, audioTrack) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (vTrack && videoTrack) {\n const v = videoTrack\n const _vTrackId = vTrack.tkhd?.trackId\n if (_vTrackId !== null && _vTrackId !== undefined) v.id = vTrack.tkhd.trackId\n v.tkhdDuration = vTrack.tkhd.duration\n v.mvhdDurtion = moov.mvhd.duration\n v.mvhdTimecale = moov.mvhd.timescale\n v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale\n v.duration = vTrack.mdia.mdhd.duration || (v.mvhdDurtion / v.mvhdTimecale * v.timescale)\n const e1 = vTrack.mdia.minf.stbl.stsd.entries[0]\n v.width = e1.width\n v.height = e1.height\n if (e1.pasp) {\n v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing]\n }\n if (e1.hvcC) {\n v.codecType = VideoCodecType.HEVC\n v.codec = e1.hvcC.codec\n v.vps = e1.hvcC.vps\n v.sps = e1.hvcC.sps\n v.pps = e1.hvcC.pps\n v.hvcC = e1.hvcC.data\n } else if (e1.avcC) {\n v.codec = e1.avcC.codec\n v.sps = e1.avcC.sps\n v.pps = e1.avcC.pps\n } else {\n throw new Error('unknown video stsd entry')\n }\n v.present = true\n v.ext = {}\n v.ext.stss = vTrack.mdia?.minf?.stbl?.stss\n v.ext.ctts = vTrack.mdia?.minf?.stbl?.ctts\n\n if (e1 && e1.type === 'encv') {\n v.isVideoEncryption = true\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n v.videoSenc = vTrack.mdia.minf.stbl.senc && vTrack.mdia.minf.stbl.senc.samples\n e1.data_format = e1.sinf?.frma?.data_format\n v.useEME = moov.useEME\n v.kidValue = moov.kidValue\n v.pssh = moov.pssh\n v.encv = e1\n }\n }\n\n if (aTrack && audioTrack) {\n const a = audioTrack\n const _aTrackId = aTrack.tkhd?.trackId\n if (_aTrackId !== null && _aTrackId !== undefined) a.id = aTrack.tkhd.trackId\n a.tkhdDuration = aTrack.tkhd.duration\n a.mvhdDurtion = moov.mvhd.duration\n a.mvhdTimecale = moov.mvhd.timescale\n a.timescale = a.formatTimescale = aTrack.mdia.mdhd.timescale\n a.duration = aTrack.mdia.mdhd.duration || (a.mvhdDurtion / a.mvhdTimecale * a.timescale)\n const e1 = aTrack.mdia.minf.stbl.stsd.entries[0]\n a.sampleSize = e1.sampleSize\n a.sampleRate = e1.sampleRate\n a.channelCount = e1.channelCount\n a.present = true\n\n switch (e1.type) {\n case 'alaw':\n a.codecType = a.codec = AudioCodecType.G711PCMA\n a.sampleRate = 8000\n break\n case 'ulaw':\n a.codecType = a.codec = AudioCodecType.G711PCMU\n a.sampleRate = 8000\n break\n default:\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) a.config = Array.from(e1.esds.config)\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n break\n }\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) {\n if (e1.esds.config) {\n a.config = Array.from(e1.esds.config)\n } else {\n console.warn('esds config is null')\n }\n }\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.ext = {}\n a.ext.stss = aTrack.mdia?.minf?.stbl?.stss\n a.ext.ctts = aTrack.mdia?.minf?.stbl?.ctts\n a.present = true\n if (e1 && e1.type === 'enca') {\n a.isAudioEncryption = true\n e1.data_format = e1.sinf?.frma?.data_format\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n a.audioSenc = aTrack.mdia.minf.stbl.senc && aTrack.mdia.minf.stbl.senc.samples\n a.useEME = moov.useEME\n a.kidValue = moov.kidValue\n a.enca = e1\n }\n }\n\n audioTrack && (audioTrack.isVideoEncryption = videoTrack ? videoTrack.isVideoEncryption : false)\n videoTrack && (videoTrack.isAudioEncryption = audioTrack ? audioTrack.isAudioEncryption : false)\n\n if (videoTrack?.encv || audioTrack?.enca) {\n const vkid = videoTrack?.encv?.default_KID\n const akid = audioTrack?.enca?.default_KID\n const kid = (vkid || akid) ? (vkid || akid).join('') : null\n videoTrack && (videoTrack.kid = kid)\n audioTrack && (audioTrack.kid = kid)\n }\n\n videoTrack && (videoTrack.flags = 0xf01)\n audioTrack && (audioTrack.flags = 0x701)\n\n return {\n videoTrack,\n audioTrack\n }\n }\n\n static evaluateDefaultDuration (videoTrack, audioTrack, videoSampleCount) {\n const audioSampleCount = audioTrack?.samples?.length\n\n // audio\n if (!audioSampleCount) return 1024\n\n const segmentDuration = 1024 * audioSampleCount / audioTrack.timescale\n\n return segmentDuration * videoTrack.timescale / videoSampleCount\n }\n\n static moofToSamples (moof, videoTrack, audioTrack) {\n const ret = {}\n\n if (moof.mfhd) {\n if (videoTrack) videoTrack.sequenceNumber = moof.mfhd.sequenceNumber\n if (audioTrack) audioTrack.sequenceNumber = moof.mfhd.sequenceNumber\n }\n\n moof.traf.forEach(({ tfhd, tfdt, trun }) => {\n if (!tfhd || !trun) return\n if (tfdt) {\n if (videoTrack && videoTrack.id === tfhd.trackId) videoTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n if (audioTrack && audioTrack.id === tfhd.trackId) audioTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n }\n const defaultSize = tfhd.defaultSampleSize || 0\n const defaultDuration = tfhd.defaultSampleDuration || MP4Parser.evaluateDefaultDuration(videoTrack, audioTrack, trun.samples.length || trun.sampleCount)\n let offset = trun.dataOffset || 0\n let dts = 0\n let gopId = -1\n if (!trun.samples.length && trun.sampleCount) {\n ret[tfhd.trackId] = []\n for (let i = 0; i < trun.sampleCount; i++) {\n ret[tfhd.trackId].push({\n offset,\n dts,\n duration: defaultDuration,\n size: defaultSize\n })\n dts += defaultDuration\n offset += defaultSize\n }\n } else {\n ret[tfhd.trackId] = trun.samples.map((s, index) => {\n s = {\n offset,\n dts,\n pts: dts + (s.cts || 0),\n duration: s.duration || defaultDuration,\n size: s.size || defaultSize,\n gopId,\n keyframe: index === 0 || ((s.flags !== null && s.flags !== undefined) && ((s.flags & 65536) >>> 0) !== 65536)\n }\n if (s.keyframe) {\n gopId++\n s.gopId = gopId\n }\n dts += s.duration\n offset += s.size\n return s\n })\n }\n })\n\n return ret\n }\n\n static moovToSamples (moov) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!vTrack && !aTrack) return\n let videoSamples\n let audioSamples\n if (vTrack) {\n const videoStbl = vTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!stts || !stsc || !stsz || !stco || !stss) return\n videoSamples = getSamples(stts, stsc, stsz, stco, ctts, stss)\n }\n if (aTrack) {\n const audioStbl = aTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = aTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSamples = getSamples(stts, stsc, stsz, stco)\n }\n\n return {\n videoSamples,\n audioSamples\n }\n }\n}\n\nfunction getSamples (stts, stsc, stsz, stco, ctts, stss) {\n const samples = []\n const cttsEntries = ctts?.entries\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n\n let sample\n let gopId = -1\n let dts = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n stts.entries.forEach(({ count, delta }) => {\n for (let i = 0; i < count; i++) {\n sample = {\n dts,\n duration: delta,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n sample.keyframe = keyframeMap[pos]\n if (sample.keyframe) {\n gopId++\n }\n sample.gopId = gopId\n }\n // sample.timeOffset = 0\n if (cttsArr && pos < cttsArr.length) {\n sample.pts = sample.dts + cttsArr[pos]\n // sample.timeOffset = cttsArr[pos]\n // if (pos === 0) {\n // sample.pts = sample.dts\n // sample.timeOffset = 0\n // }\n }\n samples.push(sample)\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += sample.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n return samples\n}\n\nfunction parseVisualSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n ret.frameCount = readBig16(data, 40)\n ret.depth = readBig16(data, 74)\n return 78\n}\n\nfunction parseAudioSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.channelCount = readBig16(data, 16)\n ret.sampleSize = readBig16(data, 18)\n ret.sampleRate = readBig32(data, 24) / (1 << 16)\n return 28\n}\n\nfunction parseBox (box, isFullBox, parse) {\n if (!box) return\n if (box.size !== box.data.length) throw new Error(`box ${box.type} size !== data.length`)\n const ret = {\n start: box.start,\n size: box.size,\n headerSize: box.headerSize,\n type: box.type\n }\n if (isFullBox) {\n ret.version = box.data[box.headerSize]\n ret.flags = readBig24(box.data, box.headerSize + 1)\n ret.headerSize += 4\n }\n parse(ret, box.data.subarray(ret.headerSize), ret.start + ret.headerSize)\n return ret\n}\n\nconst padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\nconst toHex = function (...value) {\n const hex = []\n value.forEach(item => {\n hex.push(padStart(Number(item).toString(16), 2, 0))\n })\n return hex[0]\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse /* hashVal */ } from '../utils'\nimport Buffer from './buffer'\n// import Crypto from './crypto/crypto'\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'avc1',\n 'avcC',\n 'hvc1',\n 'hvcC',\n 'dinf',\n 'dref',\n 'esds',\n 'ftyp',\n 'hdlr',\n 'mdat',\n 'mdhd',\n 'mdia',\n 'mfhd',\n 'minf',\n 'moof',\n 'moov',\n 'mp4a',\n 'mvex',\n 'mvhd',\n 'pasp',\n 'stbl',\n 'stco',\n 'stsc',\n 'stsd',\n 'stsz',\n 'stts',\n 'tfdt',\n 'tfhd',\n 'traf',\n 'trak',\n 'trex',\n 'tkhd',\n 'vmhd',\n 'smhd',\n 'ctts',\n 'stss',\n 'styp',\n 'pssh',\n 'sidx',\n 'sbgp',\n 'saiz',\n 'saio',\n 'senc',\n 'trun',\n 'encv',\n 'enca',\n 'sinf',\n 'btrt',\n 'frma',\n 'tenc',\n 'schm',\n 'schi',\n 'mehd',\n 'fiel',\n 'sdtp'\n ].reduce((p, c) => {\n p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)]\n return p\n }, Object.create(null));\n\n static HDLR_TYPES = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ])\n }\n\n static FTYPAVC1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 97, 118, 99, 49 // avc1\n ]))\n\n static FTYPHEV1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 104, 101, 118, 49 // hev1\n ]))\n\n static DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version\n 0x00, 0x00, 0x01 // entry_flags\n ])))\n\n static VMHD = MP4.box(MP4.types.vmhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // op color\n ]))\n\n static SMHD = MP4.box(MP4.types.smhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]))\n\n static StblTable = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ])\n\n static STTS = MP4.box(MP4.types.stts, MP4.StblTable)\n\n static STSC = MP4.box(MP4.types.stsc, MP4.StblTable)\n\n static STSZ = MP4.box(MP4.types.stsz, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]))\n\n static STCO = MP4.box(MP4.types.stco, MP4.StblTable)\n\n static box (type, ...payload) {\n payload = payload.filter(Boolean)\n const size = 8 + payload.reduce((p, c) => (p + c.byteLength), 0)\n const ret = new Uint8Array(size)\n ret[0] = (size >> 24) & 0xff\n ret[1] = (size >> 16) & 0xff\n ret[2] = (size >> 8) & 0xff\n ret[3] = size & 0xff\n ret.set(type, 4)\n let offset = 8\n payload.forEach((data) => {\n ret.set(data, offset)\n offset += data.byteLength\n })\n return ret\n }\n\n static ftyp (tracks) {\n const isHevc = tracks.find(t => t.type === TrackType.VIDEO && t.codecType === VideoCodecType.HEVC)\n return isHevc ? MP4.FTYPHEV1 : MP4.FTYPAVC1\n }\n\n static initSegment (tracks) {\n const ftyp = MP4.ftyp(tracks)\n // console.log('[remux],ftyp ,len ', ftyp.byteLength, hashVal(ftyp.toString()))\n const init = concatUint8Array(ftyp, MP4.moov(tracks))\n // console.log('[remux],init ,len ', init.byteLength, hashVal(init.toString()))\n return init\n }\n\n static pssh (data) {\n // const buffer = new Buffer()\n const content = new Uint8Array(\n [\n 0x01, 0x00, 0x00, 0x00 // version\n ].concat(\n [\n 0x10, 0x77, 0xef, 0xec,\n 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e,\n 0x52, 0xe2, 0xfb, 0x4b\n ],\n [0x00, 0x00, 0x00, 0x01],\n parse(data.kid),\n [0x00, 0x00, 0x00, 0x00]\n )\n )\n return MP4.box(MP4.types.pssh, content)\n }\n\n static moov (tracks) {\n if (tracks[0].useEME && (tracks[0].encv || tracks[0].enca)) {\n if (!tracks[0].pssh) {\n tracks[0].pssh = {\n kid: tracks[0].kid\n }\n }\n const pssh = this.pssh(tracks[0].pssh)\n // console.log('[remux],pssh,', hashVal(pssh.toString()))\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n MP4.mvex(tracks),\n ...tracks.map((t) => MP4.trak(t)),\n pssh)\n } else {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n ...tracks.map((t) => MP4.trak(t)),\n MP4.mvex(tracks)\n )\n }\n }\n\n static mvhd (duration, timescale = 90000) {\n const mvhd = MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x01, 0x00, 0x00, // rate\n 0x01, 0x00, // volume\n 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff // todo 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]))\n // console.log('[remux],mvhd, len,', mvhd.byteLength, hashVal(mvhd.toString()))\n return mvhd\n }\n\n static trak (track) {\n const trak = MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.tkhdDuration || 0, track.width, track.height),\n MP4.mdia(track)\n )\n // console.log('[remux],trak, len,', trak.byteLength, track.id, hashVal(trak.toString()))\n return trak\n }\n\n static tkhd (id, duration, width = 0, height = 0) {\n const tkhd = MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x07, // flags、todo 0x07\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time todo\n (id >> 24) & 0xff, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff,\n 0x00, 0x00, 0x00, 0x00,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // todo (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // /*0x00*/ alternate_group //todo type === 'video' ? 0x01 : 0x00(第二个位置)\n 0x01, 0x00, // /* 0x01 */, 0x00, // non-audio track volume //todo type === 'audio' ? 0x01 : 0x00(第一个位置)\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n (width >> 8) & 0xff, width & 0xff, 0x00, 0x00,\n (height >> 8) & 0xff, height & 0xff, 0x00, 0x00\n ]))\n // console.log('[remux],tkhd, len,', tkhd.byteLength, hashVal(tkhd.toString()))\n return tkhd\n }\n\n static mdia (track) {\n const mdia = MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minf(track))\n // console.log('[remux],mdia, len,', mdia.byteLength, hashVal(mdia.toString()))\n return mdia\n }\n\n static mdhd (duration, timescale = 90000) {\n const mdhd = MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // todo 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,//todo\n 0x55, 0xc4, // 'und' language (undetermined) //todo 0x15, 0xC7\n 0x00, 0x00 // pre_defined\n ]))\n // console.log('[remux],mdhd, len,', mdhd.byteLength, hashVal(mdhd.toString()))\n return mdhd\n }\n\n static hdlr (type) {\n const hdlr = MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type])\n // console.log('[remux],hdlr, len,', hdlr.byteLength, hashVal(hdlr.toString()))\n return hdlr\n }\n\n static minf (track) {\n const minf = MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stbl(track))\n // console.log('[remux],minf, len,', minf.byteLength, hashVal(minf.toString()))\n return minf\n }\n\n static stbl (track) {\n const extBox = []\n if (track && track.ext) {\n track.ext.stss && extBox.push(MP4.stss(track.ext.stss.entries))\n // track.ext.stss && extBox.push(MP4.ctts(track.ext.stss.entries))\n }\n const stbl = MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.STTS, extBox[0], MP4.STSC, MP4.STSZ, MP4.STCO)\n // console.log('[remux],stbl, len,', stbl.byteLength, hashVal(stbl.toString()))\n return stbl\n }\n\n static stsd (track) {\n let content\n if (track.type === 'audio') {\n if (track.useEME && track.enca) {\n content = MP4.enca(track)\n // console.log('[remux],enca, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.mp4a(track)\n // console.log('[remux],mp4a, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n } else if (track.useEME && track.encv) {\n content = MP4.encv(track)\n // console.log('[remux],encv, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n content = MP4.avc1hev1(track)\n // console.log('[remux],avc1hev1, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n const stsd = MP4.box(MP4.types.stsd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]), content)\n // console.log('[remux],stsd, len,', stsd.byteLength, hashVal(stsd.toString()))\n return stsd\n }\n\n static enca (data) {\n const channelCount = data.enca.channelCount\n const sampleRate = data.enca.sampleRate\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n (sampleRate >> 8) & 0xff,\n sampleRate & 0xff, //\n 0x00, 0x00\n ])\n const esds = MP4.esds(data.config)\n // console.log('[remux],esds, len,', esds.byteLength, hashVal(esds.toString()))\n const sinf = MP4.sinf(data.enca)\n // console.log('[remux],sinf, len,', sinf.byteLength, hashVal(sinf.toString()))\n return MP4.box(MP4.types.enca, content, esds, sinf)\n }\n\n static encv (track) {\n const sps = track.sps.length > 0 ? track.sps[0] : []\n const pps = track.pps.length > 0 ? track.pps[0] : []\n const width = track.width\n const height = track.height\n const hSpacing = track.sarRatio[0]\n const vSpacing = track.sarRatio[1]\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n\n 0x12,\n 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74,\n 0x69, 0x6F, 0x6E, 0x2F,\n 0x68, 0x6C, 0x73, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]) // pre_defined = -1;\n const avcc = new Uint8Array([\n 0x01, // version\n sps[1], // profile\n sps[2], // profile compatible\n sps[3], // level\n 0xfc | 3,\n 0xE0 | 1, // 目前只处理一个sps\n sps.length >>> 8 & 0xff,\n sps.length & 0xff\n ].concat(...sps).concat([\n 0x01,\n pps.length >>> 8 & 0xff,\n pps.length & 0xff\n ]).concat(...pps))\n const btrt = new Uint8Array([\n 0x00, 0x00, 0x58, 0x39,\n 0x00, 0x0F, 0xC8, 0xC0,\n 0x00, 0x04, 0x56, 0x48\n ])\n const sinf = MP4.sinf(track.encv)\n const pasp = new Uint8Array([\n (hSpacing >> 24), // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n (vSpacing >> 24), // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff\n ])\n return MP4.box(MP4.types.encv, content, MP4.box(MP4.types.avcC, avcc), MP4.box(MP4.types.btrt, btrt), sinf, MP4.box(MP4.types.pasp, pasp))\n }\n\n static schi (data) {\n const content = new Uint8Array([])\n const tenc = MP4.tenc(data)\n return MP4.box(MP4.types.schi, content, tenc)\n }\n\n static tenc (data) {\n // 用于每个track的加密参数(包括KID、初始化向量、加密标志位),包含在TrackEncryptionBox(‘tenc’)中。\n const content = new Uint8Array(\n [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // skip\n data.default_IsEncrypted & 0xff, // default_isProtected\n data.default_IV_size & 0xff // default_Per_Sample_IV_Size\n ].concat(parse(data.default_KID)))\n return MP4.box(MP4.types.tenc, content)\n }\n\n static sinf (data) {\n const content = new Uint8Array([])\n const frma = new Uint8Array([\n data.data_format.charCodeAt(0),\n data.data_format.charCodeAt(1),\n data.data_format.charCodeAt(2),\n data.data_format.charCodeAt(3)\n ])\n const schm = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x63, 0x65, 0x6E, 0x63, // cenc\n 0x00, 0x01, 0x00, 0x00 // version\n ])\n const schi = MP4.schi(data)\n return MP4.box(MP4.types.sinf, content, MP4.box(MP4.types.frma, frma), MP4.box(MP4.types.schm, schm), schi)\n }\n\n static avc1hev1 (track) {\n const isHevc = track.codecType === VideoCodecType.HEVC\n const typ = isHevc ? MP4.types.hvc1 : MP4.types.avc1\n const config = isHevc ? MP4.hvcC(track) : MP4.avcC(track)\n const boxes = [\n new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), config\n ]\n // console.log('[remux],avc1hev1_0, len,', boxes[0].byteLength, hashVal(boxes[0].toString()))\n // console.log('[remux],avc1hev1_1, len,', boxes[1].byteLength, hashVal(boxes[1].toString()))\n if (isHevc) {\n boxes.push(MP4.box(MP4.types.fiel, new Uint8Array([0x01, 0x00])))\n // console.log('[remux],fiel, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n } else if (track.sarRatio && track.sarRatio.length > 1) {\n boxes.push(MP4.pasp(track.sarRatio))\n // console.log('[remux],pasp, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n }\n return MP4.box(typ, ...boxes)\n }\n\n static avcC (track) {\n const sps = []\n const pps = []\n\n let len\n track.sps.forEach((s) => {\n len = s.byteLength\n sps.push((len >>> 8) & 0xff)\n sps.push(len & 0xff)\n sps.push(...s)\n })\n\n track.pps.forEach((p) => {\n len = p.byteLength\n pps.push((len >>> 8) & 0xff)\n pps.push(len & 0xff)\n pps.push(...p)\n })\n\n return MP4.box(MP4.types.avcC, new Uint8Array([\n 0x01, // configurationVersion\n sps[3], // AVCProfileIndication\n sps[4], // profile_compatibility\n sps[5], // AVCLevelIndication\n 0xfc | 3, // lengthSizeMinusOne\n 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(...sps)\n .concat([track.pps.length]) // numOfPictureParameterSets\n .concat(...pps)))\n }\n\n static hvcC (track) {\n const hvcC = track.hvcC\n if (hvcC instanceof ArrayBuffer || hvcC instanceof Uint8Array) return hvcC\n const { vps, sps, pps } = track\n let data\n if (hvcC) {\n const pcf = hvcC.generalProfileCompatibilityFlags\n const cif = hvcC.generalConstraintIndicatorFlags\n const numOfArrays = (vps.length && 1) + (sps.length && 1) + (pps.length && 1)\n data = [\n 0x01, // configurationVersion\n hvcC.generalProfileSpace << 6 | hvcC.generalTierFlag << 5 | hvcC.generalProfileIdc,\n pcf >>> 24, pcf >>> 16, pcf >>> 8, pcf,\n cif[0], cif[1], cif[2], cif[3], cif[4], cif[5],\n hvcC.generalLevelIdc,\n 0xF0, 0x00, // min_spatial_segmentation_idc\n 0xFC, // parallelismType\n hvcC.chromaFormatIdc | 0xFC,\n hvcC.bitDepthLumaMinus8 | 0xF8,\n hvcC.bitDepthChromaMinus8 | 0xF8,\n 0x00, 0x00, // avgFrameRate\n hvcC.numTemporalLayers << 3 | hvcC.temporalIdNested << 2 | 3,\n numOfArrays\n ]\n const write = (x) => {\n data.push(x.length >> 8, x.length)\n data.push(...x)\n }\n if (vps.length) {\n data.push(0xA0, 0x00, vps.length)\n vps.forEach(write)\n }\n if (sps.length) {\n data.push(0xA1, 0x00, sps.length)\n sps.forEach(write)\n }\n if (pps.length) {\n data.push(0xA2, 0x00, pps.length)\n pps.forEach(write)\n }\n } else {\n data = [\n 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02,\n 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,\n 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40\n ]\n }\n return MP4.box(MP4.types.hvcC, new Uint8Array(data))\n }\n\n static pasp ([hSpacing, vSpacing]) {\n return MP4.box(MP4.types.pasp, new Uint8Array([\n hSpacing >> 24, (hSpacing >> 16) & 0xff, (hSpacing >> 8) & 0xff, hSpacing & 0xff,\n vSpacing >> 24, (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff\n ]))\n }\n\n static mp4a (track) {\n return MP4.box(MP4.types.mp4a, new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, track.channelCount,\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff, track.sampleRate & 0xff,\n 0x00, 0x00\n ]), track.config.length ? MP4.esds(track.config) : undefined)\n }\n\n static esds (config) {\n const len = config.length\n const esds = MP4.box(MP4.types.esds, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x03, // tag\n 0x17 + len, // length\n 0x00, 0x00, // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n 0x04, // tag\n 0x0f + len, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x06, 0x00, // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0, // maxBitrate\n 0x00, 0x00, 0xda, 0xc0, // avgBitrate\n 0x05 // tag, DecoderSpecificInfoTag\n ].concat([len])\n .concat(config)\n .concat(\n [0x06, 0x01, 0x02]// GASpecificConfig\n )\n ))\n // console.log('[remux],esds ,len ', esds.byteLength, hashVal(esds.toString()))\n return esds\n }\n\n static mvex (tracks) {\n // const mehd = MP4.box(MP4.types.mehd, this.extension(0, 0), Buffer.writeUint32(tracks[0].tkhdDuration))\n // const mvex = MP4.box(MP4.types.mvex, mehd, MP4.trex1(1), MP4.trex2(2))\n // // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n // const mvex = MP4.box(MP4.types.mvex, MP4.trex1(1), MP4.trex2(2))\n const mvex = MP4.box(MP4.types.mvex, ...tracks.map((t) => MP4.trex(t.id)))\n // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n return mvex\n }\n\n static trex (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex1 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x02, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex2 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x04, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x02, 0x00, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static moof (tracks) {\n const moof = MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].samples ? tracks[0].samples[0].gopId : 0), ...tracks.map((t) => MP4.traf(t)))\n // console.log('[remux],moof, len', moof.byteLength)\n return moof\n // return MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].gopId), ...tracks.map((t) => MP4.traf(t)))\n }\n\n static mfhd (sequenceNumber) {\n // sequenceNumber += 1\n const mfhd = MP4.box(MP4.types.mfhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n sequenceNumber >> 24, (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff\n ]))\n // console.log('[remux],mfhd, len,', mfhd.byteLength, hashVal(mfhd.toString()))\n return mfhd\n }\n\n static traf (track) {\n const tfhd = MP4.tfhd(track.id)\n // console.log('[remux],tfhd, len,', tfhd.byteLength, hashVal(tfhd.toString()), ', trackid = ', track.id)\n // console.log('[remux],tfdt,baseMediaDecodeTime,', track.baseMediaDecodeTime)\n const tfdt = MP4.tfdt(track, track.baseMediaDecodeTime)\n let sencLength = 0\n let samples\n if (track.isVideo && track.videoSenc) {\n samples = track.videoSenc\n samples.forEach(function (item) {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n track.videoSencLength = sencLength\n // console.log('[remux],tfdt, len,', tfdt.toString().length)\n // console.log('[remux],tfdt, len,', tfdt.byteLength, hashVal(tfdt.toString()))\n if (!track.useEME || (!track.isVideoEncryption && !track.isAudioEncryption)) {\n const sdtp = MP4.sdtp(track)\n // console.log('[remux],sdtp, len,', sdtp.byteLength, hashVal(sdtp.toString()))\n const offset = 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8 // mdat header\n return MP4.box(MP4.types.traf, tfhd, tfdt, sdtp, MP4.trun(track.samples, sdtp.byteLength + offset))\n } else if (track.isVideoEncryption) {\n if (track.isVideo) {\n // 加密视频\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const trun = MP4.trun1(track)\n const senc = MP4.senc(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, saiz, saio, trun, senc)\n // console.log('[remux],trex_video, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n } else {\n // 视频加密,音频加密和未加密处理\n if (!track.isAudioEncryption) {\n // 音频未加密\n const sbgp = MP4.sbgp()\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, trun)\n } else {\n // 音频加密\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex_audio, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n } else {\n // 视频未加密,音频加密\n if (track.isVideo) {\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun)\n } else {\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n }\n\n static sdtp (data) {\n const buffer = new Buffer()\n data.samples.forEach(item => {\n buffer.write(new Uint8Array(data.isVideo ? [item.keyframe ? 32 : 16] : [16]))\n })\n return MP4.box(MP4.types.sdtp, this.extension(0, 0), buffer.buffer)\n }\n\n static trun1 (data) {\n // const id = data.id\n // const ceil = id === 1 ? 12 : 4\n const buffer = new Buffer()\n const sampleCount = Buffer.writeUint32(data.samples.length)\n let offset = null\n if (data.isVideo) {\n const sencLength = data.videoSencLength\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 17 + //saiz\n 24 + //saio\n data.samples.length*16\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 12(header) + sencLength //senc\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n = 149+data.samples.length * 16 + sencLength\n */\n offset = Buffer.writeUint32(data.samples.length * 16 + sencLength + 149)\n if (!data.isVideoEncryption && data.isAudioEncryption) {\n offset = Buffer.writeUint32(data.samples.length * 16 + 92)\n }\n } else {\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 28 + //sbgp\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n */\n let len = data.samples.length * 12 + 124\n if (data.isAudioEncryption) {\n len = data.samples.length * 12 + 8 * data.audioSenc.length + 177\n }\n offset = Buffer.writeUint32(len)\n }\n\n data.samples.forEach(item => {\n buffer.write(Buffer.writeUint32(item.duration))\n buffer.write(Buffer.writeUint32(item.size))\n buffer.write(Buffer.writeUint32(item.keyframe ? 0x02000000 : 0x00010000))\n if (data.isVideo) {\n buffer.write(Buffer.writeUint32(item.cts ? item.cts : 0))\n }\n })\n\n return MP4.box(MP4.types.trun, this.extension(0, data.flags), sampleCount, offset, buffer.buffer)\n }\n\n static senc (data) {\n const buffer = new Buffer()\n const len = data.samples.length\n const ceil = data.isVideo ? 16 : 8\n const flag = data.isVideo ? 2 : 0\n let samples = []\n let samplesLength = 0\n if (data.isVideo) {\n samples = data.videoSenc\n samplesLength = data.videoSencLength\n } else {\n samples = data.audioSenc\n }\n samplesLength = samplesLength || ceil * len\n buffer.write(\n Buffer.writeUint32(16 + samplesLength), MP4.types.senc, this.extension(0, flag)\n )\n buffer.write(Buffer.writeUint32(len))\n samples.forEach(item => {\n for (let i = 0; i < item.InitializationVector.length; i++) {\n buffer.write(new Uint8Array([item.InitializationVector[i]]))\n }\n if (item.subsamples && item.subsamples.length) {\n buffer.write(Buffer.writeUint16(item.subsamples.length))\n item.subsamples.forEach(value => {\n buffer.write(Buffer.writeUint16(value.BytesOfClearData))\n buffer.write(Buffer.writeUint32(value.BytesOfProtectedData))\n })\n }\n })\n return buffer.buffer\n // return MP4.box(MP4.types.senc, this.extension(0, flag), buffer.buffer)\n }\n\n static saio (data) {\n let length = data.samples.length * 12 + 141\n if (!data.isVideo && data.isAudioEncryption) {\n length = 149\n }\n const content = new Uint8Array([\n 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00,\n (length >> 24) & 0xff,\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff\n ])\n return MP4.box(MP4.types.saio, content)\n }\n\n static saiz (data) {\n const samplesLength = data.samples.length\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x10, // default sample info size\n (samplesLength >> 24) & 0xff,\n (samplesLength >> 16) & 0xff,\n (samplesLength >> 8) & 0xff,\n samplesLength & 0xff\n ])\n return MP4.box(MP4.types.saiz, content)\n }\n\n static sbgp () {\n const content = new Uint8Array([\n 0x72, 0x6F, 0x6C, 0x6C, // sgpd, grouping_type\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x01, 0x19,\n 0x00, 0x00, 0x00, 0x01\n ])\n return MP4.box(MP4.types.sbgp, this.extension(0, 0), content)\n }\n\n static extension (version, flag) {\n return new Uint8Array([\n version,\n (flag >> 16) & 0xff,\n (flag >> 8) & 0xff,\n flag & 0xff\n ])\n }\n\n static tfhd (id) {\n return MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags todo 0x00\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff // track_ID\n ]))\n }\n\n static tfdt (data, baseMediaDecodeTime) {\n const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1))\n const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1))\n if (data.useEME && (data.isVideoEncryption || data.isAudioEncryption)) {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n } else {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n }\n }\n\n static trun (samples, offset) {\n const sampleLen = samples.length\n const dataLen = 12 + (16 * sampleLen)\n offset += 8 + dataLen\n const data = new Uint8Array(dataLen)\n data.set([\n 0x00, // version\n 0x00, 0x0f, 0x01, // flags\n (sampleLen >>> 24) & 0xff, (sampleLen >>> 16) & 0xff, (sampleLen >>> 8) & 0xff, sampleLen & 0xff,\n (offset >>> 24) & 0xff, (offset >>> 16) & 0xff, (offset >>> 8) & 0xff, offset & 0xff // data_offset\n ], 0)\n for (let i = 0; i < sampleLen; i++) {\n const {\n duration, size, flag = {}, cts = 0\n } = samples[i]\n data.set([\n (duration >>> 24) & 0xff, (duration >>> 16) & 0xff, (duration >>> 8) & 0xff, duration & 0xff,\n (size >>> 24) & 0xff, (size >>> 16) & 0xff, (size >>> 8) & 0xff, size & 0xff,\n (flag.isLeading << 2) | (flag.dependsOn === null || flag.dependsOn === undefined ? 1 : flag.dependsOn),\n (flag.isDependedOn << 6) | (flag.hasRedundancy << 4) | (flag.paddingValue << 1) | (flag.isNonSyncSample === null || flag.isNonSyncSample === undefined ? 1 : flag.isNonSyncSample),\n flag.degradationPriority & (0xf0 << 8), flag.degradationPriority & 0x0f, // sample_flags\n (cts >>> 24) & 0xff, (cts >>> 16) & 0xff, (cts >>> 8) & 0xff, cts & 0xff // sample_composition_time_offset\n ], 12 + 16 * i)\n }\n\n return MP4.box(MP4.types.trun, data)\n }\n\n static moovMP4 (tracks) {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].duration, tracks[0].timescale),\n ...tracks.map((t) => MP4.trackMP4(t)))\n }\n\n static trackMP4 (track) {\n return MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.duration, track.width, track.height),\n MP4.mdiaMP4(track)\n )\n }\n\n static mdiaMP4 (track) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minfMP4(track))\n }\n\n static minfMP4 (track) {\n return MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stblMP4(track))\n }\n\n static stblMP4 (track) {\n const { ext } = track\n const boxes = [\n MP4.stsd(track),\n MP4.stts(ext.stts),\n MP4.stsc(ext.stsc),\n MP4.stsz(ext.stsz),\n MP4.stco(ext.stco)\n ]\n\n if (ext.stss.length) {\n boxes.push(MP4.stss(ext.stss))\n }\n\n if (ext.ctts.length) {\n boxes.push(MP4.ctts(ext.ctts))\n }\n\n return MP4.box(MP4.types.stbl, ...boxes)\n }\n\n static stts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n\n return MP4.box(MP4.types.stts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsc (entries) {\n const len = entries.length\n const data = new Uint8Array(12 * len)\n let offset = 0\n entries.forEach(({ firstChunk, samplesPerChunk, sampleDescIndex }) => {\n data.set([\n firstChunk >> 24, (firstChunk >> 16) & 0xff, (firstChunk >> 8) & 0xff, firstChunk & 0xff,\n samplesPerChunk >> 24, (samplesPerChunk >> 16) & 0xff, (samplesPerChunk >> 8) & 0xff, samplesPerChunk & 0xff,\n sampleDescIndex >> 24, (sampleDescIndex >> 16) & 0xff, (sampleDescIndex >> 8) & 0xff, sampleDescIndex & 0xff\n ], offset)\n offset += 12\n })\n return MP4.box(MP4.types.stsc, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsz (samplesSizes) {\n const len = samplesSizes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n samplesSizes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stsz, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stco (offsets) {\n const len = offsets.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n offsets.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stco, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stss (keyframeIndexes) {\n const len = keyframeIndexes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n keyframeIndexes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stss, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static ctts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n return MP4.box(MP4.types.ctts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static styp () {\n return MP4.box(MP4.types.styp, new Uint8Array([\n 0x6D, 0x73, 0x64, 0x68,\n 0x00, 0x00, 0x00, 0x00,\n 0x6D, 0x73, 0x64, 0x68,\n 0x6D, 0x73, 0x69, 0x78\n ]))\n }\n\n // data.sampleOffset 指的是samples的序列号。_samples[0].idx\n static sidx (data) {\n // const buffer = new Buffer()\n const timescale = data.timescale\n const duration = data.samples[0].duration\n const durationCount = duration * data.samples.length\n const earliestTime = data.samples[0].sampleOffset * duration\n let mdatSize = 8\n data.samples.forEach(item => {\n mdatSize += item.size\n })\n let length = 0\n if (data.isVideo) {\n let sencLength = 0\n let samples\n if (data.videoSenc) {\n samples = data.videoSenc\n }\n if (data.isVideo) {\n samples.forEach(item => {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n data.videoSencLength = sencLength\n length = mdatSize + 141 + data.samples.length * 16 + sencLength\n if (data.useEME && data.isAudioEncryption && !data.isVideoEncryption) {\n length = mdatSize + (data.samples.length * 16) + 84\n }\n } else {\n length = mdatSize + 116 + data.samples.length * 12\n if (data.useEME && data.isAudioEncryption) {\n length = mdatSize + 169 + data.samples.length * 12 + 8 * data.audioSenc.length\n }\n }\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, data.id & 0xff, // ref_id\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n (earliestTime >> 24) & 0xff,\n (earliestTime >> 16) & 0xff,\n (earliestTime >> 8) & 0xff,\n earliestTime & 0xff, // earliest_presentation_time\n 0x00, 0x00, 0x00, 0x00, // first_offset\n 0x00, 0x00, // reserved\n 0x00, 0x01, // ref_count\n // 0x00, 0x04, 0x11, 0xCF, // ref_size + ref_type\n // 0x00, 0x01, 0x0A, 0xA6, // ref_size + ref_type\n 0x00, // ref_size + ref_type ref_size = moof.size + mdat.size\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff,\n (durationCount >> 24) & 0xff,\n (durationCount >> 16) & 0xff,\n (durationCount >> 8) & 0xff,\n durationCount & 0xff,\n 0x90, 0x00, 0x00, 0x00\n ])\n return MP4.box(MP4.types.sidx, content)\n }\n\n static mdat (data) {\n const mdat = MP4.box(MP4.types.mdat, data)\n // console.log('[remux],mdat ,len ', mdat.byteLength, hashVal(mdat.toString()))\n return mdat\n }\n}\n","\nexport class Logger {\n constructor (name, enable) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n Logger.disabled = enable\n }\n\n debug (...args) {\n if (Logger.disabled) return\n console.debug(this._prefix, ...args)\n }\n\n log (...args) {\n if (Logger.disabled) return\n console.log(this._prefix, ...args)\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n error (...args) {\n if (Logger.disabled) return\n console.error(this._prefix, ...args)\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","import {\n WordArray,\n Hasher,\n} from './core.js';\n\n// Constants table\nconst T = [];\n\n// Compute constants\nfor (let i = 0; i < 64; i += 1) {\n T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n}\n\nconst FF = (a, b, c, d, x, s, t) => {\n const n = a + ((b & c) | (~b & d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst GG = (a, b, c, d, x, s, t) => {\n const n = a + ((b & d) | (c & ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst HH = (a, b, c, d, x, s, t) => {\n const n = a + (b ^ c ^ d) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst II = (a, b, c, d, x, s, t) => {\n const n = a + (c ^ (b | ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\n/**\n * MD5 hash algorithm.\n */\nexport class MD5Algo extends Hasher {\n _doReset() {\n this._hash = new WordArray([\n 0x67452301,\n 0xefcdab89,\n 0x98badcfe,\n 0x10325476,\n ]);\n }\n\n _doProcessBlock(M, offset) {\n const _M = M;\n\n // Swap endian\n for (let i = 0; i < 16; i += 1) {\n // Shortcuts\n const offset_i = offset + i;\n const M_offset_i = M[offset_i];\n\n _M[offset_i] = (\n (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)\n | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n );\n }\n\n // Shortcuts\n const H = this._hash.words;\n\n const M_offset_0 = _M[offset + 0];\n const M_offset_1 = _M[offset + 1];\n const M_offset_2 = _M[offset + 2];\n const M_offset_3 = _M[offset + 3];\n const M_offset_4 = _M[offset + 4];\n const M_offset_5 = _M[offset + 5];\n const M_offset_6 = _M[offset + 6];\n const M_offset_7 = _M[offset + 7];\n const M_offset_8 = _M[offset + 8];\n const M_offset_9 = _M[offset + 9];\n const M_offset_10 = _M[offset + 10];\n const M_offset_11 = _M[offset + 11];\n const M_offset_12 = _M[offset + 12];\n const M_offset_13 = _M[offset + 13];\n const M_offset_14 = _M[offset + 14];\n const M_offset_15 = _M[offset + 15];\n\n // Working varialbes\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n\n // Computation\n a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n a = II(a, b, c, d, M_offset_0, 6, T[48]);\n d = II(d, a, b, c, M_offset_7, 10, T[49]);\n c = II(c, d, a, b, M_offset_14, 15, T[50]);\n b = II(b, c, d, a, M_offset_5, 21, T[51]);\n a = II(a, b, c, d, M_offset_12, 6, T[52]);\n d = II(d, a, b, c, M_offset_3, 10, T[53]);\n c = II(c, d, a, b, M_offset_10, 15, T[54]);\n b = II(b, c, d, a, M_offset_1, 21, T[55]);\n a = II(a, b, c, d, M_offset_8, 6, T[56]);\n d = II(d, a, b, c, M_offset_15, 10, T[57]);\n c = II(c, d, a, b, M_offset_6, 15, T[58]);\n b = II(b, c, d, a, M_offset_13, 21, T[59]);\n a = II(a, b, c, d, M_offset_4, 6, T[60]);\n d = II(d, a, b, c, M_offset_11, 10, T[61]);\n c = II(c, d, a, b, M_offset_2, 15, T[62]);\n b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n // Intermediate hash value\n H[0] = (H[0] + a) | 0;\n H[1] = (H[1] + b) | 0;\n H[2] = (H[2] + c) | 0;\n H[3] = (H[3] + d) | 0;\n }\n /* eslint-ensable no-param-reassign */\n\n _doFinalize() {\n // Shortcuts\n const data = this._data;\n const dataWords = data.words;\n\n const nBitsTotal = this._nDataBytes * 8;\n const nBitsLeft = data.sigBytes * 8;\n\n // Add padding\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n const nBitsTotalL = nBitsTotal;\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n );\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n );\n\n data.sigBytes = (dataWords.length + 1) * 4;\n\n // Hash final blocks\n this._process();\n\n // Shortcuts\n const hash = this._hash;\n const H = hash.words;\n\n // Swap endian\n for (let i = 0; i < 4; i += 1) {\n // Shortcut\n const H_i = H[i];\n\n H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)\n | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n }\n\n // Return final computed hash\n return hash;\n }\n\n clone() {\n const clone = super.clone.call(this);\n clone._hash = this._hash.clone();\n\n return clone;\n }\n}\n\n/**\n * Shortcut function to the hasher's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n *\n * @return {WordArray} The hash.\n *\n * @static\n *\n * @example\n *\n * var hash = CryptoJS.MD5('message');\n * var hash = CryptoJS.MD5(wordArray);\n */\nexport const MD5 = Hasher._createHelper(MD5Algo);\n\n/**\n * Shortcut function to the HMAC's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n * @param {WordArray|string} key The secret key.\n *\n * @return {WordArray} The HMAC.\n *\n * @static\n *\n * @example\n *\n * var hmac = CryptoJS.HmacMD5(message, key);\n */\nexport const HmacMD5 = Hasher._createHmacHelper(MD5Algo);\n","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n\n let mdatSize = 0\n\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n\n const mdata = new Uint8Array(mdatSize)\n const mdatView = new DataView(mdata.buffer)\n\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","/**\n * A noop padding strategy.\n */\nexport const NoPadding = {\n pad() {\n },\n\n unpad() {\n },\n};\n","import { WordArray, Hex } from 'crypto-es/lib/core'\nimport { CipherParams } from 'crypto-es/lib/cipher-core'\nimport { AES } from 'crypto-es/lib/aes'\nimport { CTR } from 'crypto-es/lib/mode-ctr'\nimport { NoPadding } from 'crypto-es/lib/pad-nopadding'\nimport { formatIV } from '../../utils'\nimport Buffer from '../buffer'\n\nconst Crypto = {\n\n decryptWordArray: function (raw, key, iv) {\n const realKey = Hex.parse(key)\n\n const realIV = Hex.parse(formatIV(iv))\n const message = WordArray.create(new Uint8Array(raw))\n const decryptWord = AES.decrypt(\n CipherParams.create({\n ciphertext: message\n }),\n realKey,\n {\n iv: realIV,\n mode: CTR,\n padding: NoPadding\n }\n )\n return Crypto.wordArrayToUint8Array(decryptWord)\n },\n wordArrayToUint8Array: function (wordArray) {\n const l = wordArray.sigBytes\n const words = wordArray.words\n const result = new Uint8Array(l)\n let i = 0\n let j = 0\n while (true) {\n if (i === l) { break }\n const w = words[j++]\n result[i++] = (w & 0xff000000) >>> 24\n if (i === l) { break }\n result[i++] = (w & 0x00ff0000) >>> 16\n if (i === l) { break }\n result[i++] = (w & 0x0000ff00) >>> 8\n if (i === l) { break }\n result[i++] = (w & 0x000000ff)\n }\n return result\n },\n\n decoderAESCTRData (videoTrack, audioTrack, customDescryptHandler) {\n if (videoTrack.videoSenc) {\n const key = videoTrack.kidValue\n const senc = videoTrack.videoSenc\n videoTrack.samples.forEach((item, index) => {\n const sencBox = senc[index]\n let encodeWord = item.data\n const encodeBuffers = []\n const decodeBuffers = []\n const iv = sencBox.InitializationVector\n if (sencBox.subsamples && sencBox.subsamples.length) {\n sencBox.subsamples.forEach(function (value) {\n const len = value.BytesOfClearData + value.BytesOfProtectedData\n const sampleData = encodeWord.slice(0, len)\n encodeBuffers.push(sampleData.slice(0, value.BytesOfClearData))\n decodeBuffers.push(sampleData.slice(value.BytesOfClearData))\n encodeWord = encodeWord.slice(len)\n })\n } else {\n const len = item.size\n encodeBuffers.push(encodeWord.slice(0, 0))\n decodeBuffers.push(encodeWord.slice(0, len))\n encodeWord = encodeWord.slice(len)\n }\n const tempBuffer = new Buffer()\n tempBuffer.write(...decodeBuffers)\n let decrypted = customDescryptHandler ? customDescryptHandler(tempBuffer.buffer, key, iv) : Crypto.decryptWordArray(tempBuffer.buffer, key, iv)\n const buffer = new Buffer()\n encodeBuffers.forEach((clearDataBuf, i) => {\n const protectedDataLen = decodeBuffers[i].length\n const decodeProtectedData = decrypted.slice(0, protectedDataLen)\n buffer.write(clearDataBuf)\n buffer.write(decodeProtectedData)\n decrypted = decrypted.slice(protectedDataLen)\n })\n videoTrack.samples[index].data = buffer.buffer\n })\n }\n\n if (audioTrack.audioSenc) {\n const key = audioTrack.kidValue\n const senc = audioTrack.audioSenc\n audioTrack.samples.forEach((item, index) => {\n const sencBox = senc[index]\n const dec = customDescryptHandler ? customDescryptHandler(item.data, key, sencBox.InitializationVector) : Crypto.decryptWordArray(item.data, key, sencBox.InitializationVector)\n audioTrack.samples[index].data = dec\n })\n }\n }\n}\n\nexport default Crypto\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample } from '../model'\nimport { readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\nimport { Logger } from './logger'\nimport Crypto from './crypto/crypto'\nconst NEW_ARRAY_MAX_CNT = 20\nexport class MP4Demuxer {\n _videoSamples = []\n _audioSamples = []\n _lastRemainBuffer = []\n _lastRemainBufferStartPos = 0\n\n constructor (videoSegmnents, audioSegmnents, metadataTrack, options) {\n this.videoTrack = new VideoTrack()\n this.audioTrack = new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this.log = new Logger('MP4Demuxer', options && options.openLog ? !options.openLog : true)\n\n videoSegmnents && videoSegmnents.forEach(item => {\n this._videoSamples.push(...item.frames)\n })\n audioSegmnents && audioSegmnents.forEach(item => {\n this._audioSamples.push(...item.frames)\n })\n }\n\n parseSamples (moov) {\n if (!moov) {\n throw new Error('moov is required')\n }\n if (!this.videoTrack.codec && !this.audioTrack.codec) {\n MP4Parser.moovToTrack(moov, this.videoTrack, this.audioTrack)\n this.videoSenc = this.videoTrack.videoSenc\n this.audioSenc = this.audioTrack.audioSenc\n }\n if (!this._audioSamples.length && !this._videoSamples.length) {\n const ret = MP4Parser.moovToSamples(moov)\n if (!ret) throw new Error('cannot parse samples from moov box')\n this._videoSamples = ret.videoSamples || []\n this._audioSamples = ret.audioSamples || []\n }\n }\n\n demux (data, dataStart, videoIndexRange, audioIndexRange, moov) {\n this.parseSamples(moov)\n\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n let sample\n let sampleData\n let startByte\n if (videoIndexRange) {\n let frame\n let nalSize = 0\n for (let i = videoIndexRange[0], l = videoIndexRange[1]; i <= l; i++) {\n sample = this._videoSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n startByte = sample.offset - dataStart\n sampleData = data.subarray(startByte, startByte + sample.size)\n frame = new VideoSample(sample.pts || sample.dts, sample.dts)\n frame.duration = sample.duration\n frame.gopId = sample.gopId\n if (sample.keyframe) frame.setToKeyframe()\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n frame.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(frame)\n }\n\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioIndexRange) {\n for (let i = audioIndexRange[0], l = audioIndexRange[1]; i <= l; i++) {\n sample = this._audioSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n startByte = sample.offset - dataStart\n sampleData = data.subarray(startByte, startByte + sample.size)\n audioTrack.samples.push(new AudioSample(sample.dts, sampleData, sample.duration))\n }\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].dts\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n demuxPart (data, dataStart, videoIndexRange, audioIndexRange, moov, useEME, kidValue, customDescryptHandler) {\n this.parseSamples(moov)\n\n this.videoTrack.useEME = useEME\n this.audioTrack.useEME = useEME\n // this.log.debug('[demuxPart start],dataStart,', dataStart, ',dataLen,', data.byteLength, ', lastRemain,', this._lastRemainBuffer ? this._lastRemainBuffer.byteLength : 0)\n if (this._lastRemainBuffer && this._lastRemainBuffer.byteLength > 0 && dataStart > this._lastRemainBufferStartPos && dataStart <= this._lastRemainBufferStartPos + this._lastRemainBuffer.byteLength) {\n let tryCnt = 0\n while (tryCnt < NEW_ARRAY_MAX_CNT) {\n try {\n const buffer = this._lastRemainBuffer.subarray(0, dataStart - this._lastRemainBufferStartPos)\n const temp = new Uint8Array(data.byteLength + buffer.byteLength)\n temp.set(buffer, 0)\n temp.set(new Uint8Array(data), buffer.byteLength)\n data = temp\n dataStart -= buffer.byteLength\n this._lastRemainBuffer = null\n this._lastRemainBufferStartPos = 0\n // this.log.debug('[demuxPart add lastRemain],dataStart,', dataStart, ',dataLen,', data.byteLength)\n break\n } catch (e) {\n if (tryCnt < NEW_ARRAY_MAX_CNT) {\n tryCnt++\n } else {\n throw new Error('new Uint8Array error:,' + e.errorMessage)\n }\n }\n }\n }\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n videoTrack.samples = []\n audioTrack.samples = []\n videoTrack.videoSenc = null\n audioTrack.audioSenc = null\n\n let sample\n let sampleData\n let startByte\n let videoEndByte = 0\n let audioEndByte = 0\n if (this._videoSamples.length > 0 && videoIndexRange.length > 0) {\n let frame\n const end = data.byteLength + dataStart\n for (let i = videoIndexRange[0]; i <= videoIndexRange[1]; i++) {\n sample = this._videoSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n if (sample.offset >= dataStart && sample.offset + sample.size <= end) {\n startByte = sample.offset - dataStart\n videoEndByte = startByte + sample.size\n sampleData = data.subarray(startByte, videoEndByte)\n frame = new VideoSample(sample.pts || sample.dts, sample.dts)\n frame.duration = sample.duration\n // this.log.debug('[video !!!!!!!!],frame,index,', sample.index, ',segmentIdx', segmentIdx, ', dataStart,', dataStart, ',dataEnd', end, ',Samplestart,', sample.offset, ', SampleEnd,', sample.offset + sample.size, ',size,', sample.size, 'dts,', sample.dts, ',pts,', sample.pts, ', keyframe', sample.keyframe)\n frame.gopId = sample.gopId\n frame.sampleOffset = sample.index\n // frame.timeOffset = sample.timeOffset || sample.timeOffset === 0 ? sample.timeOffset : null\n if (sample.keyframe) frame.setToKeyframe()\n frame.data = sampleData\n frame.size = sample.size\n // this.log.debug('[demux video frame],frame,index,', sample.index, ', size,', sampleData.byteLength, ', hash ', hashVal(sampleData.toString()))\n videoTrack.samples.push(frame)\n }\n }\n if (videoTrack.samples.length > 0) {\n videoTrack.gopId = videoTrack.samples[0].gopId\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n videoTrack.startPts = videoTrack.samples[0].pts / videoTrack.timescale\n videoTrack.endPts = videoTrack.samples[videoTrack.samples.length - 1].pts / videoTrack.timescale\n // this.log.debug('[demux video],frame,startPts,', videoTrack.startPts, ', endPts,', videoTrack.endPts)\n if (this.videoSenc) {\n videoTrack.videoSenc = this.videoSenc.slice(videoTrack.samples[0].sampleOffset, videoTrack.samples[0].sampleOffset + videoTrack.samples.length)\n videoTrack.kidValue = kidValue\n }\n }\n }\n if (this._audioSamples.length > 0 && audioIndexRange.length > 0) {\n for (let i = audioIndexRange[0]; i <= audioIndexRange[1]; i++) {\n sample = this._audioSamples[i]\n if (!sample) {\n throw new Error(`cannot found video frame #${i}`)\n }\n if (sample.offset >= dataStart && sample.offset + sample.size <= data.byteLength + dataStart) {\n startByte = sample.offset - dataStart\n audioEndByte = startByte + sample.size\n sampleData = data.subarray(startByte, audioEndByte)\n // this.log.debug('[audio !!!!!!!!],audio frame,index,', sample.index, ',segmentIdx', segmentIdx, ', Samplestart,', sample.offset, ', SampleEnd,', sample.offset + sample.size, ',size,', sample.size, 'dts,', sample.dts, ',pts,', sample.pts || sample.dts)\n // frame.gopId = sample.gopId\n // this.log.debug('[demux audio frame],index ,', sample.index, ', size,', sampleData.byteLength, ', hash,', hashVal(sampleData.toString()))\n audioTrack.samples.push(new AudioSample(sample.dts, sampleData, sample.duration, sample.index))\n }\n }\n if (audioTrack.samples.length > 0) {\n audioTrack.gopId = audioTrack.samples[0].gopId || videoTrack.gopId\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].dts\n audioTrack.startPts = audioTrack.samples[0].pts / audioTrack.timescale\n audioTrack.endPts = audioTrack.samples[audioTrack.samples.length - 1].pts / audioTrack.timescale\n // this.log.debug('[demux audio],frame,startPts,', audioTrack.startPts, ', endPts,', audioTrack.endPts)\n if (this.audioSenc) {\n audioTrack.audioSenc = this.audioSenc.slice(audioTrack.samples[0].sampleOffset, audioTrack.samples[0].sampleOffset + audioTrack.samples.length)\n audioTrack.kidValue = kidValue\n }\n }\n }\n this.decoderData(videoTrack, audioTrack, customDescryptHandler)\n let nalSize = 0\n for (let i = 0; i < videoTrack.samples.length; i++) {\n let start = 0\n const sampleData = videoTrack.samples[i].data\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n videoTrack.samples[i].units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n }\n this._lastRemainBuffer = data.subarray(Math.max(videoEndByte, audioEndByte))\n if (this._lastRemainBuffer.byteLength > 0) {\n this._lastRemainBufferStartPos = dataStart + data.byteLength - this._lastRemainBuffer.byteLength\n } else {\n this._lastRemainBufferStartPos = 0\n }\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this._videoSamples = []\n this._audioSamples = []\n this._lastRemainBuffer = null\n this._lastRemainBufferStartPos = 0\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n decoderData (videoTrack, audioTrack, customDescryptHandler) {\n if (videoTrack.useEME || audioTrack.useEME) return\n Crypto.decoderAESCTRData(videoTrack, audioTrack, customDescryptHandler)\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","/**\n * @type {string}\n * */\nexport default __VERSION__\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","export class Buffer {\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static start (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n // Edge bug: https://bit.ly/2JYLPeB\n if (buf.length === 1 && buf.start(0) < 0) return 0\n\n return buf.start(0)\n }\n\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static end (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n\n return buf.end(buf.length - 1)\n }\n\n /**\n * @param {{buffered?: TimeRanges}} b\n * @returns {TimeRanges | void}\n */\n static get (b) {\n if (!b) return\n try {\n return b.buffered\n } catch (error) {\n // ignore\n }\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {[number,number][]}\n */\n static buffers (buf, maxHole) {\n if (!buf || !buf.length) return []\n\n const buffers = []\n for (let i = 0, l = buf.length; i < l; i++) {\n const bufLen = buffers.length\n if (!bufLen || !maxHole) {\n buffers.push([buf.start(i), buf.end(i)])\n } else {\n const last = buffers[bufLen - 1]\n const lastEnd = last[1]\n const start = buf.start(i)\n if (start - lastEnd <= maxHole) {\n const end = buf.end(i)\n if (end > lastEnd) {\n last[1] = end\n }\n } else {\n buffers.push([buf.start(i), buf.end(i)])\n }\n }\n }\n return buffers\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {{buffers:[number,number][],length:number}}\n */\n static totalLength (buffers) {\n if (!buffers || !buffers.length) return 0\n return buffers.reduce((a, c) => (a += (c[1] - c[0])), 0)\n }\n\n /**\n *\n * @param {TimeRanges} buf\n * @param {number} [pos=0]\n * @param {number} [maxHole=0]\n * @returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}\n */\n static info (buf, pos = 0, maxHole = 0) {\n if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }\n\n let start = 0\n let end = 0\n let index = 0\n let nextStart = 0\n let nextEnd = 0\n let prevStart = 0\n let prevEnd = 0\n const buffers = Buffer.buffers(buf, maxHole)\n\n for (let i = 0, l = buffers.length; i < l; i++) {\n const item = buffers[i]\n if (pos + maxHole >= item[0] && pos <= item[1]) {\n start = item[0]\n end = item[1]\n index = i\n } else if (pos + maxHole < item[0]) {\n nextStart = item[0]\n nextEnd = item[1]\n break\n } else if (pos + maxHole > item[1]) {\n prevStart = item[0]\n prevEnd = item[1]\n }\n }\n\n return {\n start,\n end,\n index,\n buffers,\n nextStart,\n nextEnd,\n prevStart,\n prevEnd,\n currentTime: pos,\n behind: pos - start,\n remaining: end ? end - pos : 0,\n length: Buffer.totalLength && Buffer.totalLength(buffers)\n }\n }\n}\n","export const ERR = {\n MANIFEST: 'manifest',\n NETWORK: 'network',\n NETWORK_TIMEOUT: 'network_timeout',\n NETWORK_FORBIDDEN:'network_forbidden',\n NETWORK_NOTFOUND: 'network_notfound',\n NETWROK_RANGE_NOT_SATISFIABLE:'network_range_not_satisfiable',\n DEMUX: 'demux',\n REMUX: 'remux',\n MEDIA: 'media',\n DRM: 'drm',\n OTHER: 'other',\n RUNTIME:'runtime',\n\n SUB_TYPES: {\n FLV: 'FLV',\n HLS: 'HLS',\n MP4: 'MP4',\n FMP4: 'FMP4',\n MSE_ADD_SB: 'MSE_ADD_SB',\n MSE_APPEND_BUFFER: 'MSE_APPEND_BUFFER',\n MSE_OTHER: 'MSE_OTHER',\n MSE_FULL: 'MSE_FULL',\n OPTION: 'OPTION',\n DASH:'DASH',\n LICENSE:'LICENSE',\n CUSTOM_LICENSE:'CUSTOM_LICENSE',\n MSE_HIJACK:'MSE_HIJACK',\n EME_HIJACK:'EME_HIJACK',\n SIDX:'SIDX',\n NO_CANPLAY_ERROR:'NO_CANPLAY_ERROR',\n BUFFERBREAK_ERROR:'BUFFERBREAK_ERROR',\n WAITING_TIMEOUT_ERROR: 'WAITING_TIMEOUT_ERROR',\n MEDIA_ERR_ABORTED:'MEDIA_ERR_ABORTED',\n MEDIA_ERR_NETWORK:'MEDIA_ERR_NETWORK',\n MEDIA_ERR_DECODE:'MEDIA_ERR_DECODE',\n MEDIA_ERR_SRC_NOT_SUPPORTED:'MEDIA_ERR_SRC_NOT_SUPPORTED',\n MEDIA_ERR_CODEC_NOT_SUPPORTED:'MEDIA_ERR_CODEC_NOT_SUPPORTED',\n MEDIA_ERR_URL_EMPTY:'MEDIA_ERR_URL_EMPTY'\n }\n}\n\nexport const ERR_CODE = {\n [ERR.MANIFEST]: {\n HLS: 1100,\n DASH:1200\n },\n [ERR.NETWORK]: 2100,\n [ERR.NETWORK_TIMEOUT]: 2101,\n [ERR.NETWORK_FORBIDDEN]:2103,\n [ERR.NETWORK_NOTFOUND]:2104,\n [ERR.NETWROK_RANGE_NOT_SATISFIABLE]:2116,\n [ERR.DEMUX]: {\n FLV: 3100,\n HLS: 3200,\n MP4: 3300,\n FMP4: 3400,\n SIDX: 3410\n },\n [ERR.REMUX]: {\n FMP4: 4100,\n MP4: 4200\n },\n [ERR.MEDIA]: {\n MEDIA_ERR_ABORTED: 5101,\n MEDIA_ERR_NETWORK: 5102,\n MEDIA_ERR_DECODE: 5103,\n MEDIA_ERR_SRC_NOT_SUPPORTED: 5104,\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 5105,\n MEDIA_ERR_URL_EMPTY: 5106,\n MSE_ADD_SB: 5200,\n MSE_APPEND_BUFFER: 5201,\n MSE_OTHER: 5202,\n MSE_FULL: 5203,\n MSE_HIJACK:5204,\n EME_HIJACK:5301\n },\n [ERR.DRM]:{\n LICENSE:7100,\n CUSTOM_LICENSE:7200\n },\n [ERR.OTHER]: 8000,\n [ERR.RUNTIME]:{\n NO_CANPLAY_ERROR:9001,\n BUFFERBREAK_ERROR:9002,\n WAITING_TIMEOUT_ERROR:9003\n }\n}\n\n\n\nexport class StreamingError extends Error {\n constructor (type, subType, origin, payload, msg) {\n super(msg || origin?.message)\n this.errorType = type === ERR.NETWORK_TIMEOUT ? ERR.NETWORK : type\n this.originError = origin\n this.ext = payload\n this.errorCode = ERR_CODE[type][subType] || ERR_CODE[type]\n this.errorMessage = this.message\n if (!this.errorCode) {\n this.errorType = ERR.OTHER\n this.errorCode = ERR_CODE[this.errorType]\n }\n }\n\n static create (type, subType, origin, payload, msg) {\n if (type instanceof StreamingError) {\n return type\n } else if (type instanceof Error) {\n origin = type\n type = ''\n }\n\n if (!type) type = ERR.OTHER\n\n return new StreamingError(type, subType, origin, payload, msg)\n }\n\n static network (error) {\n return new StreamingError(\n error?.isTimeout ? ERR.NETWORK_TIMEOUT : ERR.NETWORK,\n null,\n error instanceof Error ? error : null,\n {\n url: error?.url,\n response: error?.response,\n httpCode: error?.response?.status\n }\n )\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n","\nexport const LogCacheLevel = {\n 'DEBUG': 1,\n 'LOG': 2,\n 'WARN': 3,\n 'ERROR': 4\n}\nconst LOG_MAX_SIZE = 200 * 1024\nconst SIMPLE_TYPE = ['Boolean', 'Number' ,'String', 'Undefined','Null', 'Date','Object']\nexport class Logger {\n constructor (name,config) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n this.logCacheLevel = config?.logCacheLevel || 3\n this.logMaxSize = config?.logMaxSize || LOG_MAX_SIZE\n this.logSize = 0\n this.logTextArray = []\n }\n\n debug (...args) {\n this.logCache(LogCacheLevel.DEBUG,...args)\n if (Logger.disabled) return\n console.debug(this._prefix, nowTime(), ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(this._prefix, nowTime(), ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(this._prefix, nowTime(), ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(this._prefix, nowTime(), ...args)\n }\n\n logCache (logCacheLevel, ...logText) {\n if (logCacheLevel < this.logCacheLevel) return\n let text = ''\n try {\n const finLogText = logText.map( item => logable(item))\n text = this._prefix + nowTime() + (JSON.stringify(finLogText))\n } catch (e) {\n return\n }\n if (logCacheLevel >= this.logCacheLevel) {\n this.logSize += text.length\n this.logTextArray.push(text)\n }\n if (this.logSize > this.logMaxSize) {\n const delLog = this.logTextArray.shift()\n this.logSize -= delLog.length\n }\n }\n\n getLogCache () {\n const logText = this.logTextArray.join('\\n')\n this.reset()\n return logText\n }\n\n reset () {\n this.logTextArray = []\n this.logSize = 0\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n\n setLogLevel (val) {\n this.logCacheLevel = val\n }\n}\nfunction nowTime () {\n return new Date().toLocaleString()\n}\n\nfunction reduceDepth (val) {\n if (typeof val !== 'object') {\n return val\n }\n const objType = Object.prototype.toString.call(val).slice(8, -1)\n switch (objType) {\n case 'Array':\n case 'Uint8Array':\n case 'ArrayBuffer':\n\n return objType + '[' + val.length + ']'\n case 'Object':\n return '{}'\n default:\n return objType\n }\n}\n\nfunction logable (obj, maxDepth, depth) {\n if (!depth) depth = 1\n if (!maxDepth) maxDepth = 2\n const result = {}\n\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n const objType = Object.prototype.toString.call(obj).slice(8, -1)\n if (!SIMPLE_TYPE.includes(objType)) {\n return objType\n }\n\n if (depth > maxDepth) {\n return undefined\n }\n\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (depth === maxDepth) {\n result[key] = reduceDepth(obj[key])\n } else if (typeof obj[key] === 'object') {\n result[key] = logable(obj[key], maxDepth, depth + 1)\n } else {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n","/* eslint-disable no-undef */\nimport { createPublicPromise, nowTime } from './utils'\nimport { Buffer } from './buffer'\nimport { StreamingError, ERR } from './error'\nimport { isBrowser } from './env'\nimport { Logger } from './logger'\n\nfunction getMediaSource () {\n try {\n return isBrowser ? window.MediaSource : null\n } catch (e) {}\n}\n\nconst MediaSource = getMediaSource()\n\n/** @enum {string} */\nexport const MSEErrorType = {\n UPDATE_ERROR: 'updateError'\n}\n\nconst OP_NAME = {\n APPEND: 'appendBuffer',\n REMOVE: 'removeBuffer',\n UPDATE_DURATION:'updateDuration'\n}\n\nexport class MSEError extends Error {\n /**\n * @param {MSEErrorType} type\n * @param {any} [msg]\n */\n constructor (type, msg) {\n super(msg || type)\n this.type = type\n this.msg = msg\n }\n}\n\nexport class MSE {\n /** @type { HTMLMediaElement | null } */\n media = null\n\n /** @type { MediaSource | null } */\n mediaSource = null\n\n _openPromise = createPublicPromise()\n\n _queue = Object.create(null)\n\n _sourceBuffer = Object.create(null)\n\n static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n _mseFullFlag = {}\n\n _st = 0\n\n _opst = 0\n\n _logger = null\n\n _config = null\n _url = null\n\n\n static getDefaultConfig () {\n return {\n openLog: false\n }\n }\n\n /**\n * @param {HTMLMediaElement} [media]\n */\n constructor (media, config) {\n this._config = Object.assign(MSE.getDefaultConfig(), config)\n if (media) this.bindMedia(media)\n this._logger = new Logger('MSE')\n if (this._config.openLog) {\n Logger.enable()\n }\n }\n\n get isOpened () {\n return this.mediaSource?.readyState === 'open'\n }\n\n get url () {\n return this._url\n }\n\n get duration () {\n return this.mediaSource?.duration || -1\n }\n\n get isEnded () {\n return this.mediaSource ? this.mediaSource.readyState === 'ended' : false\n }\n\n isFull (type) {\n return type ? this._mseFullFlag[type] : this._mseFullFlag[MSE.VIDEO]\n }\n\n /**\n * @param { number } duration\n * @return { Promise }\n */\n updateDuration (duration) {\n const isReduceDuration = this.mediaSource && this.mediaSource.duration > duration\n if (this.mediaSource && this.mediaSource.duration > duration) {\n let bufferEnd = 0\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n bufferEnd = Math.max(this.bufferEnd(k) || 0, bufferEnd)\n } catch (error) {\n // ignore\n }\n })\n if (duration < bufferEnd) {\n // 设置值比bufferEnd值小,会导致异常\n return Promise.resolve()\n }\n }\n\n return this._enqueueBlockingOp(() => {\n if (this.isEnded) {\n this._logger.debug('[debug mse] setDuration ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('[debug mse] setDuration')\n }\n }, OP_NAME.UPDATE_DURATION, {isReduceDuration})\n }\n\n /** @return { Promise } */\n open () {\n if (this._openPromise.used && !this.isOpened && this.mediaSource) {\n const ms = this.mediaSource\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN', costtime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @param { HTMLMediaElement } media\n * @return { Promise }\n */\n async bindMedia (media) {\n if (this.mediaSource || this.media) await this.unbindMedia()\n if (!media || !MediaSource) throw new Error('Param media or MediaSource does not exist')\n this.media = media\n const ms = this.mediaSource = new MediaSource()\n this._st = nowTime()\n\n const onOpen = () => {\n const costtime = nowTime() - this._st\n this._logger.debug('MSE OPEN')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n return this._openPromise\n }\n\n /** @return { Promise } */\n async unbindMedia () {\n if (!this._openPromise.used) this._openPromise.resolve()\n const ms = this.mediaSource\n\n if (ms) {\n Object.keys(this._queue).forEach((t) => {\n const queue = this._queue[t]\n if (queue) {\n queue.forEach(x => x.promise?.resolve?.())\n }\n })\n\n const hasMetadata = !!this.media && this.media.readyState >= 1\n const mseOpen = ms.readyState === 'open'\n\n if (hasMetadata && mseOpen) {\n try {\n ms.endOfStream()\n } catch (error) {\n // ignore\n }\n }\n\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n ms.removeSourceBuffer(this._sourceBuffer[k])\n } catch (error) {\n // ignore\n }\n })\n }\n\n if (this.media) {\n this.media.removeAttribute('src')\n try {\n this.media.load()\n } catch (error) {\n // ignore\n }\n this.media = null\n }\n\n this.mediaSource = null\n this._openPromise = createPublicPromise()\n this._queue = Object.create(null)\n this._sourceBuffer = Object.create(null)\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n */\n createSource (type, mimeType) {\n if (this._sourceBuffer[type] || !this.mediaSource) return\n let sb\n try {\n sb = this._sourceBuffer[type] = this.mediaSource.addSourceBuffer(mimeType)\n } catch (error) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_ADD_SB, error)\n }\n sb.mimeType = mimeType\n sb.addEventListener('updateend', this._onSBUpdateEnd.bind(this, type))\n sb.addEventListener('error', this._onSBUpdateError.bind(this, type))\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n changeType (type, mimeType) {\n const sb = this._sourceBuffer[type]\n if (!this.mediaSource || !sb || sb.mimeType === mimeType) return Promise.resolve()\n\n if (typeof sb.changeType !== 'function') return Promise.reject()\n\n return this._enqueueOp(type, () => {\n sb.changeType(mimeType)\n sb.mimeType = mimeType\n this._onSBUpdateEnd(type)\n }, 'changeType', {mimeType})\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n createOrChangeSource (type, mimeType) {\n this.createSource(type, mimeType)\n return this.changeType(type, mimeType)\n }\n\n /**\n * @param { string } type\n * @param { BufferSource } buffer\n * @return { Promise }\n */\n append (type, buffer, context) {\n if (!buffer || !buffer.byteLength) {\n return Promise.resolve()\n }\n\n if (!this._sourceBuffer[type]) return Promise.resolve()\n\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n this._logger.debug('MSE APPEND START', context)\n this._opst = nowTime()\n this._sourceBuffer[type]?.appendBuffer(buffer)\n }, OP_NAME.APPEND, context)\n\n }\n\n /**\n * @param { string } type\n * @param { number } startTime\n * @param { number } endTime\n * @return { Promise }\n */\n remove (type, startTime, endTime, context) {\n // if (Object.keys(this._sourceBuffer).length === 1) return Promise.resolve()\n let isInsertHead = false\n if (this._mseFullFlag[type]) {\n isInsertHead = true\n }\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[type]\n if (startTime >= endTime || !sb) {\n this._onSBUpdateEnd(type)\n return\n }\n this._opst = nowTime()\n this._logger.debug('MSE REMOVE START', type, startTime, endTime, context)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE, context, isInsertHead)\n }\n\n clearBuffer (startTime, endTime) {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this.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 initOpque = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initOpque.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initOpque.length > 0 && this._queue[type].push(...initOpque)\n }\n\n /**\n * @param {EndOfStreamError} [reason]\n * @returns {Promise}\n */\n endOfStream (reason) {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open') return Promise.resolve()\n return this._enqueueBlockingOp(() => {\n const ms = this.mediaSource\n if (!ms || ms.readyState !== 'open') return\n this._logger.debug('MSE endOfStream START')\n if (reason) {\n ms.endOfStream(reason)\n } else {\n ms.endOfStream()\n }\n }, 'endOfStream')\n }\n\n setLiveSeekableRange (start, end) {\n const ms = this.mediaSource\n if (start < 0 || end < start || !ms?.setLiveSeekableRange || ms.readyState !== 'open') return\n ms.setLiveSeekableRange(start, end)\n }\n\n /**\n * @param {string} type\n * @returns {?SourceBuffer}\n */\n getSourceBuffer (type) {\n return this._sourceBuffer[type]\n }\n\n /**\n * @param { string } type\n * @return { TimeRanges | void }\n */\n buffered (type) {\n return Buffer.get(this._sourceBuffer[type])\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferStart (type) {\n return Buffer.start(this.buffered(type))\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferEnd (type) {\n return Buffer.end(this.buffered(type))\n }\n\n _enqueueOp (type, exec, opName, context, isInsertHead) {\n if (!this.mediaSource) return Promise.resolve()\n const queue = this._queue[type] = this._queue[type] || []\n const op = {\n exec,\n promise: createPublicPromise(),\n opName,\n context\n }\n\n if (isInsertHead) {\n queue.splice(0, 0, op)\n this._mseFullFlag[type] = false\n this._startQueue(type)\n } else {\n queue.push(op)\n }\n\n if (this.isOpened || this.isEnded) {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n } else {\n this._openPromise.then(() => {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n })\n }\n\n\n return op.promise\n }\n\n async _enqueueBlockingOp (exec, opName, context) {\n if (!this.mediaSource) return Promise.resolve()\n const types = Object.keys(this._sourceBuffer)\n if (!types.length) {\n return exec()\n }\n\n const waiters = []\n types.forEach(t => {\n const queue = this._queue[t]\n const prom = createPublicPromise()\n waiters.push(prom)\n queue.push({exec: () => {\n prom.resolve()}, promise: prom, opName, context})\n if (queue.length === 1) {\n this._startQueue(t)\n }\n })\n\n return Promise.all(waiters).then(() => {\n try {\n return exec()\n } finally {\n types.forEach(t => {\n const queue = this._queue[t]\n const sb = this._sourceBuffer[t]\n queue?.shift()\n if (!sb || !sb.updating) {\n this._startQueue(t)\n }\n })\n }\n })\n }\n\n _startQueue (type) {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op && !this._mseFullFlag[type]) {\n try {\n op.exec()\n } catch (error) {\n if (error && error.message && error.message.indexOf('SourceBuffer is full') >= 0) {\n this._mseFullFlag[type] = true\n this._logger.error('[MSE error], context,', op.context, ' ,name,', op.opName, ',err,SourceBuffer is full')\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_FULL, error))\n } else {\n this._logger.error(error)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error))\n queue.shift()\n this._startQueue(type)\n }\n }\n }\n }\n }\n\n _onSBUpdateEnd = (type) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (!(op?.opName === OP_NAME.UPDATE_DURATION)) {\n queue.shift()\n }\n if (op) {\n const costtime = nowTime() - this._opst\n this._logger.debug('UpdateEnd', op.opName, costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n this._startQueue(type)\n }\n }\n }\n\n _onSBUpdateError = (type, event) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op) {\n this._logger.error('UpdateError', type, op.opName, op.context)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_APPEND_BUFFER, event))\n // Do not shift from queue, 'updateend' event will fire next\n }\n }\n }\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (!MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n }\n\n setTimeoffset (type, timestampOffset, context) {\n return this._enqueueOp(type, () => {\n if (timestampOffset < 0) {\n timestampOffset += 0.001\n }\n this._sourceBuffer[type].timestampOffset = timestampOffset\n this._onSBUpdateEnd(type)\n }, 'setTimeoffset', context)\n }\n\n /** *重置decode时间戳 */\n abort (type, context) {\n if (!this.isOpened) {\n return Promise.resolve()\n }\n return this._enqueueOp(type, () => {\n this._sourceBuffer[type].abort()\n this._onSBUpdateEnd(type)\n }, 'abort', context)\n }\n}\n","export const LoaderType = {\n FETCH: 'fetch',\n XHR: 'xhr'\n}\n\nexport const ResponseType = {\n ARRAY_BUFFER: 'arraybuffer',\n TEXT: 'text',\n JSON: 'json'\n}\n","import { LoaderType } from './types'\n\nexport class NetError extends Error {\n retryCount = 0\n isTimeout = false\n loaderType = LoaderType.FETCH\n startTime = 0\n endTime = 0\n options = {}\n\n constructor (url, request, response, msg) {\n super(msg)\n this.url = url\n this.request = request\n this.response = response\n }\n}\n","const toString = Object.prototype.toString\n\nexport function isObject (a) {\n return a !== null && typeof a === 'object'\n}\n\nexport function isPlainObject (val) {\n if (toString.call(val) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(val)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isDate (a) {\n return toString.call(a) === '[object Date]'\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { isDate, isObject } from '../is'\n\nexport function getRangeValue (value) {\n if (!value || value[0] === null || value[0] === undefined || (value[0] === 0 && (value[1] === null || value[1] === undefined))) {\n return\n }\n let ret = 'bytes=' + value[0] + '-'\n if (value[1]) ret += value[1]\n return ret\n}\n\nfunction encode (val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\nexport function setUrlParams (url, params) {\n if (!url) return\n if (!params) return url\n let v\n const str = Object.keys(params).map(k => {\n v = params[k]\n if (v === null || v === undefined) return\n if (Array.isArray(v)) {\n k = k + '[]'\n } else {\n v = [v]\n }\n\n return v.map(x => {\n if (isDate(x)) {\n x = x.toISOString()\n } else if (isObject(x)) {\n x = JSON.stringify(x)\n }\n return `${encode(k)}=${encode(x)}`\n }).join('&')\n }).filter(Boolean).join('&')\n\n if (str) {\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex)\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + str\n }\n\n return url\n}\n\nexport function createResponse (\n data,\n done,\n response,\n contentLength,\n age,\n startTime,\n firstByteTime,\n index,\n range,\n vid,\n priOptions\n) {\n age = (age !== null && age !== undefined) ? parseFloat(age) : null\n contentLength = parseInt(contentLength || '0', 10)\n if (Number.isNaN(contentLength)) contentLength = 0\n const options = { range, vid, index, contentLength, age, startTime, firstByteTime, endTime: Date.now(), priOptions }\n return { data, done, options, response }\n}\n\nexport function calculateSpeed (byteLen, millisec) {\n return Math.round(byteLen * 8 * 1000 / millisec / 1024)\n}\n","export const EVENT = {\n ERROR: 'error',\n\n TTFB: 'core.ttfb',\n LOAD_START: 'core.loadstart',\n LOAD_RESPONSE_HEADERS: 'core.loadresponseheaders',\n LOAD_COMPLETE: 'core.loadcomplete',\n LOAD_RETRY: 'core.loadretry',\n SOURCEBUFFER_CREATED: 'core.sourcebuffercreated',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n METADATA_PARSED: 'core.metadataparsed',\n SEI: 'core.sei',\n SEI_IN_TIME: 'core.seiintime',\n FLV_SCRIPT_DATA: 'core.flvscriptdata',\n LOWDECODE: 'core.lowdecode',\n SWITCH_URL_SUCCESS: 'core.switchurlsuccess',\n SWITCH_URL_FAILED: 'core.switchurlfailed',\n SPEED: 'core.speed',\n HLS_MANIFEST_LOADED: 'core.hlsmanifestloaded',\n HLS_LEVEL_LOADED: 'core.hlslevelloaded',\n DEMUXED_TRACK:'core.demuxedtrack',\n\n STREAM_EXCEPTION: 'core.streamexception',\n LARGE_AV_FIRST_FRAME_GAP_DETECT: 'LARGE_AV_FIRST_FRAME_GAP_DETECT',\n LARGE_VIDEO_DTS_GAP_DETECT: 'LARGE_VIDEO_DTS_GAP_DETECT',\n LARGE_AUDIO_DTS_GAP_DETECT: 'LARGE_AUDIO_DTS_GAP_DETECT',\n AUDIO_GAP_DETECT: 'AUDIO_GAP_DETECT',\n AUDIO_OVERLAP_DETECT: 'AUDIO_OVERLAP_DETECT',\n MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT: 'MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT',\n REAL_TIME_SPEED: 'real_time_speed'\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nconst CACHESIZE = 2 * 1024 * 1024\nexport class FetchLoader extends EventEmitter {\n _abortController = null\n _timeoutTimer = null\n _reader = null\n _response = null\n _aborted = false\n _index = -1\n _range = null\n _receivedLength = 0\n _running = false\n _logger = null\n _vid = ''\n _onProcessMinLen = 0\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n constructor () {\n super()\n }\n\n load ({\n url,\n vid,\n timeout, // ms\n responseType,\n onProgress,\n index,\n onTimeout,\n onCancel,\n range,\n transformResponse,\n request,\n params,\n logger,\n\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n onProcessMinLen,\n priOptions\n }) {\n this._logger = logger\n this._aborted = false\n this._onProcessMinLen = onProcessMinLen\n this._onCancel = onCancel\n this._abortController = typeof AbortController !== 'undefined' && new AbortController()\n this._running = true\n this._index = index\n this._range = range || [0, 0]\n this._vid = vid || url\n this._priOptions = priOptions || {}\n const init = {\n method,\n headers,\n body,\n mode,\n credentials,\n cache,\n redirect,\n referrer,\n referrerPolicy,\n signal: this._abortController?.signal\n }\n\n let isTimeout = false\n clearTimeout(this._timeoutTimer)\n\n url = setUrlParams(url, params)\n\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n if (request) {\n headers = request.headers\n } else {\n headers = init.headers = init.headers || (Headers ? new Headers() : {})\n }\n if (Headers && headers instanceof Headers) {\n headers.append('Range', rangeValue)\n } else {\n headers.Range = rangeValue\n }\n }\n\n if (timeout) {\n this._timeoutTimer = setTimeout(() => {\n isTimeout = true\n this.cancel()\n if (onTimeout) {\n const error = new NetError(url, init, null, 'timeout')\n error.isTimeout = true\n onTimeout(error, {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }, timeout)\n }\n\n const startTime = Date.now()\n this._logger.debug('[fetch load start], index,', index, ',range,', range)\n return new Promise((resolve, reject) => {\n fetch(request || url, request ? undefined : init).then(async (response) => {\n clearTimeout(this._timeoutTimer)\n this._response = response\n if (this._aborted || !this._running) return\n if (transformResponse) {\n response = transformResponse(response, url) || response\n }\n if (!response.ok) {\n throw new NetError(url, init, response, 'bad network response')\n }\n\n const firstByteTime = Date.now()\n let data\n if (responseType === ResponseType.TEXT) {\n data = await response.text()\n this._running = false\n } else if (responseType === ResponseType.JSON) {\n data = await response.json()\n this._running = false\n } else {\n if (onProgress) {\n this.resolve = resolve\n this.reject = reject\n this._loadChunk(response, onProgress, startTime, firstByteTime)\n return\n } else {\n data = await response.arrayBuffer()\n data = new Uint8Array(data)\n this._running = false\n const costTime = Date.now() - startTime\n const speed = calculateSpeed(data.byteLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: data.byteLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n }\n }\n this._logger.debug('[fetch load end], index,', index, ',range,', range)\n resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n startTime,\n firstByteTime,\n index,\n range,\n this._vid,\n this._priOptions\n ))\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._running = false\n if (this._aborted && !isTimeout) return\n error = error instanceof NetError ? error : new NetError(url, init, null, error?.message)\n error.startTime = startTime\n error.endTime = Date.now()\n error.isTimeout = isTimeout\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n reject(error)\n })\n })\n }\n\n async cancel () {\n if (this._aborted) return\n this._aborted = true\n this._running = false\n if (this._response) {\n try {\n // await this._response.body.cancel()\n if (this._reader) {\n await this._reader.cancel()\n }\n } catch (error) {\n // ignore\n }\n this._response = this._reader = null\n }\n\n if (this._abortController) {\n try {\n this._abortController.abort()\n } catch (error) {\n // ignore\n }\n this._abortController = null\n }\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n }\n\n _loadChunk (response, onProgress, st, firstByteTime) {\n if (!response.body || !response.body.getReader) {\n this._running = false\n const err = new NetError(response.url, '', response, 'onProgress of bad response.body.getReader')\n err.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(err)\n return\n }\n if (this._onProcessMinLen > 0) {\n this._cache = new Uint8Array(CACHESIZE)\n this._writeIdx = 0\n }\n const reader = this._reader = response.body.getReader()\n let data\n\n let startTime\n let endTime\n const pump = async () => {\n startTime = Date.now()\n try {\n data = await reader.read()\n endTime = Date.now()\n } catch (e) {\n // request aborted\n endTime = Date.now()\n if (!this._aborted) {\n this._running = false\n e.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this.reject(e)\n }\n return\n }\n const startRange = this._range?.length > 0 ? this._range[0] : 0\n const startByte = startRange + this._receivedLength\n if (this._aborted) {\n this._running = false\n onProgress(undefined, false, { range: [startByte, startByte], vid: this._vid, index: this._index, startTime, endTime, st, firstByteTime, priOptions:this._priOptions }, response)\n return\n }\n const curLen = data.value ? data.value.byteLength : 0\n this._receivedLength += curLen\n this._logger.debug('【fetchLoader,onProgress call】,task,', this._range, ', start,', startByte, ', end,', startRange + this._receivedLength, ', done,', data.done)\n let retData\n if (this._onProcessMinLen > 0) {\n if (this._writeIdx + curLen >= this._onProcessMinLen || data.done) {\n retData = new Uint8Array(this._writeIdx + curLen)\n retData.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && retData.set(data.value, this._writeIdx)\n this._writeIdx = 0\n this._logger.debug('【fetchLoader,onProgress enough】,done,', data.done, ',len,', retData.byteLength, ', writeIdx,', this._writeIdx)\n } else {\n if (curLen > 0 && this._writeIdx + curLen < CACHESIZE) {\n this._cache.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n this._logger.debug('【fetchLoader,onProgress cache】,len,', curLen, ', writeIdx,', this._writeIdx)\n } else if (curLen > 0) {\n const temp = new Uint8Array(this._writeIdx + curLen + 2048)\n this._logger.debug('【fetchLoader,onProgress extra start】,size,', this._writeIdx + curLen + 2048, ', datalen,', curLen, ', writeIdx,', this._writeIdx)\n temp.set(this._cache.slice(0, this._writeIdx), 0)\n curLen > 0 && temp.set(data.value, this._writeIdx)\n this._writeIdx += curLen\n delete this._cache\n this._cache = temp\n this._logger.debug('【fetchLoader,onProgress extra end】,len,', curLen, ', writeIdx,', this._writeIdx)\n }\n }\n } else {\n retData = data.value\n }\n if (retData && retData.byteLength > 0 || data.done) {\n onProgress(retData, data.done, {\n range: [this._range[0] + this._receivedLength - (retData ? retData.byteLength : 0), this._range[0] + this._receivedLength],\n vid: this._vid,\n index: this._index,\n startTime,\n endTime,\n st,\n firstByteTime,\n priOptions:this._priOptions\n }, response)\n }\n if (!data.done) {\n pump()\n } else {\n const costTime = Date.now() - st\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed,len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: this._range, priOptions: this._priOptions})\n this._running = false\n this._logger.debug('[fetchLoader onProgress end],task,', this._range, ',done,', data.done)\n this.resolve(createResponse(\n data,\n true,\n response,\n response.headers.get('Content-Length'),\n response.headers.get('age'),\n st,\n firstByteTime,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n pump()\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n static isSupported () {\n return !!(typeof fetch !== 'undefined')\n }\n}\n","import { NetError } from './error'\nimport { createResponse, getRangeValue, setUrlParams, calculateSpeed } from './helper'\nimport { ResponseType } from './types'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\nexport class XhrLoader extends EventEmitter {\n\n _xhr = null\n _aborted = false\n _timeoutTimer = null\n _range = null\n _receivedLength = 0\n _url = null\n _onProgress = null\n _index = -1\n _headers = null\n // _chunkSizeKBList = [\n // 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n // ]\n\n _currentChunkSizeKB = 384\n _timeout = null\n _xhr = null\n _withCredentials = null\n _startTime = -1\n // _speedSampler = new SpeedSampler()\n _loadCompleteResolve = null\n _loadCompleteReject = null\n _runing = false\n _logger = false\n _vid = ''\n _responseType\n _credentials\n _method\n _transformResponse\n _firstRtt\n _onCancel = null\n _priOptions = null // 比较私有化的参数传递,回调时候透传\n\n\n constructor () {\n super()\n }\n\n load (req) {\n clearTimeout(this._timeoutTimer)\n this._logger = req.logger\n this._range = req.range\n this._onProgress = req.onProgress\n this._index = req.index\n this._headers = req.headers\n this._withCredentials = req.credentials === 'include' || req.credentials === 'same-origin'\n this._body = req.body || null\n req.method && (this._method = req.method)\n this._timeout = req.timeout || null\n this._runing = true\n this._vid = req.vid || req.url\n this._responseType = req.responseType\n this._firstRtt = -1\n this._onTimeout = req.onTimeout\n this._onCancel = req.onCancel\n this._request = req.request\n this._priOptions = req.priOptions || {}\n this._logger.debug('【xhrLoader task】, range', this._range)\n\n this._url = setUrlParams(req.url, req.params)\n\n const startTime = Date.now()\n return new Promise((resolve, reject) => {\n this._loadCompleteResolve = resolve\n this._loadCompleteReject = reject\n this._startLoad()\n }).catch((error) => {\n clearTimeout(this._timeoutTimer)\n this._runing = false\n if (this._aborted) return\n error = error instanceof NetError ? error : new NetError(this._url, this._request)\n error.startTime = startTime\n error.endTime = Date.now()\n error.options = {index: this._index, vid: this._vid, priOptions: this._priOptions}\n throw error\n })\n }\n\n _startLoad () {\n let range = null\n if (this._responseType === ResponseType.ARRAY_BUFFER && this._range && this._range.length > 1) {\n if (this._onProgress) {\n this._firstRtt = -1\n const chunkSize = this._currentChunkSizeKB * 1024\n const from = this._range[0] + this._receivedLength\n let to = this._range[1]\n if (chunkSize < this._range[1] - from) {\n to = from + chunkSize\n }\n range = [from, to]\n this._logger.debug('[xhr_loader->],tast :', this._range, ', SubRange, ', range)\n } else {\n range = this._range\n this._logger.debug('[xhr_loader->],tast :', this._range, ', allRange, ', range)\n }\n }\n this._internalOpen(range)\n }\n\n _internalOpen (range) {\n try {\n this._startTime = Date.now()\n const xhr = this._xhr = new XMLHttpRequest()\n xhr.open(this._method || 'GET', this._url, true)\n xhr.responseType = this._responseType\n this._timeout && (xhr.timeout = this._timeout)\n xhr.withCredentials = this._withCredentials\n xhr.onload = this._onLoad.bind(this)\n xhr.onreadystatechange = this._onReadyStatechange.bind(this)\n xhr.onerror = (errorEvent) => {\n this._running = false\n const error = new NetError(this._url, this._request, errorEvent?.currentTarget?.response, ('xhr.onerror.status:' + errorEvent?.currentTarget?.status + ',statusText,' + errorEvent?.currentTarget?.statusText))\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n xhr.ontimeout = (event) => {\n this.cancel()\n const error = new NetError(this._url, this._request, {status:408}, 'timeout')\n if (this._onTimeout) {\n error.isTimeout = true\n this._onTimeout(error,{index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(error)\n }\n const headers = this._headers || {}\n const rangeValue = getRangeValue(range)\n if (rangeValue) {\n headers.Range = rangeValue\n }\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n this._logger.debug('[xhr.send->] tast,', this._range, ',load sub range, ', range)\n xhr.send(this._body)\n } catch (e) {\n e.options = {index: this._index, range, vid: this._vid, priOptions: this._priOptions}\n this._loadCompleteReject(e)\n }\n }\n\n _onReadyStatechange (e) {\n const xhr = e.target\n if (xhr.readyState === 2) {\n this._firstRtt < 0 && (this._firstRtt = Date.now())\n }\n }\n\n _onLoad (e) {\n const status = e.target.status\n if (status < 200 || status > 299) {\n const error = new NetError(this._url, null, { ...e.target.response, status }, 'bad response,status:' + status)\n error.options = {index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions}\n return this._loadCompleteReject(error)\n }\n let data = null\n let done = false\n let byteStart\n const startRange = (this._range?.length > 0 ? this._range [0] : 0 )\n if (this._responseType === ResponseType.ARRAY_BUFFER) {\n const chunk = new Uint8Array(e.target.response)\n byteStart = startRange + this._receivedLength\n if (chunk && chunk.byteLength > 0) {\n this._receivedLength += chunk.byteLength\n const costTime = Date.now() - this._startTime\n const speed = calculateSpeed(this._receivedLength, costTime)\n this.emit(EVENT.REAL_TIME_SPEED, {speed, len: this._receivedLength, time: costTime, vid: this._vid, index: this._index, range: [byteStart, startRange + this._receivedLength], priOptions: this._priOptions})\n }\n data = chunk\n if (this._range?.length > 1 && this._range[1] && this._receivedLength < this._range[1] - this._range[0]) {\n done = false\n } else {\n done = true\n }\n this._logger.debug('[xhr load done->], tast :', this._range, ', start', byteStart, 'end ', startRange + this._receivedLength, ',dataLen,', (chunk ? chunk.byteLength : 0), ',receivedLength', this._receivedLength, ',index,', this._index, ', done,', done)\n } else {\n done = true\n data = e.target.response\n }\n let response = {\n ok: status >= 200 && status < 300,\n status,\n statusText: this._xhr.statusText,\n url: this._xhr.responseURL,\n headers: this._getHeaders(this._xhr),\n body: this._xhr.response\n }\n if (this._transformResponse) {\n response = this._transformResponse(response, this._url) || response\n }\n if (this._onProgress) {\n this._onProgress(data, done, { index: this._index, vid: this._vid, range: [byteStart, startRange + this._receivedLength], startTime: this._startTime, endTime: Date.now(), priOptions: this._priOptions }, response)\n }\n\n if (!done) {\n this._startLoad()\n } else {\n this._runing = false\n this._loadCompleteResolve && this._loadCompleteResolve(createResponse(\n this._onProgress ? null : data,\n done,\n response,\n response.headers['content-length'],\n response.headers.age,\n this._startTime,\n this._firstRtt,\n this._index,\n this._range,\n this._vid,\n this._priOptions\n ))\n }\n }\n\n cancel () {\n if (this._aborted) return\n this._aborted = true\n this._runing = false\n super.removeAllListeners()\n if (this._onCancel) {\n this._onCancel({index: this._index, range: this._range, vid: this._vid, priOptions: this._priOptions})\n }\n if (this._xhr) {\n return this._xhr.abort()\n }\n }\n\n static isSupported () {\n return typeof XMLHttpRequest !== 'undefined'\n }\n\n get receiveLen () {\n return this._receivedLength\n }\n\n get running () {\n return this._running\n }\n\n set running (status) {\n this._running = status\n }\n\n _getHeaders (xhr) {\n const headerLines = xhr.getAllResponseHeaders().trim().split('\\r\\n')\n const headers = {}\n for (const header of headerLines) {\n const parts = header.split(': ')\n headers[parts[0].toLowerCase()] = parts.slice(1).join(': ')\n }\n return headers\n }\n}\n","import { FetchLoader } from './fetch'\nimport { XhrLoader } from './xhr'\nimport { LoaderType } from './types'\nimport { createPublicPromise } from '../utils'\nimport { Logger } from '../logger'\n\nexport class Task {\n constructor (type, config) {\n this.promise = createPublicPromise()\n this.alive = !!config.onProgress\n !config.logger && (config.logger = new Logger('Loader'))\n this._loaderType = type\n this._loader = type === LoaderType.FETCH && typeof fetch !== 'undefined' ? new FetchLoader() : new XhrLoader()\n this._config = config\n this._retryCount = 0\n this._retryTimer = null\n this._canceled = false\n this._retryCheckFunc = config.retryCheckFunc\n this._logger = config.logger\n }\n\n exec () {\n const {\n retry,\n retryDelay,\n onRetryError,\n transformError,\n ...rest\n } = this._config\n\n const request = async () => {\n try {\n const response = await this._loader.load(rest)\n this.promise.resolve(response)\n } catch (e) {\n this._loader.running = false\n this._logger.debug('[task request catch err]', e)\n if (this._canceled) return\n\n e.loaderType = this._loaderType\n e.retryCount = this._retryCount\n\n let error = e\n if (transformError) {\n error = transformError(error) || error\n }\n\n if (onRetryError && this._retryCount > 0) onRetryError(error, this._retryCount, {index: rest.index, vid: rest.vid, range: rest.range, priOptions: rest.priOptions})\n\n this._retryCount++\n let isRetry = true\n if (this._retryCheckFunc) {\n isRetry = this._retryCheckFunc(e)\n }\n if (isRetry && this._retryCount <= retry) {\n clearTimeout(this._retryTimer)\n this._logger.debug('[task request setTimeout],retry', this._retryCount, ',retry range,', rest.range)\n this._retryTimer = setTimeout(request, retryDelay)\n return\n }\n this.promise.reject(error)\n }\n }\n\n request()\n return this.promise\n }\n\n async cancel () {\n clearTimeout(this._retryTimer)\n this._canceled = true\n this._loader.running = false\n return this._loader.cancel()\n }\n\n get running () {\n return this._loader && this._loader.running\n }\n\n get loader () {\n return this._loader\n }\n}\n","export function isMediaPlaying (media) {\n return media && !media.paused && !media.ended && media.playbackRate !== 0 && media.readyState !== 0\n}\n\nexport function getVideoPlaybackQuality (video) {\n if (!video) return {}\n if (typeof video.getVideoPlaybackQuality === 'function') {\n const info = video.getVideoPlaybackQuality()\n return {\n droppedVideoFrames: info.droppedVideoFrames || info.corruptedVideoFrames,\n totalVideoFrames: info.totalVideoFrames,\n creationTime: info.creationTime\n }\n }\n\n return {\n droppedVideoFrames: video.webkitDroppedFrameCount,\n totalVideoFrames: video.webkitDecodedFrameCount,\n creationTime: performance.now()\n }\n}\n\n/**\n * @param {Array.<Uint8Array>} arr\n * @returns\n */\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n if (arr.length < 2) return arr[0]\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport function sleep (t = 0) {\n return new Promise((resolve) => setTimeout(resolve, t))\n}\n","import { FetchLoader } from './fetch'\nimport { LoaderType, ResponseType } from './types'\nimport { getConfig } from './config'\nimport { Task } from './task'\nimport { isPlainObject } from '../is'\nimport { sleep } from '../streaming-helper'\nimport { EVENT } from '../event'\nimport EventEmitter from 'eventemitter3'\n\nexport {\n LoaderType,\n ResponseType\n}\n\nexport class NetLoader extends EventEmitter {\n type = LoaderType.FETCH\n\n _queue = []\n\n _alive = []\n\n _currentTask = null\n\n _finnalUrl = ''\n\n _config\n\n constructor (cfg) {\n super(cfg)\n this._config = getConfig(cfg)\n if (\n this._config.loaderType === LoaderType.XHR ||\n !FetchLoader.isSupported()\n ) {\n this.type = LoaderType.XHR\n }\n this.log = cfg.logger\n }\n\n isFetch () {\n return this.type === LoaderType.FETCH\n }\n\n static isFetchSupport () {\n return FetchLoader.isSupported()\n }\n\n load (url, config = {}) {\n if (typeof url === 'string' || !url) {\n config.url = url || config.url || this._config.url\n } else {\n config = url\n }\n\n config = Object.assign({}, this._config, config)\n\n if (config.params) config.params = Object.assign({}, config.params)\n if (config.headers && isPlainObject(config.headers)) config.headers = Object.assign({}, config.headers)\n if (config.body && isPlainObject(config.body)) config.body = Object.assign({}, config.body)\n\n if (config.transformRequest) {\n config = config.transformRequest(config) || config\n }\n config.logger = this.log\n\n const task = new Task(this.type, config)\n task.loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n this._queue.push(task)\n if (this._queue.length === 1 && (!this._currentTask || !this._currentTask.running)) {\n this._processTask()\n }\n\n return task.promise\n }\n\n async cancel () {\n const cancels = this._queue.map(t => t.cancel()).concat(this._alive.map(t => t.cancel()))\n if (this._currentTask) {\n cancels.push(this._currentTask.cancel())\n }\n this._queue = []\n this._alive = []\n await Promise.all(cancels)\n await sleep()\n }\n\n _processTask () {\n this._currentTask = this._queue.shift()\n if (!this._currentTask) return\n\n if (this._currentTask.alive) {\n this._alive.push(this._currentTask)\n }\n const req = this._currentTask.exec().catch(e => {})\n\n if (!(req && typeof req.finally === 'function')) return\n\n req.finally(() => {\n if (this._currentTask?.alive && this._alive?.length > 0) {\n this._alive = this._alive.filter(task => task && task !== this._currentTask)\n }\n this._processTask()\n })\n\n }\n}\n","import { LoaderType, ResponseType } from './types'\n\nexport function getConfig (cfg) {\n return {\n loaderType: LoaderType.FETCH,\n retry: 0,\n retryDelay: 0, // ms\n timeout: 0,\n request: null, // Request\n onTimeout: undefined,\n onProgress: undefined,\n onRetryError: undefined,\n transformRequest: undefined,\n transformResponse: undefined,\n transformError: undefined,\n responseType: ResponseType.TEXT,\n range: undefined,\n url: '',\n params: undefined,\n method: 'GET',\n headers: {},\n body: undefined,\n mode: undefined,\n credentials: undefined,\n cache: undefined,\n redirect: undefined,\n referrer: undefined,\n referrerPolicy: undefined,\n integrity: undefined,\n onProcessMinLen: 0,\n ...cfg\n }\n}\n","// import { Errors } from 'xgplayer'\nimport version from './version'\nimport { ERR, ERR_CODE } from 'xgplayer-streaming-shared'\nconst ERROR_CODES = {\n 416: ERR_CODE[ERR.NETWROK_RANGE_NOT_SATISFIABLE], // -499899\n 403: ERR_CODE[ERR.NETWORK_FORBIDDEN], // -499897,\n 404: ERR_CODE[ERR.NETWORK_NOTFOUND], // -499896,\n timeout: ERR_CODE[ERR.NETWORK_TIMEOUT], // -499895,\n '4xx': `${ERR_CODE[ERR.NETWORK] }4XX`,// -499894,\n '5xx': `${ERR_CODE[ERR.NETWORK] }5XX`,// -499893,\n networkError: ERR_CODE[ERR.NETWORK],// -499892,\n contentError: `${ERR_CODE[ERR.NETWORK] }contentError`,// -499891,\n mse: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_OTHER], // -499971,\n mseOpen: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_ADD_SB], // -499972,\n mseAppend: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_APPEND_BUFFER], // -499973,\n mse_hijack: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.MSE_HIJACK], // -499974,\n eme_hijack: ERR_CODE[ERR.MEDIA][ERR.SUB_TYPES.EME_HIJACK], // -499975,\n metaError: ERR_CODE[ERR.DEMUX][ERR.SUB_TYPES.MP4],// -499985,\n muxError: ERR_CODE[ERR.REMUX][ERR.SUB_TYPES.FMP4],// -499986,\n other: ERR_CODE[ERR.OTHER], // -499989,\n waitTimeout: ERR_CODE[ERR.RUNTIME][ERR.SUB_TYPES.BUFFERBREAK_ERROR],// -499791,\n waitTimeoutWithHidden : ERR_CODE[ERR.RUNTIME][ERR.SUB_TYPES.WAITING_TIMEOUT_ERROR],\n drm: ERR_CODE[ERR.DRM][ERR.SUB_TYPES.LICENSE],\n}\nconst ERROR_TYPES = ERR\n\n/**\n * 根据httpCode获取对应的错误码\n * @param { number} httpCode\n * @returns { number }\n */\nfunction getErrorCodeByHttpCode (httpCode) {\n return ERROR_CODES[httpCode] || httpCode\n}\nclass NetWorkError {\n constructor (type, httpCode, context) {\n let rangeStart = 0\n let rangeEnd = 0\n if (context && context.range && context.range.length > 1) {\n rangeStart = context.range[0]\n rangeEnd = context.range[1]\n }\n const _errCode = getErrorCodeByHttpCode(httpCode)\n return {\n errorCode: _errCode,\n errorType: type,\n // errorTypeCode: ERROR_TYPES[type],\n errorMessage: context?.httpText || context?.message,\n url: context?.url,\n httpCode,\n version,\n rangeStart,\n rangeEnd,\n ext: context,\n mediaError: {\n code: _errCode,\n message: context?.httpText || context?.message,\n },\n }\n }\n}\n\nclass ParserError {\n constructor (type, errorCode, ext) {\n return {\n errorCode,\n errorType: type,\n // errorTypeCode: ERROR_TYPES[type],\n version,\n errorMessage: ext.msg,\n ext,\n mediaError: {\n code: errorCode,\n message: ext.msg,\n },\n }\n }\n}\n\nexport {\n // Errors as default,\n NetWorkError,\n ParserError,\n ERROR_CODES,\n ERROR_TYPES,\n getErrorCodeByHttpCode,\n}\n","/* eslint-disable camelcase */\nconst util = {}\n\nutil.nowTime = function () {\n try {\n return parseInt(performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n\nutil.concatData = function (video, audio) {\n const resBuffers = []\n let bufferSize = 0\n if (video) {\n resBuffers.push(video)\n }\n if (audio) {\n resBuffers.push(audio)\n }\n resBuffers.every(item => {\n item && (bufferSize += item.byteLength)\n return true\n })\n const buffer = new Uint8Array(bufferSize)\n let offset = 0\n resBuffers.every(item => {\n if (item) {\n buffer.set(item, offset)\n offset += item.byteLength\n }\n return true\n })\n return buffer\n}\n\nexport default util\n","export class MediaError {\n constructor (msg, data) {\n this.type = 'file'\n this.message = msg\n this.data = data\n }\n}\n","export class Cache {\n _data = Object.create(null)\n\n set (id, data) {\n this._data[id] = data\n }\n\n get (id) {\n return this._data[id]\n }\n\n clear () {\n this._data = Object.create(null)\n }\n}\n","\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n\n return segments\n}\n\nexport function moovToMeta (moov) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n const segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n const segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n","import util from './index'\nconst isSupport = _isLocalStorageUsable()\nexport const openLog = checkOpenLog()\nexport const openTestLog = checkTestOpenLog()\nfunction probeSupport () {\n try {\n return (\n typeof localStorage !== 'undefined' &&\n 'setItem' in window.localStorage &&\n !!window.localStorage.setItem\n )\n } catch (e) {\n return false\n }\n}\n\nfunction checkIfLocalStorageThrows () {\n const localStorageTestKey = '_localstorage_support_test'\n\n try {\n window.localStorage.setItem(localStorageTestKey, true)\n window.localStorage.removeItem(localStorageTestKey)\n return false\n } catch (e) {\n return true\n }\n}\n\nexport function checkOpenLog () {\n if (isSupport) {\n try {\n return !!window.localStorage.getItem('playerlog')\n } catch (e) {\n return false\n }\n }\n return false\n}\n\nfunction _isLocalStorageUsable () {\n return probeSupport() && !checkIfLocalStorageThrows()\n}\n\nexport function log ( message, ...optionalParams) {\n openLog && console.log && console.log('[logger]', util.nowTime(), message, ...optionalParams)\n}\n\nexport function checkTestOpenLog () {\n if (isSupport) {\n try {\n return !!window.localStorage.getItem('playertestlog')\n } catch (e) {\n return false\n }\n }\n return false\n}\n\n\n","import EventEmitter from 'eventemitter3'\nimport TransmuxerWorker from './transmuxerworker?worker&inline'\n\nexport default class TransmuxerWorkerControl extends EventEmitter {\n constructor (options) {\n super()\n this.openlog = options.openLog\n this.codecType = options.codecType\n this.supportHevc = options.supportHevc\n this.worker = new TransmuxerWorker()\n this.worker.onmessage = (e) => {\n this.emit(e.data.method, e.data)\n }\n this.worker.postMessage({\n method: 'init',\n id: options.id || 0,\n args: { openlog: this.openlog, supportHevc: this.supportHevc, codecType: this.codecType}\n })\n }\n\n transmux (id, data, start, videoIdx, audioIdx, moov, useEME, kidValue, context) {\n const buffer = data.buffer\n this.worker && this.worker.postMessage({\n method: 'transmux',\n id,\n buffer,\n args: { start, videoIdx, audioIdx, moov, useEME, kidValue, context}\n },[buffer])\n }\n\n reset () {\n this.worker && this.worker.postMessage({\n method: 'reset'\n })\n }\n\n destroy () {\n this.worker && this.worker.terminate()\n }\n\n}\n","import EventEmitter from 'eventemitter3'\nimport Concat from 'concat-typed-array'\nimport { MP4Demuxer, FMP4Remuxer } from 'xgplayer-transmuxer'\nimport { ERROR_CODES, NetWorkError, ParserError, ERROR_TYPES } from './error'\nimport util from './util'\nimport MP4Loader from 'xgplayer-mp4-loader'\nimport { checkOpenLog, log } from './util/logger'\nimport TransmuxerWorkerControl from './worker'\n\nconst MP4_EVENTS = {\n ERROR: 'error',\n META_READY: 'metaReady',\n MOOV_REQ_PROGRESS: 'moov_request_Progress',\n UPDATE_LOAD_IDX: 'update_load_fragmentIdx'\n}\n\nclass MP4 extends EventEmitter {\n\n static getDefaultConfig () {\n return {\n segmentDuration: 5,\n onProcessMinLen: 1024, // 当fetch用onprocess渐进式回调数据时,当收到的数据量最少到配置值时才回调\n chunkSize: 800000, // [请求的数据块大小,对于长视频设置的较大些可以避免二次请求]\n retryCount: 3,\n retryDelay: 1000,\n timeout: 3000,\n enableWorker: false,\n playerId: '',\n vid: '',\n ext: {}\n }\n }\n /**\n * [constructor 构造函数]\n * @param { string } url [视频地址]\n * @param { Object } options\n * @param { Number } [chunk_size=Math.pow(25, 4)] [请求的数据块大小,对于长视频设置的较大些可以避免二次请求]\n * @param { any } preloader [预加载器]\n * @param { any } preloadTimeCache [预加载信息]\n */\n\n constructor (url, options) {\n super()\n this.url = url\n this.options = MP4.getDefaultConfig()\n // eslint-disable-next-line array-callback-return\n Object.keys(options).map(key => {\n options[key] !== undefined && options[key] !== null && (this.options[key] = options[key])\n })\n this.timeRange = []\n this.CHUNK_SIZE = this.options.chunkSize\n this.bufferLoaded = new Uint8Array(0)\n this.bufferLoadedPos = 0\n this.meta = null\n this.videoTrak = null\n this.audioTrak = null\n this.canDownload = true\n this._loadSuccessCallBack = null\n this._isPending = false // 当前流程是否进入错误处理挂起状态\n this._metaLoading = false // meta请求是否进行中\n this.MP4Loader = new MP4Loader({\n segmentDuration: this.options.segmentDuration,\n url: url,\n vid: options.vid,\n retry: this.options.retryCount,\n retryDelay: this.options.retryDelay,\n timeout: this.options.timeout,\n ...options.reqOptions,\n openLog: checkOpenLog()\n })\n this.MP4Demuxer = null\n this.FMP4Remuxer = null\n this._needInitSegment = true\n this._switchBitRate = false\n this.enableWorker = this.options.enableWorker\n if (this.enableWorker && typeof Worker !== 'undefined') {\n try {\n this.workerSequence = 0\n this.transmuxerWorkerControl = new TransmuxerWorkerControl({id: this.workerSequence, codecType : options.codecType, supportHevc: this.options.supportHevc, openLog: checkOpenLog()})\n this.transmuxerWorkerControl.on('transmux', (muxRes) => {\n const res = muxRes.args\n this.log('[transmuxerworker end] ,range, ',JSON.stringify(res.range), ',dataLen,',res.buffer.byteLength, res.context)\n this._loadSuccessCallBack && this._loadSuccessCallBack(res)\n })\n // this.eventListen = false\n } catch (error) {\n this.log('Error in worker:', error)\n this.enableWorker = false\n this.transmuxerWorkerControl = null\n }\n }\n if (!this.enableWorker) {\n this.MP4Demuxer = null\n this.FMP4Remuxer = null\n }\n this.seekTime = -1\n this.changeBitRateTime = -1\n }\n\n\n async changeBitRate (bitRateInfo) {\n this.url = bitRateInfo.url\n await this.MP4Loader.changeUrl(this.url, this.options.vid + Date.now(), this.CHUNK_SIZE)\n this._switchBitRate = true\n this.log('[switchBitrate] changeUrl, bitRate,',this.url)\n }\n\n log (message, ...optionalParams) {\n const { options } = this\n const newMessage = (options && options.vid) ? `[MP4] ${options.vid} ${message}` : `[MP4] ${message}`\n log(newMessage, ...optionalParams)\n }\n\n /**\n * 错误处理\n * @param { Error } error\n * @param { string } state\n */\n async errorHandler (error, state, context = {}) {\n const { response, message } = error\n const vid = this.options ? this.options.vid : ''\n let _error = null\n this._isPending = true\n if (response) {\n _error = new NetWorkError('network', response.status, {\n httpText: response.httpText,\n message: message,\n url: response.url\n })\n this.emit(MP4_EVENTS.ERROR, _error)\n } else {\n // 其他错误信息\n console.log(`[MP4] [${vid}] errorHandler,`, error)\n _error = error\n this.emit(MP4_EVENTS.ERROR, _error)\n }\n }\n\n\n async init () {\n if (this.url) await this.MP4Loader.changeUrl(this.url, this.options.vid + Date.now(), this.CHUNK_SIZE)\n await this.getMetaInfo()\n }\n\n getTimeRange () {\n const range = []\n let timeRange = null\n for (let i = 0; this.videoTrak && i < this.videoTrak.length; i++) {\n timeRange = {\n startTime: this.videoTrak[i].startTime,\n endTime: this.videoTrak[i].endTime,\n downloaded : false,\n isLoading : false\n }\n range.push(timeRange)\n }\n if (this.audioTrak && this.audioTrak.length > range.length) {\n for (let j = range.length; j < this.audioTrak.length; j++) {\n timeRange = {\n startTime: Math.max(this.audioTrak[j].startTime, timeRange ? timeRange.endTime : 0),\n endTime: Math.max(this.audioTrak[j].endTime, timeRange ? timeRange.endTime : 0),\n downloaded : false,\n isLoading : false\n }\n range.push(timeRange)\n }\n }\n return range\n }\n\n async getMetaInfo (isEmitMetaEvent = true) {\n try {\n this._metaLoading = true\n this.log('getMetaInfo start')\n this.bufferLoaded = new Uint8Array(0)\n let startPos = 0\n const onProgressHandle = async (data, state, options) => {\n this.log('getMetaInfo onProgressHandle, dataLen,', data ? data.byteLength : -1, ', state,',state, ',range,',JSON.stringify(options.range))\n if (data) {\n if (options.range[0] === startPos) {\n this.bufferLoaded = Concat(Uint8Array, this.bufferLoaded, new Uint8Array(data))\n startPos += data.byteLength\n }\n }\n if (options.meta && !this.meta) {\n const metaInfo = options.meta\n this.videoTrak = metaInfo.videoSegments\n this.audioTrak = metaInfo.audioSegments\n this.timeRange = this.getTimeRange()\n this.meta = {...metaInfo.meta, ext:{videoTrak: this.videoTrak, audioTrak: this.audioTrak}}\n metaInfo.bufferLoaded = this.bufferLoaded\n this.log('meta reach')\n if (isEmitMetaEvent) {\n this.emit(MP4_EVENTS.META_READY, this.meta)\n }\n }\n if (this.meta && state) {\n this.log('[getMetaInfo req end]')\n this._metaLoading = false\n }\n\n if (this.meta && (data || state)) {\n this.log('emit moov_req_progress')\n this.emit(MP4_EVENTS.MOOV_REQ_PROGRESS)\n }\n }\n await this.MP4Loader.loadMetaProcess(this.MP4Loader.cache, [0, this.CHUNK_SIZE], onProgressHandle)\n } catch (error) {\n console.error('[MP4] trigger errorHandler getMetaInfo',error?.message)\n this.loadError(error, 'getMetaInfo')\n }\n }\n\n getFragmentIdx (time) {\n let video\n let audio\n if (!this.videoTrak.length) {\n audio = this.audioTrak.find(x => x.startTime <= time && x.endTime > time)\n return audio ? audio.index : 0\n } else {\n video = this.videoTrak.find(x => x.startTime <= time && x.endTime > time)\n audio = this.audioTrak.find(x => x.startTime <= time && x.endTime > time)\n if (video && audio) {\n return Math.min(video.index, audio.index)\n } else if (video || audio){\n return video ? video.index : audio.index\n } else {\n let last = Number.MAX_VALUE\n if (this.videoTrak && this.videoTrak.length > 0) {\n last = this.videoTrak.length - 1\n }\n if (this.audioTrak && this.audioTrak.length > 0) {\n last = Math.min(this.audioTrak.length - 1, last)\n }\n return last\n }\n }\n }\n\n async _checkHasMeta () {\n this.log(' loadMeta start')\n this._metaLoading = true\n const metaInfo = await this.MP4Loader.loadMeta(this.MP4Loader.cache, Math.round(this.CHUNK_SIZE / 2))\n this._metaLoading = false\n this.videoTrak = metaInfo.videoSegments\n this.audioTrak = metaInfo.audioSegments\n this.meta = {...metaInfo.meta, ext:{videoTrak: this.videoTrak, audioTrak: this.audioTrak}}\n this.timeRange = this.getTimeRange()\n this.bufferLoaded = new Uint8Array(0)\n metaInfo.bufferLoaded = this.bufferLoaded\n return true\n }\n\n resetFragmentLoadState (fragIndex){\n for (let i = 0; i < this.timeRange.length; i++) {\n if (i < fragIndex) {\n this.timeRange[i].downloaded = true\n this.timeRange[i].isLoading = true\n } else {\n this.timeRange[i].downloaded = false\n this.timeRange[i].isLoading = false\n }\n }\n }\n\n getFragRange (fragIndex) {\n let videoSeg = null\n if (this.videoTrak) {\n videoSeg = fragIndex < this.videoTrak.length ? this.videoTrak[fragIndex] : this.videoTrak[this.videoTrak.length - 1]\n }\n let audioSeg = null\n if ( this.audioTrak) {\n audioSeg = fragIndex < this.audioTrak.length ? this.audioTrak[fragIndex] : this.audioTrak[this.audioTrak.length - 1]\n }\n let videodiff = 0, audiodiff = 0\n if (this.videoTrak && fragIndex >= this.videoTrak.length - 1) {\n videodiff = -1\n }\n if (this.audioTrak && fragIndex >= this.audioTrak.length - 1) {\n audiodiff = -1\n }\n const range = [\n Math.min(videoSeg?.range[0] || Infinity, audioSeg?.range[0] || Infinity),\n Math.max((videoSeg ?.range[1]) + videodiff || 0, (audioSeg?.range[1]) + audiodiff || 0)\n ]\n if (fragIndex < this.timeRange.length) {\n this.timeRange[fragIndex].range = range\n }\n return range\n }\n\n async load (fragIndex, successCallback) {\n this._loadSuccessCallBack = successCallback\n if (this._switchBitRate && !this._metaLoading) {\n this.log('[switchBitrate], switch bitRate start load, time,', fragIndex >= this.videoTrak.length ? this.audioTrak[fragIndex].startTime : this.videoTrak[fragIndex].startTime, ', fragIndex,',fragIndex)\n const metaReady = await this._checkHasMeta()\n if (this.changeBitRateTime > 0) {\n if (this.timeRange[fragIndex].startTime <= this.changeBitRateTime && this.changeBitRateTime < this.timeRange[fragIndex].endTime) {\n this.log('[switchBitrate], not need update load fragIndex', fragIndex,',stTime,',this.changeBitRateTime)\n } else {\n // 需要根据新码率的关键帧列表去找切换后码率的开始下载的fragIndex,修复不同码率关键帧不对齐导致卡播\n fragIndex = this.getFragmentIdx(this.changeBitRateTime)\n this.log('[switchBitrate], need update load fragIndex', fragIndex,',stTime,',this.changeBitRateTime, ',newBitrateTimeRange,',this.timeRange[fragIndex].startTime,'-',this.timeRange[fragIndex].endTime)\n this.emit(MP4_EVENTS.UPDATE_LOAD_IDX, fragIndex)\n }\n this.seekTime = this.changeBitRateTime\n this.changeBitRateTime = -1\n }\n this.resetFragmentLoadState(fragIndex)\n this.log('[switchBitrate], reset timerange state,', fragIndex)\n this._needInitSegment = true\n this.resetTansmuxer()\n if (metaReady) {\n this._switchBitRate = false\n }\n }\n\n if (this._switchBitRate && this._metaLoading) {\n return\n }\n const range = this.getFragRange(fragIndex)\n this.log('loadFragment,',fragIndex, ',range,',JSON.stringify(range))\n if (this.seekTime > 0) {\n const subRange = this.getSubRange(fragIndex, this.seekTime, range)\n this.loadFragment(fragIndex, subRange)\n this.seekTime = -1\n } else {\n this.loadFragment(fragIndex, range)\n }\n }\n\n /**\n * 查找离time最近的左边的关键帧的开始的range\n * @param { fragIndex }\n * @param { time }\n * @param { range }\n * @return {\n * range: array<number>,\n\n * }\n */\n\n getSubRange (fragIndex, time, range) {\n let videoStartRange = range[0]\n let audioStartRange = range[0]\n let i = 1\n let find = false\n this.log('>>>>>getSubRange time,',time, JSON.stringify(range))\n if (this.videoTrak) {\n const videoSeg = fragIndex < this.videoTrak.length ? this.videoTrak[fragIndex] : this.videoTrak[this.videoTrak.length - 1]\n const keyFrameList = videoSeg.frames.filter(getKeyFrameList)\n const videoTimescale = this.meta.videoTimescale\n let startTime = keyFrameList[0].startTime / videoTimescale\n this.log('>>>>>getSubRange video, startTime,',videoSeg.startTime,',endTime,',videoSeg.endTime)\n for (let j = 0; j < keyFrameList.length; j++) {\n this.log('>>>>>getSubRange video keyFrameList, startTime,',keyFrameList[j].startTime / videoTimescale,',range,',keyFrameList[j].offset)\n }\n for (; i < keyFrameList.length; i++) {\n const endTime = keyFrameList[i].startTime / videoTimescale\n if ( startTime <= time && time < endTime && range[0] < keyFrameList[i - 1].offset) {\n videoStartRange = keyFrameList[i - 1].offset\n find = true\n this.log('>>>>>getSubRange video end, startTime,',startTime, ',endTime,',endTime, ',startRange,',videoStartRange, ', keyFrameIndex,',i - 1)\n break\n }\n startTime = endTime\n }\n if (!find && startTime <= time && time < videoSeg.endTime + 0.8) {\n videoStartRange = keyFrameList[i - 1].offset\n this.log('>>>>>getSubRange video last, startTime,',startTime, ',endTime,',videoSeg.endTime, ',startRange,',videoStartRange)\n }\n }\n i = 1\n if (this.audioTrak) {\n const audioSeg = fragIndex < this.audioTrak.length ? this.audioTrak[fragIndex] : this.audioTrak[this.audioTrak.length - 1]\n const frameList = audioSeg.frames\n const audioTimescale = this.meta.audioTimescale\n i = Math.floor((time * audioTimescale - frameList[0].startTime) / audioSeg.frames[0].duration)\n i = Math.min(frameList.length - 1, i)\n let starttime = i > 0 ? frameList[i - 1].startTime / audioTimescale : frameList[0].startTime / audioTimescale\n for ( ; i >= 0 && i < frameList.length; ) {\n if (i > 0 && starttime > time) {\n i -= 1\n starttime = frameList[i].startTime / audioTimescale\n continue\n }\n const endtime = (frameList[i].startTime + frameList[i].duration) / audioTimescale\n if (starttime <= time && time < endtime && range[0] < frameList[i].offset) {\n audioStartRange = frameList[i].offset\n find = true\n this.log('>>>>>getSubRange audio end, startTime,', starttime, ',endTime,', endtime, ',startRange,', audioStartRange, ', index,', i)\n break\n }\n starttime = endtime\n i++\n }\n }\n const finalRange = [Math.min(audioStartRange, videoStartRange), range[1]]\n this.log('>>>>>getSubRange finalRange ', JSON.stringify(finalRange), ',oldRange,',JSON.stringify(range))\n return finalRange\n }\n\n\n onprogressDataArrive = async (data, state, options) => {\n if (data && data.byteLength > 0) {\n const curSegRange = this.timeRange[options.index].range\n if (curSegRange && options.range[1] >= curSegRange[1] && !state) {\n state = true\n }\n this.log('[mp4.loadFragment onprogressDataArrive ] receive data, >>> index,', options.index, ',range,', JSON.stringify(options.range), ', dataLen,', data.byteLength)\n this._mux(data, options.range[0], options.index, state)\n }\n if (state) {\n this.timeRange[options.index].downloaded = true\n this.bufferLoadedPos = -1\n this.log('[FragLoadDowned],fragmentIdx,',options.index,',rangeEnd,',options.range[1])\n }\n }\n\n _mux (buffer, start, fragIndex, state) {\n const videoIndexRange = this.getSamplesRange(fragIndex, 'video')\n const audioIndexRange = this.getSamplesRange(fragIndex, 'audio')\n const range = [start, start + buffer.byteLength]\n if (this.transmuxerWorkerControl) {\n const context = {\n range,\n state,\n fragIndex\n }\n this.log('[transmuxerworker start] ,range, ',JSON.stringify(range), ',dataLen,',buffer.byteLength, context)\n this.transmuxerWorkerControl.transmux(this.workerSequence, buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue, context)\n } else {\n try {\n if (!this.MP4Demuxer) {\n this.MP4Demuxer = new MP4Demuxer(this.videoTrak, this.audioTrak, null,{openLog: checkOpenLog()})\n }\n const demuxRet = this.MP4Demuxer.demuxPart(buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue)\n if (!this.FMP4Remuxer && (!this.checkCodecH265() || this.options.supportHevc)) {\n this.FMP4Remuxer = new FMP4Remuxer(this.MP4Demuxer.videoTrack, this.MP4Demuxer.audioTrack, {openLog: checkOpenLog()})\n }\n let res\n this.log('[mux], videoTimeRange,',demuxRet.videoTrack ? [demuxRet.videoTrack.startPts, demuxRet.videoTrack.endPts] : null, ',audioTimeRange,',demuxRet.audioTrack ? [demuxRet.audioTrack.startPts, demuxRet.audioTrack.endPts] : null)\n const startPts = Math.min(demuxRet.videoTrack.startPts, demuxRet.audioTrack.startPts)\n const endPts = Math.max(demuxRet.videoTrack.endPts, demuxRet.audioTrack.endPts)\n const timeRange = [startPts, endPts]\n if (this.FMP4Remuxer) {\n const remuxRes = this.FMP4Remuxer.remux(this._needInitSegment, {initMerge: true, range: range})\n remuxRes.initSegment && (this._needInitSegment = false)\n const data = util.concatData(remuxRes.audioSegment,remuxRes.videoSegment)\n res = {\n buffer: data,\n range,\n state,\n context: {\n range, fragIndex, timeRange\n },\n initSeg: remuxRes.initSegment\n }\n } else {\n res = {\n videoTrack: demuxRet.videoTrack,\n audioTrack: demuxRet.audioTrack,\n buffer: null,\n range,\n state,\n context: {\n range, fragIndex, timeRange\n }\n }\n }\n this._loadSuccessCallBack && this._loadSuccessCallBack(res)\n } catch (e) {\n console.error('mux err:', e)\n const err = new ParserError(ERROR_TYPES.remux, ERROR_CODES.muxError, {msg:JSON.stringify(e)})\n this.errorHandler(err, 'mux', {fragIndex, range: [start, start + buffer.byteLength]})\n }\n }\n }\n\n getSamplesRange (fragmentIdx, type) {\n const range = []\n switch (type) {\n case 'video':\n if (this.videoTrak && fragmentIdx < this.videoTrak.length ) {\n const frames = this.videoTrak[fragmentIdx].frames\n range.push(frames[0].index)\n range.push(frames[frames.length - 1].index)\n }\n break\n case 'audio':\n if (this.audioTrak && fragmentIdx < this.audioTrak.length ) {\n const frames = this.audioTrak[fragmentIdx].frames\n range.push(frames[0].index)\n range.push(frames[frames.length - 1].index)\n }\n break\n default:\n console.warn('[getSamplesRange] type ', type, ' is invalid')\n break\n }\n return range\n }\n\n async loadFragment (fragIndex, range) {\n if (this._isPending || (range.length > 0 && range[0] === 0 && range[1] === 0) || this.timeRange[fragIndex].isLoading) {\n return\n }\n this.log('[MP4.loadFragment] ,fragIndex,', fragIndex, ',range ', range, ',len ,', range[1] - range[0],', bufferLoaded_Len,', this.bufferLoaded.byteLength)\n if (range.length >= 2 && range[1] && range[1] > 0 && range[1] <= this.bufferLoaded.byteLength) {\n this.timeRange[fragIndex].isLoading = true\n const start = Math.max(range[0], this.bufferLoadedPos)\n const buffer = new Uint8Array(this.bufferLoaded.slice(start, range[1]))\n this.log('[mp4.loadFragment] has all data: ', start, range[1])\n this.timeRange[fragIndex].downloaded = true\n this.bufferLoadedPos = -1\n this._mux(buffer, start, fragIndex, true)\n } else {\n // // 对range进行缩减,已经有的数据不在重复下载\n if (range.length >= 2 && range[0] && range[0] <= this.bufferLoaded.byteLength) {\n if (!this.timeRange[fragIndex].isLoading) {\n const start = Math.max(range[0], this.bufferLoadedPos)\n const buffer = new Uint8Array(this.bufferLoaded.slice(start, range[1]))\n if (buffer.byteLength > 0) {\n this.bufferLoadedPos = start + buffer.byteLength\n this.log('[mp4.loadFragment] has part data: ', start, start + buffer.byteLength)\n this._mux(buffer, start, fragIndex, range[1] <= this.bufferLoadedPos)\n return\n }\n if (!this._metaLoading && !this.timeRange[fragIndex].isLoading) {\n this.log('[mp4.loadFragment] ready to load part data >>> ', this.bufferLoaded.byteLength, range[1])\n this.timeRange[fragIndex].isLoading = true\n await this.startLoad([this.bufferLoaded.byteLength, range[1]],fragIndex)\n }\n }\n } else {\n if ((!this._metaLoading || range[0] >= this.CHUNK_SIZE ) && !this.timeRange[fragIndex].isLoading) {\n this.timeRange[fragIndex].isLoading = true\n this.log('[mp4.loadFragment],ready to load all data ,segmentIdx, ', fragIndex, ',range >>> ', JSON.stringify(range))\n await this.startLoad(range,fragIndex)\n }\n }\n }\n }\n\n async startLoad (range, fragIndex){\n try {\n await this.MP4Loader.loadData(range, this.MP4Loader.cache, {\n index: fragIndex,\n onProgress: this.onprogressDataArrive,\n onProcessMinLen: this.options.onProcessMinLen\n })\n } catch (e) {\n console.error('[MP4] trigger errorHandler getMetaInfo', e?.message)\n this.loadError(e, 'loadFragment', {range, fragIndex})\n }\n }\n\n loadError (e, loadState, context) {\n !e.response && (e.response = {})\n if (e.isTimeout) {\n e.response.status = 'timeout'\n } else if (!e?.response?.status) {\n e.response.status = 'networkError'\n }\n this.errorHandler(e, loadState, context)\n }\n\n async cancelLoading () {\n await this.MP4Loader && this.MP4Loader.cancel()\n }\n\n update (url) {\n this.url = url\n }\n\n\n checkCodecH265 () {\n const isHvc = this.meta && (this.meta.videoCodec.indexOf('hvc1') > -1 ||\n this.meta.videoCodec.indexOf('hev1') > -1\n )\n return isHvc\n }\n\n destroy () {\n if (this.hasDestroyed) {\n return\n }\n this.resetTansmuxer()\n this.transmuxerWorkerControl && this.transmuxerWorkerControl.destroy()\n this._isPending = false\n this._metaLoading = false\n this.bufferLoadedPos = 0\n this.bufferLoaded = new Uint8Array(0)\n if (this.MP4Loader) {\n this.MP4Loader.cancel()\n this.MP4Loader.destroy()\n }\n this.hasDestroyed = true\n }\n\n resetTansmuxer () {\n this.MP4Demuxer && this.MP4Demuxer.reset()\n this.MP4Demuxer = null\n this.FMP4Remuxer && this.FMP4Remuxer.reset()\n this.FMP4Remuxer = null\n this.transmuxerWorkerControl && this.transmuxerWorkerControl.reset()\n }\n}\n\nexport {\n MP4 as default,\n MP4_EVENTS\n}\n\nfunction getKeyFrameList (frame){\n if (frame.keyframe) return frame\n}\n","export default class Timer {\n constructor (onTick) {\n this.onTick_ = onTick\n this.cancelPending_ = null\n }\n\n tickAfter (delayInSeconds, callback = null) {\n this.stop()\n let alive = true\n let timeoutId = null\n\n this.cancelPending_ = () => {\n window.clearTimeout(timeoutId)\n alive = false\n }\n\n const onTick = () => {\n if (alive) {\n this.onTick_()\n if (callback) {\n callback()\n }\n }\n }\n\n timeoutId = window.setTimeout(onTick, delayInSeconds * 1000)\n\n return this\n }\n\n tickEvery (seconds) {\n this.tickAfter(seconds, () => {\n this.tickEvery(seconds)\n })\n }\n\n stop () {\n if (this.cancelPending_) {\n this.cancelPending_()\n this.cancelPending_ = null\n }\n }\n}\n","export default class ProxyPromise {\n constructor () {\n let resolvePromise\n let rejectPromise\n\n const promise = new Promise((resolve, reject) => {\n resolvePromise = resolve\n rejectPromise = reject\n })\n\n const publicPromise = promise\n publicPromise.resolve = function (data) {\n resolvePromise(data)\n publicPromise.state = 'fulfilled'\n }\n publicPromise.reject = function (error) {\n rejectPromise(error)\n publicPromise.state = 'rejected'\n publicPromise.isBreak = error === 'DESTROYED'\n }\n publicPromise.state = 'pending'\n\n return publicPromise\n }\n\n /** @param {T=} value */\n // eslint-disable-next-line no-unused-vars\n resolve (value) {\n //\n }\n\n /** @param {*=} reason */\n // eslint-disable-next-line no-unused-vars\n reject (reason) {\n //\n }\n}\n","/* eslint-disable array-callback-return */\n// import 'core-js/modules/es7.string.pad-start';\nimport { BasePlugin, Events, Sniffer, Errors, Util } from 'xgplayer'\nimport MP4, { MP4_EVENTS } from './mp4'\nimport { ERROR_TYPES, ERROR_CODES } from './error'\nimport { MSE } from 'xgplayer-streaming-shared'\nimport util from './util'\nimport Timer from './util/timer'\nimport ProxyPromise from './util/proxy-promise'\nimport { log } from './util/logger'\n\nconst DESTROYED = 'DESTROYED'\n\nlet _playerPlayNext = null\n\nlet _playerStartInit = null\n\nlet _playerChangeDefinition = null\n\nlet _playerSwitchUrl = null\n\nexport default class Mp4Plugin extends BasePlugin {\n static get pluginName () {\n return 'mp4Plugin'\n }\n\n static get defaultConfig () {\n return {\n maxBufferLength: 40,\n minBufferLength: 5,\n disableBufferBreakCheck: false,\n waitingTimeOut: 15000,\n waitingInBufferTimeOut: 5000,\n waitJampBufferMaxCnt:3,\n tickInSeconds: 0.1,\n reqOptions: null,\n closeDowngrade: false\n }\n }\n\n static get version () {\n return __VERSION__\n }\n\n constructor (options) {\n super(options)\n this.mp4 = null\n this.mse = null\n this._waitAdjustTimeCnt = 0\n this._lastCheckTime = util.nowTime()\n this._removeBuffeEndTime = 0\n this._pendingPromises = []\n }\n\n afterCreate () {\n window.__mp4player = this\n try {\n BasePlugin.defineGetterOrSetter(this.player, {\n __url: {\n get: () => {\n try {\n return this.mse ? this.mse.url : this.config.url\n } catch (error) {\n return null\n }\n }\n }\n })\n } catch (e) {\n // NOOP\n }\n\n this._proxyPlayer()\n }\n\n attachEvents () {\n this.off(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.WAITING, this._onWaiting)\n this.off(Events.URL_CHANGE, this.switchURL)\n this.on(Events.URL_CHANGE, this.switchURL)\n }\n\n detachEvents () {\n this.off(Events.SEEKING, this._onSeeking)\n this.off(Events.WAITING, this._onWaiting)\n this.off(Events.URL_CHANGE, this.switchURL)\n }\n\n /**\n * 代理播放器的相关API\n * platNext、_startInit\n */\n _proxyPlayer () {\n if (typeof this.player.playNext === 'function') {\n _playerPlayNext = this.player.playNext\n }\n this.player.playNext = (...args) => {\n this.playNext(...args)\n }\n\n _playerStartInit = this.player._startInit\n _playerSwitchUrl = this.player.switchURL\n _playerChangeDefinition = this.player.changeDefinition\n\n this.player._startInit = this._playerStartInit.bind(this)\n this.player.switchURL = this.switchURL.bind(this)\n this.player.changeDefinition = this.changeDefinition.bind(this)\n\n this.player.removeHooks('replay', this._replayHook)\n\n this.player.removeHooks('retry', this._retryHook)\n }\n\n _playerStartInit (url) {\n const { config, playerConfig } = this\n if (config.supportHevc === undefined) {\n if (Sniffer?.isHevcSupported && Sniffer.isHevcSupported()) {\n config.supportHevc = true\n }\n }\n const ret = this.initMp4()\n this._initPromise = ret\n this._addPendingPromise(this._initPromise)\n if (this.mse && Util.typeOf(url) === 'String' && /^blob/.test(url) && url !== this.mse.url) {\n url = playerConfig.url\n }\n ret.then(() => {\n if (this.mse) {\n url = this.mse.url\n }\n this.attachEvents()\n this._startProgress()\n }).catch((e) => {\n const isBreak = this._initPromise ? this._initPromise.isBreak : false\n if (this.isDestroy || isBreak) {\n return\n }\n\n let err = e\n if (!err.errorCode) {\n err = new Errors(this.player, {\n errorType: ERROR_TYPES.RUNTIME, // 'runtime',\n // errorTypeCode: e?.errorTypeCode || ERROR_TYPES.runtime,\n errorCode: e?.errorCode || ERROR_CODES.other,\n vid: this.playerConfig.vid,\n errorMessage: e?.errorMessage || e?.message,\n mediaError: {\n code: e?.httpCode || ERROR_CODES.other,\n message: e?.errorMessage || e?.message,\n errorType:e?.errorType\n }\n })\n err.url = url\n }\n this.useVideoLoad = true\n this.player.vtype = 'MP4_1'\n this.player.emit('playCatch', this.player.vtype, err)\n }).finally(() => {\n if (!this._initPromise) {\n return\n }\n const { isBreak } = this._initPromise\n if (isBreak) {\n return\n }\n this._initPromise && this._removePendingPromise(this._initPromise)\n this._initPromise = null\n !this.isDestroy && !isBreak && _playerStartInit.call(this.player, url)\n })\n }\n\n initMp4 () {\n const { player } = this\n if (!player.config.vid) {\n player.config.vid = Date.now()\n }\n const _promise = new ProxyPromise()\n if (this.mp4) {\n this.mp4.off(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.off(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.off(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.destroy()\n this.mp4 = null\n }\n this.mp4 = new MP4(player.config.url, {...this.config, vid: player.config.vid})\n this.mp4.on(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.on(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.on(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.on(MP4_EVENTS.UPDATE_LOAD_IDX, (fragment) => {\n this._curLoadSegmentIdx = fragment\n this.log('[update curLoadSegmentIdx]',fragment)\n })\n this.mp4.init()\n return _promise\n }\n\n _onMp4DataCallBack = () => {\n if (this._isMseInit) {\n this._onTimeUpdate()\n }\n }\n\n _onMp4MetaReady = (meta) => {\n const { config } = this\n const isH265 = this.mp4.checkCodecH265()\n try {\n if (isH265 && !this.config.supportHevc) {\n const message = 'browser not support HEVC'\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.h265Error,\n errorMessage: message,\n vid: config.vid,\n mediaError: { code: ERROR_CODES.h265Error, message: message}\n })\n this._errorHandler(_err)\n } else {\n this._initMse(meta)\n this._initPromise.resolve()\n }\n } catch (e) {\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.mse,\n errorMessage: e?.message,\n vid: config.vid,\n mediaError: { code: ERROR_CODES.other1, message: e?.message}\n })\n this._errorHandler(_err)\n return\n }\n this._loadData()\n }\n\n setConfig (newConfig) {\n this.config = Object.assign(this.config, newConfig)\n }\n\n /**\n * 播放下一个\n * @param { any } newConfig 播放器\n */\n playNext (newConfig) {\n const { player } = this\n this._defInited = false\n\n player.resetState()\n player._currentTime = 0\n player._duration = 0\n player.isPlaying = false\n this._MSEError = false\n player.pause()\n this._reset()\n player.setConfig(newConfig)\n this.log('[Index] playNext', newConfig)\n player.play()\n // 下发播放下一个视频事件\n this.emit('playnext')\n }\n\n checkDegrade (error) {\n const { closeDowngrade } = this.config\n return !closeDowngrade || error.httpCode === 'networkError'\n }\n\n\n _onMp4Error = (err) => {\n const { vid } = this.playerConfig\n console.error('[Index] _onMp4Error', vid, err)\n this._errorHandler(err)\n }\n\n _errorHandler (err) {\n const {player, config} = this\n if (!player || this.useVideoLoad) {\n return\n }\n if (!err.url && this.mp4?.url) {\n err.url = this.mp4.url\n }\n const preState = player.paused\n console.error('final error !!!!, ', config.vid, err)\n this.player.vtype = 'MP4_2'\n this.player.emit('playCatch', this.player.vtype, err)\n const isDegrade = this.checkDegrade(err)\n if (isDegrade) {\n if (this._initPromise) {\n this._removeAndRejectInitPromise(err)\n } else {\n this._startDegradedPlayback(err, preState)\n }\n } else {\n this.player.pause()\n this._reset()\n const { currentTime } = player\n this.destroyMSE()\n player.currentTime = currentTime\n this.emit('error', err)\n }\n }\n\n /**\n * @@description 降级到video播放\n */\n _startDegradedPlayback (err, preState) {\n console.log('>>>_startDegradedPlayback')\n const { player, playerConfig } = this\n this.useVideoLoad = true\n this.destroyMSE()\n this._currentTime = player.currentTime\n this.__onmetadataHandle = () => {\n if (this._currentTime) {\n player.currentTime = this._currentTime\n }\n if (preState) {\n this.player.pause()\n } else {\n this.player.play()\n }\n player.media.removeEventListener('loadedmetadata', this.__onmetadataHandle)\n this.__onmetadataHandle = null\n }\n player.media.addEventListener('loadedmetadata', this.__onmetadataHandle)\n const _url = playerConfig.url\n player.media.src = _url\n }\n\n _addPendingPromise (p) {\n this._pendingPromises.push(p)\n }\n\n _removePendingPromise (p) {\n // this.log(LogCacheLevel.LOG,'removePendingPromise', p?.id)\n const idx = this._pendingPromises.indexOf(p)\n if (idx > -1) {\n this._pendingPromises.splice(idx, 1)\n }\n }\n\n _cancelPendingPromises () {\n if (this._pendingPromises.length > 0) {\n this._pendingPromises.forEach(promise => {\n promise.reject(DESTROYED)\n })\n }\n this._pendingPromises = []\n }\n\n _removeAndRejectInitPromise (error) {\n if (this._initPromise) {\n this._removePendingPromise(this._initPromise)\n this._initPromise.reject(error)\n }\n }\n\n /**\n * 初始化MSE信息\n * @param {*} mp4\n * @param {*} meta\n * @param {*} promise\n * @param {*} preloadTimeCache\n */\n async _initMse (meta) {\n if (this.mse) {\n await this.mse.unbindMedia()\n this.mse = null\n }\n const isHvc = this.mp4 && this.mp4.checkCodecH265()\n const hasVideo = !!meta.videoCodec\n const hasAudio = !!meta.audioCodec\n\n let codec\n if (hasVideo && hasAudio) {\n codec = isHvc ? 'video/mp4; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"' : 'video/mp4; codecs=\"avc1.64001E, mp4a.40.5\"'\n } else if (hasVideo) {\n codec = isHvc ? 'video/mp4; codecs=\"hev1.1.6.L93.B0\"' : 'video/mp4; codecs=\"avc1.64001E\"'\n } else {\n codec = 'video/mp4; codecs=\"mp4a.40.5\"'\n }\n\n const contentTypes = { [MSE.VIDEO]: { mimeType: 'video/mp4', codec } }\n this.mse = new MSE()\n const openPromise = this.mse.bindMedia(this.player.video)\n openPromise.then(()=> {\n const contentTypesLocal = Object.keys(contentTypes)\n try {\n for (let i = 0; i < contentTypesLocal.length; i++) {\n const type = contentTypesLocal[i]\n this.mse.createSource(type, contentTypes[type].codec)\n }\n } catch (e) {\n console.error('MSE error: ',e)\n this._errorHandler(e)\n }\n this._isMseInit = true\n this._onTimeUpdate()\n })\n }\n\n /**\n * 销毁MSE对象 // 在重用MSE的时候,如果降级到video原生播放,单实例复用时,需要重新绑定url.所以降级到video原生的需要删除mse对象\n */\n async destroyMSE() {\n await this.mse?.unbindMedia()\n this.mse = null\n }\n\n _onTimeUpdate () {\n const { mse, mp4, player, config } = this\n if (!mp4) return\n const timeRange = mp4.timeRange\n const range = player.getBufferedRange(player.buffered2)\n if ( mse && mp4 && mp4.canDownload) {\n if (util.nowTime() - this._lastCheckTime > 1000) {\n this._lastCheckTime = util.nowTime()\n this._loadStuckCheck()\n this._checkRemoveSourceBuffer(range, player.currentTime)\n }\n const cacheMaxTime = player.paused ? player.currentTime + config.minBufferLength : player.currentTime + config.maxBufferLength\n if (range[1] - cacheMaxTime < 0) {\n timeRange.every((item, idx) => {\n if (item.downloaded) {\n return true\n }\n // 为了避免切换码率卡顿,仍有一小段旧码率的数据buffer,在此处算有buffer不会下载,所以排除下切换码率\n if (!this._isChangeDefinition && item.endTime - item.startTime > 1 && this._isInBuffer(item)) {\n item.downloaded = true\n item.isLoading = true\n this.log(`onTimeUpdate, ${idx} download segment, has buffer`,item.startTime, item.endTime)\n return true\n }\n if (item.startTime - player.currentTime < config.maxBufferLength) {\n this._curLoadSegmentIdx = idx\n this.log('[onTimeUpdate],load index==>>>, ', idx, ',IdxTimeRange, ', item.startTime, '-', item.endTime, ',buffEnd, ', range[1], ',playCurTime,', player.currentTime, ', bufferLen,', range[1] - player.currentTime, ',bufferRangeList,',this.player.buffered2 ? this.player.buffered2.bufferedList : null)\n this._loadData()\n }\n })\n }\n this._isEnded()\n }\n this.checkRemoveOldBitrateBuffer()\n }\n\n checkRemoveOldBitrateBuffer () {\n const { mse, player } = this\n if ( mse && this._removeBuffeEndTime > 0 && player.currentTime > this._removeBuffeEndTime + 1) {\n this.log('remove old bitrate buffer',this._removeBuffeEndTime)\n mse.remove(MSE.VIDEO, 0, this._removeBuffeEndTime - 1)\n this._removeBuffeEndTime = 0\n }\n }\n\n // 如果item所在的区间有buffer,则不进行重复下载\n _isInBuffer (item, gap = 0) {\n let inbuffer = false\n const buffered = this.player.video.buffered\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i) - gap\n const end = buffered.end(i) + gap\n if (start <= item.startTime && item.endTime <= end) {\n inbuffer = true\n break\n }\n }\n return inbuffer\n }\n\n async _loadData () {\n if (!this.mp4 || !this._isMseInit) {\n this.log('loadData, player.mp4 null', this._isMseInit)\n return\n }\n try {\n await this.mp4.load(this._curLoadSegmentIdx, this._loadDataSuccess)\n } catch (e) {\n console.error('[Index] _loadData error', this.playerConfig.vid , e)\n }\n }\n\n _loadDataSuccess = (data) => {\n if (this.isDestroy || !this.mse) {\n return\n }\n this.log('[loadFragment] _loadDataSuccess ', JSON.stringify(data.context.range), ',dataLen,', data.buffer ? data.buffer.byteLength : 0, data.state)\n try {\n if (data.initSeg) {\n this._appendInitSeg(data.initSeg)\n if (!data.buffer || data.buffer.byteLength < 1) {\n this.log('no data, must load data')\n this._onTimeUpdate()\n }\n }\n const {buffer, state, context } = data\n // 为了修复,可能最后一小部分回来的数据,并没有借出来任何的帧数据,所以没有调用append,不能触发计算bufferEndTime\n if (this.mse && state && (!buffer || buffer.byteLength <= 0) && context.fragIndex === this.mp4.timeRange.length - 1) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('loaded ended !!!==>>>', JSON.stringify(context.range), ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n if (this.mse && state && context.fragIndex === this.mp4.timeRange.length - 1 && (!buffer || buffer.byteLength <= 0)) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('load ended !!!==>>>', this.playerConfig.vid, JSON.stringify(context.range), ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n if (buffer && this.mse) {\n if (buffer && buffer.byteLength > 0) {\n this._appendBuffer(MSE.VIDEO, buffer, context, state)\n }\n }\n } catch (e) {\n // TODO: 测试异常处理逻辑\n this.log('appendBuffer error', e)\n const _err = new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.mse,\n vid: this.player.config.vid,\n errorMessage: e.message,\n mediaError: {code: ERROR_CODES.mse, message: e.message}\n })\n this._errorHandler(_err)\n }\n if (data?.state) {\n this._onTimeUpdate()\n }\n }\n\n _onWaiting = () => {\n const { player, config } = this\n clearTimeout(this._waitInBufferTimer)\n this._waitInBufferTimer = null\n const curTime = player.currentTime\n // console.log('[>>>>onWaiting],currentTime, ',curTime, util.nowTime())\n const buffer = player.bufferedPoint\n if (buffer.end > 0 && buffer.end - player.currentTime >= 2) {\n if (this._waitAdjustTimeCnt < config.waitJampBufferMaxCnt) {\n this._waitInBufferTimer = setTimeout(() => {\n this._waitAdjustTimeCnt++\n player.currentTime = player.currentTime + 0.5\n this.log('[waitInBufferTimeout], waitAdjustTimeCnt,', this._waitAdjustTimeCnt, ',curtime,', curTime, util.nowTime())\n }, config.waitingInBufferTimeOut)\n }\n }\n }\n\n _onSeeking = async () => {\n const { player, mp4 } = this\n const curTime = player.currentTime\n this.log('[seekTime], curTime,',curTime, ',buffer,',player.buffered2.bufferedList)\n if (!mp4 || !mp4.meta) {\n return\n }\n this.endofstream = false\n mp4.bufferLoadedPos = -1\n mp4._metaLoading = false\n const buffered = player.bufferedPoint\n let hasBuffered = false\n let fragIndex = 0\n if (buffered.end > 0) {\n hasBuffered = true\n if (mp4.meta.duration - buffered.end < 0.5) {\n this._startProgress()\n this.log('[seeking in buffered range], buffer end,',buffered.end, ', duration,', mp4.meta.duration)\n return\n }\n fragIndex = mp4.getFragmentIdx(buffered.end)\n if (this._curLoadSegmentIdx === fragIndex) {\n this._startProgress()\n this.log('[seeking in buffered range], seek fragIndex is current load segmentIdx', fragIndex)\n return\n }\n mp4.seekTime = buffered.end\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('[seeking in buffered range], seekTime ', curTime,',bufferRange,',buffered.start, '-',buffered.end, ', fragIndex,', fragIndex)\n }\n if (!hasBuffered) {\n mp4.seekTime = curTime\n fragIndex = mp4.getFragmentIdx(curTime)\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('[seekTime out buffer range], curTime,', curTime, ', Idx,', fragIndex)\n const { mse } = this\n if (mse && mse.isFull()) {\n const bufferList = player.buffered2.bufferedList\n const bufferRange = bufferList[bufferList.length - 1]\n mse.clearOpQueues(MSE.VIDEO)\n this._checkRemoveSourceBuffer([bufferRange.start, bufferRange.end], player.currentTime , true, true)\n }\n }\n await mp4.cancelLoading()\n mp4.resetFragmentLoadState(fragIndex)\n this._curLoadSegmentIdx = fragIndex\n this._onTimeUpdate()\n this._startProgress()\n this._isEnded()\n }\n\n\n _appendInitSeg (initSeg) {\n // 校验是否是h265的视频\n if (!this.mp4 || !this.mse) return\n this.mse.append(MSE.VIDEO, initSeg, {vid: this.playerConfig.vid, range: null, dataLen: initSeg.byteLength, isinit: true}).then((data) => {\n this.log('appendInitSeg end ==>>>', data.context ? data.context : null, ', costTime,', data.costtime)\n })\n }\n\n\n _appendBuffer (codec, buffer, context = {},state) {\n const { mse, config } = this\n mse.append(codec, buffer, {vid:config.vid, fragIndex: context.fragIndex, range: context.range, dataLen: buffer.byteLength, state}).then((data) => {\n this.log('player appendBuffer end ==>>>', data.context ? data.context : null, ', costTime,', data.costtime, ', opt,', data.name,',bufferRange,',this.player.getBufferedRange())\n if (this.mse && context.state && context.fragIndex === this.mp4.timeRange.length - 1) {\n const buffered = this.player.buffered\n if (buffered && buffered.length > 0) {\n this.bufferEndTime = buffered.end(buffered.length - 1)\n }\n this._isEnded()\n this.log('loaded ended !!!==>>>', context.range, ', fragIndex,',context.fragIndex, ', bufferEndTime,',this.bufferEndTime, ',meta_duration,',this.mp4.meta.duration)\n }\n }).catch((error) => {\n console.log('[MSE error]', error)\n if (error && mse?.isFull()) {\n const bufferRange = this.player.getBufferedRange(this.player.buffered2)\n this._checkRemoveSourceBuffer(bufferRange, this.player.currentTime, true)\n }\n })\n }\n\n /**\n *清除sourcebuffer中播放过的数据\n */\n _checkRemoveSourceBuffer (sourceBufferRange, currentTime, mustClear) {\n const { mse, mp4, player } = this\n if (!mse || !mp4 || !player) return\n if (mustClear) {\n clearTimeout(this._removeBufferTimer)\n this._removeBufferTimer = null\n }\n if (!sourceBufferRange) sourceBufferRange = player.getBufferedRange(player.buffered2)\n if (!currentTime) currentTime = player.currentTime\n if (!mustClear && util.nowTime() - this._checkRemoveBufferLastTime <= this.config.removeBufferLen || this.endofstream) return\n this._checkRemoveBufferLastTime = util.nowTime()\n if (sourceBufferRange && sourceBufferRange[0] >= 0 && (currentTime - sourceBufferRange[0] > this.config.removeBufferLen || mse.isFull())) {\n const time = sourceBufferRange[1]\n const segmentIdx = mp4.getFragmentIdx(time)\n if (segmentIdx >= 0 && (mp4.timeRange[segmentIdx].startTime < currentTime)) {\n const clearEnd = Math.floor(Math.min(mp4.timeRange[segmentIdx].startTime, sourceBufferRange[1]))\n if (sourceBufferRange[0] < clearEnd) {\n this.log('[checkremoveSourceBuffer], remove range==>>>', sourceBufferRange[0], clearEnd)\n mse.remove(MSE.VIDEO, sourceBufferRange[0], clearEnd)\n } else if (mse.isFull() && !this._removeBufferTimer) {\n this._removeBufferTimer = setTimeout( () => {this._checkRemoveSourceBuffer( null, null, true)}, 10 * 1000)\n }\n }\n }\n }\n\n /**\n * 检查是否播放完成\n * @returns {Boolean}\n */\n _isEnded () {\n const { player, mp4 } = this\n const buffered = player.bufferedPoint\n const _end = buffered ? buffered.end : 0\n if (!this.endofstream && this.mse && mp4.meta.duration - player.currentTime < 0.5) {\n this.log('[check player isEnded],deal mse.endOfStream, currentTime,',player.currentTime, ', bufferend,',_end, ', duration,',mp4.meta.duration)\n this.endofstream = true\n this.mse.endOfStream()\n }\n if (mp4 && mp4.meta && mp4.meta.duration - player.currentTime < 0.5) {\n this._stopProgress()\n this.log('[check player isEnded],stopProgress and endOfStream,currentTime, ',player.currentTime, ', bufferend,',_end, ', duration,',mp4.meta.duration)\n this.mse && this.mse.endOfStream()\n return true\n }\n return false\n }\n\n\n /**\n * 切换播放源,用于同一个视频的不同播放源切换\n * @param { string || Array<{ src: string, [propName: string]: any; // 扩展定义}> } url\n */\n switchURL (definitionInfo) {\n this.changeDefinition(definitionInfo)\n }\n\n oldChangeDefinition (to, from) {\n const { config, player } = this\n this.log('[oldChangeDefinition],currentTime,',player.currentTime, ',from,',from, ',to,',to)\n const { currentTime, paused} = player\n if (!this._changeDefState) {\n this._changeDefState = {currentTime: currentTime, paused: paused}\n this.log('[oldChangeDefinition],currentTime,',player.currentTime, ',pause,',paused)\n }\n player.config.url = to.url\n config.focusUserDefinition = true\n player.currentTime = 0\n player.pause()\n this._reset()\n this._isMseInit = false\n this._changeDefineCanPlay && player.off('canplay', this._changeDefineCanPlay)\n this._changeDefineCanPlay = () => {\n this.changeDefineCanPlay(currentTime, paused, from, to)\n this._changeDefineCanPlay = null\n }\n player.once('canplay', this._changeDefineCanPlay)\n this.player.video.load()\n this.initMp4()\n }\n\n changeDefineCanPlay = (currentTime, paused, from, to) => {\n const { player } = this\n if (player.ended) {\n player.currentTime = 0\n return\n }\n this.log('[oldChangeDefinition],this._changeDefState,',this._changeDefState)\n player.currentTime = this._changeDefState ? this._changeDefState.currentTime : currentTime\n const isPause = this._changeDefState ? this._changeDefState.paused : paused\n if (isPause) {\n player.pause()\n } else {\n player.play()\n }\n this._changeDefState = null\n player.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n\n changeDefinition = async (to, from ) => {\n const { player, config, mp4 } = this\n\n if (!from) {\n from = player.curDefinition\n }\n this._MSEError = false\n\n if (config.witchBitRateWay) {\n this.oldChangeDefinition(to, from)\n return\n }\n\n player.emit(Events.DEFINITION_CHANGE, {from, to})\n const timeStart = player.currentTime\n let fragIndex = mp4.getFragmentIdx(timeStart)\n fragIndex < 0 && (fragIndex = this._curLoadSegmentIdx)\n this.log('switchBitrate:point,fragIndex,', fragIndex, ',startTime,', mp4.timeRange[fragIndex].startTime, ',currentTime,',player.currentTime)\n if (mp4) {\n this.mp4.changeBitRateTime = timeStart\n await mp4.cancelLoading()\n mp4._metaLoading && (mp4._metaLoading = false)\n }\n this._removeBuffeEndTime = mp4.timeRange[fragIndex].startTime\n this._isChangeDefinition = true\n const buffered = player.getBufferedRange(player.buffered)\n // 保留5s数据\n if (buffered[1] > 0 && buffered[1] - player.currentTime > 5) {\n this.mse.clearOpQueues(MSE.VIDEO)\n this.mse.remove(MSE.VIDEO, player.currentTime + 5, buffered[1])\n }\n this.log('switchBitrate: resetFragmentLoadState,', fragIndex)\n mp4.resetFragmentLoadState(fragIndex)\n this._curLoadSegmentIdx = fragIndex\n await this.mp4.changeBitRate(to)\n this._onTimeUpdate()\n player.emit('RESOLUTION_UPDATE', to)\n }\n\n /**\n * 卡顿超时检查启用\n * 卡顿超过一定时间则至直接降级处理\n */\n _loadStuckCheck () {\n const { config , player } = this\n if (!config.disableBufferBreakCheck) {\n if (player.currentTime - (this._lastCurrentTime || 0) > 0.1 || player.paused) {\n if (this._bufferBreakFlag === 1 || this._bufferBreakFlag === 2) {\n this.log('视频没有卡死,重置卡死标记')\n this._bufferBreakFlag = 0\n clearTimeout(this._bufferBreakTimer)\n this._bufferBreakFlag = null\n }\n } else {\n // 开启卡死计时\n if (!this._bufferBreakFlag) {\n this._bufferBreakFlag = 1\n this.log(`卡死计时开始! 持续${config.waitingTimeOut}毫秒则确认卡死`)\n this._bufferBreakTimer = setTimeout(() => {\n if (this.isDestroy) {\n return\n }\n if (this._bufferBreakFlag === 1) {\n this._bufferBreakFlag = 2\n this.log('确认卡死!!!')\n this._errorHandler(new Errors(this.player, {\n errorType: 'runtime',\n errorTypeCode: ERROR_TYPES.runtime,\n errorCode: ERROR_CODES.waitTimeout,\n errorMessage: 'wait_timeout',\n vid: config.vid\n }))\n }\n this._bufferBreakTimer = null\n }, config.waitingTimeOut)\n }\n }\n this._lastCurrentTime = player.currentTime\n }\n }\n\n get isDestroy () {\n return !this.player\n }\n\n\n _replayHook = () => {\n this.player?.play()\n return false\n }\n\n _retryHook = () => {\n this.beforePlayerInit()\n return false\n }\n\n _stopProgress () {\n this._hasStartProgress = false\n if (this._requestTimer) {\n this._requestTimer.stop()\n this._requestTimer = null\n }\n if (this._bufferBreakTimer) {\n clearTimeout(this._bufferBreakTimer)\n this._bufferBreakTimer = null\n this._bufferBreakFlag = undefined\n }\n }\n\n _startProgress () {\n if (this._hasStartProgress) {\n return\n }\n this._stopProgress()\n this._requestTimer = new Timer(() => {\n if (this._requestTimer) {\n this._onTimeUpdate()\n }\n })\n this._requestTimer.tickEvery(this.config.tickInSeconds)\n this._hasStartProgress = true\n }\n\n\n log (message, ...optionalParams) {\n const { playerConfig } = this\n const newMessage = (playerConfig && playerConfig.vid) ? `[Index]${playerConfig.vid} ${message}` : `[Index] ${message}`\n log(newMessage, ...optionalParams)\n }\n\n /**\n * 重置当前插件的状态\n */\n _reset () {\n this._isMseInit = false\n this.endofstream = false\n\n this._curLoadSegmentIdx = 0\n this._removeBuffeEndTime = 0\n this._isChangeDefinition = false\n this._stopProgress()\n if (this.mp4) {\n this.mp4.off(MP4_EVENTS.META_READY, this._onMp4MetaReady)\n this.mp4.off(MP4_EVENTS.ERROR, this._onMp4Error)\n this.mp4.off(MP4_EVENTS.MOOV_REQ_PROGRESS, this._onMp4DataCallBack)\n this.mp4.destroy()\n this.mp4 = null\n }\n if (this.mse) {\n this.mse.unbindMedia()\n this.mse = null\n }\n this._unloadVideo()\n }\n\n // 销毁移除当前video的src\n _unloadVideo () {\n const { player } = this\n try {\n this.log(`unloadVideo src ${player.video.src}`)\n if (player.video && player.video.src) {\n player.video.removeAttribute('src') // empty source\n player.video.load()\n }\n } catch (error) {\n this.log('unloadVideo error', error)\n }\n }\n\n\n destroy () {\n const { player } = this\n\n player.removeHooks('replay', this._replayHook)\n\n player.removeHooks('retry', this._retryHook)\n\n this.detachEvents()\n this._reset()\n\n this.player.playNext = _playerPlayNext\n this.player._startInit = _playerStartInit\n this.player.changeDefinition = _playerChangeDefinition\n this.player.switchURL = _playerSwitchUrl\n\n if (this._bufferBreakTimer) {\n clearInterval(this._bufferBreakTimer)\n }\n if (this._removeBufferTimer) {\n clearTimeout(this._removeBufferTimer)\n this._removeBufferTimer = null\n }\n if (this._waitInBufferTimer) {\n clearTimeout(this._waitInBufferTimer)\n this._waitInBufferTimer = null\n }\n }\n}\n"],"names":["has","Object","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","this","addListener","emitter","event","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","name","call","slice","getOwnPropertySymbols","concat","listeners","handlers","i","l","length","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","removeAllListeners","off","prefixed","module","exports","obj","defineProperty","value","default","ResultConstructor","totalLength","_len","arrays","_key","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","arr","err","return","result","offset","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_arr","set","lib","require$$0","__esModule","TrackType","VideoCodecType","AudioCodecType","WarningType","VideoTrack","_classCallCheck","_defineProperty","_createClass","key","sequenceNumber","width","height","fpsDen","fpsNum","duration","baseMediaDecodeTime","timescale","codec","present","pid","pps","sps","vps","sarRatio","samples","warnings","hvcC","get","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","config","codecType","isAudioEncryption","VideoSample","pts","dts","units","originPts","originDts","keyframe","flag","dependsOn","isNonSyncSample","AudioSample","data","sampleOffset","size","byteLength","Sample","FlvScriptSample","_Sample","_inherits","_super","_createSuper","SeiSample","_Sample2","_super2","MetadataTrack","flvScriptSamples","seiSamples","ExpGolomb","Error","_data","_bytesAvailable","_loadWord","_bitsAvailable","position","availableBytes","Math","min","workingBytes","Uint8Array","subarray","_word","DataView","buffer","getUint32","count","skipBytes","floor","bits","val","readBits","leadingZeroCount","skipLZ","skipBits","clz","readUEG","lastScale","nextScale","readEG","Logger","_prefix","_console","disabled","console","warn","UTF8","uint8array","out","input","String","fromCharCode","_checkContinuation","ucs4","_ucs2","join","start","checkLength","array","isBrowser","window","ua","navigator","userAgent","toLocaleLowerCase","isSafari","test","isFirefox","includes","isAndroid","concatUint8Array","filter","Boolean","reduce","p","c","prevLen","forEach","d","MAX_SIZE","pow","readBig16","readBig32","readBig64","getAvcCodec","codecs","h","toString","formatIV","iv","Number","toUpperCase","bufferToString","parse","a","isArray","parseInt","map","item","NALu","end","dataLen","unit","isHevc","type","uuid","payload","uint","emulationPreventionBytesPositions","newLength","newData","sourceIndex","shift","AVC","nalUnitSize","spsParsed","spsSize","spsArr","ppsArr","spsCount","parseSPS","removeEPB","ppsSize","ppsCount","eg","readUByte","profileIdc","profileCompatibility","levelIdc","skipUEG","chromaFormat","chromaFormatIdc","readBool","scalingListCount","skipScalingList","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","fixedFrame","fps","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","aspectRatioIdc","numUnitsInTick","timeScale","ceil","AAC","rate","FREQ","indexOf","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","remaining","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","HEVC","vpsParsed","nalUnitType","numNalus","nalSize","vpsArr","numOfArrays","parseVPS","vpsMaxSubLayersMinus1","numTemporalLayers","max","_parseProfileTierLevel","spsMaxSubLayersMinus1","temporalIdNested","separateColourPlaneFlag","confWinLeftOffset","confWinRightOffset","confWinTopOffset","confWinBottomOffset","conformanceWindowFlag","bitDepthLumaMinus8","bitDepthChromaMinus8","subWidthC","subHeightC","maxSubLayersMinus1","generalTierFlag","generalProfileSpace","generalProfileIdc","generalProfileCompatibilityFlags","generalConstraintIndicatorFlags","generalLevelIdc","subLayerProfilePresentFlag","subLayerLevelPresentFlag","bitsAvailable","MAX_SILENT_FRAME_DURATION","AUDIO_EXCETION_LOG_EMIT_DURATION","FlvFixer","videoTrack","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","_this","startTime","discontinuity","contiguous","round","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","s","time","_this2","refSampleDurationInt","x","first","last","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_this3","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","_getG711Duration","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","splice","track","sampleSize","getSilentFrame","AMF","ret","_parseValue","byteOffset","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","getInt16","Date","decode","getUint16","logger","FlvDemuxer","_fixer","_remainingData","_headerParsed","reset","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","_parseAac","_parseG711","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","packetType","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","MP4Parser","headerSize","subData","findBox","box","parseBox","trackId","baseDataOffsetPresent","flags","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","baseDataOffset","sampleDescriptionIndex","defaultSampleDuration","defaultSampleSize","defaultSampleFlags","reference_ID","version","earliest_presentation_time","first_offset","references","ref","tmp32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","mvhd","trak","pssh","nextTrackId","tkhd","mdia","mdhd","hdlr","minf","lang","language","handlerType","vmhd","smhd","stbl","graphicsmode","opcolor","balance","_ret$stsd$entries$","_ret$stsd$entries$$si","_ret$stsd$entries$$si2","stsd","stts","ctts","stsc","stsz","stco","co64","default_IV_size","entries","sinf","schi","tenc","stss","senc","sampleCount","InitializationVector","subsamples","subsampleCount","subsample","BytesOfClearData","BytesOfProtectedData","keyIds","systemId","toHex","numKeyIds","keyId","data_size","kid","system_id","entryCount","b","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","bodyStart","parseVisualSampleEntry","configurationVersion","AVCProfileIndication","AVCLevelIndication","lengthSizeMinusOne","spsLength","ppsLength","tmp","generalProfileCompatibility","avgFrameRate","_ret$vps","nalus","_ret$sps","_ret$pps","hSpacing","vSpacing","parseAudioSampleEntry","byteRead","tag","substring","padStart","firstChunk","samplesPerChunk","entrySizes","mfhd","traf","t","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","v","_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","ext","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","from","audioSenc","enca","_videoTrack$encv","_audioTrack$enca","vkid","akid","videoSampleCount","_audioTrack$samples","audioSampleCount","moof","_ref","defaultSize","defaultDuration","evaluateDefaultDuration","index","_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","_ref2","pos","chunkIndex","chunkRunIndex","offsetInChunk","lastSampleInChunk","lastChunkInRun","_ref3","dataReferenceIndex","frameCount","depth","isFullBox","readBig24","str","pad","charstr","maxlen","chars","r","hex","Concat","Buffer","self","_len2","_key2","UINT32_MAX","MP4","FTYPHEV1","FTYPAVC1","init","ftyp","content","types","mvex","_toConsumableArray","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","trex","sencLength","isVideo","videoSencLength","saiz","saio","trun1","sbgp","sdtp","extension","writeUint32","samplesLength","writeUint16","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","sampleLen","_samples$i","_samples$i$flag","_samples$i$cts","trackMP4","mdiaMP4","minfMP4","stblMP4","_ref5","_ref6","sampleDescIndex","samplesSizes","offsets","keyframeIndexes","_ref7","styp","durationCount","earliestTime","mdatSize","sidx","mdat","video","audio","dinf","dref","StblTable","enable","debug","_console2","log","_console3","_len3","_key3","_console4","_len4","_key4","error","_console5","group","table","groupEnd","FMP4Remuxer","options","browserVersions","exec","forceFirstIDR","openLog","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_loop","_offset","_sample","u","setUint32","Base","properties","assign","clone","constructor","_construct","WordArray","_Base","words","sigBytes","typedArray","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","typedArrayByteLength","_words","encoder","Hex","stringify","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","_get","_getPrototypeOf","nBytes","rcache","m_w","_m_w","_m_z","mask","random","_r","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Str","latin1StrLength","Utf8","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","_Base2","_minBufferSize","_nDataBytes","m_data","doFlush","processedWords","blockSize","dataWords","dataSigBytes","nBlocksReady","nWordsReady","nBytesReady","_doProcessBlock","Hasher","_BufferedBlockAlgorit","_super3","cfg","_doReset","messageUpdate","_append","_process","hash","_doFinalize","SubHasher","message","finalize","HMAC","_Base3","_super4","_this4","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","n","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","mode","modeCreator","createEncryptor","createDecryptor","_mode","__creator","processBlock","finalProcessedBlocks","CipherParams","_super8","cipherParams","_this5","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","t0","t1","t2","t3","AES","CTR","_CTR","counter","_counter","keystream","NoPadding","Crypto","decryptWordArray","raw","realKey","realIV","decryptWord","wordArrayToUint8Array","w","decoderAESCTRData","customDescryptHandler","sencBox","encodeWord","encodeBuffers","decodeBuffers","sampleData","tempBuffer","decrypted","clearDataBuf","protectedDataLen","decodeProtectedData","dec","MP4Demuxer","videoSegmnents","audioSegmnents","_this$_videoSamples","_videoSamples","_this$_audioSamples","_audioSamples","moovToTrack","moovToSamples","dataStart","videoIndexRange","audioIndexRange","parseSamples","startByte","frame","_lastRemainBuffer","_lastRemainBufferStartPos","tryCnt","temp","e","errorMessage","videoEndByte","audioEndByte","startPts","endPts","decoderData","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","nowTime","performance","now","getTime","buf","buffered","maxHole","buffers","bufLen","lastEnd","nextStart","nextEnd","prevStart","prevEnd","currentTime","behind","ERR","MANIFEST","NETWORK","NETWORK_TIMEOUT","NETWORK_FORBIDDEN","NETWORK_NOTFOUND","NETWROK_RANGE_NOT_SATISFIABLE","DEMUX","REMUX","MEDIA","DRM","OTHER","RUNTIME","SUB_TYPES","FLV","HLS","FMP4","MSE_ADD_SB","MSE_APPEND_BUFFER","MSE_OTHER","MSE_FULL","OPTION","DASH","LICENSE","CUSTOM_LICENSE","MSE_HIJACK","EME_HIJACK","SIDX","NO_CANPLAY_ERROR","BUFFERBREAK_ERROR","WAITING_TIMEOUT_ERROR","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_CODEC_NOT_SUPPORTED","MEDIA_ERR_URL_EMPTY","ERR_CODE","_ERR_CODE","StreamingError","_Error","subType","origin","msg","errorType","originError","errorCode","_error$response","isTimeout","url","response","httpCode","status","LogCacheLevel","DEBUG","LOG","WARN","ERROR","SIMPLE_TYPE","logCacheLevel","logMaxSize","logSize","logTextArray","logCache","text","_len5","logText","_key5","finLogText","logable","JSON","delLog","toLocaleString","reduceDepth","_typeof","objType","maxDepth","MediaSource","getMediaSource","OP_NAME","MSE","media","queue","_queue","op","opName","costtime","_opst","_logger","_startQueue","_config","getDefaultConfig","bindMedia","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","mediaSource","readyState","_url","_this$mediaSource2","_mseFullFlag","VIDEO","isReduceDuration","bufferEnd","keys","_sourceBuffer","k","_enqueueBlockingOp","isEnded","_openPromise","isOpened","ms","addEventListener","onOpen","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_context","prev","unbindMedia","revokeObjectURL","src","URL","createObjectURL","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this6","_context2","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this7","changeType","_enqueueOp","createSource","_this8","_this8$_sourceBuffer$","appendBuffer","endTime","_this9","isInsertHead","remove","_this10","_this11","allClear","_this$_queue$type","initOpque","isinit","reason","_this12","setLiveSeekableRange","_this13","then","_callee3","waiters","_this14","_context3","prom","all","updating","_x2","_x3","_x4","timestampOffset","_this15","_this16","abort","mime","isTypeSupported","LoaderType","ResponseType","NetError","request","_assertThisInitialized","isPlainObject","getPrototypeOf","getRangeValue","encode","replace","setUrlParams","params","toISOString","isObject","hashIndex","createResponse","contentLength","age","firstByteTime","range","vid","priOptions","parseFloat","isNaN","calculateSpeed","byteLen","millisec","EVENT","CACHESIZE","FetchLoader","_EventEmitter","_cancel","_this$_abortControlle","timeout","responseType","onProgress","onTimeout","onCancel","transformResponse","method","headers","body","credentials","cache","redirect","referrer","referrerPolicy","onProcessMinLen","_aborted","_onProcessMinLen","_onCancel","_abortController","AbortController","_running","_index","_range","_vid","_priOptions","signal","clearTimeout","_timeoutTimer","rangeValue","Headers","append","Range","setTimeout","cancel","fetch","costTime","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","catch","_error","_reader","st","getReader","_cache","_writeIdx","reader","pump","_this3$_range","startRange","curLen","retData","read","_receivedLength","XhrLoader","req","_onProgress","_headers","_withCredentials","_body","_method","_timeout","_runing","_responseType","_firstRtt","_onTimeout","_request","_loadCompleteResolve","_loadCompleteReject","_startLoad","chunkSize","_currentChunkSizeKB","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","_createForOfIteratorHelper","getAllResponseHeaders","trim","split","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","sleep","NetLoader","transformRequest","integrity","getConfig","isSupported","task","loader","_currentTask","_processTask","cancels","_alive","finally","_this3$_currentTask","_this3$_alive","ERROR_CODES","networkError","contentError","mse","mseAppend","mse_hijack","eme_hijack","metaError","muxError","other","waitTimeout","waitTimeoutWithHidden","drm","ERROR_TYPES","NetWorkError","rangeStart","rangeEnd","_errCode","getErrorCodeByHttpCode","httpText","mediaError","code","ParserError","util","concatData","resBuffers","bufferSize","every","MediaError","Cache","moovToSegments","segmentDurations","videoSegments","audioSegments","_videoTrack$mdia","_videoTrack$mdia$minf","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia","_audioTrack$mdia$minf","_audioTrack$mdia$mdhd","segDuration","gop","gopDuration","lastFrame","segments","segFrames","adjust","pushSegment","_segments","_segFrames","curTime","moovToMeta","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia2$min2","_videoTrack$mdia3","_videoTrack$mdia3$mdh","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia2$min2","_e1$esds","_audioTrack$mdia3","_audioTrack$mdia3$mdh","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee4","moovStart","OnProgressHandle","_context4","state","_moovStart","parsedMoov","loadData","loadMetaProcess","_x7","_x8","_x9","_x5","_x6","_callee5","responses","_context5","_x10","_x11","_x12","segmentIndex","_callee6","changeCurrent","_this$getSegmentByTim","_args6","_context6","getSegmentByTime","_loadSegment","loadSegmentByTime","_x13","_x14","_callee7","_args7","_context7","_x15","_callee9","_this$getSegmentByTim2","videos","audios","_context9","_callee8","_context8","_x17","_x16","_callee10","_args10","_context10","downloadInfo","_callee11","_context11","clear","_callee12","_context12","finish","_x18","_x19","_x20","_x21","_x22","_callee13","cacheKey","_context13","_getCacheKey","fromCache","_x23","_x24","_x25","isSupport","localStorage","setItem","probeSupport","localStorageTestKey","removeItem","checkIfLocalStorageThrows","checkOpenLog","getItem","optionalParams","checkTestOpenLog","TransmuxerWorkerControl","openlog","supportHevc","worker","TransmuxerWorker","onmessage","postMessage","videoIdx","audioIdx","terminate","MP4_EVENTS","_cancelLoading","_loadFragment","_load","_checkHasMeta2","_getMetaInfo","_init","_errorHandler","_changeBitRate","curSegRange","timeRange","_mux","downloaded","bufferLoadedPos","CHUNK_SIZE","bufferLoaded","videoTrak","audioTrak","canDownload","_loadSuccessCallBack","_isPending","_metaLoading","reqOptions","_needInitSegment","_switchBitRate","enableWorker","Worker","workerSequence","transmuxerWorkerControl","muxRes","seekTime","changeBitRateTime","bitRateInfo","changeUrl","newMessage","errorHandler","getMetaInfo","isLoading","isEmitMetaEvent","startPos","onProgressHandle","metaInfo","getTimeRange","loadError","MAX_VALUE","fragIndex","_videoSeg","_audioSeg","_videoSeg2","_audioSeg2","videoSeg","audioSeg","videodiff","audiodiff","successCallback","metaReady","subRange","_checkHasMeta","getFragmentIdx","resetFragmentLoadState","resetTansmuxer","getFragRange","getSubRange","loadFragment","videoStartRange","audioStartRange","keyFrameList","getKeyFrameList","frameList","starttime","endtime","finalRange","getSamplesRange","transmux","demuxRet","demuxPart","checkCodecH265","remuxRes","remux","initSeg","fragmentIdx","_start","_buffer","startLoad","onprogressDataArrive","loadState","_e$response","isHvc","hasDestroyed","destroy","playerId","Timer","onTick","onTick_","cancelPending_","delayInSeconds","callback","timeoutId","seconds","tickAfter","tickEvery","ProxyPromise","resolvePromise","rejectPromise","publicPromise","isBreak","_playerPlayNext","_playerStartInit","_playerChangeDefinition","_playerSwitchUrl","Mp4Plugin","_BasePlugin","_loadData2","_destroyMSE","_initMse2","_isMseInit","_onTimeUpdate","isH265","mp4","_err","Errors","player","errorTypeCode","runtime","h265Error","_initMse","_initPromise","other1","playerConfig","isDestroy","_appendInitSeg","bufferEndTime","_isEnded","_appendBuffer","_assertThisInitialize2","_waitInBufferTimer","bufferedPoint","_waitAdjustTimeCnt","waitJampBufferMaxCnt","waitingInBufferTimeOut","_assertThisInitialize3","hasBuffered","_assertThisInitialize4","bufferList","bufferRange","buffered2","bufferedList","endofstream","_startProgress","_curLoadSegmentIdx","isFull","clearOpQueues","_checkRemoveSourceBuffer","cancelLoading","paused","ended","_changeDefState","pause","play","AFTER_DEFINITION_CHANGE","_assertThisInitialize6","timeStart","curDefinition","_MSEError","witchBitRateWay","oldChangeDefinition","DEFINITION_CHANGE","_removeBuffeEndTime","_isChangeDefinition","getBufferedRange","changeBitRate","_this$player","beforePlayerInit","_lastCheckTime","_pendingPromises","__mp4player","defineGetterOrSetter","__url","_proxyPlayer","SEEKING","_onSeeking","WAITING","_onWaiting","URL_CHANGE","switchURL","playNext","_startInit","changeDefinition","removeHooks","_replayHook","_retryHook","Sniffer","isHevcSupported","initMp4","_addPendingPromise","Util","typeOf","attachEvents","useVideoLoad","vtype","_removePendingPromise","_promise","_onMp4MetaReady","_onMp4Error","_onMp4DataCallBack","fragment","newConfig","_defInited","resetState","_currentTime","_duration","isPlaying","setConfig","closeDowngrade","_this$mp","preState","checkDegrade","_removeAndRejectInitPromise","_startDegradedPlayback","destroyMSE","__onmetadataHandle","idx","contentTypes","contentTypesLocal","_this$mse","_loadStuckCheck","cacheMaxTime","minBufferLength","maxBufferLength","_isInBuffer","checkRemoveOldBitrateBuffer","gap","inbuffer","_loadDataSuccess","sourceBufferRange","mustClear","_removeBufferTimer","_checkRemoveBufferLastTime","removeBufferLen","segmentIdx","clearEnd","_end","_stopProgress","definitionInfo","focusUserDefinition","_changeDefineCanPlay","changeDefineCanPlay","disableBufferBreakCheck","_lastCurrentTime","_bufferBreakFlag","_bufferBreakTimer","waitingTimeOut","_hasStartProgress","_requestTimer","tickInSeconds","_unloadVideo","detachEvents","clearInterval","BasePlugin"],"mappings":"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"}