xgplayer-mp4 3.0.21 → 3.0.22-rc.1
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.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/mp4Plugin.js +1 -1
- package/es/version.js +1 -1
- package/es/worker/transmuxerworker.js +1 -1
- package/package.json +5 -5
package/dist/index.min.js.map
CHANGED
|
@@ -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/aac.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/codec/opus.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/soundFormat.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/utils/byte-reader.ts","../../xgplayer-transmuxer/src/utils/bit-reader.ts","../../xgplayer-transmuxer/src/mp4/mp4-parser.js","../../xgplayer-transmuxer/src/mp4/fmp4-demuxer.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../xgplayer-transmuxer/src/mp4/fmp4-remuxer.js","../../../node_modules/crypto-es/lib/core.js","../../../node_modules/crypto-es/lib/enc-base64.js","../../../node_modules/crypto-es/lib/evpkdf.js","../../../node_modules/crypto-es/lib/cipher-core.js","../../../node_modules/crypto-es/lib/aes.js","../../../node_modules/crypto-es/lib/mode-ctr.js","../../../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/buffer.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/utils.js","../../xgplayer-streaming-shared/src/mse.js","../../xgplayer-streaming-shared/src/net/types.js","../../xgplayer-streaming-shared/src/net/error.js","../../xgplayer-streaming-shared/src/is.js","../../xgplayer-streaming-shared/src/net/helper.js","../../xgplayer-streaming-shared/src/event.js","../../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 AV1: 'av1',\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m',\n OPUS: 'opus',\n MP3: 'mp3'\n}\n\n/** @enum {string} */\nexport const WarningType = {\n LARGE_AV_SHIFT: 'LARGE_AV_SHIFT',\n LARGE_VIDEO_GAP: 'LARGE_VIDEO_GAP',\n LARGE_VIDEO_GAP_BETWEEN_CHUNK: 'LARGE_VIDEO_GAP_BETWEEN_CHUNK',\n LARGE_AUDIO_GAP: 'LARGE_AUDIO_GAP',\n AUDIO_FILLED: 'AUDIO_FILLED',\n AUDIO_DROPPED: 'AUDIO_DROPPED'\n}\n","import { TrackType, VideoCodecType } from './types'\n\nexport class VideoTrack {\n id = 1\n\n /** @readonly */\n type = TrackType.VIDEO\n\n codecType = VideoCodecType.AVC\n\n pid = -1 // ts use\n\n /** @type {Uint8Array | Object} */\n hvcC = undefined\n\n codec = ''\n\n timescale = 0\n\n formatTimescale = 0\n\n sequenceNumber = 0\n\n baseMediaDecodeTime = 0\n\n baseDts = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./video-sample').VideoSample[]} */\n samples = []\n\n /** @type {Uint8Array[]} */\n pps = []\n\n /** @type {Uint8Array[]} */\n sps = []\n\n /** @type {Uint8Array[]} */\n vps = []\n\n fpsNum = 0\n\n fpsDen = 0\n\n /** @type {[number, number]} */\n sarRatio = [] // [hSpacing, vSpacing]\n\n width = 0\n\n height = 0\n\n nalUnitSize = 4\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n isVideo = true\n\n lastKeyFrameDts = 0\n\n kid = null\n\n pssh = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber =\n this.width =\n this.height =\n this.fpsDen =\n this.fpsNum =\n this.duration =\n this.baseMediaDecodeTime =\n this.timescale = 0\n this.codec = ''\n this.present = false\n this.pid = -1\n this.pps = []\n this.sps = []\n this.vps = []\n this.sarRatio = []\n this.samples = []\n this.warnings = []\n this.hvcC = null\n }\n\n get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n if (/av01/.test(this.codec)) {\n return true\n }\n return !!(this.pps.length && this.sps.length && this.codec)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isVideoEncryption\n }\n}\n","import { TrackType, AudioCodecType } from './types'\n\nexport class AudioTrack {\n id = 2\n\n /** @readonly */\n type = TrackType.AUDIO\n\n codecType = AudioCodecType.AAC\n\n pid = -1\n\n codec = ''\n\n container = ''\n\n sequenceNumber = 0\n\n sampleDuration = 0\n\n timescale = 0\n\n formatTimescale = 0\n\n baseMediaDecodeTime = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./audio-sample').AudioSample[]} */\n samples = []\n\n baseDts = 0\n\n sampleSize = 16\n\n sampleRate = 0\n\n channelCount = 0\n\n objectType = 0\n\n sampleRateIndex = 0\n\n /** @type {number[]} */\n config = []\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n kid = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber = 0\n this.timescale = 0\n this.sampleDuration = 0\n this.sampleRate = 0\n this.channelCount = 0\n this.baseMediaDecodeTime = 0\n this.present = false\n this.pid = -1\n this.codec = ''\n this.samples = []\n this.config = []\n this.warnings = []\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(\n this.sampleRate &&\n this.channelCount &&\n (this.codec || this.container) &&\n (this.codecType === AudioCodecType.AAC ||\n this.codecType === AudioCodecType.G711PCMA ||\n this.codecType === AudioCodecType.G711PCMU ||\n this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3)\n )\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption () {\n return this.isAudioEncryption\n }\n\n get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n}\n","/**\n * @typedef {Object} VideoFlag\n * @property {number} [isLeading=0]\n * @property {number} [dependsOn=1]\n * @property {number} [isDependedOn=0]\n * @property {number} [hasRedundancy=0]\n * @property {number} [paddingValue=0]\n * @property {number} [degradationPriority=0]\n * @property {number} [isNonSyncSample=1]\n */\n\nexport class VideoSample {\n /** @type {VideoFlag} */\n flag = {}\n\n keyframe = false\n\n gopId = 0\n\n duration = 0\n\n size = 0\n\n units = []\n\n chromaFormat = 420\n\n // sampleOffset = 0\n\n /**\n * @param {number} pts\n * @param {number} dts\n * @param {Uint8Array[]} [units]\n */\n constructor (pts, dts, units) {\n this.originPts = this.pts = pts\n this.originDts = this.dts = dts\n if (units) this.units = units\n }\n\n /**\n * @returns {number}\n */\n get cts () {\n return this.pts - this.dts\n }\n\n setToKeyframe () {\n this.keyframe = true\n this.flag.dependsOn = 2\n this.flag.isNonSyncSample = 0\n }\n}\n","export class AudioSample {\n duration = 1024\n\n flag = { dependsOn: 2, isNonSyncSample: 0 }\n keyframe = true\n\n /**\n * @param {number} pts\n * @param {Uint8Array} data\n * @param {number} [duration=1024]\n */\n constructor (pts, data, duration, sampleOffset) {\n this.originPts = this.pts = this.dts = pts\n this.data = data\n this.size = data.byteLength\n this.sampleOffset = sampleOffset\n if (duration) this.duration = duration\n }\n}\n","import { TrackType } from './types'\n\nclass Sample {\n time = 0 // second\n\n /**\n * @param {Object} data\n * @param {number} pts\n */\n constructor (data, pts) {\n this.data = data\n this.originPts = this.pts = pts\n }\n}\n\nexport class FlvScriptSample extends Sample {}\n\nexport class SeiSample extends Sample {}\n\nexport class MetadataTrack {\n /** @readonly */\n id = 3\n\n /** @readonly */\n type = TrackType.METADATA\n\n timescale = 0\n\n /** @type {FlvScriptSample[]} */\n flvScriptSamples = []\n\n /** @type {SeiSample[]} */\n seiSamples = []\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!((this.flvScriptSamples.length || this.seiSamples.length) && this.timescale)\n }\n\n reset () {\n this.timescale = 0\n this.flvScriptSamples = []\n this.seiSamples = []\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!(this.flvScriptSamples.length || this.seiSamples.length)\n }\n}\n","export class ExpGolomb {\n _bytesAvailable\n\n _bitsAvailable = 0\n\n _word = 0\n\n constructor (data) {\n if (!data) throw new Error('ExpGolomb data params is required')\n this._data = data\n this._bytesAvailable = data.byteLength\n if (this._bytesAvailable) this._loadWord()\n }\n\n get bitsAvailable () {\n return this._bitsAvailable\n }\n\n _loadWord () {\n const position = this._data.byteLength - this._bytesAvailable\n const availableBytes = Math.min(4, this._bytesAvailable)\n if (availableBytes === 0) throw new Error('No bytes available')\n\n const workingBytes = new Uint8Array(4)\n workingBytes.set(this._data.subarray(position, position + availableBytes))\n\n this._word = new DataView(workingBytes.buffer).getUint32(0)\n this._bitsAvailable = availableBytes * 8\n this._bytesAvailable -= availableBytes\n }\n\n skipBits (count) {\n if (this._bitsAvailable > count) {\n this._word <<= count\n this._bitsAvailable -= count\n } else {\n count -= this._bitsAvailable\n const skipBytes = Math.floor(count / 8)\n count -= (skipBytes * 8)\n this._bytesAvailable -= skipBytes\n this._loadWord()\n this._word <<= count\n this._bitsAvailable -= count\n }\n }\n\n readBits (size) {\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits')\n }\n\n let bits = Math.min(this._bitsAvailable, size)\n const val = this._word >>> (32 - bits)\n\n this._bitsAvailable -= bits\n if (this._bitsAvailable > 0) {\n this._word <<= bits\n } else if (this._bytesAvailable > 0) {\n this._loadWord()\n }\n\n bits = size - bits\n if (bits > 0 && this._bitsAvailable) {\n return (val << bits) | this.readBits(bits)\n }\n return val\n }\n\n skipLZ () {\n let leadingZeroCount\n for (\n leadingZeroCount = 0;\n leadingZeroCount < this._bitsAvailable;\n ++leadingZeroCount\n ) {\n if ((this._word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n this._word <<= leadingZeroCount\n this._bitsAvailable -= leadingZeroCount\n return leadingZeroCount\n }\n }\n this._loadWord()\n return leadingZeroCount + this.skipLZ()\n }\n\n skipUEG () {\n this.skipBits(1 + this.skipLZ())\n }\n\n readUEG () {\n const clz = this.skipLZ()\n return this.readBits(clz + 1) - 1\n }\n\n readEG () {\n const val = this.readUEG()\n if (1 & val) {\n return (1 + val) >>> 1\n }\n return -1 * (val >>> 1)\n }\n\n readBool () {\n return this.readBits(1) === 1\n }\n\n readUByte () {\n return this.readBits(8)\n }\n\n skipScalingList (count) {\n let lastScale = 8\n let nextScale = 8\n let deltaScale\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = this.readEG()\n nextScale = (lastScale + deltaScale + 256) % 256\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n}\n","export class Logger {\n constructor (name) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","export class UTF8 {\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {string}\n */\n static decode (uint8array) {\n const out = []\n const input = uint8array\n let i = 0\n const length = uint8array.length\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]))\n ++i\n continue\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (UTF8._checkContinuation(input, i, 1)) {\n const ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F)\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 2\n continue\n }\n }\n } else if (input[i] < 0xF0) {\n if (UTF8._checkContinuation(input, i, 2)) {\n const ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 3\n continue\n }\n }\n } else if (input[i] < 0xF8) {\n if (UTF8._checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 |\n (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F)\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800))\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00))\n i += 4\n continue\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD))\n ++i\n }\n\n return out.join('')\n }\n\n static _checkContinuation (uint8array, start, checkLength) {\n const array = uint8array\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80) {\n return false\n }\n }\n return true\n } else {\n return false\n }\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n\nconst ua = isBrowser && navigator.userAgent.toLocaleLowerCase()\n\n// eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\nexport const isSafari = isBrowser && /^((?!chrome|android).)*safari/.test(ua)\nexport const isFirefox = isBrowser && ua.includes('firefox')\nexport const isAndroid = isBrowser && ua.includes('android')\n","/* c8 ignore next 4 */\nexport { ExpGolomb } from './exp-golomb'\nexport { Logger } from './logger'\nexport { UTF8 } from './utf8'\nexport * from './env'\n\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport const MAX_SIZE = Math.pow(2, 32)\n\nexport function readBig16 (data, i = 0) {\n return (data[i] << 8) + (data[i + 1] || 0)\n}\n\nexport function readBig24 (data, i = 0) {\n return (data[i] << 16) + (data[i + 1] << 8) + (data[i + 2] || 0)\n}\n\nexport function readBig32 (data, i = 0) {\n return (data[i] << 24 >>> 0) + (data[i + 1] << 16) + (data[i + 2] << 8) + (data[i + 3] || 0)\n}\n\nexport function readBig64 (data, i = 0) {\n return readBig32(data, i) * MAX_SIZE + readBig32(data, i + 4)\n}\n\nexport function getAvcCodec (codecs) {\n let codec = 'avc1.'\n let h\n for (let i = 0; i < 3; i++) {\n h = codecs[i].toString(16)\n if (h.length < 2) h = `0${h}`\n codec += h\n }\n return codec\n}\n\nexport function formatIV (arr) {\n let iv = ''\n arr.forEach(value => {\n iv += bufferToString(value)\n })\n if (iv.length <= 32) {\n const len = 32 - iv.length\n for (let i = 0; i < len; i++) {\n iv += '0'\n }\n }\n return iv\n}\n\nexport function parse (a) {\n if (!Array.isArray(a)) {\n const arr = []\n let value = ''\n for (let i = 0; i < a.length; i++) {\n if (i % 2) {\n value = a[i - 1] + a[i]\n arr.push(parseInt(value, 16))\n value = ''\n }\n }\n return arr\n }\n return a.map(item => { return parseInt(item, 16) })\n}\nfunction bufferToString (value) {\n return ('0' + (Number(value).toString(16))).slice(-2).toUpperCase()\n}\n\nexport function hashVal (str) {\n let hash = 0; let i; let chr\n if (str.length === 0) return hash\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + chr\n hash |= 0\n }\n return hash\n}\n\nexport function combineToFloat (integer, decimal) {\n return Number(integer + '.' + decimal)\n}\n\nexport function toDegree (matrix) {\n if (matrix.length < 5)\n return 0\n const scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4])\n return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI\n}\n","import { isFirefox, isAndroid } from '../utils'\n\nexport class AAC {\n static FREQ = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350\n ];\n\n static getRateIndexByRate (rate) {\n return AAC.FREQ.indexOf(rate)\n }\n\n static parseADTS (data, pts) {\n const len = data.length\n let i = 0\n\n while ((i + 2) < len) {\n if (data[i] === 0xff && (data[i + 1] & 0xf6) === 0xf0) {\n break\n }\n i++\n }\n\n if (i >= len) return\n\n const skip = i\n const frames = []\n const samplingFrequencyIndex = (data[i + 2] & 0x3c) >>> 2\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n if (!sampleRate) throw new Error(`Invalid sampling index: ${samplingFrequencyIndex}`)\n const objectType = ((data[i + 2] & 0xc0) >>> 6) + 1\n const channelCount = ((data[i + 2] & 1) << 2) | ((data[i + 3] & 0xc0) >>> 6)\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n let protectionSkipBytes\n let frameLength\n let frameIndex = 0\n const duration = AAC.getFrameDuration(sampleRate)\n\n while ((i + 7) < len) {\n if ((data[i] !== 0xff) || (data[i + 1] & 0xF6) !== 0xf0) {\n i++\n continue\n }\n\n frameLength = ((data[i + 3] & 0x03) << 11) | (data[i + 4] << 3) | ((data[i + 5] & 0xe0) >> 5)\n if (!frameLength || (len - i) < frameLength) break\n\n protectionSkipBytes = (~data[i + 1] & 0x01) * 2\n frames.push({\n pts: pts + frameIndex * duration,\n data: data.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n })\n\n frameIndex++\n i += frameLength\n }\n\n return {\n skip,\n remaining: i >= len ? undefined : data.subarray(i),\n frames,\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n codec,\n config,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static parseAudioSpecificConfig (data) {\n if (!data.length) return\n const objectType = data[0] >>> 3\n const samplingFrequencyIndex = ((data[0] & 0x07) << 1) | (data[1] >>> 7)\n const channelCount = (data[1] & 0x78) >>> 3\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n // play as no audio track stream\n if (!sampleRate) return\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n return {\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n config,\n codec,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static getFrameDuration (rate, timescale = 90000) {\n return 1024 * timescale / rate\n }\n\n static _getConfig (samplingIndex, channelCount, originObjectType) {\n const config = []\n let objectType\n let extensionSamplingIndex\n if (isFirefox) {\n if (samplingIndex >= 6) { // use SBR (HE-AAC)\n objectType = 5\n extensionSamplingIndex = samplingIndex - 3\n } else { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n } else if (isAndroid) { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n } else { // use HE-AAC\n objectType = 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { readBig32 } from '../utils'\n\nexport class NALu {\n /**\n * @param {Uint8Array} data\n * @returns {Uint8Array[]}\n */\n static parseAnnexB (data) {\n let j = data.byteLength - 1\n let dropZerosLength = 0\n // Collect tailing zeros.\n // end with 0x000000 and more...\n do {\n if (data[j] === 0x00) {\n dropZerosLength++\n } else {\n break\n }\n\n j--\n } while (j > 0)\n\n if (dropZerosLength >= 3) {\n // drop tailing zeros.\n data = data.subarray(0, j + 1)\n }\n\n const len = data.length\n let start = 2\n let end = 0\n while (data[start] !== null && data[start] !== undefined && data[start] !== 1) {\n start++\n }\n start++\n end = start + 2\n\n if (end >= len) return []\n\n const units = []\n\n while (end < len) {\n switch (data[end]) {\n case 0:\n if (data[end - 1] !== 0) {\n end += 2\n break\n } else if (data[end - 2] !== 0) {\n end++\n break\n } else if (end < len - 1 && data[end + 1] !== 1) {\n end++\n break\n }\n\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n\n do {\n end++\n } while (data[end] !== 1 && end < len)\n start = end + 1\n end = start + 2\n break\n case 1:\n if (data[end - 1] !== 0 || data[end - 2] !== 0) {\n end += 3\n break\n }\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n start = end + 1\n end = start + 2\n break\n default:\n end += 3\n break\n }\n }\n\n if (start < len) units.push(data.subarray(start))\n\n return units\n }\n\n static parseAvcC (data, size = 4) {\n if (data.length < 4) return\n const dataLen = data.length\n const units = []\n\n let offset = 0\n let length\n while ((offset + size) < dataLen) {\n length = readBig32(data, offset)\n if (size === 3) length >>>= 8\n offset += size\n\n if (!length) continue\n if (offset + length > dataLen) {\n break\n }\n\n units.push(data.subarray(offset, offset + length))\n offset += length\n }\n\n return units\n }\n\n static parseSEI (unit, isHevc) {\n const len = unit.length\n let i = isHevc ? 2 : 1\n let type = 0\n let size = 0\n let uuid = ''\n\n while (unit[i] === 255) {\n type += 255\n i++\n }\n\n type += unit[i++]\n\n while (unit[i] === 255) {\n size += 255\n i++\n }\n size += unit[i++]\n\n if (type === 5 && len > i + 16) {\n for (let j = 0; j < 16; j++) {\n uuid += unit[i].toString(16)\n i++\n }\n }\n\n return {\n payload: unit.subarray(i, i + size), type, size, uuid\n }\n }\n\n static removeEPB (uint) {\n const length = uint.byteLength\n const emulationPreventionBytesPositions = []\n let i = 1\n\n while (i < length - 2) {\n if (uint[i] === 0 && uint[i + 1] === 0 && uint[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2)\n i += 2\n } else {\n i++\n }\n }\n\n if (!emulationPreventionBytesPositions.length) return uint\n\n const newLength = length - emulationPreventionBytesPositions.length\n const newData = new Uint8Array(newLength)\n\n let sourceIndex = 0\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n sourceIndex++\n emulationPreventionBytesPositions.shift()\n }\n newData[i] = uint[sourceIndex]\n }\n\n return newData\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb, getAvcCodec } from '../utils'\n\nexport class AVC {\n static parseAVCDecoderConfigurationRecord (data) {\n if (data.length < 7) return\n const nalUnitSize = (data[4] & 3) + 1\n\n let spsParsed\n const spsArr = []\n const ppsArr = []\n\n let offset = 6\n const spsCount = data[5] & 0x1f\n let spsSize\n for (let i = 0; i < spsCount; i++) {\n spsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!spsSize) continue\n\n const sps = data.subarray(offset, offset + spsSize)\n offset += spsSize\n spsArr.push(sps)\n\n if (!spsParsed) {\n spsParsed = AVC.parseSPS(NALu.removeEPB(sps))\n }\n }\n\n const ppsCount = data[offset]\n offset++\n let ppsSize\n for (let i = 0; i < ppsCount; i++) {\n ppsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!ppsSize) continue\n ppsArr.push(data.subarray(offset, offset + ppsSize))\n offset += ppsSize\n }\n\n return {\n sps: spsParsed,\n spsArr,\n ppsArr,\n nalUnitSize\n }\n }\n\n static parseSPS (unit) {\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n\n const profileIdc = eg.readUByte()\n const profileCompatibility = eg.readUByte()\n const levelIdc = eg.readUByte()\n eg.skipUEG()\n\n let chromaFormat = 420\n if (\n profileIdc === 100 ||\n profileIdc === 110 ||\n profileIdc === 122 ||\n profileIdc === 244 ||\n profileIdc === 44 ||\n profileIdc === 83 ||\n profileIdc === 86 ||\n profileIdc === 118 ||\n profileIdc === 128 ||\n profileIdc === 138 ||\n profileIdc === 144\n ) {\n const chromaFormatIdc = eg.readUEG()\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n if (chromaFormatIdc === 3) eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n eg.skipBits(1)\n if (eg.readBool()) {\n const scalingListCount = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < scalingListCount; i++) {\n if (eg.readBool()) {\n if (i < 6) {\n eg.skipScalingList(16)\n } else {\n eg.skipScalingList(64)\n }\n }\n }\n }\n }\n\n eg.skipUEG()\n const picOrderCntType = eg.readUEG()\n if (picOrderCntType === 0) {\n eg.readUEG()\n } else if (picOrderCntType === 1) {\n eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n const numRefFramesInPicOrderCntCycle = eg.readUEG()\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n eg.skipUEG()\n }\n }\n\n eg.skipUEG()\n eg.skipBits(1)\n const picWidthInMbsMinus1 = eg.readUEG()\n const picHeightInMapUnitsMinus1 = eg.readUEG()\n const frameMbsOnlyFlag = eg.readBits(1)\n if (frameMbsOnlyFlag === 0) eg.skipBits(1)\n eg.skipBits(1)\n\n let frameCropLeftOffset = 0\n let frameCropRightOffset = 0\n let frameCropTopOffset = 0\n let frameCropBottomOffset = 0\n\n if (eg.readBool()) {\n frameCropLeftOffset = eg.readUEG()\n frameCropRightOffset = eg.readUEG()\n frameCropTopOffset = eg.readUEG()\n frameCropBottomOffset = eg.readUEG()\n }\n\n let sarRatio\n let fixedFrame\n let fpsNum\n let fpsDen\n let fps\n if (eg.readBool()) {\n if (eg.readBool()) {\n const aspectRatioIdc = eg.readUByte()\n switch (aspectRatioIdc) {\n case 1: sarRatio = [1, 1]; break\n case 2: sarRatio = [12, 11]; break\n case 3: sarRatio = [10, 11]; break\n case 4: sarRatio = [16, 11]; break\n case 5: sarRatio = [40, 33]; break\n case 6: sarRatio = [24, 11]; break\n case 7: sarRatio = [20, 11]; break\n case 8: sarRatio = [32, 11]; break\n case 9: sarRatio = [80, 33]; break\n case 10: sarRatio = [18, 11]; break\n case 11: sarRatio = [15, 11]; break\n case 12: sarRatio = [64, 33]; break\n case 13: sarRatio = [160, 99]; break\n case 14: sarRatio = [4, 3]; break\n case 15: sarRatio = [3, 2]; break\n case 16: sarRatio = [2, 1]; break\n case 255: {\n sarRatio = [\n (eg.readUByte() << 8) | eg.readUByte(),\n (eg.readUByte() << 8) | eg.readUByte()\n ]\n break\n }\n default:\n }\n }\n\n if (eg.readBool()) eg.readBool()\n\n if (eg.readBool()) {\n eg.readBits(4)\n if (eg.readBool()) eg.readBits(24)\n }\n\n if (eg.readBool()) {\n eg.readUEG()\n eg.readUEG()\n }\n\n if (eg.readBool()) {\n const numUnitsInTick = eg.readBits(32)\n const timeScale = eg.readBits(32)\n fixedFrame = eg.readBool()\n\n fpsNum = timeScale\n fpsDen = numUnitsInTick * 2\n fps = fpsNum / fpsDen\n }\n }\n\n return {\n codec: getAvcCodec(unit.subarray(1, 4)),\n profileIdc,\n profileCompatibility,\n levelIdc,\n chromaFormat,\n width: Math.ceil(\n (picWidthInMbsMinus1 + 1) * 16 -\n 2 * (frameCropLeftOffset + frameCropRightOffset)\n ),\n height:\n (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n (frameMbsOnlyFlag ? 2 : 4) *\n (frameCropTopOffset + frameCropBottomOffset),\n sarRatio,\n fpsNum,\n fpsDen,\n fps,\n fixedFrame\n }\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb } from '../utils'\n\nexport class HEVC {\n static parseHEVCDecoderConfigurationRecord (data, hvcC = {}) {\n if (data.length < 23) return\n hvcC = hvcC || {}\n const nalUnitSize = (data[21] & 3) + 1\n\n let vpsParsed\n let spsParsed\n const spsArr = []\n const ppsArr = []\n const vpsArr = []\n\n let offset = 23\n const numOfArrays = data[22]\n\n let nalUnitType\n let numNalus\n let nalSize\n for (let i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f\n numNalus = (data[offset + 1] << 8) | data[offset + 2]\n\n offset += 3\n\n for (let j = 0; j < numNalus; j++) {\n nalSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!nalSize) continue\n switch (nalUnitType) {\n case 32: {\n const vps = data.subarray(offset, offset + nalSize)\n if (!vpsParsed) vpsParsed = HEVC.parseVPS(NALu.removeEPB(vps), hvcC)\n vpsArr.push(vps)\n }\n break\n case 33: {\n const sps = data.subarray(offset, offset + nalSize)\n if (!spsParsed) spsParsed = HEVC.parseSPS(NALu.removeEPB(sps), hvcC)\n spsArr.push(sps)\n }\n break\n case 34:\n ppsArr.push(data.subarray(offset, offset + nalSize))\n break\n default:\n }\n\n offset += nalSize\n }\n }\n\n return {\n hvcC,\n sps: spsParsed,\n spsArr,\n ppsArr,\n vpsArr,\n nalUnitSize\n }\n }\n\n static parseVPS (unit, hvcC) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(12)\n const vpsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(hvcC.numTemporalLayers || 0, vpsMaxSubLayersMinus1 + 1)\n eg.readBits(17)\n HEVC._parseProfileTierLevel(eg, vpsMaxSubLayersMinus1, hvcC)\n\n return hvcC\n }\n\n static parseSPS (unit, hvcC = {}) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(4)\n const spsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(spsMaxSubLayersMinus1 + 1, hvcC.numTemporalLayers || 0)\n hvcC.temporalIdNested = eg.readBits(1)\n HEVC._parseProfileTierLevel(eg, spsMaxSubLayersMinus1, hvcC)\n\n eg.readUEG() // sps_seq_parameter_set_id\n\n const chromaFormatIdc = hvcC.chromaFormatIdc = eg.readUEG()\n let chromaFormat = 420\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n\n let separateColourPlaneFlag = 0\n if (chromaFormatIdc === 3) {\n separateColourPlaneFlag = eg.readBits(1)\n }\n\n let width = eg.readUEG() // pic_width_in_luma_samples\n let height = eg.readUEG() // pic_height_in_luma_samples\n\n const conformanceWindowFlag = eg.readBits(1)\n\n let confWinLeftOffset\n let confWinRightOffset\n let confWinTopOffset\n let confWinBottomOffset\n if (conformanceWindowFlag === 1) {\n confWinLeftOffset = eg.readUEG() // conf_win_left_offset\n confWinRightOffset = eg.readUEG() // conf_win_right_offset\n confWinTopOffset = eg.readUEG() // conf_win_top_offset\n confWinBottomOffset = eg.readUEG() // conf_win_bottom_offset\n }\n\n hvcC.bitDepthLumaMinus8 = eg.readUEG() // bit_depth_luma_minus8\n hvcC.bitDepthChromaMinus8 = eg.readUEG() // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n const subWidthC = (((chromaFormatIdc === 1) || (chromaFormatIdc === 2)) && (separateColourPlaneFlag === 0)) ? 2 : 1\n const subHeightC = ((chromaFormatIdc === 1) && (separateColourPlaneFlag === 0)) ? 2 : 1\n width -= (subWidthC * (confWinRightOffset + confWinLeftOffset))\n height -= (subHeightC * (confWinBottomOffset + confWinTopOffset))\n }\n\n return {\n codec: 'hev1.1.6.L93.B0',\n width,\n height,\n chromaFormat,\n hvcC\n }\n }\n\n static _parseProfileTierLevel (eg, maxSubLayersMinus1, hvcC) {\n const generalTierFlag = hvcC.generalTierFlag || 0\n hvcC.generalProfileSpace = eg.readBits(2)\n hvcC.generalTierFlag = Math.max(eg.readBits(1), generalTierFlag)\n hvcC.generalProfileIdc = Math.max(eg.readBits(5), hvcC.generalProfileIdc || 0)\n hvcC.generalProfileCompatibilityFlags = eg.readBits(32)\n hvcC.generalConstraintIndicatorFlags = [eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8)]\n const generalLevelIdc = eg.readBits(8)\n if (generalTierFlag < hvcC.generalTierFlag) {\n hvcC.generalLevelIdc = generalLevelIdc\n } else {\n hvcC.generalLevelIdc = Math.max(generalLevelIdc, hvcC.generalLevelIdc || 0)\n }\n\n const subLayerProfilePresentFlag = []\n const subLayerLevelPresentFlag = []\n\n if (maxSubLayersMinus1 > eg.bitsAvailable) {\n throw new Error(`maxSubLayersMinus inavlid size ${maxSubLayersMinus1}`)\n }\n\n for (let j = 0; j < maxSubLayersMinus1; j++) {\n subLayerProfilePresentFlag[j] = eg.readBits(1)\n subLayerLevelPresentFlag[j] = eg.readBits(1)\n }\n\n if (maxSubLayersMinus1 > 0) {\n eg.readBits((8 - maxSubLayersMinus1) * 2)\n }\n\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i] !== 0) {\n eg.readBits(2)\n eg.readBits(1)\n eg.readBits(5)\n\n eg.readBits(16)\n eg.readBits(16)\n\n eg.readBits(4)\n\n eg.readBits(16)\n eg.readBits(16)\n eg.readBits(12)\n }\n if (subLayerLevelPresentFlag[i] !== 0) {\n eg.readBits(8)\n }\n }\n }\n}\n","/**\n * Opus documentation, https://opus-codec.org/docs/\n * Ogg Encapsulation for the Opus Audio Codec, https://datatracker.ietf.org/doc/html/rfc7845.html\n *\n * Packet Organization:\n *\n * Page 0 Pages 1 ... n Pages (n+1) ...\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * | | | | | | | | | | | | |\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * |||ID Header|| || Comment Header || ||Audio Data Packet 1| | ...\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * | | | | | | | | | | | | |\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * ^ ^ ^\n * | | |\n * | | Mandatory Page Break\n * | |\n * | ID header is contained on a single page\n * |\n * 'Beginning Of Stream'\n */\nexport class OPUS {\n static getFrameDuration (samples, timescale = 1000) {\n return 20\n }\n\n /**\n * Identification Header + Comment Header\n * @param {Uint8Array} data\n */\n static parseHeaderPackets (data) {\n if (!data.length) return\n\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\n // Identification Header\n let magicSignature = ''\n for (let i = 0; i < 8; i++) {\n magicSignature += String.fromCodePoint(data[i])\n }\n if (magicSignature !== 'OpusHead') {\n throw new Error('Invalid Opus MagicSignature')\n }\n\n // skip version\n // data[8]\n // console.log('Pre-skip', data[8])\n\n const channelCount = data[9]\n\n // skip Pre-skip\n // data[10] & data[11]\n console.log('Pre-skip', data[10], data[11])\n\n const sampleRate = dv.getUint32(12, true)\n const outputGain = dv.getInt16(16, true)\n\n // const mappingFamily = dv.getUint8(18)\n\n // play as no audio track stream\n if (!sampleRate) return\n\n const codec = 'opus'\n const originCodec = 'opus'\n const config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8)\n\n return {\n outputGain,\n sampleRate,\n channelCount,\n config,\n codec,\n originCodec\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC, OPUS } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 500 // ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 1000 // ms\nconst AUDIO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BROKEN_CHECK_TIME = 5\n\nexport class FlvFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastVideoDuration = 0\n\n // 在视频帧遇到下一个关键帧之前,如果音频时间戳发生了跳变,不能确定是否音视频都发生跳变还是单纯音频发生跳变.\n // 这里记录关键帧标识, 从下一个关键帧开始,如果视频没有跳变,才能判断是只有音频发生了跳变\n this._keyFrameInNextChunk = false\n\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n /**\n * @param {number} startTime 点播seek到的时间点\n * @param {boolean} discontinuity 是否换流\n * @param {boolean} contiguous 前后chunk时间戳是否连续\n */\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 1000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n if (discontinuity || !contiguous) {\n this._videoLastSample = null\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n if (discontinuity && !contiguous) {\n this._baseDtsInited = false\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(audioTrack, videoTrack)\n }\n\n if (!contiguous && startTime) {\n this._audioNextPts = this._videoNextDts = startTime\n }\n\n const resetBaseDts = this._baseDtsInited &&\n (this._videoTimestampBreak || !this.videoTrack.exist()) &&\n (this._audioTimestampBreak || !this.audioTrack.exist())\n\n if (resetBaseDts) {\n this._resetBaseDtsWhenStreamBreaked()\n }\n\n this._fixAudio(audioTrack)\n\n this._keyFrameInNextChunk = false\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n this.metadataTrack.flvScriptSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 1000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n if (x.keyframe) this._keyFrameInNextChunk = true\n })\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else if (videoTrack.length > 1) {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[samples.length - 1]\n refSampleDurationInt = Math.floor((last.dts - first.dts) / (samples.length - 1))\n } else {\n refSampleDurationInt = this._lastVideoDuration || 40\n }\n\n const lastSample = samples.pop()\n\n if (this._videoLastSample) {\n samples.unshift(this._videoLastSample)\n }\n\n this._videoLastSample = lastSample\n\n if (!samples.length) return\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // emit large delta of first sample with expect\n if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n }\n\n // only video break\n if (this._videoTimestampBreak >= TRACK_BROKEN_CHECK_TIME) {\n this._videoNextDts = firstSample.dts\n this._videoTimestampBreak = 0\n } else {\n // resolve first frame only\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n if (!this.audioTrack.exist()) {\n this._videoTimestampBreak = 1\n }\n }\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (lastSample) {\n sampleDuration = lastSample.dts - dts\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n this._videoTimestampBreak++\n // emit stream break\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionLargeGapDot = dts\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n sampleDuration = refSampleDurationInt\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n this._lastVideoDuration = sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n if (!samples.length) return\n\n // offset origin timestamp\n samples.forEach(x => {\n x.dts = x.pts -= this._baseDts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 1000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n /**\n * timestamp break\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n if (!this.audioTrack.exist()){\n this._baseDts -= this._videoNextDts\n } else if (!this.videoTrack.exist()){\n this._baseDts -= this._audioNextPts\n } else {\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n }\n this._videoTimestampBreak = 0\n this._audioTimestampBreak = 0\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) {\n switch (audioTrack.codecType) {\n case AudioCodecType.AAC: {\n audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n break\n }\n case AudioCodecType.OPUS: {\n audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale)\n break\n }\n case AudioCodecType.G711PCMA:\n case AudioCodecType.G711PCMU: {\n audioTrack.sampleDuration = this._getG711Duration(audioTrack)\n break\n }\n default:\n console.error('can\\'t fix audio codecType:', audioTrack.codecType)\n break\n }\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate =\n audioTrack.codecType === AudioCodecType.OPUS\n ? 20\n : audioTrack.codecType === AudioCodecType.AAC\n ? 1024\n : (refSampleDuration * audioTrack.timescale) / 1000\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n let nextPts = this._audioNextPts\n const sample = samples[i]\n let delta = sample.pts - nextPts\n\n // only audio break\n if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_CHECK_TIME && this._keyFrameInNextChunk) {\n nextPts = this._audioNextPts = sample.dts\n delta = 0\n this._audioTimestampBreak = 0\n }\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n }\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(this._audioNextPts + refSampleDuration) - Math.floor(this._audioNextPts), silentFrame, sampleDurationInSampleRate)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak++\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n if (audioTrack.codecType === AudioCodecType.OPUS) {\n const lastSample = samples[samples.length - 1]\n if (lastSample) {\n lastSample.duration = sample.pts - lastSample.pts\n }\n } else {\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n }\n this._audioNextPts += refSampleDuration\n }\n }\n }\n\n _getG711Duration (track) {\n const { sampleSize, channelCount, sampleRate } = track\n const samp0 = track.samples[0]\n if (!samp0) return\n return samp0.data.byteLength * 2 / channelCount / (sampleSize / 8) / sampleRate * 1000\n }\n\n _getSilentFrame (track) {\n if (track.codecType === AudioCodecType.AAC) return AAC.getSilentFrame(track.codec, track.channelCount)\n return new Uint8Array(8 * track.sampleDuration * track.channelCount)\n }\n}\n","import { UTF8 } from '../utils'\n\nexport class AMF {\n static parse (data) {\n if (data.length < 3) return\n\n const ret = {}\n const name = AMF._parseValue(new DataView(data.buffer, data.byteOffset, data.byteLength))\n const value = AMF._parseValue(new DataView(data.buffer, data.byteOffset + name.size, data.byteLength - name.size))\n ret[name.data] = value.data\n\n return ret\n }\n\n static _parseValue (view) {\n const dataLen = view.byteLength\n const type = view.getUint8(0)\n let offset = 1\n let isEnd = false\n let value\n\n switch (type) {\n case 0: // Number(Double) type\n value = view.getFloat64(1)\n offset += 8\n break\n case 1: { // Boolean type\n value = !!view.getUint8(1)\n offset += 1\n break\n }\n case 2: { // String type\n const { data, size } = AMF._parseString(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value = data\n offset += size\n }\n break\n case 3: { // Object(s) type\n value = {}\n let terminal = 0\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) offset += 3\n }\n }\n break\n case 8: { // ECMA array type (Mixed array)\n value = {}\n offset += 4 // ECMAArrayLength(UI32)\n let terminal = 0 // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) {\n offset += 3\n }\n }\n }\n break\n case 9: // ScriptDataObjectEnd\n value = undefined\n offset = 1\n isEnd = true\n break\n case 10: { // Strict array type\n value = []\n const strictArrayLength = view.getUint32(1)\n offset += 4\n for (let i = 0; i < strictArrayLength; i++) {\n const { data, size } = AMF._parseValue(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value.push(data)\n offset += size\n }\n }\n break\n case 11: { // Date type\n const timestamp = view.getFloat64(offset) + view.getInt16(offset + 8) * 60000\n value = new Date(timestamp)\n offset += 10\n }\n break\n case 12: { // Long string type\n const length = view.getUint32(1)\n offset += 4\n value = ''\n if (length > 0) {\n value = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + offset, length))\n }\n offset += length\n }\n break\n default:\n offset = dataLen\n break\n }\n\n return {\n data: value,\n size: offset,\n isEnd\n }\n }\n\n static _parseString (view) {\n const length = view.getUint16(0)\n let data = ''\n if (length > 0) {\n data = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + 2, length))\n }\n\n return {\n data,\n size: 2 + length\n }\n }\n\n static _parseObject (view) {\n if (view.byteLength < 3) return\n\n const name = AMF._parseString(view)\n const value = AMF._parseValue(new DataView(view.buffer, view.byteOffset + name.size, view.byteLength - name.size))\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n isEnd: value.isEnd\n }\n }\n}\n","/**\n * AudioData\n * @property {number} FlvSoundFormat\n */\nexport const FlvSoundFormat = {\n MP3: 2,\n G711A: 7, // G.711 A-law logarithmic PCM\n G711M: 8, // G.711 mu-law logarithmic PCM\n AAC: 10, // AAC\n OPUS: 13\n}\n\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample, VideoCodecType, AudioCodecType, FlvScriptSample, SeiSample } from '../model'\nimport { FlvFixer } from './fixer'\nimport { concatUint8Array, Logger, readBig32 } from '../utils'\nimport { AAC, AVC, HEVC, NALu } from '../codec'\nimport { AMF } from './amf'\nimport { FlvSoundFormat } from './soundFormat'\nimport { OPUS } from '../codec/opus'\n\nconst logger = new Logger('FlvDemuxer')\n\n/**\n * @typedef {Object} DemuxResult\n * @property {VideoTrack} videoTrack\n * @property {AudioTrack} audioTrack\n * @property {MetadataTrack} metadataTrack\n */\n\nexport class FlvDemuxer {\n _headerParsed = false\n _remainingData = null\n _gopId = 0\n _needAddMetaBeforeKeyFrameNal = true // 标识H265流中关键帧Nal之前是否需要插入vps、sps、pps Nal\n\n static AUDIO_RATE = [5500, 11000, 22000, 44000]\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new FlvFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false] 切流\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true, seamlessLoadingSwitching) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\n\n if (discontinuity) {\n this._headerParsed = false\n }\n\n if (discontinuity) {\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n metadataTrack.flvScriptSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingData) {\n data = concatUint8Array(this._remainingData, data)\n this._remainingData = null\n }\n }\n\n if (!data.length) {\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n let offset = 0\n if (!this._headerParsed) {\n if (!FlvDemuxer.probe(data)) {\n throw new Error('Invalid flv file')\n }\n audioTrack.present = ((data[4] & 4) >>> 2) !== 0\n videoTrack.present = (data[4] & 1) !== 0\n this._headerParsed = true\n offset = readBig32(data, 5) + 4 // skip prev tag size\n }\n\n const dataLen = data.length\n\n let tagType\n let dataSize\n let timestamp\n let bodyData\n let prevTagSize\n while ((offset + 15) < dataLen) { // header and prev tag size\n tagType = data[offset]\n dataSize = (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]\n if (offset + 15 + dataSize > dataLen) break\n timestamp = (\n (data[offset + 7] << 24 >>> 0) +\n (data[offset + 4] << 16) +\n (data[offset + 5] << 8) +\n data[offset + 6]\n )\n\n offset += 11\n bodyData = data.subarray(offset, offset + dataSize)\n if (tagType === 8) {\n this._parseAudio(bodyData, timestamp)\n } else if (tagType === 9) {\n if (seamlessLoadingSwitching) this.seamlessLoadingSwitching = true\n this._parseVideo(bodyData, timestamp)\n } else if (tagType === 18) {\n this._parseScript(bodyData, timestamp)\n } else {\n logger.warn(`Invalid tag type: ${tagType}`)\n }\n\n offset += dataSize\n prevTagSize = readBig32(data, offset)\n if (prevTagSize !== 11 + dataSize) {\n logger.warn(`Invalid PrevTagSize ${prevTagSize} (${11 + dataSize})`)\n }\n\n offset += 4\n }\n\n if (offset < dataLen) {\n this._remainingData = data.subarray(offset)\n }\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1000\n audioTrack.timescale = audioTrack.codecType === AudioCodecType.OPUS ? 1000 : audioTrack.sampleRate || 0\n\n if (!audioTrack.exist() && audioTrack.hasSample()) {\n audioTrack.reset()\n }\n if (!videoTrack.exist() && videoTrack.hasSample()) {\n videoTrack.reset()\n }\n\n const scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1]\n const metaData = scriptDataObject?.data?.onMetaData\n\n if (metaData) {\n if (videoTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n videoTrack.duration = metaData.duration * 1000\n }\n\n if (metaData.hasOwnProperty('width') && metaData.hasOwnProperty('height')) {\n videoTrack.width = metaData.width\n videoTrack.height = metaData.height\n }\n }\n\n if (audioTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n audioTrack.duration = metaData.duration * 1000\n }\n }\n }\n\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n * @returns {DemuxResult}\n */\n demuxAndFix (data, discontinuity, contiguous, startTime, seamlessLoadingSwitching) {\n this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return false\n }\n return readBig32(data, 5) >= 9\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseAudio (data, pts) {\n if (!data.length) return\n\n const format = (data[0] & 0xf0) >>> 4\n const track = this.audioTrack\n\n if (\n format !== FlvSoundFormat.AAC &&\n format !== FlvSoundFormat.G711A &&\n format !== FlvSoundFormat.G711M &&\n format !== FlvSoundFormat.OPUS\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {\n const soundRate = (data[0] & 0x0c) >> 2\n const soundSize = (data[0] & 0x02) >> 1\n const soundType = (data[0] & 0x01)\n track.sampleRate = FlvDemuxer.AUDIO_RATE[soundRate]\n track.sampleSize = soundSize ? 16 : 8\n track.channelCount = soundType + 1\n }\n\n switch (format) {\n case FlvSoundFormat.G711A:\n case FlvSoundFormat.G711M:\n this._parseG711(data, pts, format)\n break\n case FlvSoundFormat.AAC:\n this._parseAac(data, pts)\n break\n case FlvSoundFormat.OPUS:\n this._parseOpus(data, pts)\n break\n default:\n break\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseOpus (data, pts) {\n const track = this.audioTrack\n const packetType = data[1]\n\n track.codecType = AudioCodecType.OPUS\n\n switch (packetType) {\n case 0 /* Header Packets */: {\n const ret = OPUS.parseHeaderPackets(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.sampleDuration = OPUS.getFrameDuration([], track.timescale)\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n break\n }\n case 1 /* Raw OPUS frame data */: {\n if (pts === undefined || pts === null) return\n\n const newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration)\n track.samples.push(newSample)\n break\n }\n default:\n logger.warn(`Unknown OpusPacketType: ${packetType}`)\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @param {import('./soundFormat').FlvSoundFormat} format\n */\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n const audioData = data.subarray(1)\n\n if (audioData.byteLength < 1) return\n\n const sample = new AudioSample(pts, audioData)\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(sample)\n }\n\n _parseAac (data, pts) {\n const track = this.audioTrack\n track.codecType = AudioCodecType.AAC\n\n if (data[1] === 0) { // AACPacketType\n const ret = AAC.parseAudioSpecificConfig(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n } else if (data[1] === 1) { // Raw AAC frame data\n if (pts === undefined || pts === null) return\n track.samples.push(new AudioSample(pts, data.subarray(2)))\n } else {\n logger.warn(`Unknown AACPacketType: ${data[1]}`)\n }\n }\n\n _parseVideo (data, dts) {\n if (data.length < 6) return\n\n const frameType = (data[0] & 0xf0) >>> 4\n const codecId = data[0] & 0x0f\n\n const track = this.videoTrack\n\n if (\n codecId !== 7 && // AVC\n codecId !== 12 // HEVC\n ) {\n track.reset()\n logger.warn(`Unsupported codecId: ${codecId}`)\n return\n }\n\n const isHevc = codecId === 12\n track.codecType = isHevc ? VideoCodecType.HEVC : VideoCodecType.AVC\n\n const packetType = data[1]\n const cts = (((data[2] << 16) | (data[3] << 8) | (data[4])) << 8) >> 8\n\n if (packetType === 0) { // DecoderConfigurationRecord\n const configData = data.subarray(5)\n const ret = isHevc\n ? HEVC.parseHEVCDecoderConfigurationRecord(configData)\n : AVC.parseAVCDecoderConfigurationRecord(configData)\n if (ret) {\n const { hvcC, sps, ppsArr, spsArr, vpsArr, nalUnitSize } = ret\n if (hvcC) {\n track.hvcC = track.hvcC || hvcC\n }\n if (sps) {\n track.codec = sps.codec\n track.width = sps.width\n track.height = sps.height\n track.sarRatio = sps.sarRatio\n track.fpsNum = sps.fpsNum\n track.fpsDen = sps.fpsDen\n }\n if (spsArr.length) track.sps = spsArr\n if (ppsArr.length) track.pps = ppsArr\n if (vpsArr && vpsArr.length) track.vps = vpsArr\n if (nalUnitSize) track.nalUnitSize = nalUnitSize\n } else {\n logger.warn(`Cannot parse ${isHevc ? 'HEVC' : 'AVC'}DecoderConfigurationRecord`, data)\n }\n } else if (packetType === 1) { // One or more NALUs\n let units = NALu.parseAvcC(data.subarray(5), track.nalUnitSize)\n\n units = this._checkAddMetaNalToUnits(isHevc, units, track)\n\n if (units && units.length) {\n const sample = new VideoSample(dts + cts, dts, units)\n if (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {\n return\n }\n this.seamlessLoadingSwitching = false\n if (frameType === 1) {\n sample.setToKeyframe()\n track.lastKeyFrameDts = dts\n }\n track.samples.push(sample)\n\n units.forEach(unit => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n dts + cts\n ))\n break\n default:\n }\n })\n\n if (sample.keyframe) {\n this._gopId++\n }\n sample.gopId = this._gopId\n } else {\n logger.warn('Cannot parse NALUs', data)\n }\n } else if (packetType === 2) {\n // AVC end of sequence, Empty\n } else {\n logger.warn(`Unknown AVCPacketType: ${packetType}`)\n }\n }\n\n _checkAddMetaNalToUnits (hevc, units, track) {\n if (!hevc || !this._needAddMetaBeforeKeyFrameNal) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n const nalTypes = units.map(x => (x[0] >>> 1) & 0x3f)\n\n if (nalTypes.includes(32)) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n units.unshift(track.pps[0])\n units.unshift(track.sps[0])\n units.unshift(track.vps[0])\n\n return units.filter(Boolean)\n }\n\n _parseScript (data, pts) {\n this.metadataTrack.flvScriptSamples.push(new FlvScriptSample(AMF.parse(data), pts))\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu, MPEG } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\nimport { AudioCodecType } from '../model/types'\n\nconst logger = new Logger('TsDemuxer')\n\nexport class TsDemuxer {\n _pmtId = -1\n _remainingPacketData = null\n _videoPesData = []\n _audioPesData = []\n _gopId = 0\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack, fixerConfig = {}) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack, fixerConfig)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {import('../flv').DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity) {\n this._pmtId = -1\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n }\n\n if (!contiguous || discontinuity) {\n this._remainingPacketData = null\n this._videoPesData = []\n this._audioPesData = []\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingPacketData) {\n data = concatUint8Array(this._remainingPacketData, data)\n this._remainingPacketData = null\n }\n }\n\n let dataLen = data.length\n const remainingLength = dataLen % 188\n if (remainingLength) {\n this._remainingPacketData = data.subarray(dataLen - remainingLength)\n dataLen -= remainingLength\n }\n\n let videoPid = videoTrack.pid\n let audioPid = audioTrack.pid\n\n for (let start = 0; start < dataLen; start += 188) {\n if (data[start] !== 0x47) throw new Error('TS packet did not start with 0x47')\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40)\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]\n const adaptationFiledControl = (data[start + 3] & 0x30) >> 4\n\n let offset\n if (adaptationFiledControl > 1) {\n offset = start + 5 + data[start + 4]\n if (offset === start + 188) continue\n } else {\n offset = start + 4\n }\n\n switch (pid) {\n case 0: // PAT\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n this._pmtId = ((data[offset + 10] & 0x1f) << 8) | data[offset + 11]\n break\n case this._pmtId: {\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n const tableEnd = offset + 3 + (((data[offset + 1] & 0x0f) << 8) | data[offset + 2]) - 4\n const programInfoLength = ((data[offset + 10] & 0x0f) << 8) | data[offset + 11]\n offset += 12 + programInfoLength\n\n while (offset < tableEnd) {\n const esPid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2]\n switch (data[offset]) {\n case 0x0f: // AAC ADTS\n audioTrack.pid = audioPid = esPid\n break\n case 0x03:\n case 0x04:\n if (audioTrack.pid === -1) {\n audioTrack.pid = audioPid = esPid\n audioTrack.codecType = AudioCodecType.MP3\n }\n break\n case 0x1b: // AVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.AVC\n videoTrack.pid = videoPid = esPid\n break\n case 0x24: // HEVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.HEVC\n videoTrack.pid = videoPid = esPid\n break\n default:\n logger.warn(`Unsupported stream. type: ${data[offset]}, pid: ${esPid}`)\n }\n\n offset += (((data[offset + 3] & 0x0f) << 8) | data[offset + 4]) + 5\n }\n }\n break\n case videoPid:\n if (payloadUnitStartIndicator && this._videoPesData.length) {\n this._parseVideoData()\n }\n this._videoPesData.push(data.subarray(offset, start + 188))\n break\n case audioPid:\n if (payloadUnitStartIndicator && this._audioPesData.length) {\n this._parseAudioData()\n }\n this._audioPesData.push(data.subarray(offset, start + 188))\n break\n case 17:\n case 0x1fff:\n break\n default:\n logger.warn(`Unknown pid: ${pid}`)\n }\n }\n\n this._parseVideoData()\n this._parseAudioData()\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 90000\n\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (!data.length) return false\n return data[0] === 0x47 && data[188] === 0x47 && data[376] === 0x47\n }\n\n _parseVideoData () {\n if (!this._videoPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._videoPesData))\n if (!pes) {\n logger.warn('Cannot parse video pes', this._videoPesData)\n return\n }\n\n const units = NALu.parseAnnexB(pes.data)\n if (units) {\n this._createVideoSample(units, pes.pts, pes.dts)\n } else {\n logger.warn('Cannot parse avc units', pes)\n }\n\n this._videoPesData = []\n }\n\n _createVideoSample (units, pts, dts) {\n if (!units.length) return\n const track = this.videoTrack\n const isHevc = track.codecType === VideoCodecType.HEVC\n\n const sample = new VideoSample(pts, dts)\n units.forEach((unit) => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n this._gopId++\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n pts\n ))\n // fix 分割nal之前只要sei信息被当做单独一个sample\n return\n case 32: // HEVC VPS\n if (!isHevc) break\n if (!track.vps.length) {\n const hvcC = HEVC.parseVPS(NALu.removeEPB(unit), track.hvcC)\n track.hvcC = track.hvcC || hvcC\n track.vps = [unit]\n }\n break\n case 7: // SPS\n case 33: // HEVC SPS\n if ((!isHevc && type !== 7) || (isHevc && type === 7)) break\n if (!track.sps.length) {\n const data = NALu.removeEPB(unit)\n const spsInfo = isHevc ? HEVC.parseSPS(data, track.hvcC) : AVC.parseSPS(data)\n track.sps = [unit]\n track.hvcC = track.hvcC || spsInfo.hvcC\n track.codec = spsInfo.codec\n track.width = spsInfo.width\n track.height = spsInfo.height\n track.sarRatio = spsInfo.sarRatio\n track.fpsNum = spsInfo.fpsNum\n track.fpsDen = spsInfo.fpsDen\n }\n break\n case 8: // PPS\n case 34: // HEVC PPS\n if ((!isHevc && type !== 8) || (isHevc && type === 8)) break\n if (!track.pps.length) track.pps = [unit]\n break\n case 9: // AUD\n case 35: // HEVC AUD\n // if ((!isHevc && type !== 9) || (isHevc && type === 9)) break\n // sample.gopId = this._gopId\n // if (sample.units.length && !keyFrame) {\n // this._pushVideoSample(track, sample)\n // sample = this.prevAvcSample = new VideoSample(pts, dts)\n // }\n break\n case 38: // HEVC FD_NUT\n if (isHevc) {\n let ffByteFound = false\n for (let i = 2; i < unit.byteLength; i++) {\n if (unit[i] === 0xff) {\n ffByteFound = true\n break\n }\n }\n if (!ffByteFound) {\n return\n }\n }\n break\n default:\n }\n sample.units.push(unit)\n })\n sample.gopId = this._gopId\n this._pushVideoSample(track, sample)\n }\n\n _pushVideoSample (track, sample) {\n if (sample.units.length) {\n if (sample.pts === null || sample.pts === undefined) {\n logger.warn('Video sample no pts', sample)\n const lastSample = track.samples[track.samples.length - 1]\n if (lastSample) {\n sample.pts = lastSample.pts\n sample.dts = lastSample.dts\n } else {\n logger.warn('Drop video sample', sample)\n }\n } else {\n track.samples.push(sample)\n }\n }\n }\n\n _parseAudioData () {\n if (!this._audioPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._audioPesData))\n if (!pes) {\n logger.warn('Cannot parse audio pes', this._audioPesData)\n return\n }\n\n switch (this.audioTrack.codecType) {\n case AudioCodecType.AAC:\n this._parseAacData(pes)\n break\n case AudioCodecType.MP3:\n this._parseMPEG(pes)\n break\n default:\n }\n\n this._audioPesData = []\n }\n\n _parseAacData (pes) {\n const track = this.audioTrack\n let pts = pes.pts\n if (pts === null || pts === undefined) {\n logger.warn('AAC pes not pts', track)\n if (!track.samples.length || !track.sampleRate) {\n return\n }\n pts = track.samples[track.samples.length - 1].pts + AAC.getFrameDuration(track.sampleRate)\n }\n\n const ret = AAC.parseADTS(pes.data, pts)\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n track.config = ret.config\n track.samples.push(...ret.frames.map((s) => new AudioSample(s.pts, s.data)))\n\n if (ret.skip) {\n logger.warn(`Skip aac adts ${ret.skip} bits`)\n }\n if (ret.remaining) {\n logger.warn(`Remaining aac adts ${ret.remaining} bits`)\n }\n } else {\n logger.warn('Cannot parse aac adts', pes)\n }\n }\n\n _parseMPEG (pes) {\n const data = pes.data\n const length = data.length\n let frameIndex = 0\n let offset = 0\n const pts = pes.pts\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: MPEG PES unknown PTS')\n return\n }\n\n while (offset < length) {\n if (MPEG.isHeader(data, offset)) {\n const frame = MPEG.appendFrame(\n this.audioTrack,\n data,\n offset,\n pts,\n frameIndex\n )\n if (frame) {\n offset += frame.length\n frameIndex++\n } else {\n break\n }\n } else {\n offset++\n }\n }\n }\n\n static _parsePES (data) {\n const headerDataLen = data[8]\n if (headerDataLen === null || headerDataLen === undefined || data.length < (headerDataLen + 9)) return\n const startPrefix = data[0] << 16 | data[1] << 8 | data[2]\n if (startPrefix !== 1) return\n const pesLen = (data[4] << 8) + data[5]\n if (pesLen && pesLen > data.length - 6) return\n\n let pts\n let dts\n const ptsDtsFlags = data[7]\n if (ptsDtsFlags & 0xc0) {\n pts = (data[9] & 0x0e) * 536870912 +\n (data[10] & 0xff) * 4194304 +\n (data[11] & 0xfe) * 16384 +\n (data[12] & 0xff) * 128 +\n (data[13] & 0xfe) / 2\n\n if (ptsDtsFlags & 0x40) {\n dts = (data[14] & 0x0e) * 536870912 +\n (data[15] & 0xff) * 4194304 +\n (data[16] & 0xfe) * 16384 +\n (data[17] & 0xff) * 128 +\n (data[18] & 0xfe) / 2\n if (pts - dts > 60 * 90000) pts = dts\n } else {\n dts = pts\n }\n }\n\n return { data: data.subarray(9 + headerDataLen), pts, dts }\n }\n}\n","export class ByteReader {\n private dv: DataView\n start: number\n offset: number\n end: number\n constructor(buf: ArrayBuffer, offset: number, len: number) {\n this.dv = new DataView(buf)\n this.start = this.offset = offset || this.dv.byteOffset\n this.end = len ? this.start + len : this.start + this.dv.byteLength\n }\n static fromUint8(uint8: Uint8Array) {\n return new ByteReader(uint8.buffer, uint8.byteOffset, uint8.byteLength)\n }\n static concatUint8s(args: Uint8Array[]) {\n const uint8 = new Uint8Array(args.reduce((ret, v) => ret + v.byteLength, 0))\n let offset = 0\n args.forEach((v) => {\n uint8.set(v, offset)\n offset += v.byteLength\n })\n return uint8\n }\n static concatUint8(...args: Uint8Array[]) {\n return this.concatUint8s(args)\n }\n get buffer() {\n return this.dv.buffer\n }\n get unreadLength() {\n return Math.max(this.end - this.offset, 0)\n }\n get size() {\n return this.end - this.start\n }\n readFloat(byteNum: number) {\n let val = 0\n switch (byteNum) {\n case 4:\n val = this.dv.getFloat32(this.offset)\n break\n case 8:\n val = this.dv.getFloat64(this.offset)\n break\n default:\n throw new Error(`read ${byteNum}-byte float is not supported`)\n }\n this.offset += byteNum\n return val\n }\n back(byteNum: number) {\n this.offset -= byteNum\n }\n skip(byteNum: number) {\n this.offset += byteNum\n }\n readInt(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getInt8(offset)\n case 2:\n return this.dv.getInt16(offset)\n case 4:\n return this.dv.getInt32(offset)\n default:\n throw new Error(`read ${byteNum}-byte integers is not supported`)\n }\n }\n read(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getUint8(offset)\n case 2:\n return this.dv.getUint16(offset)\n case 3:\n return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2)\n case 4:\n return this.dv.getUint32(offset)\n default:\n this.back(byteNum - 4)\n // js不支持32位左移,可通过+、Math.pow运算达到64位以内运算的目的\n return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4)\n }\n }\n write(byteNum: number, val: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.setUint8(offset, val)\n case 2:\n return this.dv.setUint16(offset, val)\n case 3:\n return this.dv.setUint8(offset, val >>> 16),\n this.dv.setUint16(offset + 1, 0xffff & val)\n case 4:\n return this.dv.setUint32(offset, val)\n default:\n throw new Error(`write ${byteNum}-byte integers is not supported`)\n }\n }\n readToBuffer(len?: number) {\n let buffer: ArrayBuffer\n if (this.offset || len) {\n buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end)\n } else {\n buffer = this.dv.buffer\n }\n this.offset += buffer.byteLength\n return buffer\n }\n readToUint8(len?: number) {\n const uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength)\n this.offset += uint8.byteLength\n return uint8\n }\n readString(len: number) {\n let i = 0, str = ''\n for (; i < len; i++) {\n str += String.fromCharCode(this.dv.getUint8(this.offset))\n this.offset++\n }\n return str\n }\n}","import { ByteReader } from './byte-reader'\n\nexport class BitReader {\n private val: number\n size: number\n offset = 0\n constructor(val: number, size: number) {\n this.val = val\n this.size = size\n }\n static fromByte(byte: ByteReader, len: number) {\n return new BitReader(byte.read(len), len << 3)\n }\n skip(len: number) {\n this.offset += len\n }\n read(len: number) {\n const unreadLength = this.size - this.offset - len\n\n if (unreadLength >= 0) {\n let bits = 0, i = 0\n this.offset += len\n // 32位及以上的整数不支持位移运算,使用 / + Math.pow 规避\n if (this.size > 31) {\n for (; i < len; i++) {\n bits += Math.pow(2, i)\n }\n return this.val / Math.pow(2, unreadLength) & bits\n } else {\n for (; i < len; i++) {\n bits += 1 << i\n }\n return this.val >>> unreadLength & bits\n }\n }\n throw new Error(`the number of the read operation exceeds the total length limit of bits`)\n }\n}","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64, combineToFloat, toDegree } from '../utils'\nimport { AAC } from '../codec'\nimport { ByteReader } from '../utils/byte-reader'\nimport { BitReader } from '../utils/bit-reader'\nexport class MP4Parser {\n static findBox (data, names, start = 0) {\n const ret = []\n if (!data) return ret\n\n let size = 0\n let type = ''\n let headerSize = 0\n while (data.length > 7) {\n size = readBig32(data)\n type = String.fromCharCode.apply(null, data.subarray(4, 8))\n headerSize = 8\n if (size === 1) {\n size = readBig64(data, 8)\n headerSize += 8\n } else if (!size) {\n size = data.length\n }\n if (!names[0] || type === names[0]) {\n const subData = data.subarray(0, size)\n if (names.length < 2) {\n ret.push({\n start,\n size,\n headerSize,\n type,\n data: subData\n })\n } else {\n return MP4Parser.findBox(subData.subarray(headerSize), names.slice(1), start + headerSize)\n }\n }\n\n start += size\n data = data.subarray(size)\n }\n\n return ret\n }\n\n static tfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.trackId = readBig32(data)\n let start = 4\n const baseDataOffsetPresent = (ret.flags & 0xff) & 0x01\n const sampleDescriptionIndexPresent = (ret.flags & 0xff) & 0x02\n const defaultSampleDurationPresent = (ret.flags & 0xff) & 0x08\n const defaultSampleSizePresent = (ret.flags & 0xff) & 0x10\n const defaultSampleFlagsPresent = (ret.flags & 0xff) & 0x20\n\n if (baseDataOffsetPresent) {\n start += 4 // truncate top 4 bytes\n ret.baseDataOffset = readBig32(data, start)\n start += 4\n }\n if (sampleDescriptionIndexPresent) {\n ret.sampleDescriptionIndex = readBig32(data, start)\n start += 4\n }\n if (defaultSampleDurationPresent) {\n ret.defaultSampleDuration = readBig32(data, start)\n start += 4\n }\n if (defaultSampleSizePresent) {\n ret.defaultSampleSize = readBig32(data, start)\n start += 4\n }\n if (defaultSampleFlagsPresent) {\n ret.defaultSampleFlags = readBig32(data, start)\n }\n })\n }\n\n static sidx (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n ret.reference_ID = readBig32(data, start)// stream.readUint32();\n start += 4\n ret.timescale = readBig32(data, start)\n start += 4\n if (ret.version === 0) {\n ret.earliest_presentation_time = readBig32(data, start)\n start += 4\n ret.first_offset = readBig32(data, start)\n start += 4\n } else {\n ret.earliest_presentation_time = readBig64(data, start)\n start += 8\n ret.first_offset = readBig64(data, start)\n start += 8\n }\n start += 2\n ret.references = []\n const count = readBig16(data, start)\n start += 2\n for (let i = 0; i < count; i++) {\n const ref = {}\n ret.references.push(ref)\n let tmp32 = readBig32(data, start)\n start += 4\n ref.reference_type = (tmp32 >> 31) & 0x1\n ref.referenced_size = tmp32 & 0x7FFFFFFF\n ref.subsegment_duration = readBig32(data, start)\n start += 4\n tmp32 = readBig32(data, start)\n start += 4\n ref.starts_with_SAP = (tmp32 >> 31) & 0x1\n ref.SAP_type = (tmp32 >> 28) & 0x7\n ref.SAP_delta_time = tmp32 & 0xFFFFFFF\n }\n })\n }\n\n static moov (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mvhd = MP4Parser.mvhd(MP4Parser.findBox(data, ['mvhd'], start)[0])\n ret.trak = MP4Parser.findBox(data, ['trak'], start).map(trak => MP4Parser.trak(trak))\n ret.pssh = MP4Parser.pssh(MP4Parser.findBox(data, ['pssh'], start)[0])\n })\n }\n\n static mvhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n ret.nextTrackId = readBig32(data, start + 76)\n })\n }\n\n static trak (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tkhd = MP4Parser.tkhd(MP4Parser.findBox(data, ['tkhd'], start)[0])\n ret.mdia = MP4Parser.mdia(MP4Parser.findBox(data, ['mdia'], start)[0])\n })\n }\n\n static tkhd (box) {\n return parseBox(box, true, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n if (ret.version === 1) {\n byte.read(8) // createTime\n byte.read(8) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(8)\n } else {\n byte.read(4) // createTime\n byte.read(4) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(4)\n }\n byte.skip(16) // reserved(8) + layer(2) + alternateGroup(2) + volume(2) + reserved(2)\n ret.matrix = [] // for remux\n for (let i = 0; i < 36; i++) {\n ret.matrix.push(byte.read(1))\n }\n byte.back(36)\n const caculatedMatrix = [] // for caculation of rotation\n for (let i = 0, int32; i < 3; i++) {\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n int32 = byte.readInt(4)\n caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 0x3fffffff)) // 2.30 fixed point\n }\n ret.rotation = toDegree(caculatedMatrix)\n ret.width = byte.read(4) // 16.16 fixed point, no parsed\n ret.height = byte.read(4) // 16.16 fixed point, no parsed\n })\n }\n\n static mdia (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mdhd = MP4Parser.mdhd(MP4Parser.findBox(data, ['mdhd'], start)[0])\n ret.hdlr = MP4Parser.hdlr(MP4Parser.findBox(data, ['hdlr'], start)[0])\n ret.minf = MP4Parser.minf(MP4Parser.findBox(data, ['minf'], start)[0])\n })\n }\n\n static mdhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n const lang = readBig16(data, start)\n ret.language = String.fromCharCode(((lang >> 10) & 0x1F) + 0x60, ((lang >> 5) & 0x1F) + 0x60, (lang & 0x1F) + 0x60)\n })\n }\n\n static hdlr (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 0) {\n ret.handlerType = String.fromCharCode.apply(null, data.subarray(4, 8))\n }\n })\n }\n\n static minf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.vmhd = MP4Parser.vmhd(MP4Parser.findBox(data, ['vmhd'], start)[0])\n ret.smhd = MP4Parser.smhd(MP4Parser.findBox(data, ['smhd'], start)[0])\n ret.stbl = MP4Parser.stbl(MP4Parser.findBox(data, ['stbl'], start)[0])\n })\n }\n\n static vmhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.graphicsmode = readBig16(data)\n ret.opcolor = [readBig16(data, 2), readBig16(data, 4), readBig16(data, 6)]\n })\n }\n\n static smhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.balance = readBig16(data)\n })\n }\n\n static stbl (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.stsd = MP4Parser.stsd(MP4Parser.findBox(data, ['stsd'], start)[0])\n ret.stts = MP4Parser.stts(MP4Parser.findBox(data, ['stts'], start)[0])\n ret.ctts = MP4Parser.ctts(MP4Parser.findBox(data, ['ctts'], start)[0])\n ret.stsc = MP4Parser.stsc(MP4Parser.findBox(data, ['stsc'], start)[0])\n ret.stsz = MP4Parser.stsz(MP4Parser.findBox(data, ['stsz'], start)[0])\n ret.stco = MP4Parser.stco(MP4Parser.findBox(data, ['stco'], start)[0])\n if (!ret.stco) {\n ret.co64 = MP4Parser.co64(MP4Parser.findBox(data, ['co64'], start)[0])\n ret.stco = ret.co64\n }\n const default_IV_size = ret.stsd.entries[0]?.sinf?.schi?.tenc.default_IV_size\n ret.stss = MP4Parser.stss(MP4Parser.findBox(data, ['stss'], start)[0])\n ret.senc = MP4Parser.senc(MP4Parser.findBox(data, ['senc'], start)[0], default_IV_size)\n })\n }\n\n static senc (box, iv = 8) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n const sampleCount = readBig32(data, start)\n start += 4\n ret.samples = []\n for (let i = 0; i < sampleCount; i++) {\n const sample = {}\n sample.InitializationVector = []\n for (let j = 0; j < iv; j++){\n sample.InitializationVector[j] = data[start + j]\n }\n start += iv\n if (ret.flags & 0x2) {\n sample.subsamples = []\n const subsampleCount = readBig16(data, start)\n start += 2\n for (let j = 0; j < subsampleCount; j++) {\n const subsample = {}\n subsample.BytesOfClearData = readBig16(data, start)\n start += 2\n subsample.BytesOfProtectedData = readBig32(data, start)\n start += 4\n sample.subsamples.push(subsample)\n }\n }\n ret.samples.push(sample)\n }\n })\n }\n\n static pssh (box) {\n return parseBox(box, true, (ret, data) => {\n const keyIds = []\n const systemId = []\n let start = 0\n for (let i = 0; i < 16; i++) {\n systemId.push(toHex(data[start + i]))\n }\n start += 16\n if (ret.version > 0) {\n const numKeyIds = readBig32(data, start)\n start += 4\n for (let i = 0; i < ('' + numKeyIds).length; i++) {\n for (let j = 0; j < 16; j++) {\n const keyId = data[start]\n start += 1\n keyIds.push(toHex(keyId))\n }\n }\n }\n const dataSize = readBig32(data, start)\n ret.data_size = dataSize\n start += 4\n ret.kid = keyIds\n ret.system_id = systemId\n ret.buffer = data\n })\n }\n\n static stsd (box) {\n return parseBox(box, true, (ret, data, start) => {\n ret.entryCount = readBig32(data)\n ret.entries = MP4Parser.findBox(data.subarray(4), [], start + 4).map(b => {\n switch (b.type) {\n case 'av01':\n return MP4Parser.av01(b)\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4':\n return MP4Parser.avc1(b)\n case 'hvc1':\n case 'hev1':\n return MP4Parser.hvc1(b)\n case 'mp4a':\n return MP4Parser.mp4a(b)\n case 'alaw':\n case 'ulaw':\n return MP4Parser.alaw(b)\n case 'enca':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.channelCount = readBig16(data, 16)\n ret.samplesize = readBig16(data, 18)\n ret.sampleRate = (readBig32(data, 24) / (1 << 16))\n data = data.subarray(28)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data, ['esds'], start)[0])\n })\n case 'encv':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n data = data.subarray(78)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(data, ['avcC'], start)[0])\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(data, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(data, ['pasp'], start)[0])\n })\n default:\n }\n }).filter(Boolean)\n })\n }\n\n static tenc (box) {\n return parseBox(box, false, (ret, data) => {\n let start = 6\n ret.default_IsEncrypted = data[start]\n start += 1\n ret.default_IV_size = data[start]\n start += 1\n ret.default_KID = []\n for (let i = 0; i < 16; i++) {\n ret.default_KID.push(toHex(data[start]))\n start += 1\n }\n })\n }\n\n static schi (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tenc = MP4Parser.tenc(MP4Parser.findBox(data, ['tenc'], start)[0])\n })\n }\n\n static sinf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.schi = MP4Parser.schi(MP4Parser.findBox(data, ['schi'], start)[0])\n ret.frma = MP4Parser.frma(MP4Parser.findBox(data, ['frma'], start)[0])\n })\n }\n\n static frma (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data_format = ''\n for (let i = 0; i < 4; i++) {\n ret.data_format += String.fromCharCode(data[i])\n }\n })\n }\n\n static colr (box) {\n return parseBox(box, false, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n ret.data = box.data\n ret.colorType = byte.readString(4)\n // Array.from(data.subarray(0, 4)).map(v => String.fromCharCode(v)).join('')\n if (ret.colorType === 'nclx') {\n ret.colorPrimaries = byte.read(2)\n ret.transferCharacteristics = byte.read(2)\n ret.matrixCoefficients = byte.read(2)\n ret.fullRangeFlag = byte.read(1) >> 7\n } else if (ret.colorType === 'rICC' || ret.colorType === 'prof') {\n ret.iccProfile = data.readToUint8()\n }\n })\n }\n\n static av01 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.av1C = MP4Parser.av1C(MP4Parser.findBox(bodyData, ['av1C'], start)[0])\n ret.colr = MP4Parser.colr(MP4Parser.findBox(bodyData, ['colr'], start)[0])\n })\n }\n\n static av1C (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n\n const byte = ByteReader.fromUint8(data)\n const bit = BitReader.fromByte(byte, 4)\n\n ret.marker = bit.read(1)\n ret.version = bit.read(7)\n\n ret.seqProfile = bit.read(3)\n ret.seqLevelIdx0 = bit.read(5)\n\n ret.seqTier0 = bit.read(1)\n ret.highBitdepth = bit.read(1)\n ret.twelveBit = bit.read(1)\n ret.monochrome = bit.read(1)\n ret.chromaSubsamplingX = bit.read(1)\n ret.chromaSubsamplingY = bit.read(1)\n ret.chromaSamplePosition = bit.read(2)\n ret.reserved = bit.read(3)\n ret.initialPresentationDelayPresent = bit.read(1)\n\n if (ret.initialPresentationDelayPresent) {\n ret.initialPresentationDelayMinusOne = bit.read(4)\n } else {\n ret.initialPresentationDelayMinusOne = 0\n }\n ret.configOBUs = byte.readToUint8()\n\n let bitdepth\n if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {\n bitdepth = ret.twelveBit === 1 ? '12' : '10'\n } else if (ret.seqProfile <= 2) {\n bitdepth = ret.highBitdepth === 1 ? '10' : '08'\n }\n ret.codec = [\n 'av01',\n ret.seqProfile,\n (ret.seqLevelIdx0 < 10 ? '0' + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? 'H' : 'M'),\n bitdepth\n ].join('.')\n })\n }\n\n static avc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(bodyData, ['avcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static avcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.configurationVersion = data[0]\n ret.AVCProfileIndication = data[1]\n ret.profileCompatibility = data[2]\n ret.AVCLevelIndication = data[3]\n ret.codec = getAvcCodec([data[1], data[2], data[3]])\n ret.lengthSizeMinusOne = data[4] & 0x3\n ret.spsLength = data[5] & 0x1F\n ret.sps = []\n let start = 6\n for (let i = 0; i < ret.spsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.sps.push(data.subarray(start, start + size))\n // ret.spsInfo = SpsParser.parseSPS(ret.sps[i])\n // ret.pixelRatio = ret.spsInfo.par_ratio\n start += size\n }\n ret.ppsLength = data[start]\n start += 1\n ret.pps = []\n for (let i = 0; i < ret.ppsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.pps.push(data.subarray(start, start += size))\n start += size\n }\n })\n }\n\n static hvc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(bodyData, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static hvcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.codec = 'hev1.1.6.L93.B0'\n ret.configurationVersion = data[0]\n const tmp = data[1]\n ret.generalProfileSpace = tmp >> 6\n ret.generalTierFlag = (tmp & 0x20) >> 5\n ret.generalProfileIdc = tmp & 0x1F\n ret.generalProfileCompatibility = readBig32(data, 2)\n ret.generalConstraintIndicatorFlags = data.subarray(6, 12)\n ret.generalLevelIdc = data[12]\n ret.avgFrameRate = readBig16(data, 19)\n ret.numOfArrays = data[22]\n ret.vps = []\n ret.sps = []\n ret.pps = []\n let start = 23\n let type = 0\n let numNalus = 0\n let size = 0\n for (let i = 0; i < ret.numOfArrays; i++) {\n type = data[start] & 0x3F\n numNalus = readBig16(data, start + 1)\n start += 3\n const nalus = []\n for (let j = 0; j < numNalus; j++) {\n size = readBig16(data, start)\n start += 2\n nalus.push(data.subarray(start, start + size))\n start += size\n }\n\n if (type === 32) {\n ret.vps.push(...nalus)\n } else if (type === 33) {\n ret.sps.push(...nalus)\n } else if (type === 34) {\n ret.pps.push(...nalus)\n }\n }\n })\n }\n\n static pasp (box) {\n return parseBox(box, false, (ret, data) => {\n ret.hSpacing = readBig32(data)\n ret.vSpacing = readBig32(data, 4)\n })\n }\n\n static mp4a (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseAudioSampleEntry(ret, data)\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data.subarray(bodyStart), ['esds'], start + bodyStart)[0])\n })\n }\n\n static esds (box) {\n return parseBox(box, true, (ret, data) => {\n ret.codec = 'mp4a.'\n let start = 0\n let byteRead = 0\n let size = 0\n let tag = 0\n while (data.length) {\n start = 0\n tag = data[start]\n byteRead = data[start + 1]\n start += 2\n while (byteRead & 0x80) {\n size = (byteRead & 0x7F) << 7\n byteRead = data[start]\n start += 1\n }\n size += byteRead & 0x7F\n if (tag === 3) {\n data = data.subarray(start + 3)\n } else if (tag === 4) {\n ret.codec += (data[start].toString(16) + '.').padStart(3, '0')\n data = data.subarray(start + 13)\n } else if (tag === 5) {\n const config = ret.config = data.subarray(start, start + size)\n let objectType = (config[0] & 0xF8) >> 3\n if (objectType === 31 && config.length >= 2) {\n objectType = 32 + ((config[0] & 0x7) << 3) + ((config[1] & 0xE0) >> 5)\n }\n ret.objectType = objectType\n ret.codec += objectType.toString(16)\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n } else {\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n }\n }\n })\n }\n\n static alaw (box) {\n return parseBox(box, false, (ret, data) => {\n parseAudioSampleEntry(ret, data)\n })\n }\n\n static stts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n delta: readBig32(data, start + 4)\n })\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static ctts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n if (ret.version === 1) {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: readBig32(data, start + 4)\n })\n start += 8\n }\n } else {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: -(~readBig32(data, start + 4) + 1)\n })\n start += 8\n }\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsc (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n firstChunk: readBig32(data, start),\n samplesPerChunk: readBig32(data, start + 4),\n sampleDescriptionIndex: readBig32(data, start + 8)\n })\n start += 12\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsz (box) {\n return parseBox(box, true, (ret, data) => {\n const sampleSize = readBig32(data)\n const sampleCount = readBig32(data, 4)\n const entrySizes = []\n if (!sampleSize) {\n let start = 8\n for (let i = 0; i < sampleCount; i++) {\n entrySizes.push(readBig32(data, start))\n start += 4\n }\n }\n ret.sampleSize = sampleSize\n ret.sampleCount = sampleCount\n ret.entrySizes = entrySizes\n })\n }\n\n static stco (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static co64 (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig64(data, start))\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stss (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static moof (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mfhd = MP4Parser.mfhd(MP4Parser.findBox(data, ['mfhd'], start)[0])\n ret.traf = MP4Parser.findBox(data, ['traf'], start).map(t => MP4Parser.traf(t))\n })\n }\n\n static mfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.sequenceNumber = readBig32(data)\n })\n }\n\n static traf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tfhd = MP4Parser.tfhd(MP4Parser.findBox(data, ['tfhd'], start)[0])\n ret.tfdt = MP4Parser.tfdt(MP4Parser.findBox(data, ['tfdt'], start)[0])\n ret.trun = MP4Parser.trun(MP4Parser.findBox(data, ['trun'], start)[0])\n })\n }\n\n static trun (box) {\n return parseBox(box, true, (ret, data) => {\n const { version, flags } = ret\n const dataLen = data.length\n const sampleCount = ret.sampleCount = readBig32(data)\n let offset = 4\n if (dataLen > offset && flags & 1) {\n ret.dataOffset = -(~readBig32(data, offset) + 1)\n offset += 4\n }\n if (dataLen > offset && flags & 4) {\n ret.firstSampleFlags = readBig32(data, offset)\n offset += 4\n }\n ret.samples = []\n if (dataLen > offset) {\n let sample\n for (let i = 0; i < sampleCount; i++) {\n sample = {}\n if (flags & 0x100) {\n sample.duration = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x200) {\n sample.size = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x400) {\n sample.flags = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x800) {\n if (version) {\n sample.cts = -(~readBig32(data, offset + 4) + 1)\n } else {\n sample.cts = readBig32(data, offset)\n }\n offset += 4\n }\n ret.samples.push(sample)\n }\n }\n })\n }\n\n static tfdt (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 1) {\n ret.baseMediaDecodeTime = readBig64(data)\n } else {\n ret.baseMediaDecodeTime = readBig32(data)\n }\n })\n }\n\n static probe (data) {\n return !!MP4Parser.findBox(data, ['ftyp'])\n }\n\n static parseSampleFlags (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: (flags[2] << 8) | flags[3]\n }\n }\n\n static moovToTrack (moov, videoTrack, audioTrack) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (vTrack && videoTrack) {\n const v = videoTrack\n const _vTrackId = vTrack.tkhd?.trackId\n if (_vTrackId !== null && _vTrackId !== undefined) v.id = vTrack.tkhd.trackId\n v.tkhdDuration = vTrack.tkhd.duration\n v.mvhdDurtion = moov.mvhd.duration\n v.mvhdTimecale = moov.mvhd.timescale\n v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale\n v.duration = vTrack.mdia.mdhd.duration || (v.mvhdDurtion / v.mvhdTimecale * v.timescale)\n v.rotation = vTrack.tkhd.rotation\n v.matrix = vTrack.tkhd.matrix\n const e1 = vTrack.mdia.minf.stbl.stsd.entries[0]\n v.width = e1.width\n v.height = e1.height\n if (e1.pasp) {\n v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing]\n }\n if (e1.av1C) {\n v.codecType = VideoCodecType.AV1\n v.codec = e1.av1C.codec\n v.av1C = e1.av1C.data\n v.colr = e1.colr.data\n } else if (e1.hvcC) {\n v.codecType = VideoCodecType.HEVC\n v.codec = e1.hvcC.codec\n v.vps = e1.hvcC.vps\n v.sps = e1.hvcC.sps\n v.pps = e1.hvcC.pps\n v.hvcC = e1.hvcC.data\n } else if (e1.avcC) {\n v.codec = e1.avcC.codec\n v.sps = e1.avcC.sps\n v.pps = e1.avcC.pps\n } else {\n throw new Error('unknown video stsd entry')\n }\n v.present = true\n v.ext = {}\n v.ext.stss = vTrack.mdia?.minf?.stbl?.stss\n v.ext.ctts = vTrack.mdia?.minf?.stbl?.ctts\n\n if (e1 && e1.type === 'encv') {\n v.isVideoEncryption = true\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n v.videoSenc = vTrack.mdia.minf.stbl.senc && vTrack.mdia.minf.stbl.senc.samples\n e1.data_format = e1.sinf?.frma?.data_format\n v.useEME = moov.useEME\n v.kidValue = moov.kidValue\n v.pssh = moov.pssh\n v.encv = e1\n }\n }\n\n if (aTrack && audioTrack) {\n const a = audioTrack\n const _aTrackId = aTrack.tkhd?.trackId\n if (_aTrackId !== null && _aTrackId !== undefined) a.id = aTrack.tkhd.trackId\n a.tkhdDuration = aTrack.tkhd.duration\n a.mvhdDurtion = moov.mvhd.duration\n a.mvhdTimecale = moov.mvhd.timescale\n a.timescale = a.formatTimescale = aTrack.mdia.mdhd.timescale\n a.duration = aTrack.mdia.mdhd.duration || (a.mvhdDurtion / a.mvhdTimecale * a.timescale)\n const e1 = aTrack.mdia.minf.stbl.stsd.entries[0]\n a.sampleSize = e1.sampleSize\n a.sampleRate = e1.sampleRate\n a.channelCount = e1.channelCount\n a.present = true\n\n switch (e1.type) {\n case 'alaw':\n a.codecType = a.codec = AudioCodecType.G711PCMA\n a.sampleRate = 8000\n break\n case 'ulaw':\n a.codecType = a.codec = AudioCodecType.G711PCMU\n a.sampleRate = 8000\n break\n default:\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) a.config = Array.from(e1.esds.config)\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n break\n }\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) {\n if (e1.esds.config) {\n a.config = Array.from(e1.esds.config)\n } else {\n console.warn('esds config is null')\n }\n }\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.ext = {}\n a.ext.stss = aTrack.mdia?.minf?.stbl?.stss\n a.ext.ctts = aTrack.mdia?.minf?.stbl?.ctts\n a.present = true\n if (e1 && e1.type === 'enca') {\n a.isAudioEncryption = true\n e1.data_format = e1.sinf?.frma?.data_format\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n a.audioSenc = aTrack.mdia.minf.stbl.senc && aTrack.mdia.minf.stbl.senc.samples\n a.useEME = moov.useEME\n a.kidValue = moov.kidValue\n a.enca = e1\n }\n }\n\n audioTrack && (audioTrack.isVideoEncryption = videoTrack ? videoTrack.isVideoEncryption : false)\n videoTrack && (videoTrack.isAudioEncryption = audioTrack ? audioTrack.isAudioEncryption : false)\n\n if (videoTrack?.encv || audioTrack?.enca) {\n const vkid = videoTrack?.encv?.default_KID\n const akid = audioTrack?.enca?.default_KID\n const kid = (vkid || akid) ? (vkid || akid).join('') : null\n videoTrack && (videoTrack.kid = kid)\n audioTrack && (audioTrack.kid = kid)\n }\n\n videoTrack && (videoTrack.flags = 0xf01)\n audioTrack && (audioTrack.flags = 0x701)\n\n return {\n videoTrack,\n audioTrack\n }\n }\n\n static evaluateDefaultDuration (videoTrack, audioTrack, videoSampleCount) {\n const audioSampleCount = audioTrack?.samples?.length\n\n // audio\n if (!audioSampleCount) return 1024\n\n const segmentDuration = 1024 * audioSampleCount / audioTrack.timescale\n\n return segmentDuration * videoTrack.timescale / videoSampleCount\n }\n\n static moofToSamples (moof, videoTrack, audioTrack) {\n const ret = {}\n\n if (moof.mfhd) {\n if (videoTrack) videoTrack.sequenceNumber = moof.mfhd.sequenceNumber\n if (audioTrack) audioTrack.sequenceNumber = moof.mfhd.sequenceNumber\n }\n\n moof.traf.forEach(({ tfhd, tfdt, trun }) => {\n if (!tfhd || !trun) return\n if (tfdt) {\n if (videoTrack && videoTrack.id === tfhd.trackId) videoTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n if (audioTrack && audioTrack.id === tfhd.trackId) audioTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n }\n const defaultSize = tfhd.defaultSampleSize || 0\n const defaultDuration = tfhd.defaultSampleDuration || MP4Parser.evaluateDefaultDuration(videoTrack, audioTrack, trun.samples.length || trun.sampleCount)\n let offset = trun.dataOffset || 0\n let dts = 0\n let gopId = -1\n if (!trun.samples.length && trun.sampleCount) {\n ret[tfhd.trackId] = []\n for (let i = 0; i < trun.sampleCount; i++) {\n ret[tfhd.trackId].push({\n offset,\n dts,\n duration: defaultDuration,\n size: defaultSize\n })\n dts += defaultDuration\n offset += defaultSize\n }\n } else {\n ret[tfhd.trackId] = trun.samples.map((s, index) => {\n s = {\n offset,\n dts,\n pts: dts + (s.cts || 0),\n duration: s.duration || defaultDuration,\n size: s.size || defaultSize,\n gopId,\n keyframe: index === 0 || ((s.flags !== null && s.flags !== undefined) && ((s.flags & 65536) >>> 0) !== 65536)\n }\n if (s.keyframe) {\n gopId++\n s.gopId = gopId\n }\n dts += s.duration\n offset += s.size\n return s\n })\n }\n })\n\n return ret\n }\n\n static moovToSamples (moov) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!vTrack && !aTrack) return\n let videoSamples\n let audioSamples\n if (vTrack) {\n const videoStbl = vTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!stts || !stsc || !stsz || !stco || !stss) return\n videoSamples = getSamples(stts, stsc, stsz, stco, ctts, stss)\n }\n if (aTrack) {\n const audioStbl = aTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = aTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSamples = getSamples(stts, stsc, stsz, stco)\n }\n\n return {\n videoSamples,\n audioSamples\n }\n }\n}\n\nfunction getSamples (stts, stsc, stsz, stco, ctts, stss) {\n const samples = []\n const cttsEntries = ctts?.entries\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n\n let sample\n let gopId = -1\n let dts = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n stts.entries.forEach(({ count, delta }) => {\n for (let i = 0; i < count; i++) {\n sample = {\n dts,\n duration: delta,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n sample.keyframe = keyframeMap[pos]\n if (sample.keyframe) {\n gopId++\n }\n sample.gopId = gopId\n }\n // sample.timeOffset = 0\n if (cttsArr && pos < cttsArr.length) {\n sample.pts = sample.dts + cttsArr[pos]\n // sample.timeOffset = cttsArr[pos]\n // if (pos === 0) {\n // sample.pts = sample.dts\n // sample.timeOffset = 0\n // }\n }\n samples.push(sample)\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += sample.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n return samples\n}\n\nfunction parseVisualSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n ret.frameCount = readBig16(data, 40)\n ret.depth = readBig16(data, 74)\n return 78\n}\n\nfunction parseAudioSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.channelCount = readBig16(data, 16)\n ret.sampleSize = readBig16(data, 18)\n ret.sampleRate = readBig32(data, 24) / (1 << 16)\n return 28\n}\n\nfunction parseBox (box, isFullBox, parse) {\n if (!box) return\n if (box.size !== box.data.length) {\n throw new Error(`box ${box.type} size !== data.length`)\n }\n const ret = {\n start: box.start,\n size: box.size,\n headerSize: box.headerSize,\n type: box.type\n }\n if (isFullBox) {\n ret.version = box.data[box.headerSize]\n ret.flags = readBig24(box.data, box.headerSize + 1)\n ret.headerSize += 4\n }\n parse(ret, box.data.subarray(ret.headerSize), ret.start + ret.headerSize)\n return ret\n}\n\nconst padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\nconst toHex = function (...value) {\n const hex = []\n value.forEach(item => {\n hex.push(padStart(Number(item).toString(16), 2, 0))\n })\n return hex[0]\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, VideoSample, AudioSample } from '../model'\nimport { concatUint8Array, readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\n\nexport class FMP4Demuxer {\n __loadedMoofWraps = []\n __lastRemainData = null\n __lastRemainDataStart = 0\n __nextMoofStart = -1\n\n\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n }\n\n demuxPart (partData, partDataStart, moov) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n\n const isAV01 = /av01/.test(videoTrack.codec)\n videoTrack.samples = []\n audioTrack.samples = []\n\n let data = partData\n let dataStart = partDataStart\n if (this.__lastRemainData) {\n const lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength\n // 如果遗留数据和新数据之间存在非包含关系的重叠,则需要合并,否则丢弃遗留数据\n // 如果遗留数据和新数据之间不存在重叠,需要丢弃遗留数据,保证后续的新数据可以连续的解析\n const continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd\n if (continuous) {\n // data = 遗留数据 + 新数据,为了程序健壮性,即可能存在重复的range,需要subarray规避\n const noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart)\n data = concatUint8Array(this.__lastRemainData, noDuplicateData)\n dataStart = this.__lastRemainDataStart\n this.__lastRemainData = null\n } else {\n this.__lastRemainData = null\n this.__lastRemainDataStart = 0\n this.__nextMoofStart = -1\n }\n }\n\n if (!moov) {\n const moovBox = MP4Parser.findBox(data, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n moov = MP4Parser.moov(moovBox)\n }\n\n if (data) {\n const dataEnd = dataStart + data.byteLength\n if (!videoExist && !audioExist) {\n MP4Parser.moovToTrack(moov, videoTrack, audioTrack)\n }\n // findBox要求参数由box header作为起始,故需要定位到moof的起始点,通过前一个moof计算出下一个moof的start位置,并保证解析的内容大于header的长度(8)\n const moofBoxes = []\n if (this.__nextMoofStart < 0) {\n MP4Parser.findBox(data, ['moof'], dataStart).forEach(v => moofBoxes.push(v))\n } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {\n MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ['moof'], this.__nextMoofStart).forEach(v => moofBoxes.push(v))\n }\n moofBoxes.filter(moofBox => moofBox.size <= moofBox.data.length).forEach(moofBox => {\n const moof = MP4Parser.moof(moofBox)\n // 通过(trun.dataOffset + all samples的合并值)最大值计算得到下一个moof.start,也可以通过mdat box获取,此处为前者逻辑\n this.__nextMoofStart = moof.start + Math.max(...moof.traf.map(v => v.trun.samples.reduce((ret, w) => ret + w.size, v.trun.dataOffset || 0)))\n this.__loadedMoofWraps.push({\n start: moof.start,\n nextMoofStart: this.__nextMoofStart,\n moof\n })\n this.__loadedMoofWraps.sort((p, n) => p.start - n.start) // 排序,兼容seek\n })\n\n for (const moofWrap of this.__loadedMoofWraps) {\n // 跳过不需要解析的moof,减少非必要的损耗\n if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {\n continue\n }\n const moofStart = moofWrap.start\n const tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack)\n\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line\n if (videoTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset += moofStart\n if (xStart < dataStart) {\n return\n }\n // 如果当前sample已经超过了数据范围,则中断遍历\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n sample.data = sampleData\n if (!isAV01) { // av1编码的数据不需要解析nals\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n }\n this.__lastRemainDataStart = xStart + x.size\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset + moofStart\n if (xStart < dataStart) {\n return\n }\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n this.__lastRemainDataStart = xStart + x.size\n })\n }\n })\n }\n }\n\n // 保存未解析的数据,下次解析时合并使用\n if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {\n this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart)\n } else {\n this.__lastRemainData = data\n this.__lastRemainDataStart = dataStart\n }\n\n // fmp4中sample.pts是通过tfdt的baseMediaDecodeTime + sample.duration计算得出的\n // 所以此处sample的pts是多少不重要,反而需要确保demuxPart中baseMediaDecodeTime的值为起始帧的pts,才能保证remux后解析的结果与原始数据一致\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n demux (videoData, audioData) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n videoTrack.samples = []\n audioTrack.samples = []\n\n if (audioData) {\n if (!audioExist) {\n const moovBox = MP4Parser.findBox(audioData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), null, audioTrack)\n }\n const moofBox = MP4Parser.findBox(audioData, ['moof'])[0]\n if (moofBox) {\n const samples = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), null, audioTrack)[audioTrack.id]\n const baseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n if (samples) {\n const baseOffset = moofBox.start\n samples.map(x => {\n x.offset += baseOffset\n const sampleData = audioData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + baseMediaDecodeTime, sampleData, x.duration))\n })\n }\n }\n }\n\n if (videoData) {\n if (!videoExist && !audioExist) {\n const moovBox = MP4Parser.findBox(videoData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), videoTrack, audioTrack)\n }\n const moofBox = MP4Parser.findBox(videoData, ['moof'])[0]\n if (moofBox) {\n const tracks = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), videoTrack, audioTrack)\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n const baseOffset = moofBox.start\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line eqeqeq\n if (videoTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n sample.data = sampleData\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n })\n }\n })\n }\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { AudioCodecType, TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse } from '../utils'\nimport Buffer from './buffer'\n\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'Opus',\n 'dOps',\n 'av01',\n 'av1C',\n 'avc1',\n 'avcC',\n 'hvc1',\n 'hvcC',\n 'dinf',\n 'dref',\n 'esds',\n 'ftyp',\n 'hdlr',\n 'mdat',\n 'mdhd',\n 'mdia',\n 'mfhd',\n 'minf',\n 'moof',\n 'moov',\n 'mp4a',\n 'mvex',\n 'mvhd',\n 'pasp',\n 'stbl',\n 'stco',\n 'stsc',\n 'stsd',\n 'stsz',\n 'stts',\n 'tfdt',\n 'tfhd',\n 'traf',\n 'trak',\n 'trex',\n 'tkhd',\n 'vmhd',\n 'smhd',\n 'ctts',\n 'stss',\n 'styp',\n 'pssh',\n 'sidx',\n 'sbgp',\n 'saiz',\n 'saio',\n 'senc',\n 'trun',\n 'encv',\n 'enca',\n 'sinf',\n 'btrt',\n 'frma',\n 'tenc',\n 'schm',\n 'schi',\n 'mehd',\n 'fiel',\n 'sdtp'\n ].reduce((p, c) => {\n p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)]\n return p\n }, Object.create(null));\n\n static HDLR_TYPES = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ])\n }\n\n static FTYPAVC1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 97, 118, 99, 49 // avc1\n ]))\n\n static FTYPHEV1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 104, 101, 118, 49 // hev1\n ]))\n\n static DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version\n 0x00, 0x00, 0x01 // entry_flags\n ])))\n\n static VMHD = MP4.box(MP4.types.vmhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // op color\n ]))\n\n static SMHD = MP4.box(MP4.types.smhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]))\n\n static StblTable = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ])\n\n static STTS = MP4.box(MP4.types.stts, MP4.StblTable)\n\n static STSC = MP4.box(MP4.types.stsc, MP4.StblTable)\n\n static STSZ = MP4.box(MP4.types.stsz, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]))\n\n static STCO = MP4.box(MP4.types.stco, MP4.StblTable)\n\n static box (type, ...payload) {\n payload = payload.filter(Boolean)\n const size = 8 + payload.reduce((p, c) => (p + c.byteLength), 0)\n const ret = new Uint8Array(size)\n ret[0] = (size >> 24) & 0xff\n ret[1] = (size >> 16) & 0xff\n ret[2] = (size >> 8) & 0xff\n ret[3] = size & 0xff\n ret.set(type, 4)\n let offset = 8\n payload.forEach((data) => {\n ret.set(data, offset)\n offset += data.byteLength\n })\n return ret\n }\n\n static ftyp (tracks) {\n const isHevc = tracks.find(t => t.type === TrackType.VIDEO && t.codecType === VideoCodecType.HEVC)\n return isHevc ? MP4.FTYPHEV1 : MP4.FTYPAVC1\n }\n\n static initSegment (tracks) {\n const ftyp = MP4.ftyp(tracks)\n // console.log('[remux],ftyp ,len ', ftyp.byteLength, hashVal(ftyp.toString()))\n const init = concatUint8Array(ftyp, MP4.moov(tracks))\n // console.log('[remux],init ,len ', init.byteLength, hashVal(init.toString()))\n return init\n }\n\n static pssh (data) {\n // const buffer = new Buffer()\n const content = new Uint8Array(\n [\n 0x01, 0x00, 0x00, 0x00 // version\n ].concat(\n [\n 0x10, 0x77, 0xef, 0xec,\n 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e,\n 0x52, 0xe2, 0xfb, 0x4b\n ],\n [0x00, 0x00, 0x00, 0x01],\n parse(data.kid),\n [0x00, 0x00, 0x00, 0x00]\n )\n )\n return MP4.box(MP4.types.pssh, content)\n }\n\n static moov (tracks) {\n if (tracks[0].useEME && (tracks[0].encv || tracks[0].enca)) {\n if (!tracks[0].pssh) {\n tracks[0].pssh = {\n kid: tracks[0].kid\n }\n }\n const pssh = this.pssh(tracks[0].pssh)\n // console.log('[remux],pssh,', hashVal(pssh.toString()))\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n MP4.mvex(tracks),\n ...tracks.map((t) => MP4.trak(t)),\n pssh)\n } else {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n ...tracks.map((t) => MP4.trak(t)),\n MP4.mvex(tracks)\n )\n }\n }\n\n static mvhd (duration, timescale = 90000) {\n const mvhd = MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x01, 0x00, 0x00, // rate\n 0x01, 0x00, // volume\n 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff // todo 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]))\n // console.log('[remux],mvhd, len,', mvhd.byteLength, hashVal(mvhd.toString()))\n return mvhd\n }\n\n static trak (track) {\n const trak = MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.tkhdDuration || 0, track.width, track.height),\n MP4.mdia(track)\n )\n // console.log('[remux],trak, len,', trak.byteLength, track.id, hashVal(trak.toString()))\n return trak\n }\n\n static tkhd (id, duration, width = 0, height = 0) {\n const tkhd = MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x07, // flags、todo 0x07\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time todo\n (id >> 24) & 0xff, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff,\n 0x00, 0x00, 0x00, 0x00,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // todo (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // /*0x00*/ alternate_group //todo type === 'video' ? 0x01 : 0x00(第二个位置)\n 0x01, 0x00, // /* 0x01 */, 0x00, // non-audio track volume //todo type === 'audio' ? 0x01 : 0x00(第一个位置)\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n (width >> 8) & 0xff, width & 0xff, 0x00, 0x00,\n (height >> 8) & 0xff, height & 0xff, 0x00, 0x00\n ]))\n // console.log('[remux],tkhd, len,', tkhd.byteLength, hashVal(tkhd.toString()))\n return tkhd\n }\n\n static mdia (track) {\n const mdia = MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minf(track))\n // console.log('[remux],mdia, len,', mdia.byteLength, hashVal(mdia.toString()))\n return mdia\n }\n\n static mdhd (duration, timescale = 90000) {\n const mdhd = MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // todo 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,//todo\n 0x55, 0xc4, // 'und' language (undetermined) //todo 0x15, 0xC7\n 0x00, 0x00 // pre_defined\n ]))\n // console.log('[remux],mdhd, len,', mdhd.byteLength, hashVal(mdhd.toString()))\n return mdhd\n }\n\n static hdlr (type) {\n const hdlr = MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type])\n // console.log('[remux],hdlr, len,', hdlr.byteLength, hashVal(hdlr.toString()))\n return hdlr\n }\n\n static minf (track) {\n const minf = MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stbl(track))\n // console.log('[remux],minf, len,', minf.byteLength, hashVal(minf.toString()))\n return minf\n }\n\n static stbl (track) {\n const extBox = []\n if (track && track.ext) {\n track.ext.stss && extBox.push(MP4.stss(track.ext.stss.entries))\n // track.ext.stss && extBox.push(MP4.ctts(track.ext.stss.entries))\n }\n const stbl = MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.STTS, extBox[0], MP4.STSC, MP4.STSZ, MP4.STCO)\n // console.log('[remux],stbl, len,', stbl.byteLength, hashVal(stbl.toString()))\n return stbl\n }\n\n static stsd (track) {\n let content\n\n if (track.type === 'audio') {\n if (track.useEME && track.enca) {\n content = MP4.enca(track)\n // console.log('[remux],enca, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n if (track.codecType === AudioCodecType.OPUS) {\n content = MP4.opus(track)\n } else {\n content = MP4.mp4a(track)\n }\n }\n } else if (track.useEME && track.encv) {\n content = MP4.encv(track)\n // console.log('[remux],encv, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else if (track.av1C) {\n content = MP4.av01(track)\n } else {\n content = MP4.avc1hev1(track)\n // console.log('[remux],avc1hev1, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n const stsd = MP4.box(MP4.types.stsd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]), content)\n // console.log('[remux],stsd, len,', stsd.byteLength, hashVal(stsd.toString()))\n return stsd\n }\n\n static enca (data) {\n const channelCount = data.enca.channelCount\n const sampleRate = data.enca.sampleRate\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n (sampleRate >> 8) & 0xff,\n sampleRate & 0xff, //\n 0x00, 0x00\n ])\n const esds = MP4.esds(data.config)\n // console.log('[remux],esds, len,', esds.byteLength, hashVal(esds.toString()))\n const sinf = MP4.sinf(data.enca)\n // console.log('[remux],sinf, len,', sinf.byteLength, hashVal(sinf.toString()))\n return MP4.box(MP4.types.enca, content, esds, sinf)\n }\n\n static encv (track) {\n const sps = track.sps.length > 0 ? track.sps[0] : []\n const pps = track.pps.length > 0 ? track.pps[0] : []\n const width = track.width\n const height = track.height\n const hSpacing = track.sarRatio[0]\n const vSpacing = track.sarRatio[1]\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n\n 0x12,\n 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74,\n 0x69, 0x6F, 0x6E, 0x2F,\n 0x68, 0x6C, 0x73, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]) // pre_defined = -1;\n const avcc = new Uint8Array([\n 0x01, // version\n sps[1], // profile\n sps[2], // profile compatible\n sps[3], // level\n 0xfc | 3,\n 0xE0 | 1, // 目前只处理一个sps\n sps.length >>> 8 & 0xff,\n sps.length & 0xff\n ].concat(...sps).concat([\n 0x01,\n pps.length >>> 8 & 0xff,\n pps.length & 0xff\n ]).concat(...pps))\n const btrt = new Uint8Array([\n 0x00, 0x00, 0x58, 0x39,\n 0x00, 0x0F, 0xC8, 0xC0,\n 0x00, 0x04, 0x56, 0x48\n ])\n const sinf = MP4.sinf(track.encv)\n const pasp = new Uint8Array([\n (hSpacing >> 24), // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n (vSpacing >> 24), // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff\n ])\n return MP4.box(MP4.types.encv, content, MP4.box(MP4.types.avcC, avcc), MP4.box(MP4.types.btrt, btrt), sinf, MP4.box(MP4.types.pasp, pasp))\n }\n\n static schi (data) {\n const content = new Uint8Array([])\n const tenc = MP4.tenc(data)\n return MP4.box(MP4.types.schi, content, tenc)\n }\n\n static tenc (data) {\n // 用于每个track的加密参数(包括KID、初始化向量、加密标志位),包含在TrackEncryptionBox(‘tenc’)中。\n const content = new Uint8Array(\n [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // skip\n data.default_IsEncrypted & 0xff, // default_isProtected\n data.default_IV_size & 0xff // default_Per_Sample_IV_Size\n ].concat(parse(data.default_KID)))\n return MP4.box(MP4.types.tenc, content)\n }\n\n static sinf (data) {\n const content = new Uint8Array([])\n const frma = new Uint8Array([\n data.data_format.charCodeAt(0),\n data.data_format.charCodeAt(1),\n data.data_format.charCodeAt(2),\n data.data_format.charCodeAt(3)\n ])\n const schm = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x63, 0x65, 0x6E, 0x63, // cenc\n 0x00, 0x01, 0x00, 0x00 // version\n ])\n const schi = MP4.schi(data)\n return MP4.box(MP4.types.sinf, content, MP4.box(MP4.types.frma, frma), MP4.box(MP4.types.schm, schm), schi)\n }\n static av01 (track) {\n return MP4.box(MP4.types.av01, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), track.av1C, track.colr)\n }\n static avc1hev1 (track) {\n const isHevc = track.codecType === VideoCodecType.HEVC\n const typ = isHevc ? MP4.types.hvc1 : MP4.types.avc1\n const config = isHevc ? MP4.hvcC(track) : MP4.avcC(track)\n const boxes = [\n new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), config\n ]\n // console.log('[remux],avc1hev1_0, len,', boxes[0].byteLength, hashVal(boxes[0].toString()))\n // console.log('[remux],avc1hev1_1, len,', boxes[1].byteLength, hashVal(boxes[1].toString()))\n if (isHevc) {\n boxes.push(MP4.box(MP4.types.fiel, new Uint8Array([0x01, 0x00])))\n // console.log('[remux],fiel, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n } else if (track.sarRatio && track.sarRatio.length > 1) {\n boxes.push(MP4.pasp(track.sarRatio))\n // console.log('[remux],pasp, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n }\n return MP4.box(typ, ...boxes)\n }\n\n static avcC (track) {\n const sps = []\n const pps = []\n\n let len\n track.sps.forEach((s) => {\n len = s.byteLength\n sps.push((len >>> 8) & 0xff)\n sps.push(len & 0xff)\n sps.push(...s)\n })\n\n track.pps.forEach((p) => {\n len = p.byteLength\n pps.push((len >>> 8) & 0xff)\n pps.push(len & 0xff)\n pps.push(...p)\n })\n\n return MP4.box(MP4.types.avcC, new Uint8Array([\n 0x01, // configurationVersion\n sps[3], // AVCProfileIndication\n sps[4], // profile_compatibility\n sps[5], // AVCLevelIndication\n 0xfc | 3, // lengthSizeMinusOne\n 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(...sps)\n .concat([track.pps.length]) // numOfPictureParameterSets\n .concat(...pps)))\n }\n\n static hvcC (track) {\n const hvcC = track.hvcC\n if (hvcC instanceof ArrayBuffer || hvcC instanceof Uint8Array) return hvcC\n const { vps, sps, pps } = track\n let data\n if (hvcC) {\n const pcf = hvcC.generalProfileCompatibilityFlags\n const cif = hvcC.generalConstraintIndicatorFlags\n const numOfArrays = (vps.length && 1) + (sps.length && 1) + (pps.length && 1)\n data = [\n 0x01, // configurationVersion\n hvcC.generalProfileSpace << 6 | hvcC.generalTierFlag << 5 | hvcC.generalProfileIdc,\n pcf >>> 24, pcf >>> 16, pcf >>> 8, pcf,\n cif[0], cif[1], cif[2], cif[3], cif[4], cif[5],\n hvcC.generalLevelIdc,\n 0xF0, 0x00, // min_spatial_segmentation_idc\n 0xFC, // parallelismType\n hvcC.chromaFormatIdc | 0xFC,\n hvcC.bitDepthLumaMinus8 | 0xF8,\n hvcC.bitDepthChromaMinus8 | 0xF8,\n 0x00, 0x00, // avgFrameRate\n hvcC.numTemporalLayers << 3 | hvcC.temporalIdNested << 2 | 3,\n numOfArrays\n ]\n const write = (x) => {\n data.push(x.length >> 8, x.length)\n data.push(...x)\n }\n if (vps.length) {\n data.push(0xA0, 0x00, vps.length)\n vps.forEach(write)\n }\n if (sps.length) {\n data.push(0xA1, 0x00, sps.length)\n sps.forEach(write)\n }\n if (pps.length) {\n data.push(0xA2, 0x00, pps.length)\n pps.forEach(write)\n }\n } else {\n data = [\n 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02,\n 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,\n 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40\n ]\n }\n return MP4.box(MP4.types.hvcC, new Uint8Array(data))\n }\n\n static pasp ([hSpacing, vSpacing]) {\n return MP4.box(MP4.types.pasp, new Uint8Array([\n hSpacing >> 24, (hSpacing >> 16) & 0xff, (hSpacing >> 8) & 0xff, hSpacing & 0xff,\n vSpacing >> 24, (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff\n ]))\n }\n\n static mp4a (track) {\n return MP4.box(MP4.types.mp4a, new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, track.channelCount,\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff, track.sampleRate & 0xff,\n 0x00, 0x00\n ]), track.config.length ? MP4.esds(track.config) : undefined)\n }\n\n static esds (config) {\n const len = config.length\n const esds = MP4.box(MP4.types.esds, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x03, // tag\n 0x17 + len, // length\n 0x00, 0x00, // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n 0x04, // tag\n 0x0f + len, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x06, 0x00, // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0, // maxBitrate\n 0x00, 0x00, 0xda, 0xc0, // avgBitrate\n 0x05 // tag, DecoderSpecificInfoTag\n ].concat([len])\n .concat(config)\n .concat(\n [0x06, 0x01, 0x02]// GASpecificConfig\n )\n ))\n // console.log('[remux],esds ,len ', esds.byteLength, hashVal(esds.toString()))\n return esds\n }\n\n /**\n * https://opus-codec.org/docs/opus_in_isobmff.html\n */\n static opus (track) {\n const opusAudioDescription = new Uint8Array([\n 0x00, 0x00, 0x00, // version\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n track.channelCount,\n 0x00, 0x10, // sampleSize\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff,\n track.sampleRate & 0xff, // sampleRate\n 0x00, 0x00\n ])\n\n const opusSpecificConfig = track.config.length ? MP4.dOps(track) : []\n return MP4.box(MP4.types.Opus, opusAudioDescription, opusSpecificConfig)\n }\n\n static dOps (track) {\n if (track.config) {\n track.config[4] = (track.sampleRate >>> 24) & 0xFF\n track.config[5] = (track.sampleRate >>> 16) & 0xFF\n track.config[6] = (track.sampleRate >>> 8) & 0xFF\n track.config[7] = (track.sampleRate) & 0xFF\n\n return MP4.box(MP4.types.dOps, track.config)\n }\n\n // const {channelCount, channelConfigCode, sampleRate } = track\n\n // const mapping = channelConfigCode?.map((c) => {\n // return [\n // (c >>> 4) & 0xFF, // Channel mapping family\n // c & 0xFF // Channel mapping index\n // ]\n // }).flat() || []\n\n // const data = new Uint8Array([\n // 0x00, // version\n // channelCount, // channelCount\n // 0x00, 0x00, // preSkip\n // (sampleRate >>> 24) & 0xFF,\n // (sampleRate >>> 17) & 0xFF,\n // (sampleRate >>> 8) & 0xFF,\n // (sampleRate >>> 0) & 0xFF,\n // 0x00, 0x00, // Global Gain\n // ... mapping\n // ])\n\n // return data\n }\n\n static mvex (tracks) {\n // const mehd = MP4.box(MP4.types.mehd, this.extension(0, 0), Buffer.writeUint32(tracks[0].tkhdDuration))\n // const mvex = MP4.box(MP4.types.mvex, mehd, MP4.trex1(1), MP4.trex2(2))\n // // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n // const mvex = MP4.box(MP4.types.mvex, MP4.trex1(1), MP4.trex2(2))\n const mvex = MP4.box(MP4.types.mvex, ...tracks.map((t) => MP4.trex(t.id)))\n // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n return mvex\n }\n\n static trex (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex1 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x02, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex2 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x04, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x02, 0x00, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static moof (tracks) {\n const moof = MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].samples ? tracks[0].samples[0].gopId : 0), ...tracks.map((t) => MP4.traf(t)))\n // console.log('[remux],moof, len', moof.byteLength)\n return moof\n // return MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].gopId), ...tracks.map((t) => MP4.traf(t)))\n }\n\n static mfhd (sequenceNumber) {\n // sequenceNumber += 1\n const mfhd = MP4.box(MP4.types.mfhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n sequenceNumber >> 24, (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff\n ]))\n // console.log('[remux],mfhd, len,', mfhd.byteLength, hashVal(mfhd.toString()))\n return mfhd\n }\n\n static traf (track) {\n const tfhd = MP4.tfhd(track.id)\n // console.log('[remux],tfhd, len,', tfhd.byteLength, hashVal(tfhd.toString()), ', trackid = ', track.id)\n // console.log('[remux],tfdt,baseMediaDecodeTime,', track.baseMediaDecodeTime)\n const tfdt = MP4.tfdt(track, track.baseMediaDecodeTime)\n let sencLength = 0\n let samples\n if (track.isVideo && track.videoSenc) {\n samples = track.videoSenc\n samples.forEach(function (item) {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n track.videoSencLength = sencLength\n // console.log('[remux],tfdt, len,', tfdt.toString().length)\n // console.log('[remux],tfdt, len,', tfdt.byteLength, hashVal(tfdt.toString()))\n if (!track.useEME || (!track.isVideoEncryption && !track.isAudioEncryption)) {\n const sdtp = MP4.sdtp(track)\n // console.log('[remux],sdtp, len,', sdtp.byteLength, hashVal(sdtp.toString()))\n const offset = 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8 // mdat header\n return MP4.box(MP4.types.traf, tfhd, tfdt, sdtp, MP4.trun(track.samples, sdtp.byteLength + offset))\n } else if (track.isVideoEncryption) {\n if (track.isVideo) {\n // 加密视频\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const trun = MP4.trun1(track)\n const senc = MP4.senc(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, saiz, saio, trun, senc)\n // console.log('[remux],trex_video, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n } else {\n // 视频加密,音频加密和未加密处理\n if (!track.isAudioEncryption) {\n // 音频未加密\n const sbgp = MP4.sbgp()\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, trun)\n } else {\n // 音频加密\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex_audio, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n } else {\n // 视频未加密,音频加密\n if (track.isVideo) {\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun)\n } else {\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n }\n\n static sdtp (data) {\n const buffer = new Buffer()\n data.samples.forEach(item => {\n buffer.write(new Uint8Array(data.isVideo ? [item.keyframe ? 32 : 16] : [16]))\n })\n return MP4.box(MP4.types.sdtp, this.extension(0, 0), buffer.buffer)\n }\n\n static trun1 (data) {\n // const id = data.id\n // const ceil = id === 1 ? 12 : 4\n const buffer = new Buffer()\n const sampleCount = Buffer.writeUint32(data.samples.length)\n let offset = null\n if (data.isVideo) {\n const sencLength = data.videoSencLength\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 17 + //saiz\n 24 + //saio\n data.samples.length*16\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 12(header) + sencLength //senc\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n = 149+data.samples.length * 16 + sencLength\n */\n offset = Buffer.writeUint32(data.samples.length * 16 + sencLength + 149)\n if (!data.isVideoEncryption && data.isAudioEncryption) {\n offset = Buffer.writeUint32(data.samples.length * 16 + 92)\n }\n } else {\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 28 + //sbgp\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n */\n let len = data.samples.length * 12 + 124\n if (data.isAudioEncryption) {\n len = data.samples.length * 12 + 8 * data.audioSenc.length + 177\n }\n offset = Buffer.writeUint32(len)\n }\n\n data.samples.forEach(item => {\n buffer.write(Buffer.writeUint32(item.duration))\n buffer.write(Buffer.writeUint32(item.size))\n buffer.write(Buffer.writeUint32(item.keyframe ? 0x02000000 : 0x00010000))\n if (data.isVideo) {\n buffer.write(Buffer.writeUint32(item.cts ? item.cts : 0))\n }\n })\n\n return MP4.box(MP4.types.trun, this.extension(0, data.flags), sampleCount, offset, buffer.buffer)\n }\n\n static senc (data) {\n const buffer = new Buffer()\n const len = data.samples.length\n const ceil = data.isVideo ? 16 : 8\n const flag = data.isVideo ? 2 : 0\n let samples = []\n let samplesLength = 0\n if (data.isVideo) {\n samples = data.videoSenc\n samplesLength = data.videoSencLength\n } else {\n samples = data.audioSenc\n }\n samplesLength = samplesLength || ceil * len\n buffer.write(\n Buffer.writeUint32(16 + samplesLength), MP4.types.senc, this.extension(0, flag)\n )\n buffer.write(Buffer.writeUint32(len))\n samples.forEach(item => {\n for (let i = 0; i < item.InitializationVector.length; i++) {\n buffer.write(new Uint8Array([item.InitializationVector[i]]))\n }\n if (item.subsamples && item.subsamples.length) {\n buffer.write(Buffer.writeUint16(item.subsamples.length))\n item.subsamples.forEach(value => {\n buffer.write(Buffer.writeUint16(value.BytesOfClearData))\n buffer.write(Buffer.writeUint32(value.BytesOfProtectedData))\n })\n }\n })\n return buffer.buffer\n // return MP4.box(MP4.types.senc, this.extension(0, flag), buffer.buffer)\n }\n\n static saio (data) {\n let length = data.samples.length * 12 + 141\n if (!data.isVideo && data.isAudioEncryption) {\n length = 149\n }\n const content = new Uint8Array([\n 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00,\n (length >> 24) & 0xff,\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff\n ])\n return MP4.box(MP4.types.saio, content)\n }\n\n static saiz (data) {\n const samplesLength = data.samples.length\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x10, // default sample info size\n (samplesLength >> 24) & 0xff,\n (samplesLength >> 16) & 0xff,\n (samplesLength >> 8) & 0xff,\n samplesLength & 0xff\n ])\n return MP4.box(MP4.types.saiz, content)\n }\n\n static sbgp () {\n const content = new Uint8Array([\n 0x72, 0x6F, 0x6C, 0x6C, // sgpd, grouping_type\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x01, 0x19,\n 0x00, 0x00, 0x00, 0x01\n ])\n return MP4.box(MP4.types.sbgp, this.extension(0, 0), content)\n }\n\n static extension (version, flag) {\n return new Uint8Array([\n version,\n (flag >> 16) & 0xff,\n (flag >> 8) & 0xff,\n flag & 0xff\n ])\n }\n\n static tfhd (id) {\n return MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags todo 0x00\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff // track_ID\n ]))\n }\n\n static tfdt (data, baseMediaDecodeTime) {\n const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1))\n const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1))\n if (data.useEME && (data.isVideoEncryption || data.isAudioEncryption)) {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n } else {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n }\n }\n\n static trun (samples, offset) {\n const sampleLen = samples.length\n const dataLen = 12 + (16 * sampleLen)\n offset += 8 + dataLen\n const data = new Uint8Array(dataLen)\n data.set([\n 0x00, // version\n 0x00, 0x0f, 0x01, // flags\n (sampleLen >>> 24) & 0xff, (sampleLen >>> 16) & 0xff, (sampleLen >>> 8) & 0xff, sampleLen & 0xff,\n (offset >>> 24) & 0xff, (offset >>> 16) & 0xff, (offset >>> 8) & 0xff, offset & 0xff // data_offset\n ], 0)\n for (let i = 0; i < sampleLen; i++) {\n const {\n duration, size, flag = {}, cts = 0\n } = samples[i]\n data.set([\n (duration >>> 24) & 0xff, (duration >>> 16) & 0xff, (duration >>> 8) & 0xff, duration & 0xff,\n (size >>> 24) & 0xff, (size >>> 16) & 0xff, (size >>> 8) & 0xff, size & 0xff,\n (flag.isLeading << 2) | (flag.dependsOn === null || flag.dependsOn === undefined ? 1 : flag.dependsOn),\n (flag.isDependedOn << 6) | (flag.hasRedundancy << 4) | (flag.paddingValue << 1) | (flag.isNonSyncSample === null || flag.isNonSyncSample === undefined ? 1 : flag.isNonSyncSample),\n flag.degradationPriority & (0xf0 << 8), flag.degradationPriority & 0x0f, // sample_flags\n (cts >>> 24) & 0xff, (cts >>> 16) & 0xff, (cts >>> 8) & 0xff, cts & 0xff // sample_composition_time_offset\n ], 12 + 16 * i)\n }\n\n return MP4.box(MP4.types.trun, data)\n }\n\n static moovMP4 (tracks) {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].duration, tracks[0].timescale),\n ...tracks.map((t) => MP4.trackMP4(t)))\n }\n\n static trackMP4 (track) {\n return MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.duration, track.width, track.height),\n MP4.mdiaMP4(track)\n )\n }\n\n static mdiaMP4 (track) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minfMP4(track))\n }\n\n static minfMP4 (track) {\n return MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stblMP4(track))\n }\n\n static stblMP4 (track) {\n const { ext } = track\n const boxes = [\n MP4.stsd(track),\n MP4.stts(ext.stts),\n MP4.stsc(ext.stsc),\n MP4.stsz(ext.stsz),\n MP4.stco(ext.stco)\n ]\n\n if (ext.stss.length) {\n boxes.push(MP4.stss(ext.stss))\n }\n\n if (ext.ctts.length) {\n boxes.push(MP4.ctts(ext.ctts))\n }\n\n return MP4.box(MP4.types.stbl, ...boxes)\n }\n\n static stts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n\n return MP4.box(MP4.types.stts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsc (entries) {\n const len = entries.length\n const data = new Uint8Array(12 * len)\n let offset = 0\n entries.forEach(({ firstChunk, samplesPerChunk, sampleDescIndex }) => {\n data.set([\n firstChunk >> 24, (firstChunk >> 16) & 0xff, (firstChunk >> 8) & 0xff, firstChunk & 0xff,\n samplesPerChunk >> 24, (samplesPerChunk >> 16) & 0xff, (samplesPerChunk >> 8) & 0xff, samplesPerChunk & 0xff,\n sampleDescIndex >> 24, (sampleDescIndex >> 16) & 0xff, (sampleDescIndex >> 8) & 0xff, sampleDescIndex & 0xff\n ], offset)\n offset += 12\n })\n return MP4.box(MP4.types.stsc, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsz (samplesSizes) {\n const len = samplesSizes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n samplesSizes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stsz, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stco (offsets) {\n const len = offsets.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n offsets.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stco, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stss (keyframeIndexes) {\n const len = keyframeIndexes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n keyframeIndexes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stss, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static ctts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n return MP4.box(MP4.types.ctts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static styp () {\n return MP4.box(MP4.types.styp, new Uint8Array([\n 0x6D, 0x73, 0x64, 0x68,\n 0x00, 0x00, 0x00, 0x00,\n 0x6D, 0x73, 0x64, 0x68,\n 0x6D, 0x73, 0x69, 0x78\n ]))\n }\n\n // data.sampleOffset 指的是samples的序列号。_samples[0].idx\n static sidx (data) {\n // const buffer = new Buffer()\n const timescale = data.timescale\n const duration = data.samples[0].duration\n const durationCount = duration * data.samples.length\n const earliestTime = data.samples[0].sampleOffset * duration\n let mdatSize = 8\n data.samples.forEach(item => {\n mdatSize += item.size\n })\n let length = 0\n if (data.isVideo) {\n let sencLength = 0\n let samples\n if (data.videoSenc) {\n samples = data.videoSenc\n }\n if (data.isVideo) {\n samples.forEach(item => {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n data.videoSencLength = sencLength\n length = mdatSize + 141 + data.samples.length * 16 + sencLength\n if (data.useEME && data.isAudioEncryption && !data.isVideoEncryption) {\n length = mdatSize + (data.samples.length * 16) + 84\n }\n } else {\n length = mdatSize + 116 + data.samples.length * 12\n if (data.useEME && data.isAudioEncryption) {\n length = mdatSize + 169 + data.samples.length * 12 + 8 * data.audioSenc.length\n }\n }\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, data.id & 0xff, // ref_id\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n (earliestTime >> 24) & 0xff,\n (earliestTime >> 16) & 0xff,\n (earliestTime >> 8) & 0xff,\n earliestTime & 0xff, // earliest_presentation_time\n 0x00, 0x00, 0x00, 0x00, // first_offset\n 0x00, 0x00, // reserved\n 0x00, 0x01, // ref_count\n // 0x00, 0x04, 0x11, 0xCF, // ref_size + ref_type\n // 0x00, 0x01, 0x0A, 0xA6, // ref_size + ref_type\n 0x00, // ref_size + ref_type ref_size = moof.size + mdat.size\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff,\n (durationCount >> 24) & 0xff,\n (durationCount >> 16) & 0xff,\n (durationCount >> 8) & 0xff,\n durationCount & 0xff,\n 0x90, 0x00, 0x00, 0x00\n ])\n return MP4.box(MP4.types.sidx, content)\n }\n\n static mdat (data) {\n const mdat = MP4.box(MP4.types.mdat, data)\n // console.log('[remux],mdat ,len ', mdat.byteLength, hashVal(mdat.toString()))\n return mdat\n }\n}\n","\nexport class Logger {\n constructor (name, enable) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n Logger.disabled = enable\n }\n\n debug (...args) {\n if (Logger.disabled) return\n console.debug(this._prefix, ...args)\n }\n\n log (...args) {\n if (Logger.disabled) return\n console.log(this._prefix, ...args)\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n error (...args) {\n if (Logger.disabled) return\n console.error(this._prefix, ...args)\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","import {\n WordArray,\n Hasher,\n} from './core.js';\n\n// Constants table\nconst T = [];\n\n// Compute constants\nfor (let i = 0; i < 64; i += 1) {\n T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n}\n\nconst FF = (a, b, c, d, x, s, t) => {\n const n = a + ((b & c) | (~b & d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst GG = (a, b, c, d, x, s, t) => {\n const n = a + ((b & d) | (c & ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst HH = (a, b, c, d, x, s, t) => {\n const n = a + (b ^ c ^ d) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst II = (a, b, c, d, x, s, t) => {\n const n = a + (c ^ (b | ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\n/**\n * MD5 hash algorithm.\n */\nexport class MD5Algo extends Hasher {\n _doReset() {\n this._hash = new WordArray([\n 0x67452301,\n 0xefcdab89,\n 0x98badcfe,\n 0x10325476,\n ]);\n }\n\n _doProcessBlock(M, offset) {\n const _M = M;\n\n // Swap endian\n for (let i = 0; i < 16; i += 1) {\n // Shortcuts\n const offset_i = offset + i;\n const M_offset_i = M[offset_i];\n\n _M[offset_i] = (\n (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)\n | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n );\n }\n\n // Shortcuts\n const H = this._hash.words;\n\n const M_offset_0 = _M[offset + 0];\n const M_offset_1 = _M[offset + 1];\n const M_offset_2 = _M[offset + 2];\n const M_offset_3 = _M[offset + 3];\n const M_offset_4 = _M[offset + 4];\n const M_offset_5 = _M[offset + 5];\n const M_offset_6 = _M[offset + 6];\n const M_offset_7 = _M[offset + 7];\n const M_offset_8 = _M[offset + 8];\n const M_offset_9 = _M[offset + 9];\n const M_offset_10 = _M[offset + 10];\n const M_offset_11 = _M[offset + 11];\n const M_offset_12 = _M[offset + 12];\n const M_offset_13 = _M[offset + 13];\n const M_offset_14 = _M[offset + 14];\n const M_offset_15 = _M[offset + 15];\n\n // Working varialbes\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n\n // Computation\n a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n a = II(a, b, c, d, M_offset_0, 6, T[48]);\n d = II(d, a, b, c, M_offset_7, 10, T[49]);\n c = II(c, d, a, b, M_offset_14, 15, T[50]);\n b = II(b, c, d, a, M_offset_5, 21, T[51]);\n a = II(a, b, c, d, M_offset_12, 6, T[52]);\n d = II(d, a, b, c, M_offset_3, 10, T[53]);\n c = II(c, d, a, b, M_offset_10, 15, T[54]);\n b = II(b, c, d, a, M_offset_1, 21, T[55]);\n a = II(a, b, c, d, M_offset_8, 6, T[56]);\n d = II(d, a, b, c, M_offset_15, 10, T[57]);\n c = II(c, d, a, b, M_offset_6, 15, T[58]);\n b = II(b, c, d, a, M_offset_13, 21, T[59]);\n a = II(a, b, c, d, M_offset_4, 6, T[60]);\n d = II(d, a, b, c, M_offset_11, 10, T[61]);\n c = II(c, d, a, b, M_offset_2, 15, T[62]);\n b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n // Intermediate hash value\n H[0] = (H[0] + a) | 0;\n H[1] = (H[1] + b) | 0;\n H[2] = (H[2] + c) | 0;\n H[3] = (H[3] + d) | 0;\n }\n /* eslint-ensable no-param-reassign */\n\n _doFinalize() {\n // Shortcuts\n const data = this._data;\n const dataWords = data.words;\n\n const nBitsTotal = this._nDataBytes * 8;\n const nBitsLeft = data.sigBytes * 8;\n\n // Add padding\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n const nBitsTotalL = nBitsTotal;\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n );\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n );\n\n data.sigBytes = (dataWords.length + 1) * 4;\n\n // Hash final blocks\n this._process();\n\n // Shortcuts\n const hash = this._hash;\n const H = hash.words;\n\n // Swap endian\n for (let i = 0; i < 4; i += 1) {\n // Shortcut\n const H_i = H[i];\n\n H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)\n | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n }\n\n // Return final computed hash\n return hash;\n }\n\n clone() {\n const clone = super.clone.call(this);\n clone._hash = this._hash.clone();\n\n return clone;\n }\n}\n\n/**\n * Shortcut function to the hasher's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n *\n * @return {WordArray} The hash.\n *\n * @static\n *\n * @example\n *\n * var hash = CryptoJS.MD5('message');\n * var hash = CryptoJS.MD5(wordArray);\n */\nexport const MD5 = Hasher._createHelper(MD5Algo);\n\n/**\n * Shortcut function to the HMAC's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n * @param {WordArray|string} key The secret key.\n *\n * @return {WordArray} The HMAC.\n *\n * @static\n *\n * @example\n *\n * var hmac = CryptoJS.HmacMD5(message, key);\n */\nexport const HmacMD5 = Hasher._createHmacHelper(MD5Algo);\n","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n const isAV01 = /av01/.test(track.codec)\n\n let mdatSize = 0\n\n if (isAV01) {\n samples.forEach((s) => {\n mdatSize += s.data.byteLength\n })\n } else {\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n }\n\n const mdata = new Uint8Array(mdatSize)\n\n // av1没有uints,直接写入data即可\n // todo: H.265/H.264为什么要拼接nals/uints而不直接用data?\n if (isAV01) {\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n mdata.set(sample.data, offset)\n sample.size = sample.data.byteLength\n offset += sample.size\n }\n } else {\n const mdatView = new DataView(mdata.buffer)\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","/**\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 class Buffer {\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static start (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n // Edge bug: https://bit.ly/2JYLPeB\n if (buf.length === 1 && buf.start(0) < 0) return 0\n\n return buf.start(0)\n }\n\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static end (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n\n return buf.end(buf.length - 1)\n }\n\n /**\n * @param {{buffered?: TimeRanges}} b\n * @returns {TimeRanges | void}\n */\n static get (b) {\n if (!b) return\n try {\n return b.buffered\n } catch (error) {\n // ignore\n }\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {[number,number][]}\n */\n static buffers (buf, maxHole) {\n if (!buf || !buf.length) return []\n\n const buffers = []\n for (let i = 0, l = buf.length; i < l; i++) {\n const bufLen = buffers.length\n if (!bufLen || !maxHole) {\n buffers.push([buf.start(i), buf.end(i)])\n } else {\n const last = buffers[bufLen - 1]\n const lastEnd = last[1]\n const start = buf.start(i)\n if (start - lastEnd <= maxHole) {\n const end = buf.end(i)\n if (end > lastEnd) {\n last[1] = end\n }\n } else {\n buffers.push([buf.start(i), buf.end(i)])\n }\n }\n }\n return buffers\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {{buffers:[number,number][],length:number}}\n */\n static totalLength (buffers) {\n if (!buffers || !buffers.length) return 0\n return buffers.reduce((a, c) => (a += (c[1] - c[0])), 0)\n }\n\n /**\n *\n * @param {TimeRanges} buf\n * @param {number} [pos=0]\n * @param {number} [maxHole=0]\n * @returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}\n */\n static info (buf, pos = 0, maxHole = 0) {\n if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }\n\n let start = 0\n let end = 0\n let index = 0\n let nextStart = 0\n let nextEnd = 0\n let prevStart = 0\n let prevEnd = 0\n const buffers = Buffer.buffers(buf, maxHole)\n\n for (let i = 0, l = buffers.length; i < l; i++) {\n const item = buffers[i]\n if (pos + maxHole >= item[0] && pos <= item[1]) {\n start = item[0]\n end = item[1]\n index = i\n } else if (pos + maxHole < item[0]) {\n nextStart = item[0]\n nextEnd = item[1]\n break\n } else if (pos + maxHole > item[1]) {\n prevStart = item[0]\n prevEnd = item[1]\n }\n }\n\n return {\n start,\n end,\n index,\n buffers,\n nextStart,\n nextEnd,\n prevStart,\n prevEnd,\n currentTime: pos,\n behind: pos - start,\n remaining: end ? end - pos : 0,\n length: Buffer.totalLength && Buffer.totalLength(buffers)\n }\n }\n\n /**\n *\n * @param {HTMLMediaElement} media\n * @param {number} pos\n * @returns {Boolean}\n */\n static isBuffered (media, pos) {\n if (media) {\n const buffered = Buffer.get(media)\n\n if (buffered?.length) {\n for (let i = 0; i < buffered.length; i++) {\n if (pos >= buffered.start(i) && pos <= buffered.end(i)) {\n return true\n }\n }\n }\n }\n return false\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n","export const ERR = {\n MANIFEST: 'manifest',\n NETWORK: 'network',\n NETWORK_TIMEOUT: 'network_timeout',\n NETWORK_FORBIDDEN: 'network_forbidden',\n NETWORK_NOTFOUND: 'network_notfound',\n NETWROK_RANGE_NOT_SATISFIABLE: 'network_range_not_satisfiable',\n DEMUX: 'demux',\n REMUX: 'remux',\n MEDIA: 'media',\n DRM: 'drm',\n OTHER: 'other',\n RUNTIME: 'runtime',\n\n SUB_TYPES: {\n FLV: 'FLV',\n HLS: 'HLS',\n MP4: 'MP4',\n FMP4: 'FMP4',\n MSE_ADD_SB: 'MSE_ADD_SB',\n MSE_APPEND_BUFFER: 'MSE_APPEND_BUFFER',\n MSE_OTHER: 'MSE_OTHER',\n MSE_FULL: 'MSE_FULL',\n MSE_CHANGE_TYPE: 'MSE_CHANGE_TYPE',\n OPTION: 'OPTION',\n DASH: 'DASH',\n LICENSE: 'LICENSE',\n CUSTOM_LICENSE: 'CUSTOM_LICENSE',\n MSE_HIJACK: 'MSE_HIJACK',\n EME_HIJACK: 'EME_HIJACK',\n SIDX: 'SIDX',\n NO_CANPLAY_ERROR: 'NO_CANPLAY_ERROR',\n BUFFERBREAK_ERROR: 'BUFFERBREAK_ERROR',\n WAITING_TIMEOUT_ERROR: 'WAITING_TIMEOUT_ERROR',\n MEDIA_ERR_ABORTED: 'MEDIA_ERR_ABORTED',\n MEDIA_ERR_NETWORK: 'MEDIA_ERR_NETWORK',\n MEDIA_ERR_DECODE: 'MEDIA_ERR_DECODE',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'MEDIA_ERR_SRC_NOT_SUPPORTED',\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 'MEDIA_ERR_CODEC_NOT_SUPPORTED',\n MEDIA_ERR_URL_EMPTY: 'MEDIA_ERR_URL_EMPTY'\n }\n}\n\nexport const ERR_CODE = {\n [ERR.MANIFEST]: {\n HLS: 1100,\n DASH: 1200\n },\n [ERR.NETWORK]: 2100,\n [ERR.NETWORK_TIMEOUT]: 2101,\n [ERR.NETWORK_FORBIDDEN]: 2103,\n [ERR.NETWORK_NOTFOUND]: 2104,\n [ERR.NETWROK_RANGE_NOT_SATISFIABLE]: 2116,\n [ERR.DEMUX]: {\n FLV: 3100,\n HLS: 3200,\n MP4: 3300,\n FMP4: 3400,\n SIDX: 3410\n },\n [ERR.REMUX]: {\n FMP4: 4100,\n MP4: 4200\n },\n [ERR.MEDIA]: {\n MEDIA_ERR_ABORTED: 5101,\n MEDIA_ERR_NETWORK: 5102,\n MEDIA_ERR_DECODE: 5103,\n MEDIA_ERR_SRC_NOT_SUPPORTED: 5104,\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 5105,\n MEDIA_ERR_URL_EMPTY: 5106,\n MSE_ADD_SB: 5200,\n MSE_APPEND_BUFFER: 5201,\n MSE_OTHER: 5202,\n MSE_FULL: 5203,\n MSE_HIJACK: 5204,\n MSE_CHANGE_TYPE: 5205,\n EME_HIJACK: 5301\n },\n [ERR.DRM]: {\n LICENSE: 7100,\n CUSTOM_LICENSE: 7200\n },\n [ERR.OTHER]: 8000,\n [ERR.RUNTIME]: {\n NO_CANPLAY_ERROR: 9001,\n BUFFERBREAK_ERROR: 9002,\n WAITING_TIMEOUT_ERROR: 9003\n }\n}\n\nexport class StreamingError extends Error {\n constructor (type, subType, origin, payload, msg) {\n super(msg || origin?.message)\n this.errorType = type === ERR.NETWORK_TIMEOUT ? ERR.NETWORK : type\n this.originError = origin\n this.ext = payload\n this.errorCode = ERR_CODE[type][subType] || ERR_CODE[type]\n this.errorMessage = this.message\n if (!this.errorCode) {\n this.errorType = ERR.OTHER\n this.errorCode = ERR_CODE[this.errorType]\n }\n }\n\n static create (type, subType, origin, payload, msg) {\n if (type instanceof StreamingError) {\n return type\n } else if (type instanceof Error) {\n origin = type\n type = ''\n }\n\n if (!type) type = ERR.OTHER\n\n return new StreamingError(type, subType, origin, payload, msg)\n }\n\n static network (error) {\n return new StreamingError(\n error?.isTimeout ? ERR.NETWORK_TIMEOUT : ERR.NETWORK,\n null,\n error instanceof Error ? error : null,\n {\n url: error?.url,\n response: error?.response,\n httpCode: error?.response?.status\n }\n )\n }\n}\n","\nexport const LogCacheLevel = {\n 'DEBUG': 1,\n 'LOG': 2,\n 'WARN': 3,\n 'ERROR': 4\n}\nconst LOG_MAX_SIZE = 200 * 1024\nconst SIMPLE_TYPE = ['Boolean', 'Number' ,'String', 'Undefined','Null', 'Date','Object']\nexport class Logger {\n constructor (name,config) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n this.logCacheLevel = config?.logCacheLevel || 3\n this.logMaxSize = config?.logMaxSize || LOG_MAX_SIZE\n this.logSize = 0\n this.logTextArray = []\n }\n\n debug (...args) {\n this.logCache(LogCacheLevel.DEBUG,...args)\n if (Logger.disabled) return\n console.debug(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n logCache (logCacheLevel, ...logText) {\n if (logCacheLevel < this.logCacheLevel) return\n let text = ''\n try {\n const finLogText = logText.map( item => logable(item))\n text = `[${nowTime()}]` + this._prefix + (JSON.stringify(finLogText))\n } catch (e) {\n return\n }\n if (logCacheLevel >= this.logCacheLevel) {\n this.logSize += text.length\n this.logTextArray.push(text)\n }\n if (this.logSize > this.logMaxSize) {\n const delLog = this.logTextArray.shift()\n this.logSize -= delLog.length\n }\n }\n\n getLogCache () {\n const logText = this.logTextArray.join('\\n')\n this.reset()\n return logText\n }\n\n reset () {\n this.logTextArray = []\n this.logSize = 0\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n\n setLogLevel (val) {\n this.logCacheLevel = val\n }\n}\nfunction nowTime () {\n return new Date().toLocaleString()\n}\n\nfunction reduceDepth (val) {\n if (typeof val !== 'object') {\n return val\n }\n const objType = Object.prototype.toString.call(val).slice(8, -1)\n switch (objType) {\n case 'Array':\n case 'Uint8Array':\n case 'ArrayBuffer':\n\n return objType + '[' + val.length + ']'\n case 'Object':\n return '{}'\n default:\n return objType\n }\n}\n\nfunction logable (obj, maxDepth, depth) {\n if (!depth) depth = 1\n if (!maxDepth) maxDepth = 2\n const result = {}\n\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n const objType = Object.prototype.toString.call(obj).slice(8, -1)\n if (!SIMPLE_TYPE.includes(objType)) {\n return objType\n }\n\n if (depth > maxDepth) {\n return undefined\n }\n\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (depth === maxDepth) {\n result[key] = reduceDepth(obj[key])\n } else if (typeof obj[key] === 'object') {\n result[key] = logable(obj[key], maxDepth, depth + 1)\n } else {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n","export function createPublicPromise () {\n let res, rej\n const promise = new Promise((resolve, reject) => {\n res = resolve\n rej = reject\n })\n promise.used = false\n promise.resolve = (...args) => {\n promise.used = true\n return res(...args)\n }\n promise.reject = (...args) => {\n promise.used = true\n return rej(...args)\n }\n return promise\n}\n\nexport function nowTime () {\n try {\n return parseInt(performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n\nexport const SafeJSON = {\n stringify (obj) {\n try {\n return JSON.stringify(obj)\n } catch (e) {\n return ''\n }\n },\n parse (obj) {\n try {\n return JSON.parse(obj)\n } catch (e) {\n return undefined\n }\n }\n}\n","/* eslint-disable no-undef */\nimport { Buffer } from './buffer'\nimport { isBrowser } from './env'\nimport { ERR, StreamingError } from './error'\nimport { Logger } from './logger'\nimport { createPublicPromise, nowTime, SafeJSON } from './utils'\n\nfunction getMediaSource (preferMMS = true) {\n try {\n if (!isBrowser) return null\n\n if (preferMMS && typeof ManagedMediaSource !== 'undefined') return ManagedMediaSource\n\n return window.MediaSource\n } catch (e) {}\n}\n\nfunction isMMS (mediaSource) {\n return /ManagedMediaSource/gi.test(Object.prototype.toString.call(mediaSource))\n}\n\n/**\n * @param {TimeRanges} buffered\n */\nfunction getTimeRanges (buffered) {\n const ranges = []\n\n if (buffered instanceof TimeRanges) {\n for (let i = 0; i < buffered.length; i++) {\n ranges.push({\n start: buffered.start(i),\n end: buffered.end(i)\n })\n }\n }\n return ranges\n}\n\n/** @enum {string} */\nexport const MSEErrorType = {\n UPDATE_ERROR: 'updateError'\n}\n\nconst OP_NAME = {\n APPEND: 'appendBuffer',\n REMOVE: 'removeBuffer',\n UPDATE_DURATION:'updateDuration'\n}\n\nexport class MSEError extends Error {\n /**\n * @param {MSEErrorType} type\n * @param {any} [msg]\n */\n constructor (type, msg) {\n super(msg || type)\n this.type = type\n this.msg = msg\n }\n}\n\nexport class MSE {\n static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @param { boolean} preferMMS\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n const MediaSource = getMediaSource()\n if (!MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n }\n\n static isMMSOnly () {\n return typeof ManagedMediaSource !== 'undefined' && typeof MediaSource === 'undefined'\n }\n\n /** @type { HTMLMediaElement | null } */\n media = null\n\n /** @type { MediaSource | null } */\n mediaSource = null\n\n _openPromise = createPublicPromise()\n\n _queue = Object.create(null)\n\n _sourceBuffer = Object.create(null)\n\n _mseFullFlag = {}\n\n _st = 0\n\n _opst = 0\n\n _logger = null\n\n _config = null\n _url = null\n\n\n static getDefaultConfig () {\n return {\n openLog: false,\n preferMMS: false\n }\n }\n\n /**\n * @param {HTMLMediaElement} [media]\n */\n constructor (media, config) {\n this._config = Object.assign(MSE.getDefaultConfig(), config)\n if (media) this.bindMedia(media)\n this._logger = new Logger('MSE')\n if (this._config.openLog) {\n Logger.enable()\n }\n }\n\n get isOpened () {\n return this.mediaSource?.readyState === 'open'\n }\n\n get hasOpTasks () {\n let flag = false\n Object.keys(this._queue).forEach(k => {\n const queue = this._queue[k]\n if (Array.isArray(queue)) {\n flag ||= queue.length > 0\n }\n })\n return flag\n }\n\n get url () {\n return this._url\n }\n\n get duration () {\n return this.mediaSource?.duration || -1\n }\n\n get isEnded () {\n return this.mediaSource ? this.mediaSource.readyState === 'ended' : false\n }\n\n get streaming () {\n return isMMS(this.mediaSource) ? this.mediaSource.streaming : true\n }\n\n isFull (type) {\n return type ? this._mseFullFlag[type] : this._mseFullFlag[MSE.VIDEO]\n }\n\n /**\n * @param { number } duration\n * @return { Promise }\n */\n updateDuration (duration) {\n const isReduceDuration = this.mediaSource && this.mediaSource.duration > duration\n if (this.mediaSource && this.mediaSource.duration > duration) {\n let bufferEnd = 0\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n bufferEnd = Math.max(this.bufferEnd(k) || 0, bufferEnd)\n } catch (error) {\n // ignore\n }\n })\n if (duration < bufferEnd) {\n // 设置值比bufferEnd值小,会导致异常\n return Promise.resolve()\n }\n }\n\n return this._enqueueBlockingOp(() => {\n if (this.isEnded) {\n this._logger.debug('setDuration but ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('setDuration', duration)\n }\n }, OP_NAME.UPDATE_DURATION, {isReduceDuration})\n }\n\n /** @return { Promise } */\n open () {\n if (this._openPromise.used && !this.isOpened && this.mediaSource) {\n const ms = this.mediaSource\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen', costTime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @private\n */\n _onStartStreaming = () => {\n this._logger.debug('startstreaming')\n }\n\n /**\n * @private\n */\n _onEndStreaming = () => {\n this._logger.debug('endstreaming')\n }\n\n /**\n * @param { HTMLMediaElement } media\n * @return { Promise }\n */\n async bindMedia (media) {\n if (this.mediaSource || this.media) await this.unbindMedia()\n\n const MediaSource = getMediaSource(this._config.preferMMS)\n\n if (!media || !MediaSource) throw new Error('Param media or MediaSource does not exist')\n this.media = media\n const ms = this.mediaSource = new MediaSource()\n const useMMS = isMMS(ms)\n this._st = nowTime()\n\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n if (useMMS) {\n ms.addEventListener('startstreaming', this._onStartStreaming)\n ms.addEventListener('endstreaming', this._onEndStreaming)\n }\n\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n media.disableRemotePlayback = useMMS\n\n return this._openPromise\n }\n\n /** @return { Promise } */\n async unbindMedia () {\n if (!this._openPromise.used) this._openPromise.resolve()\n const ms = this.mediaSource\n\n if (ms) {\n Object.keys(this._queue).forEach((t) => {\n const queue = this._queue[t]\n if (queue) {\n queue.forEach(x => x.promise?.resolve?.())\n }\n })\n\n const hasMetadata = !!this.media && this.media.readyState >= 1\n const mseOpen = ms.readyState === 'open'\n\n if (hasMetadata && mseOpen) {\n try {\n ms.endOfStream()\n } catch (error) {\n // ignore\n }\n }\n\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n ms.removeSourceBuffer(this._sourceBuffer[k])\n } catch (error) {\n // ignore\n }\n })\n\n if (isMMS(ms)) {\n ms.removeEventListener('startstreaming', this._onStartStreaming)\n ms.removeEventListener('endstreaming', this._onEndStreaming)\n }\n }\n\n if (this.media) {\n this.media.disableRemotePlayback = false\n this.media.removeAttribute('src')\n try {\n this.media.load()\n } catch (error) {\n // ignore\n }\n this.media = null\n }\n\n this.mediaSource = null\n this._openPromise = createPublicPromise()\n this._queue = Object.create(null)\n this._sourceBuffer = Object.create(null)\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n */\n createSource (type, mimeType) {\n if (this._sourceBuffer[type] || !this.mediaSource) return\n let sb\n try {\n sb = this._sourceBuffer[type] = this.mediaSource.addSourceBuffer(mimeType)\n } catch (error) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_ADD_SB, error)\n }\n sb.mimeType = mimeType\n sb.addEventListener('updateend', this._onSBUpdateEnd.bind(this, type))\n sb.addEventListener('error', this._onSBUpdateError.bind(this, type))\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n changeType (type, mimeType) {\n const sb = this._sourceBuffer[type]\n if (!this.mediaSource || !sb || sb.mimeType === mimeType) return Promise.resolve()\n\n if (typeof sb.changeType !== 'function') {\n return Promise.reject(\n new StreamingError(\n ERR.MEDIA,\n ERR.SUB_TYPES.MSE_CHANGE_TYPE,\n new Error('changeType is not a function')\n )\n )\n }\n\n return this._enqueueOp(type, () => {\n try {\n sb.changeType(mimeType)\n } catch (e) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_CHANGE_TYPE, e)\n }\n\n sb.mimeType = mimeType\n this._onSBUpdateEnd(type)\n }, 'changeType', {mimeType})\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n createOrChangeSource (type, mimeType) {\n this.createSource(type, mimeType)\n return this.changeType(type, mimeType)\n }\n\n /**\n * @param { string } type\n * @param { BufferSource } buffer\n * @return { Promise }\n */\n append (type, buffer, context) {\n if (!buffer || !buffer.byteLength) {\n return Promise.resolve()\n }\n\n if (!this._sourceBuffer[type]) return Promise.resolve()\n\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n this._logger.debug('MSE APPEND START', context)\n this._opst = nowTime()\n this._sourceBuffer[type]?.appendBuffer(buffer)\n }, OP_NAME.APPEND, context)\n\n }\n\n /**\n * @param { string } type\n * @param { number } startTime\n * @param { number } endTime\n * @return { Promise }\n */\n remove (type, startTime, endTime, context) {\n // if (Object.keys(this._sourceBuffer).length === 1) return Promise.resolve()\n let isInsertHead = false\n if (this._mseFullFlag[type]) {\n isInsertHead = true\n }\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[type]\n if (startTime >= endTime || !sb) {\n this._onSBUpdateEnd(type)\n return\n }\n this._opst = nowTime()\n this._logger.debug('MSE REMOVE START', type, startTime, endTime, context)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE, context, isInsertHead)\n }\n\n clearBuffer (startTime, endTime) {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this.remove(k, startTime, endTime)\n })\n return p || Promise.resolve()\n }\n\n clearAllBuffer () {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n const sb = this._sourceBuffer[k]\n p = this.remove(k, 0, Buffer.end(Buffer.get(sb)))\n })\n return p\n }\n\n clearOpQueues (type, allClear) {\n this._logger.debug('MSE clearOpQueue START')\n const queue = this._queue[type]\n if (allClear && queue) {\n this._queue[type] = []\n return\n }\n if (!queue || !queue[type] || queue.length < 5) return\n const initQueue = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initQueue.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initQueue.length > 0 && this._queue[type].push(...initQueue)\n }\n\n /**\n * @param {EndOfStreamError} [reason]\n * @returns {Promise}\n */\n endOfStream (reason) {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open') return Promise.resolve()\n return this._enqueueBlockingOp(() => {\n const ms = this.mediaSource\n if (!ms || ms.readyState !== 'open') return\n this._logger.debug('MSE endOfStream START')\n if (reason) {\n ms.endOfStream(reason)\n } else {\n ms.endOfStream()\n }\n }, 'endOfStream')\n }\n\n setLiveSeekableRange (start, end) {\n const ms = this.mediaSource\n if (start < 0 || end < start || !ms?.setLiveSeekableRange || ms.readyState !== 'open') return\n ms.setLiveSeekableRange(start, end)\n }\n\n /**\n * @param {string} type\n * @returns {?SourceBuffer}\n */\n getSourceBuffer (type) {\n return this._sourceBuffer[type]\n }\n\n /**\n * @param { string } type\n * @return { TimeRanges | void }\n */\n buffered (type) {\n return Buffer.get(this._sourceBuffer[type])\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferStart (type) {\n return Buffer.start(this.buffered(type))\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferEnd (type) {\n return Buffer.end(this.buffered(type))\n }\n\n _enqueueOp (type, exec, opName, context, isInsertHead) {\n if (!this.mediaSource) return Promise.resolve()\n const queue = this._queue[type] = this._queue[type] || []\n const op = {\n exec,\n promise: createPublicPromise(),\n opName,\n context\n }\n\n if (isInsertHead) {\n queue.splice(0, 0, op)\n this._mseFullFlag[type] = false\n this._startQueue(type)\n } else {\n queue.push(op)\n }\n\n if (this.isOpened || this.isEnded) {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n } else {\n this._openPromise.then(() => {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n })\n }\n\n\n return op.promise\n }\n\n async _enqueueBlockingOp (exec, opName, context) {\n if (!this.mediaSource) return Promise.resolve()\n const types = Object.keys(this._sourceBuffer)\n if (!types.length) {\n return exec()\n }\n\n const waiters = []\n types.forEach(t => {\n const queue = this._queue[t]\n const prom = createPublicPromise()\n waiters.push(prom)\n queue.push({exec: () => {\n prom.resolve()}, promise: prom, opName, context})\n if (queue.length === 1) {\n this._startQueue(t)\n }\n })\n\n return Promise.all(waiters).then(() => {\n try {\n return exec()\n } finally {\n types.forEach(t => {\n const queue = this._queue[t]\n const sb = this._sourceBuffer[t]\n queue?.shift()\n if (!sb || !sb.updating) {\n this._startQueue(t)\n }\n })\n }\n })\n }\n\n _startQueue (type) {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op && !this._mseFullFlag[type]) {\n try {\n op.exec()\n } catch (error) {\n if (error && error.message && error.message.indexOf('SourceBuffer is full') >= 0) {\n this._mseFullFlag[type] = true\n if (op.context && typeof op.context === 'object'){\n op.context.isFull = true\n }\n this._logger.error('[MSE error], context,', op.context, ' ,name,', op.opName, ',err,SourceBuffer is full')\n op?.promise?.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_FULL, error))\n } else {\n this._logger.error(error)\n op?.promise?.reject(\n error.constructor === StreamingError\n ? error\n : new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error)\n )\n queue.shift()\n this._startQueue(type)\n }\n }\n }\n }\n }\n\n _onSBUpdateEnd = (type) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (!(op?.opName === OP_NAME.UPDATE_DURATION)) {\n queue.shift()\n }\n if (op) {\n const costtime = nowTime() - this._opst\n this._logger.debug(`UpdateEnd(${type}/${op.opName})`, SafeJSON.stringify(getTimeRanges(this._sourceBuffer[type]?.buffered)), costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n const callback = op.context?.callback\n if (callback && typeof callback === 'function'){\n callback(op.context)\n }\n this._startQueue(type)\n }\n }\n }\n\n _onSBUpdateError = (type, event) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op) {\n this._logger.error('UpdateError', type, op.opName, op.context)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_APPEND_BUFFER, event))\n // Do not shift from queue, 'updateend' event will fire next\n }\n }\n }\n\n setTimeoffset (type, timestampOffset, context) {\n return this._enqueueOp(type, () => {\n if (timestampOffset < 0) {\n timestampOffset += 0.001\n }\n this._sourceBuffer[type].timestampOffset = timestampOffset\n this._onSBUpdateEnd(type)\n }, 'setTimeoffset', context)\n }\n\n /** *重置decode时间戳 */\n abort (type, context) {\n if (!this.isOpened) {\n return Promise.resolve()\n }\n return this._enqueueOp(type, () => {\n this._sourceBuffer[type].abort()\n this._onSBUpdateEnd(type)\n }, 'abort', context)\n }\n}\n","export const LoaderType = {\n FETCH: 'fetch',\n XHR: 'xhr'\n}\n\nexport const ResponseType = {\n ARRAY_BUFFER: 'arraybuffer',\n TEXT: 'text',\n JSON: 'json'\n}\n","import { LoaderType } from './types'\n\nexport class NetError extends Error {\n retryCount = 0\n isTimeout = false\n loaderType = LoaderType.FETCH\n startTime = 0\n endTime = 0\n options = {}\n\n constructor (url, request, response, msg) {\n super(msg)\n this.url = url\n this.request = request\n this.response = response\n }\n}\n","const toString = Object.prototype.toString\n\nexport function isObject (a) {\n return a !== null && typeof a === 'object'\n}\n\nexport function isPlainObject (val) {\n if (toString.call(val) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(val)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isDate (a) {\n return toString.call(a) === '[object Date]'\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { isDate, isObject } from '../is'\n\nexport function getRangeValue (value) {\n if (!value || value[0] === null || value[0] === undefined || (value[0] === 0 && (value[1] === null || value[1] === undefined))) {\n return\n }\n let ret = 'bytes=' + value[0] + '-'\n if (value[1]) ret += value[1]\n return ret\n}\n\nfunction encode (val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\nexport function setUrlParams (url, params) {\n if (!url) return\n if (!params) return url\n let v\n const str = Object.keys(params).map(k => {\n v = params[k]\n if (v === null || v === undefined) return\n if (Array.isArray(v)) {\n k = k + '[]'\n } else {\n v = [v]\n }\n\n return v.map(x => {\n if (isDate(x)) {\n x = x.toISOString()\n } else if (isObject(x)) {\n x = JSON.stringify(x)\n }\n return `${encode(k)}=${encode(x)}`\n }).join('&')\n }).filter(Boolean).join('&')\n\n if (str) {\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex)\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + str\n }\n\n return url\n}\n\nexport function createResponse (\n data,\n done,\n response,\n contentLength,\n age,\n startTime,\n firstByteTime,\n index,\n range,\n vid,\n priOptions\n) {\n age = (age !== null && age !== undefined) ? parseFloat(age) : null\n contentLength = parseInt(contentLength || '0', 10)\n if (Number.isNaN(contentLength)) contentLength = 0\n const options = { range, vid, index, contentLength, age, startTime, firstByteTime, endTime: Date.now(), priOptions }\n return { data, done, options, response }\n}\n\nexport function calculateSpeed (byteLen, milliSecond) {\n return Math.round(byteLen * 8 * 1000 / milliSecond / 1024) // Kb/s\n}\n","export const EVENT = {\n ERROR: 'error',\n\n TTFB: 'core.ttfb',\n LOAD_START: 'core.loadstart',\n LOAD_RESPONSE_HEADERS: 'core.loadresponseheaders',\n LOAD_COMPLETE: 'core.loadcomplete',\n LOAD_RETRY: 'core.loadretry',\n SOURCEBUFFER_CREATED: 'core.sourcebuffercreated',\n MEDIASOURCE_OPENED: 'core.mediasourceopened',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n APPEND_BUFFER: 'core.appendbuffer',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n CHASEFRAME: 'core.chaseframe',\n METADATA_PARSED: 'core.metadataparsed',\n SEI: 'core.sei',\n SEI_IN_TIME: 'core.seiintime',\n FLV_SCRIPT_DATA: 'core.flvscriptdata',\n LOWDECODE: 'core.lowdecode',\n SWITCH_URL_SUCCESS: 'core.switchurlsuccess',\n SWITCH_URL_FAILED: 'core.switchurlfailed',\n SPEED: 'core.speed',\n HLS_MANIFEST_LOADED: 'core.hlsmanifestloaded',\n HLS_LEVEL_LOADED: 'core.hlslevelloaded',\n DEMUXED_TRACK:'core.demuxedtrack',\n\n STREAM_EXCEPTION: 'core.streamexception',\n LARGE_AV_FIRST_FRAME_GAP_DETECT: 'LARGE_AV_FIRST_FRAME_GAP_DETECT',\n LARGE_VIDEO_DTS_GAP_DETECT: 'LARGE_VIDEO_DTS_GAP_DETECT',\n LARGE_AUDIO_DTS_GAP_DETECT: 'LARGE_AUDIO_DTS_GAP_DETECT',\n AUDIO_GAP_DETECT: 'AUDIO_GAP_DETECT',\n AUDIO_OVERLAP_DETECT: 'AUDIO_OVERLAP_DETECT',\n MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT: 'MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT',\n REAL_TIME_SPEED: 'real_time_speed'\n}\n","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","const TFHDFlag = {\n BASE_DATA_OFFSET: 1,\n SAMPLE_DESC: 2,\n SAMPLE_DUR: 8,\n SAMPLE_SIZE: 16,\n SAMPLE_FLAG: 32,\n DUR_EMPTY: 65536,\n DEFAULT_BASE_IS_MOOF: 131072\n}\nconst TRUNFlag = {\n DATA_OFFSET: 1,\n FIRST_FLAG: 4,\n DURATION: 256,\n SIZE: 512,\n FLAG: 1024,\n CTS_OFFSET: 2048\n}\nconst SampleFlag = {\n DEGRADATION_PRIORITY_MASK: 65535,\n IS_NON_SYNC: 65536,\n PADDING_MASK: 917504,\n REDUNDANCY_MASK: 3145728,\n DEPENDED_MASK: 12582912,\n DEPENDS_MASK: 50331648,\n DEPENDS_NO: 33554432,\n DEPENDS_YES: 16777216\n}\n\nexport function trafToSegments (traf, trex = {}, moofOffset, segDuration, timescale) {\n const { tfhd, trun, tfdt } = traf\n const { samples: trunSamples, flags: trunFlags } = trun\n const { flags: tfhdFlags } = tfhd\n\n // const defaultSampleDescriptionIndex = tfhdFlags & TFHDFlag.SAMPLE_DESC ? tfhd.sampleDescriptionIndex : (trex.defaultSampleDescriptionIndex || 1)\n const defaultSampleDuration = tfhdFlags & TFHDFlag.SAMPLE_DUR ? tfhd.defaultSampleDuration : (trex.defaultSampleDuration || 0)\n const defaultSampleSize = tfhdFlags & TFHDFlag.SAMPLE_SIZE ? tfhd.defaultSampleSize : (trex.defaultSampleSize || 0)\n const defaultSampleFlags = tfhdFlags & TFHDFlag.SAMPLE_FLAG ? tfhd.defaultSampleFlags : (trex.defaultSampleFlags || 0)\n const startOffset = tfhdFlags & TFHDFlag.BASE_DATA_OFFSET ? tfhd.baseDataOffset : (tfhdFlags & TFHDFlag.DEFAULT_BASE_IS_MOOF ? moofOffset : 0)\n\n const frames = []\n const gops = []\n\n for (let lastDts = 0, startTime = 0, gopId = 0, totalOffset = startOffset, i = 0; i < trunSamples.length; i++) {\n const frame = {}\n frame.index = i\n frame.size = trunFlags & TRUNFlag.SIZE ? trunSamples[i].size : defaultSampleSize\n frame.duration = trunFlags & TRUNFlag.DURATION ? trunSamples[i].duration : defaultSampleDuration\n frame.dts = lastDts > 0 ? lastDts : (tfdt ? tfdt.baseMediaDecodeTime : 0)\n frame.startTime = startTime\n if (trunFlags & TRUNFlag.CTS_OFFSET) {\n frame.pts = frame.dts + trunSamples[i].cts\n } else {\n frame.pts = frame.dts\n }\n lastDts = frame.dts + frame.duration\n startTime += frame.duration\n\n let sampleFlags = defaultSampleFlags\n if (trunFlags & TRUNFlag.FLAG) {\n sampleFlags = trunSamples[i].flags\n } else if (0 === i && trunFlags & TRUNFlag.FIRST_FLAG) {\n sampleFlags = trun.firstSampleFlag\n }\n frame.offset = totalOffset\n frame.keyframe = !(sampleFlags & (SampleFlag.IS_NON_SYNC | SampleFlag.DEPENDS_YES))\n totalOffset += frame.size\n frames.push(frame)\n if (frame.keyframe) {\n gopId++\n gops.push([frame])\n } else if (gops.length) {\n gops[gops.length - 1].push(frame)\n }\n frame.gopId = gopId\n }\n\n const len = frames.length\n if (!len || (!frames[0].keyframe)) return []\n\n let time = 0\n let lastFrame\n const segments = []\n const scaledDuration = segDuration * timescale\n let segmentFrames = []\n\n // 合并gop至segments,以segDuration作为参考\n for (let i = 0, len = gops.length; i < len; i++) {\n time += gops[i].reduce((wret, w) => wret + w.duration, 0)\n segmentFrames = segmentFrames.concat(gops[i])\n\n if (time >= scaledDuration || i === gops.length - 1) {\n lastFrame = segmentFrames[segmentFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segmentFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: time / timescale,\n range: [segmentFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segmentFrames\n })\n time = 0\n segmentFrames = []\n }\n }\n\n return segments\n}\n\nexport function sidxToSegments (moov, sidx) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let audioSegments = []\n let videoSegments = []\n if (sidx) {\n const segments = []\n let prevTime = 0\n let prevOffset = sidx.start + sidx.size\n sidx.references.forEach((ref, i) => {\n segments.push({\n index: i,\n startTime: prevTime,\n endTime: prevTime + (ref.subsegment_duration / sidx.timescale),\n duration: ref.subsegment_duration / sidx.timescale,\n range: [prevOffset, prevOffset + ref.referenced_size],\n frames: []\n })\n prevTime += ref.subsegment_duration / sidx.timescale\n prevOffset += ref.referenced_size\n })\n audioSegments = segments\n videoSegments = segments\n } else {\n // 如果sidx不存在,则代表后续的segments无法通过seek读取\n // 把整段fmp4当作一个segment,使用开区间range即可\n const getTrakSegments = (box) => {\n if (!box) return []\n return [{\n index: 0,\n startTime: 0,\n endTime: box.duration / box.timescale,\n duration: box.duration / box.timescale,\n range: [moov.start + moov.size, ''],\n frames: []\n }]\n }\n videoSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : videoTrack.mdia?.mdhd)\n audioSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : audioTrack.mdia?.mdhd)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0]?.samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return []\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n return segments\n}\n\nexport function moovToMeta (moov, isFragmentMP4) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC || e1.av1C)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov,\n isFragmentMP4\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments, sidxToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n\n // 当box存在但不完整时,补全box\n const getCompletedBox = async (name) => {\n const box = MP4Parser.findBox(this.buffer, [name])[0]\n if (box) {\n if (box.size > box.data.length) {\n const res = await this.loadData([box.start, box.start + box.size - 1], cache, config)\n if (res) {\n return MP4Parser.findBox(res.data, [name])[0]\n }\n } else {\n return box\n }\n }\n }\n\n // 现在的分段式range加载逻辑不适用于fmp4,需要判断太多条件\n // 因为fmp4的samples信息存放在moof中,而解析moof的range需要依赖sidx\n // 而sidx和moof的size都是动态的(且sidx不一定存在),导致每个环节都需要判断是否满足解析条件以及对应的兜底处理\n // todo: 后续加载逻辑需要改为【开区间range+主动取消】才能更好的处理fmp4\n let isFragmentMP4 = false\n if (!(segments && segments.videoSegments.length && segments.audioSegments.length)) {\n const sidx = await getCompletedBox('sidx')\n if (sidx) {\n const parsedSidx = MP4Parser.sidx(sidx)\n if (parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx)\n isFragmentMP4 = true\n }\n } else {\n // 无 sidx box 场景,当前架构只能通过模拟加载完整的fmp4来解析出segments,这样会导致fetch加载的数据量特别大,loading时间长\n // 更倾向于使用【开区间range+主动取消】方案异步读取,todo\n }\n }\n\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov, isFragmentMP4)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n let parsedSidx\n if (!(segments.videoSegments.length && segments.audioSegments.length)) {\n const moof = MP4Parser.findBox(this.buffer, ['moof'])[0]\n const sidx = MP4Parser.findBox(this.buffer, ['sidx'])[0]\n if (moof && moof.size <= moof.data.length && sidx) {\n const parsedMoof = MP4Parser.moof(moof)\n\n parsedSidx = MP4Parser.sidx(sidx)\n if (parsedMoof && parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx, parsedMoof)\n }\n }\n }\n\n this.meta = moovToMeta(parsedMoov, parsedSidx)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n","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, FMP4Demuxer, 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 preferMMS: false\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 preferMMS: this.options.preferMMS,\n openLog: checkOpenLog()\n })\n this.fMP4Demuxer = null\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 if (videoSeg.frames.length === 0) {\n this.log('>>>>>getSubRange video, no frames')\n return range\n }\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 if (audioSeg.frames.length === 0) {\n this.log('>>>>>getSubRange video, no frames')\n return range\n }\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 && !this.meta.isFragmentMP4) { // todo: fmp4 demux worker\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 let demuxRet\n if (this.meta.isFragmentMP4) {\n if (!this.fMP4Demuxer) {\n this.fMP4Demuxer = new FMP4Demuxer()\n }\n demuxRet = this.fMP4Demuxer.demuxPart(buffer, start, this.meta.moov)\n } else {\n if (!this.MP4Demuxer) {\n this.MP4Demuxer = new MP4Demuxer(this.videoTrak, this.audioTrak, null,{openLog: checkOpenLog()})\n }\n demuxRet = this.MP4Demuxer.demuxPart(buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue)\n }\n if (!this.FMP4Remuxer && (!this.checkCodecH265() || this.options.supportHevc)) {\n this.FMP4Remuxer = new FMP4Remuxer(demuxRet.videoTrack, demuxRet.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 if (!frames.length) break\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 if (!frames.length) break\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 preferMMS: 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 hasVideo = !!meta.videoCodec\n const hasAudio = !!meta.audioCodec\n\n let codec\n if (hasVideo && hasAudio) {\n codec = `video/mp4; codecs=\"${meta.videoCodec}, mp4a.40.5\"`\n } else if (hasVideo) {\n codec = `video/mp4; codecs=\"${meta.videoCodec}\"`\n } else {\n codec = 'video/mp4; codecs=\"mp4a.40.5\"'\n }\n\n const contentTypes = { [MSE.VIDEO]: { mimeType: 'video/mp4', codec } }\n\n this.mse = new MSE(null, { preferMMS: this.config.preferMMS })\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,' 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","dts","pts","first","last","test","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","config","container","codecType","isAudioEncryption","VideoSample","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","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","combineToFloat","integer","decimal","AAC","rate","FREQ","indexOf","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","remaining","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","NALu","dropZerosLength","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","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","OPUS","dv","byteOffset","magicSignature","fromCodePoint","log","outputGain","getInt16","MAX_SILENT_FRAME_DURATION","AUDIO_EXCEPTION_LOG_EMIT_DURATION","FlvFixer","videoTrack","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","_this","startTime","discontinuity","contiguous","round","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","s","time","_this2","refSampleDurationInt","x","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_this3","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","G711PCMA","_getG711Duration","error","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","splice","track","sampleSize","getSilentFrame","AMF","ret","_parseValue","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","Date","decode","getUint16","FlvSoundFormat","logger","FlvDemuxer","_fixer","_scriptDataObject$dat","seamlessLoadingSwitching","_remainingData","_headerParsed","reset","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","scriptDataObject","metaData","onMetaData","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","G711A","_parseG711","_parseAac","_parseOpus","packetType","parseHeaderPackets","newSample","audioData","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","lastKeyFrameDts","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","ByteReader","buf","byteNum","getFloat32","getInt8","getInt32","back","read","setUint8","setUint16","setUint32","uint8","unreadLength","str","v","concatUint8s","BitReader","byte","MP4Parser","headerSize","subData","findBox","box","parseBox","trackId","baseDataOffsetPresent","flags","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","baseDataOffset","sampleDescriptionIndex","defaultSampleDuration","defaultSampleSize","defaultSampleFlags","reference_ID","version","earliest_presentation_time","first_offset","references","ref","tmp32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","mvhd","trak","pssh","nextTrackId","tkhd","mdia","fromUint8","matrix","int32","caculatedMatrix","readInt","rotation","scaled0","hypot","scaled1","atan2","PI","toDegree","mdhd","hdlr","minf","lang","language","handlerType","vmhd","smhd","stbl","graphicsmode","opcolor","balance","_ret$stsd$entries$","_ret$stsd$entries$$si","_ret$stsd$entries$$si2","stsd","stts","ctts","stsc","stsz","stco","co64","default_IV_size","entries","sinf","schi","tenc","stss","senc","sampleCount","InitializationVector","subsamples","subsampleCount","subsample","BytesOfClearData","BytesOfProtectedData","keyIds","systemId","toHex","numKeyIds","keyId","data_size","kid","system_id","entryCount","b","av01","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","colorType","readString","colorPrimaries","transferCharacteristics","matrixCoefficients","fullRangeFlag","iccProfile","readToUint8","bodyStart","parseVisualSampleEntry","av1C","colr","bitdepth","bit","fromByte","marker","seqProfile","seqLevelIdx0","seqTier0","highBitdepth","twelveBit","monochrome","chromaSubsamplingX","chromaSubsamplingY","chromaSamplePosition","reserved","initialPresentationDelayPresent","initialPresentationDelayMinusOne","configOBUs","configurationVersion","AVCProfileIndication","AVCLevelIndication","lengthSizeMinusOne","spsLength","ppsLength","tmp","generalProfileCompatibility","avgFrameRate","_ret$vps","nalus","_ret$sps","_ret$pps","hSpacing","vSpacing","parseAudioSampleEntry","byteRead","tag","substring","padStart","firstChunk","samplesPerChunk","entrySizes","mfhd","traf","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","_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","pad","charstr","maxlen","chars","r","hex","FMP4Demuxer","partData","partDataStart","videoExist","audioExist","isAV01","dataStart","__lastRemainData","lastRemainDataEnd","__lastRemainDataStart","noDuplicateData","__nextMoofStart","moovBox","dataEnd","moovToTrack","moofBoxes","moofBox","_toConsumableArray","w","__loadedMoofWraps","nextMoofStart","sort","n","_createForOfIteratorHelper","_loop","moofWrap","moofStart","moofToSamples","videoBaseMediaDecodeTime","audioBaseMediaDecodeTime","keys","k","some","xStart","sampleData","e","f","videoData","baseOffset","Concat","Buffer","self","_len2","_key2","UINT32_MAX","MP4","FTYPHEV1","FTYPAVC1","init","ftyp","content","types","mvex","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","opus","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","opusAudioDescription","opusSpecificConfig","dOps","Opus","trex","sencLength","isVideo","videoSencLength","saiz","saio","trun1","sbgp","sdtp","extension","writeUint32","samplesLength","writeUint16","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","sampleLen","_samples$i","_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","_console3","_len3","_key3","_console4","_len4","_key4","_console5","group","table","groupEnd","FMP4Remuxer","options","browserVersions","exec","forceFirstIDR","openLog","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_offset2","_sample2","u","_offset","_sample","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","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","decoderAESCTRData","customDescryptHandler","sencBox","encodeWord","encodeBuffers","decodeBuffers","tempBuffer","decrypted","clearDataBuf","protectedDataLen","decodeProtectedData","dec","MP4Demuxer","videoSegmnents","audioSegmnents","_this$_videoSamples","_videoSamples","_this$_audioSamples","_audioSamples","moovToSamples","videoIndexRange","audioIndexRange","parseSamples","startByte","frame","_lastRemainBuffer","_lastRemainBufferStartPos","tryCnt","temp","errorMessage","videoEndByte","audioEndByte","startPts","endPts","decoderData","buffered","maxHole","buffers","bufLen","lastEnd","nextStart","nextEnd","prevStart","prevEnd","currentTime","behind","media","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","MSE_CHANGE_TYPE","OPTION","DASH","LICENSE","CUSTOM_LICENSE","MSE_HIJACK","EME_HIJACK","SIDX","NO_CANPLAY_ERROR","BUFFERBREAK_ERROR","WAITING_TIMEOUT_ERROR","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_CODEC_NOT_SUPPORTED","MEDIA_ERR_URL_EMPTY","ERR_CODE","_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","nowTime","text","_len5","logText","_key5","finLogText","logable","JSON","delLog","toLocaleString","reduceDepth","_typeof","objType","maxDepth","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","performance","now","getTime","SafeJSON","getMediaSource","preferMMS","ManagedMediaSource","MediaSource","isMMS","mediaSource","OP_NAME","MSE","_logger","queue","_queue","op","opName","_this2$_sourceBuffer$","_op$context","costtime","_opst","ranges","TimeRanges","getTimeRanges","_sourceBuffer","callback","_startQueue","_config","getDefaultConfig","bindMedia","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","readyState","_url","_this$mediaSource2","streaming","_mseFullFlag","VIDEO","isReduceDuration","bufferEnd","_enqueueBlockingOp","isEnded","_openPromise","isOpened","ms","addEventListener","onOpen","costTime","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","useMMS","_this6","wrap","_context","prev","unbindMedia","revokeObjectURL","src","_onStartStreaming","_onEndStreaming","URL","createObjectURL","disableRemotePlayback","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this7","_context2","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this8","changeType","_enqueueOp","createSource","_this9","_this9$_sourceBuffer$","appendBuffer","endTime","_this10","isInsertHead","remove","_this11","_this12","allClear","_this$_queue$type","initQueue","isinit","reason","_this13","setLiveSeekableRange","_this14","then","_callee3","waiters","_this15","_context3","prom","all","updating","_x2","_x3","_x4","_op$promise","_op$promise2","isFull","timestampOffset","_this16","_this17","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","milliSecond","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","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","catch","_error","_reader","st","getReader","_cache","_writeIdx","reader","pump","_this3$_range","startRange","curLen","retData","_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","getAllResponseHeaders","trim","split","parts","toLowerCase","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","sidxToSegments","audioSegments","videoSegments","segments","prevTime","prevOffset","_videoTrack$mdia","_audioTrack$mdia","getTrakSegments","moovToSegments","segmentDurations","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia$mdhd","segDuration","_stscEntries$","gop","gopDuration","lastFrame","segFrames","adjust","pushSegment","_segments2","_segFrames","curTime","moovToMeta","isFragmentMP4","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia3","_videoTrack$mdia3$min","_videoTrack$mdia3$min2","_videoTrack$mdia4","_videoTrack$mdia4$mdh","_audioTrack$mdia3","_audioTrack$mdia3$min","_audioTrack$mdia3$min2","_e1$esds","_audioTrack$mdia4","_audioTrack$mdia4$mdh","_t$mdia5","_t$mdia5$hdlr","_t$mdia6","_t$mdia6$hdlr","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee5","moovStart","OnProgressHandle","_context5","_callee4","state","_moovStart","parsedMoov","getCompletedBox","parsedSidx","_segments","_context4","loadData","loadMetaProcess","_res","_x10","_x7","_x8","_x9","_x5","_x6","_callee6","responses","parsedMoof","_context6","_x11","_x12","_x13","segmentIndex","_callee7","changeCurrent","_this$getSegmentByTim","_args7","_context7","getSegmentByTime","_loadSegment","loadSegmentByTime","_x14","_x15","_callee8","_args8","_context8","_x16","_callee10","_this$getSegmentByTim2","videos","audios","_context10","_callee9","_context9","_x18","_x17","_callee11","_args11","_context11","downloadInfo","_callee12","_context12","clear","_callee13","_context13","finish","_x19","_x20","_x21","_x22","_x23","_callee14","cacheKey","_context14","_getCacheKey","fromCache","_x24","_x25","_x26","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","fMP4Demuxer","_needInitSegment","_switchBitRate","enableWorker","Worker","workerSequence","transmuxerWorkerControl","muxRes","seekTime","changeBitRateTime","bitRateInfo","changeUrl","newMessage","errorHandler","getMetaInfo","isLoading","isEmitMetaEvent","startPos","onProgressHandle","_args6","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","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","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/aac.js","../../xgplayer-transmuxer/src/codec/nalu.js","../../xgplayer-transmuxer/src/codec/avc.js","../../xgplayer-transmuxer/src/codec/hevc.js","../../xgplayer-transmuxer/src/codec/opus.js","../../xgplayer-transmuxer/src/flv/fixer.js","../../xgplayer-transmuxer/src/flv/amf.js","../../xgplayer-transmuxer/src/flv/soundFormat.js","../../xgplayer-transmuxer/src/flv/index.js","../../xgplayer-transmuxer/src/mpeg-ts/index.js","../../xgplayer-transmuxer/src/utils/byte-reader.ts","../../xgplayer-transmuxer/src/utils/bit-reader.ts","../../xgplayer-transmuxer/src/mp4/mp4-parser.js","../../xgplayer-transmuxer/src/mp4/fmp4-demuxer.js","../../xgplayer-transmuxer/src/mp4/buffer.js","../../xgplayer-transmuxer/src/mp4/mp4.js","../../xgplayer-transmuxer/src/mp4/logger.js","../../../node_modules/crypto-es/lib/md5.js","../../xgplayer-transmuxer/src/mp4/fmp4-remuxer.js","../../../node_modules/crypto-es/lib/core.js","../../../node_modules/crypto-es/lib/enc-base64.js","../../../node_modules/crypto-es/lib/evpkdf.js","../../../node_modules/crypto-es/lib/cipher-core.js","../../../node_modules/crypto-es/lib/aes.js","../../../node_modules/crypto-es/lib/mode-ctr.js","../../../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/buffer.js","../../xgplayer-streaming-shared/src/env.js","../../xgplayer-streaming-shared/src/error.js","../../xgplayer-streaming-shared/src/logger.js","../../xgplayer-streaming-shared/src/utils.js","../../xgplayer-streaming-shared/src/mse.js","../../xgplayer-streaming-shared/src/net/types.js","../../xgplayer-streaming-shared/src/net/error.js","../../xgplayer-streaming-shared/src/is.js","../../xgplayer-streaming-shared/src/net/helper.js","../../xgplayer-streaming-shared/src/event.js","../../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 AV1: 'av1',\n AVC: 'avc',\n HEVC: 'hevc'\n}\n\n/** @enum {string} */\nexport const AudioCodecType = {\n AAC: 'aac',\n G711PCMA: 'g7110a',\n G711PCMU: 'g7110m',\n OPUS: 'opus',\n MP3: 'mp3'\n}\n\n/** @enum {string} */\nexport const WarningType = {\n LARGE_AV_SHIFT: 'LARGE_AV_SHIFT',\n LARGE_VIDEO_GAP: 'LARGE_VIDEO_GAP',\n LARGE_VIDEO_GAP_BETWEEN_CHUNK: 'LARGE_VIDEO_GAP_BETWEEN_CHUNK',\n LARGE_AUDIO_GAP: 'LARGE_AUDIO_GAP',\n AUDIO_FILLED: 'AUDIO_FILLED',\n AUDIO_DROPPED: 'AUDIO_DROPPED'\n}\n","import { TrackType, VideoCodecType } from './types'\n\nexport class VideoTrack {\n id = 1\n\n /** @readonly */\n type = TrackType.VIDEO\n\n codecType = VideoCodecType.AVC\n\n pid = -1 // ts use\n\n /** @type {Uint8Array | Object} */\n hvcC = undefined\n\n codec = ''\n\n timescale = 0\n\n formatTimescale = 0\n\n sequenceNumber = 0\n\n baseMediaDecodeTime = 0\n\n baseDts = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./video-sample').VideoSample[]} */\n samples = []\n\n /** @type {Uint8Array[]} */\n pps = []\n\n /** @type {Uint8Array[]} */\n sps = []\n\n /** @type {Uint8Array[]} */\n vps = []\n\n fpsNum = 0\n\n fpsDen = 0\n\n /** @type {[number, number]} */\n sarRatio = [] // [hSpacing, vSpacing]\n\n width = 0\n\n height = 0\n\n nalUnitSize = 4\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n isVideo = true\n\n lastKeyFrameDts = 0\n\n kid = null\n\n pssh = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber =\n this.width =\n this.height =\n this.fpsDen =\n this.fpsNum =\n this.duration =\n this.baseMediaDecodeTime =\n this.timescale = 0\n this.codec = ''\n this.present = false\n this.pid = -1\n this.pps = []\n this.sps = []\n this.vps = []\n this.sarRatio = []\n this.samples = []\n this.warnings = []\n this.hvcC = null\n }\n\n get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n if (/av01/.test(this.codec)) {\n return true\n }\n return !!(this.pps.length && this.sps.length && this.codec)\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption (){\n return this.isVideoEncryption\n }\n}\n","import { TrackType, AudioCodecType } from './types'\n\nexport class AudioTrack {\n id = 2\n\n /** @readonly */\n type = TrackType.AUDIO\n\n codecType = AudioCodecType.AAC\n\n pid = -1\n\n codec = ''\n\n container = ''\n\n sequenceNumber = 0\n\n sampleDuration = 0\n\n timescale = 0\n\n formatTimescale = 0\n\n baseMediaDecodeTime = 0\n\n duration = 0\n\n warnings = []\n\n /** @type {import('./audio-sample').AudioSample[]} */\n samples = []\n\n baseDts = 0\n\n sampleSize = 16\n\n sampleRate = 0\n\n channelCount = 0\n\n objectType = 0\n\n sampleRateIndex = 0\n\n /** @type {number[]} */\n config = []\n\n present = false\n\n isVideoEncryption = false\n\n isAudioEncryption = false\n\n kid = null\n\n /** @type {any} */\n ext\n\n reset () {\n this.sequenceNumber = 0\n this.timescale = 0\n this.sampleDuration = 0\n this.sampleRate = 0\n this.channelCount = 0\n this.baseMediaDecodeTime = 0\n this.present = false\n this.pid = -1\n this.codec = ''\n this.samples = []\n this.config = []\n this.warnings = []\n }\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!(\n this.sampleRate &&\n this.channelCount &&\n (this.codec || this.container) &&\n (this.codecType === AudioCodecType.AAC ||\n this.codecType === AudioCodecType.G711PCMA ||\n this.codecType === AudioCodecType.G711PCMU ||\n this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3)\n )\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!this.samples.length\n }\n\n get isEncryption () {\n return this.isAudioEncryption\n }\n\n get firstDts () {\n return this.samples.length ? this.samples[0].dts : null\n }\n\n get firstPts () {\n return this.samples.length ? this.samples[0].pts : null\n }\n\n get samplesDuration () {\n if (this.samples.length > 0) {\n const first = this.samples[0]\n const last = this.samples[this.samples.length - 1]\n return last.dts - first.dts + last.duration\n }\n return 0\n }\n}\n","/**\n * @typedef {Object} VideoFlag\n * @property {number} [isLeading=0]\n * @property {number} [dependsOn=1]\n * @property {number} [isDependedOn=0]\n * @property {number} [hasRedundancy=0]\n * @property {number} [paddingValue=0]\n * @property {number} [degradationPriority=0]\n * @property {number} [isNonSyncSample=1]\n */\n\nexport class VideoSample {\n /** @type {VideoFlag} */\n flag = {}\n\n keyframe = false\n\n gopId = 0\n\n duration = 0\n\n size = 0\n\n units = []\n\n chromaFormat = 420\n\n // sampleOffset = 0\n\n /**\n * @param {number} pts\n * @param {number} dts\n * @param {Uint8Array[]} [units]\n */\n constructor (pts, dts, units) {\n this.originPts = this.pts = pts\n this.originDts = this.dts = dts\n if (units) this.units = units\n }\n\n /**\n * @returns {number}\n */\n get cts () {\n return this.pts - this.dts\n }\n\n setToKeyframe () {\n this.keyframe = true\n this.flag.dependsOn = 2\n this.flag.isNonSyncSample = 0\n }\n}\n","export class AudioSample {\n duration = 1024\n\n flag = { dependsOn: 2, isNonSyncSample: 0 }\n keyframe = true\n\n /**\n * @param {number} pts\n * @param {Uint8Array} data\n * @param {number} [duration=1024]\n */\n constructor (pts, data, duration, sampleOffset) {\n this.originPts = this.pts = this.dts = pts\n this.data = data\n this.size = data.byteLength\n this.sampleOffset = sampleOffset\n if (duration) this.duration = duration\n }\n}\n","import { TrackType } from './types'\n\nclass Sample {\n time = 0 // second\n\n /**\n * @param {Object} data\n * @param {number} pts\n */\n constructor (data, pts) {\n this.data = data\n this.originPts = this.pts = pts\n }\n}\n\nexport class FlvScriptSample extends Sample {}\n\nexport class SeiSample extends Sample {}\n\nexport class MetadataTrack {\n /** @readonly */\n id = 3\n\n /** @readonly */\n type = TrackType.METADATA\n\n timescale = 0\n\n /** @type {FlvScriptSample[]} */\n flvScriptSamples = []\n\n /** @type {SeiSample[]} */\n seiSamples = []\n\n /**\n * @returns {boolean}\n */\n exist () {\n return !!((this.flvScriptSamples.length || this.seiSamples.length) && this.timescale)\n }\n\n reset () {\n this.timescale = 0\n this.flvScriptSamples = []\n this.seiSamples = []\n }\n\n /**\n * @returns {boolean}\n */\n hasSample () {\n return !!(this.flvScriptSamples.length || this.seiSamples.length)\n }\n}\n","export class ExpGolomb {\n _bytesAvailable\n\n _bitsAvailable = 0\n\n _word = 0\n\n constructor (data) {\n if (!data) throw new Error('ExpGolomb data params is required')\n this._data = data\n this._bytesAvailable = data.byteLength\n if (this._bytesAvailable) this._loadWord()\n }\n\n get bitsAvailable () {\n return this._bitsAvailable\n }\n\n _loadWord () {\n const position = this._data.byteLength - this._bytesAvailable\n const availableBytes = Math.min(4, this._bytesAvailable)\n if (availableBytes === 0) throw new Error('No bytes available')\n\n const workingBytes = new Uint8Array(4)\n workingBytes.set(this._data.subarray(position, position + availableBytes))\n\n this._word = new DataView(workingBytes.buffer).getUint32(0)\n this._bitsAvailable = availableBytes * 8\n this._bytesAvailable -= availableBytes\n }\n\n skipBits (count) {\n if (this._bitsAvailable > count) {\n this._word <<= count\n this._bitsAvailable -= count\n } else {\n count -= this._bitsAvailable\n const skipBytes = Math.floor(count / 8)\n count -= (skipBytes * 8)\n this._bytesAvailable -= skipBytes\n this._loadWord()\n this._word <<= count\n this._bitsAvailable -= count\n }\n }\n\n readBits (size) {\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits')\n }\n\n let bits = Math.min(this._bitsAvailable, size)\n const val = this._word >>> (32 - bits)\n\n this._bitsAvailable -= bits\n if (this._bitsAvailable > 0) {\n this._word <<= bits\n } else if (this._bytesAvailable > 0) {\n this._loadWord()\n }\n\n bits = size - bits\n if (bits > 0 && this._bitsAvailable) {\n return (val << bits) | this.readBits(bits)\n }\n return val\n }\n\n skipLZ () {\n let leadingZeroCount\n for (\n leadingZeroCount = 0;\n leadingZeroCount < this._bitsAvailable;\n ++leadingZeroCount\n ) {\n if ((this._word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n this._word <<= leadingZeroCount\n this._bitsAvailable -= leadingZeroCount\n return leadingZeroCount\n }\n }\n this._loadWord()\n return leadingZeroCount + this.skipLZ()\n }\n\n skipUEG () {\n this.skipBits(1 + this.skipLZ())\n }\n\n readUEG () {\n const clz = this.skipLZ()\n return this.readBits(clz + 1) - 1\n }\n\n readEG () {\n const val = this.readUEG()\n if (1 & val) {\n return (1 + val) >>> 1\n }\n return -1 * (val >>> 1)\n }\n\n readBool () {\n return this.readBits(1) === 1\n }\n\n readUByte () {\n return this.readBits(8)\n }\n\n skipScalingList (count) {\n let lastScale = 8\n let nextScale = 8\n let deltaScale\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = this.readEG()\n nextScale = (lastScale + deltaScale + 256) % 256\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n}\n","export class Logger {\n constructor (name) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","export class UTF8 {\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {string}\n */\n static decode (uint8array) {\n const out = []\n const input = uint8array\n let i = 0\n const length = uint8array.length\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]))\n ++i\n continue\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (UTF8._checkContinuation(input, i, 1)) {\n const ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F)\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 2\n continue\n }\n }\n } else if (input[i] < 0xF0) {\n if (UTF8._checkContinuation(input, i, 2)) {\n const ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF))\n i += 3\n continue\n }\n }\n } else if (input[i] < 0xF8) {\n if (UTF8._checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 |\n (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F)\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800))\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00))\n i += 4\n continue\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD))\n ++i\n }\n\n return out.join('')\n }\n\n static _checkContinuation (uint8array, start, checkLength) {\n const array = uint8array\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80) {\n return false\n }\n }\n return true\n } else {\n return false\n }\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n\nconst ua = isBrowser && navigator.userAgent.toLocaleLowerCase()\n\n// eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\nexport const isSafari = isBrowser && /^((?!chrome|android).)*safari/.test(ua)\nexport const isFirefox = isBrowser && ua.includes('firefox')\nexport const isAndroid = isBrowser && ua.includes('android')\n","/* c8 ignore next 4 */\nexport { ExpGolomb } from './exp-golomb'\nexport { Logger } from './logger'\nexport { UTF8 } from './utf8'\nexport * from './env'\n\nexport function concatUint8Array (...arr) {\n arr = arr.filter(Boolean)\n const data = new Uint8Array(arr.reduce((p, c) => p + c.byteLength, 0))\n let prevLen = 0\n arr.forEach((d) => {\n data.set(d, prevLen)\n prevLen += d.byteLength\n })\n return data\n}\n\nexport const MAX_SIZE = Math.pow(2, 32)\n\nexport function readBig16 (data, i = 0) {\n return (data[i] << 8) + (data[i + 1] || 0)\n}\n\nexport function readBig24 (data, i = 0) {\n return (data[i] << 16) + (data[i + 1] << 8) + (data[i + 2] || 0)\n}\n\nexport function readBig32 (data, i = 0) {\n return (data[i] << 24 >>> 0) + (data[i + 1] << 16) + (data[i + 2] << 8) + (data[i + 3] || 0)\n}\n\nexport function readBig64 (data, i = 0) {\n return readBig32(data, i) * MAX_SIZE + readBig32(data, i + 4)\n}\n\nexport function getAvcCodec (codecs) {\n let codec = 'avc1.'\n let h\n for (let i = 0; i < 3; i++) {\n h = codecs[i].toString(16)\n if (h.length < 2) h = `0${h}`\n codec += h\n }\n return codec\n}\n\nexport function formatIV (arr) {\n let iv = ''\n arr.forEach(value => {\n iv += bufferToString(value)\n })\n if (iv.length <= 32) {\n const len = 32 - iv.length\n for (let i = 0; i < len; i++) {\n iv += '0'\n }\n }\n return iv\n}\n\nexport function parse (a) {\n if (!Array.isArray(a)) {\n const arr = []\n let value = ''\n for (let i = 0; i < a.length; i++) {\n if (i % 2) {\n value = a[i - 1] + a[i]\n arr.push(parseInt(value, 16))\n value = ''\n }\n }\n return arr\n }\n return a.map(item => { return parseInt(item, 16) })\n}\nfunction bufferToString (value) {\n return ('0' + (Number(value).toString(16))).slice(-2).toUpperCase()\n}\n\nexport function hashVal (str) {\n let hash = 0; let i; let chr\n if (str.length === 0) return hash\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + chr\n hash |= 0\n }\n return hash\n}\n\nexport function combineToFloat (integer, decimal) {\n return Number(integer + '.' + decimal)\n}\n\nexport function toDegree (matrix) {\n if (matrix.length < 5)\n return 0\n const scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4])\n return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI\n}\n","import { isFirefox, isAndroid } from '../utils'\n\nexport class AAC {\n static FREQ = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350\n ];\n\n static getRateIndexByRate (rate) {\n return AAC.FREQ.indexOf(rate)\n }\n\n static parseADTS (data, pts) {\n const len = data.length\n let i = 0\n\n while ((i + 2) < len) {\n if (data[i] === 0xff && (data[i + 1] & 0xf6) === 0xf0) {\n break\n }\n i++\n }\n\n if (i >= len) return\n\n const skip = i\n const frames = []\n const samplingFrequencyIndex = (data[i + 2] & 0x3c) >>> 2\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n if (!sampleRate) throw new Error(`Invalid sampling index: ${samplingFrequencyIndex}`)\n const objectType = ((data[i + 2] & 0xc0) >>> 6) + 1\n const channelCount = ((data[i + 2] & 1) << 2) | ((data[i + 3] & 0xc0) >>> 6)\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n let protectionSkipBytes\n let frameLength\n let frameIndex = 0\n const duration = AAC.getFrameDuration(sampleRate)\n\n while ((i + 7) < len) {\n if ((data[i] !== 0xff) || (data[i + 1] & 0xF6) !== 0xf0) {\n i++\n continue\n }\n\n frameLength = ((data[i + 3] & 0x03) << 11) | (data[i + 4] << 3) | ((data[i + 5] & 0xe0) >> 5)\n if (!frameLength || (len - i) < frameLength) break\n\n protectionSkipBytes = (~data[i + 1] & 0x01) * 2\n frames.push({\n pts: pts + frameIndex * duration,\n data: data.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n })\n\n frameIndex++\n i += frameLength\n }\n\n return {\n skip,\n remaining: i >= len ? undefined : data.subarray(i),\n frames,\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n codec,\n config,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static parseAudioSpecificConfig (data) {\n if (!data.length) return\n const objectType = data[0] >>> 3\n const samplingFrequencyIndex = ((data[0] & 0x07) << 1) | (data[1] >>> 7)\n const channelCount = (data[1] & 0x78) >>> 3\n const sampleRate = AAC.FREQ[samplingFrequencyIndex]\n // play as no audio track stream\n if (!sampleRate) return\n const { config, codec } = AAC._getConfig(samplingFrequencyIndex, channelCount, objectType)\n\n return {\n samplingFrequencyIndex,\n sampleRate,\n objectType,\n channelCount,\n config,\n codec,\n originCodec: `mp4a.40.${objectType}`\n }\n }\n\n static getFrameDuration (rate, timescale = 90000) {\n return 1024 * timescale / rate\n }\n\n static _getConfig (samplingIndex, channelCount, originObjectType) {\n const config = []\n let objectType\n let extensionSamplingIndex\n if (isFirefox) {\n if (samplingIndex >= 6) { // use SBR (HE-AAC)\n objectType = 5\n extensionSamplingIndex = samplingIndex - 3\n } else { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n } else if (isAndroid) { // use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n } else { // use HE-AAC\n objectType = 5\n extensionSamplingIndex = samplingIndex\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3\n } else if (channelCount === 1) { // Mono channel, use LC-AAC\n objectType = 2\n extensionSamplingIndex = samplingIndex\n }\n }\n\n config[0] = objectType << 3\n config[0] |= (samplingIndex & 0x0e) >> 1\n config[1] = (samplingIndex & 0x01) << 7\n config[1] |= channelCount << 3\n if (objectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0e) >> 1)\n config[2] = (extensionSamplingIndex & 0x01) << 7\n config[2] |= (2 << 2)\n config[3] = 0\n }\n\n return {\n config,\n codec: `mp4a.40.${objectType}`\n }\n }\n\n /* c8 ignore next 65 */\n static getSilentFrame (codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e\n ])\n } if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38\n ])\n } if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38\n ])\n } if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0\n ])\n }\n break\n default:\n if (channelCount === 1) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 2) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n } if (channelCount === 3) {\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e\n ])\n }\n break\n }\n }\n}\n","import { readBig32 } from '../utils'\n\nexport class NALu {\n /**\n * @param {Uint8Array} data\n * @returns {Uint8Array[]}\n */\n static parseAnnexB (data) {\n let j = data.byteLength - 1\n let dropZerosLength = 0\n // Collect tailing zeros.\n // end with 0x000000 and more...\n do {\n if (data[j] === 0x00) {\n dropZerosLength++\n } else {\n break\n }\n\n j--\n } while (j > 0)\n\n if (dropZerosLength >= 3) {\n // drop tailing zeros.\n data = data.subarray(0, j + 1)\n }\n\n const len = data.length\n let start = 2\n let end = 0\n while (data[start] !== null && data[start] !== undefined && data[start] !== 1) {\n start++\n }\n start++\n end = start + 2\n\n if (end >= len) return []\n\n const units = []\n\n while (end < len) {\n switch (data[end]) {\n case 0:\n if (data[end - 1] !== 0) {\n end += 2\n break\n } else if (data[end - 2] !== 0) {\n end++\n break\n } else if (end < len - 1 && data[end + 1] !== 1) {\n end++\n break\n }\n\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n\n do {\n end++\n } while (data[end] !== 1 && end < len)\n start = end + 1\n end = start + 2\n break\n case 1:\n if (data[end - 1] !== 0 || data[end - 2] !== 0) {\n end += 3\n break\n }\n if (start !== end - 2) units.push(data.subarray(start, end - 2))\n start = end + 1\n end = start + 2\n break\n default:\n end += 3\n break\n }\n }\n\n if (start < len) units.push(data.subarray(start))\n\n return units\n }\n\n static parseAvcC (data, size = 4) {\n if (data.length < 4) return\n const dataLen = data.length\n const units = []\n\n let offset = 0\n let length\n while ((offset + size) < dataLen) {\n length = readBig32(data, offset)\n if (size === 3) length >>>= 8\n offset += size\n\n if (!length) continue\n if (offset + length > dataLen) {\n break\n }\n\n units.push(data.subarray(offset, offset + length))\n offset += length\n }\n\n return units\n }\n\n static parseSEI (unit, isHevc) {\n const len = unit.length\n let i = isHevc ? 2 : 1\n let type = 0\n let size = 0\n let uuid = ''\n\n while (unit[i] === 255) {\n type += 255\n i++\n }\n\n type += unit[i++]\n\n while (unit[i] === 255) {\n size += 255\n i++\n }\n size += unit[i++]\n\n if (type === 5 && len > i + 16) {\n for (let j = 0; j < 16; j++) {\n uuid += unit[i].toString(16)\n i++\n }\n }\n\n return {\n payload: unit.subarray(i, i + size), type, size, uuid\n }\n }\n\n static removeEPB (uint) {\n const length = uint.byteLength\n const emulationPreventionBytesPositions = []\n let i = 1\n\n while (i < length - 2) {\n if (uint[i] === 0 && uint[i + 1] === 0 && uint[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2)\n i += 2\n } else {\n i++\n }\n }\n\n if (!emulationPreventionBytesPositions.length) return uint\n\n const newLength = length - emulationPreventionBytesPositions.length\n const newData = new Uint8Array(newLength)\n\n let sourceIndex = 0\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n sourceIndex++\n emulationPreventionBytesPositions.shift()\n }\n newData[i] = uint[sourceIndex]\n }\n\n return newData\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb, getAvcCodec } from '../utils'\n\nexport class AVC {\n static parseAVCDecoderConfigurationRecord (data) {\n if (data.length < 7) return\n const nalUnitSize = (data[4] & 3) + 1\n\n let spsParsed\n const spsArr = []\n const ppsArr = []\n\n let offset = 6\n const spsCount = data[5] & 0x1f\n let spsSize\n for (let i = 0; i < spsCount; i++) {\n spsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!spsSize) continue\n\n const sps = data.subarray(offset, offset + spsSize)\n offset += spsSize\n spsArr.push(sps)\n\n if (!spsParsed) {\n spsParsed = AVC.parseSPS(NALu.removeEPB(sps))\n }\n }\n\n const ppsCount = data[offset]\n offset++\n let ppsSize\n for (let i = 0; i < ppsCount; i++) {\n ppsSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!ppsSize) continue\n ppsArr.push(data.subarray(offset, offset + ppsSize))\n offset += ppsSize\n }\n\n return {\n sps: spsParsed,\n spsArr,\n ppsArr,\n nalUnitSize\n }\n }\n\n static parseSPS (unit) {\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n\n const profileIdc = eg.readUByte()\n const profileCompatibility = eg.readUByte()\n const levelIdc = eg.readUByte()\n eg.skipUEG()\n\n let chromaFormat = 420\n if (\n profileIdc === 100 ||\n profileIdc === 110 ||\n profileIdc === 122 ||\n profileIdc === 244 ||\n profileIdc === 44 ||\n profileIdc === 83 ||\n profileIdc === 86 ||\n profileIdc === 118 ||\n profileIdc === 128 ||\n profileIdc === 138 ||\n profileIdc === 144\n ) {\n const chromaFormatIdc = eg.readUEG()\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n if (chromaFormatIdc === 3) eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n eg.skipBits(1)\n if (eg.readBool()) {\n const scalingListCount = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < scalingListCount; i++) {\n if (eg.readBool()) {\n if (i < 6) {\n eg.skipScalingList(16)\n } else {\n eg.skipScalingList(64)\n }\n }\n }\n }\n }\n\n eg.skipUEG()\n const picOrderCntType = eg.readUEG()\n if (picOrderCntType === 0) {\n eg.readUEG()\n } else if (picOrderCntType === 1) {\n eg.skipBits(1)\n eg.skipUEG()\n eg.skipUEG()\n const numRefFramesInPicOrderCntCycle = eg.readUEG()\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n eg.skipUEG()\n }\n }\n\n eg.skipUEG()\n eg.skipBits(1)\n const picWidthInMbsMinus1 = eg.readUEG()\n const picHeightInMapUnitsMinus1 = eg.readUEG()\n const frameMbsOnlyFlag = eg.readBits(1)\n if (frameMbsOnlyFlag === 0) eg.skipBits(1)\n eg.skipBits(1)\n\n let frameCropLeftOffset = 0\n let frameCropRightOffset = 0\n let frameCropTopOffset = 0\n let frameCropBottomOffset = 0\n\n if (eg.readBool()) {\n frameCropLeftOffset = eg.readUEG()\n frameCropRightOffset = eg.readUEG()\n frameCropTopOffset = eg.readUEG()\n frameCropBottomOffset = eg.readUEG()\n }\n\n let sarRatio\n let fixedFrame\n let fpsNum\n let fpsDen\n let fps\n if (eg.readBool()) {\n if (eg.readBool()) {\n const aspectRatioIdc = eg.readUByte()\n switch (aspectRatioIdc) {\n case 1: sarRatio = [1, 1]; break\n case 2: sarRatio = [12, 11]; break\n case 3: sarRatio = [10, 11]; break\n case 4: sarRatio = [16, 11]; break\n case 5: sarRatio = [40, 33]; break\n case 6: sarRatio = [24, 11]; break\n case 7: sarRatio = [20, 11]; break\n case 8: sarRatio = [32, 11]; break\n case 9: sarRatio = [80, 33]; break\n case 10: sarRatio = [18, 11]; break\n case 11: sarRatio = [15, 11]; break\n case 12: sarRatio = [64, 33]; break\n case 13: sarRatio = [160, 99]; break\n case 14: sarRatio = [4, 3]; break\n case 15: sarRatio = [3, 2]; break\n case 16: sarRatio = [2, 1]; break\n case 255: {\n sarRatio = [\n (eg.readUByte() << 8) | eg.readUByte(),\n (eg.readUByte() << 8) | eg.readUByte()\n ]\n break\n }\n default:\n }\n }\n\n if (eg.readBool()) eg.readBool()\n\n if (eg.readBool()) {\n eg.readBits(4)\n if (eg.readBool()) eg.readBits(24)\n }\n\n if (eg.readBool()) {\n eg.readUEG()\n eg.readUEG()\n }\n\n if (eg.readBool()) {\n const numUnitsInTick = eg.readBits(32)\n const timeScale = eg.readBits(32)\n fixedFrame = eg.readBool()\n\n fpsNum = timeScale\n fpsDen = numUnitsInTick * 2\n fps = fpsNum / fpsDen\n }\n }\n\n return {\n codec: getAvcCodec(unit.subarray(1, 4)),\n profileIdc,\n profileCompatibility,\n levelIdc,\n chromaFormat,\n width: Math.ceil(\n (picWidthInMbsMinus1 + 1) * 16 -\n 2 * (frameCropLeftOffset + frameCropRightOffset)\n ),\n height:\n (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n (frameMbsOnlyFlag ? 2 : 4) *\n (frameCropTopOffset + frameCropBottomOffset),\n sarRatio,\n fpsNum,\n fpsDen,\n fps,\n fixedFrame\n }\n }\n}\n","import { NALu } from './nalu'\nimport { ExpGolomb } from '../utils'\n\nexport class HEVC {\n static parseHEVCDecoderConfigurationRecord (data, hvcC = {}) {\n if (data.length < 23) return\n hvcC = hvcC || {}\n const nalUnitSize = (data[21] & 3) + 1\n\n let vpsParsed\n let spsParsed\n const spsArr = []\n const ppsArr = []\n const vpsArr = []\n\n let offset = 23\n const numOfArrays = data[22]\n\n let nalUnitType\n let numNalus\n let nalSize\n for (let i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f\n numNalus = (data[offset + 1] << 8) | data[offset + 2]\n\n offset += 3\n\n for (let j = 0; j < numNalus; j++) {\n nalSize = (data[offset] << 8) | data[offset + 1]\n offset += 2\n if (!nalSize) continue\n switch (nalUnitType) {\n case 32: {\n const vps = data.subarray(offset, offset + nalSize)\n if (!vpsParsed) vpsParsed = HEVC.parseVPS(NALu.removeEPB(vps), hvcC)\n vpsArr.push(vps)\n }\n break\n case 33: {\n const sps = data.subarray(offset, offset + nalSize)\n if (!spsParsed) spsParsed = HEVC.parseSPS(NALu.removeEPB(sps), hvcC)\n spsArr.push(sps)\n }\n break\n case 34:\n ppsArr.push(data.subarray(offset, offset + nalSize))\n break\n default:\n }\n\n offset += nalSize\n }\n }\n\n return {\n hvcC,\n sps: spsParsed,\n spsArr,\n ppsArr,\n vpsArr,\n nalUnitSize\n }\n }\n\n static parseVPS (unit, hvcC) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(12)\n const vpsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(hvcC.numTemporalLayers || 0, vpsMaxSubLayersMinus1 + 1)\n eg.readBits(17)\n HEVC._parseProfileTierLevel(eg, vpsMaxSubLayersMinus1, hvcC)\n\n return hvcC\n }\n\n static parseSPS (unit, hvcC = {}) {\n hvcC = hvcC || {}\n const eg = new ExpGolomb(unit)\n eg.readUByte()\n eg.readUByte()\n\n eg.readBits(4)\n const spsMaxSubLayersMinus1 = eg.readBits(3)\n hvcC.numTemporalLayers = Math.max(spsMaxSubLayersMinus1 + 1, hvcC.numTemporalLayers || 0)\n hvcC.temporalIdNested = eg.readBits(1)\n HEVC._parseProfileTierLevel(eg, spsMaxSubLayersMinus1, hvcC)\n\n eg.readUEG() // sps_seq_parameter_set_id\n\n const chromaFormatIdc = hvcC.chromaFormatIdc = eg.readUEG()\n let chromaFormat = 420\n if (chromaFormatIdc <= 3) chromaFormat = [0, 420, 422, 444][chromaFormatIdc]\n\n let separateColourPlaneFlag = 0\n if (chromaFormatIdc === 3) {\n separateColourPlaneFlag = eg.readBits(1)\n }\n\n let width = eg.readUEG() // pic_width_in_luma_samples\n let height = eg.readUEG() // pic_height_in_luma_samples\n\n const conformanceWindowFlag = eg.readBits(1)\n\n let confWinLeftOffset\n let confWinRightOffset\n let confWinTopOffset\n let confWinBottomOffset\n if (conformanceWindowFlag === 1) {\n confWinLeftOffset = eg.readUEG() // conf_win_left_offset\n confWinRightOffset = eg.readUEG() // conf_win_right_offset\n confWinTopOffset = eg.readUEG() // conf_win_top_offset\n confWinBottomOffset = eg.readUEG() // conf_win_bottom_offset\n }\n\n hvcC.bitDepthLumaMinus8 = eg.readUEG() // bit_depth_luma_minus8\n hvcC.bitDepthChromaMinus8 = eg.readUEG() // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n const subWidthC = (((chromaFormatIdc === 1) || (chromaFormatIdc === 2)) && (separateColourPlaneFlag === 0)) ? 2 : 1\n const subHeightC = ((chromaFormatIdc === 1) && (separateColourPlaneFlag === 0)) ? 2 : 1\n width -= (subWidthC * (confWinRightOffset + confWinLeftOffset))\n height -= (subHeightC * (confWinBottomOffset + confWinTopOffset))\n }\n\n return {\n codec: 'hev1.1.6.L93.B0',\n width,\n height,\n chromaFormat,\n hvcC\n }\n }\n\n static _parseProfileTierLevel (eg, maxSubLayersMinus1, hvcC) {\n const generalTierFlag = hvcC.generalTierFlag || 0\n hvcC.generalProfileSpace = eg.readBits(2)\n hvcC.generalTierFlag = Math.max(eg.readBits(1), generalTierFlag)\n hvcC.generalProfileIdc = Math.max(eg.readBits(5), hvcC.generalProfileIdc || 0)\n hvcC.generalProfileCompatibilityFlags = eg.readBits(32)\n hvcC.generalConstraintIndicatorFlags = [eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8), eg.readBits(8)]\n const generalLevelIdc = eg.readBits(8)\n if (generalTierFlag < hvcC.generalTierFlag) {\n hvcC.generalLevelIdc = generalLevelIdc\n } else {\n hvcC.generalLevelIdc = Math.max(generalLevelIdc, hvcC.generalLevelIdc || 0)\n }\n\n const subLayerProfilePresentFlag = []\n const subLayerLevelPresentFlag = []\n\n if (maxSubLayersMinus1 > eg.bitsAvailable) {\n throw new Error(`maxSubLayersMinus inavlid size ${maxSubLayersMinus1}`)\n }\n\n for (let j = 0; j < maxSubLayersMinus1; j++) {\n subLayerProfilePresentFlag[j] = eg.readBits(1)\n subLayerLevelPresentFlag[j] = eg.readBits(1)\n }\n\n if (maxSubLayersMinus1 > 0) {\n eg.readBits((8 - maxSubLayersMinus1) * 2)\n }\n\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i] !== 0) {\n eg.readBits(2)\n eg.readBits(1)\n eg.readBits(5)\n\n eg.readBits(16)\n eg.readBits(16)\n\n eg.readBits(4)\n\n eg.readBits(16)\n eg.readBits(16)\n eg.readBits(12)\n }\n if (subLayerLevelPresentFlag[i] !== 0) {\n eg.readBits(8)\n }\n }\n }\n}\n","/**\n * Opus documentation, https://opus-codec.org/docs/\n * Ogg Encapsulation for the Opus Audio Codec, https://datatracker.ietf.org/doc/html/rfc7845.html\n *\n * Packet Organization:\n *\n * Page 0 Pages 1 ... n Pages (n+1) ...\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * | | | | | | | | | | | | |\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * |||ID Header|| || Comment Header || ||Audio Data Packet 1| | ...\n * |+----------+| |+-----------------+| |+-------------------+ +-----\n * | | | | | | | | | | | | |\n * +------------+ +---+ +---+ ... +---+ +-----------+ +---------+ +--\n * ^ ^ ^\n * | | |\n * | | Mandatory Page Break\n * | |\n * | ID header is contained on a single page\n * |\n * 'Beginning Of Stream'\n */\nexport class OPUS {\n static getFrameDuration (samples, timescale = 1000) {\n return 20\n }\n\n /**\n * Identification Header + Comment Header\n * @param {Uint8Array} data\n */\n static parseHeaderPackets (data) {\n if (!data.length) return\n\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength)\n\n // Identification Header\n let magicSignature = ''\n for (let i = 0; i < 8; i++) {\n magicSignature += String.fromCodePoint(data[i])\n }\n if (magicSignature !== 'OpusHead') {\n throw new Error('Invalid Opus MagicSignature')\n }\n\n // skip version\n // data[8]\n // console.log('Pre-skip', data[8])\n\n const channelCount = data[9]\n\n // skip Pre-skip\n // data[10] & data[11]\n console.log('Pre-skip', data[10], data[11])\n\n const sampleRate = dv.getUint32(12, true)\n const outputGain = dv.getInt16(16, true)\n\n // const mappingFamily = dv.getUint8(18)\n\n // play as no audio track stream\n if (!sampleRate) return\n\n const codec = 'opus'\n const originCodec = 'opus'\n const config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8)\n\n return {\n outputGain,\n sampleRate,\n channelCount,\n config,\n codec,\n originCodec\n }\n }\n}\n","import { AudioCodecType, AudioSample, WarningType } from '../model'\nimport { AAC, OPUS } from '../codec'\nimport { isSafari } from '../utils'\n\nconst LARGE_AV_FIRST_FRAME_GAP = 500 // ms\nconst AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3\nconst MAX_SILENT_FRAME_DURATION = 1000 // ms\nconst AUDIO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst MAX_VIDEO_FRAME_DURATION = 1000 // ms\nconst MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200 // ms\nconst VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5000 // 5s\nconst TRACK_BROKEN_CHECK_TIME = 5\n\nexport class FlvFixer {\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n this.metadataTrack = metadataTrack\n\n this._baseDts = -1\n this._baseDtsInited = false\n\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastVideoDuration = 0\n\n // 在视频帧遇到下一个关键帧之前,如果音频时间戳发生了跳变,不能确定是否音视频都发生跳变还是单纯音频发生跳变.\n // 这里记录关键帧标识, 从下一个关键帧开始,如果视频没有跳变,才能判断是只有音频发生了跳变\n this._keyFrameInNextChunk = false\n\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n /**\n * @param {number} startTime 点播seek到的时间点\n * @param {boolean} discontinuity 是否换流\n * @param {boolean} contiguous 前后chunk时间戳是否连续\n */\n fix (startTime = 0, discontinuity = false, contiguous = true) {\n startTime = Math.round(startTime * 1000)\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n\n if (discontinuity || !contiguous) {\n this._videoLastSample = null\n this._audioNextPts = undefined\n this._videoNextDts = undefined\n this._audioTimestampBreak = 0\n this._videoTimestampBreak = 0\n this._lastAudioExceptionGapDot = -Infinity\n this._lastAudioExceptionOverlapDot = -Infinity\n this._lastAudioExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionLargeGapDot = -Infinity\n this._lastVideoExceptionChunkFirstDtsDot = -Infinity\n }\n\n if (discontinuity && !contiguous) {\n this._baseDtsInited = false\n }\n\n if (!this._baseDtsInited) {\n this._calculateBaseDts(audioTrack, videoTrack)\n }\n\n if (!contiguous && startTime) {\n this._audioNextPts = this._videoNextDts = startTime\n }\n\n const resetBaseDts = this._baseDtsInited &&\n (this._videoTimestampBreak || !this.videoTrack.exist()) &&\n (this._audioTimestampBreak || !this.audioTrack.exist())\n\n if (resetBaseDts) {\n this._resetBaseDtsWhenStreamBreaked()\n }\n\n this._fixAudio(audioTrack)\n\n this._keyFrameInNextChunk = false\n\n this._fixVideo(videoTrack)\n\n if (this.metadataTrack.exist()) {\n const timescale = this.metadataTrack.timescale\n this.metadataTrack.seiSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n this.metadataTrack.flvScriptSamples.forEach(s => {\n s.pts = s.originPts - this._baseDts\n s.time = Math.max(0, s.pts) / timescale\n })\n }\n\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].dts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts * audioTrack.timescale / 1000\n }\n }\n\n _fixVideo (videoTrack) {\n const samples = videoTrack.samples\n\n if (!samples.length) return\n\n samples.forEach(x => {\n x.dts -= this._baseDts\n x.pts -= this._baseDts\n if (x.keyframe) this._keyFrameInNextChunk = true\n })\n\n let refSampleDurationInt\n if (videoTrack.fpsNum && videoTrack.fpsDen) {\n refSampleDurationInt = videoTrack.timescale * (videoTrack.fpsDen / videoTrack.fpsNum)\n } else if (videoTrack.length > 1) {\n const first = videoTrack.samples[0]\n const last = videoTrack.samples[samples.length - 1]\n refSampleDurationInt = Math.floor((last.dts - first.dts) / (samples.length - 1))\n } else {\n refSampleDurationInt = this._lastVideoDuration || 40\n }\n\n const lastSample = samples.pop()\n\n if (this._videoLastSample) {\n samples.unshift(this._videoLastSample)\n }\n\n this._videoLastSample = lastSample\n\n if (!samples.length) return\n\n if (this._videoNextDts === undefined) {\n const samp0 = samples[0]\n this._videoNextDts = samp0.dts\n }\n\n const len = samples.length\n let sampleDuration = 0\n const firstSample = samples[0]\n const vDelta = this._videoNextDts - firstSample.dts\n\n if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {\n // emit large delta of first sample with expect\n if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts\n\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP_BETWEEN_CHUNK,\n nextDts: this._videoNextDts,\n firstSampleDts: firstSample.dts,\n nextSampleDts: samples[1]?.dts,\n sampleDuration: vDelta\n })\n }\n\n // only video break\n if (this._videoTimestampBreak >= TRACK_BROKEN_CHECK_TIME) {\n this._videoNextDts = firstSample.dts\n this._videoTimestampBreak = 0\n } else {\n // resolve first frame only\n firstSample.dts += vDelta\n firstSample.pts += vDelta\n if (!this.audioTrack.exist()) {\n this._videoTimestampBreak = 1\n }\n }\n }\n\n for (let i = 0; i < len; i++) {\n const dts = samples[i].dts\n const nextSample = samples[i + 1]\n\n if (i < len - 1) {\n sampleDuration = nextSample.dts - dts\n } else if (lastSample) {\n sampleDuration = lastSample.dts - dts\n } else {\n sampleDuration = refSampleDurationInt\n }\n\n if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {\n this._videoTimestampBreak++\n // emit stream break\n if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastVideoExceptionLargeGapDot = dts\n videoTrack.warnings.push({\n type: WarningType.LARGE_VIDEO_GAP,\n time: dts / videoTrack.timescale,\n dts,\n originDts: samples[i].originDts,\n nextDts: this._videoNextDts,\n sampleDuration,\n refSampleDuration: refSampleDurationInt\n })\n }\n\n sampleDuration = refSampleDurationInt\n }\n\n samples[i].duration = sampleDuration\n this._videoNextDts += sampleDuration\n this._lastVideoDuration = sampleDuration\n }\n }\n\n _fixAudio (audioTrack) {\n const samples = audioTrack.samples\n if (!samples.length) return\n\n // offset origin timestamp\n samples.forEach(x => {\n x.dts = x.pts -= this._baseDts\n })\n\n this._doFixAudioInternal(audioTrack, samples, 1000)\n }\n\n _calculateBaseDts (audioTrack, videoTrack) {\n const audioSamps = audioTrack.samples\n const videoSamps = videoTrack.samples\n\n if (!audioSamps.length && !videoSamps.length) {\n return false\n }\n\n let audioBasePts = Infinity\n let videoBaseDts = Infinity\n\n if (audioSamps.length) {\n audioTrack.baseDts = audioBasePts = audioSamps[0].pts\n }\n\n if (videoSamps.length) {\n videoTrack.baseDts = videoBaseDts = videoSamps[0].dts\n }\n\n this._baseDts = Math.min(audioBasePts, videoBaseDts)\n\n const delta = videoBaseDts - audioBasePts\n\n if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {\n videoTrack.warnings.push({\n type: WarningType.LARGE_AV_SHIFT,\n videoBaseDts,\n audioBasePts,\n baseDts: this._baseDts,\n delta\n })\n }\n\n this._baseDtsInited = true\n return true\n }\n\n _resetBaseDtsWhenStreamBreaked () {\n /**\n * timestamp break\n * _audioNextDts\n * ---------------------|\n * (_baseDts) _videoNextDts\n * ----------------------|\n * <----------------\n * nextVideo.dts\n * ----------------------------------------|\n * nextAudio.dts\n * ---------------------------------------|\n */\n\n // calc baseDts base on new samples\n const calc = this._calculateBaseDts(this.audioTrack, this.videoTrack)\n\n if (!calc) return\n\n // consider the expect dts for next frame\n if (!this.audioTrack.exist()){\n this._baseDts -= this._videoNextDts\n } else if (!this.videoTrack.exist()){\n this._baseDts -= this._audioNextPts\n } else {\n this._baseDts -= Math.min(this._audioNextPts, this._videoNextDts)\n }\n this._videoTimestampBreak = 0\n this._audioTimestampBreak = 0\n }\n\n _doFixAudioInternal (audioTrack, samples, timescale) {\n if (!audioTrack.sampleDuration) {\n switch (audioTrack.codecType) {\n case AudioCodecType.AAC: {\n audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale)\n break\n }\n case AudioCodecType.OPUS: {\n audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale)\n break\n }\n case AudioCodecType.G711PCMA:\n case AudioCodecType.G711PCMU: {\n audioTrack.sampleDuration = this._getG711Duration(audioTrack)\n break\n }\n default:\n console.error('can\\'t fix audio codecType:', audioTrack.codecType)\n break\n }\n }\n const refSampleDuration = audioTrack.sampleDuration\n\n const sampleDurationInSampleRate =\n audioTrack.codecType === AudioCodecType.OPUS\n ? 20\n : audioTrack.codecType === AudioCodecType.AAC\n ? 1024\n : (refSampleDuration * audioTrack.timescale) / 1000\n\n if (this._audioNextPts === undefined) {\n const samp0 = samples[0]\n this._audioNextPts = samp0.pts\n }\n\n for (let i = 0; i < samples.length; i++) {\n let nextPts = this._audioNextPts\n const sample = samples[i]\n let delta = sample.pts - nextPts\n\n // only audio break\n if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_CHECK_TIME && this._keyFrameInNextChunk) {\n nextPts = this._audioNextPts = sample.dts\n delta = 0\n this._audioTimestampBreak = 0\n }\n\n // fill frames\n // delta >= 3 * refSampleDurationInt\n // delta <= 500s\n if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {\n const silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray()\n const count = Math.floor(delta / refSampleDuration)\n\n if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.AUDIO_FILLED,\n pts: sample.pts,\n originPts: sample.originPts,\n count,\n nextPts,\n refSampleDuration\n })\n }\n\n for (let j = 0; j < count; j++) {\n const silentSample = new AudioSample(Math.floor(this._audioNextPts + refSampleDuration) - Math.floor(this._audioNextPts), silentFrame, sampleDurationInSampleRate)\n silentSample.originPts = Math.floor(this._baseDts + nextPts)\n samples.splice(i, 0, silentSample)\n this._audioNextPts += refSampleDuration\n i++\n }\n\n i--\n // delta <= -3 * refSampleDurationInt\n // delta >= -500ms\n } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {\n // need discard frames\n if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionOverlapDot = sample.pts\n\n audioTrack.warnings.push({\n type: WarningType.AUDIO_DROPPED,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n refSampleDuration\n })\n }\n samples.splice(i, 1)\n i--\n } else {\n if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {\n this._audioTimestampBreak++\n\n if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {\n this._lastAudioExceptionLargeGapDot = sample.pts\n audioTrack.warnings.push({\n type: WarningType.LARGE_AUDIO_GAP,\n time: sample.pts / 1000,\n pts: sample.pts,\n originPts: sample.originPts,\n nextPts,\n sampleDuration: delta,\n refSampleDuration\n })\n }\n }\n\n if (audioTrack.codecType === AudioCodecType.OPUS) {\n const lastSample = samples[samples.length - 1]\n if (lastSample) {\n lastSample.duration = sample.pts - lastSample.pts\n }\n } else {\n sample.dts = sample.pts = nextPts\n sample.duration = sampleDurationInSampleRate\n }\n this._audioNextPts += refSampleDuration\n }\n }\n }\n\n _getG711Duration (track) {\n const { sampleSize, channelCount, sampleRate } = track\n const samp0 = track.samples[0]\n if (!samp0) return\n return samp0.data.byteLength * 2 / channelCount / (sampleSize / 8) / sampleRate * 1000\n }\n\n _getSilentFrame (track) {\n if (track.codecType === AudioCodecType.AAC) return AAC.getSilentFrame(track.codec, track.channelCount)\n return new Uint8Array(8 * track.sampleDuration * track.channelCount)\n }\n}\n","import { UTF8 } from '../utils'\n\nexport class AMF {\n static parse (data) {\n if (data.length < 3) return\n\n const ret = {}\n const name = AMF._parseValue(new DataView(data.buffer, data.byteOffset, data.byteLength))\n const value = AMF._parseValue(new DataView(data.buffer, data.byteOffset + name.size, data.byteLength - name.size))\n ret[name.data] = value.data\n\n return ret\n }\n\n static _parseValue (view) {\n const dataLen = view.byteLength\n const type = view.getUint8(0)\n let offset = 1\n let isEnd = false\n let value\n\n switch (type) {\n case 0: // Number(Double) type\n value = view.getFloat64(1)\n offset += 8\n break\n case 1: { // Boolean type\n value = !!view.getUint8(1)\n offset += 1\n break\n }\n case 2: { // String type\n const { data, size } = AMF._parseString(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value = data\n offset += size\n }\n break\n case 3: { // Object(s) type\n value = {}\n let terminal = 0\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) offset += 3\n }\n }\n break\n case 8: { // ECMA array type (Mixed array)\n value = {}\n offset += 4 // ECMAArrayLength(UI32)\n let terminal = 0 // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((view.getUint32(dataLen - 4) & 0x00FFFFFF) === 9) {\n terminal = 3\n }\n while (offset < dataLen - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n const { size, data, isEnd } = AMF._parseObject(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset - terminal))\n if (isEnd) break\n value[data.name] = data.value\n offset += size\n }\n if (offset <= dataLen - 3) {\n const marker = view.getUint32(offset - 1) & 0x00FFFFFF\n if (marker === 9) {\n offset += 3\n }\n }\n }\n break\n case 9: // ScriptDataObjectEnd\n value = undefined\n offset = 1\n isEnd = true\n break\n case 10: { // Strict array type\n value = []\n const strictArrayLength = view.getUint32(1)\n offset += 4\n for (let i = 0; i < strictArrayLength; i++) {\n const { data, size } = AMF._parseValue(new DataView(view.buffer, view.byteOffset + offset, view.byteLength - offset))\n value.push(data)\n offset += size\n }\n }\n break\n case 11: { // Date type\n const timestamp = view.getFloat64(offset) + view.getInt16(offset + 8) * 60000\n value = new Date(timestamp)\n offset += 10\n }\n break\n case 12: { // Long string type\n const length = view.getUint32(1)\n offset += 4\n value = ''\n if (length > 0) {\n value = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + offset, length))\n }\n offset += length\n }\n break\n default:\n offset = dataLen\n break\n }\n\n return {\n data: value,\n size: offset,\n isEnd\n }\n }\n\n static _parseString (view) {\n const length = view.getUint16(0)\n let data = ''\n if (length > 0) {\n data = UTF8.decode(new Uint8Array(view.buffer, view.byteOffset + 2, length))\n }\n\n return {\n data,\n size: 2 + length\n }\n }\n\n static _parseObject (view) {\n if (view.byteLength < 3) return\n\n const name = AMF._parseString(view)\n const value = AMF._parseValue(new DataView(view.buffer, view.byteOffset + name.size, view.byteLength - name.size))\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n isEnd: value.isEnd\n }\n }\n}\n","/**\n * AudioData\n * @property {number} FlvSoundFormat\n */\nexport const FlvSoundFormat = {\n MP3: 2,\n G711A: 7, // G.711 A-law logarithmic PCM\n G711M: 8, // G.711 mu-law logarithmic PCM\n AAC: 10, // AAC\n OPUS: 13\n}\n\n","import { VideoTrack, AudioTrack, MetadataTrack, AudioSample, VideoSample, VideoCodecType, AudioCodecType, FlvScriptSample, SeiSample } from '../model'\nimport { FlvFixer } from './fixer'\nimport { concatUint8Array, Logger, readBig32 } from '../utils'\nimport { AAC, AVC, HEVC, NALu } from '../codec'\nimport { AMF } from './amf'\nimport { FlvSoundFormat } from './soundFormat'\nimport { OPUS } from '../codec/opus'\n\nconst logger = new Logger('FlvDemuxer')\n\n/**\n * @typedef {Object} DemuxResult\n * @property {VideoTrack} videoTrack\n * @property {AudioTrack} audioTrack\n * @property {MetadataTrack} metadataTrack\n */\n\nexport class FlvDemuxer {\n _headerParsed = false\n _remainingData = null\n _gopId = 0\n _needAddMetaBeforeKeyFrameNal = true // 标识H265流中关键帧Nal之前是否需要插入vps、sps、pps Nal\n\n static AUDIO_RATE = [5500, 11000, 22000, 44000]\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new FlvFixer(this.videoTrack, this.audioTrack, this.metadataTrack)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false] 切流\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true, seamlessLoadingSwitching) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity || !contiguous) {\n this._remainingData = null\n }\n\n if (discontinuity) {\n this._headerParsed = false\n }\n\n if (discontinuity) {\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n metadataTrack.flvScriptSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingData) {\n data = concatUint8Array(this._remainingData, data)\n this._remainingData = null\n }\n }\n\n if (!data.length) {\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n let offset = 0\n if (!this._headerParsed) {\n if (!FlvDemuxer.probe(data)) {\n throw new Error('Invalid flv file')\n }\n audioTrack.present = ((data[4] & 4) >>> 2) !== 0\n videoTrack.present = (data[4] & 1) !== 0\n this._headerParsed = true\n offset = readBig32(data, 5) + 4 // skip prev tag size\n }\n\n const dataLen = data.length\n\n let tagType\n let dataSize\n let timestamp\n let bodyData\n let prevTagSize\n while ((offset + 15) < dataLen) { // header and prev tag size\n tagType = data[offset]\n dataSize = (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]\n if (offset + 15 + dataSize > dataLen) break\n timestamp = (\n (data[offset + 7] << 24 >>> 0) +\n (data[offset + 4] << 16) +\n (data[offset + 5] << 8) +\n data[offset + 6]\n )\n\n offset += 11\n bodyData = data.subarray(offset, offset + dataSize)\n if (tagType === 8) {\n this._parseAudio(bodyData, timestamp)\n } else if (tagType === 9) {\n if (seamlessLoadingSwitching) this.seamlessLoadingSwitching = true\n this._parseVideo(bodyData, timestamp)\n } else if (tagType === 18) {\n this._parseScript(bodyData, timestamp)\n } else {\n logger.warn(`Invalid tag type: ${tagType}`)\n }\n\n offset += dataSize\n prevTagSize = readBig32(data, offset)\n if (prevTagSize !== 11 + dataSize) {\n logger.warn(`Invalid PrevTagSize ${prevTagSize} (${11 + dataSize})`)\n }\n\n offset += 4\n }\n\n if (offset < dataLen) {\n this._remainingData = data.subarray(offset)\n }\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1000\n audioTrack.timescale = audioTrack.codecType === AudioCodecType.OPUS ? 1000 : audioTrack.sampleRate || 0\n\n if (!audioTrack.exist() && audioTrack.hasSample()) {\n audioTrack.reset()\n }\n if (!videoTrack.exist() && videoTrack.hasSample()) {\n videoTrack.reset()\n }\n\n const scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1]\n const metaData = scriptDataObject?.data?.onMetaData\n\n if (metaData) {\n if (videoTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n videoTrack.duration = metaData.duration * 1000\n }\n\n if (metaData.hasOwnProperty('width') && metaData.hasOwnProperty('height')) {\n videoTrack.width = metaData.width\n videoTrack.height = metaData.height\n }\n }\n\n if (audioTrack?.exist()) {\n if (metaData.hasOwnProperty('duration')) {\n audioTrack.duration = metaData.duration * 1000\n }\n }\n }\n\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {DemuxResult}\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n * @returns {DemuxResult}\n */\n demuxAndFix (data, discontinuity, contiguous, startTime, seamlessLoadingSwitching) {\n this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return false\n }\n return readBig32(data, 5) >= 9\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseAudio (data, pts) {\n if (!data.length) return\n\n const format = (data[0] & 0xf0) >>> 4\n const track = this.audioTrack\n\n if (\n format !== FlvSoundFormat.AAC &&\n format !== FlvSoundFormat.G711A &&\n format !== FlvSoundFormat.G711M &&\n format !== FlvSoundFormat.OPUS\n ) {\n logger.warn(`Unsupported sound format: ${format}`)\n track.reset()\n return\n }\n\n if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {\n const soundRate = (data[0] & 0x0c) >> 2\n const soundSize = (data[0] & 0x02) >> 1\n const soundType = (data[0] & 0x01)\n track.sampleRate = FlvDemuxer.AUDIO_RATE[soundRate]\n track.sampleSize = soundSize ? 16 : 8\n track.channelCount = soundType + 1\n }\n\n switch (format) {\n case FlvSoundFormat.G711A:\n case FlvSoundFormat.G711M:\n this._parseG711(data, pts, format)\n break\n case FlvSoundFormat.AAC:\n this._parseAac(data, pts)\n break\n case FlvSoundFormat.OPUS:\n this._parseOpus(data, pts)\n break\n default:\n break\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @private\n */\n _parseOpus (data, pts) {\n const track = this.audioTrack\n const packetType = data[1]\n\n track.codecType = AudioCodecType.OPUS\n\n switch (packetType) {\n case 0 /* Header Packets */: {\n const ret = OPUS.parseHeaderPackets(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.sampleDuration = OPUS.getFrameDuration([], track.timescale)\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n break\n }\n case 1 /* Raw OPUS frame data */: {\n if (pts === undefined || pts === null) return\n\n const newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration)\n track.samples.push(newSample)\n break\n }\n default:\n logger.warn(`Unknown OpusPacketType: ${packetType}`)\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} pts\n * @param {import('./soundFormat').FlvSoundFormat} format\n */\n _parseG711 (data, pts, format) {\n const track = this.audioTrack\n const audioData = data.subarray(1)\n\n if (audioData.byteLength < 1) return\n\n const sample = new AudioSample(pts, audioData)\n track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU\n track.sampleRate = 8000\n track.codec = track.codecType\n track.samples.push(sample)\n }\n\n _parseAac (data, pts) {\n const track = this.audioTrack\n track.codecType = AudioCodecType.AAC\n\n if (data[1] === 0) { // AACPacketType\n const ret = AAC.parseAudioSpecificConfig(data.subarray(2))\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.config = ret.config\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n } else {\n track.reset()\n logger.warn('Cannot parse AudioSpecificConfig', data)\n }\n } else if (data[1] === 1) { // Raw AAC frame data\n if (pts === undefined || pts === null) return\n track.samples.push(new AudioSample(pts, data.subarray(2)))\n } else {\n logger.warn(`Unknown AACPacketType: ${data[1]}`)\n }\n }\n\n _parseVideo (data, dts) {\n if (data.length < 6) return\n\n const frameType = (data[0] & 0xf0) >>> 4\n const codecId = data[0] & 0x0f\n\n const track = this.videoTrack\n\n if (\n codecId !== 7 && // AVC\n codecId !== 12 // HEVC\n ) {\n track.reset()\n logger.warn(`Unsupported codecId: ${codecId}`)\n return\n }\n\n const isHevc = codecId === 12\n track.codecType = isHevc ? VideoCodecType.HEVC : VideoCodecType.AVC\n\n const packetType = data[1]\n const cts = (((data[2] << 16) | (data[3] << 8) | (data[4])) << 8) >> 8\n\n if (packetType === 0) { // DecoderConfigurationRecord\n const configData = data.subarray(5)\n const ret = isHevc\n ? HEVC.parseHEVCDecoderConfigurationRecord(configData)\n : AVC.parseAVCDecoderConfigurationRecord(configData)\n if (ret) {\n const { hvcC, sps, ppsArr, spsArr, vpsArr, nalUnitSize } = ret\n if (hvcC) {\n track.hvcC = track.hvcC || hvcC\n }\n if (sps) {\n track.codec = sps.codec\n track.width = sps.width\n track.height = sps.height\n track.sarRatio = sps.sarRatio\n track.fpsNum = sps.fpsNum\n track.fpsDen = sps.fpsDen\n }\n if (spsArr.length) track.sps = spsArr\n if (ppsArr.length) track.pps = ppsArr\n if (vpsArr && vpsArr.length) track.vps = vpsArr\n if (nalUnitSize) track.nalUnitSize = nalUnitSize\n } else {\n logger.warn(`Cannot parse ${isHevc ? 'HEVC' : 'AVC'}DecoderConfigurationRecord`, data)\n }\n } else if (packetType === 1) { // One or more NALUs\n let units = NALu.parseAvcC(data.subarray(5), track.nalUnitSize)\n\n units = this._checkAddMetaNalToUnits(isHevc, units, track)\n\n if (units && units.length) {\n const sample = new VideoSample(dts + cts, dts, units)\n if (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {\n return\n }\n this.seamlessLoadingSwitching = false\n if (frameType === 1) {\n sample.setToKeyframe()\n track.lastKeyFrameDts = dts\n }\n track.samples.push(sample)\n\n units.forEach(unit => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n dts + cts\n ))\n break\n default:\n }\n })\n\n if (sample.keyframe) {\n this._gopId++\n }\n sample.gopId = this._gopId\n } else {\n logger.warn('Cannot parse NALUs', data)\n }\n } else if (packetType === 2) {\n // AVC end of sequence, Empty\n } else {\n logger.warn(`Unknown AVCPacketType: ${packetType}`)\n }\n }\n\n _checkAddMetaNalToUnits (hevc, units, track) {\n if (!hevc || !this._needAddMetaBeforeKeyFrameNal) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n const nalTypes = units.map(x => (x[0] >>> 1) & 0x3f)\n\n if (nalTypes.includes(32)) {\n this._needAddMetaBeforeKeyFrameNal = false\n return units\n }\n\n units.unshift(track.pps[0])\n units.unshift(track.sps[0])\n units.unshift(track.vps[0])\n\n return units.filter(Boolean)\n }\n\n _parseScript (data, pts) {\n this.metadataTrack.flvScriptSamples.push(new FlvScriptSample(AMF.parse(data), pts))\n }\n}\n","import { TsFixer } from './fixer'\nimport { AVC, AAC, HEVC, NALu, MPEG } from '../codec'\nimport { VideoSample, AudioSample, VideoCodecType, VideoTrack, AudioTrack, MetadataTrack, SeiSample } from '../model'\nimport { Logger, concatUint8Array } from '../utils'\nimport { AudioCodecType } from '../model/types'\n\nconst logger = new Logger('TsDemuxer')\n\nexport class TsDemuxer {\n _pmtId = -1\n _remainingPacketData = null\n _videoPesData = []\n _audioPesData = []\n _gopId = 0\n\n /**\n * @param {VideoTrack} [videoTrack]\n * @param {AudioTrack} [audioTrack]\n * @param {MetadataTrack} [metadataTrack]\n */\n constructor (videoTrack, audioTrack, metadataTrack, fixerConfig = {}) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack, fixerConfig)\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @returns {import('../flv').DemuxResult}\n */\n demux (data, discontinuity = false, contiguous = true) {\n const { audioTrack, videoTrack, metadataTrack } = this\n\n if (discontinuity) {\n this._pmtId = -1\n videoTrack.reset()\n audioTrack.reset()\n metadataTrack.reset()\n }\n\n if (!contiguous || discontinuity) {\n this._remainingPacketData = null\n this._videoPesData = []\n this._audioPesData = []\n } else {\n videoTrack.samples = []\n audioTrack.samples = []\n metadataTrack.seiSamples = []\n videoTrack.warnings = []\n audioTrack.warnings = []\n\n if (this._remainingPacketData) {\n data = concatUint8Array(this._remainingPacketData, data)\n this._remainingPacketData = null\n }\n }\n\n let dataLen = data.length\n const remainingLength = dataLen % 188\n if (remainingLength) {\n this._remainingPacketData = data.subarray(dataLen - remainingLength)\n dataLen -= remainingLength\n }\n\n let videoPid = videoTrack.pid\n let audioPid = audioTrack.pid\n\n for (let start = 0; start < dataLen; start += 188) {\n if (data[start] !== 0x47) throw new Error('TS packet did not start with 0x47')\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40)\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2]\n const adaptationFiledControl = (data[start + 3] & 0x30) >> 4\n\n let offset\n if (adaptationFiledControl > 1) {\n offset = start + 5 + data[start + 4]\n if (offset === start + 188) continue\n } else {\n offset = start + 4\n }\n\n switch (pid) {\n case 0: // PAT\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n this._pmtId = ((data[offset + 10] & 0x1f) << 8) | data[offset + 11]\n break\n case this._pmtId: {\n if (payloadUnitStartIndicator) offset += data[offset] + 1\n const tableEnd = offset + 3 + (((data[offset + 1] & 0x0f) << 8) | data[offset + 2]) - 4\n const programInfoLength = ((data[offset + 10] & 0x0f) << 8) | data[offset + 11]\n offset += 12 + programInfoLength\n\n while (offset < tableEnd) {\n const esPid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2]\n switch (data[offset]) {\n case 0x0f: // AAC ADTS\n audioTrack.pid = audioPid = esPid\n break\n case 0x03:\n case 0x04:\n if (audioTrack.pid === -1) {\n audioTrack.pid = audioPid = esPid\n audioTrack.codecType = AudioCodecType.MP3\n }\n break\n case 0x1b: // AVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.AVC\n videoTrack.pid = videoPid = esPid\n break\n case 0x24: // HEVC\n if (videoPid !== -1) break\n videoTrack.codecType = VideoCodecType.HEVC\n videoTrack.pid = videoPid = esPid\n break\n default:\n logger.warn(`Unsupported stream. type: ${data[offset]}, pid: ${esPid}`)\n }\n\n offset += (((data[offset + 3] & 0x0f) << 8) | data[offset + 4]) + 5\n }\n }\n break\n case videoPid:\n if (payloadUnitStartIndicator && this._videoPesData.length) {\n this._parseVideoData()\n }\n this._videoPesData.push(data.subarray(offset, start + 188))\n break\n case audioPid:\n if (payloadUnitStartIndicator && this._audioPesData.length) {\n this._parseAudioData()\n }\n this._audioPesData.push(data.subarray(offset, start + 188))\n break\n case 17:\n case 0x1fff:\n break\n default:\n logger.warn(`Unknown pid: ${pid}`)\n }\n }\n\n this._parseVideoData()\n this._parseAudioData()\n\n audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 90000\n\n audioTrack.timescale = audioTrack.sampleRate || 0\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack\n }\n }\n\n /**\n * @param {number} [startTime=0]\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n */\n fix (startTime, discontinuity, contiguous) {\n this._fixer.fix(startTime, discontinuity, contiguous)\n return {\n videoTrack: this.videoTrack,\n audioTrack: this.audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n /**\n * @param {Uint8Array} data\n * @param {boolean} [discontinuity=false]\n * @param {boolean} [contiguous=true]\n * @param {number} [startTime=0]\n */\n demuxAndFix (data, discontinuity, contiguous, startTime) {\n this.demux(data, discontinuity, contiguous)\n return this.fix(startTime, discontinuity, contiguous)\n }\n\n /**\n * @param { Uint8Array } data\n * @returns {boolean}\n */\n static probe (data) {\n if (!data.length) return false\n return data[0] === 0x47 && data[188] === 0x47 && data[376] === 0x47\n }\n\n _parseVideoData () {\n if (!this._videoPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._videoPesData))\n if (!pes) {\n logger.warn('Cannot parse video pes', this._videoPesData)\n return\n }\n\n const units = NALu.parseAnnexB(pes.data)\n if (units) {\n this._createVideoSample(units, pes.pts, pes.dts)\n } else {\n logger.warn('Cannot parse avc units', pes)\n }\n\n this._videoPesData = []\n }\n\n _createVideoSample (units, pts, dts) {\n if (!units.length) return\n const track = this.videoTrack\n const isHevc = track.codecType === VideoCodecType.HEVC\n\n const sample = new VideoSample(pts, dts)\n units.forEach((unit) => {\n const type = isHevc ? (unit[0] >>> 1) & 0x3f : unit[0] & 0x1f\n switch (type) {\n case 5: // IDR\n case 16: // HEVC BLA_W_LP\n case 17: // HEVC BLA_W_RADL\n case 18: // HEVC BLA_N_LP\n case 19: // HEVC IDR_W_RADL\n case 20: // HEVC IDR_N_LP\n case 21: // HEVC CRA_NUT\n case 22: // HEVC RSV_IRAP_VCL22\n case 23: // HEVC RSV_IRAP_VCL23\n if ((!isHevc && type !== 5) || (isHevc && type === 5)) break\n sample.setToKeyframe()\n this._gopId++\n break\n case 6: // SEI\n case 39: // HEVC PREFIX_SEI\n case 40: // HEVC SUFFIX_SEI\n if ((!isHevc && type !== 6) || (isHevc && type === 6)) break\n this.metadataTrack.seiSamples.push(new SeiSample(\n NALu.parseSEI(NALu.removeEPB(unit), isHevc),\n pts\n ))\n // fix 分割nal之前只要sei信息被当做单独一个sample\n return\n case 32: // HEVC VPS\n if (!isHevc) break\n if (!track.vps.length) {\n const hvcC = HEVC.parseVPS(NALu.removeEPB(unit), track.hvcC)\n track.hvcC = track.hvcC || hvcC\n track.vps = [unit]\n }\n break\n case 7: // SPS\n case 33: // HEVC SPS\n if ((!isHevc && type !== 7) || (isHevc && type === 7)) break\n if (!track.sps.length) {\n const data = NALu.removeEPB(unit)\n const spsInfo = isHevc ? HEVC.parseSPS(data, track.hvcC) : AVC.parseSPS(data)\n track.sps = [unit]\n track.hvcC = track.hvcC || spsInfo.hvcC\n track.codec = spsInfo.codec\n track.width = spsInfo.width\n track.height = spsInfo.height\n track.sarRatio = spsInfo.sarRatio\n track.fpsNum = spsInfo.fpsNum\n track.fpsDen = spsInfo.fpsDen\n }\n break\n case 8: // PPS\n case 34: // HEVC PPS\n if ((!isHevc && type !== 8) || (isHevc && type === 8)) break\n if (!track.pps.length) track.pps = [unit]\n break\n case 9: // AUD\n case 35: // HEVC AUD\n // if ((!isHevc && type !== 9) || (isHevc && type === 9)) break\n // sample.gopId = this._gopId\n // if (sample.units.length && !keyFrame) {\n // this._pushVideoSample(track, sample)\n // sample = this.prevAvcSample = new VideoSample(pts, dts)\n // }\n break\n case 38: // HEVC FD_NUT\n if (isHevc) {\n let ffByteFound = false\n for (let i = 2; i < unit.byteLength; i++) {\n if (unit[i] === 0xff) {\n ffByteFound = true\n break\n }\n }\n if (!ffByteFound) {\n return\n }\n }\n break\n default:\n }\n sample.units.push(unit)\n })\n sample.gopId = this._gopId\n this._pushVideoSample(track, sample)\n }\n\n _pushVideoSample (track, sample) {\n if (sample.units.length) {\n if (sample.pts === null || sample.pts === undefined) {\n logger.warn('Video sample no pts', sample)\n const lastSample = track.samples[track.samples.length - 1]\n if (lastSample) {\n sample.pts = lastSample.pts\n sample.dts = lastSample.dts\n } else {\n logger.warn('Drop video sample', sample)\n }\n } else {\n track.samples.push(sample)\n }\n }\n }\n\n _parseAudioData () {\n if (!this._audioPesData.length) return\n const pes = TsDemuxer._parsePES(concatUint8Array(...this._audioPesData))\n if (!pes) {\n logger.warn('Cannot parse audio pes', this._audioPesData)\n return\n }\n\n switch (this.audioTrack.codecType) {\n case AudioCodecType.AAC:\n this._parseAacData(pes)\n break\n case AudioCodecType.MP3:\n this._parseMPEG(pes)\n break\n default:\n }\n\n this._audioPesData = []\n }\n\n _parseAacData (pes) {\n const track = this.audioTrack\n let pts = pes.pts\n if (pts === null || pts === undefined) {\n logger.warn('AAC pes not pts', track)\n if (!track.samples.length || !track.sampleRate) {\n return\n }\n pts = track.samples[track.samples.length - 1].pts + AAC.getFrameDuration(track.sampleRate)\n }\n\n const ret = AAC.parseADTS(pes.data, pts)\n if (ret) {\n track.codec = ret.codec\n track.channelCount = ret.channelCount\n track.sampleRate = ret.sampleRate\n track.objectType = ret.objectType\n track.sampleRateIndex = ret.samplingFrequencyIndex\n track.config = ret.config\n track.samples.push(...ret.frames.map((s) => new AudioSample(s.pts, s.data)))\n\n if (ret.skip) {\n logger.warn(`Skip aac adts ${ret.skip} bits`)\n }\n if (ret.remaining) {\n logger.warn(`Remaining aac adts ${ret.remaining} bits`)\n }\n } else {\n logger.warn('Cannot parse aac adts', pes)\n }\n }\n\n _parseMPEG (pes) {\n const data = pes.data\n const length = data.length\n let frameIndex = 0\n let offset = 0\n const pts = pes.pts\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: MPEG PES unknown PTS')\n return\n }\n\n while (offset < length) {\n if (MPEG.isHeader(data, offset)) {\n const frame = MPEG.appendFrame(\n this.audioTrack,\n data,\n offset,\n pts,\n frameIndex\n )\n if (frame) {\n offset += frame.length\n frameIndex++\n } else {\n break\n }\n } else {\n offset++\n }\n }\n }\n\n static _parsePES (data) {\n const headerDataLen = data[8]\n if (headerDataLen === null || headerDataLen === undefined || data.length < (headerDataLen + 9)) return\n const startPrefix = data[0] << 16 | data[1] << 8 | data[2]\n if (startPrefix !== 1) return\n const pesLen = (data[4] << 8) + data[5]\n if (pesLen && pesLen > data.length - 6) return\n\n let pts\n let dts\n const ptsDtsFlags = data[7]\n if (ptsDtsFlags & 0xc0) {\n pts = (data[9] & 0x0e) * 536870912 +\n (data[10] & 0xff) * 4194304 +\n (data[11] & 0xfe) * 16384 +\n (data[12] & 0xff) * 128 +\n (data[13] & 0xfe) / 2\n\n if (ptsDtsFlags & 0x40) {\n dts = (data[14] & 0x0e) * 536870912 +\n (data[15] & 0xff) * 4194304 +\n (data[16] & 0xfe) * 16384 +\n (data[17] & 0xff) * 128 +\n (data[18] & 0xfe) / 2\n if (pts - dts > 60 * 90000) pts = dts\n } else {\n dts = pts\n }\n }\n\n return { data: data.subarray(9 + headerDataLen), pts, dts }\n }\n}\n","export class ByteReader {\n private dv: DataView\n start: number\n offset: number\n end: number\n constructor(buf: ArrayBuffer, offset: number, len: number) {\n this.dv = new DataView(buf)\n this.start = this.offset = offset || this.dv.byteOffset\n this.end = len ? this.start + len : this.start + this.dv.byteLength\n }\n static fromUint8(uint8: Uint8Array) {\n return new ByteReader(uint8.buffer, uint8.byteOffset, uint8.byteLength)\n }\n static concatUint8s(args: Uint8Array[]) {\n const uint8 = new Uint8Array(args.reduce((ret, v) => ret + v.byteLength, 0))\n let offset = 0\n args.forEach((v) => {\n uint8.set(v, offset)\n offset += v.byteLength\n })\n return uint8\n }\n static concatUint8(...args: Uint8Array[]) {\n return this.concatUint8s(args)\n }\n get buffer() {\n return this.dv.buffer\n }\n get unreadLength() {\n return Math.max(this.end - this.offset, 0)\n }\n get size() {\n return this.end - this.start\n }\n readFloat(byteNum: number) {\n let val = 0\n switch (byteNum) {\n case 4:\n val = this.dv.getFloat32(this.offset)\n break\n case 8:\n val = this.dv.getFloat64(this.offset)\n break\n default:\n throw new Error(`read ${byteNum}-byte float is not supported`)\n }\n this.offset += byteNum\n return val\n }\n back(byteNum: number) {\n this.offset -= byteNum\n }\n skip(byteNum: number) {\n this.offset += byteNum\n }\n readInt(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getInt8(offset)\n case 2:\n return this.dv.getInt16(offset)\n case 4:\n return this.dv.getInt32(offset)\n default:\n throw new Error(`read ${byteNum}-byte integers is not supported`)\n }\n }\n read(byteNum: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.getUint8(offset)\n case 2:\n return this.dv.getUint16(offset)\n case 3:\n return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2)\n case 4:\n return this.dv.getUint32(offset)\n default:\n this.back(byteNum - 4)\n // js不支持32位左移,可通过+、Math.pow运算达到64位以内运算的目的\n return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4)\n }\n }\n write(byteNum: number, val: number) {\n const offset = this.offset\n this.offset += byteNum\n switch (byteNum) {\n case 1:\n return this.dv.setUint8(offset, val)\n case 2:\n return this.dv.setUint16(offset, val)\n case 3:\n return this.dv.setUint8(offset, val >>> 16),\n this.dv.setUint16(offset + 1, 0xffff & val)\n case 4:\n return this.dv.setUint32(offset, val)\n default:\n throw new Error(`write ${byteNum}-byte integers is not supported`)\n }\n }\n readToBuffer(len?: number) {\n let buffer: ArrayBuffer\n if (this.offset || len) {\n buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end)\n } else {\n buffer = this.dv.buffer\n }\n this.offset += buffer.byteLength\n return buffer\n }\n readToUint8(len?: number) {\n const uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength)\n this.offset += uint8.byteLength\n return uint8\n }\n readString(len: number) {\n let i = 0, str = ''\n for (; i < len; i++) {\n str += String.fromCharCode(this.dv.getUint8(this.offset))\n this.offset++\n }\n return str\n }\n}","import { ByteReader } from './byte-reader'\n\nexport class BitReader {\n private val: number\n size: number\n offset = 0\n constructor(val: number, size: number) {\n this.val = val\n this.size = size\n }\n static fromByte(byte: ByteReader, len: number) {\n return new BitReader(byte.read(len), len << 3)\n }\n skip(len: number) {\n this.offset += len\n }\n read(len: number) {\n const unreadLength = this.size - this.offset - len\n\n if (unreadLength >= 0) {\n let bits = 0, i = 0\n this.offset += len\n // 32位及以上的整数不支持位移运算,使用 / + Math.pow 规避\n if (this.size > 31) {\n for (; i < len; i++) {\n bits += Math.pow(2, i)\n }\n return this.val / Math.pow(2, unreadLength) & bits\n } else {\n for (; i < len; i++) {\n bits += 1 << i\n }\n return this.val >>> unreadLength & bits\n }\n }\n throw new Error(`the number of the read operation exceeds the total length limit of bits`)\n }\n}","import { AudioCodecType, VideoCodecType } from '../model'\nimport { getAvcCodec, readBig16, readBig24, readBig32, readBig64, combineToFloat, toDegree } from '../utils'\nimport { AAC } from '../codec'\nimport { ByteReader } from '../utils/byte-reader'\nimport { BitReader } from '../utils/bit-reader'\nexport class MP4Parser {\n static findBox (data, names, start = 0) {\n const ret = []\n if (!data) return ret\n\n let size = 0\n let type = ''\n let headerSize = 0\n while (data.length > 7) {\n size = readBig32(data)\n type = String.fromCharCode.apply(null, data.subarray(4, 8))\n headerSize = 8\n if (size === 1) {\n size = readBig64(data, 8)\n headerSize += 8\n } else if (!size) {\n size = data.length\n }\n if (!names[0] || type === names[0]) {\n const subData = data.subarray(0, size)\n if (names.length < 2) {\n ret.push({\n start,\n size,\n headerSize,\n type,\n data: subData\n })\n } else {\n return MP4Parser.findBox(subData.subarray(headerSize), names.slice(1), start + headerSize)\n }\n }\n\n start += size\n data = data.subarray(size)\n }\n\n return ret\n }\n\n static tfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.trackId = readBig32(data)\n let start = 4\n const baseDataOffsetPresent = (ret.flags & 0xff) & 0x01\n const sampleDescriptionIndexPresent = (ret.flags & 0xff) & 0x02\n const defaultSampleDurationPresent = (ret.flags & 0xff) & 0x08\n const defaultSampleSizePresent = (ret.flags & 0xff) & 0x10\n const defaultSampleFlagsPresent = (ret.flags & 0xff) & 0x20\n\n if (baseDataOffsetPresent) {\n start += 4 // truncate top 4 bytes\n ret.baseDataOffset = readBig32(data, start)\n start += 4\n }\n if (sampleDescriptionIndexPresent) {\n ret.sampleDescriptionIndex = readBig32(data, start)\n start += 4\n }\n if (defaultSampleDurationPresent) {\n ret.defaultSampleDuration = readBig32(data, start)\n start += 4\n }\n if (defaultSampleSizePresent) {\n ret.defaultSampleSize = readBig32(data, start)\n start += 4\n }\n if (defaultSampleFlagsPresent) {\n ret.defaultSampleFlags = readBig32(data, start)\n }\n })\n }\n\n static sidx (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n ret.reference_ID = readBig32(data, start)// stream.readUint32();\n start += 4\n ret.timescale = readBig32(data, start)\n start += 4\n if (ret.version === 0) {\n ret.earliest_presentation_time = readBig32(data, start)\n start += 4\n ret.first_offset = readBig32(data, start)\n start += 4\n } else {\n ret.earliest_presentation_time = readBig64(data, start)\n start += 8\n ret.first_offset = readBig64(data, start)\n start += 8\n }\n start += 2\n ret.references = []\n const count = readBig16(data, start)\n start += 2\n for (let i = 0; i < count; i++) {\n const ref = {}\n ret.references.push(ref)\n let tmp32 = readBig32(data, start)\n start += 4\n ref.reference_type = (tmp32 >> 31) & 0x1\n ref.referenced_size = tmp32 & 0x7FFFFFFF\n ref.subsegment_duration = readBig32(data, start)\n start += 4\n tmp32 = readBig32(data, start)\n start += 4\n ref.starts_with_SAP = (tmp32 >> 31) & 0x1\n ref.SAP_type = (tmp32 >> 28) & 0x7\n ref.SAP_delta_time = tmp32 & 0xFFFFFFF\n }\n })\n }\n\n static moov (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mvhd = MP4Parser.mvhd(MP4Parser.findBox(data, ['mvhd'], start)[0])\n ret.trak = MP4Parser.findBox(data, ['trak'], start).map(trak => MP4Parser.trak(trak))\n ret.pssh = MP4Parser.pssh(MP4Parser.findBox(data, ['pssh'], start)[0])\n })\n }\n\n static mvhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n ret.nextTrackId = readBig32(data, start + 76)\n })\n }\n\n static trak (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tkhd = MP4Parser.tkhd(MP4Parser.findBox(data, ['tkhd'], start)[0])\n ret.mdia = MP4Parser.mdia(MP4Parser.findBox(data, ['mdia'], start)[0])\n })\n }\n\n static tkhd (box) {\n return parseBox(box, true, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n if (ret.version === 1) {\n byte.read(8) // createTime\n byte.read(8) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(8)\n } else {\n byte.read(4) // createTime\n byte.read(4) // modifyTime\n ret.trackId = byte.read(4)\n byte.read(4)\n ret.duration = byte.read(4)\n }\n byte.skip(16) // reserved(8) + layer(2) + alternateGroup(2) + volume(2) + reserved(2)\n ret.matrix = [] // for remux\n for (let i = 0; i < 36; i++) {\n ret.matrix.push(byte.read(1))\n }\n byte.back(36)\n const caculatedMatrix = [] // for caculation of rotation\n for (let i = 0, int32; i < 3; i++) {\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2))) // 16.16 fixed point\n int32 = byte.readInt(4)\n caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 0x3fffffff)) // 2.30 fixed point\n }\n ret.rotation = toDegree(caculatedMatrix)\n ret.width = byte.read(4) // 16.16 fixed point, no parsed\n ret.height = byte.read(4) // 16.16 fixed point, no parsed\n })\n }\n\n static mdia (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mdhd = MP4Parser.mdhd(MP4Parser.findBox(data, ['mdhd'], start)[0])\n ret.hdlr = MP4Parser.hdlr(MP4Parser.findBox(data, ['hdlr'], start)[0])\n ret.minf = MP4Parser.minf(MP4Parser.findBox(data, ['minf'], start)[0])\n })\n }\n\n static mdhd (box) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n if (ret.version === 1) {\n ret.timescale = readBig32(data, 16)\n ret.duration = readBig64(data, 20)\n start += 28\n } else {\n ret.timescale = readBig32(data, 8)\n ret.duration = readBig32(data, 12)\n start += 16\n }\n const lang = readBig16(data, start)\n ret.language = String.fromCharCode(((lang >> 10) & 0x1F) + 0x60, ((lang >> 5) & 0x1F) + 0x60, (lang & 0x1F) + 0x60)\n })\n }\n\n static hdlr (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 0) {\n ret.handlerType = String.fromCharCode.apply(null, data.subarray(4, 8))\n }\n })\n }\n\n static minf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.vmhd = MP4Parser.vmhd(MP4Parser.findBox(data, ['vmhd'], start)[0])\n ret.smhd = MP4Parser.smhd(MP4Parser.findBox(data, ['smhd'], start)[0])\n ret.stbl = MP4Parser.stbl(MP4Parser.findBox(data, ['stbl'], start)[0])\n })\n }\n\n static vmhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.graphicsmode = readBig16(data)\n ret.opcolor = [readBig16(data, 2), readBig16(data, 4), readBig16(data, 6)]\n })\n }\n\n static smhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.balance = readBig16(data)\n })\n }\n\n static stbl (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.stsd = MP4Parser.stsd(MP4Parser.findBox(data, ['stsd'], start)[0])\n ret.stts = MP4Parser.stts(MP4Parser.findBox(data, ['stts'], start)[0])\n ret.ctts = MP4Parser.ctts(MP4Parser.findBox(data, ['ctts'], start)[0])\n ret.stsc = MP4Parser.stsc(MP4Parser.findBox(data, ['stsc'], start)[0])\n ret.stsz = MP4Parser.stsz(MP4Parser.findBox(data, ['stsz'], start)[0])\n ret.stco = MP4Parser.stco(MP4Parser.findBox(data, ['stco'], start)[0])\n if (!ret.stco) {\n ret.co64 = MP4Parser.co64(MP4Parser.findBox(data, ['co64'], start)[0])\n ret.stco = ret.co64\n }\n const default_IV_size = ret.stsd.entries[0]?.sinf?.schi?.tenc.default_IV_size\n ret.stss = MP4Parser.stss(MP4Parser.findBox(data, ['stss'], start)[0])\n ret.senc = MP4Parser.senc(MP4Parser.findBox(data, ['senc'], start)[0], default_IV_size)\n })\n }\n\n static senc (box, iv = 8) {\n return parseBox(box, true, (ret, data) => {\n let start = 0\n const sampleCount = readBig32(data, start)\n start += 4\n ret.samples = []\n for (let i = 0; i < sampleCount; i++) {\n const sample = {}\n sample.InitializationVector = []\n for (let j = 0; j < iv; j++){\n sample.InitializationVector[j] = data[start + j]\n }\n start += iv\n if (ret.flags & 0x2) {\n sample.subsamples = []\n const subsampleCount = readBig16(data, start)\n start += 2\n for (let j = 0; j < subsampleCount; j++) {\n const subsample = {}\n subsample.BytesOfClearData = readBig16(data, start)\n start += 2\n subsample.BytesOfProtectedData = readBig32(data, start)\n start += 4\n sample.subsamples.push(subsample)\n }\n }\n ret.samples.push(sample)\n }\n })\n }\n\n static pssh (box) {\n return parseBox(box, true, (ret, data) => {\n const keyIds = []\n const systemId = []\n let start = 0\n for (let i = 0; i < 16; i++) {\n systemId.push(toHex(data[start + i]))\n }\n start += 16\n if (ret.version > 0) {\n const numKeyIds = readBig32(data, start)\n start += 4\n for (let i = 0; i < ('' + numKeyIds).length; i++) {\n for (let j = 0; j < 16; j++) {\n const keyId = data[start]\n start += 1\n keyIds.push(toHex(keyId))\n }\n }\n }\n const dataSize = readBig32(data, start)\n ret.data_size = dataSize\n start += 4\n ret.kid = keyIds\n ret.system_id = systemId\n ret.buffer = data\n })\n }\n\n static stsd (box) {\n return parseBox(box, true, (ret, data, start) => {\n ret.entryCount = readBig32(data)\n ret.entries = MP4Parser.findBox(data.subarray(4), [], start + 4).map(b => {\n switch (b.type) {\n case 'av01':\n return MP4Parser.av01(b)\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4':\n return MP4Parser.avc1(b)\n case 'hvc1':\n case 'hev1':\n return MP4Parser.hvc1(b)\n case 'mp4a':\n return MP4Parser.mp4a(b)\n case 'alaw':\n case 'ulaw':\n return MP4Parser.alaw(b)\n case 'enca':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.channelCount = readBig16(data, 16)\n ret.samplesize = readBig16(data, 18)\n ret.sampleRate = (readBig32(data, 24) / (1 << 16))\n data = data.subarray(28)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data, ['esds'], start)[0])\n })\n case 'encv':\n // sinf->schi->tenc\n return parseBox(b, false, (ret, data, start) => {\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n data = data.subarray(78)\n ret.sinf = MP4Parser.sinf(MP4Parser.findBox(data, ['sinf'], start)[0])\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(data, ['avcC'], start)[0])\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(data, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(data, ['pasp'], start)[0])\n })\n default:\n }\n }).filter(Boolean)\n })\n }\n\n static tenc (box) {\n return parseBox(box, false, (ret, data) => {\n let start = 6\n ret.default_IsEncrypted = data[start]\n start += 1\n ret.default_IV_size = data[start]\n start += 1\n ret.default_KID = []\n for (let i = 0; i < 16; i++) {\n ret.default_KID.push(toHex(data[start]))\n start += 1\n }\n })\n }\n\n static schi (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tenc = MP4Parser.tenc(MP4Parser.findBox(data, ['tenc'], start)[0])\n })\n }\n\n static sinf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.schi = MP4Parser.schi(MP4Parser.findBox(data, ['schi'], start)[0])\n ret.frma = MP4Parser.frma(MP4Parser.findBox(data, ['frma'], start)[0])\n })\n }\n\n static frma (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data_format = ''\n for (let i = 0; i < 4; i++) {\n ret.data_format += String.fromCharCode(data[i])\n }\n })\n }\n\n static colr (box) {\n return parseBox(box, false, (ret, data) => {\n const byte = ByteReader.fromUint8(data)\n ret.data = box.data\n ret.colorType = byte.readString(4)\n // Array.from(data.subarray(0, 4)).map(v => String.fromCharCode(v)).join('')\n if (ret.colorType === 'nclx') {\n ret.colorPrimaries = byte.read(2)\n ret.transferCharacteristics = byte.read(2)\n ret.matrixCoefficients = byte.read(2)\n ret.fullRangeFlag = byte.read(1) >> 7\n } else if (ret.colorType === 'rICC' || ret.colorType === 'prof') {\n ret.iccProfile = data.readToUint8()\n }\n })\n }\n\n static av01 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.av1C = MP4Parser.av1C(MP4Parser.findBox(bodyData, ['av1C'], start)[0])\n ret.colr = MP4Parser.colr(MP4Parser.findBox(bodyData, ['colr'], start)[0])\n })\n }\n\n static av1C (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n\n const byte = ByteReader.fromUint8(data)\n const bit = BitReader.fromByte(byte, 4)\n\n ret.marker = bit.read(1)\n ret.version = bit.read(7)\n\n ret.seqProfile = bit.read(3)\n ret.seqLevelIdx0 = bit.read(5)\n\n ret.seqTier0 = bit.read(1)\n ret.highBitdepth = bit.read(1)\n ret.twelveBit = bit.read(1)\n ret.monochrome = bit.read(1)\n ret.chromaSubsamplingX = bit.read(1)\n ret.chromaSubsamplingY = bit.read(1)\n ret.chromaSamplePosition = bit.read(2)\n ret.reserved = bit.read(3)\n ret.initialPresentationDelayPresent = bit.read(1)\n\n if (ret.initialPresentationDelayPresent) {\n ret.initialPresentationDelayMinusOne = bit.read(4)\n } else {\n ret.initialPresentationDelayMinusOne = 0\n }\n ret.configOBUs = byte.readToUint8()\n\n let bitdepth\n if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {\n bitdepth = ret.twelveBit === 1 ? '12' : '10'\n } else if (ret.seqProfile <= 2) {\n bitdepth = ret.highBitdepth === 1 ? '10' : '08'\n }\n ret.codec = [\n 'av01',\n ret.seqProfile,\n (ret.seqLevelIdx0 < 10 ? '0' + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? 'H' : 'M'),\n bitdepth\n ].join('.')\n })\n }\n\n static avc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.avcC = MP4Parser.avcC(MP4Parser.findBox(bodyData, ['avcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static avcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.configurationVersion = data[0]\n ret.AVCProfileIndication = data[1]\n ret.profileCompatibility = data[2]\n ret.AVCLevelIndication = data[3]\n ret.codec = getAvcCodec([data[1], data[2], data[3]])\n ret.lengthSizeMinusOne = data[4] & 0x3\n ret.spsLength = data[5] & 0x1F\n ret.sps = []\n let start = 6\n for (let i = 0; i < ret.spsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.sps.push(data.subarray(start, start + size))\n // ret.spsInfo = SpsParser.parseSPS(ret.sps[i])\n // ret.pixelRatio = ret.spsInfo.par_ratio\n start += size\n }\n ret.ppsLength = data[start]\n start += 1\n ret.pps = []\n for (let i = 0; i < ret.ppsLength; i++) {\n const size = readBig16(data, start)\n start += 2\n ret.pps.push(data.subarray(start, start += size))\n start += size\n }\n })\n }\n\n static hvc1 (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseVisualSampleEntry(ret, data)\n const bodyData = data.subarray(bodyStart)\n start += bodyStart\n ret.hvcC = MP4Parser.hvcC(MP4Parser.findBox(bodyData, ['hvcC'], start)[0])\n ret.pasp = MP4Parser.pasp(MP4Parser.findBox(bodyData, ['pasp'], start)[0])\n })\n }\n\n static hvcC (box) {\n return parseBox(box, false, (ret, data) => {\n ret.data = box.data\n ret.codec = 'hev1.1.6.L93.B0'\n ret.configurationVersion = data[0]\n const tmp = data[1]\n ret.generalProfileSpace = tmp >> 6\n ret.generalTierFlag = (tmp & 0x20) >> 5\n ret.generalProfileIdc = tmp & 0x1F\n ret.generalProfileCompatibility = readBig32(data, 2)\n ret.generalConstraintIndicatorFlags = data.subarray(6, 12)\n ret.generalLevelIdc = data[12]\n ret.avgFrameRate = readBig16(data, 19)\n ret.numOfArrays = data[22]\n ret.vps = []\n ret.sps = []\n ret.pps = []\n let start = 23\n let type = 0\n let numNalus = 0\n let size = 0\n for (let i = 0; i < ret.numOfArrays; i++) {\n type = data[start] & 0x3F\n numNalus = readBig16(data, start + 1)\n start += 3\n const nalus = []\n for (let j = 0; j < numNalus; j++) {\n size = readBig16(data, start)\n start += 2\n nalus.push(data.subarray(start, start + size))\n start += size\n }\n\n if (type === 32) {\n ret.vps.push(...nalus)\n } else if (type === 33) {\n ret.sps.push(...nalus)\n } else if (type === 34) {\n ret.pps.push(...nalus)\n }\n }\n })\n }\n\n static pasp (box) {\n return parseBox(box, false, (ret, data) => {\n ret.hSpacing = readBig32(data)\n ret.vSpacing = readBig32(data, 4)\n })\n }\n\n static mp4a (box) {\n return parseBox(box, false, (ret, data, start) => {\n const bodyStart = parseAudioSampleEntry(ret, data)\n ret.esds = MP4Parser.esds(MP4Parser.findBox(data.subarray(bodyStart), ['esds'], start + bodyStart)[0])\n })\n }\n\n static esds (box) {\n return parseBox(box, true, (ret, data) => {\n ret.codec = 'mp4a.'\n let start = 0\n let byteRead = 0\n let size = 0\n let tag = 0\n while (data.length) {\n start = 0\n tag = data[start]\n byteRead = data[start + 1]\n start += 2\n while (byteRead & 0x80) {\n size = (byteRead & 0x7F) << 7\n byteRead = data[start]\n start += 1\n }\n size += byteRead & 0x7F\n if (tag === 3) {\n data = data.subarray(start + 3)\n } else if (tag === 4) {\n ret.codec += (data[start].toString(16) + '.').padStart(3, '0')\n data = data.subarray(start + 13)\n } else if (tag === 5) {\n const config = ret.config = data.subarray(start, start + size)\n let objectType = (config[0] & 0xF8) >> 3\n if (objectType === 31 && config.length >= 2) {\n objectType = 32 + ((config[0] & 0x7) << 3) + ((config[1] & 0xE0) >> 5)\n }\n ret.objectType = objectType\n ret.codec += objectType.toString(16)\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n } else {\n if (ret.codec[ret.codec.length - 1] === '.') {\n ret.codec = ret.codec.substring(0, ret.codec.length - 1)\n }\n return\n }\n }\n })\n }\n\n static alaw (box) {\n return parseBox(box, false, (ret, data) => {\n parseAudioSampleEntry(ret, data)\n })\n }\n\n static stts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n delta: readBig32(data, start + 4)\n })\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static ctts (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n if (ret.version === 1) {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: readBig32(data, start + 4)\n })\n start += 8\n }\n } else {\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n count: readBig32(data, start),\n offset: -(~readBig32(data, start + 4) + 1)\n })\n start += 8\n }\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsc (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push({\n firstChunk: readBig32(data, start),\n samplesPerChunk: readBig32(data, start + 4),\n sampleDescriptionIndex: readBig32(data, start + 8)\n })\n start += 12\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stsz (box) {\n return parseBox(box, true, (ret, data) => {\n const sampleSize = readBig32(data)\n const sampleCount = readBig32(data, 4)\n const entrySizes = []\n if (!sampleSize) {\n let start = 8\n for (let i = 0; i < sampleCount; i++) {\n entrySizes.push(readBig32(data, start))\n start += 4\n }\n }\n ret.sampleSize = sampleSize\n ret.sampleCount = sampleCount\n ret.entrySizes = entrySizes\n })\n }\n\n static stco (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static co64 (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig64(data, start))\n start += 8\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static stss (box) {\n return parseBox(box, true, (ret, data) => {\n const entryCount = readBig32(data)\n const entries = []\n let start = 4\n for (let i = 0; i < entryCount; i++) {\n entries.push(readBig32(data, start))\n start += 4\n }\n ret.entryCount = entryCount\n ret.entries = entries\n })\n }\n\n static moof (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.mfhd = MP4Parser.mfhd(MP4Parser.findBox(data, ['mfhd'], start)[0])\n ret.traf = MP4Parser.findBox(data, ['traf'], start).map(t => MP4Parser.traf(t))\n })\n }\n\n static mfhd (box) {\n return parseBox(box, true, (ret, data) => {\n ret.sequenceNumber = readBig32(data)\n })\n }\n\n static traf (box) {\n return parseBox(box, false, (ret, data, start) => {\n ret.tfhd = MP4Parser.tfhd(MP4Parser.findBox(data, ['tfhd'], start)[0])\n ret.tfdt = MP4Parser.tfdt(MP4Parser.findBox(data, ['tfdt'], start)[0])\n ret.trun = MP4Parser.trun(MP4Parser.findBox(data, ['trun'], start)[0])\n })\n }\n\n static trun (box) {\n return parseBox(box, true, (ret, data) => {\n const { version, flags } = ret\n const dataLen = data.length\n const sampleCount = ret.sampleCount = readBig32(data)\n let offset = 4\n if (dataLen > offset && flags & 1) {\n ret.dataOffset = -(~readBig32(data, offset) + 1)\n offset += 4\n }\n if (dataLen > offset && flags & 4) {\n ret.firstSampleFlags = readBig32(data, offset)\n offset += 4\n }\n ret.samples = []\n if (dataLen > offset) {\n let sample\n for (let i = 0; i < sampleCount; i++) {\n sample = {}\n if (flags & 0x100) {\n sample.duration = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x200) {\n sample.size = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x400) {\n sample.flags = readBig32(data, offset)\n offset += 4\n }\n if (flags & 0x800) {\n if (version) {\n sample.cts = -(~readBig32(data, offset + 4) + 1)\n } else {\n sample.cts = readBig32(data, offset)\n }\n offset += 4\n }\n ret.samples.push(sample)\n }\n }\n })\n }\n\n static tfdt (box) {\n return parseBox(box, true, (ret, data) => {\n if (ret.version === 1) {\n ret.baseMediaDecodeTime = readBig64(data)\n } else {\n ret.baseMediaDecodeTime = readBig32(data)\n }\n })\n }\n\n static probe (data) {\n return !!MP4Parser.findBox(data, ['ftyp'])\n }\n\n static parseSampleFlags (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: (flags[2] << 8) | flags[3]\n }\n }\n\n static moovToTrack (moov, videoTrack, audioTrack) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (vTrack && videoTrack) {\n const v = videoTrack\n const _vTrackId = vTrack.tkhd?.trackId\n if (_vTrackId !== null && _vTrackId !== undefined) v.id = vTrack.tkhd.trackId\n v.tkhdDuration = vTrack.tkhd.duration\n v.mvhdDurtion = moov.mvhd.duration\n v.mvhdTimecale = moov.mvhd.timescale\n v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale\n v.duration = vTrack.mdia.mdhd.duration || (v.mvhdDurtion / v.mvhdTimecale * v.timescale)\n v.rotation = vTrack.tkhd.rotation\n v.matrix = vTrack.tkhd.matrix\n const e1 = vTrack.mdia.minf.stbl.stsd.entries[0]\n v.width = e1.width\n v.height = e1.height\n if (e1.pasp) {\n v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing]\n }\n if (e1.av1C) {\n v.codecType = VideoCodecType.AV1\n v.codec = e1.av1C.codec\n v.av1C = e1.av1C.data\n if (e1.colr) {\n v.colr = e1.colr.data\n }\n } else if (e1.hvcC) {\n v.codecType = VideoCodecType.HEVC\n v.codec = e1.hvcC.codec\n v.vps = e1.hvcC.vps\n v.sps = e1.hvcC.sps\n v.pps = e1.hvcC.pps\n v.hvcC = e1.hvcC.data\n } else if (e1.avcC) {\n v.codec = e1.avcC.codec\n v.sps = e1.avcC.sps\n v.pps = e1.avcC.pps\n } else {\n throw new Error('unknown video stsd entry')\n }\n v.present = true\n v.ext = {}\n v.ext.stss = vTrack.mdia?.minf?.stbl?.stss\n v.ext.ctts = vTrack.mdia?.minf?.stbl?.ctts\n\n if (e1 && e1.type === 'encv') {\n v.isVideoEncryption = true\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n v.videoSenc = vTrack.mdia.minf.stbl.senc && vTrack.mdia.minf.stbl.senc.samples\n e1.data_format = e1.sinf?.frma?.data_format\n v.useEME = moov.useEME\n v.kidValue = moov.kidValue\n v.pssh = moov.pssh\n v.encv = e1\n }\n }\n\n if (aTrack && audioTrack) {\n const a = audioTrack\n const _aTrackId = aTrack.tkhd?.trackId\n if (_aTrackId !== null && _aTrackId !== undefined) a.id = aTrack.tkhd.trackId\n a.tkhdDuration = aTrack.tkhd.duration\n a.mvhdDurtion = moov.mvhd.duration\n a.mvhdTimecale = moov.mvhd.timescale\n a.timescale = a.formatTimescale = aTrack.mdia.mdhd.timescale\n a.duration = aTrack.mdia.mdhd.duration || (a.mvhdDurtion / a.mvhdTimecale * a.timescale)\n const e1 = aTrack.mdia.minf.stbl.stsd.entries[0]\n a.sampleSize = e1.sampleSize\n a.sampleRate = e1.sampleRate\n a.channelCount = e1.channelCount\n a.present = true\n\n switch (e1.type) {\n case 'alaw':\n a.codecType = a.codec = AudioCodecType.G711PCMA\n a.sampleRate = 8000\n break\n case 'ulaw':\n a.codecType = a.codec = AudioCodecType.G711PCMU\n a.sampleRate = 8000\n break\n default:\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) a.config = Array.from(e1.esds.config)\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n break\n }\n a.sampleDuration = AAC.getFrameDuration(a.sampleRate, a.timescale)\n a.objectType = e1.esds?.objectType || 2\n if (e1.esds) {\n if (e1.esds.config) {\n a.config = Array.from(e1.esds.config)\n } else {\n console.warn('esds config is null')\n }\n }\n a.codec = e1.esds?.codec || 'mp4a.40.2'\n a.sampleRateIndex = AAC.getRateIndexByRate(a.sampleRate)\n a.ext = {}\n a.ext.stss = aTrack.mdia?.minf?.stbl?.stss\n a.ext.ctts = aTrack.mdia?.minf?.stbl?.ctts\n a.present = true\n if (e1 && e1.type === 'enca') {\n a.isAudioEncryption = true\n e1.data_format = e1.sinf?.frma?.data_format\n e1.default_KID = e1.sinf?.schi?.tenc.default_KID\n e1.default_IsEncrypted = e1.sinf?.schi?.tenc.default_IsEncrypted\n e1.default_IV_size = e1.sinf?.schi?.tenc.default_IV_size\n a.audioSenc = aTrack.mdia.minf.stbl.senc && aTrack.mdia.minf.stbl.senc.samples\n a.useEME = moov.useEME\n a.kidValue = moov.kidValue\n a.enca = e1\n }\n }\n\n audioTrack && (audioTrack.isVideoEncryption = videoTrack ? videoTrack.isVideoEncryption : false)\n videoTrack && (videoTrack.isAudioEncryption = audioTrack ? audioTrack.isAudioEncryption : false)\n\n if (videoTrack?.encv || audioTrack?.enca) {\n const vkid = videoTrack?.encv?.default_KID\n const akid = audioTrack?.enca?.default_KID\n const kid = (vkid || akid) ? (vkid || akid).join('') : null\n videoTrack && (videoTrack.kid = kid)\n audioTrack && (audioTrack.kid = kid)\n }\n\n videoTrack && (videoTrack.flags = 0xf01)\n audioTrack && (audioTrack.flags = 0x701)\n\n return {\n videoTrack,\n audioTrack\n }\n }\n\n static evaluateDefaultDuration (videoTrack, audioTrack, videoSampleCount) {\n const audioSampleCount = audioTrack?.samples?.length\n\n // audio\n if (!audioSampleCount) return 1024\n\n const segmentDuration = 1024 * audioSampleCount / audioTrack.timescale\n\n return segmentDuration * videoTrack.timescale / videoSampleCount\n }\n\n static moofToSamples (moof, videoTrack, audioTrack) {\n const ret = {}\n\n if (moof.mfhd) {\n if (videoTrack) videoTrack.sequenceNumber = moof.mfhd.sequenceNumber\n if (audioTrack) audioTrack.sequenceNumber = moof.mfhd.sequenceNumber\n }\n\n moof.traf.forEach(({ tfhd, tfdt, trun }) => {\n if (!tfhd || !trun) return\n if (tfdt) {\n if (videoTrack && videoTrack.id === tfhd.trackId) videoTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n if (audioTrack && audioTrack.id === tfhd.trackId) audioTrack.baseMediaDecodeTime = tfdt.baseMediaDecodeTime\n }\n const defaultSize = tfhd.defaultSampleSize || 0\n const defaultDuration = tfhd.defaultSampleDuration || MP4Parser.evaluateDefaultDuration(videoTrack, audioTrack, trun.samples.length || trun.sampleCount)\n let offset = trun.dataOffset || 0\n let dts = 0\n let gopId = -1\n if (!trun.samples.length && trun.sampleCount) {\n ret[tfhd.trackId] = []\n for (let i = 0; i < trun.sampleCount; i++) {\n ret[tfhd.trackId].push({\n offset,\n dts,\n duration: defaultDuration,\n size: defaultSize\n })\n dts += defaultDuration\n offset += defaultSize\n }\n } else {\n ret[tfhd.trackId] = trun.samples.map((s, index) => {\n s = {\n offset,\n dts,\n pts: dts + (s.cts || 0),\n duration: s.duration || defaultDuration,\n size: s.size || defaultSize,\n gopId,\n keyframe: index === 0 || ((s.flags !== null && s.flags !== undefined) && ((s.flags & 65536) >>> 0) !== 65536)\n }\n if (s.keyframe) {\n gopId++\n s.gopId = gopId\n }\n dts += s.duration\n offset += s.size\n return s\n })\n }\n })\n\n return ret\n }\n\n static moovToSamples (moov) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const vTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const aTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!vTrack && !aTrack) return\n let videoSamples\n let audioSamples\n if (vTrack) {\n const videoStbl = vTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!stts || !stsc || !stsz || !stco || !stss) return\n videoSamples = getSamples(stts, stsc, stsz, stco, ctts, stss)\n }\n if (aTrack) {\n const audioStbl = aTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = aTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSamples = getSamples(stts, stsc, stsz, stco)\n }\n\n return {\n videoSamples,\n audioSamples\n }\n }\n}\n\nfunction getSamples (stts, stsc, stsz, stco, ctts, stss) {\n const samples = []\n const cttsEntries = ctts?.entries\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n\n let sample\n let gopId = -1\n let dts = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0].samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n stts.entries.forEach(({ count, delta }) => {\n for (let i = 0; i < count; i++) {\n sample = {\n dts,\n duration: delta,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n sample.keyframe = keyframeMap[pos]\n if (sample.keyframe) {\n gopId++\n }\n sample.gopId = gopId\n }\n // sample.timeOffset = 0\n if (cttsArr && pos < cttsArr.length) {\n sample.pts = sample.dts + cttsArr[pos]\n // sample.timeOffset = cttsArr[pos]\n // if (pos === 0) {\n // sample.pts = sample.dts\n // sample.timeOffset = 0\n // }\n }\n samples.push(sample)\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += sample.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n return samples\n}\n\nfunction parseVisualSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.width = readBig16(data, 24)\n ret.height = readBig16(data, 26)\n ret.horizresolution = readBig32(data, 28)\n ret.vertresolution = readBig32(data, 32)\n ret.frameCount = readBig16(data, 40)\n ret.depth = readBig16(data, 74)\n return 78\n}\n\nfunction parseAudioSampleEntry (ret, data) {\n ret.dataReferenceIndex = readBig16(data, 6)\n ret.channelCount = readBig16(data, 16)\n ret.sampleSize = readBig16(data, 18)\n ret.sampleRate = readBig32(data, 24) / (1 << 16)\n return 28\n}\n\nfunction parseBox (box, isFullBox, parse) {\n if (!box) return\n if (box.size !== box.data.length) {\n throw new Error(`box ${box.type} size !== data.length`)\n }\n const ret = {\n start: box.start,\n size: box.size,\n headerSize: box.headerSize,\n type: box.type\n }\n if (isFullBox) {\n ret.version = box.data[box.headerSize]\n ret.flags = readBig24(box.data, box.headerSize + 1)\n ret.headerSize += 4\n }\n parse(ret, box.data.subarray(ret.headerSize), ret.start + ret.headerSize)\n return ret\n}\n\nconst padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\nconst toHex = function (...value) {\n const hex = []\n value.forEach(item => {\n hex.push(padStart(Number(item).toString(16), 2, 0))\n })\n return hex[0]\n}\n","import { VideoTrack, AudioTrack, MetadataTrack, VideoSample, AudioSample } from '../model'\nimport { concatUint8Array, readBig32 } from '../utils'\nimport { MP4Parser } from './mp4-parser'\n\nexport class FMP4Demuxer {\n __loadedMoofWraps = []\n __lastRemainData = null\n __lastRemainDataStart = 0\n __nextMoofStart = -1\n\n\n constructor (videoTrack, audioTrack, metadataTrack) {\n this.videoTrack = videoTrack || new VideoTrack()\n this.audioTrack = audioTrack || new AudioTrack()\n this.metadataTrack = metadataTrack || new MetadataTrack()\n }\n\n demuxPart (partData, partDataStart, moov) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n\n const isAV01 = /av01/.test(videoTrack.codec)\n videoTrack.samples = []\n audioTrack.samples = []\n\n let data = partData\n let dataStart = partDataStart\n if (this.__lastRemainData) {\n const lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength\n // 如果遗留数据和新数据之间存在非包含关系的重叠,则需要合并,否则丢弃遗留数据\n // 如果遗留数据和新数据之间不存在重叠,需要丢弃遗留数据,保证后续的新数据可以连续的解析\n const continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd\n if (continuous) {\n // data = 遗留数据 + 新数据,为了程序健壮性,即可能存在重复的range,需要subarray规避\n const noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart)\n data = concatUint8Array(this.__lastRemainData, noDuplicateData)\n dataStart = this.__lastRemainDataStart\n this.__lastRemainData = null\n } else {\n this.__lastRemainData = null\n this.__lastRemainDataStart = 0\n this.__nextMoofStart = -1\n }\n }\n\n if (!moov) {\n const moovBox = MP4Parser.findBox(data, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n moov = MP4Parser.moov(moovBox)\n }\n\n if (data) {\n const dataEnd = dataStart + data.byteLength\n if (!videoExist && !audioExist) {\n MP4Parser.moovToTrack(moov, videoTrack, audioTrack)\n }\n // findBox要求参数由box header作为起始,故需要定位到moof的起始点,通过前一个moof计算出下一个moof的start位置,并保证解析的内容大于header的长度(8)\n const moofBoxes = []\n if (this.__nextMoofStart < 0) {\n MP4Parser.findBox(data, ['moof'], dataStart).forEach(v => moofBoxes.push(v))\n } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {\n MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ['moof'], this.__nextMoofStart).forEach(v => moofBoxes.push(v))\n }\n moofBoxes.filter(moofBox => moofBox.size <= moofBox.data.length).forEach(moofBox => {\n const moof = MP4Parser.moof(moofBox)\n // 通过(trun.dataOffset + all samples的合并值)最大值计算得到下一个moof.start,也可以通过mdat box获取,此处为前者逻辑\n this.__nextMoofStart = moof.start + Math.max(...moof.traf.map(v => v.trun.samples.reduce((ret, w) => ret + w.size, v.trun.dataOffset || 0)))\n this.__loadedMoofWraps.push({\n start: moof.start,\n nextMoofStart: this.__nextMoofStart,\n moof\n })\n this.__loadedMoofWraps.sort((p, n) => p.start - n.start) // 排序,兼容seek\n })\n\n for (const moofWrap of this.__loadedMoofWraps) {\n // 跳过不需要解析的moof,减少非必要的损耗\n if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {\n continue\n }\n const moofStart = moofWrap.start\n const tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack)\n\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line\n if (videoTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset += moofStart\n if (xStart < dataStart) {\n return\n }\n // 如果当前sample已经超过了数据范围,则中断遍历\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n sample.data = sampleData\n if (!isAV01) { // av1编码的数据不需要解析nals\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n }\n this.__lastRemainDataStart = xStart + x.size\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k]\n .some(x => {\n const xStart = x.offset + moofStart\n if (xStart < dataStart) {\n return\n }\n if (xStart + x.size > dataEnd) {\n return true\n }\n const sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n this.__lastRemainDataStart = xStart + x.size\n })\n }\n })\n }\n }\n\n // 保存未解析的数据,下次解析时合并使用\n if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {\n this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart)\n } else {\n this.__lastRemainData = data\n this.__lastRemainDataStart = dataStart\n }\n\n // fmp4中sample.pts是通过tfdt的baseMediaDecodeTime + sample.duration计算得出的\n // 所以此处sample的pts是多少不重要,反而需要确保demuxPart中baseMediaDecodeTime的值为起始帧的pts,才能保证remux后解析的结果与原始数据一致\n if (videoTrack.samples.length) {\n videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts\n }\n if (audioTrack.samples.length) {\n audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n demux (videoData, audioData) {\n const { videoTrack, audioTrack } = this\n const videoExist = videoTrack.exist()\n const audioExist = audioTrack.exist()\n videoTrack.samples = []\n audioTrack.samples = []\n\n if (audioData) {\n if (!audioExist) {\n const moovBox = MP4Parser.findBox(audioData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), null, audioTrack)\n }\n const moofBox = MP4Parser.findBox(audioData, ['moof'])[0]\n if (moofBox) {\n const samples = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), null, audioTrack)[audioTrack.id]\n const baseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n if (samples) {\n const baseOffset = moofBox.start\n samples.map(x => {\n x.offset += baseOffset\n const sampleData = audioData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + baseMediaDecodeTime, sampleData, x.duration))\n })\n }\n }\n }\n\n if (videoData) {\n if (!videoExist && !audioExist) {\n const moovBox = MP4Parser.findBox(videoData, ['moov'])[0]\n if (!moovBox) throw new Error('cannot found moov box')\n MP4Parser.moovToTrack(MP4Parser.moov(moovBox), videoTrack, audioTrack)\n }\n const moofBox = MP4Parser.findBox(videoData, ['moof'])[0]\n if (moofBox) {\n const tracks = MP4Parser.moofToSamples(MP4Parser.moof(moofBox), videoTrack, audioTrack)\n const videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime\n const audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime\n const baseOffset = moofBox.start\n let nalSize\n Object.keys(tracks).forEach(k => {\n // eslint-disable-next-line eqeqeq\n if (videoTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime)\n sample.duration = x.duration\n sample.gopId = x.gopId\n if (x.keyframe) sample.setToKeyframe()\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n sample.data = sampleData\n let start = 0\n const len = sampleData.length - 1\n while (start < len) {\n nalSize = readBig32(sampleData, start)\n start += 4\n sample.units.push(sampleData.subarray(start, start + nalSize))\n start += nalSize\n }\n videoTrack.samples.push(sample)\n })\n // eslint-disable-next-line eqeqeq\n } else if (audioTrack.id == k) {\n tracks[k].map(x => {\n x.offset += baseOffset\n const sampleData = videoData.subarray(x.offset, x.offset + x.size)\n audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration))\n })\n }\n })\n }\n }\n\n return {\n videoTrack,\n audioTrack,\n metadataTrack: this.metadataTrack\n }\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n this.metadataTrack.reset()\n }\n\n static probe (data) {\n return MP4Parser.probe(data)\n }\n}\n","\n// 改造为兼容IE11\nfunction Concat (ResultConstructor, ...arrays){\n let totalLength = 0\n arrays.forEach(function (arr){\n totalLength += arr.length\n })\n const result = new ResultConstructor(totalLength)\n let offset = 0\n arrays.forEach(function (arr){\n result.set(arr, offset)\n offset += arr.length\n })\n return result\n}\n\nclass Buffer {\n constructor () {\n this.buffer = new Uint8Array(0)\n }\n\n write (...buffer) {\n const self = this\n buffer.forEach(item => {\n if (item) {\n self.buffer = Concat(Uint8Array, self.buffer, item)\n } else {\n window.console.warn(item)\n }\n })\n }\n\n static writeUint16 (value) {\n return new Uint8Array([\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n\n static writeUint32 (value) {\n return new Uint8Array([\n value >> 24,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n ])\n }\n}\n\nexport default Buffer\n","import { AudioCodecType, TrackType, VideoCodecType } from '../model'\nimport { concatUint8Array, parse } from '../utils'\nimport Buffer from './buffer'\n\nconst UINT32_MAX = 2 ** 32 - 1\n\nexport class MP4 {\n static types = [\n 'Opus',\n 'dOps',\n 'av01',\n 'av1C',\n 'avc1',\n 'avcC',\n 'hvc1',\n 'hvcC',\n 'dinf',\n 'dref',\n 'esds',\n 'ftyp',\n 'hdlr',\n 'mdat',\n 'mdhd',\n 'mdia',\n 'mfhd',\n 'minf',\n 'moof',\n 'moov',\n 'mp4a',\n 'mvex',\n 'mvhd',\n 'pasp',\n 'stbl',\n 'stco',\n 'stsc',\n 'stsd',\n 'stsz',\n 'stts',\n 'tfdt',\n 'tfhd',\n 'traf',\n 'trak',\n 'trex',\n 'tkhd',\n 'vmhd',\n 'smhd',\n 'ctts',\n 'stss',\n 'styp',\n 'pssh',\n 'sidx',\n 'sbgp',\n 'saiz',\n 'saio',\n 'senc',\n 'trun',\n 'encv',\n 'enca',\n 'sinf',\n 'btrt',\n 'frma',\n 'tenc',\n 'schm',\n 'schi',\n 'mehd',\n 'fiel',\n 'sdtp'\n ].reduce((p, c) => {\n p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)]\n return p\n }, Object.create(null));\n\n static HDLR_TYPES = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61,\n 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ])\n }\n\n static FTYPAVC1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 97, 118, 99, 49 // avc1\n ]))\n\n static FTYPHEV1 = MP4.box(MP4.types.ftyp, new Uint8Array([\n 105, 115, 111, 109, // isom\n 0, 0, 0, 1,\n 105, 115, 111, 109,\n 104, 101, 118, 49 // hev1\n ]))\n\n static DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version\n 0x00, 0x00, 0x01 // entry_flags\n ])))\n\n static VMHD = MP4.box(MP4.types.vmhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // op color\n ]))\n\n static SMHD = MP4.box(MP4.types.smhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]))\n\n static StblTable = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ])\n\n static STTS = MP4.box(MP4.types.stts, MP4.StblTable)\n\n static STSC = MP4.box(MP4.types.stsc, MP4.StblTable)\n\n static STSZ = MP4.box(MP4.types.stsz, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]))\n\n static STCO = MP4.box(MP4.types.stco, MP4.StblTable)\n\n static box (type, ...payload) {\n payload = payload.filter(Boolean)\n const size = 8 + payload.reduce((p, c) => (p + c.byteLength), 0)\n const ret = new Uint8Array(size)\n ret[0] = (size >> 24) & 0xff\n ret[1] = (size >> 16) & 0xff\n ret[2] = (size >> 8) & 0xff\n ret[3] = size & 0xff\n ret.set(type, 4)\n let offset = 8\n payload.forEach((data) => {\n ret.set(data, offset)\n offset += data.byteLength\n })\n return ret\n }\n\n static ftyp (tracks) {\n const isHevc = tracks.find(t => t.type === TrackType.VIDEO && t.codecType === VideoCodecType.HEVC)\n return isHevc ? MP4.FTYPHEV1 : MP4.FTYPAVC1\n }\n\n static initSegment (tracks) {\n const ftyp = MP4.ftyp(tracks)\n // console.log('[remux],ftyp ,len ', ftyp.byteLength, hashVal(ftyp.toString()))\n const init = concatUint8Array(ftyp, MP4.moov(tracks))\n // console.log('[remux],init ,len ', init.byteLength, hashVal(init.toString()))\n return init\n }\n\n static pssh (data) {\n // const buffer = new Buffer()\n const content = new Uint8Array(\n [\n 0x01, 0x00, 0x00, 0x00 // version\n ].concat(\n [\n 0x10, 0x77, 0xef, 0xec,\n 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e,\n 0x52, 0xe2, 0xfb, 0x4b\n ],\n [0x00, 0x00, 0x00, 0x01],\n parse(data.kid),\n [0x00, 0x00, 0x00, 0x00]\n )\n )\n return MP4.box(MP4.types.pssh, content)\n }\n\n static moov (tracks) {\n if (tracks[0].useEME && (tracks[0].encv || tracks[0].enca)) {\n if (!tracks[0].pssh) {\n tracks[0].pssh = {\n kid: tracks[0].kid\n }\n }\n const pssh = this.pssh(tracks[0].pssh)\n // console.log('[remux],pssh,', hashVal(pssh.toString()))\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n MP4.mvex(tracks),\n ...tracks.map((t) => MP4.trak(t)),\n pssh)\n } else {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].mvhdDurtion || tracks[0].duration, tracks[0].mvhdTimecale || tracks[0].timescale),\n ...tracks.map((t) => MP4.trak(t)),\n MP4.mvex(tracks)\n )\n }\n }\n\n static mvhd (duration, timescale = 90000) {\n const mvhd = MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x01, 0x00, 0x00, // rate\n 0x01, 0x00, // volume\n 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff // todo 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]))\n // console.log('[remux],mvhd, len,', mvhd.byteLength, hashVal(mvhd.toString()))\n return mvhd\n }\n\n static trak (track) {\n const trak = MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.tkhdDuration || 0, track.width, track.height),\n MP4.mdia(track)\n )\n // console.log('[remux],trak, len,', trak.byteLength, track.id, hashVal(trak.toString()))\n return trak\n }\n\n static tkhd (id, duration, width = 0, height = 0) {\n const tkhd = MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x07, // flags、todo 0x07\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time todo\n (id >> 24) & 0xff, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff,\n 0x00, 0x00, 0x00, 0x00,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // todo (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // /*0x00*/ alternate_group //todo type === 'video' ? 0x01 : 0x00(第二个位置)\n 0x01, 0x00, // /* 0x01 */, 0x00, // non-audio track volume //todo type === 'audio' ? 0x01 : 0x00(第一个位置)\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // matrix\n (width >> 8) & 0xff, width & 0xff, 0x00, 0x00,\n (height >> 8) & 0xff, height & 0xff, 0x00, 0x00\n ]))\n // console.log('[remux],tkhd, len,', tkhd.byteLength, hashVal(tkhd.toString()))\n return tkhd\n }\n\n static mdia (track) {\n const mdia = MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minf(track))\n // console.log('[remux],mdia, len,', mdia.byteLength, hashVal(mdia.toString()))\n return mdia\n }\n\n static mdhd (duration, timescale = 90000) {\n const mdhd = MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // todo 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >> 24) & 0xff, (timescale >> 16) & 0xff, (timescale >> 8) & 0xff, timescale & 0xff,\n (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff, // (duration >> 24) & 0xff, (duration >> 16) & 0xff, (duration >> 8) & 0xff, duration & 0xff,//todo\n 0x55, 0xc4, // 'und' language (undetermined) //todo 0x15, 0xC7\n 0x00, 0x00 // pre_defined\n ]))\n // console.log('[remux],mdhd, len,', mdhd.byteLength, hashVal(mdhd.toString()))\n return mdhd\n }\n\n static hdlr (type) {\n const hdlr = MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type])\n // console.log('[remux],hdlr, len,', hdlr.byteLength, hashVal(hdlr.toString()))\n return hdlr\n }\n\n static minf (track) {\n const minf = MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stbl(track))\n // console.log('[remux],minf, len,', minf.byteLength, hashVal(minf.toString()))\n return minf\n }\n\n static stbl (track) {\n const extBox = []\n if (track && track.ext) {\n track.ext.stss && extBox.push(MP4.stss(track.ext.stss.entries))\n // track.ext.stss && extBox.push(MP4.ctts(track.ext.stss.entries))\n }\n const stbl = MP4.box(MP4.types.stbl, MP4.stsd(track), MP4.STTS, extBox[0], MP4.STSC, MP4.STSZ, MP4.STCO)\n // console.log('[remux],stbl, len,', stbl.byteLength, hashVal(stbl.toString()))\n return stbl\n }\n\n static stsd (track) {\n let content\n\n if (track.type === 'audio') {\n if (track.useEME && track.enca) {\n content = MP4.enca(track)\n // console.log('[remux],enca, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else {\n if (track.codecType === AudioCodecType.OPUS) {\n content = MP4.opus(track)\n } else {\n content = MP4.mp4a(track)\n }\n }\n } else if (track.useEME && track.encv) {\n content = MP4.encv(track)\n // console.log('[remux],encv, len,', content.byteLength, track.type, hashVal(content.toString()))\n } else if (track.av1C) {\n content = MP4.av01(track)\n } else {\n content = MP4.avc1hev1(track)\n // console.log('[remux],avc1hev1, len,', content.byteLength, track.type, hashVal(content.toString()))\n }\n const stsd = MP4.box(MP4.types.stsd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]), content)\n // console.log('[remux],stsd, len,', stsd.byteLength, hashVal(stsd.toString()))\n return stsd\n }\n\n static enca (data) {\n const channelCount = data.enca.channelCount\n const sampleRate = data.enca.sampleRate\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n (sampleRate >> 8) & 0xff,\n sampleRate & 0xff, //\n 0x00, 0x00\n ])\n const esds = MP4.esds(data.config)\n // console.log('[remux],esds, len,', esds.byteLength, hashVal(esds.toString()))\n const sinf = MP4.sinf(data.enca)\n // console.log('[remux],sinf, len,', sinf.byteLength, hashVal(sinf.toString()))\n return MP4.box(MP4.types.enca, content, esds, sinf)\n }\n\n static encv (track) {\n const sps = track.sps.length > 0 ? track.sps[0] : []\n const pps = track.pps.length > 0 ? track.pps[0] : []\n const width = track.width\n const height = track.height\n const hSpacing = track.sarRatio[0]\n const vSpacing = track.sarRatio[1]\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n\n 0x12,\n 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74,\n 0x69, 0x6F, 0x6E, 0x2F,\n 0x68, 0x6C, 0x73, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]) // pre_defined = -1;\n const avcc = new Uint8Array([\n 0x01, // version\n sps[1], // profile\n sps[2], // profile compatible\n sps[3], // level\n 0xfc | 3,\n 0xE0 | 1, // 目前只处理一个sps\n sps.length >>> 8 & 0xff,\n sps.length & 0xff\n ].concat(...sps).concat([\n 0x01,\n pps.length >>> 8 & 0xff,\n pps.length & 0xff\n ]).concat(...pps))\n const btrt = new Uint8Array([\n 0x00, 0x00, 0x58, 0x39,\n 0x00, 0x0F, 0xC8, 0xC0,\n 0x00, 0x04, 0x56, 0x48\n ])\n const sinf = MP4.sinf(track.encv)\n const pasp = new Uint8Array([\n (hSpacing >> 24), // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n (vSpacing >> 24), // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff\n ])\n return MP4.box(MP4.types.encv, content, MP4.box(MP4.types.avcC, avcc), MP4.box(MP4.types.btrt, btrt), sinf, MP4.box(MP4.types.pasp, pasp))\n }\n\n static schi (data) {\n const content = new Uint8Array([])\n const tenc = MP4.tenc(data)\n return MP4.box(MP4.types.schi, content, tenc)\n }\n\n static tenc (data) {\n // 用于每个track的加密参数(包括KID、初始化向量、加密标志位),包含在TrackEncryptionBox(‘tenc’)中。\n const content = new Uint8Array(\n [\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // skip\n data.default_IsEncrypted & 0xff, // default_isProtected\n data.default_IV_size & 0xff // default_Per_Sample_IV_Size\n ].concat(parse(data.default_KID)))\n return MP4.box(MP4.types.tenc, content)\n }\n\n static sinf (data) {\n const content = new Uint8Array([])\n const frma = new Uint8Array([\n data.data_format.charCodeAt(0),\n data.data_format.charCodeAt(1),\n data.data_format.charCodeAt(2),\n data.data_format.charCodeAt(3)\n ])\n const schm = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x63, 0x65, 0x6E, 0x63, // cenc\n 0x00, 0x01, 0x00, 0x00 // version\n ])\n const schi = MP4.schi(data)\n return MP4.box(MP4.types.sinf, content, MP4.box(MP4.types.frma, frma), MP4.box(MP4.types.schm, schm), schi)\n }\n static av01 (track) {\n return MP4.box(MP4.types.av01, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), track.av1C, track.colr)\n }\n static avc1hev1 (track) {\n const isHevc = track.codecType === VideoCodecType.HEVC\n const typ = isHevc ? MP4.types.hvc1 : MP4.types.avc1\n const config = isHevc ? MP4.hvcC(track) : MP4.avcC(track)\n const boxes = [\n new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n (track.width >> 8) & 0xff, track.width & 0xff, // width\n (track.height >> 8) & 0xff, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth\n 0x11, 0x11 // pre_defined = -1 //todo\n ]), config\n ]\n // console.log('[remux],avc1hev1_0, len,', boxes[0].byteLength, hashVal(boxes[0].toString()))\n // console.log('[remux],avc1hev1_1, len,', boxes[1].byteLength, hashVal(boxes[1].toString()))\n if (isHevc) {\n boxes.push(MP4.box(MP4.types.fiel, new Uint8Array([0x01, 0x00])))\n // console.log('[remux],fiel, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n } else if (track.sarRatio && track.sarRatio.length > 1) {\n boxes.push(MP4.pasp(track.sarRatio))\n // console.log('[remux],pasp, len,', boxes[2].byteLength, hashVal(boxes[2].toString()))\n }\n return MP4.box(typ, ...boxes)\n }\n\n static avcC (track) {\n const sps = []\n const pps = []\n\n let len\n track.sps.forEach((s) => {\n len = s.byteLength\n sps.push((len >>> 8) & 0xff)\n sps.push(len & 0xff)\n sps.push(...s)\n })\n\n track.pps.forEach((p) => {\n len = p.byteLength\n pps.push((len >>> 8) & 0xff)\n pps.push(len & 0xff)\n pps.push(...p)\n })\n\n return MP4.box(MP4.types.avcC, new Uint8Array([\n 0x01, // configurationVersion\n sps[3], // AVCProfileIndication\n sps[4], // profile_compatibility\n sps[5], // AVCLevelIndication\n 0xfc | 3, // lengthSizeMinusOne\n 0xe0 | track.sps.length // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(...sps)\n .concat([track.pps.length]) // numOfPictureParameterSets\n .concat(...pps)))\n }\n\n static hvcC (track) {\n const hvcC = track.hvcC\n if (hvcC instanceof ArrayBuffer || hvcC instanceof Uint8Array) return hvcC\n const { vps, sps, pps } = track\n let data\n if (hvcC) {\n const pcf = hvcC.generalProfileCompatibilityFlags\n const cif = hvcC.generalConstraintIndicatorFlags\n const numOfArrays = (vps.length && 1) + (sps.length && 1) + (pps.length && 1)\n data = [\n 0x01, // configurationVersion\n hvcC.generalProfileSpace << 6 | hvcC.generalTierFlag << 5 | hvcC.generalProfileIdc,\n pcf >>> 24, pcf >>> 16, pcf >>> 8, pcf,\n cif[0], cif[1], cif[2], cif[3], cif[4], cif[5],\n hvcC.generalLevelIdc,\n 0xF0, 0x00, // min_spatial_segmentation_idc\n 0xFC, // parallelismType\n hvcC.chromaFormatIdc | 0xFC,\n hvcC.bitDepthLumaMinus8 | 0xF8,\n hvcC.bitDepthChromaMinus8 | 0xF8,\n 0x00, 0x00, // avgFrameRate\n hvcC.numTemporalLayers << 3 | hvcC.temporalIdNested << 2 | 3,\n numOfArrays\n ]\n const write = (x) => {\n data.push(x.length >> 8, x.length)\n data.push(...x)\n }\n if (vps.length) {\n data.push(0xA0, 0x00, vps.length)\n vps.forEach(write)\n }\n if (sps.length) {\n data.push(0xA1, 0x00, sps.length)\n sps.forEach(write)\n }\n if (pps.length) {\n data.push(0xA2, 0x00, pps.length)\n pps.forEach(write)\n }\n } else {\n data = [\n 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02,\n 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00,\n 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40\n ]\n }\n return MP4.box(MP4.types.hvcC, new Uint8Array(data))\n }\n\n static pasp ([hSpacing, vSpacing]) {\n return MP4.box(MP4.types.pasp, new Uint8Array([\n hSpacing >> 24, (hSpacing >> 16) & 0xff, (hSpacing >> 8) & 0xff, hSpacing & 0xff,\n vSpacing >> 24, (vSpacing >> 16) & 0xff, (vSpacing >> 8) & 0xff, vSpacing & 0xff\n ]))\n }\n\n static mp4a (track) {\n return MP4.box(MP4.types.mp4a, new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, track.channelCount,\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff, track.sampleRate & 0xff,\n 0x00, 0x00\n ]), track.config.length ? MP4.esds(track.config) : undefined)\n }\n\n static esds (config) {\n const len = config.length\n const esds = MP4.box(MP4.types.esds, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x03, // tag\n 0x17 + len, // length\n 0x00, 0x00, // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n 0x04, // tag\n 0x0f + len, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x06, 0x00, // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0, // maxBitrate\n 0x00, 0x00, 0xda, 0xc0, // avgBitrate\n 0x05 // tag, DecoderSpecificInfoTag\n ].concat([len])\n .concat(config)\n .concat(\n [0x06, 0x01, 0x02]// GASpecificConfig\n )\n ))\n // console.log('[remux],esds ,len ', esds.byteLength, hashVal(esds.toString()))\n return esds\n }\n\n /**\n * https://opus-codec.org/docs/opus_in_isobmff.html\n */\n static opus (track) {\n const opusAudioDescription = new Uint8Array([\n 0x00, 0x00, 0x00, // version\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n track.channelCount,\n 0x00, 0x10, // sampleSize\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n (track.sampleRate >> 8) & 0xff,\n track.sampleRate & 0xff, // sampleRate\n 0x00, 0x00\n ])\n\n const opusSpecificConfig = track.config.length ? MP4.dOps(track) : []\n return MP4.box(MP4.types.Opus, opusAudioDescription, opusSpecificConfig)\n }\n\n static dOps (track) {\n if (track.config) {\n track.config[4] = (track.sampleRate >>> 24) & 0xFF\n track.config[5] = (track.sampleRate >>> 16) & 0xFF\n track.config[6] = (track.sampleRate >>> 8) & 0xFF\n track.config[7] = (track.sampleRate) & 0xFF\n\n return MP4.box(MP4.types.dOps, track.config)\n }\n\n // const {channelCount, channelConfigCode, sampleRate } = track\n\n // const mapping = channelConfigCode?.map((c) => {\n // return [\n // (c >>> 4) & 0xFF, // Channel mapping family\n // c & 0xFF // Channel mapping index\n // ]\n // }).flat() || []\n\n // const data = new Uint8Array([\n // 0x00, // version\n // channelCount, // channelCount\n // 0x00, 0x00, // preSkip\n // (sampleRate >>> 24) & 0xFF,\n // (sampleRate >>> 17) & 0xFF,\n // (sampleRate >>> 8) & 0xFF,\n // (sampleRate >>> 0) & 0xFF,\n // 0x00, 0x00, // Global Gain\n // ... mapping\n // ])\n\n // return data\n }\n\n static mvex (tracks) {\n // const mehd = MP4.box(MP4.types.mehd, this.extension(0, 0), Buffer.writeUint32(tracks[0].tkhdDuration))\n // const mvex = MP4.box(MP4.types.mvex, mehd, MP4.trex1(1), MP4.trex2(2))\n // // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n // const mvex = MP4.box(MP4.types.mvex, MP4.trex1(1), MP4.trex2(2))\n const mvex = MP4.box(MP4.types.mvex, ...tracks.map((t) => MP4.trex(t.id)))\n // console.log('[remux],mvex, len,', mvex.byteLength, hashVal(mvex.toString()))\n return mvex\n }\n\n static trex (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex1 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x02, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static trex2 (id) {\n const trex = MP4.box(MP4.types.trex, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n (id >> 24),\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n (id & 0xff), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x04, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x02, 0x00, 0x00, 0x00 // default_sample_flags\n ]))\n // console.log('[remux],trex, len,', trex.byteLength, hashVal(trex.toString()))\n return trex\n }\n\n static moof (tracks) {\n const moof = MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].samples ? tracks[0].samples[0].gopId : 0), ...tracks.map((t) => MP4.traf(t)))\n // console.log('[remux],moof, len', moof.byteLength)\n return moof\n // return MP4.box(MP4.types.moof, MP4.mfhd(tracks[0].gopId), ...tracks.map((t) => MP4.traf(t)))\n }\n\n static mfhd (sequenceNumber) {\n // sequenceNumber += 1\n const mfhd = MP4.box(MP4.types.mfhd, new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n sequenceNumber >> 24, (sequenceNumber >> 16) & 0xff, (sequenceNumber >> 8) & 0xff, sequenceNumber & 0xff\n ]))\n // console.log('[remux],mfhd, len,', mfhd.byteLength, hashVal(mfhd.toString()))\n return mfhd\n }\n\n static traf (track) {\n const tfhd = MP4.tfhd(track.id)\n // console.log('[remux],tfhd, len,', tfhd.byteLength, hashVal(tfhd.toString()), ', trackid = ', track.id)\n // console.log('[remux],tfdt,baseMediaDecodeTime,', track.baseMediaDecodeTime)\n const tfdt = MP4.tfdt(track, track.baseMediaDecodeTime)\n let sencLength = 0\n let samples\n if (track.isVideo && track.videoSenc) {\n samples = track.videoSenc\n samples.forEach(function (item) {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n track.videoSencLength = sencLength\n // console.log('[remux],tfdt, len,', tfdt.toString().length)\n // console.log('[remux],tfdt, len,', tfdt.byteLength, hashVal(tfdt.toString()))\n if (!track.useEME || (!track.isVideoEncryption && !track.isAudioEncryption)) {\n const sdtp = MP4.sdtp(track)\n // console.log('[remux],sdtp, len,', sdtp.byteLength, hashVal(sdtp.toString()))\n const offset = 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8 // mdat header\n return MP4.box(MP4.types.traf, tfhd, tfdt, sdtp, MP4.trun(track.samples, sdtp.byteLength + offset))\n } else if (track.isVideoEncryption) {\n if (track.isVideo) {\n // 加密视频\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const trun = MP4.trun1(track)\n const senc = MP4.senc(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, saiz, saio, trun, senc)\n // console.log('[remux],trex_video, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n } else {\n // 视频加密,音频加密和未加密处理\n if (!track.isAudioEncryption) {\n // 音频未加密\n const sbgp = MP4.sbgp()\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, trun)\n } else {\n // 音频加密\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex_audio, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n } else {\n // 视频未加密,音频加密\n if (track.isVideo) {\n const trun = MP4.trun1(track)\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun)\n } else {\n const sbgp = MP4.sbgp()\n const saiz = MP4.saiz(track)\n const saio = MP4.saio(track)\n const senc = MP4.senc(track)\n const trun = MP4.trun1(track)\n const traf = MP4.box(MP4.types.traf, tfhd, tfdt, sbgp, saiz, saio, senc, trun)\n // console.log('[remux],trex, len,', traf.byteLength, hashVal(traf.toString()))\n return traf\n }\n }\n }\n\n static sdtp (data) {\n const buffer = new Buffer()\n data.samples.forEach(item => {\n buffer.write(new Uint8Array(data.isVideo ? [item.keyframe ? 32 : 16] : [16]))\n })\n return MP4.box(MP4.types.sdtp, this.extension(0, 0), buffer.buffer)\n }\n\n static trun1 (data) {\n // const id = data.id\n // const ceil = id === 1 ? 12 : 4\n const buffer = new Buffer()\n const sampleCount = Buffer.writeUint32(data.samples.length)\n let offset = null\n if (data.isVideo) {\n const sencLength = data.videoSencLength\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 17 + //saiz\n 24 + //saio\n data.samples.length*16\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 12(header) + sencLength //senc\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n = 149+data.samples.length * 16 + sencLength\n */\n offset = Buffer.writeUint32(data.samples.length * 16 + sencLength + 149)\n if (!data.isVideoEncryption && data.isAudioEncryption) {\n offset = Buffer.writeUint32(data.samples.length * 16 + 92)\n }\n } else {\n /*\n 16 + // mfhd\n 16 + // tfhd\n 20 + // tfdt\n 28 + //sbgp\n 4(offset) + 4(sampleCount) + 12(header) //trun\n 8 + // traf header\n 8 + // moof header\n 8 // mdat header\n */\n let len = data.samples.length * 12 + 124\n if (data.isAudioEncryption) {\n len = data.samples.length * 12 + 8 * data.audioSenc.length + 177\n }\n offset = Buffer.writeUint32(len)\n }\n\n data.samples.forEach(item => {\n buffer.write(Buffer.writeUint32(item.duration))\n buffer.write(Buffer.writeUint32(item.size))\n buffer.write(Buffer.writeUint32(item.keyframe ? 0x02000000 : 0x00010000))\n if (data.isVideo) {\n buffer.write(Buffer.writeUint32(item.cts ? item.cts : 0))\n }\n })\n\n return MP4.box(MP4.types.trun, this.extension(0, data.flags), sampleCount, offset, buffer.buffer)\n }\n\n static senc (data) {\n const buffer = new Buffer()\n const len = data.samples.length\n const ceil = data.isVideo ? 16 : 8\n const flag = data.isVideo ? 2 : 0\n let samples = []\n let samplesLength = 0\n if (data.isVideo) {\n samples = data.videoSenc\n samplesLength = data.videoSencLength\n } else {\n samples = data.audioSenc\n }\n samplesLength = samplesLength || ceil * len\n buffer.write(\n Buffer.writeUint32(16 + samplesLength), MP4.types.senc, this.extension(0, flag)\n )\n buffer.write(Buffer.writeUint32(len))\n samples.forEach(item => {\n for (let i = 0; i < item.InitializationVector.length; i++) {\n buffer.write(new Uint8Array([item.InitializationVector[i]]))\n }\n if (item.subsamples && item.subsamples.length) {\n buffer.write(Buffer.writeUint16(item.subsamples.length))\n item.subsamples.forEach(value => {\n buffer.write(Buffer.writeUint16(value.BytesOfClearData))\n buffer.write(Buffer.writeUint32(value.BytesOfProtectedData))\n })\n }\n })\n return buffer.buffer\n // return MP4.box(MP4.types.senc, this.extension(0, flag), buffer.buffer)\n }\n\n static saio (data) {\n let length = data.samples.length * 12 + 141\n if (!data.isVideo && data.isAudioEncryption) {\n length = 149\n }\n const content = new Uint8Array([\n 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x00, 0x00,\n (length >> 24) & 0xff,\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff\n ])\n return MP4.box(MP4.types.saio, content)\n }\n\n static saiz (data) {\n const samplesLength = data.samples.length\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x10, // default sample info size\n (samplesLength >> 24) & 0xff,\n (samplesLength >> 16) & 0xff,\n (samplesLength >> 8) & 0xff,\n samplesLength & 0xff\n ])\n return MP4.box(MP4.types.saiz, content)\n }\n\n static sbgp () {\n const content = new Uint8Array([\n 0x72, 0x6F, 0x6C, 0x6C, // sgpd, grouping_type\n 0x00, 0x00, 0x00, 0x01,\n 0x00, 0x00, 0x01, 0x19,\n 0x00, 0x00, 0x00, 0x01\n ])\n return MP4.box(MP4.types.sbgp, this.extension(0, 0), content)\n }\n\n static extension (version, flag) {\n return new Uint8Array([\n version,\n (flag >> 16) & 0xff,\n (flag >> 8) & 0xff,\n flag & 0xff\n ])\n }\n\n static tfhd (id) {\n return MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags todo 0x00\n id >> 24, (id >> 16) & 0xff, (id >> 8) & 0xff, id & 0xff // track_ID\n ]))\n }\n\n static tfdt (data, baseMediaDecodeTime) {\n const upperWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1))\n const lowerWordBaseMediaDecodeTime = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1))\n if (data.useEME && (data.isVideoEncryption || data.isAudioEncryption)) {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n } else {\n return MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff\n ]))\n }\n }\n\n static trun (samples, offset) {\n const sampleLen = samples.length\n const dataLen = 12 + (16 * sampleLen)\n offset += 8 + dataLen\n const data = new Uint8Array(dataLen)\n data.set([\n 0x00, // version\n 0x00, 0x0f, 0x01, // flags\n (sampleLen >>> 24) & 0xff, (sampleLen >>> 16) & 0xff, (sampleLen >>> 8) & 0xff, sampleLen & 0xff,\n (offset >>> 24) & 0xff, (offset >>> 16) & 0xff, (offset >>> 8) & 0xff, offset & 0xff // data_offset\n ], 0)\n for (let i = 0; i < sampleLen; i++) {\n const {\n duration, size, flag = {}, cts = 0\n } = samples[i]\n data.set([\n (duration >>> 24) & 0xff, (duration >>> 16) & 0xff, (duration >>> 8) & 0xff, duration & 0xff,\n (size >>> 24) & 0xff, (size >>> 16) & 0xff, (size >>> 8) & 0xff, size & 0xff,\n (flag.isLeading << 2) | (flag.dependsOn === null || flag.dependsOn === undefined ? 1 : flag.dependsOn),\n (flag.isDependedOn << 6) | (flag.hasRedundancy << 4) | (flag.paddingValue << 1) | (flag.isNonSyncSample === null || flag.isNonSyncSample === undefined ? 1 : flag.isNonSyncSample),\n flag.degradationPriority & (0xf0 << 8), flag.degradationPriority & 0x0f, // sample_flags\n (cts >>> 24) & 0xff, (cts >>> 16) & 0xff, (cts >>> 8) & 0xff, cts & 0xff // sample_composition_time_offset\n ], 12 + 16 * i)\n }\n\n return MP4.box(MP4.types.trun, data)\n }\n\n static moovMP4 (tracks) {\n return MP4.box(MP4.types.moov,\n MP4.mvhd(tracks[0].duration, tracks[0].timescale),\n ...tracks.map((t) => MP4.trackMP4(t)))\n }\n\n static trackMP4 (track) {\n return MP4.box(\n MP4.types.trak,\n MP4.tkhd(track.id, track.duration, track.width, track.height),\n MP4.mdiaMP4(track)\n )\n }\n\n static mdiaMP4 (track) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(track.duration, track.timescale), MP4.hdlr(track.type), MP4.minfMP4(track))\n }\n\n static minfMP4 (track) {\n return MP4.box(MP4.types.minf, track.type === TrackType.VIDEO ? MP4.VMHD : MP4.SMHD, MP4.DINF, MP4.stblMP4(track))\n }\n\n static stblMP4 (track) {\n const { ext } = track\n const boxes = [\n MP4.stsd(track),\n MP4.stts(ext.stts),\n MP4.stsc(ext.stsc),\n MP4.stsz(ext.stsz),\n MP4.stco(ext.stco)\n ]\n\n if (ext.stss.length) {\n boxes.push(MP4.stss(ext.stss))\n }\n\n if (ext.ctts.length) {\n boxes.push(MP4.ctts(ext.ctts))\n }\n\n return MP4.box(MP4.types.stbl, ...boxes)\n }\n\n static stts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n\n return MP4.box(MP4.types.stts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsc (entries) {\n const len = entries.length\n const data = new Uint8Array(12 * len)\n let offset = 0\n entries.forEach(({ firstChunk, samplesPerChunk, sampleDescIndex }) => {\n data.set([\n firstChunk >> 24, (firstChunk >> 16) & 0xff, (firstChunk >> 8) & 0xff, firstChunk & 0xff,\n samplesPerChunk >> 24, (samplesPerChunk >> 16) & 0xff, (samplesPerChunk >> 8) & 0xff, samplesPerChunk & 0xff,\n sampleDescIndex >> 24, (sampleDescIndex >> 16) & 0xff, (sampleDescIndex >> 8) & 0xff, sampleDescIndex & 0xff\n ], offset)\n offset += 12\n })\n return MP4.box(MP4.types.stsc, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n (len >> 24), (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static stsz (samplesSizes) {\n const len = samplesSizes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n samplesSizes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stsz, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stco (offsets) {\n const len = offsets.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n offsets.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stco, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static stss (keyframeIndexes) {\n const len = keyframeIndexes.length\n const data = new Uint8Array(4 * len)\n let offset = 0\n keyframeIndexes.forEach((x) => {\n data.set([\n x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff\n ], offset)\n offset += 4\n })\n return MP4.box(MP4.types.stss, concatUint8Array(\n new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]),\n data\n ))\n }\n\n static ctts (samples) {\n const len = samples.length\n const data = new Uint8Array(8 * len)\n let offset = 0\n samples.forEach(({ value, count }) => {\n data.set([\n count >> 24, (count >> 16) & 0xff, (count >> 8) & 0xff, count & 0xff,\n value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff\n ], offset)\n offset += 8\n })\n return MP4.box(MP4.types.ctts, concatUint8Array(new Uint8Array([\n 0, 0, 0, 0,\n len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff\n ]), data))\n }\n\n static styp () {\n return MP4.box(MP4.types.styp, new Uint8Array([\n 0x6D, 0x73, 0x64, 0x68,\n 0x00, 0x00, 0x00, 0x00,\n 0x6D, 0x73, 0x64, 0x68,\n 0x6D, 0x73, 0x69, 0x78\n ]))\n }\n\n // data.sampleOffset 指的是samples的序列号。_samples[0].idx\n static sidx (data) {\n // const buffer = new Buffer()\n const timescale = data.timescale\n const duration = data.samples[0].duration\n const durationCount = duration * data.samples.length\n const earliestTime = data.samples[0].sampleOffset * duration\n let mdatSize = 8\n data.samples.forEach(item => {\n mdatSize += item.size\n })\n let length = 0\n if (data.isVideo) {\n let sencLength = 0\n let samples\n if (data.videoSenc) {\n samples = data.videoSenc\n }\n if (data.isVideo) {\n samples.forEach(item => {\n sencLength = sencLength + 8\n if (item.subsamples && item.subsamples.length) {\n sencLength = sencLength + 2\n sencLength = sencLength + item.subsamples.length * 6\n }\n })\n }\n data.videoSencLength = sencLength\n length = mdatSize + 141 + data.samples.length * 16 + sencLength\n if (data.useEME && data.isAudioEncryption && !data.isVideoEncryption) {\n length = mdatSize + (data.samples.length * 16) + 84\n }\n } else {\n length = mdatSize + 116 + data.samples.length * 12\n if (data.useEME && data.isAudioEncryption) {\n length = mdatSize + 169 + data.samples.length * 12 + 8 * data.audioSenc.length\n }\n }\n\n const content = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, data.id & 0xff, // ref_id\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n (earliestTime >> 24) & 0xff,\n (earliestTime >> 16) & 0xff,\n (earliestTime >> 8) & 0xff,\n earliestTime & 0xff, // earliest_presentation_time\n 0x00, 0x00, 0x00, 0x00, // first_offset\n 0x00, 0x00, // reserved\n 0x00, 0x01, // ref_count\n // 0x00, 0x04, 0x11, 0xCF, // ref_size + ref_type\n // 0x00, 0x01, 0x0A, 0xA6, // ref_size + ref_type\n 0x00, // ref_size + ref_type ref_size = moof.size + mdat.size\n (length >> 16) & 0xff,\n (length >> 8) & 0xff,\n length & 0xff,\n (durationCount >> 24) & 0xff,\n (durationCount >> 16) & 0xff,\n (durationCount >> 8) & 0xff,\n durationCount & 0xff,\n 0x90, 0x00, 0x00, 0x00\n ])\n return MP4.box(MP4.types.sidx, content)\n }\n\n static mdat (data) {\n const mdat = MP4.box(MP4.types.mdat, data)\n // console.log('[remux],mdat ,len ', mdat.byteLength, hashVal(mdat.toString()))\n return mdat\n }\n}\n","\nexport class Logger {\n constructor (name, enable) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n Logger.disabled = enable\n }\n\n debug (...args) {\n if (Logger.disabled) return\n console.debug(this._prefix, ...args)\n }\n\n log (...args) {\n if (Logger.disabled) return\n console.log(this._prefix, ...args)\n }\n\n warn (...args) {\n if (Logger.disabled) return\n console.warn(this._prefix, ...args)\n }\n\n error (...args) {\n if (Logger.disabled) return\n console.error(this._prefix, ...args)\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n}\n","import {\n WordArray,\n Hasher,\n} from './core.js';\n\n// Constants table\nconst T = [];\n\n// Compute constants\nfor (let i = 0; i < 64; i += 1) {\n T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n}\n\nconst FF = (a, b, c, d, x, s, t) => {\n const n = a + ((b & c) | (~b & d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst GG = (a, b, c, d, x, s, t) => {\n const n = a + ((b & d) | (c & ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst HH = (a, b, c, d, x, s, t) => {\n const n = a + (b ^ c ^ d) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\nconst II = (a, b, c, d, x, s, t) => {\n const n = a + (c ^ (b | ~d)) + x + t;\n return ((n << s) | (n >>> (32 - s))) + b;\n};\n\n/**\n * MD5 hash algorithm.\n */\nexport class MD5Algo extends Hasher {\n _doReset() {\n this._hash = new WordArray([\n 0x67452301,\n 0xefcdab89,\n 0x98badcfe,\n 0x10325476,\n ]);\n }\n\n _doProcessBlock(M, offset) {\n const _M = M;\n\n // Swap endian\n for (let i = 0; i < 16; i += 1) {\n // Shortcuts\n const offset_i = offset + i;\n const M_offset_i = M[offset_i];\n\n _M[offset_i] = (\n (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)\n | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n );\n }\n\n // Shortcuts\n const H = this._hash.words;\n\n const M_offset_0 = _M[offset + 0];\n const M_offset_1 = _M[offset + 1];\n const M_offset_2 = _M[offset + 2];\n const M_offset_3 = _M[offset + 3];\n const M_offset_4 = _M[offset + 4];\n const M_offset_5 = _M[offset + 5];\n const M_offset_6 = _M[offset + 6];\n const M_offset_7 = _M[offset + 7];\n const M_offset_8 = _M[offset + 8];\n const M_offset_9 = _M[offset + 9];\n const M_offset_10 = _M[offset + 10];\n const M_offset_11 = _M[offset + 11];\n const M_offset_12 = _M[offset + 12];\n const M_offset_13 = _M[offset + 13];\n const M_offset_14 = _M[offset + 14];\n const M_offset_15 = _M[offset + 15];\n\n // Working varialbes\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n\n // Computation\n a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n a = II(a, b, c, d, M_offset_0, 6, T[48]);\n d = II(d, a, b, c, M_offset_7, 10, T[49]);\n c = II(c, d, a, b, M_offset_14, 15, T[50]);\n b = II(b, c, d, a, M_offset_5, 21, T[51]);\n a = II(a, b, c, d, M_offset_12, 6, T[52]);\n d = II(d, a, b, c, M_offset_3, 10, T[53]);\n c = II(c, d, a, b, M_offset_10, 15, T[54]);\n b = II(b, c, d, a, M_offset_1, 21, T[55]);\n a = II(a, b, c, d, M_offset_8, 6, T[56]);\n d = II(d, a, b, c, M_offset_15, 10, T[57]);\n c = II(c, d, a, b, M_offset_6, 15, T[58]);\n b = II(b, c, d, a, M_offset_13, 21, T[59]);\n a = II(a, b, c, d, M_offset_4, 6, T[60]);\n d = II(d, a, b, c, M_offset_11, 10, T[61]);\n c = II(c, d, a, b, M_offset_2, 15, T[62]);\n b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n // Intermediate hash value\n H[0] = (H[0] + a) | 0;\n H[1] = (H[1] + b) | 0;\n H[2] = (H[2] + c) | 0;\n H[3] = (H[3] + d) | 0;\n }\n /* eslint-ensable no-param-reassign */\n\n _doFinalize() {\n // Shortcuts\n const data = this._data;\n const dataWords = data.words;\n\n const nBitsTotal = this._nDataBytes * 8;\n const nBitsLeft = data.sigBytes * 8;\n\n // Add padding\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n const nBitsTotalL = nBitsTotal;\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n );\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)\n | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n );\n\n data.sigBytes = (dataWords.length + 1) * 4;\n\n // Hash final blocks\n this._process();\n\n // Shortcuts\n const hash = this._hash;\n const H = hash.words;\n\n // Swap endian\n for (let i = 0; i < 4; i += 1) {\n // Shortcut\n const H_i = H[i];\n\n H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)\n | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n }\n\n // Return final computed hash\n return hash;\n }\n\n clone() {\n const clone = super.clone.call(this);\n clone._hash = this._hash.clone();\n\n return clone;\n }\n}\n\n/**\n * Shortcut function to the hasher's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n *\n * @return {WordArray} The hash.\n *\n * @static\n *\n * @example\n *\n * var hash = CryptoJS.MD5('message');\n * var hash = CryptoJS.MD5(wordArray);\n */\nexport const MD5 = Hasher._createHelper(MD5Algo);\n\n/**\n * Shortcut function to the HMAC's object interface.\n *\n * @param {WordArray|string} message The message to hash.\n * @param {WordArray|string} key The secret key.\n *\n * @return {WordArray} The HMAC.\n *\n * @static\n *\n * @example\n *\n * var hmac = CryptoJS.HmacMD5(message, key);\n */\nexport const HmacMD5 = Hasher._createHmacHelper(MD5Algo);\n","import { MP4 } from './mp4'\nimport { concatUint8Array } from '../utils'\nimport { Logger } from './logger'\n\n/**\n * @typedef {Object} RemuxResult\n * @property {Uint8Array} [videoInitSegment]\n * @property {Uint8Array} [audioInitSegment]\n * @property {Uint8Array} [videoSegment]\n * @property {Uint8Array} [audioSegment]\n */\n\nexport class FMP4Remuxer {\n /**\n * @param {import('../model').VideoTrack} videoTrack\n * @param {import('../model').AudioTrack} audioTrack\n */\n constructor (videoTrack, audioTrack, options) {\n this.videoTrack = videoTrack\n this.audioTrack = audioTrack\n const browserVersions = /Chrome\\/([^.]+)/.exec(navigator.userAgent)\n this.forceFirstIDR = browserVersions && Number(browserVersions[1]) < 50\n this.log = new Logger('FMP4Remuxer', options && options.openLog ? !options.openLog : true)\n }\n\n /**\n * @param {boolean} [createInit=false]\n * @returns {RemuxResult}\n */\n remux (createInit = false, options = {}) {\n const videoTrack = this.videoTrack\n const audioTrack = this.audioTrack\n const hasVideo = videoTrack.exist()\n const hasAudio = audioTrack.exist()\n\n let videoInitSegment\n let audioInitSegment\n\n let initSegment\n const tracks = []\n\n if (createInit) {\n if (options && options.initMerge) {\n if (hasVideo) {\n tracks.push(this.videoTrack)\n }\n if (hasAudio) {\n tracks.push(this.audioTrack)\n }\n initSegment = MP4.initSegment(tracks)\n } else {\n if (hasVideo) videoInitSegment = MP4.initSegment([this.videoTrack])\n if (hasAudio) audioInitSegment = MP4.initSegment([this.audioTrack])\n }\n }\n\n let videoSegment\n let audioSegment\n if (hasVideo && videoTrack.hasSample()) {\n videoSegment = this._remuxVideo()\n }\n\n if (hasAudio && audioTrack.hasSample()) {\n audioSegment = this._remuxAudio()\n }\n\n videoTrack.samples = []\n audioTrack.samples = []\n\n return {\n initSegment,\n videoInitSegment,\n audioInitSegment,\n videoSegment,\n audioSegment\n }\n }\n\n _remuxVideo () {\n const track = this.videoTrack\n if (this.forceFirstIDR) {\n track.samples[0].flag = { dependsOn: 2, isNonSyncSample: 0 }\n }\n const samples = track.samples\n const isAV01 = /av01/.test(track.codec)\n\n let mdatSize = 0\n\n if (isAV01) {\n samples.forEach((s) => {\n mdatSize += s.data.byteLength\n })\n } else {\n samples.forEach((s) => {\n mdatSize += s.units.reduce((t, c) => (t + c.byteLength), 0)\n mdatSize += (s.units.length * 4)\n })\n }\n\n const mdata = new Uint8Array(mdatSize)\n\n // av1没有uints,直接写入data即可\n // todo: H.265/H.264为什么要拼接nals/uints而不直接用data?\n if (isAV01) {\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n mdata.set(sample.data, offset)\n sample.size = sample.data.byteLength\n offset += sample.size\n }\n } else {\n const mdatView = new DataView(mdata.buffer)\n for (let i = 0, l = samples.length, offset = 0, sample; i < l; i++) {\n sample = samples[i]\n\n let sampleSize = 0\n sample.units.forEach((u) => {\n mdatView.setUint32(offset, u.byteLength)\n offset += 4\n mdata.set(u, offset)\n offset += u.byteLength\n sampleSize += (4 + u.byteLength)\n })\n sample.size = sampleSize\n }\n }\n const mdat = MP4.mdat(mdata)\n\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n\n }\n\n _remuxAudio () {\n const track = this.audioTrack\n const mdata = new Uint8Array(track.samples.reduce((t, c) => (t + c.size), 0))\n track.samples.reduce((offset, s) => {\n mdata.set(s.data, offset)\n return offset + s.size\n }, 0)\n const mdat = MP4.mdat(mdata)\n const moof = MP4.moof([track])\n return concatUint8Array(moof, mdat)\n }\n\n reset () {\n this.videoTrack.reset()\n this.audioTrack.reset()\n }\n}\n","/* eslint-disable no-use-before-define */\n\n/**\n * Base class for inheritance.\n */\nexport class Base {\n /**\n * Extends this object and runs the init method.\n * Arguments to create() will be passed to init().\n *\n * @return {Object} The new object.\n *\n * @static\n *\n * @example\n *\n * var instance = MyType.create();\n */\n static create(...args) {\n return new this(...args);\n }\n\n /**\n * Copies properties into this object.\n *\n * @param {Object} properties The properties to mix in.\n *\n * @example\n *\n * MyType.mixIn({\n * field: 'value'\n * });\n */\n mixIn(properties) {\n return Object.assign(this, properties);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = instance.clone();\n */\n clone() {\n const clone = new this.constructor();\n Object.assign(clone, this);\n return clone;\n }\n}\n\n/**\n * An array of 32-bit words.\n *\n * @property {Array} words The array of 32-bit words.\n * @property {number} sigBytes The number of significant bytes in this word array.\n */\nexport class WordArray extends Base {\n /**\n * Initializes a newly created word array.\n *\n * @param {Array} words (Optional) An array of 32-bit words.\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.create();\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n */\n constructor(words = [], sigBytes = words.length * 4) {\n super();\n\n let typedArray = words;\n // Convert buffers to uint8\n if (typedArray instanceof ArrayBuffer) {\n typedArray = new Uint8Array(typedArray);\n }\n\n // Convert other array views to uint8\n if (\n typedArray instanceof Int8Array\n || typedArray instanceof Uint8ClampedArray\n || typedArray instanceof Int16Array\n || typedArray instanceof Uint16Array\n || typedArray instanceof Int32Array\n || typedArray instanceof Uint32Array\n || typedArray instanceof Float32Array\n || typedArray instanceof Float64Array\n ) {\n typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n }\n\n // Handle Uint8Array\n if (typedArray instanceof Uint8Array) {\n // Shortcut\n const typedArrayByteLength = typedArray.byteLength;\n\n // Extract bytes\n const _words = [];\n for (let i = 0; i < typedArrayByteLength; i += 1) {\n _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n }\n\n // Initialize this word array\n this.words = _words;\n this.sigBytes = typedArrayByteLength;\n } else {\n // Else call normal init\n this.words = words;\n this.sigBytes = sigBytes;\n }\n }\n\n /**\n * Creates a word array filled with random bytes.\n *\n * @param {number} nBytes The number of random bytes to generate.\n *\n * @return {WordArray} The random word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.lib.WordArray.random(16);\n */\n static random(nBytes) {\n const words = [];\n\n const r = (m_w) => {\n let _m_w = m_w;\n let _m_z = 0x3ade68b1;\n const mask = 0xffffffff;\n\n return () => {\n _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;\n _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;\n let result = ((_m_z << 0x10) + _m_w) & mask;\n result /= 0x100000000;\n result += 0.5;\n return result * (Math.random() > 0.5 ? 1 : -1);\n };\n };\n\n for (let i = 0, rcache; i < nBytes; i += 4) {\n const _r = r((rcache || Math.random()) * 0x100000000);\n\n rcache = _r() * 0x3ade67b7;\n words.push((_r() * 0x100000000) | 0);\n }\n\n return new WordArray(words, nBytes);\n }\n\n /**\n * Converts this word array to a string.\n *\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n *\n * @return {string} The stringified word array.\n *\n * @example\n *\n * var string = wordArray + '';\n * var string = wordArray.toString();\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\n */\n toString(encoder = Hex) {\n return encoder.stringify(this);\n }\n\n /**\n * Concatenates a word array to this word array.\n *\n * @param {WordArray} wordArray The word array to append.\n *\n * @return {WordArray} This word array.\n *\n * @example\n *\n * wordArray1.concat(wordArray2);\n */\n concat(wordArray) {\n // Shortcuts\n const thisWords = this.words;\n const thatWords = wordArray.words;\n const thisSigBytes = this.sigBytes;\n const thatSigBytes = wordArray.sigBytes;\n\n // Clamp excess bits\n this.clamp();\n\n // Concat\n if (thisSigBytes % 4) {\n // Copy one byte at a time\n for (let i = 0; i < thatSigBytes; i += 1) {\n const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n }\n } else {\n // Copy one word at a time\n for (let i = 0; i < thatSigBytes; i += 4) {\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n }\n }\n this.sigBytes += thatSigBytes;\n\n // Chainable\n return this;\n }\n\n /**\n * Removes insignificant bits.\n *\n * @example\n *\n * wordArray.clamp();\n */\n clamp() {\n // Shortcuts\n const { words, sigBytes } = this;\n\n // Clamp\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n words.length = Math.ceil(sigBytes / 4);\n }\n\n /**\n * Creates a copy of this word array.\n *\n * @return {WordArray} The clone.\n *\n * @example\n *\n * var clone = wordArray.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone.words = this.words.slice(0);\n\n return clone;\n }\n}\n\n/**\n * Hex encoding strategy.\n */\nexport const Hex = {\n /**\n * Converts a word array to a hex string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The hex string.\n *\n * @static\n *\n * @example\n *\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const hexChars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n hexChars.push((bite >>> 4).toString(16));\n hexChars.push((bite & 0x0f).toString(16));\n }\n\n return hexChars.join('');\n },\n\n /**\n * Converts a hex string to a word array.\n *\n * @param {string} hexStr The hex string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n */\n parse(hexStr) {\n // Shortcut\n const hexStrLength = hexStr.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < hexStrLength; i += 2) {\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n }\n\n return new WordArray(words, hexStrLength / 2);\n },\n};\n\n/**\n * Latin1 encoding strategy.\n */\nexport const Latin1 = {\n /**\n * Converts a word array to a Latin1 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Latin1 string.\n *\n * @static\n *\n * @example\n *\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n\n // Convert\n const latin1Chars = [];\n for (let i = 0; i < sigBytes; i += 1) {\n const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n latin1Chars.push(String.fromCharCode(bite));\n }\n\n return latin1Chars.join('');\n },\n\n /**\n * Converts a Latin1 string to a word array.\n *\n * @param {string} latin1Str The Latin1 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n */\n parse(latin1Str) {\n // Shortcut\n const latin1StrLength = latin1Str.length;\n\n // Convert\n const words = [];\n for (let i = 0; i < latin1StrLength; i += 1) {\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n }\n\n return new WordArray(words, latin1StrLength);\n },\n};\n\n/**\n * UTF-8 encoding strategy.\n */\nexport const Utf8 = {\n /**\n * Converts a word array to a UTF-8 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The UTF-8 string.\n *\n * @static\n *\n * @example\n *\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n */\n stringify(wordArray) {\n try {\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n } catch (e) {\n throw new Error('Malformed UTF-8 data');\n }\n },\n\n /**\n * Converts a UTF-8 string to a word array.\n *\n * @param {string} utf8Str The UTF-8 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n */\n parse(utf8Str) {\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n },\n};\n\n/**\n * Abstract buffered block algorithm template.\n *\n * The property blockSize must be implemented in a concrete subtype.\n *\n * @property {number} _minBufferSize\n *\n * The number of blocks that should be kept unprocessed in the buffer. Default: 0\n */\nexport class BufferedBlockAlgorithm extends Base {\n constructor() {\n super();\n this._minBufferSize = 0;\n }\n\n /**\n * Resets this block algorithm's data buffer to its initial state.\n *\n * @example\n *\n * bufferedBlockAlgorithm.reset();\n */\n reset() {\n // Initial values\n this._data = new WordArray();\n this._nDataBytes = 0;\n }\n\n /**\n * Adds new data to this block algorithm's buffer.\n *\n * @param {WordArray|string} data\n *\n * The data to append. Strings are converted to a WordArray using UTF-8.\n *\n * @example\n *\n * bufferedBlockAlgorithm._append('data');\n * bufferedBlockAlgorithm._append(wordArray);\n */\n _append(data) {\n let m_data = data;\n\n // Convert string to WordArray, else assume WordArray already\n if (typeof m_data === 'string') {\n m_data = Utf8.parse(m_data);\n }\n\n // Append\n this._data.concat(m_data);\n this._nDataBytes += m_data.sigBytes;\n }\n\n /**\n * Processes available data blocks.\n *\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n *\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n *\n * @return {WordArray} The processed data.\n *\n * @example\n *\n * var processedData = bufferedBlockAlgorithm._process();\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n */\n _process(doFlush) {\n let processedWords;\n\n // Shortcuts\n const { _data: data, blockSize } = this;\n const dataWords = data.words;\n const dataSigBytes = data.sigBytes;\n const blockSizeBytes = blockSize * 4;\n\n // Count blocks ready\n let nBlocksReady = dataSigBytes / blockSizeBytes;\n if (doFlush) {\n // Round up to include partial blocks\n nBlocksReady = Math.ceil(nBlocksReady);\n } else {\n // Round down to include only full blocks,\n // less the number of blocks that must remain in the buffer\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n }\n\n // Count words ready\n const nWordsReady = nBlocksReady * blockSize;\n\n // Count bytes ready\n const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n // Process blocks\n if (nWordsReady) {\n for (let offset = 0; offset < nWordsReady; offset += blockSize) {\n // Perform concrete-algorithm logic\n this._doProcessBlock(dataWords, offset);\n }\n\n // Remove processed words\n processedWords = dataWords.splice(0, nWordsReady);\n data.sigBytes -= nBytesReady;\n }\n\n // Return processed words\n return new WordArray(processedWords, nBytesReady);\n }\n\n /**\n * Creates a copy of this object.\n *\n * @return {Object} The clone.\n *\n * @example\n *\n * var clone = bufferedBlockAlgorithm.clone();\n */\n clone() {\n const clone = super.clone.call(this);\n clone._data = this._data.clone();\n\n return clone;\n }\n}\n\n/**\n * Abstract hasher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n */\nexport class Hasher extends BufferedBlockAlgorithm {\n constructor(cfg) {\n super();\n\n this.blockSize = 512 / 32;\n\n /**\n * Configuration options.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates a shortcut function to a hasher's object interface.\n *\n * @param {Hasher} SubHasher The hasher to create a helper for.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n */\n static _createHelper(SubHasher) {\n return (message, cfg) => new SubHasher(cfg).finalize(message);\n }\n\n /**\n * Creates a shortcut function to the HMAC's object interface.\n *\n * @param {Hasher} SubHasher The hasher to use in this HMAC helper.\n *\n * @return {Function} The shortcut function.\n *\n * @static\n *\n * @example\n *\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n */\n static _createHmacHelper(SubHasher) {\n return (message, key) => new HMAC(SubHasher, key).finalize(message);\n }\n\n /**\n * Resets this hasher to its initial state.\n *\n * @example\n *\n * hasher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-hasher logic\n this._doReset();\n }\n\n /**\n * Updates this hasher with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {Hasher} This hasher.\n *\n * @example\n *\n * hasher.update('message');\n * hasher.update(wordArray);\n */\n update(messageUpdate) {\n // Append\n this._append(messageUpdate);\n\n // Update the hash\n this._process();\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the hash computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The hash.\n *\n * @example\n *\n * var hash = hasher.finalize();\n * var hash = hasher.finalize('message');\n * var hash = hasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Final message update\n if (messageUpdate) {\n this._append(messageUpdate);\n }\n\n // Perform concrete-hasher logic\n const hash = this._doFinalize();\n\n return hash;\n }\n}\n\n/**\n * HMAC algorithm.\n */\nexport class HMAC extends Base {\n /**\n * Initializes a newly created HMAC.\n *\n * @param {Hasher} SubHasher The hash algorithm to use.\n * @param {WordArray|string} key The secret key.\n *\n * @example\n *\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n */\n constructor(SubHasher, key) {\n super();\n\n const hasher = new SubHasher();\n this._hasher = hasher;\n\n // Convert string to WordArray, else assume WordArray already\n let _key = key;\n if (typeof _key === 'string') {\n _key = Utf8.parse(_key);\n }\n\n // Shortcuts\n const hasherBlockSize = hasher.blockSize;\n const hasherBlockSizeBytes = hasherBlockSize * 4;\n\n // Allow arbitrary length keys\n if (_key.sigBytes > hasherBlockSizeBytes) {\n _key = hasher.finalize(key);\n }\n\n // Clamp excess bits\n _key.clamp();\n\n // Clone key for inner and outer pads\n const oKey = _key.clone();\n this._oKey = oKey;\n const iKey = _key.clone();\n this._iKey = iKey;\n\n // Shortcuts\n const oKeyWords = oKey.words;\n const iKeyWords = iKey.words;\n\n // XOR keys with pad constants\n for (let i = 0; i < hasherBlockSize; i += 1) {\n oKeyWords[i] ^= 0x5c5c5c5c;\n iKeyWords[i] ^= 0x36363636;\n }\n oKey.sigBytes = hasherBlockSizeBytes;\n iKey.sigBytes = hasherBlockSizeBytes;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Resets this HMAC to its initial state.\n *\n * @example\n *\n * hmacHasher.reset();\n */\n reset() {\n // Shortcut\n const hasher = this._hasher;\n\n // Reset\n hasher.reset();\n hasher.update(this._iKey);\n }\n\n /**\n * Updates this HMAC with a message.\n *\n * @param {WordArray|string} messageUpdate The message to append.\n *\n * @return {HMAC} This HMAC instance.\n *\n * @example\n *\n * hmacHasher.update('message');\n * hmacHasher.update(wordArray);\n */\n update(messageUpdate) {\n this._hasher.update(messageUpdate);\n\n // Chainable\n return this;\n }\n\n /**\n * Finalizes the HMAC computation.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\n *\n * @return {WordArray} The HMAC.\n *\n * @example\n *\n * var hmac = hmacHasher.finalize();\n * var hmac = hmacHasher.finalize('message');\n * var hmac = hmacHasher.finalize(wordArray);\n */\n finalize(messageUpdate) {\n // Shortcut\n const hasher = this._hasher;\n\n // Compute HMAC\n const innerHash = hasher.finalize(messageUpdate);\n hasher.reset();\n const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n return hmac;\n }\n}\n","import {\n WordArray,\n} from './core.js';\n\nconst parseLoop = (base64Str, base64StrLength, reverseMap) => {\n const words = [];\n let nBytes = 0;\n for (let i = 0; i < base64StrLength; i += 1) {\n if (i % 4) {\n const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n const bitsCombined = bits1 | bits2;\n words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n nBytes += 1;\n }\n }\n return WordArray.create(words, nBytes);\n};\n\n/**\n * Base64 encoding strategy.\n */\nexport const Base64 = {\n /**\n * Converts a word array to a Base64 string.\n *\n * @param {WordArray} wordArray The word array.\n *\n * @return {string} The Base64 string.\n *\n * @static\n *\n * @example\n *\n * const base64String = CryptoJS.enc.Base64.stringify(wordArray);\n */\n stringify(wordArray) {\n // Shortcuts\n const { words, sigBytes } = wordArray;\n const map = this._map;\n\n // Clamp excess bits\n wordArray.clamp();\n\n // Convert\n const base64Chars = [];\n for (let i = 0; i < sigBytes; i += 3) {\n const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n const triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {\n base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n }\n }\n\n // Add padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n while (base64Chars.length % 4) {\n base64Chars.push(paddingChar);\n }\n }\n\n return base64Chars.join('');\n },\n\n /**\n * Converts a Base64 string to a word array.\n *\n * @param {string} base64Str The Base64 string.\n *\n * @return {WordArray} The word array.\n *\n * @static\n *\n * @example\n *\n * const wordArray = CryptoJS.enc.Base64.parse(base64String);\n */\n parse(base64Str) {\n // Shortcuts\n let base64StrLength = base64Str.length;\n const map = this._map;\n let reverseMap = this._reverseMap;\n\n if (!reverseMap) {\n this._reverseMap = [];\n reverseMap = this._reverseMap;\n for (let j = 0; j < map.length; j += 1) {\n reverseMap[map.charCodeAt(j)] = j;\n }\n }\n\n // Ignore padding\n const paddingChar = map.charAt(64);\n if (paddingChar) {\n const paddingIndex = base64Str.indexOf(paddingChar);\n if (paddingIndex !== -1) {\n base64StrLength = paddingIndex;\n }\n }\n\n // Convert\n return parseLoop(base64Str, base64StrLength, reverseMap);\n },\n\n _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n};\n","import {\n Base,\n WordArray,\n} from './core.js';\nimport { MD5Algo } from './md5.js';\n\n/**\n * This key derivation function is meant to conform with EVP_BytesToKey.\n * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n */\nexport class EvpKDFAlgo extends Base {\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.EvpKDF.create();\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n * @property {number} iterations The number of iterations to perform. Default: 1\n */\n this.cfg = Object.assign(\n new Base(),\n {\n keySize: 128 / 32,\n hasher: MD5Algo,\n iterations: 1,\n },\n cfg,\n );\n }\n\n /**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password, salt) {\n let block;\n\n // Shortcut\n const { cfg } = this;\n\n // Init hasher\n const hasher = cfg.hasher.create();\n\n // Initial values\n const derivedKey = WordArray.create();\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize) {\n if (block) {\n hasher.update(block);\n }\n block = hasher.update(password).finalize(salt);\n hasher.reset();\n\n // Iterations\n for (let i = 1; i < iterations; i += 1) {\n block = hasher.finalize(block);\n hasher.reset();\n }\n\n derivedKey.concat(block);\n }\n derivedKey.sigBytes = keySize * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Derives a key from a password.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.EvpKDF(password, salt);\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);\n","/* eslint-disable no-use-before-define */\n\nimport {\n Base,\n WordArray,\n BufferedBlockAlgorithm,\n} from './core.js';\nimport { Base64 } from './enc-base64.js';\nimport { EvpKDFAlgo } from './evpkdf.js';\n\n/**\n * Abstract base cipher template.\n *\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n */\nexport class Cipher extends BufferedBlockAlgorithm {\n /**\n * Initializes a newly created cipher.\n *\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.create(\n * CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }\n * );\n */\n constructor(xformMode, key, cfg) {\n super();\n\n /**\n * Configuration options.\n *\n * @property {WordArray} iv The IV to use for this operation.\n */\n this.cfg = Object.assign(new Base(), cfg);\n\n // Store transform mode and key\n this._xformMode = xformMode;\n this._key = key;\n\n // Set initial values\n this.reset();\n }\n\n /**\n * Creates this cipher in encryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n */\n static createEncryptor(key, cfg) {\n return this.create(this._ENC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates this cipher in decryption mode.\n *\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {Cipher} A cipher instance.\n *\n * @static\n *\n * @example\n *\n * const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n */\n static createDecryptor(key, cfg) {\n return this.create(this._DEC_XFORM_MODE, key, cfg);\n }\n\n /**\n * Creates shortcut functions to a cipher's object interface.\n *\n * @param {Cipher} cipher The cipher to create a helper for.\n *\n * @return {Object} An object with encrypt and decrypt shortcut functions.\n *\n * @static\n *\n * @example\n *\n * const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n */\n static _createHelper(SubCipher) {\n const selectCipherStrategy = (key) => {\n if (typeof key === 'string') {\n return PasswordBasedCipher;\n }\n return SerializableCipher;\n };\n\n return {\n encrypt(message, key, cfg) {\n return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);\n },\n\n decrypt(ciphertext, key, cfg) {\n return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);\n },\n };\n }\n\n /**\n * Resets this cipher to its initial state.\n *\n * @example\n *\n * cipher.reset();\n */\n reset() {\n // Reset data buffer\n super.reset.call(this);\n\n // Perform concrete-cipher logic\n this._doReset();\n }\n\n /**\n * Adds data to be encrypted or decrypted.\n *\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n *\n * @return {WordArray} The data after processing.\n *\n * @example\n *\n * const encrypted = cipher.process('data');\n * const encrypted = cipher.process(wordArray);\n */\n process(dataUpdate) {\n // Append\n this._append(dataUpdate);\n\n // Process available blocks\n return this._process();\n }\n\n /**\n * Finalizes the encryption or decryption process.\n * Note that the finalize operation is effectively a destructive, read-once operation.\n *\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n *\n * @return {WordArray} The data after final processing.\n *\n * @example\n *\n * const encrypted = cipher.finalize();\n * const encrypted = cipher.finalize('data');\n * const encrypted = cipher.finalize(wordArray);\n */\n finalize(dataUpdate) {\n // Final data update\n if (dataUpdate) {\n this._append(dataUpdate);\n }\n\n // Perform concrete-cipher logic\n const finalProcessedData = this._doFinalize();\n\n return finalProcessedData;\n }\n}\nCipher._ENC_XFORM_MODE = 1;\nCipher._DEC_XFORM_MODE = 2;\nCipher.keySize = 128 / 32;\nCipher.ivSize = 128 / 32;\n\n/**\n * Abstract base stream cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n */\nexport class StreamCipher extends Cipher {\n constructor(...args) {\n super(...args);\n\n this.blockSize = 1;\n }\n\n _doFinalize() {\n // Process partial blocks\n const finalProcessedBlocks = this._process(!!'flush');\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * Abstract base block cipher mode template.\n */\nexport class BlockCipherMode extends Base {\n /**\n * Initializes a newly created mode.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n */\n constructor(cipher, iv) {\n super();\n\n this._cipher = cipher;\n this._iv = iv;\n }\n\n /**\n * Creates this mode for encryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n */\n static createEncryptor(cipher, iv) {\n return this.Encryptor.create(cipher, iv);\n }\n\n /**\n * Creates this mode for decryption.\n *\n * @param {Cipher} cipher A block cipher instance.\n * @param {Array} iv The IV words.\n *\n * @static\n *\n * @example\n *\n * const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n */\n static createDecryptor(cipher, iv) {\n return this.Decryptor.create(cipher, iv);\n }\n}\n\nfunction xorBlock(words, offset, blockSize) {\n const _words = words;\n let block;\n\n // Shortcut\n const iv = this._iv;\n\n // Choose mixing block\n if (iv) {\n block = iv;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n } else {\n block = this._prevBlock;\n }\n\n // XOR blocks\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= block[i];\n }\n}\n\n/**\n * Cipher Block Chaining mode.\n */\n\n/**\n * Abstract base CBC mode.\n */\nexport class CBC extends BlockCipherMode {\n}\n/**\n * CBC encryptor.\n */\nCBC.Encryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // XOR and encrypt\n xorBlock.call(this, words, offset, blockSize);\n cipher.encryptBlock(words, offset);\n\n // Remember this block to use with next block\n this._prevBlock = words.slice(offset, offset + blockSize);\n }\n};\n/**\n * CBC decryptor.\n */\nCBC.Decryptor = class extends CBC {\n /**\n * Processes the data block at offset.\n *\n * @param {Array} words The data words to operate on.\n * @param {number} offset The offset where the block starts.\n *\n * @example\n *\n * mode.processBlock(data.words, offset);\n */\n processBlock(words, offset) {\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n\n // Remember this block to use with next block\n const thisBlock = words.slice(offset, offset + blockSize);\n\n // Decrypt and XOR\n cipher.decryptBlock(words, offset);\n xorBlock.call(this, words, offset, blockSize);\n\n // This block becomes the previous block\n this._prevBlock = thisBlock;\n }\n};\n\n/**\n * PKCS #5/7 padding strategy.\n */\nexport const Pkcs7 = {\n /**\n * Pads data using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to pad.\n * @param {number} blockSize The multiple that the data should be padded to.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n */\n pad(data, blockSize) {\n // Shortcut\n const blockSizeBytes = blockSize * 4;\n\n // Count padding bytes\n const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n // Create padding word\n const paddingWord = (nPaddingBytes << 24)\n | (nPaddingBytes << 16)\n | (nPaddingBytes << 8)\n | nPaddingBytes;\n\n // Create padding\n const paddingWords = [];\n for (let i = 0; i < nPaddingBytes; i += 4) {\n paddingWords.push(paddingWord);\n }\n const padding = WordArray.create(paddingWords, nPaddingBytes);\n\n // Add padding\n data.concat(padding);\n },\n\n /**\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n *\n * @param {WordArray} data The data to unpad.\n *\n * @static\n *\n * @example\n *\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\n */\n unpad(data) {\n const _data = data;\n\n // Get number of padding bytes from last byte\n const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;\n\n // Remove padding\n _data.sigBytes -= nPaddingBytes;\n },\n};\n\n/**\n * Abstract base block cipher template.\n *\n * @property {number} blockSize\n *\n * The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n */\nexport class BlockCipher extends Cipher {\n constructor(xformMode, key, cfg) {\n /**\n * Configuration options.\n *\n * @property {Mode} mode The block mode to use. Default: CBC\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n */\n super(xformMode, key, Object.assign(\n {\n mode: CBC,\n padding: Pkcs7,\n },\n cfg,\n ));\n\n this.blockSize = 128 / 32;\n }\n\n reset() {\n let modeCreator;\n\n // Reset cipher\n super.reset.call(this);\n\n // Shortcuts\n const { cfg } = this;\n const { iv, mode } = cfg;\n\n // Reset block mode\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n modeCreator = mode.createEncryptor;\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n modeCreator = mode.createDecryptor;\n // Keep at least one block in the buffer for unpadding\n this._minBufferSize = 1;\n }\n\n this._mode = modeCreator.call(mode, this, iv && iv.words);\n this._mode.__creator = modeCreator;\n }\n\n _doProcessBlock(words, offset) {\n this._mode.processBlock(words, offset);\n }\n\n _doFinalize() {\n let finalProcessedBlocks;\n\n // Shortcut\n const { padding } = this.cfg;\n\n // Finalize\n if (this._xformMode === this.constructor._ENC_XFORM_MODE) {\n // Pad data\n padding.pad(this._data, this.blockSize);\n\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n // Process final blocks\n finalProcessedBlocks = this._process(!!'flush');\n\n // Unpad data\n padding.unpad(finalProcessedBlocks);\n }\n\n return finalProcessedBlocks;\n }\n}\n\n/**\n * A collection of cipher parameters.\n *\n * @property {WordArray} ciphertext The raw ciphertext.\n * @property {WordArray} key The key to this ciphertext.\n * @property {WordArray} iv The IV used in the ciphering operation.\n * @property {WordArray} salt The salt used with a key derivation function.\n * @property {Cipher} algorithm The cipher algorithm.\n * @property {Mode} mode The block mode used in the ciphering operation.\n * @property {Padding} padding The padding scheme used in the ciphering operation.\n * @property {number} blockSize The block size of the cipher.\n * @property {Format} formatter\n * The default formatting strategy to convert this cipher params object to a string.\n */\nexport class CipherParams extends Base {\n /**\n * Initializes a newly created cipher params object.\n *\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\n *\n * @example\n *\n * var cipherParams = CryptoJS.lib.CipherParams.create({\n * ciphertext: ciphertextWordArray,\n * key: keyWordArray,\n * iv: ivWordArray,\n * salt: saltWordArray,\n * algorithm: CryptoJS.algo.AES,\n * mode: CryptoJS.mode.CBC,\n * padding: CryptoJS.pad.PKCS7,\n * blockSize: 4,\n * formatter: CryptoJS.format.OpenSSL\n * });\n */\n constructor(cipherParams) {\n super();\n\n this.mixIn(cipherParams);\n }\n\n /**\n * Converts this cipher params object to a string.\n *\n * @param {Format} formatter (Optional) The formatting strategy to use.\n *\n * @return {string} The stringified cipher params.\n *\n * @throws Error If neither the formatter nor the default formatter is set.\n *\n * @example\n *\n * var string = cipherParams + '';\n * var string = cipherParams.toString();\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n */\n toString(formatter) {\n return (formatter || this.formatter).stringify(this);\n }\n}\n\n/**\n * OpenSSL formatting strategy.\n */\nexport const OpenSSLFormatter = {\n /**\n * Converts a cipher params object to an OpenSSL-compatible string.\n *\n * @param {CipherParams} cipherParams The cipher params object.\n *\n * @return {string} The OpenSSL-compatible string.\n *\n * @static\n *\n * @example\n *\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n */\n stringify(cipherParams) {\n let wordArray;\n\n // Shortcuts\n const { ciphertext, salt } = cipherParams;\n\n // Format\n if (salt) {\n wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n } else {\n wordArray = ciphertext;\n }\n\n return wordArray.toString(Base64);\n },\n\n /**\n * Converts an OpenSSL-compatible string to a cipher params object.\n *\n * @param {string} openSSLStr The OpenSSL-compatible string.\n *\n * @return {CipherParams} The cipher params object.\n *\n * @static\n *\n * @example\n *\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n */\n parse(openSSLStr) {\n let salt;\n\n // Parse base64\n const ciphertext = Base64.parse(openSSLStr);\n\n // Shortcut\n const ciphertextWords = ciphertext.words;\n\n // Test for salt\n if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {\n // Extract salt\n salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n // Remove salt from ciphertext\n ciphertextWords.splice(0, 4);\n ciphertext.sigBytes -= 16;\n }\n\n return CipherParams.create({ ciphertext, salt });\n },\n};\n\n/**\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n */\nexport class SerializableCipher extends Base {\n /**\n * Encrypts a message.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key);\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, key, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Encrypt\n const encryptor = cipher.createEncryptor(key, _cfg);\n const ciphertext = encryptor.finalize(message);\n\n // Shortcut\n const cipherCfg = encryptor.cfg;\n\n // Create and return serializable cipher params\n return CipherParams.create({\n ciphertext,\n key,\n iv: cipherCfg.iv,\n algorithm: cipher,\n mode: cipherCfg.mode,\n padding: cipherCfg.padding,\n blockSize: encryptor.blockSize,\n formatter: _cfg.format,\n });\n }\n\n /**\n * Decrypts serialized ciphertext.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {WordArray} key The key.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.SerializableCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, key,\n * { iv: iv, format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, key, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Decrypt\n const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);\n\n return plaintext;\n }\n\n /**\n * Converts serialized ciphertext to CipherParams,\n * else assumed CipherParams already and returns ciphertext unchanged.\n *\n * @param {CipherParams|string} ciphertext The ciphertext.\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n *\n * @return {CipherParams} The unserialized ciphertext.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.SerializableCipher\n * ._parse(ciphertextStringOrParams, format);\n */\n static _parse(ciphertext, format) {\n if (typeof ciphertext === 'string') {\n return format.parse(ciphertext, this);\n }\n return ciphertext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {Formatter} format\n *\n * The formatting strategy to convert cipher param objects to and from a string.\n * Default: OpenSSL\n */\nSerializableCipher.cfg = Object.assign(\n new Base(),\n { format: OpenSSLFormatter },\n);\n\n/**\n * OpenSSL key derivation function.\n */\nexport const OpenSSLKdf = {\n /**\n * Derives a key and IV from a password.\n *\n * @param {string} password The password to derive from.\n * @param {number} keySize The size in words of the key to generate.\n * @param {number} ivSize The size in words of the IV to generate.\n * @param {WordArray|string} salt\n * (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n *\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\n *\n * @static\n *\n * @example\n *\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n */\n execute(password, keySize, ivSize, salt) {\n let _salt = salt;\n\n // Generate random salt\n if (!_salt) {\n _salt = WordArray.random(64 / 8);\n }\n\n // Derive key and IV\n const key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);\n\n // Separate key and IV\n const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n key.sigBytes = keySize * 4;\n\n // Return params\n return CipherParams.create({ key, iv, salt: _salt });\n },\n};\n\n/**\n * A serializable cipher wrapper that derives the key from a password,\n * and returns ciphertext as a serializable cipher params object.\n */\nexport class PasswordBasedCipher extends SerializableCipher {\n /**\n * Encrypts a message using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {WordArray|string} message The message to encrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {CipherParams} A cipher params object.\n *\n * @static\n *\n * @example\n *\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password');\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher\n * .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n */\n static encrypt(cipher, message, password, cfg) {\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Encrypt\n const ciphertext = SerializableCipher.encrypt\n .call(this, cipher, message, derivedParams.key, _cfg);\n\n // Mix in derived params\n ciphertext.mixIn(derivedParams);\n\n return ciphertext;\n }\n\n /**\n * Decrypts serialized ciphertext using a password.\n *\n * @param {Cipher} cipher The cipher algorithm to use.\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n * @param {string} password The password.\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\n *\n * @return {WordArray} The plaintext.\n *\n * @static\n *\n * @example\n *\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',\n * { format: CryptoJS.format.OpenSSL });\n * var plaintext = CryptoJS.lib.PasswordBasedCipher\n * .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',\n * { format: CryptoJS.format.OpenSSL });\n */\n static decrypt(cipher, ciphertext, password, cfg) {\n let _ciphertext = ciphertext;\n\n // Apply config defaults\n const _cfg = Object.assign(new Base(), this.cfg, cfg);\n\n // Convert string to CipherParams\n _ciphertext = this._parse(_ciphertext, _cfg.format);\n\n // Derive key and other params\n const derivedParams = _cfg.kdf\n .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt);\n\n // Add IV to config\n _cfg.iv = derivedParams.iv;\n\n // Decrypt\n const plaintext = SerializableCipher.decrypt\n .call(this, cipher, _ciphertext, derivedParams.key, _cfg);\n\n return plaintext;\n }\n}\n/**\n * Configuration options.\n *\n * @property {KDF} kdf\n * The key derivation function to use to generate a key and IV from a password.\n * Default: OpenSSL\n */\nPasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });\n","import {\n BlockCipher,\n} from './cipher-core.js';\n\n// Lookup tables\nconst _SBOX = [];\nconst INV_SBOX = [];\nconst _SUB_MIX_0 = [];\nconst _SUB_MIX_1 = [];\nconst _SUB_MIX_2 = [];\nconst _SUB_MIX_3 = [];\nconst INV_SUB_MIX_0 = [];\nconst INV_SUB_MIX_1 = [];\nconst INV_SUB_MIX_2 = [];\nconst INV_SUB_MIX_3 = [];\n\n// Compute lookup tables\n\n// Compute double table\nconst d = [];\nfor (let i = 0; i < 256; i += 1) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n}\n\n// Walk GF(2^8)\nlet x = 0;\nlet xi = 0;\nfor (let i = 0; i < 256; i += 1) {\n // Compute sbox\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n _SBOX[x] = sx;\n INV_SBOX[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n _SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n _SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n _SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n _SUB_MIX_3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n INV_SUB_MIX_3[sx] = t;\n\n // Compute next counter\n if (!x) {\n xi = 1;\n x = xi;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n}\n\n// Precomputed Rcon lookup\nconst RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n/**\n * AES block cipher algorithm.\n */\nexport class AESAlgo extends BlockCipher {\n _doReset() {\n let t;\n\n // Skip reset of nRounds has been set before and key did not change\n if (this._nRounds && this._keyPriorReset === this._key) {\n return;\n }\n\n // Shortcuts\n this._keyPriorReset = this._key;\n const key = this._keyPriorReset;\n const keyWords = key.words;\n const keySize = key.sigBytes / 4;\n\n // Compute number of rounds\n this._nRounds = keySize + 6;\n const nRounds = this._nRounds;\n\n // Compute number of key schedule rows\n const ksRows = (nRounds + 1) * 4;\n\n // Compute key schedule\n this._keySchedule = [];\n const keySchedule = this._keySchedule;\n for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {\n if (ksRow < keySize) {\n keySchedule[ksRow] = keyWords[ksRow];\n } else {\n t = keySchedule[ksRow - 1];\n\n if (!(ksRow % keySize)) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n\n // Mix Rcon\n t ^= RCON[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t = (_SBOX[t >>> 24] << 24)\n | (_SBOX[(t >>> 16) & 0xff] << 16)\n | (_SBOX[(t >>> 8) & 0xff] << 8)\n | _SBOX[t & 0xff];\n }\n\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n }\n }\n\n // Compute inv key schedule\n this._invKeySchedule = [];\n const invKeySchedule = this._invKeySchedule;\n for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {\n const ksRow = ksRows - invKsRow;\n\n if (invKsRow % 4) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]\n ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]\n ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]\n ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];\n }\n }\n }\n\n encryptBlock(M, offset) {\n this._doCryptBlock(\n M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,\n );\n }\n\n decryptBlock(M, offset) {\n const _M = M;\n\n // Swap 2nd and 4th rows\n let t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n\n this._doCryptBlock(\n _M,\n offset,\n this._invKeySchedule,\n INV_SUB_MIX_0,\n INV_SUB_MIX_1,\n INV_SUB_MIX_2,\n INV_SUB_MIX_3,\n INV_SBOX,\n );\n\n // Inv swap 2nd and 4th rows\n t = _M[offset + 1];\n _M[offset + 1] = _M[offset + 3];\n _M[offset + 3] = t;\n }\n\n _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n const _M = M;\n\n // Shortcut\n const nRounds = this._nRounds;\n\n // Get input, add round key\n let s0 = _M[offset] ^ keySchedule[0];\n let s1 = _M[offset + 1] ^ keySchedule[1];\n let s2 = _M[offset + 2] ^ keySchedule[2];\n let s3 = _M[offset + 3] ^ keySchedule[3];\n\n // Key schedule row counter\n let ksRow = 4;\n\n // Rounds\n for (let round = 1; round < nRounds; round += 1) {\n // Shift rows, sub bytes, mix columns, add round key\n const t0 = SUB_MIX_0[s0 >>> 24]\n ^ SUB_MIX_1[(s1 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s2 >>> 8) & 0xff]\n ^ SUB_MIX_3[s3 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = SUB_MIX_0[s1 >>> 24]\n ^ SUB_MIX_1[(s2 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s3 >>> 8) & 0xff]\n ^ SUB_MIX_3[s0 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = SUB_MIX_0[s2 >>> 24]\n ^ SUB_MIX_1[(s3 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s0 >>> 8) & 0xff]\n ^ SUB_MIX_3[s1 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = SUB_MIX_0[s3 >>> 24]\n ^ SUB_MIX_1[(s0 >>> 16) & 0xff]\n ^ SUB_MIX_2[(s1 >>> 8) & 0xff]\n ^ SUB_MIX_3[s2 & 0xff]\n ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n }\n\n // Shift rows, sub bytes, add round key\n const t0 = (\n (SBOX[s0 >>> 24] << 24)\n | (SBOX[(s1 >>> 16) & 0xff] << 16)\n | (SBOX[(s2 >>> 8) & 0xff] << 8)\n | SBOX[s3 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t1 = (\n (SBOX[s1 >>> 24] << 24)\n | (SBOX[(s2 >>> 16) & 0xff] << 16)\n | (SBOX[(s3 >>> 8) & 0xff] << 8)\n | SBOX[s0 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t2 = (\n (SBOX[s2 >>> 24] << 24)\n | (SBOX[(s3 >>> 16) & 0xff] << 16)\n | (SBOX[(s0 >>> 8) & 0xff] << 8)\n | SBOX[s1 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n const t3 = (\n (SBOX[s3 >>> 24] << 24)\n | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]\n ) ^ keySchedule[ksRow];\n ksRow += 1;\n\n // Set output\n _M[offset] = t0;\n _M[offset + 1] = t1;\n _M[offset + 2] = t2;\n _M[offset + 3] = t3;\n }\n}\nAESAlgo.keySize = 256 / 32;\n\n/**\n * Shortcut functions to the cipher's object interface.\n *\n * @example\n *\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n */\nexport const AES = BlockCipher._createHelper(AESAlgo);\n","/**\n * Counter block mode.\n */\nimport {\n BlockCipherMode,\n} from './cipher-core.js';\n\nexport class CTR extends BlockCipherMode {\n}\nCTR.Encryptor = class extends CTR {\n processBlock(words, offset) {\n const _words = words;\n\n // Shortcuts\n const cipher = this._cipher;\n const { blockSize } = cipher;\n const iv = this._iv;\n let counter = this._counter;\n\n // Generate keystream\n if (iv) {\n this._counter = iv.slice(0);\n counter = this._counter;\n\n // Remove IV for subsequent blocks\n this._iv = undefined;\n }\n const keystream = counter.slice(0);\n cipher.encryptBlock(keystream, 0);\n\n // Increment counter\n counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n // Encrypt\n for (let i = 0; i < blockSize; i += 1) {\n _words[offset + i] ^= keystream[i];\n }\n }\n};\nCTR.Decryptor = CTR.Encryptor;\n","/**\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 class Buffer {\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static start (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n // Edge bug: https://bit.ly/2JYLPeB\n if (buf.length === 1 && buf.start(0) < 0) return 0\n\n return buf.start(0)\n }\n\n /**\n * @param {TimeRanges} buf\n * @returns {number}\n */\n static end (buf) {\n if (!buf || !buf.length) return 0\n\n // Safari bug: https://bit.ly/2trx6O8\n if (buf.length === 1 && buf.end(0) - buf.start(0) < 1e-6) return 0\n\n return buf.end(buf.length - 1)\n }\n\n /**\n * @param {{buffered?: TimeRanges}} b\n * @returns {TimeRanges | void}\n */\n static get (b) {\n if (!b) return\n try {\n return b.buffered\n } catch (error) {\n // ignore\n }\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {[number,number][]}\n */\n static buffers (buf, maxHole) {\n if (!buf || !buf.length) return []\n\n const buffers = []\n for (let i = 0, l = buf.length; i < l; i++) {\n const bufLen = buffers.length\n if (!bufLen || !maxHole) {\n buffers.push([buf.start(i), buf.end(i)])\n } else {\n const last = buffers[bufLen - 1]\n const lastEnd = last[1]\n const start = buf.start(i)\n if (start - lastEnd <= maxHole) {\n const end = buf.end(i)\n if (end > lastEnd) {\n last[1] = end\n }\n } else {\n buffers.push([buf.start(i), buf.end(i)])\n }\n }\n }\n return buffers\n }\n\n /**\n * @param {TimeRanges} buf\n * @param {number} [maxHole]\n * @returns {{buffers:[number,number][],length:number}}\n */\n static totalLength (buffers) {\n if (!buffers || !buffers.length) return 0\n return buffers.reduce((a, c) => (a += (c[1] - c[0])), 0)\n }\n\n /**\n *\n * @param {TimeRanges} buf\n * @param {number} [pos=0]\n * @param {number} [maxHole=0]\n * @returns {{start:number,end:number,buffers:[number,number][],remaining:number,index?:number,nextStart?:number,nextEnd?:number,prevStart?:number,prevEnd?:number}}\n */\n static info (buf, pos = 0, maxHole = 0) {\n if (!buf || !buf.length) return { start: 0, end: 0, buffers: [] }\n\n let start = 0\n let end = 0\n let index = 0\n let nextStart = 0\n let nextEnd = 0\n let prevStart = 0\n let prevEnd = 0\n const buffers = Buffer.buffers(buf, maxHole)\n\n for (let i = 0, l = buffers.length; i < l; i++) {\n const item = buffers[i]\n if (pos + maxHole >= item[0] && pos <= item[1]) {\n start = item[0]\n end = item[1]\n index = i\n } else if (pos + maxHole < item[0]) {\n nextStart = item[0]\n nextEnd = item[1]\n break\n } else if (pos + maxHole > item[1]) {\n prevStart = item[0]\n prevEnd = item[1]\n }\n }\n\n return {\n start,\n end,\n index,\n buffers,\n nextStart,\n nextEnd,\n prevStart,\n prevEnd,\n currentTime: pos,\n behind: pos - start,\n remaining: end ? end - pos : 0,\n length: Buffer.totalLength && Buffer.totalLength(buffers)\n }\n }\n\n /**\n *\n * @param {HTMLMediaElement} media\n * @param {number} pos\n * @returns {Boolean}\n */\n static isBuffered (media, pos) {\n if (media) {\n const buffered = Buffer.get(media)\n\n if (buffered?.length) {\n for (let i = 0; i < buffered.length; i++) {\n if (pos >= buffered.start(i) && pos <= buffered.end(i)) {\n return true\n }\n }\n }\n }\n return false\n }\n}\n","export const isBrowser = typeof window !== 'undefined'\n","export const ERR = {\n MANIFEST: 'manifest',\n NETWORK: 'network',\n NETWORK_TIMEOUT: 'network_timeout',\n NETWORK_FORBIDDEN: 'network_forbidden',\n NETWORK_NOTFOUND: 'network_notfound',\n NETWROK_RANGE_NOT_SATISFIABLE: 'network_range_not_satisfiable',\n DEMUX: 'demux',\n REMUX: 'remux',\n MEDIA: 'media',\n DRM: 'drm',\n OTHER: 'other',\n RUNTIME: 'runtime',\n\n SUB_TYPES: {\n FLV: 'FLV',\n HLS: 'HLS',\n MP4: 'MP4',\n FMP4: 'FMP4',\n MSE_ADD_SB: 'MSE_ADD_SB',\n MSE_APPEND_BUFFER: 'MSE_APPEND_BUFFER',\n MSE_OTHER: 'MSE_OTHER',\n MSE_FULL: 'MSE_FULL',\n MSE_CHANGE_TYPE: 'MSE_CHANGE_TYPE',\n OPTION: 'OPTION',\n DASH: 'DASH',\n LICENSE: 'LICENSE',\n CUSTOM_LICENSE: 'CUSTOM_LICENSE',\n MSE_HIJACK: 'MSE_HIJACK',\n EME_HIJACK: 'EME_HIJACK',\n SIDX: 'SIDX',\n NO_CANPLAY_ERROR: 'NO_CANPLAY_ERROR',\n BUFFERBREAK_ERROR: 'BUFFERBREAK_ERROR',\n WAITING_TIMEOUT_ERROR: 'WAITING_TIMEOUT_ERROR',\n MEDIA_ERR_ABORTED: 'MEDIA_ERR_ABORTED',\n MEDIA_ERR_NETWORK: 'MEDIA_ERR_NETWORK',\n MEDIA_ERR_DECODE: 'MEDIA_ERR_DECODE',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'MEDIA_ERR_SRC_NOT_SUPPORTED',\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 'MEDIA_ERR_CODEC_NOT_SUPPORTED',\n MEDIA_ERR_URL_EMPTY: 'MEDIA_ERR_URL_EMPTY'\n }\n}\n\nexport const ERR_CODE = {\n [ERR.MANIFEST]: {\n HLS: 1100,\n DASH: 1200\n },\n [ERR.NETWORK]: 2100,\n [ERR.NETWORK_TIMEOUT]: 2101,\n [ERR.NETWORK_FORBIDDEN]: 2103,\n [ERR.NETWORK_NOTFOUND]: 2104,\n [ERR.NETWROK_RANGE_NOT_SATISFIABLE]: 2116,\n [ERR.DEMUX]: {\n FLV: 3100,\n HLS: 3200,\n MP4: 3300,\n FMP4: 3400,\n SIDX: 3410\n },\n [ERR.REMUX]: {\n FMP4: 4100,\n MP4: 4200\n },\n [ERR.MEDIA]: {\n MEDIA_ERR_ABORTED: 5101,\n MEDIA_ERR_NETWORK: 5102,\n MEDIA_ERR_DECODE: 5103,\n MEDIA_ERR_SRC_NOT_SUPPORTED: 5104,\n MEDIA_ERR_CODEC_NOT_SUPPORTED: 5105,\n MEDIA_ERR_URL_EMPTY: 5106,\n MSE_ADD_SB: 5200,\n MSE_APPEND_BUFFER: 5201,\n MSE_OTHER: 5202,\n MSE_FULL: 5203,\n MSE_HIJACK: 5204,\n MSE_CHANGE_TYPE: 5205,\n EME_HIJACK: 5301\n },\n [ERR.DRM]: {\n LICENSE: 7100,\n CUSTOM_LICENSE: 7200\n },\n [ERR.OTHER]: 8000,\n [ERR.RUNTIME]: {\n NO_CANPLAY_ERROR: 9001,\n BUFFERBREAK_ERROR: 9002,\n WAITING_TIMEOUT_ERROR: 9003\n }\n}\n\nexport class StreamingError extends Error {\n constructor (type, subType, origin, payload, msg) {\n super(msg || origin?.message)\n this.errorType = type === ERR.NETWORK_TIMEOUT ? ERR.NETWORK : type\n this.originError = origin\n this.ext = payload\n this.errorCode = ERR_CODE[type][subType] || ERR_CODE[type]\n this.errorMessage = this.message\n if (!this.errorCode) {\n this.errorType = ERR.OTHER\n this.errorCode = ERR_CODE[this.errorType]\n }\n }\n\n static create (type, subType, origin, payload, msg) {\n if (type instanceof StreamingError) {\n return type\n } else if (type instanceof Error) {\n origin = type\n type = ''\n }\n\n if (!type) type = ERR.OTHER\n\n return new StreamingError(type, subType, origin, payload, msg)\n }\n\n static network (error) {\n return new StreamingError(\n error?.isTimeout ? ERR.NETWORK_TIMEOUT : ERR.NETWORK,\n null,\n error instanceof Error ? error : null,\n {\n url: error?.url,\n response: error?.response,\n httpCode: error?.response?.status\n }\n )\n }\n}\n","\nexport const LogCacheLevel = {\n 'DEBUG': 1,\n 'LOG': 2,\n 'WARN': 3,\n 'ERROR': 4\n}\nconst LOG_MAX_SIZE = 200 * 1024\nconst SIMPLE_TYPE = ['Boolean', 'Number' ,'String', 'Undefined','Null', 'Date','Object']\nexport class Logger {\n constructor (name,config) {\n this.name = name || ''\n this._prefix = `[${this.name}]`\n this.logCacheLevel = config?.logCacheLevel || 3\n this.logMaxSize = config?.logMaxSize || LOG_MAX_SIZE\n this.logSize = 0\n this.logTextArray = []\n }\n\n debug (...args) {\n this.logCache(LogCacheLevel.DEBUG,...args)\n if (Logger.disabled) return\n console.debug(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n log (...args) {\n this.logCache(LogCacheLevel.LOG,...args)\n if (Logger.disabled) return\n console.log(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n warn (...args) {\n this.logCache(LogCacheLevel.WARN,...args)\n if (Logger.disabled) return\n console.warn(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n error (...args) {\n this.logCache(LogCacheLevel.ERROR,...args)\n if (Logger.disabled) return\n console.error(`[${nowTime()}]`, this._prefix, ...args)\n }\n\n logCache (logCacheLevel, ...logText) {\n if (logCacheLevel < this.logCacheLevel) return\n let text = ''\n try {\n const finLogText = logText.map( item => logable(item))\n text = `[${nowTime()}]` + this._prefix + (JSON.stringify(finLogText))\n } catch (e) {\n return\n }\n if (logCacheLevel >= this.logCacheLevel) {\n this.logSize += text.length\n this.logTextArray.push(text)\n }\n if (this.logSize > this.logMaxSize) {\n const delLog = this.logTextArray.shift()\n this.logSize -= delLog.length\n }\n }\n\n getLogCache () {\n const logText = this.logTextArray.join('\\n')\n this.reset()\n return logText\n }\n\n reset () {\n this.logTextArray = []\n this.logSize = 0\n }\n\n table (...args) {\n if (Logger.disabled) return\n console.group(this._prefix)\n console.table(...args)\n console.groupEnd()\n }\n\n static disabled = true\n\n static enable () {\n Logger.disabled = false\n }\n\n static disable () {\n Logger.disabled = true\n }\n\n setLogLevel (val) {\n this.logCacheLevel = val\n }\n}\nfunction nowTime () {\n return new Date().toLocaleString()\n}\n\nfunction reduceDepth (val) {\n if (typeof val !== 'object') {\n return val\n }\n const objType = Object.prototype.toString.call(val).slice(8, -1)\n switch (objType) {\n case 'Array':\n case 'Uint8Array':\n case 'ArrayBuffer':\n\n return objType + '[' + val.length + ']'\n case 'Object':\n return '{}'\n default:\n return objType\n }\n}\n\nfunction logable (obj, maxDepth, depth) {\n if (!depth) depth = 1\n if (!maxDepth) maxDepth = 2\n const result = {}\n\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n const objType = Object.prototype.toString.call(obj).slice(8, -1)\n if (!SIMPLE_TYPE.includes(objType)) {\n return objType\n }\n\n if (depth > maxDepth) {\n return undefined\n }\n\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (depth === maxDepth) {\n result[key] = reduceDepth(obj[key])\n } else if (typeof obj[key] === 'object') {\n result[key] = logable(obj[key], maxDepth, depth + 1)\n } else {\n result[key] = obj[key]\n }\n }\n }\n return result\n}\n\n","export function createPublicPromise () {\n let res, rej\n const promise = new Promise((resolve, reject) => {\n res = resolve\n rej = reject\n })\n promise.used = false\n promise.resolve = (...args) => {\n promise.used = true\n return res(...args)\n }\n promise.reject = (...args) => {\n promise.used = true\n return rej(...args)\n }\n return promise\n}\n\nexport function nowTime () {\n try {\n return parseInt(performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n\nexport const SafeJSON = {\n stringify (obj) {\n try {\n return JSON.stringify(obj)\n } catch (e) {\n return ''\n }\n },\n parse (obj) {\n try {\n return JSON.parse(obj)\n } catch (e) {\n return undefined\n }\n }\n}\n","/* eslint-disable no-undef */\nimport { Buffer } from './buffer'\nimport { isBrowser } from './env'\nimport { ERR, StreamingError } from './error'\nimport { Logger } from './logger'\nimport { createPublicPromise, nowTime, SafeJSON } from './utils'\n\nfunction getMediaSource (preferMMS = true) {\n try {\n if (!isBrowser) return null\n\n if (preferMMS && typeof ManagedMediaSource !== 'undefined') return ManagedMediaSource\n\n return window.MediaSource\n } catch (e) {}\n}\n\nfunction isMMS (mediaSource) {\n return /ManagedMediaSource/gi.test(Object.prototype.toString.call(mediaSource))\n}\n\n/**\n * @param {TimeRanges} buffered\n */\nfunction getTimeRanges (buffered) {\n const ranges = []\n\n if (buffered instanceof TimeRanges) {\n for (let i = 0; i < buffered.length; i++) {\n ranges.push({\n start: buffered.start(i),\n end: buffered.end(i)\n })\n }\n }\n return ranges\n}\n\n/** @enum {string} */\nexport const MSEErrorType = {\n UPDATE_ERROR: 'updateError'\n}\n\nconst OP_NAME = {\n APPEND: 'appendBuffer',\n REMOVE: 'removeBuffer',\n UPDATE_DURATION:'updateDuration'\n}\n\nexport class MSEError extends Error {\n /**\n * @param {MSEErrorType} type\n * @param {any} [msg]\n */\n constructor (type, msg) {\n super(msg || type)\n this.type = type\n this.msg = msg\n }\n}\n\nexport class MSE {\n static VIDEO = 'video'\n\n static AUDIO = 'audio'\n\n /**\n * @param {string} [mime='video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"']\n * @param { boolean} preferMMS\n * @returns {boolean}\n */\n static isSupported (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n const MediaSource = getMediaSource()\n if (!MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n }\n\n static isMMSOnly () {\n return typeof ManagedMediaSource !== 'undefined' && typeof MediaSource === 'undefined'\n }\n\n /** @type { HTMLMediaElement | null } */\n media = null\n\n /** @type { MediaSource | null } */\n mediaSource = null\n\n _openPromise = createPublicPromise()\n\n _queue = Object.create(null)\n\n _sourceBuffer = Object.create(null)\n\n _mseFullFlag = {}\n\n _st = 0\n\n _opst = 0\n\n _logger = null\n\n _config = null\n _url = null\n\n\n static getDefaultConfig () {\n return {\n openLog: false,\n preferMMS: false\n }\n }\n\n /**\n * @param {HTMLMediaElement} [media]\n */\n constructor (media, config) {\n this._config = Object.assign(MSE.getDefaultConfig(), config)\n if (media) this.bindMedia(media)\n this._logger = new Logger('MSE')\n if (this._config.openLog) {\n Logger.enable()\n }\n }\n\n get isOpened () {\n return this.mediaSource?.readyState === 'open'\n }\n\n get hasOpTasks () {\n let flag = false\n Object.keys(this._queue).forEach(k => {\n const queue = this._queue[k]\n if (Array.isArray(queue)) {\n flag ||= queue.length > 0\n }\n })\n return flag\n }\n\n get url () {\n return this._url\n }\n\n get duration () {\n return this.mediaSource?.duration || -1\n }\n\n get isEnded () {\n return this.mediaSource ? this.mediaSource.readyState === 'ended' : false\n }\n\n get streaming () {\n return isMMS(this.mediaSource) ? this.mediaSource.streaming : true\n }\n\n isFull (type) {\n return type ? this._mseFullFlag[type] : this._mseFullFlag[MSE.VIDEO]\n }\n\n /**\n * @param { number } duration\n * @return { Promise }\n */\n updateDuration (duration) {\n const isReduceDuration = this.mediaSource && this.mediaSource.duration > duration\n if (this.mediaSource && this.mediaSource.duration > duration) {\n let bufferEnd = 0\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n bufferEnd = Math.max(this.bufferEnd(k) || 0, bufferEnd)\n } catch (error) {\n // ignore\n }\n })\n if (duration < bufferEnd) {\n // 设置值比bufferEnd值小,会导致异常\n return Promise.resolve()\n }\n }\n\n return this._enqueueBlockingOp(() => {\n if (this.isEnded) {\n this._logger.debug('setDuration but ended')\n return\n }\n if (this.mediaSource) {\n this.mediaSource.duration = duration\n this._logger.debug('setDuration', duration)\n }\n }, OP_NAME.UPDATE_DURATION, {isReduceDuration})\n }\n\n /** @return { Promise } */\n open () {\n if (this._openPromise.used && !this.isOpened && this.mediaSource) {\n const ms = this.mediaSource\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen', costTime)\n ms.removeEventListener('sourceopen', onOpen)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n this._openPromise = createPublicPromise()\n }\n\n return this._openPromise\n }\n\n /**\n * @private\n */\n _onStartStreaming = () => {\n this._logger.debug('startstreaming')\n }\n\n /**\n * @private\n */\n _onEndStreaming = () => {\n this._logger.debug('endstreaming')\n }\n\n /**\n * @param { HTMLMediaElement } media\n * @return { Promise }\n */\n async bindMedia (media) {\n if (this.mediaSource || this.media) await this.unbindMedia()\n\n const MediaSource = getMediaSource(this._config.preferMMS)\n\n if (!media || !MediaSource) throw new Error('Param media or MediaSource does not exist')\n this.media = media\n const ms = this.mediaSource = new MediaSource()\n const useMMS = isMMS(ms)\n this._st = nowTime()\n\n const onOpen = () => {\n const costTime = nowTime() - this._st\n this._logger.debug('sourceopen')\n ms.removeEventListener('sourceopen', onOpen)\n URL.revokeObjectURL(media.src)\n this._openPromise.resolve({costtime: costTime})\n }\n ms.addEventListener('sourceopen', onOpen)\n if (useMMS) {\n ms.addEventListener('startstreaming', this._onStartStreaming)\n ms.addEventListener('endstreaming', this._onEndStreaming)\n }\n\n this._url = URL.createObjectURL(ms)\n media.src = this._url\n media.disableRemotePlayback = useMMS\n\n return this._openPromise\n }\n\n /** @return { Promise } */\n async unbindMedia () {\n if (!this._openPromise.used) this._openPromise.resolve()\n const ms = this.mediaSource\n\n if (ms) {\n Object.keys(this._queue).forEach((t) => {\n const queue = this._queue[t]\n if (queue) {\n queue.forEach(x => x.promise?.resolve?.())\n }\n })\n\n const hasMetadata = !!this.media && this.media.readyState >= 1\n const mseOpen = ms.readyState === 'open'\n\n if (hasMetadata && mseOpen) {\n try {\n ms.endOfStream()\n } catch (error) {\n // ignore\n }\n }\n\n Object.keys(this._sourceBuffer).forEach(k => {\n try {\n ms.removeSourceBuffer(this._sourceBuffer[k])\n } catch (error) {\n // ignore\n }\n })\n\n if (isMMS(ms)) {\n ms.removeEventListener('startstreaming', this._onStartStreaming)\n ms.removeEventListener('endstreaming', this._onEndStreaming)\n }\n }\n\n if (this.media) {\n this.media.disableRemotePlayback = false\n this.media.removeAttribute('src')\n try {\n this.media.load()\n } catch (error) {\n // ignore\n }\n this.media = null\n }\n\n this.mediaSource = null\n this._openPromise = createPublicPromise()\n this._queue = Object.create(null)\n this._sourceBuffer = Object.create(null)\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n */\n createSource (type, mimeType) {\n if (this._sourceBuffer[type] || !this.mediaSource) return\n let sb\n try {\n sb = this._sourceBuffer[type] = this.mediaSource.addSourceBuffer(mimeType)\n } catch (error) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_ADD_SB, error)\n }\n sb.mimeType = mimeType\n sb.addEventListener('updateend', this._onSBUpdateEnd.bind(this, type))\n sb.addEventListener('error', this._onSBUpdateError.bind(this, type))\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n changeType (type, mimeType) {\n const sb = this._sourceBuffer[type]\n if (!this.mediaSource || !sb || sb.mimeType === mimeType) return Promise.resolve()\n\n if (typeof sb.changeType !== 'function') {\n return Promise.reject(\n new StreamingError(\n ERR.MEDIA,\n ERR.SUB_TYPES.MSE_CHANGE_TYPE,\n new Error('changeType is not a function')\n )\n )\n }\n\n return this._enqueueOp(type, () => {\n try {\n sb.changeType(mimeType)\n } catch (e) {\n throw new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_CHANGE_TYPE, e)\n }\n\n sb.mimeType = mimeType\n this._onSBUpdateEnd(type)\n }, 'changeType', {mimeType})\n }\n\n /**\n * @param { string } type\n * @param { string } mimeType\n * @return { Promise }\n */\n createOrChangeSource (type, mimeType) {\n this.createSource(type, mimeType)\n return this.changeType(type, mimeType)\n }\n\n /**\n * @param { string } type\n * @param { BufferSource } buffer\n * @return { Promise }\n */\n append (type, buffer, context) {\n if (!buffer || !buffer.byteLength) {\n return Promise.resolve()\n }\n\n if (!this._sourceBuffer[type]) return Promise.resolve()\n\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n this._logger.debug('MSE APPEND START', context)\n this._opst = nowTime()\n this._sourceBuffer[type]?.appendBuffer(buffer)\n }, OP_NAME.APPEND, context)\n\n }\n\n /**\n * @param { string } type\n * @param { number } startTime\n * @param { number } endTime\n * @return { Promise }\n */\n remove (type, startTime, endTime, context) {\n // if (Object.keys(this._sourceBuffer).length === 1) return Promise.resolve()\n let isInsertHead = false\n if (this._mseFullFlag[type]) {\n isInsertHead = true\n }\n return this._enqueueOp(type, () => {\n if (!this.mediaSource || this.media.error) return\n const sb = this._sourceBuffer[type]\n if (startTime >= endTime || !sb) {\n this._onSBUpdateEnd(type)\n return\n }\n this._opst = nowTime()\n this._logger.debug('MSE REMOVE START', type, startTime, endTime, context)\n sb.remove(startTime, endTime)\n }, OP_NAME.REMOVE, context, isInsertHead)\n }\n\n clearBuffer (startTime, endTime) {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n p = this.remove(k, startTime, endTime)\n })\n return p || Promise.resolve()\n }\n\n clearAllBuffer () {\n let p\n Object.keys(this._sourceBuffer).forEach(k => {\n const sb = this._sourceBuffer[k]\n p = this.remove(k, 0, Buffer.end(Buffer.get(sb)))\n })\n return p\n }\n\n clearOpQueues (type, allClear) {\n this._logger.debug('MSE clearOpQueue START')\n const queue = this._queue[type]\n if (allClear && queue) {\n this._queue[type] = []\n return\n }\n if (!queue || !queue[type] || queue.length < 5) return\n const initQueue = []\n queue.forEach(op => {\n if (op.context && op.context.isinit) {\n initQueue.push(op)\n }\n })\n this._queue[type] = queue.slice(0, 2)\n initQueue.length > 0 && this._queue[type].push(...initQueue)\n }\n\n /**\n * @param {EndOfStreamError} [reason]\n * @returns {Promise}\n */\n endOfStream (reason) {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open') return Promise.resolve()\n return this._enqueueBlockingOp(() => {\n const ms = this.mediaSource\n if (!ms || ms.readyState !== 'open') return\n this._logger.debug('MSE endOfStream START')\n if (reason) {\n ms.endOfStream(reason)\n } else {\n ms.endOfStream()\n }\n }, 'endOfStream')\n }\n\n setLiveSeekableRange (start, end) {\n const ms = this.mediaSource\n if (start < 0 || end < start || !ms?.setLiveSeekableRange || ms.readyState !== 'open') return\n ms.setLiveSeekableRange(start, end)\n }\n\n /**\n * @param {string} type\n * @returns {?SourceBuffer}\n */\n getSourceBuffer (type) {\n return this._sourceBuffer[type]\n }\n\n /**\n * @param { string } type\n * @return { TimeRanges | void }\n */\n buffered (type) {\n return Buffer.get(this._sourceBuffer[type])\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferStart (type) {\n return Buffer.start(this.buffered(type))\n }\n\n /**\n * @param { string } type\n * @return { number }\n */\n bufferEnd (type) {\n return Buffer.end(this.buffered(type))\n }\n\n _enqueueOp (type, exec, opName, context, isInsertHead) {\n if (!this.mediaSource) return Promise.resolve()\n const queue = this._queue[type] = this._queue[type] || []\n const op = {\n exec,\n promise: createPublicPromise(),\n opName,\n context\n }\n\n if (isInsertHead) {\n queue.splice(0, 0, op)\n this._mseFullFlag[type] = false\n this._startQueue(type)\n } else {\n queue.push(op)\n }\n\n if (this.isOpened || this.isEnded) {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n } else {\n this._openPromise.then(() => {\n if (queue.length === 1) {\n this._startQueue(type)\n }\n })\n }\n\n\n return op.promise\n }\n\n async _enqueueBlockingOp (exec, opName, context) {\n if (!this.mediaSource) return Promise.resolve()\n const types = Object.keys(this._sourceBuffer)\n if (!types.length) {\n return exec()\n }\n\n const waiters = []\n types.forEach(t => {\n const queue = this._queue[t]\n const prom = createPublicPromise()\n waiters.push(prom)\n queue.push({exec: () => {\n prom.resolve()}, promise: prom, opName, context})\n if (queue.length === 1) {\n this._startQueue(t)\n }\n })\n\n return Promise.all(waiters).then(() => {\n try {\n return exec()\n } finally {\n types.forEach(t => {\n const queue = this._queue[t]\n const sb = this._sourceBuffer[t]\n queue?.shift()\n if (!sb || !sb.updating) {\n this._startQueue(t)\n }\n })\n }\n })\n }\n\n _startQueue (type) {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op && !this._mseFullFlag[type]) {\n try {\n op.exec()\n } catch (error) {\n if (error && error.message && error.message.indexOf('SourceBuffer is full') >= 0) {\n this._mseFullFlag[type] = true\n if (op.context && typeof op.context === 'object'){\n op.context.isFull = true\n }\n this._logger.error('[MSE error], context,', op.context, ' ,name,', op.opName, ',err,SourceBuffer is full')\n op?.promise?.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_FULL, error))\n } else {\n this._logger.error(error)\n op?.promise?.reject(\n error.constructor === StreamingError\n ? error\n : new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_OTHER, error)\n )\n queue.shift()\n this._startQueue(type)\n }\n }\n }\n }\n }\n\n _onSBUpdateEnd = (type) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (!(op?.opName === OP_NAME.UPDATE_DURATION)) {\n queue.shift()\n }\n if (op) {\n const costtime = nowTime() - this._opst\n this._logger.debug(`UpdateEnd(${type}/${op.opName})`, SafeJSON.stringify(getTimeRanges(this._sourceBuffer[type]?.buffered)), costtime, op.context)\n op.promise.resolve({name: op.opName, context: op.context, costtime})\n const callback = op.context?.callback\n if (callback && typeof callback === 'function'){\n callback(op.context)\n }\n this._startQueue(type)\n }\n }\n }\n\n _onSBUpdateError = (type, event) => {\n const queue = this._queue[type]\n if (queue) {\n const op = queue[0]\n if (op) {\n this._logger.error('UpdateError', type, op.opName, op.context)\n op.promise.reject(new StreamingError(ERR.MEDIA, ERR.SUB_TYPES.MSE_APPEND_BUFFER, event))\n // Do not shift from queue, 'updateend' event will fire next\n }\n }\n }\n\n setTimeoffset (type, timestampOffset, context) {\n return this._enqueueOp(type, () => {\n if (timestampOffset < 0) {\n timestampOffset += 0.001\n }\n this._sourceBuffer[type].timestampOffset = timestampOffset\n this._onSBUpdateEnd(type)\n }, 'setTimeoffset', context)\n }\n\n /** *重置decode时间戳 */\n abort (type, context) {\n if (!this.isOpened) {\n return Promise.resolve()\n }\n return this._enqueueOp(type, () => {\n this._sourceBuffer[type].abort()\n this._onSBUpdateEnd(type)\n }, 'abort', context)\n }\n}\n","export const LoaderType = {\n FETCH: 'fetch',\n XHR: 'xhr'\n}\n\nexport const ResponseType = {\n ARRAY_BUFFER: 'arraybuffer',\n TEXT: 'text',\n JSON: 'json'\n}\n","import { LoaderType } from './types'\n\nexport class NetError extends Error {\n retryCount = 0\n isTimeout = false\n loaderType = LoaderType.FETCH\n startTime = 0\n endTime = 0\n options = {}\n\n constructor (url, request, response, msg) {\n super(msg)\n this.url = url\n this.request = request\n this.response = response\n }\n}\n","const toString = Object.prototype.toString\n\nexport function isObject (a) {\n return a !== null && typeof a === 'object'\n}\n\nexport function isPlainObject (val) {\n if (toString.call(val) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(val)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isDate (a) {\n return toString.call(a) === '[object Date]'\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { isDate, isObject } from '../is'\n\nexport function getRangeValue (value) {\n if (!value || value[0] === null || value[0] === undefined || (value[0] === 0 && (value[1] === null || value[1] === undefined))) {\n return\n }\n let ret = 'bytes=' + value[0] + '-'\n if (value[1]) ret += value[1]\n return ret\n}\n\nfunction encode (val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\nexport function setUrlParams (url, params) {\n if (!url) return\n if (!params) return url\n let v\n const str = Object.keys(params).map(k => {\n v = params[k]\n if (v === null || v === undefined) return\n if (Array.isArray(v)) {\n k = k + '[]'\n } else {\n v = [v]\n }\n\n return v.map(x => {\n if (isDate(x)) {\n x = x.toISOString()\n } else if (isObject(x)) {\n x = JSON.stringify(x)\n }\n return `${encode(k)}=${encode(x)}`\n }).join('&')\n }).filter(Boolean).join('&')\n\n if (str) {\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex)\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + str\n }\n\n return url\n}\n\nexport function createResponse (\n data,\n done,\n response,\n contentLength,\n age,\n startTime,\n firstByteTime,\n index,\n range,\n vid,\n priOptions\n) {\n age = (age !== null && age !== undefined) ? parseFloat(age) : null\n contentLength = parseInt(contentLength || '0', 10)\n if (Number.isNaN(contentLength)) contentLength = 0\n const options = { range, vid, index, contentLength, age, startTime, firstByteTime, endTime: Date.now(), priOptions }\n return { data, done, options, response }\n}\n\nexport function calculateSpeed (byteLen, milliSecond) {\n return Math.round(byteLen * 8 * 1000 / milliSecond / 1024) // Kb/s\n}\n","export const EVENT = {\n ERROR: 'error',\n\n TTFB: 'core.ttfb',\n LOAD_START: 'core.loadstart',\n LOAD_RESPONSE_HEADERS: 'core.loadresponseheaders',\n LOAD_COMPLETE: 'core.loadcomplete',\n LOAD_RETRY: 'core.loadretry',\n SOURCEBUFFER_CREATED: 'core.sourcebuffercreated',\n MEDIASOURCE_OPENED: 'core.mediasourceopened',\n ANALYZE_DURATION_EXCEEDED: 'core.analyzedurationexceeded',\n APPEND_BUFFER: 'core.appendbuffer',\n REMOVE_BUFFER: 'core.removebuffer',\n BUFFEREOS: 'core.buffereos',\n KEYFRAME: 'core.keyframe',\n CHASEFRAME: 'core.chaseframe',\n METADATA_PARSED: 'core.metadataparsed',\n SEI: 'core.sei',\n SEI_IN_TIME: 'core.seiintime',\n FLV_SCRIPT_DATA: 'core.flvscriptdata',\n LOWDECODE: 'core.lowdecode',\n SWITCH_URL_SUCCESS: 'core.switchurlsuccess',\n SWITCH_URL_FAILED: 'core.switchurlfailed',\n SPEED: 'core.speed',\n HLS_MANIFEST_LOADED: 'core.hlsmanifestloaded',\n HLS_LEVEL_LOADED: 'core.hlslevelloaded',\n DEMUXED_TRACK:'core.demuxedtrack',\n\n STREAM_EXCEPTION: 'core.streamexception',\n LARGE_AV_FIRST_FRAME_GAP_DETECT: 'LARGE_AV_FIRST_FRAME_GAP_DETECT',\n LARGE_VIDEO_DTS_GAP_DETECT: 'LARGE_VIDEO_DTS_GAP_DETECT',\n LARGE_AUDIO_DTS_GAP_DETECT: 'LARGE_AUDIO_DTS_GAP_DETECT',\n AUDIO_GAP_DETECT: 'AUDIO_GAP_DETECT',\n AUDIO_OVERLAP_DETECT: 'AUDIO_OVERLAP_DETECT',\n MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT: 'MAX_DTS_DELTA_WITH_NEXT_SEGMENT_DETECT',\n REAL_TIME_SPEED: 'real_time_speed'\n}\n","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","const TFHDFlag = {\n BASE_DATA_OFFSET: 1,\n SAMPLE_DESC: 2,\n SAMPLE_DUR: 8,\n SAMPLE_SIZE: 16,\n SAMPLE_FLAG: 32,\n DUR_EMPTY: 65536,\n DEFAULT_BASE_IS_MOOF: 131072\n}\nconst TRUNFlag = {\n DATA_OFFSET: 1,\n FIRST_FLAG: 4,\n DURATION: 256,\n SIZE: 512,\n FLAG: 1024,\n CTS_OFFSET: 2048\n}\nconst SampleFlag = {\n DEGRADATION_PRIORITY_MASK: 65535,\n IS_NON_SYNC: 65536,\n PADDING_MASK: 917504,\n REDUNDANCY_MASK: 3145728,\n DEPENDED_MASK: 12582912,\n DEPENDS_MASK: 50331648,\n DEPENDS_NO: 33554432,\n DEPENDS_YES: 16777216\n}\n\nexport function trafToSegments (traf, trex = {}, moofOffset, segDuration, timescale) {\n const { tfhd, trun, tfdt } = traf\n const { samples: trunSamples, flags: trunFlags } = trun\n const { flags: tfhdFlags } = tfhd\n\n // const defaultSampleDescriptionIndex = tfhdFlags & TFHDFlag.SAMPLE_DESC ? tfhd.sampleDescriptionIndex : (trex.defaultSampleDescriptionIndex || 1)\n const defaultSampleDuration = tfhdFlags & TFHDFlag.SAMPLE_DUR ? tfhd.defaultSampleDuration : (trex.defaultSampleDuration || 0)\n const defaultSampleSize = tfhdFlags & TFHDFlag.SAMPLE_SIZE ? tfhd.defaultSampleSize : (trex.defaultSampleSize || 0)\n const defaultSampleFlags = tfhdFlags & TFHDFlag.SAMPLE_FLAG ? tfhd.defaultSampleFlags : (trex.defaultSampleFlags || 0)\n const startOffset = tfhdFlags & TFHDFlag.BASE_DATA_OFFSET ? tfhd.baseDataOffset : (tfhdFlags & TFHDFlag.DEFAULT_BASE_IS_MOOF ? moofOffset : 0)\n\n const frames = []\n const gops = []\n\n for (let lastDts = 0, startTime = 0, gopId = 0, totalOffset = startOffset, i = 0; i < trunSamples.length; i++) {\n const frame = {}\n frame.index = i\n frame.size = trunFlags & TRUNFlag.SIZE ? trunSamples[i].size : defaultSampleSize\n frame.duration = trunFlags & TRUNFlag.DURATION ? trunSamples[i].duration : defaultSampleDuration\n frame.dts = lastDts > 0 ? lastDts : (tfdt ? tfdt.baseMediaDecodeTime : 0)\n frame.startTime = startTime\n if (trunFlags & TRUNFlag.CTS_OFFSET) {\n frame.pts = frame.dts + trunSamples[i].cts\n } else {\n frame.pts = frame.dts\n }\n lastDts = frame.dts + frame.duration\n startTime += frame.duration\n\n let sampleFlags = defaultSampleFlags\n if (trunFlags & TRUNFlag.FLAG) {\n sampleFlags = trunSamples[i].flags\n } else if (0 === i && trunFlags & TRUNFlag.FIRST_FLAG) {\n sampleFlags = trun.firstSampleFlag\n }\n frame.offset = totalOffset\n frame.keyframe = !(sampleFlags & (SampleFlag.IS_NON_SYNC | SampleFlag.DEPENDS_YES))\n totalOffset += frame.size\n frames.push(frame)\n if (frame.keyframe) {\n gopId++\n gops.push([frame])\n } else if (gops.length) {\n gops[gops.length - 1].push(frame)\n }\n frame.gopId = gopId\n }\n\n const len = frames.length\n if (!len || (!frames[0].keyframe)) return []\n\n let time = 0\n let lastFrame\n const segments = []\n const scaledDuration = segDuration * timescale\n let segmentFrames = []\n\n // 合并gop至segments,以segDuration作为参考\n for (let i = 0, len = gops.length; i < len; i++) {\n time += gops[i].reduce((wret, w) => wret + w.duration, 0)\n segmentFrames = segmentFrames.concat(gops[i])\n\n if (time >= scaledDuration || i === gops.length - 1) {\n lastFrame = segmentFrames[segmentFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segmentFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: time / timescale,\n range: [segmentFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segmentFrames\n })\n time = 0\n segmentFrames = []\n }\n }\n\n return segments\n}\n\nexport function sidxToSegments (moov, sidx) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let audioSegments = []\n let videoSegments = []\n if (sidx) {\n const segments = []\n let prevTime = 0\n let prevOffset = sidx.start + sidx.size\n sidx.references.forEach((ref, i) => {\n segments.push({\n index: i,\n startTime: prevTime,\n endTime: prevTime + (ref.subsegment_duration / sidx.timescale),\n duration: ref.subsegment_duration / sidx.timescale,\n range: [prevOffset, prevOffset + ref.referenced_size],\n frames: []\n })\n prevTime += ref.subsegment_duration / sidx.timescale\n prevOffset += ref.referenced_size\n })\n audioSegments = segments\n videoSegments = segments\n } else {\n // 如果sidx不存在,则代表后续的segments无法通过seek读取\n // 把整段fmp4当作一个segment,使用开区间range即可\n const getTrakSegments = (box) => {\n if (!box) return []\n return [{\n index: 0,\n startTime: 0,\n endTime: box.duration / box.timescale,\n duration: box.duration / box.timescale,\n range: [moov.start + moov.size, ''],\n frames: []\n }]\n }\n videoSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : videoTrack.mdia?.mdhd)\n audioSegments = getTrakSegments(moov.mvhd.duration ? moov.mvhd : audioTrack.mdia?.mdhd)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nexport function moovToSegments (moov, duration) {\n const tracks = moov.trak\n if (!tracks || !tracks.length) return\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n if (!videoTrack && !audioTrack) return\n\n let videoSegments = []\n let audioSegments = []\n\n let segmentDurations\n if (videoTrack) {\n const videoStbl = videoTrack.mdia?.minf?.stbl\n if (!videoStbl) return\n const timescale = videoTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco, stss, ctts } = videoStbl\n if (!timescale || !stts || !stsc || !stsz || !stco || !stss) return\n videoSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, stss, ctts)\n segmentDurations = videoSegments.map(x => x.duration)\n }\n if (audioTrack) {\n const audioStbl = audioTrack.mdia?.minf?.stbl\n if (!audioStbl) return\n const timescale = audioTrack.mdia.mdhd?.timescale\n const { stts, stsc, stsz, stco } = audioStbl\n if (!timescale || !stts || !stsc || !stsz || !stco) return\n audioSegments = getSegments(duration, timescale, stts, stsc, stsz, stco, null, null, segmentDurations)\n }\n\n return {\n videoSegments,\n audioSegments\n }\n}\n\nfunction getSegments (segDuration, timescale, stts, stsc, stsz, stco, stss, ctts, segmentDurations) {\n const frames = []\n const gop = []\n const gopDuration = []\n const stscEntries = stsc.entries\n const stcoEntries = stco.entries\n const stszEntrySizes = stsz.entrySizes\n const stssEntries = stss?.entries\n const cttsEntries = ctts?.entries\n let cttsArr\n if (cttsEntries) {\n cttsArr = []\n cttsEntries.forEach(({ count, offset }) => {\n for (let i = 0; i < count; i++) {\n cttsArr.push(offset)\n }\n })\n }\n let keyframeMap\n if (stssEntries) {\n keyframeMap = {}\n stssEntries.forEach(x => { keyframeMap[x - 1] = true })\n }\n\n let frame\n let duration\n let startTime = 0\n let pos = 0\n let chunkIndex = 0\n let chunkRunIndex = 0\n let offsetInChunk = 0\n let lastSampleInChunk = stscEntries[0]?.samplesPerChunk\n let lastChunkInRun = stscEntries[1] ? stscEntries[1].firstChunk - 1 : Infinity\n let dts = 0\n let gopId = -1\n stts.entries.forEach(({ count, delta }) => {\n duration = delta // / timescale\n for (let i = 0; i < count; i++) {\n frame = {\n dts,\n startTime,\n duration,\n size: stszEntrySizes[pos] || stsz.sampleSize,\n offset: stcoEntries[chunkIndex] + offsetInChunk,\n index: pos\n }\n if (stssEntries) {\n frame.keyframe = keyframeMap[pos]\n if (frame.keyframe) {\n gopId++\n gop.push([frame])\n gopDuration.push(frame.duration)\n } else {\n gop[gop.length - 1].push(frame)\n gopDuration[gop.length - 1] += frame.duration\n }\n frame.gopId = gopId\n }\n if (cttsArr && pos < cttsArr.length) {\n frame.pts = dts + cttsArr[pos]\n }\n if (pos === 0) {\n frame.pts = 0\n }\n frames.push(frame)\n startTime += duration\n dts += delta\n pos++\n\n if (pos < lastSampleInChunk) {\n offsetInChunk += frame.size\n } else {\n chunkIndex++\n offsetInChunk = 0\n if (chunkIndex >= lastChunkInRun) {\n chunkRunIndex++\n lastChunkInRun = stscEntries[chunkRunIndex + 1] ? stscEntries[chunkRunIndex + 1].firstChunk - 1 : Infinity\n }\n lastSampleInChunk += stscEntries[chunkRunIndex].samplesPerChunk\n }\n }\n })\n\n const l = frames.length\n if (!l || (stss && !frames[0].keyframe)) return []\n\n const segments = []\n let segFrames = []\n let time = 0\n let lastFrame\n let adjust = 0\n const pushSegment = (duration) => {\n lastFrame = segFrames[segFrames.length - 1]\n segments.push({\n index: segments.length,\n startTime: (segments[segments.length - 1]?.endTime || segFrames[0].startTime / timescale),\n endTime: (lastFrame.startTime + lastFrame.duration) / timescale,\n duration: duration,\n range: [segFrames[0].offset, lastFrame.offset + lastFrame.size],\n frames: segFrames\n })\n time = 0\n segFrames = []\n }\n\n if (stss) {\n const duration = segDuration * timescale\n for (let i = 0, l = gop.length; i < l; i++) {\n time += gopDuration[i]\n segFrames.push(...gop[i])\n if (i + 1 < l) {\n if (i === 0 || time > duration) {\n pushSegment(time / timescale)\n }\n } else {\n pushSegment(time / timescale)\n }\n }\n } else {\n segmentDurations = segmentDurations || []\n let duration = segmentDurations[0] || segDuration\n for (let i = 0; i < l; i++) {\n segFrames.push(frames[i])\n time += frames[i].duration\n const curTime = time / timescale\n if (i + 1 >= l || curTime + adjust >= duration) {\n adjust += curTime - duration\n pushSegment(curTime)\n duration = segmentDurations[segments.length] || segDuration\n }\n }\n }\n return segments\n}\n\nexport function moovToMeta (moov, isFragmentMP4) {\n let videoCodec = ''\n let audioCodec = ''\n let width = 0\n let height = 0\n let audioChannelCount = 0\n let audioSampleRate = 0\n let duration = 0\n let videoTimescale = 0\n let audioTimescale = 0\n if (moov.mvhd) {\n duration = moov.mvhd.duration / moov.mvhd.timescale\n }\n\n const tracks = moov.trak\n\n if (tracks) {\n const videoTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'vide')\n const audioTrack = tracks.find(t => t.mdia?.hdlr?.handlerType === 'soun')\n let e1 = null\n let defaultKID\n if (videoTrack) {\n e1 = videoTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n width = e1.width\n height = e1.height\n videoTimescale = videoTrack.mdia?.mdhd?.timescale\n videoCodec = (e1.avcC || e1.hvcC || e1.av1C)?.codec\n if (e1.type === 'encv') {\n defaultKID = e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n if (audioTrack) {\n e1 = audioTrack.mdia?.minf?.stbl?.stsd.entries[0]\n if (e1) {\n audioChannelCount = e1.channelCount\n audioSampleRate = e1.sampleRate\n audioCodec = e1.esds?.codec\n audioTimescale = audioTrack.mdia?.mdhd?.timescale\n if (e1.type === 'enca') {\n defaultKID = defaultKID || e1.sinf?.schi?.tenc.default_KID\n }\n }\n }\n return {\n kid: defaultKID ? defaultKID.join('') : null,\n videoCodec,\n audioCodec,\n width,\n height,\n videoTimescale,\n audioChannelCount,\n audioSampleRate,\n duration,\n audioTimescale,\n moov,\n isFragmentMP4\n }\n }\n}\n\nexport function isNumber (n) {\n return typeof n === 'number' && !Number.isNaN(n)\n}\n","import { NetLoader, concatUint8Array, Logger, EVENT } from 'xgplayer-streaming-shared'\nimport { MP4Parser } from 'xgplayer-transmuxer'\nimport { getConfig } from './config'\nimport { MediaError } from './error'\nimport { Cache } from './cache'\nimport { isNumber, moovToMeta, moovToSegments, sidxToSegments } from './utils'\nimport EventEmitter from 'eventemitter3'\n\nexport class MP4Loader extends EventEmitter {\n vid = ''\n url = ''\n meta = {}\n downloadInfo = []\n videoSegments = []\n audioSegments = []\n cache = null\n _currentSegmentIndex = -1\n _currentLoadingSegmentIndex = -1\n buffer\n _error\n\n constructor (config) {\n super()\n this._config = getConfig(config)\n const {\n vid,\n cache,\n ...rest\n } = this._config\n this.cache = cache || new Cache()\n this.vid = vid || rest.url\n this.url = rest.url\n rest.transformError = this._transformError\n this.logger = new Logger('MP4Loader_' + this.vid)\n !!config.openLog && Logger.enable()\n rest.logger = this.logger\n\n this._loader = new NetLoader(rest)\n this._loader.on(EVENT.REAL_TIME_SPEED, (data) => {\n this.emit(EVENT.REAL_TIME_SPEED, data)\n })\n }\n\n get isMetaLoaded () {\n return this.videoSegments.length || this.audioSegments.length\n }\n\n setCurrentSegment (segIndex) {\n if (isNumber(segIndex)) {\n this._currentSegmentIndex = segIndex\n }\n }\n\n isLastSegment (segIndex) {\n if (isNumber(segIndex)) {\n const lastIndex = this.videoSegments[this.videoSegments.length - 1]?.index || this.audioSegments[this.audioSegments.length - 1]?.index || 0\n return segIndex >= lastIndex\n }\n\n return false\n }\n\n isSegmentLoading (segIndex) {\n return segIndex === this._currentLoadingSegmentIndex\n }\n\n async changeUrl (url, vid = url, moovEnd, notCancelLoader) {\n await this.reset(notCancelLoader)\n if (url) this.url = url\n if (vid) this.vid = vid\n if (moovEnd) this._config.moovEnd = moovEnd\n }\n\n async getOrLoadMeta (cache) {\n if (!this.isMetaLoaded) await this.loadMeta(cache)\n return this.meta\n }\n\n async loadMetaProcess (cache, [moovStart, moovEnd], onProgress, config) {\n this._error = false\n this.logger.debug('[loadMetaProcess start], range,', [moovStart, moovEnd])\n const OnProgressHandle = async (data, state, options) => {\n if (this.meta && options?.range && options.range.length > 0 && options.range[1] >= moovEnd) {\n state = true\n this.logger.debug('[loadMetaProcess],data done,setstate true,[', moovStart, moovEnd, ']')\n }\n if (state && options?.range && options.range.length > 0 && options.range[1] < moovEnd) {\n state = false // 为了修复state为true但数据还么全部返回的问题\n this.logger.debug('[loadMetaProcess],data not done,setstate false,[', moovStart, moovEnd, ']')\n }\n this.logger.debug('[loadMetaProcess],task,[', moovStart, moovEnd, '], range,', options.range, ',dataLen,', (data ? data.byteLength : undefined), ', state,', state, ',err,',this._error)\n !this._error && data && data.byteLength > 0 && onProgress(data, state, options)\n if (this.meta.moov || this._error) return\n if (data && data.byteLength > 0) {\n this.buffer = concatUint8Array(this.buffer, data)\n let moov = MP4Parser.findBox(this.buffer, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(this.buffer, ['mdat'])[0]\n if (state) {\n if (!mdat) {\n this._error = true\n onProgress(null, state, options, {err:'cannot find moov or mdat box'})\n return\n // throw new MediaError('cannot find moov or mdat box')\n } else {\n const moovStart = mdat.start + mdat.size\n const res = await this.loadData([moovStart, ''], cache, config)\n if (res) {\n moov = MP4Parser.findBox(res.data, ['moov'])[0]\n }\n }\n }\n }\n if (moov && state && moov.size > moov.data.length) {\n this.logger.debug('[loadMetaProcess],moov not all, range,', options.range[1], ',dataLen,', this.buffer.byteLength, ', state,', state)\n await this.loadMetaProcess(cache, [options.range[1], moov.start + moov.size - 1], onProgress)\n }\n if (moov && moov.size <= moov.data.length && !this.meta.moov) {\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse moov box'})\n return\n // throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n\n // 当box存在但不完整时,补全box\n const getCompletedBox = async (name) => {\n const box = MP4Parser.findBox(this.buffer, [name])[0]\n if (box) {\n if (box.size > box.data.length) {\n const res = await this.loadData([box.start, box.start + box.size - 1], cache, config)\n if (res) {\n return MP4Parser.findBox(res.data, [name])[0]\n }\n } else {\n return box\n }\n }\n }\n\n // 现在的分段式range加载逻辑不适用于fmp4,需要判断太多条件\n // 因为fmp4的samples信息存放在moof中,而解析moof的range需要依赖sidx\n // 而sidx和moof的size都是动态的(且sidx不一定存在),导致每个环节都需要判断是否满足解析条件以及对应的兜底处理\n // todo: 后续加载逻辑需要改为【开区间range+主动取消】才能更好的处理fmp4\n let isFragmentMP4 = false\n if (!(segments && segments.videoSegments.length && segments.audioSegments.length)) {\n const sidx = await getCompletedBox('sidx')\n if (sidx) {\n const parsedSidx = MP4Parser.sidx(sidx)\n if (parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx)\n isFragmentMP4 = true\n }\n } else {\n // 无 sidx box 场景,当前架构只能通过模拟加载完整的fmp4来解析出segments,这样会导致fetch加载的数据量特别大,loading时间长\n // 更倾向于使用【开区间range+主动取消】方案异步读取,todo\n }\n }\n\n if (!segments) {\n this._error = true\n onProgress(null, state, options, {err:'cannot parse segments'})\n return\n // throw new MediaError('cannot parse segments', moov.data)\n }\n\n this.meta = moovToMeta(parsedMoov, isFragmentMP4)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[loadMetaProcess] moov ok')\n onProgress(undefined, state, {\n meta: {\n meta: this.meta,\n videoSegments,\n audioSegments\n }\n })\n }\n }\n }\n await this.loadData([moovStart, moovEnd || this._config.moovEnd], cache, { onProgress: OnProgressHandle, ...config})\n }\n\n async loadMeta (cache, moovEnd, config) {\n const responses = []\n this.logger.debug('[loadMeta start]')\n let res = await this.loadData([0, moovEnd || this._config.moovEnd], cache, config)\n if (!res) return\n responses.push(res)\n let moov = MP4Parser.findBox(res.data, ['moov'])[0]\n if (!moov) {\n const mdat = MP4Parser.findBox(res.data, ['mdat'])[0]\n if (!mdat) {\n throw new MediaError('cannot find moov or mdat box', res.data)\n }\n const moovStart = mdat.start + mdat.size\n res = await this.loadData([moovStart], cache, config)\n if (!res) return\n responses.push(res)\n moov = MP4Parser.findBox(res.data, ['moov'], moovStart)[0]\n if (!moov) {\n throw new MediaError('cannot find moov box', res.data)\n }\n }\n if (moov.size > moov.data.length) {\n res = await this.loadData([res.data.length, moov.start + moov.size - 1], cache, config)\n if (!res) return\n responses.push(res)\n moov.data = concatUint8Array(moov.data, res.data)\n }\n const parsedMoov = MP4Parser.moov(moov)\n if (!parsedMoov) {\n throw new MediaError('cannot parse moov box', moov.data)\n }\n\n let segments = moovToSegments(parsedMoov, this._config.segmentDuration)\n if (!segments) {\n throw new MediaError('cannot parse segments', moov.data)\n }\n\n let parsedSidx\n if (!(segments.videoSegments.length && segments.audioSegments.length)) {\n const moof = MP4Parser.findBox(this.buffer, ['moof'])[0]\n const sidx = MP4Parser.findBox(this.buffer, ['sidx'])[0]\n if (moof && moof.size <= moof.data.length && sidx) {\n const parsedMoof = MP4Parser.moof(moof)\n\n parsedSidx = MP4Parser.sidx(sidx)\n if (parsedMoof && parsedSidx) {\n segments = sidxToSegments(parsedMoov, parsedSidx, parsedMoof)\n }\n }\n }\n\n this.meta = moovToMeta(parsedMoov, parsedSidx)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this.logger.debug('[load moov end!!!!!]')\n return {\n meta: this.meta,\n videoSegments,\n audioSegments,\n responses\n }\n }\n\n loadCacheMeta (meta, segmentIndex){\n const { moov } = meta\n const segments = moovToSegments(moov, this._config.segmentDuration)\n const { videoSegments, audioSegments } = segments\n this.videoSegments = videoSegments\n this.audioSegments = audioSegments\n this._currentSegmentIndex = segmentIndex\n this.meta = meta\n }\n\n getSegmentByTime (time) {\n let video\n let audio\n if (!this.videoSegments.length) {\n audio = this.audioSegments.find(x => x.startTime <= time && x.endTime > time)\n } else {\n video = this.videoSegments.find(x => x.startTime <= time && x.endTime > time)\n if (video) {\n audio = this.audioSegments[video.index]\n }\n }\n\n return {\n video,\n audio\n }\n }\n\n async loadSegmentByTime (time, cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(cache)\n }\n const { video, audio } = this.getSegmentByTime(time)\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async loadNextSegment (cache, changeCurrent = true, config = {}) {\n if (!this.isMetaLoaded) {\n await this.loadMeta()\n }\n const video = this.videoSegments[this._currentSegmentIndex + 1]\n const audio = this.audioSegments[this._currentSegmentIndex + 1]\n return this._loadSegment(video, audio, cache, changeCurrent, config)\n }\n\n async preload (time) {\n if (!this.isMetaLoaded) {\n await this.loadMeta(true)\n }\n if (!time || time < 0) return\n const { video, audio } = this.getSegmentByTime(time)\n const index = Math.max(video?.index || 0, audio?.index || 0)\n if (!index) return\n\n const videos = this.videoSegments.slice(0, index)\n const audios = this.audioSegments.slice(0, index)\n\n const load = async (i) => {\n if (i > index) return\n await this._loadSegment(videos[i], audios[i], true, false)\n await load(i + 1)\n }\n\n await load(0)\n }\n\n cancel () {\n return this._loader.cancel()\n }\n\n async reset (notCancelLoader = false) {\n if (!notCancelLoader) {\n this.logger.debug('[MP4loader reset func call loader.cancel]')\n await this._loader.cancel()\n }\n this.vid = this.url = ''\n this.meta = {}\n this.downloadInfo = []\n this.videoSegments = []\n this.audioSegments = []\n this._currentSegmentIndex = -1\n this._currentLoadingSegmentIndex = -1\n }\n\n async destroy () {\n await this.reset()\n // await this.cancel()\n this.cache.clear()\n }\n\n async _loadSegment (video, audio, cache, changeCurrent, config) {\n if (!video && !audio) return\n const segIndex = video?.index || audio?.index || 0\n this._currentLoadingSegmentIndex = segIndex\n let res\n try {\n res = await this.loadData([\n Math.min(video?.range[0] || Infinity, audio?.range[0] || Infinity),\n Math.max(video?.range[1] || 0, audio?.range[1] || 0)\n ], cache, config)\n } finally {\n this._currentLoadingSegmentIndex = -1\n }\n if (!res) return\n\n if (changeCurrent) {\n this._currentSegmentIndex = segIndex\n }\n\n res.video = video\n res.audio = audio\n\n return res\n }\n\n async loadData (range, cache, config) {\n const cacheKey = this._getCacheKey(range)\n const data = await this.cache.get(cacheKey)\n let res\n if (!data) {\n const url = config && config.url ? config.url : this.url\n res = await this._loader.load(url, { range, vid: this.vid, ...config })\n } else {\n res = { data, state: true, options: { fromCache: true, range, vid: this.vid } }\n }\n if (!res) return\n if (!data) {\n res.data && this.downloadInfo.push({\n startTime: res.startTime,\n endTime: res.endTime,\n size: res.data.byteLength,\n range\n })\n if (this.downloadInfo && this.downloadInfo.length > this._config.maxDownloadInfoSize) {\n this.downloadInfo = this.downloadInfo.slice(-this._config.maxDownloadInfoSize)\n }\n }\n\n if (!data && cache) {\n // this.cache.set(cacheKey, res.data)\n }\n\n // res.range = range\n return res\n }\n\n _transformError = (error) => {\n // error.type = 'network'\n return error\n }\n\n _getCacheKey (range) {\n return (this.vid || this.url) + ':' + range\n }\n}\n","export function getConfig (cfg) {\n return {\n vid: '',\n moovEnd: 80000,\n segmentDuration: 2,\n maxDownloadInfoSize: 30,\n responseType: 'arraybuffer',\n cache: null,\n // ...xgplayer-streaming-shared/src/net/config\n ...cfg\n }\n}\n","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, FMP4Demuxer, 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 preferMMS: false\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 preferMMS: this.options.preferMMS,\n openLog: checkOpenLog()\n })\n this.fMP4Demuxer = null\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 if (videoSeg.frames.length === 0) {\n this.log('>>>>>getSubRange video, no frames')\n return range\n }\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 if (audioSeg.frames.length === 0) {\n this.log('>>>>>getSubRange video, no frames')\n return range\n }\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 && !this.meta.isFragmentMP4) { // todo: fmp4 demux worker\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 let demuxRet\n if (this.meta.isFragmentMP4) {\n if (!this.fMP4Demuxer) {\n this.fMP4Demuxer = new FMP4Demuxer()\n }\n demuxRet = this.fMP4Demuxer.demuxPart(buffer, start, this.meta.moov)\n } else {\n if (!this.MP4Demuxer) {\n this.MP4Demuxer = new MP4Demuxer(this.videoTrak, this.audioTrak, null,{openLog: checkOpenLog()})\n }\n demuxRet = this.MP4Demuxer.demuxPart(buffer, start, videoIndexRange, audioIndexRange, this.meta.moov, this.useEME, this.kidValue)\n }\n if (!this.FMP4Remuxer && (!this.checkCodecH265() || this.options.supportHevc)) {\n this.FMP4Remuxer = new FMP4Remuxer(demuxRet.videoTrack, demuxRet.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 if (!frames.length) break\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 if (!frames.length) break\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 preferMMS: 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 hasVideo = !!meta.videoCodec\n const hasAudio = !!meta.audioCodec\n\n let codec\n if (hasVideo && hasAudio) {\n codec = `video/mp4; codecs=\"${meta.videoCodec}, mp4a.40.5\"`\n } else if (hasVideo) {\n codec = `video/mp4; codecs=\"${meta.videoCodec}\"`\n } else {\n codec = 'video/mp4; codecs=\"mp4a.40.5\"'\n }\n\n const contentTypes = { [MSE.VIDEO]: { mimeType: 'video/mp4', codec } }\n\n this.mse = new MSE(null, { preferMMS: this.config.preferMMS })\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,' 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","dts","pts","first","last","test","isVideoEncryption","AudioTrack","sampleDuration","sampleRate","channelCount","config","container","codecType","isAudioEncryption","VideoSample","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","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","combineToFloat","integer","decimal","AAC","rate","FREQ","indexOf","skip","frames","samplingFrequencyIndex","protectionSkipBytes","frameLength","objectType","_AAC$_getConfig","_getConfig","frameIndex","getFrameDuration","remaining","originCodec","_AAC$_getConfig2","samplingIndex","originObjectType","extensionSamplingIndex","NALu","dropZerosLength","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","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","OPUS","dv","byteOffset","magicSignature","fromCodePoint","log","outputGain","getInt16","MAX_SILENT_FRAME_DURATION","AUDIO_EXCEPTION_LOG_EMIT_DURATION","FlvFixer","videoTrack","audioTrack","metadataTrack","_baseDts","_baseDtsInited","_audioNextPts","_videoNextDts","_audioTimestampBreak","_videoTimestampBreak","_lastVideoDuration","_keyFrameInNextChunk","_lastAudioExceptionGapDot","Infinity","_lastAudioExceptionOverlapDot","_lastAudioExceptionLargeGapDot","_lastVideoExceptionLargeGapDot","_lastVideoExceptionChunkFirstDtsDot","_this","startTime","discontinuity","contiguous","round","_videoLastSample","_calculateBaseDts","resetBaseDts","exist","_resetBaseDtsWhenStreamBreaked","_fixAudio","_fixVideo","s","time","_this2","refSampleDurationInt","x","lastSample","pop","unshift","samp0","firstSample","vDelta","abs","_samples$","nextDts","firstSampleDts","nextSampleDts","nextSample","refSampleDuration","_this3","_doFixAudioInternal","audioSamps","videoSamps","audioBasePts","videoBaseDts","baseDts","delta","isFinite","G711PCMA","_getG711Duration","error","sampleDurationInSampleRate","nextPts","sample","silentFrame","_getSilentFrame","silentSample","splice","track","sampleSize","getSilentFrame","AMF","ret","_parseValue","view","isEnd","getUint8","getFloat64","_AMF$_parseString","_parseString","terminal","_AMF$_parseObject","_parseObject","_terminal","_AMF$_parseObject2","strictArrayLength","_AMF$_parseValue","timestamp","Date","decode","getUint16","FlvSoundFormat","logger","FlvDemuxer","_fixer","_scriptDataObject$dat","seamlessLoadingSwitching","_remainingData","_headerParsed","reset","probe","tagType","dataSize","bodyData","prevTagSize","_parseAudio","_parseVideo","_parseScript","formatTimescale","hasSample","scriptDataObject","metaData","onMetaData","fix","demux","format","soundRate","soundSize","soundType","AUDIO_RATE","G711A","_parseG711","_parseAac","_parseOpus","packetType","parseHeaderPackets","newSample","audioData","parseAudioSpecificConfig","sampleRateIndex","frameType","codecId","cts","configData","parseHEVCDecoderConfigurationRecord","parseAVCDecoderConfigurationRecord","parseAvcC","_checkAddMetaNalToUnits","lastKeyFrameDts","setToKeyframe","parseSEI","_gopId","gopId","hevc","_needAddMetaBeforeKeyFrameNal","ByteReader","buf","byteNum","getFloat32","getInt8","getInt32","back","read","setUint8","setUint16","setUint32","uint8","unreadLength","str","v","concatUint8s","BitReader","byte","MP4Parser","headerSize","subData","findBox","box","parseBox","trackId","baseDataOffsetPresent","flags","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","baseDataOffset","sampleDescriptionIndex","defaultSampleDuration","defaultSampleSize","defaultSampleFlags","reference_ID","version","earliest_presentation_time","first_offset","references","ref","tmp32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","mvhd","trak","pssh","nextTrackId","tkhd","mdia","fromUint8","matrix","int32","caculatedMatrix","readInt","rotation","scaled0","hypot","scaled1","atan2","PI","toDegree","mdhd","hdlr","minf","lang","language","handlerType","vmhd","smhd","stbl","graphicsmode","opcolor","balance","_ret$stsd$entries$","_ret$stsd$entries$$si","_ret$stsd$entries$$si2","stsd","stts","ctts","stsc","stsz","stco","co64","default_IV_size","entries","sinf","schi","tenc","stss","senc","sampleCount","InitializationVector","subsamples","subsampleCount","subsample","BytesOfClearData","BytesOfProtectedData","keyIds","systemId","toHex","numKeyIds","keyId","data_size","kid","system_id","entryCount","b","av01","avc1","hvc1","mp4a","alaw","samplesize","esds","horizresolution","vertresolution","avcC","pasp","default_IsEncrypted","default_KID","frma","data_format","colorType","readString","colorPrimaries","transferCharacteristics","matrixCoefficients","fullRangeFlag","iccProfile","readToUint8","bodyStart","parseVisualSampleEntry","av1C","colr","bitdepth","bit","fromByte","marker","seqProfile","seqLevelIdx0","seqTier0","highBitdepth","twelveBit","monochrome","chromaSubsamplingX","chromaSubsamplingY","chromaSamplePosition","reserved","initialPresentationDelayPresent","initialPresentationDelayMinusOne","configOBUs","configurationVersion","AVCProfileIndication","AVCLevelIndication","lengthSizeMinusOne","spsLength","ppsLength","tmp","generalProfileCompatibility","avgFrameRate","_ret$vps","nalus","_ret$sps","_ret$pps","hSpacing","vSpacing","parseAudioSampleEntry","byteRead","tag","substring","padStart","firstChunk","samplesPerChunk","entrySizes","mfhd","traf","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","_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","pad","charstr","maxlen","chars","r","hex","FMP4Demuxer","partData","partDataStart","videoExist","audioExist","isAV01","dataStart","__lastRemainData","lastRemainDataEnd","__lastRemainDataStart","noDuplicateData","__nextMoofStart","moovBox","dataEnd","moovToTrack","moofBoxes","moofBox","_toConsumableArray","w","__loadedMoofWraps","nextMoofStart","sort","n","_createForOfIteratorHelper","_loop","moofWrap","moofStart","moofToSamples","videoBaseMediaDecodeTime","audioBaseMediaDecodeTime","keys","k","some","xStart","sampleData","e","f","videoData","baseOffset","Concat","Buffer","self","_len2","_key2","UINT32_MAX","MP4","FTYPHEV1","FTYPAVC1","init","ftyp","content","types","mvex","HDLR_TYPES","VMHD","SMHD","DINF","extBox","STTS","STSC","STSZ","STCO","opus","avc1hev1","_concat$concat","avcc","btrt","charCodeAt","schm","typ","boxes","fiel","_concat$concat2","ArrayBuffer","pcf","cif","write","_ref4","_slicedToArray","opusAudioDescription","opusSpecificConfig","dOps","Opus","trex","sencLength","isVideo","videoSencLength","saiz","saio","trun1","sbgp","sdtp","extension","writeUint32","samplesLength","writeUint16","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","sampleLen","_samples$i","_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","_console3","_len3","_key3","_console4","_len4","_key4","_console5","group","table","groupEnd","FMP4Remuxer","options","browserVersions","exec","forceFirstIDR","openLog","createInit","videoInitSegment","audioInitSegment","initSegment","videoSegment","audioSegment","hasVideo","hasAudio","initMerge","_remuxVideo","_remuxAudio","mdata","mdatView","_offset2","_sample2","u","_offset","_sample","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","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","decoderAESCTRData","customDescryptHandler","sencBox","encodeWord","encodeBuffers","decodeBuffers","tempBuffer","decrypted","clearDataBuf","protectedDataLen","decodeProtectedData","dec","MP4Demuxer","videoSegmnents","audioSegmnents","_this$_videoSamples","_videoSamples","_this$_audioSamples","_audioSamples","moovToSamples","videoIndexRange","audioIndexRange","parseSamples","startByte","frame","_lastRemainBuffer","_lastRemainBufferStartPos","tryCnt","temp","errorMessage","videoEndByte","audioEndByte","startPts","endPts","decoderData","buffered","maxHole","buffers","bufLen","lastEnd","nextStart","nextEnd","prevStart","prevEnd","currentTime","behind","media","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","MSE_CHANGE_TYPE","OPTION","DASH","LICENSE","CUSTOM_LICENSE","MSE_HIJACK","EME_HIJACK","SIDX","NO_CANPLAY_ERROR","BUFFERBREAK_ERROR","WAITING_TIMEOUT_ERROR","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MEDIA_ERR_CODEC_NOT_SUPPORTED","MEDIA_ERR_URL_EMPTY","ERR_CODE","_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","nowTime","text","_len5","logText","_key5","finLogText","logable","JSON","delLog","toLocaleString","reduceDepth","_typeof","objType","maxDepth","createPublicPromise","res","rej","promise","Promise","resolve","reject","used","performance","now","getTime","SafeJSON","getMediaSource","preferMMS","ManagedMediaSource","MediaSource","isMMS","mediaSource","OP_NAME","MSE","_logger","queue","_queue","op","opName","_this2$_sourceBuffer$","_op$context","costtime","_opst","ranges","TimeRanges","getTimeRanges","_sourceBuffer","callback","_startQueue","_config","getDefaultConfig","bindMedia","_enqueueBlockingOp2","_unbindMedia","_bindMedia","_this$mediaSource","readyState","_url","_this$mediaSource2","streaming","_mseFullFlag","VIDEO","isReduceDuration","bufferEnd","_enqueueBlockingOp","isEnded","_openPromise","isOpened","ms","addEventListener","onOpen","costTime","_st","removeEventListener","_asyncToGenerator","_regeneratorRuntime","mark","_callee","useMMS","_this6","wrap","_context","prev","unbindMedia","revokeObjectURL","src","_onStartStreaming","_onEndStreaming","URL","createObjectURL","disableRemotePlayback","abrupt","stop","_x","_callee2","hasMetadata","mseOpen","_this7","_context2","_x$promise","_x$promise$resolve","endOfStream","removeSourceBuffer","removeAttribute","load","mimeType","sb","addSourceBuffer","_onSBUpdateEnd","bind","_onSBUpdateError","_this8","changeType","_enqueueOp","createSource","_this9","_this9$_sourceBuffer$","appendBuffer","endTime","_this10","isInsertHead","remove","_this11","_this12","allClear","_this$_queue$type","initQueue","isinit","reason","_this13","setLiveSeekableRange","_this14","then","_callee3","waiters","_this15","_context3","prom","all","updating","_x2","_x3","_x4","_op$promise","_op$promise2","isFull","timestampOffset","_this16","_this17","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","milliSecond","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","speed","_response","ok","sent","json","_loadChunk","arrayBuffer","catch","_error","_reader","st","getReader","_cache","_writeIdx","reader","pump","_this3$_range","startRange","curLen","retData","_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","getAllResponseHeaders","trim","split","parts","toLowerCase","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","sidxToSegments","audioSegments","videoSegments","segments","prevTime","prevOffset","_videoTrack$mdia","_audioTrack$mdia","getTrakSegments","moovToSegments","segmentDurations","_videoTrack$mdia2","_videoTrack$mdia2$min","_videoTrack$mdia$mdhd","getSegments","_audioTrack$mdia2","_audioTrack$mdia2$min","_audioTrack$mdia$mdhd","segDuration","_stscEntries$","gop","gopDuration","lastFrame","segFrames","adjust","pushSegment","_segments2","_segFrames","curTime","moovToMeta","isFragmentMP4","videoCodec","audioCodec","audioChannelCount","audioSampleRate","videoTimescale","audioTimescale","defaultKID","_videoTrack$mdia3","_videoTrack$mdia3$min","_videoTrack$mdia3$min2","_videoTrack$mdia4","_videoTrack$mdia4$mdh","_audioTrack$mdia3","_audioTrack$mdia3$min","_audioTrack$mdia3$min2","_e1$esds","_audioTrack$mdia4","_audioTrack$mdia4$mdh","_t$mdia5","_t$mdia5$hdlr","_t$mdia6","_t$mdia6$hdlr","isNumber","MP4Loader","_loadData","_loadSegment2","_destroy","_reset","_preload","_loadNextSegment","_loadSegmentByTime","_loadMeta","_loadMetaProcess","_getOrLoadMeta","_changeUrl","moovEnd","segmentDuration","maxDownloadInfoSize","_transformError","segIndex","_currentSegmentIndex","_this$videoSegments","_this$audioSegments","_currentLoadingSegmentIndex","notCancelLoader","_args","isMetaLoaded","loadMeta","meta","_callee5","moovStart","OnProgressHandle","_context5","_callee4","state","_moovStart","parsedMoov","getCompletedBox","parsedSidx","_segments","_context4","loadData","loadMetaProcess","_res","_x10","_x7","_x8","_x9","_x5","_x6","_callee6","responses","parsedMoof","_context6","_x11","_x12","_x13","segmentIndex","_callee7","changeCurrent","_this$getSegmentByTim","_args7","_context7","getSegmentByTime","_loadSegment","loadSegmentByTime","_x14","_x15","_callee8","_args8","_context8","_x16","_callee10","_this$getSegmentByTim2","videos","audios","_context10","_callee9","_context9","_x18","_x17","_callee11","_args11","_context11","downloadInfo","_callee12","_context12","clear","_callee13","_context13","finish","_x19","_x20","_x21","_x22","_x23","_callee14","cacheKey","_context14","_getCacheKey","fromCache","_x24","_x25","_x26","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","fMP4Demuxer","_needInitSegment","_switchBitRate","enableWorker","Worker","workerSequence","transmuxerWorkerControl","muxRes","seekTime","changeBitRateTime","bitRateInfo","changeUrl","newMessage","errorHandler","getMetaInfo","isLoading","isEmitMetaEvent","startPos","onProgressHandle","_args6","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","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","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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"}
|