forked from obvtiger/repiped
22521 lines
807 KiB
JavaScript
22521 lines
807 KiB
JavaScript
!(function t(e) {
|
|
var r, i;
|
|
(r = this),
|
|
(i = function () {
|
|
"use strict";
|
|
function r(t, e) {
|
|
var r = Object.keys(t);
|
|
if (Object.getOwnPropertySymbols) {
|
|
var i = Object.getOwnPropertySymbols(t);
|
|
e &&
|
|
(i = i.filter(function (e) {
|
|
return Object.getOwnPropertyDescriptor(t, e).enumerable;
|
|
})),
|
|
r.push.apply(r, i);
|
|
}
|
|
return r;
|
|
}
|
|
function i(t) {
|
|
for (var e = 1; e < arguments.length; e++) {
|
|
var i = null != arguments[e] ? arguments[e] : {};
|
|
e % 2
|
|
? r(Object(i), !0).forEach(function (e) {
|
|
s(t, e, i[e]);
|
|
})
|
|
: Object.getOwnPropertyDescriptors
|
|
? Object.defineProperties(t, Object.getOwnPropertyDescriptors(i))
|
|
: r(Object(i)).forEach(function (e) {
|
|
Object.defineProperty(
|
|
t,
|
|
e,
|
|
Object.getOwnPropertyDescriptor(i, e)
|
|
);
|
|
});
|
|
}
|
|
return t;
|
|
}
|
|
function n(t, e) {
|
|
for (var r = 0; r < e.length; r++) {
|
|
var i = e[r];
|
|
(i.enumerable = i.enumerable || !1),
|
|
(i.configurable = !0),
|
|
"value" in i && (i.writable = !0),
|
|
Object.defineProperty(t, m(i.key), i);
|
|
}
|
|
}
|
|
function a(t, e, r) {
|
|
return (
|
|
e && n(t.prototype, e),
|
|
r && n(t, r),
|
|
Object.defineProperty(t, "prototype", { writable: !1 }),
|
|
t
|
|
);
|
|
}
|
|
function s(t, e, r) {
|
|
return (
|
|
(e = m(e)) in t
|
|
? Object.defineProperty(t, e, {
|
|
value: r,
|
|
enumerable: !0,
|
|
configurable: !0,
|
|
writable: !0,
|
|
})
|
|
: (t[e] = r),
|
|
t
|
|
);
|
|
}
|
|
function o() {
|
|
return (
|
|
(o = Object.assign
|
|
? Object.assign.bind()
|
|
: function (t) {
|
|
for (var e = 1; e < arguments.length; e++) {
|
|
var r = arguments[e];
|
|
for (var i in r)
|
|
Object.prototype.hasOwnProperty.call(r, i) && (t[i] = r[i]);
|
|
}
|
|
return t;
|
|
}),
|
|
o.apply(this, arguments)
|
|
);
|
|
}
|
|
function l(t, e) {
|
|
(t.prototype = Object.create(e.prototype)),
|
|
(t.prototype.constructor = t),
|
|
h(t, e);
|
|
}
|
|
function u(t) {
|
|
return (
|
|
(u = Object.setPrototypeOf
|
|
? Object.getPrototypeOf.bind()
|
|
: function (t) {
|
|
return t.__proto__ || Object.getPrototypeOf(t);
|
|
}),
|
|
u(t)
|
|
);
|
|
}
|
|
function h(t, e) {
|
|
return (
|
|
(h = Object.setPrototypeOf
|
|
? Object.setPrototypeOf.bind()
|
|
: function (t, e) {
|
|
return (t.__proto__ = e), t;
|
|
}),
|
|
h(t, e)
|
|
);
|
|
}
|
|
function d() {
|
|
if ("undefined" == typeof Reflect || !Reflect.construct) return !1;
|
|
if (Reflect.construct.sham) return !1;
|
|
if ("function" == typeof Proxy) return !0;
|
|
try {
|
|
return (
|
|
Boolean.prototype.valueOf.call(
|
|
Reflect.construct(Boolean, [], function () {})
|
|
),
|
|
!0
|
|
);
|
|
} catch (t) {
|
|
return !1;
|
|
}
|
|
}
|
|
function c(t, e, r) {
|
|
return (
|
|
(c = d()
|
|
? Reflect.construct.bind()
|
|
: function (t, e, r) {
|
|
var i = [null];
|
|
i.push.apply(i, e);
|
|
var n = new (Function.bind.apply(t, i))();
|
|
return r && h(n, r.prototype), n;
|
|
}),
|
|
c.apply(null, arguments)
|
|
);
|
|
}
|
|
function f(t) {
|
|
var e = "function" == typeof Map ? new Map() : void 0;
|
|
return (
|
|
(f = function (t) {
|
|
if (
|
|
null === t ||
|
|
((r = t),
|
|
-1 === Function.toString.call(r).indexOf("[native code]"))
|
|
)
|
|
return t;
|
|
var r;
|
|
if ("function" != typeof t)
|
|
throw new TypeError(
|
|
"Super expression must either be null or a function"
|
|
);
|
|
if (void 0 !== e) {
|
|
if (e.has(t)) return e.get(t);
|
|
e.set(t, i);
|
|
}
|
|
function i() {
|
|
return c(t, arguments, u(this).constructor);
|
|
}
|
|
return (
|
|
(i.prototype = Object.create(t.prototype, {
|
|
constructor: {
|
|
value: i,
|
|
enumerable: !1,
|
|
writable: !0,
|
|
configurable: !0,
|
|
},
|
|
})),
|
|
h(i, t)
|
|
);
|
|
}),
|
|
f(t)
|
|
);
|
|
}
|
|
function g(t, e) {
|
|
(null == e || e > t.length) && (e = t.length);
|
|
for (var r = 0, i = new Array(e); r < e; r++) i[r] = t[r];
|
|
return i;
|
|
}
|
|
function v(t, e) {
|
|
var r =
|
|
("undefined" != typeof Symbol && t[Symbol.iterator]) ||
|
|
t["@@iterator"];
|
|
if (r) return (r = r.call(t)).next.bind(r);
|
|
if (
|
|
Array.isArray(t) ||
|
|
(r = (function (t, e) {
|
|
if (t) {
|
|
if ("string" == typeof t) return g(t, e);
|
|
var r = Object.prototype.toString.call(t).slice(8, -1);
|
|
return (
|
|
"Object" === r && t.constructor && (r = t.constructor.name),
|
|
"Map" === r || "Set" === r
|
|
? Array.from(t)
|
|
: "Arguments" === r ||
|
|
/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)
|
|
? g(t, e)
|
|
: void 0
|
|
);
|
|
}
|
|
})(t)) ||
|
|
(e && t && "number" == typeof t.length)
|
|
) {
|
|
r && (t = r);
|
|
var i = 0;
|
|
return function () {
|
|
return i >= t.length ? { done: !0 } : { done: !1, value: t[i++] };
|
|
};
|
|
}
|
|
throw new TypeError(
|
|
"Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."
|
|
);
|
|
}
|
|
function m(t) {
|
|
var e = (function (t, e) {
|
|
if ("object" != typeof t || null === t) return t;
|
|
var r = t[Symbol.toPrimitive];
|
|
if (void 0 !== r) {
|
|
var i = r.call(t, e || "default");
|
|
if ("object" != typeof i) return i;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return ("string" === e ? String : Number)(t);
|
|
})(t, "string");
|
|
return "symbol" == typeof e ? e : String(e);
|
|
}
|
|
function p(t) {
|
|
return t &&
|
|
t.__esModule &&
|
|
Object.prototype.hasOwnProperty.call(t, "default")
|
|
? t.default
|
|
: t;
|
|
}
|
|
var y = { exports: {} };
|
|
!(function (t, e) {
|
|
var r, i, n, a, s;
|
|
(r =
|
|
/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/),
|
|
(i = /^(?=([^\/?#]*))\1([^]*)$/),
|
|
(n = /(?:\/|^)\.(?=\/)/g),
|
|
(a = /(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g),
|
|
(s = {
|
|
buildAbsoluteURL: function (t, e, r) {
|
|
if (((r = r || {}), (t = t.trim()), !(e = e.trim()))) {
|
|
if (!r.alwaysNormalize) return t;
|
|
var n = s.parseURL(t);
|
|
if (!n) throw new Error("Error trying to parse base URL.");
|
|
return (
|
|
(n.path = s.normalizePath(n.path)), s.buildURLFromParts(n)
|
|
);
|
|
}
|
|
var a = s.parseURL(e);
|
|
if (!a) throw new Error("Error trying to parse relative URL.");
|
|
if (a.scheme)
|
|
return r.alwaysNormalize
|
|
? ((a.path = s.normalizePath(a.path)), s.buildURLFromParts(a))
|
|
: e;
|
|
var o = s.parseURL(t);
|
|
if (!o) throw new Error("Error trying to parse base URL.");
|
|
if (!o.netLoc && o.path && "/" !== o.path[0]) {
|
|
var l = i.exec(o.path);
|
|
(o.netLoc = l[1]), (o.path = l[2]);
|
|
}
|
|
o.netLoc && !o.path && (o.path = "/");
|
|
var u = {
|
|
scheme: o.scheme,
|
|
netLoc: a.netLoc,
|
|
path: null,
|
|
params: a.params,
|
|
query: a.query,
|
|
fragment: a.fragment,
|
|
};
|
|
if (!a.netLoc && ((u.netLoc = o.netLoc), "/" !== a.path[0]))
|
|
if (a.path) {
|
|
var h = o.path,
|
|
d = h.substring(0, h.lastIndexOf("/") + 1) + a.path;
|
|
u.path = s.normalizePath(d);
|
|
} else
|
|
(u.path = o.path),
|
|
a.params ||
|
|
((u.params = o.params), a.query || (u.query = o.query));
|
|
return (
|
|
null === u.path &&
|
|
(u.path = r.alwaysNormalize
|
|
? s.normalizePath(a.path)
|
|
: a.path),
|
|
s.buildURLFromParts(u)
|
|
);
|
|
},
|
|
parseURL: function (t) {
|
|
var e = r.exec(t);
|
|
return e
|
|
? {
|
|
scheme: e[1] || "",
|
|
netLoc: e[2] || "",
|
|
path: e[3] || "",
|
|
params: e[4] || "",
|
|
query: e[5] || "",
|
|
fragment: e[6] || "",
|
|
}
|
|
: null;
|
|
},
|
|
normalizePath: function (t) {
|
|
for (
|
|
t = t.split("").reverse().join("").replace(n, "");
|
|
t.length !== (t = t.replace(a, "")).length;
|
|
|
|
);
|
|
return t.split("").reverse().join("");
|
|
},
|
|
buildURLFromParts: function (t) {
|
|
return (
|
|
t.scheme + t.netLoc + t.path + t.params + t.query + t.fragment
|
|
);
|
|
},
|
|
}),
|
|
(t.exports = s);
|
|
})(y);
|
|
var T = y.exports,
|
|
E =
|
|
Number.isFinite ||
|
|
function (t) {
|
|
return "number" == typeof t && isFinite(t);
|
|
},
|
|
S = (function (t) {
|
|
return (
|
|
(t.MEDIA_ATTACHING = "hlsMediaAttaching"),
|
|
(t.MEDIA_ATTACHED = "hlsMediaAttached"),
|
|
(t.MEDIA_DETACHING = "hlsMediaDetaching"),
|
|
(t.MEDIA_DETACHED = "hlsMediaDetached"),
|
|
(t.BUFFER_RESET = "hlsBufferReset"),
|
|
(t.BUFFER_CODECS = "hlsBufferCodecs"),
|
|
(t.BUFFER_CREATED = "hlsBufferCreated"),
|
|
(t.BUFFER_APPENDING = "hlsBufferAppending"),
|
|
(t.BUFFER_APPENDED = "hlsBufferAppended"),
|
|
(t.BUFFER_EOS = "hlsBufferEos"),
|
|
(t.BUFFER_FLUSHING = "hlsBufferFlushing"),
|
|
(t.BUFFER_FLUSHED = "hlsBufferFlushed"),
|
|
(t.MANIFEST_LOADING = "hlsManifestLoading"),
|
|
(t.MANIFEST_LOADED = "hlsManifestLoaded"),
|
|
(t.MANIFEST_PARSED = "hlsManifestParsed"),
|
|
(t.LEVEL_SWITCHING = "hlsLevelSwitching"),
|
|
(t.LEVEL_SWITCHED = "hlsLevelSwitched"),
|
|
(t.LEVEL_LOADING = "hlsLevelLoading"),
|
|
(t.LEVEL_LOADED = "hlsLevelLoaded"),
|
|
(t.LEVEL_UPDATED = "hlsLevelUpdated"),
|
|
(t.LEVEL_PTS_UPDATED = "hlsLevelPtsUpdated"),
|
|
(t.LEVELS_UPDATED = "hlsLevelsUpdated"),
|
|
(t.AUDIO_TRACKS_UPDATED = "hlsAudioTracksUpdated"),
|
|
(t.AUDIO_TRACK_SWITCHING = "hlsAudioTrackSwitching"),
|
|
(t.AUDIO_TRACK_SWITCHED = "hlsAudioTrackSwitched"),
|
|
(t.AUDIO_TRACK_LOADING = "hlsAudioTrackLoading"),
|
|
(t.AUDIO_TRACK_LOADED = "hlsAudioTrackLoaded"),
|
|
(t.SUBTITLE_TRACKS_UPDATED = "hlsSubtitleTracksUpdated"),
|
|
(t.SUBTITLE_TRACKS_CLEARED = "hlsSubtitleTracksCleared"),
|
|
(t.SUBTITLE_TRACK_SWITCH = "hlsSubtitleTrackSwitch"),
|
|
(t.SUBTITLE_TRACK_LOADING = "hlsSubtitleTrackLoading"),
|
|
(t.SUBTITLE_TRACK_LOADED = "hlsSubtitleTrackLoaded"),
|
|
(t.SUBTITLE_FRAG_PROCESSED = "hlsSubtitleFragProcessed"),
|
|
(t.CUES_PARSED = "hlsCuesParsed"),
|
|
(t.NON_NATIVE_TEXT_TRACKS_FOUND = "hlsNonNativeTextTracksFound"),
|
|
(t.INIT_PTS_FOUND = "hlsInitPtsFound"),
|
|
(t.FRAG_LOADING = "hlsFragLoading"),
|
|
(t.FRAG_LOAD_EMERGENCY_ABORTED = "hlsFragLoadEmergencyAborted"),
|
|
(t.FRAG_LOADED = "hlsFragLoaded"),
|
|
(t.FRAG_DECRYPTED = "hlsFragDecrypted"),
|
|
(t.FRAG_PARSING_INIT_SEGMENT = "hlsFragParsingInitSegment"),
|
|
(t.FRAG_PARSING_USERDATA = "hlsFragParsingUserdata"),
|
|
(t.FRAG_PARSING_METADATA = "hlsFragParsingMetadata"),
|
|
(t.FRAG_PARSED = "hlsFragParsed"),
|
|
(t.FRAG_BUFFERED = "hlsFragBuffered"),
|
|
(t.FRAG_CHANGED = "hlsFragChanged"),
|
|
(t.FPS_DROP = "hlsFpsDrop"),
|
|
(t.FPS_DROP_LEVEL_CAPPING = "hlsFpsDropLevelCapping"),
|
|
(t.ERROR = "hlsError"),
|
|
(t.DESTROYING = "hlsDestroying"),
|
|
(t.KEY_LOADING = "hlsKeyLoading"),
|
|
(t.KEY_LOADED = "hlsKeyLoaded"),
|
|
(t.LIVE_BACK_BUFFER_REACHED = "hlsLiveBackBufferReached"),
|
|
(t.BACK_BUFFER_REACHED = "hlsBackBufferReached"),
|
|
t
|
|
);
|
|
})({}),
|
|
L = (function (t) {
|
|
return (
|
|
(t.NETWORK_ERROR = "networkError"),
|
|
(t.MEDIA_ERROR = "mediaError"),
|
|
(t.KEY_SYSTEM_ERROR = "keySystemError"),
|
|
(t.MUX_ERROR = "muxError"),
|
|
(t.OTHER_ERROR = "otherError"),
|
|
t
|
|
);
|
|
})({}),
|
|
R = (function (t) {
|
|
return (
|
|
(t.KEY_SYSTEM_NO_KEYS = "keySystemNoKeys"),
|
|
(t.KEY_SYSTEM_NO_ACCESS = "keySystemNoAccess"),
|
|
(t.KEY_SYSTEM_NO_SESSION = "keySystemNoSession"),
|
|
(t.KEY_SYSTEM_NO_CONFIGURED_LICENSE =
|
|
"keySystemNoConfiguredLicense"),
|
|
(t.KEY_SYSTEM_LICENSE_REQUEST_FAILED =
|
|
"keySystemLicenseRequestFailed"),
|
|
(t.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED =
|
|
"keySystemServerCertificateRequestFailed"),
|
|
(t.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED =
|
|
"keySystemServerCertificateUpdateFailed"),
|
|
(t.KEY_SYSTEM_SESSION_UPDATE_FAILED =
|
|
"keySystemSessionUpdateFailed"),
|
|
(t.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED =
|
|
"keySystemStatusOutputRestricted"),
|
|
(t.KEY_SYSTEM_STATUS_INTERNAL_ERROR =
|
|
"keySystemStatusInternalError"),
|
|
(t.MANIFEST_LOAD_ERROR = "manifestLoadError"),
|
|
(t.MANIFEST_LOAD_TIMEOUT = "manifestLoadTimeOut"),
|
|
(t.MANIFEST_PARSING_ERROR = "manifestParsingError"),
|
|
(t.MANIFEST_INCOMPATIBLE_CODECS_ERROR =
|
|
"manifestIncompatibleCodecsError"),
|
|
(t.LEVEL_EMPTY_ERROR = "levelEmptyError"),
|
|
(t.LEVEL_LOAD_ERROR = "levelLoadError"),
|
|
(t.LEVEL_LOAD_TIMEOUT = "levelLoadTimeOut"),
|
|
(t.LEVEL_PARSING_ERROR = "levelParsingError"),
|
|
(t.LEVEL_SWITCH_ERROR = "levelSwitchError"),
|
|
(t.AUDIO_TRACK_LOAD_ERROR = "audioTrackLoadError"),
|
|
(t.AUDIO_TRACK_LOAD_TIMEOUT = "audioTrackLoadTimeOut"),
|
|
(t.SUBTITLE_LOAD_ERROR = "subtitleTrackLoadError"),
|
|
(t.SUBTITLE_TRACK_LOAD_TIMEOUT = "subtitleTrackLoadTimeOut"),
|
|
(t.FRAG_LOAD_ERROR = "fragLoadError"),
|
|
(t.FRAG_LOAD_TIMEOUT = "fragLoadTimeOut"),
|
|
(t.FRAG_DECRYPT_ERROR = "fragDecryptError"),
|
|
(t.FRAG_PARSING_ERROR = "fragParsingError"),
|
|
(t.FRAG_GAP = "fragGap"),
|
|
(t.REMUX_ALLOC_ERROR = "remuxAllocError"),
|
|
(t.KEY_LOAD_ERROR = "keyLoadError"),
|
|
(t.KEY_LOAD_TIMEOUT = "keyLoadTimeOut"),
|
|
(t.BUFFER_ADD_CODEC_ERROR = "bufferAddCodecError"),
|
|
(t.BUFFER_INCOMPATIBLE_CODECS_ERROR =
|
|
"bufferIncompatibleCodecsError"),
|
|
(t.BUFFER_APPEND_ERROR = "bufferAppendError"),
|
|
(t.BUFFER_APPENDING_ERROR = "bufferAppendingError"),
|
|
(t.BUFFER_STALLED_ERROR = "bufferStalledError"),
|
|
(t.BUFFER_FULL_ERROR = "bufferFullError"),
|
|
(t.BUFFER_SEEK_OVER_HOLE = "bufferSeekOverHole"),
|
|
(t.BUFFER_NUDGE_ON_STALL = "bufferNudgeOnStall"),
|
|
(t.INTERNAL_EXCEPTION = "internalException"),
|
|
(t.INTERNAL_ABORTED = "aborted"),
|
|
(t.UNKNOWN = "unknown"),
|
|
t
|
|
);
|
|
})({}),
|
|
A = function () {},
|
|
k = { trace: A, debug: A, log: A, warn: A, info: A, error: A },
|
|
b = k;
|
|
function D(t) {
|
|
var e = self.console[t];
|
|
return e ? e.bind(self.console, "[" + t + "] >") : A;
|
|
}
|
|
function I(t, e) {
|
|
if ((self.console && !0 === t) || "object" == typeof t) {
|
|
!(function (t) {
|
|
for (
|
|
var e = arguments.length, r = new Array(e > 1 ? e - 1 : 0), i = 1;
|
|
i < e;
|
|
i++
|
|
)
|
|
r[i - 1] = arguments[i];
|
|
r.forEach(function (e) {
|
|
b[e] = t[e] ? t[e].bind(t) : D(e);
|
|
});
|
|
})(t, "debug", "log", "info", "warn", "error");
|
|
try {
|
|
b.log(
|
|
'Debug logs enabled for "' + e + '" in hls.js version 1.4.12'
|
|
);
|
|
} catch (t) {
|
|
b = k;
|
|
}
|
|
} else b = k;
|
|
}
|
|
var w = b,
|
|
C = /^(\d+)x(\d+)$/,
|
|
_ = /(.+?)=(".*?"|.*?)(?:,|$)/g,
|
|
P = (function () {
|
|
function t(e) {
|
|
for (var r in ("string" == typeof e && (e = t.parseAttrList(e)), e))
|
|
e.hasOwnProperty(r) &&
|
|
("X-" === r.substring(0, 2) &&
|
|
((this.clientAttrs = this.clientAttrs || []),
|
|
this.clientAttrs.push(r)),
|
|
(this[r] = e[r]));
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.decimalInteger = function (t) {
|
|
var e = parseInt(this[t], 10);
|
|
return e > Number.MAX_SAFE_INTEGER ? 1 / 0 : e;
|
|
}),
|
|
(e.hexadecimalInteger = function (t) {
|
|
if (this[t]) {
|
|
var e = (this[t] || "0x").slice(2);
|
|
e = (1 & e.length ? "0" : "") + e;
|
|
for (
|
|
var r = new Uint8Array(e.length / 2), i = 0;
|
|
i < e.length / 2;
|
|
i++
|
|
)
|
|
r[i] = parseInt(e.slice(2 * i, 2 * i + 2), 16);
|
|
return r;
|
|
}
|
|
return null;
|
|
}),
|
|
(e.hexadecimalIntegerAsNumber = function (t) {
|
|
var e = parseInt(this[t], 16);
|
|
return e > Number.MAX_SAFE_INTEGER ? 1 / 0 : e;
|
|
}),
|
|
(e.decimalFloatingPoint = function (t) {
|
|
return parseFloat(this[t]);
|
|
}),
|
|
(e.optionalFloat = function (t, e) {
|
|
var r = this[t];
|
|
return r ? parseFloat(r) : e;
|
|
}),
|
|
(e.enumeratedString = function (t) {
|
|
return this[t];
|
|
}),
|
|
(e.bool = function (t) {
|
|
return "YES" === this[t];
|
|
}),
|
|
(e.decimalResolution = function (t) {
|
|
var e = C.exec(this[t]);
|
|
if (null !== e)
|
|
return {
|
|
width: parseInt(e[1], 10),
|
|
height: parseInt(e[2], 10),
|
|
};
|
|
}),
|
|
(t.parseAttrList = function (t) {
|
|
var e,
|
|
r = {};
|
|
for (_.lastIndex = 0; null !== (e = _.exec(t)); ) {
|
|
var i = e[2];
|
|
0 === i.indexOf('"') &&
|
|
i.lastIndexOf('"') === i.length - 1 &&
|
|
(i = i.slice(1, -1)),
|
|
(r[e[1].trim()] = i);
|
|
}
|
|
return r;
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function x(t) {
|
|
return "SCTE35-OUT" === t || "SCTE35-IN" === t;
|
|
}
|
|
var F = (function () {
|
|
function t(t, e) {
|
|
if (
|
|
((this.attr = void 0),
|
|
(this._startDate = void 0),
|
|
(this._endDate = void 0),
|
|
(this._badValueForSameId = void 0),
|
|
e)
|
|
) {
|
|
var r = e.attr;
|
|
for (var i in r)
|
|
if (
|
|
Object.prototype.hasOwnProperty.call(t, i) &&
|
|
t[i] !== r[i]
|
|
) {
|
|
w.warn(
|
|
'DATERANGE tag attribute: "' +
|
|
i +
|
|
'" does not match for tags with ID: "' +
|
|
t.ID +
|
|
'"'
|
|
),
|
|
(this._badValueForSameId = i);
|
|
break;
|
|
}
|
|
t = o(new P({}), r, t);
|
|
}
|
|
if (
|
|
((this.attr = t),
|
|
(this._startDate = new Date(t["START-DATE"])),
|
|
"END-DATE" in this.attr)
|
|
) {
|
|
var n = new Date(this.attr["END-DATE"]);
|
|
E(n.getTime()) && (this._endDate = n);
|
|
}
|
|
}
|
|
return (
|
|
a(t, [
|
|
{
|
|
key: "id",
|
|
get: function () {
|
|
return this.attr.ID;
|
|
},
|
|
},
|
|
{
|
|
key: "class",
|
|
get: function () {
|
|
return this.attr.CLASS;
|
|
},
|
|
},
|
|
{
|
|
key: "startDate",
|
|
get: function () {
|
|
return this._startDate;
|
|
},
|
|
},
|
|
{
|
|
key: "endDate",
|
|
get: function () {
|
|
if (this._endDate) return this._endDate;
|
|
var t = this.duration;
|
|
return null !== t
|
|
? new Date(this._startDate.getTime() + 1e3 * t)
|
|
: null;
|
|
},
|
|
},
|
|
{
|
|
key: "duration",
|
|
get: function () {
|
|
if ("DURATION" in this.attr) {
|
|
var t = this.attr.decimalFloatingPoint("DURATION");
|
|
if (E(t)) return t;
|
|
} else if (this._endDate)
|
|
return (
|
|
(this._endDate.getTime() - this._startDate.getTime()) /
|
|
1e3
|
|
);
|
|
return null;
|
|
},
|
|
},
|
|
{
|
|
key: "plannedDuration",
|
|
get: function () {
|
|
return "PLANNED-DURATION" in this.attr
|
|
? this.attr.decimalFloatingPoint("PLANNED-DURATION")
|
|
: null;
|
|
},
|
|
},
|
|
{
|
|
key: "endOnNext",
|
|
get: function () {
|
|
return this.attr.bool("END-ON-NEXT");
|
|
},
|
|
},
|
|
{
|
|
key: "isValid",
|
|
get: function () {
|
|
return (
|
|
!!this.id &&
|
|
!this._badValueForSameId &&
|
|
E(this.startDate.getTime()) &&
|
|
(null === this.duration || this.duration >= 0) &&
|
|
(!this.endOnNext || !!this.class)
|
|
);
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})(),
|
|
M = function () {
|
|
(this.aborted = !1),
|
|
(this.loaded = 0),
|
|
(this.retry = 0),
|
|
(this.total = 0),
|
|
(this.chunkCount = 0),
|
|
(this.bwEstimate = 0),
|
|
(this.loading = { start: 0, first: 0, end: 0 }),
|
|
(this.parsing = { start: 0, end: 0 }),
|
|
(this.buffering = { start: 0, first: 0, end: 0 });
|
|
},
|
|
O = "audio",
|
|
N = "video",
|
|
U = "audiovideo",
|
|
B = (function () {
|
|
function t(t) {
|
|
var e;
|
|
(this._byteRange = null),
|
|
(this._url = null),
|
|
(this.baseurl = void 0),
|
|
(this.relurl = void 0),
|
|
(this.elementaryStreams =
|
|
(((e = {})[O] = null), (e[N] = null), (e[U] = null), e)),
|
|
(this.baseurl = t);
|
|
}
|
|
return (
|
|
(t.prototype.setByteRange = function (t, e) {
|
|
var r = t.split("@", 2),
|
|
i = [];
|
|
1 === r.length
|
|
? (i[0] = e ? e.byteRangeEndOffset : 0)
|
|
: (i[0] = parseInt(r[1])),
|
|
(i[1] = parseInt(r[0]) + i[0]),
|
|
(this._byteRange = i);
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "byteRange",
|
|
get: function () {
|
|
return this._byteRange ? this._byteRange : [];
|
|
},
|
|
},
|
|
{
|
|
key: "byteRangeStartOffset",
|
|
get: function () {
|
|
return this.byteRange[0];
|
|
},
|
|
},
|
|
{
|
|
key: "byteRangeEndOffset",
|
|
get: function () {
|
|
return this.byteRange[1];
|
|
},
|
|
},
|
|
{
|
|
key: "url",
|
|
get: function () {
|
|
return (
|
|
!this._url &&
|
|
this.baseurl &&
|
|
this.relurl &&
|
|
(this._url = T.buildAbsoluteURL(
|
|
this.baseurl,
|
|
this.relurl,
|
|
{ alwaysNormalize: !0 }
|
|
)),
|
|
this._url || ""
|
|
);
|
|
},
|
|
set: function (t) {
|
|
this._url = t;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})(),
|
|
G = (function (t) {
|
|
function e(e, r) {
|
|
var i;
|
|
return (
|
|
((i = t.call(this, r) || this)._decryptdata = null),
|
|
(i.rawProgramDateTime = null),
|
|
(i.programDateTime = null),
|
|
(i.tagList = []),
|
|
(i.duration = 0),
|
|
(i.sn = 0),
|
|
(i.levelkeys = void 0),
|
|
(i.type = void 0),
|
|
(i.loader = null),
|
|
(i.keyLoader = null),
|
|
(i.level = -1),
|
|
(i.cc = 0),
|
|
(i.startPTS = void 0),
|
|
(i.endPTS = void 0),
|
|
(i.startDTS = void 0),
|
|
(i.endDTS = void 0),
|
|
(i.start = 0),
|
|
(i.deltaPTS = void 0),
|
|
(i.maxStartPTS = void 0),
|
|
(i.minEndPTS = void 0),
|
|
(i.stats = new M()),
|
|
(i.urlId = 0),
|
|
(i.data = void 0),
|
|
(i.bitrateTest = !1),
|
|
(i.title = null),
|
|
(i.initSegment = null),
|
|
(i.endList = void 0),
|
|
(i.gap = void 0),
|
|
(i.type = e),
|
|
i
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.setKeyFormat = function (t) {
|
|
if (this.levelkeys) {
|
|
var e = this.levelkeys[t];
|
|
e &&
|
|
!this._decryptdata &&
|
|
(this._decryptdata = e.getDecryptData(this.sn));
|
|
}
|
|
}),
|
|
(r.abortRequests = function () {
|
|
var t, e;
|
|
null == (t = this.loader) || t.abort(),
|
|
null == (e = this.keyLoader) || e.abort();
|
|
}),
|
|
(r.setElementaryStreamInfo = function (t, e, r, i, n, a) {
|
|
void 0 === a && (a = !1);
|
|
var s = this.elementaryStreams,
|
|
o = s[t];
|
|
o
|
|
? ((o.startPTS = Math.min(o.startPTS, e)),
|
|
(o.endPTS = Math.max(o.endPTS, r)),
|
|
(o.startDTS = Math.min(o.startDTS, i)),
|
|
(o.endDTS = Math.max(o.endDTS, n)))
|
|
: (s[t] = {
|
|
startPTS: e,
|
|
endPTS: r,
|
|
startDTS: i,
|
|
endDTS: n,
|
|
partial: a,
|
|
});
|
|
}),
|
|
(r.clearElementaryStreamInfo = function () {
|
|
var t = this.elementaryStreams;
|
|
(t[O] = null), (t[N] = null), (t[U] = null);
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "decryptdata",
|
|
get: function () {
|
|
if (!this.levelkeys && !this._decryptdata) return null;
|
|
if (
|
|
!this._decryptdata &&
|
|
this.levelkeys &&
|
|
!this.levelkeys.NONE
|
|
) {
|
|
var t = this.levelkeys.identity;
|
|
if (t) this._decryptdata = t.getDecryptData(this.sn);
|
|
else {
|
|
var e = Object.keys(this.levelkeys);
|
|
if (1 === e.length)
|
|
return (this._decryptdata = this.levelkeys[
|
|
e[0]
|
|
].getDecryptData(this.sn));
|
|
}
|
|
}
|
|
return this._decryptdata;
|
|
},
|
|
},
|
|
{
|
|
key: "end",
|
|
get: function () {
|
|
return this.start + this.duration;
|
|
},
|
|
},
|
|
{
|
|
key: "endProgramDateTime",
|
|
get: function () {
|
|
if (null === this.programDateTime) return null;
|
|
if (!E(this.programDateTime)) return null;
|
|
var t = E(this.duration) ? this.duration : 0;
|
|
return this.programDateTime + 1e3 * t;
|
|
},
|
|
},
|
|
{
|
|
key: "encrypted",
|
|
get: function () {
|
|
var t;
|
|
if (null != (t = this._decryptdata) && t.encrypted) return !0;
|
|
if (this.levelkeys) {
|
|
var e = Object.keys(this.levelkeys),
|
|
r = e.length;
|
|
if (r > 1 || (1 === r && this.levelkeys[e[0]].encrypted))
|
|
return !0;
|
|
}
|
|
return !1;
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(B),
|
|
K = (function (t) {
|
|
function e(e, r, i, n, a) {
|
|
var s;
|
|
((s = t.call(this, i) || this).fragOffset = 0),
|
|
(s.duration = 0),
|
|
(s.gap = !1),
|
|
(s.independent = !1),
|
|
(s.relurl = void 0),
|
|
(s.fragment = void 0),
|
|
(s.index = void 0),
|
|
(s.stats = new M()),
|
|
(s.duration = e.decimalFloatingPoint("DURATION")),
|
|
(s.gap = e.bool("GAP")),
|
|
(s.independent = e.bool("INDEPENDENT")),
|
|
(s.relurl = e.enumeratedString("URI")),
|
|
(s.fragment = r),
|
|
(s.index = n);
|
|
var o = e.enumeratedString("BYTERANGE");
|
|
return (
|
|
o && s.setByteRange(o, a),
|
|
a && (s.fragOffset = a.fragOffset + a.duration),
|
|
s
|
|
);
|
|
}
|
|
return (
|
|
l(e, t),
|
|
a(e, [
|
|
{
|
|
key: "start",
|
|
get: function () {
|
|
return this.fragment.start + this.fragOffset;
|
|
},
|
|
},
|
|
{
|
|
key: "end",
|
|
get: function () {
|
|
return this.start + this.duration;
|
|
},
|
|
},
|
|
{
|
|
key: "loaded",
|
|
get: function () {
|
|
var t = this.elementaryStreams;
|
|
return !!(t.audio || t.video || t.audiovideo);
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(B),
|
|
H = (function () {
|
|
function t(t) {
|
|
(this.PTSKnown = !1),
|
|
(this.alignedSliding = !1),
|
|
(this.averagetargetduration = void 0),
|
|
(this.endCC = 0),
|
|
(this.endSN = 0),
|
|
(this.fragments = void 0),
|
|
(this.fragmentHint = void 0),
|
|
(this.partList = null),
|
|
(this.dateRanges = void 0),
|
|
(this.live = !0),
|
|
(this.ageHeader = 0),
|
|
(this.advancedDateTime = void 0),
|
|
(this.updated = !0),
|
|
(this.advanced = !0),
|
|
(this.availabilityDelay = void 0),
|
|
(this.misses = 0),
|
|
(this.startCC = 0),
|
|
(this.startSN = 0),
|
|
(this.startTimeOffset = null),
|
|
(this.targetduration = 0),
|
|
(this.totalduration = 0),
|
|
(this.type = null),
|
|
(this.url = void 0),
|
|
(this.m3u8 = ""),
|
|
(this.version = null),
|
|
(this.canBlockReload = !1),
|
|
(this.canSkipUntil = 0),
|
|
(this.canSkipDateRanges = !1),
|
|
(this.skippedSegments = 0),
|
|
(this.recentlyRemovedDateranges = void 0),
|
|
(this.partHoldBack = 0),
|
|
(this.holdBack = 0),
|
|
(this.partTarget = 0),
|
|
(this.preloadHint = void 0),
|
|
(this.renditionReports = void 0),
|
|
(this.tuneInGoal = 0),
|
|
(this.deltaUpdateFailed = void 0),
|
|
(this.driftStartTime = 0),
|
|
(this.driftEndTime = 0),
|
|
(this.driftStart = 0),
|
|
(this.driftEnd = 0),
|
|
(this.encryptedFragments = void 0),
|
|
(this.playlistParsingError = null),
|
|
(this.variableList = null),
|
|
(this.hasVariableRefs = !1),
|
|
(this.fragments = []),
|
|
(this.encryptedFragments = []),
|
|
(this.dateRanges = {}),
|
|
(this.url = t);
|
|
}
|
|
return (
|
|
(t.prototype.reloaded = function (t) {
|
|
if (!t) return (this.advanced = !0), void (this.updated = !0);
|
|
var e = this.lastPartSn - t.lastPartSn,
|
|
r = this.lastPartIndex - t.lastPartIndex;
|
|
(this.updated =
|
|
this.endSN !== t.endSN || !!r || !!e || !this.live),
|
|
(this.advanced =
|
|
this.endSN > t.endSN || e > 0 || (0 === e && r > 0)),
|
|
this.updated || this.advanced
|
|
? (this.misses = Math.floor(0.6 * t.misses))
|
|
: (this.misses = t.misses + 1),
|
|
(this.availabilityDelay = t.availabilityDelay);
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "hasProgramDateTime",
|
|
get: function () {
|
|
return (
|
|
!!this.fragments.length &&
|
|
E(this.fragments[this.fragments.length - 1].programDateTime)
|
|
);
|
|
},
|
|
},
|
|
{
|
|
key: "levelTargetDuration",
|
|
get: function () {
|
|
return (
|
|
this.averagetargetduration || this.targetduration || 10
|
|
);
|
|
},
|
|
},
|
|
{
|
|
key: "drift",
|
|
get: function () {
|
|
var t = this.driftEndTime - this.driftStartTime;
|
|
return t > 0
|
|
? (1e3 * (this.driftEnd - this.driftStart)) / t
|
|
: 1;
|
|
},
|
|
},
|
|
{
|
|
key: "edge",
|
|
get: function () {
|
|
return this.partEnd || this.fragmentEnd;
|
|
},
|
|
},
|
|
{
|
|
key: "partEnd",
|
|
get: function () {
|
|
var t;
|
|
return null != (t = this.partList) && t.length
|
|
? this.partList[this.partList.length - 1].end
|
|
: this.fragmentEnd;
|
|
},
|
|
},
|
|
{
|
|
key: "fragmentEnd",
|
|
get: function () {
|
|
var t;
|
|
return null != (t = this.fragments) && t.length
|
|
? this.fragments[this.fragments.length - 1].end
|
|
: 0;
|
|
},
|
|
},
|
|
{
|
|
key: "age",
|
|
get: function () {
|
|
return this.advancedDateTime
|
|
? Math.max(Date.now() - this.advancedDateTime, 0) / 1e3
|
|
: 0;
|
|
},
|
|
},
|
|
{
|
|
key: "lastPartIndex",
|
|
get: function () {
|
|
var t;
|
|
return null != (t = this.partList) && t.length
|
|
? this.partList[this.partList.length - 1].index
|
|
: -1;
|
|
},
|
|
},
|
|
{
|
|
key: "lastPartSn",
|
|
get: function () {
|
|
var t;
|
|
return null != (t = this.partList) && t.length
|
|
? this.partList[this.partList.length - 1].fragment.sn
|
|
: this.endSN;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})();
|
|
function V(t) {
|
|
return Uint8Array.from(atob(t), function (t) {
|
|
return t.charCodeAt(0);
|
|
});
|
|
}
|
|
function Y(t) {
|
|
var e,
|
|
r,
|
|
i = t.split(":"),
|
|
n = null;
|
|
if ("data" === i[0] && 2 === i.length) {
|
|
var a = i[1].split(";"),
|
|
s = a[a.length - 1].split(",");
|
|
if (2 === s.length) {
|
|
var o = "base64" === s[0],
|
|
l = s[1];
|
|
o
|
|
? (a.splice(-1, 1), (n = V(l)))
|
|
: ((e = W(l).subarray(0, 16)),
|
|
(r = new Uint8Array(16)).set(e, 16 - e.length),
|
|
(n = r));
|
|
}
|
|
}
|
|
return n;
|
|
}
|
|
function W(t) {
|
|
return Uint8Array.from(unescape(encodeURIComponent(t)), function (t) {
|
|
return t.charCodeAt(0);
|
|
});
|
|
}
|
|
var j = {
|
|
CLEARKEY: "org.w3.clearkey",
|
|
FAIRPLAY: "com.apple.fps",
|
|
PLAYREADY: "com.microsoft.playready",
|
|
WIDEVINE: "com.widevine.alpha",
|
|
},
|
|
q = "org.w3.clearkey",
|
|
X = "com.apple.streamingkeydelivery",
|
|
z = "com.microsoft.playready",
|
|
Q = "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
|
|
function $(t) {
|
|
switch (t) {
|
|
case X:
|
|
return j.FAIRPLAY;
|
|
case z:
|
|
return j.PLAYREADY;
|
|
case Q:
|
|
return j.WIDEVINE;
|
|
case q:
|
|
return j.CLEARKEY;
|
|
}
|
|
}
|
|
var J = "edef8ba979d64acea3c827dcd51d21ed";
|
|
function Z(t) {
|
|
switch (t) {
|
|
case j.FAIRPLAY:
|
|
return X;
|
|
case j.PLAYREADY:
|
|
return z;
|
|
case j.WIDEVINE:
|
|
return Q;
|
|
case j.CLEARKEY:
|
|
return q;
|
|
}
|
|
}
|
|
function tt(t) {
|
|
var e = t.drmSystems,
|
|
r = t.widevineLicenseUrl,
|
|
i = e
|
|
? [j.FAIRPLAY, j.WIDEVINE, j.PLAYREADY, j.CLEARKEY].filter(
|
|
function (t) {
|
|
return !!e[t];
|
|
}
|
|
)
|
|
: [];
|
|
return !i[j.WIDEVINE] && r && i.push(j.WIDEVINE), i;
|
|
}
|
|
var et =
|
|
"undefined" != typeof self &&
|
|
self.navigator &&
|
|
self.navigator.requestMediaKeySystemAccess
|
|
? self.navigator.requestMediaKeySystemAccess.bind(self.navigator)
|
|
: null;
|
|
function rt(t, e, r) {
|
|
return Uint8Array.prototype.slice
|
|
? t.slice(e, r)
|
|
: new Uint8Array(Array.prototype.slice.call(t, e, r));
|
|
}
|
|
var it,
|
|
nt = function (t, e) {
|
|
return (
|
|
e + 10 <= t.length &&
|
|
73 === t[e] &&
|
|
68 === t[e + 1] &&
|
|
51 === t[e + 2] &&
|
|
t[e + 3] < 255 &&
|
|
t[e + 4] < 255 &&
|
|
t[e + 6] < 128 &&
|
|
t[e + 7] < 128 &&
|
|
t[e + 8] < 128 &&
|
|
t[e + 9] < 128
|
|
);
|
|
},
|
|
at = function (t, e) {
|
|
return (
|
|
e + 10 <= t.length &&
|
|
51 === t[e] &&
|
|
68 === t[e + 1] &&
|
|
73 === t[e + 2] &&
|
|
t[e + 3] < 255 &&
|
|
t[e + 4] < 255 &&
|
|
t[e + 6] < 128 &&
|
|
t[e + 7] < 128 &&
|
|
t[e + 8] < 128 &&
|
|
t[e + 9] < 128
|
|
);
|
|
},
|
|
st = function (t, e) {
|
|
for (var r = e, i = 0; nt(t, e); )
|
|
(i += 10),
|
|
(i += ot(t, e + 6)),
|
|
at(t, e + 10) && (i += 10),
|
|
(e += i);
|
|
if (i > 0) return t.subarray(r, r + i);
|
|
},
|
|
ot = function (t, e) {
|
|
var r = 0;
|
|
return (
|
|
(r = (127 & t[e]) << 21),
|
|
(r |= (127 & t[e + 1]) << 14),
|
|
(r |= (127 & t[e + 2]) << 7),
|
|
(r |= 127 & t[e + 3])
|
|
);
|
|
},
|
|
lt = function (t, e) {
|
|
return nt(t, e) && ot(t, e + 6) + 10 <= t.length - e;
|
|
},
|
|
ut = function (t) {
|
|
return (
|
|
t &&
|
|
"PRIV" === t.key &&
|
|
"com.apple.streaming.transportStreamTimestamp" === t.info
|
|
);
|
|
},
|
|
ht = function (t) {
|
|
var e = String.fromCharCode(t[0], t[1], t[2], t[3]),
|
|
r = ot(t, 4);
|
|
return { type: e, size: r, data: t.subarray(10, 10 + r) };
|
|
},
|
|
dt = function (t) {
|
|
for (var e = 0, r = []; nt(t, e); ) {
|
|
for (var i = ot(t, e + 6), n = (e += 10) + i; e + 8 < n; ) {
|
|
var a = ht(t.subarray(e)),
|
|
s = ct(a);
|
|
s && r.push(s), (e += a.size + 10);
|
|
}
|
|
at(t, e) && (e += 10);
|
|
}
|
|
return r;
|
|
},
|
|
ct = function (t) {
|
|
return "PRIV" === t.type ? ft(t) : "W" === t.type[0] ? vt(t) : gt(t);
|
|
},
|
|
ft = function (t) {
|
|
if (!(t.size < 2)) {
|
|
var e = pt(t.data, !0),
|
|
r = new Uint8Array(t.data.subarray(e.length + 1));
|
|
return { key: t.type, info: e, data: r.buffer };
|
|
}
|
|
},
|
|
gt = function (t) {
|
|
if (!(t.size < 2)) {
|
|
if ("TXXX" === t.type) {
|
|
var e = 1,
|
|
r = pt(t.data.subarray(e), !0);
|
|
e += r.length + 1;
|
|
var i = pt(t.data.subarray(e));
|
|
return { key: t.type, info: r, data: i };
|
|
}
|
|
var n = pt(t.data.subarray(1));
|
|
return { key: t.type, data: n };
|
|
}
|
|
},
|
|
vt = function (t) {
|
|
if ("WXXX" === t.type) {
|
|
if (t.size < 2) return;
|
|
var e = 1,
|
|
r = pt(t.data.subarray(e), !0);
|
|
e += r.length + 1;
|
|
var i = pt(t.data.subarray(e));
|
|
return { key: t.type, info: r, data: i };
|
|
}
|
|
var n = pt(t.data);
|
|
return { key: t.type, data: n };
|
|
},
|
|
mt = function (t) {
|
|
if (8 === t.data.byteLength) {
|
|
var e = new Uint8Array(t.data),
|
|
r = 1 & e[3],
|
|
i = (e[4] << 23) + (e[5] << 15) + (e[6] << 7) + e[7];
|
|
return (i /= 45), r && (i += 47721858.84), Math.round(i);
|
|
}
|
|
},
|
|
pt = function (t, e) {
|
|
void 0 === e && (e = !1);
|
|
var r = yt();
|
|
if (r) {
|
|
var i = r.decode(t);
|
|
if (e) {
|
|
var n = i.indexOf("\0");
|
|
return -1 !== n ? i.substring(0, n) : i;
|
|
}
|
|
return i.replace(/\0/g, "");
|
|
}
|
|
for (var a, s, o, l = t.length, u = "", h = 0; h < l; ) {
|
|
if (0 === (a = t[h++]) && e) return u;
|
|
if (0 !== a && 3 !== a)
|
|
switch (a >> 4) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
u += String.fromCharCode(a);
|
|
break;
|
|
case 12:
|
|
case 13:
|
|
(s = t[h++]),
|
|
(u += String.fromCharCode(((31 & a) << 6) | (63 & s)));
|
|
break;
|
|
case 14:
|
|
(s = t[h++]),
|
|
(o = t[h++]),
|
|
(u += String.fromCharCode(
|
|
((15 & a) << 12) | ((63 & s) << 6) | ((63 & o) << 0)
|
|
));
|
|
}
|
|
}
|
|
return u;
|
|
};
|
|
function yt() {
|
|
return (
|
|
it ||
|
|
void 0 === self.TextDecoder ||
|
|
(it = new self.TextDecoder("utf-8")),
|
|
it
|
|
);
|
|
}
|
|
var Tt = function (t) {
|
|
for (var e = "", r = 0; r < t.length; r++) {
|
|
var i = t[r].toString(16);
|
|
i.length < 2 && (i = "0" + i), (e += i);
|
|
}
|
|
return e;
|
|
},
|
|
Et = Math.pow(2, 32) - 1,
|
|
St = [].push,
|
|
Lt = { video: 1, audio: 2, id3: 3, text: 4 };
|
|
function Rt(t) {
|
|
return String.fromCharCode.apply(null, t);
|
|
}
|
|
function At(t, e) {
|
|
var r = (t[e] << 8) | t[e + 1];
|
|
return r < 0 ? 65536 + r : r;
|
|
}
|
|
function kt(t, e) {
|
|
var r = bt(t, e);
|
|
return r < 0 ? 4294967296 + r : r;
|
|
}
|
|
function bt(t, e) {
|
|
return (t[e] << 24) | (t[e + 1] << 16) | (t[e + 2] << 8) | t[e + 3];
|
|
}
|
|
function Dt(t, e, r) {
|
|
(t[e] = r >> 24),
|
|
(t[e + 1] = (r >> 16) & 255),
|
|
(t[e + 2] = (r >> 8) & 255),
|
|
(t[e + 3] = 255 & r);
|
|
}
|
|
function It(t, e) {
|
|
var r = [];
|
|
if (!e.length) return r;
|
|
for (var i = t.byteLength, n = 0; n < i; ) {
|
|
var a = kt(t, n),
|
|
s = a > 1 ? n + a : i;
|
|
if (Rt(t.subarray(n + 4, n + 8)) === e[0])
|
|
if (1 === e.length) r.push(t.subarray(n + 8, s));
|
|
else {
|
|
var o = It(t.subarray(n + 8, s), e.slice(1));
|
|
o.length && St.apply(r, o);
|
|
}
|
|
n = s;
|
|
}
|
|
return r;
|
|
}
|
|
function wt(t) {
|
|
var e = [],
|
|
r = t[0],
|
|
i = 8,
|
|
n = kt(t, i);
|
|
(i += 4), (i += 0 === r ? 8 : 16), (i += 2);
|
|
var a = t.length + 0,
|
|
s = At(t, i);
|
|
i += 2;
|
|
for (var o = 0; o < s; o++) {
|
|
var l = i,
|
|
u = kt(t, l);
|
|
l += 4;
|
|
var h = 2147483647 & u;
|
|
if (1 == (2147483648 & u) >>> 31)
|
|
return (
|
|
w.warn("SIDX has hierarchical references (not supported)"), null
|
|
);
|
|
var d = kt(t, l);
|
|
(l += 4),
|
|
e.push({
|
|
referenceSize: h,
|
|
subsegmentDuration: d,
|
|
info: { duration: d / n, start: a, end: a + h - 1 },
|
|
}),
|
|
(a += h),
|
|
(i = l += 4);
|
|
}
|
|
return {
|
|
earliestPresentationTime: 0,
|
|
timescale: n,
|
|
version: r,
|
|
referencesCount: s,
|
|
references: e,
|
|
};
|
|
}
|
|
function Ct(t) {
|
|
for (
|
|
var e = [], r = It(t, ["moov", "trak"]), i = 0;
|
|
i < r.length;
|
|
i++
|
|
) {
|
|
var n = r[i],
|
|
a = It(n, ["tkhd"])[0];
|
|
if (a) {
|
|
var s = a[0],
|
|
o = 0 === s ? 12 : 20,
|
|
l = kt(a, o),
|
|
u = It(n, ["mdia", "mdhd"])[0];
|
|
if (u) {
|
|
var h = kt(u, (o = 0 === (s = u[0]) ? 12 : 20)),
|
|
d = It(n, ["mdia", "hdlr"])[0];
|
|
if (d) {
|
|
var c = Rt(d.subarray(8, 12)),
|
|
f = { soun: O, vide: N }[c];
|
|
if (f) {
|
|
var g = It(n, ["mdia", "minf", "stbl", "stsd"])[0],
|
|
v = void 0;
|
|
g && (v = Rt(g.subarray(12, 16))),
|
|
(e[l] = { timescale: h, type: f }),
|
|
(e[f] = { timescale: h, id: l, codec: v });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (
|
|
It(t, ["moov", "mvex", "trex"]).forEach(function (t) {
|
|
var r = kt(t, 4),
|
|
i = e[r];
|
|
i && (i.default = { duration: kt(t, 12), flags: kt(t, 20) });
|
|
}),
|
|
e
|
|
);
|
|
}
|
|
function _t(t) {
|
|
var e = It(t, ["schm"])[0];
|
|
if (e) {
|
|
var r = Rt(e.subarray(4, 8));
|
|
if ("cbcs" === r || "cenc" === r) return It(t, ["schi", "tenc"])[0];
|
|
}
|
|
return w.error("[eme] missing 'schm' box"), null;
|
|
}
|
|
function Pt(t) {
|
|
var e = kt(t, 0),
|
|
r = 8;
|
|
1 & e && (r += 4), 4 & e && (r += 4);
|
|
for (var i = 0, n = kt(t, 4), a = 0; a < n; a++)
|
|
256 & e && ((i += kt(t, r)), (r += 4)),
|
|
512 & e && (r += 4),
|
|
1024 & e && (r += 4),
|
|
2048 & e && (r += 4);
|
|
return i;
|
|
}
|
|
function xt(t, e) {
|
|
var r = new Uint8Array(t.length + e.length);
|
|
return r.set(t), r.set(e, t.length), r;
|
|
}
|
|
function Ft(t, e) {
|
|
var r = [],
|
|
i = e.samples,
|
|
n = e.timescale,
|
|
a = e.id,
|
|
s = !1;
|
|
return (
|
|
It(i, ["moof"]).map(function (o) {
|
|
var l = o.byteOffset - 8;
|
|
It(o, ["traf"]).map(function (o) {
|
|
var u = It(o, ["tfdt"]).map(function (t) {
|
|
var e = t[0],
|
|
r = kt(t, 4);
|
|
return (
|
|
1 === e && ((r *= Math.pow(2, 32)), (r += kt(t, 8))), r / n
|
|
);
|
|
})[0];
|
|
return (
|
|
void 0 !== u && (t = u),
|
|
It(o, ["tfhd"]).map(function (u) {
|
|
var h = kt(u, 4),
|
|
d = 16777215 & kt(u, 0),
|
|
c = 0,
|
|
f = 0 != (16 & d),
|
|
g = 0,
|
|
v = 0 != (32 & d),
|
|
m = 8;
|
|
h === a &&
|
|
(0 != (1 & d) && (m += 8),
|
|
0 != (2 & d) && (m += 4),
|
|
0 != (8 & d) && ((c = kt(u, m)), (m += 4)),
|
|
f && ((g = kt(u, m)), (m += 4)),
|
|
v && (m += 4),
|
|
"video" === e.type &&
|
|
(s = (function (t) {
|
|
if (!t) return !1;
|
|
var e = t.indexOf("."),
|
|
r = e < 0 ? t : t.substring(0, e);
|
|
return (
|
|
"hvc1" === r ||
|
|
"hev1" === r ||
|
|
"dvh1" === r ||
|
|
"dvhe" === r
|
|
);
|
|
})(e.codec)),
|
|
It(o, ["trun"]).map(function (a) {
|
|
var o = a[0],
|
|
u = 16777215 & kt(a, 0),
|
|
h = 0 != (1 & u),
|
|
d = 0,
|
|
f = 0 != (4 & u),
|
|
v = 0 != (256 & u),
|
|
m = 0,
|
|
p = 0 != (512 & u),
|
|
y = 0,
|
|
T = 0 != (1024 & u),
|
|
E = 0 != (2048 & u),
|
|
S = 0,
|
|
L = kt(a, 4),
|
|
R = 8;
|
|
h && ((d = kt(a, R)), (R += 4)), f && (R += 4);
|
|
for (var A = d + l, k = 0; k < L; k++) {
|
|
if (
|
|
(v ? ((m = kt(a, R)), (R += 4)) : (m = c),
|
|
p ? ((y = kt(a, R)), (R += 4)) : (y = g),
|
|
T && (R += 4),
|
|
E && ((S = 0 === o ? kt(a, R) : bt(a, R)), (R += 4)),
|
|
e.type === N)
|
|
)
|
|
for (var b = 0; b < y; ) {
|
|
var D = kt(i, A);
|
|
Mt(s, i[(A += 4)]) &&
|
|
Ot(i.subarray(A, A + D), s ? 2 : 1, t + S / n, r),
|
|
(A += D),
|
|
(b += D + 4);
|
|
}
|
|
t += m / n;
|
|
}
|
|
}));
|
|
})
|
|
);
|
|
});
|
|
}),
|
|
r
|
|
);
|
|
}
|
|
function Mt(t, e) {
|
|
if (t) {
|
|
var r = (e >> 1) & 63;
|
|
return 39 === r || 40 === r;
|
|
}
|
|
return 6 == (31 & e);
|
|
}
|
|
function Ot(t, e, r, i) {
|
|
var n = Nt(t),
|
|
a = 0;
|
|
a += e;
|
|
for (var s = 0, o = 0, l = !1, u = 0; a < n.length; ) {
|
|
s = 0;
|
|
do {
|
|
if (a >= n.length) break;
|
|
s += u = n[a++];
|
|
} while (255 === u);
|
|
o = 0;
|
|
do {
|
|
if (a >= n.length) break;
|
|
o += u = n[a++];
|
|
} while (255 === u);
|
|
var h = n.length - a;
|
|
if (!l && 4 === s && a < n.length) {
|
|
if (((l = !0), 181 === n[a++])) {
|
|
var d = At(n, a);
|
|
if (((a += 2), 49 === d)) {
|
|
var c = kt(n, a);
|
|
if (((a += 4), 1195456820 === c)) {
|
|
var f = n[a++];
|
|
if (3 === f) {
|
|
var g = n[a++],
|
|
v = 64 & g,
|
|
m = v ? 2 + 3 * (31 & g) : 0,
|
|
p = new Uint8Array(m);
|
|
if (v) {
|
|
p[0] = g;
|
|
for (var y = 1; y < m; y++) p[y] = n[a++];
|
|
}
|
|
i.push({ type: f, payloadType: s, pts: r, bytes: p });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (5 === s && o < h) {
|
|
if (((l = !0), o > 16)) {
|
|
for (var T = [], E = 0; E < 16; E++) {
|
|
var S = n[a++].toString(16);
|
|
T.push(1 == S.length ? "0" + S : S),
|
|
(3 !== E && 5 !== E && 7 !== E && 9 !== E) || T.push("-");
|
|
}
|
|
for (var L = o - 16, R = new Uint8Array(L), A = 0; A < L; A++)
|
|
R[A] = n[a++];
|
|
i.push({
|
|
payloadType: s,
|
|
pts: r,
|
|
uuid: T.join(""),
|
|
userData: pt(R),
|
|
userDataBytes: R,
|
|
});
|
|
}
|
|
} else if (o < h) a += o;
|
|
else if (o > h) break;
|
|
}
|
|
}
|
|
function Nt(t) {
|
|
for (var e = t.byteLength, r = [], i = 1; i < e - 2; )
|
|
0 === t[i] && 0 === t[i + 1] && 3 === t[i + 2]
|
|
? (r.push(i + 2), (i += 2))
|
|
: i++;
|
|
if (0 === r.length) return t;
|
|
var n = e - r.length,
|
|
a = new Uint8Array(n),
|
|
s = 0;
|
|
for (i = 0; i < n; s++, i++)
|
|
s === r[0] && (s++, r.shift()), (a[i] = t[s]);
|
|
return a;
|
|
}
|
|
function Ut(t, e, r) {
|
|
if (16 !== t.byteLength) throw new RangeError("Invalid system id");
|
|
var i, n, a;
|
|
if (e) {
|
|
(i = 1), (n = new Uint8Array(16 * e.length));
|
|
for (var s = 0; s < e.length; s++) {
|
|
var o = e[s];
|
|
if (16 !== o.byteLength) throw new RangeError("Invalid key");
|
|
n.set(o, 16 * s);
|
|
}
|
|
} else (i = 0), (n = new Uint8Array());
|
|
i > 0
|
|
? ((a = new Uint8Array(4)),
|
|
e.length > 0 && new DataView(a.buffer).setUint32(0, e.length, !1))
|
|
: (a = new Uint8Array());
|
|
var l = new Uint8Array(4);
|
|
return (
|
|
r &&
|
|
r.byteLength > 0 &&
|
|
new DataView(l.buffer).setUint32(0, r.byteLength, !1),
|
|
(function (t) {
|
|
for (
|
|
var e = arguments.length, r = new Array(e > 1 ? e - 1 : 0), i = 1;
|
|
i < e;
|
|
i++
|
|
)
|
|
r[i - 1] = arguments[i];
|
|
for (var n = r.length, a = 8, s = n; s--; ) a += r[s].byteLength;
|
|
var o = new Uint8Array(a);
|
|
for (
|
|
o[0] = (a >> 24) & 255,
|
|
o[1] = (a >> 16) & 255,
|
|
o[2] = (a >> 8) & 255,
|
|
o[3] = 255 & a,
|
|
o.set(t, 4),
|
|
s = 0,
|
|
a = 8;
|
|
s < n;
|
|
s++
|
|
)
|
|
o.set(r[s], a), (a += r[s].byteLength);
|
|
return o;
|
|
})(
|
|
[112, 115, 115, 104],
|
|
new Uint8Array([i, 0, 0, 0]),
|
|
t,
|
|
a,
|
|
n,
|
|
l,
|
|
r || new Uint8Array()
|
|
)
|
|
);
|
|
}
|
|
var Bt = {},
|
|
Gt = (function () {
|
|
function t(t, e, r, i, n) {
|
|
void 0 === i && (i = [1]),
|
|
void 0 === n && (n = null),
|
|
(this.uri = void 0),
|
|
(this.method = void 0),
|
|
(this.keyFormat = void 0),
|
|
(this.keyFormatVersions = void 0),
|
|
(this.encrypted = void 0),
|
|
(this.isCommonEncryption = void 0),
|
|
(this.iv = null),
|
|
(this.key = null),
|
|
(this.keyId = null),
|
|
(this.pssh = null),
|
|
(this.method = t),
|
|
(this.uri = e),
|
|
(this.keyFormat = r),
|
|
(this.keyFormatVersions = i),
|
|
(this.iv = n),
|
|
(this.encrypted = !!t && "NONE" !== t),
|
|
(this.isCommonEncryption = this.encrypted && "AES-128" !== t);
|
|
}
|
|
t.clearKeyUriToKeyIdMap = function () {
|
|
Bt = {};
|
|
};
|
|
var e = t.prototype;
|
|
return (
|
|
(e.isSupported = function () {
|
|
if (this.method) {
|
|
if ("AES-128" === this.method || "NONE" === this.method)
|
|
return !0;
|
|
if ("identity" === this.keyFormat)
|
|
return "SAMPLE-AES" === this.method;
|
|
switch (this.keyFormat) {
|
|
case X:
|
|
case Q:
|
|
case z:
|
|
case q:
|
|
return (
|
|
-1 !==
|
|
[
|
|
"ISO-23001-7",
|
|
"SAMPLE-AES",
|
|
"SAMPLE-AES-CENC",
|
|
"SAMPLE-AES-CTR",
|
|
].indexOf(this.method)
|
|
);
|
|
}
|
|
}
|
|
return !1;
|
|
}),
|
|
(e.getDecryptData = function (e) {
|
|
if (!this.encrypted || !this.uri) return null;
|
|
if ("AES-128" === this.method && this.uri && !this.iv) {
|
|
"number" != typeof e &&
|
|
("AES-128" !== this.method ||
|
|
this.iv ||
|
|
w.warn(
|
|
'missing IV for initialization segment with method="' +
|
|
this.method +
|
|
'" - compliance issue'
|
|
),
|
|
(e = 0));
|
|
var r = (function (t) {
|
|
for (var e = new Uint8Array(16), r = 12; r < 16; r++)
|
|
e[r] = (t >> (8 * (15 - r))) & 255;
|
|
return e;
|
|
})(e);
|
|
return new t(
|
|
this.method,
|
|
this.uri,
|
|
"identity",
|
|
this.keyFormatVersions,
|
|
r
|
|
);
|
|
}
|
|
var i = Y(this.uri);
|
|
if (i)
|
|
switch (this.keyFormat) {
|
|
case Q:
|
|
(this.pssh = i),
|
|
i.length >= 22 &&
|
|
(this.keyId = i.subarray(i.length - 22, i.length - 6));
|
|
break;
|
|
case z:
|
|
var n = new Uint8Array([
|
|
154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91,
|
|
224, 136, 95, 149,
|
|
]);
|
|
this.pssh = Ut(n, null, i);
|
|
var a = new Uint16Array(
|
|
i.buffer,
|
|
i.byteOffset,
|
|
i.byteLength / 2
|
|
),
|
|
s = String.fromCharCode.apply(null, Array.from(a)),
|
|
o = s.substring(s.indexOf("<"), s.length),
|
|
l = new DOMParser()
|
|
.parseFromString(o, "text/xml")
|
|
.getElementsByTagName("KID")[0];
|
|
if (l) {
|
|
var u = l.childNodes[0]
|
|
? l.childNodes[0].nodeValue
|
|
: l.getAttribute("VALUE");
|
|
if (u) {
|
|
var h = V(u).subarray(0, 16);
|
|
!(function (t) {
|
|
var e = function (t, e, r) {
|
|
var i = t[e];
|
|
(t[e] = t[r]), (t[r] = i);
|
|
};
|
|
e(t, 0, 3), e(t, 1, 2), e(t, 4, 5), e(t, 6, 7);
|
|
})(h),
|
|
(this.keyId = h);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
var d = i.subarray(0, 16);
|
|
if (16 !== d.length) {
|
|
var c = new Uint8Array(16);
|
|
c.set(d, 16 - d.length), (d = c);
|
|
}
|
|
this.keyId = d;
|
|
}
|
|
if (!this.keyId || 16 !== this.keyId.byteLength) {
|
|
var f = Bt[this.uri];
|
|
if (!f) {
|
|
var g = Object.keys(Bt).length % Number.MAX_SAFE_INTEGER;
|
|
(f = new Uint8Array(16)),
|
|
new DataView(f.buffer, 12, 4).setUint32(0, g),
|
|
(Bt[this.uri] = f);
|
|
}
|
|
this.keyId = f;
|
|
}
|
|
return this;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Kt = /\{\$([a-zA-Z0-9-_]+)\}/g;
|
|
function Ht(t) {
|
|
return Kt.test(t);
|
|
}
|
|
function Vt(t, e, r) {
|
|
if (null !== t.variableList || t.hasVariableRefs)
|
|
for (var i = r.length; i--; ) {
|
|
var n = r[i],
|
|
a = e[n];
|
|
a && (e[n] = Yt(t, a));
|
|
}
|
|
}
|
|
function Yt(t, e) {
|
|
if (null !== t.variableList || t.hasVariableRefs) {
|
|
var r = t.variableList;
|
|
return e.replace(Kt, function (e) {
|
|
var i = e.substring(2, e.length - 1),
|
|
n = null == r ? void 0 : r[i];
|
|
return void 0 === n
|
|
? (t.playlistParsingError ||
|
|
(t.playlistParsingError = new Error(
|
|
'Missing preceding EXT-X-DEFINE tag for Variable Reference: "' +
|
|
i +
|
|
'"'
|
|
)),
|
|
e)
|
|
: n;
|
|
});
|
|
}
|
|
return e;
|
|
}
|
|
function Wt(t, e, r) {
|
|
var i,
|
|
n,
|
|
a = t.variableList;
|
|
if ((a || (t.variableList = a = {}), "QUERYPARAM" in e)) {
|
|
i = e.QUERYPARAM;
|
|
try {
|
|
var s = new self.URL(r).searchParams;
|
|
if (!s.has(i))
|
|
throw new Error(
|
|
'"' +
|
|
i +
|
|
'" does not match any query parameter in URI: "' +
|
|
r +
|
|
'"'
|
|
);
|
|
n = s.get(i);
|
|
} catch (e) {
|
|
t.playlistParsingError ||
|
|
(t.playlistParsingError = new Error(
|
|
"EXT-X-DEFINE QUERYPARAM: " + e.message
|
|
));
|
|
}
|
|
} else (i = e.NAME), (n = e.VALUE);
|
|
i in a
|
|
? t.playlistParsingError ||
|
|
(t.playlistParsingError = new Error(
|
|
'EXT-X-DEFINE duplicate Variable Name declarations: "' + i + '"'
|
|
))
|
|
: (a[i] = n || "");
|
|
}
|
|
function jt(t, e, r) {
|
|
var i = e.IMPORT;
|
|
if (r && i in r) {
|
|
var n = t.variableList;
|
|
n || (t.variableList = n = {}), (n[i] = r[i]);
|
|
} else
|
|
t.playlistParsingError ||
|
|
(t.playlistParsingError = new Error(
|
|
'EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "' +
|
|
i +
|
|
'"'
|
|
));
|
|
}
|
|
function qt() {
|
|
if ("undefined" != typeof self)
|
|
return self.MediaSource || self.WebKitMediaSource;
|
|
}
|
|
var Xt = {
|
|
audio: {
|
|
a3ds: !0,
|
|
"ac-3": !0,
|
|
"ac-4": !0,
|
|
alac: !0,
|
|
alaw: !0,
|
|
dra1: !0,
|
|
"dts+": !0,
|
|
"dts-": !0,
|
|
dtsc: !0,
|
|
dtse: !0,
|
|
dtsh: !0,
|
|
"ec-3": !0,
|
|
enca: !0,
|
|
g719: !0,
|
|
g726: !0,
|
|
m4ae: !0,
|
|
mha1: !0,
|
|
mha2: !0,
|
|
mhm1: !0,
|
|
mhm2: !0,
|
|
mlpa: !0,
|
|
mp4a: !0,
|
|
"raw ": !0,
|
|
Opus: !0,
|
|
opus: !0,
|
|
samr: !0,
|
|
sawb: !0,
|
|
sawp: !0,
|
|
sevc: !0,
|
|
sqcp: !0,
|
|
ssmv: !0,
|
|
twos: !0,
|
|
ulaw: !0,
|
|
},
|
|
video: {
|
|
avc1: !0,
|
|
avc2: !0,
|
|
avc3: !0,
|
|
avc4: !0,
|
|
avcp: !0,
|
|
av01: !0,
|
|
drac: !0,
|
|
dva1: !0,
|
|
dvav: !0,
|
|
dvh1: !0,
|
|
dvhe: !0,
|
|
encv: !0,
|
|
hev1: !0,
|
|
hvc1: !0,
|
|
mjp2: !0,
|
|
mp4v: !0,
|
|
mvc1: !0,
|
|
mvc2: !0,
|
|
mvc3: !0,
|
|
mvc4: !0,
|
|
resv: !0,
|
|
rv60: !0,
|
|
s263: !0,
|
|
svc1: !0,
|
|
svc2: !0,
|
|
"vc-1": !0,
|
|
vp08: !0,
|
|
vp09: !0,
|
|
},
|
|
text: { stpp: !0, wvtt: !0 },
|
|
},
|
|
zt = qt();
|
|
function Qt(t, e) {
|
|
var r;
|
|
return (
|
|
null !=
|
|
(r =
|
|
null == zt
|
|
? void 0
|
|
: zt.isTypeSupported(
|
|
(e || "video") + '/mp4;codecs="' + t + '"'
|
|
)) && r
|
|
);
|
|
}
|
|
var $t =
|
|
/#EXT-X-STREAM-INF:([^\r\n]*)(?:[\r\n](?:#[^\r\n]*)?)*([^\r\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\r\n]*)[\r\n]+/g,
|
|
Jt = /#EXT-X-MEDIA:(.*)/g,
|
|
Zt = /^#EXT(?:INF|-X-TARGETDURATION):/m,
|
|
te = new RegExp(
|
|
[
|
|
/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,
|
|
/(?!#) *(\S[\S ]*)/.source,
|
|
/#EXT-X-BYTERANGE:*(.+)/.source,
|
|
/#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,
|
|
/#.*/.source,
|
|
].join("|"),
|
|
"g"
|
|
),
|
|
ee = new RegExp(
|
|
[
|
|
/#(EXTM3U)/.source,
|
|
/#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/
|
|
.source,
|
|
/#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/
|
|
.source,
|
|
/#EXT-X-(DISCONTINUITY|ENDLIST|GAP)/.source,
|
|
/(#)([^:]*):(.*)/.source,
|
|
/(#)(.*)(?:.*)\r?\n?/.source,
|
|
].join("|")
|
|
),
|
|
re = (function () {
|
|
function t() {}
|
|
return (
|
|
(t.findGroup = function (t, e) {
|
|
for (var r = 0; r < t.length; r++) {
|
|
var i = t[r];
|
|
if (i.id === e) return i;
|
|
}
|
|
}),
|
|
(t.convertAVC1ToAVCOTI = function (t) {
|
|
var e = t.split(".");
|
|
if (e.length > 2) {
|
|
var r = e.shift() + ".";
|
|
return (
|
|
(r += parseInt(e.shift()).toString(16)),
|
|
(r += ("000" + parseInt(e.shift()).toString(16)).slice(-4))
|
|
);
|
|
}
|
|
return t;
|
|
}),
|
|
(t.resolve = function (t, e) {
|
|
return T.buildAbsoluteURL(e, t, { alwaysNormalize: !0 });
|
|
}),
|
|
(t.isMediaPlaylist = function (t) {
|
|
return Zt.test(t);
|
|
}),
|
|
(t.parseMasterPlaylist = function (e, r) {
|
|
var i,
|
|
n = {
|
|
contentSteering: null,
|
|
levels: [],
|
|
playlistParsingError: null,
|
|
sessionData: null,
|
|
sessionKeys: null,
|
|
startTimeOffset: null,
|
|
variableList: null,
|
|
hasVariableRefs: Ht(e),
|
|
},
|
|
a = [];
|
|
for ($t.lastIndex = 0; null != (i = $t.exec(e)); )
|
|
if (i[1]) {
|
|
var s,
|
|
o = new P(i[1]);
|
|
Vt(n, o, [
|
|
"CODECS",
|
|
"SUPPLEMENTAL-CODECS",
|
|
"ALLOWED-CPC",
|
|
"PATHWAY-ID",
|
|
"STABLE-VARIANT-ID",
|
|
"AUDIO",
|
|
"VIDEO",
|
|
"SUBTITLES",
|
|
"CLOSED-CAPTIONS",
|
|
"NAME",
|
|
]);
|
|
var l = Yt(n, i[2]),
|
|
u = {
|
|
attrs: o,
|
|
bitrate:
|
|
o.decimalInteger("AVERAGE-BANDWIDTH") ||
|
|
o.decimalInteger("BANDWIDTH"),
|
|
name: o.NAME,
|
|
url: t.resolve(l, r),
|
|
},
|
|
h = o.decimalResolution("RESOLUTION");
|
|
h && ((u.width = h.width), (u.height = h.height)),
|
|
ae(
|
|
(o.CODECS || "").split(/[ ,]+/).filter(function (t) {
|
|
return t;
|
|
}),
|
|
u
|
|
),
|
|
u.videoCodec &&
|
|
-1 !== u.videoCodec.indexOf("avc1") &&
|
|
(u.videoCodec = t.convertAVC1ToAVCOTI(u.videoCodec)),
|
|
(null != (s = u.unknownCodecs) && s.length) || a.push(u),
|
|
n.levels.push(u);
|
|
} else if (i[3]) {
|
|
var d = i[3],
|
|
c = i[4];
|
|
switch (d) {
|
|
case "SESSION-DATA":
|
|
var f = new P(c);
|
|
Vt(n, f, ["DATA-ID", "LANGUAGE", "VALUE", "URI"]);
|
|
var g = f["DATA-ID"];
|
|
g &&
|
|
(null === n.sessionData && (n.sessionData = {}),
|
|
(n.sessionData[g] = f));
|
|
break;
|
|
case "SESSION-KEY":
|
|
var v = ie(c, r, n);
|
|
v.encrypted && v.isSupported()
|
|
? (null === n.sessionKeys && (n.sessionKeys = []),
|
|
n.sessionKeys.push(v))
|
|
: w.warn(
|
|
'[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: "' +
|
|
c +
|
|
'"'
|
|
);
|
|
break;
|
|
case "DEFINE":
|
|
var m = new P(c);
|
|
Vt(n, m, ["NAME", "VALUE", "QUERYPARAM"]), Wt(n, m, r);
|
|
break;
|
|
case "CONTENT-STEERING":
|
|
var p = new P(c);
|
|
Vt(n, p, ["SERVER-URI", "PATHWAY-ID"]),
|
|
(n.contentSteering = {
|
|
uri: t.resolve(p["SERVER-URI"], r),
|
|
pathwayId: p["PATHWAY-ID"] || ".",
|
|
});
|
|
break;
|
|
case "START":
|
|
n.startTimeOffset = ne(c);
|
|
}
|
|
}
|
|
var y = a.length > 0 && a.length < n.levels.length;
|
|
return (
|
|
(n.levels = y ? a : n.levels),
|
|
0 === n.levels.length &&
|
|
(n.playlistParsingError = new Error(
|
|
"no levels found in manifest"
|
|
)),
|
|
n
|
|
);
|
|
}),
|
|
(t.parseMasterPlaylistMedia = function (e, r, i) {
|
|
var n,
|
|
a = {},
|
|
s = i.levels,
|
|
o = {
|
|
AUDIO: s.map(function (t) {
|
|
return { id: t.attrs.AUDIO, audioCodec: t.audioCodec };
|
|
}),
|
|
SUBTITLES: s.map(function (t) {
|
|
return { id: t.attrs.SUBTITLES, textCodec: t.textCodec };
|
|
}),
|
|
"CLOSED-CAPTIONS": [],
|
|
},
|
|
l = 0;
|
|
for (Jt.lastIndex = 0; null !== (n = Jt.exec(e)); ) {
|
|
var u = new P(n[1]),
|
|
h = u.TYPE;
|
|
if (h) {
|
|
var d = o[h],
|
|
c = a[h] || [];
|
|
(a[h] = c),
|
|
Vt(i, u, [
|
|
"URI",
|
|
"GROUP-ID",
|
|
"LANGUAGE",
|
|
"ASSOC-LANGUAGE",
|
|
"STABLE-RENDITION-ID",
|
|
"NAME",
|
|
"INSTREAM-ID",
|
|
"CHARACTERISTICS",
|
|
"CHANNELS",
|
|
]);
|
|
var f = {
|
|
attrs: u,
|
|
bitrate: 0,
|
|
id: l++,
|
|
groupId: u["GROUP-ID"] || "",
|
|
instreamId: u["INSTREAM-ID"],
|
|
name: u.NAME || u.LANGUAGE || "",
|
|
type: h,
|
|
default: u.bool("DEFAULT"),
|
|
autoselect: u.bool("AUTOSELECT"),
|
|
forced: u.bool("FORCED"),
|
|
lang: u.LANGUAGE,
|
|
url: u.URI ? t.resolve(u.URI, r) : "",
|
|
};
|
|
if (null != d && d.length) {
|
|
var g = t.findGroup(d, f.groupId) || d[0];
|
|
se(f, g, "audioCodec"), se(f, g, "textCodec");
|
|
}
|
|
c.push(f);
|
|
}
|
|
}
|
|
return a;
|
|
}),
|
|
(t.parseLevelPlaylist = function (t, e, r, i, n, a) {
|
|
var s,
|
|
l,
|
|
u,
|
|
h = new H(e),
|
|
d = h.fragments,
|
|
c = null,
|
|
f = 0,
|
|
g = 0,
|
|
v = 0,
|
|
m = 0,
|
|
p = null,
|
|
y = new G(i, e),
|
|
T = -1,
|
|
S = !1;
|
|
for (
|
|
te.lastIndex = 0, h.m3u8 = t, h.hasVariableRefs = Ht(t);
|
|
null !== (s = te.exec(t));
|
|
|
|
) {
|
|
S &&
|
|
((S = !1),
|
|
((y = new G(i, e)).start = v),
|
|
(y.sn = f),
|
|
(y.cc = m),
|
|
(y.level = r),
|
|
c &&
|
|
((y.initSegment = c),
|
|
(y.rawProgramDateTime = c.rawProgramDateTime),
|
|
(c.rawProgramDateTime = null)));
|
|
var L = s[1];
|
|
if (L) {
|
|
y.duration = parseFloat(L);
|
|
var R = (" " + s[2]).slice(1);
|
|
(y.title = R || null),
|
|
y.tagList.push(R ? ["INF", L, R] : ["INF", L]);
|
|
} else if (s[3]) {
|
|
if (E(y.duration)) {
|
|
(y.start = v),
|
|
u && ue(y, u, h),
|
|
(y.sn = f),
|
|
(y.level = r),
|
|
(y.cc = m),
|
|
(y.urlId = n),
|
|
d.push(y);
|
|
var A = (" " + s[3]).slice(1);
|
|
(y.relurl = Yt(h, A)),
|
|
oe(y, p),
|
|
(p = y),
|
|
(v += y.duration),
|
|
f++,
|
|
(g = 0),
|
|
(S = !0);
|
|
}
|
|
} else if (s[4]) {
|
|
var k = (" " + s[4]).slice(1);
|
|
p ? y.setByteRange(k, p) : y.setByteRange(k);
|
|
} else if (s[5])
|
|
(y.rawProgramDateTime = (" " + s[5]).slice(1)),
|
|
y.tagList.push(["PROGRAM-DATE-TIME", y.rawProgramDateTime]),
|
|
-1 === T && (T = d.length);
|
|
else {
|
|
if (!(s = s[0].match(ee))) {
|
|
w.warn(
|
|
"No matches on slow regex match for level playlist!"
|
|
);
|
|
continue;
|
|
}
|
|
for (l = 1; l < s.length && void 0 === s[l]; l++);
|
|
var b = (" " + s[l]).slice(1),
|
|
D = (" " + s[l + 1]).slice(1),
|
|
I = s[l + 2] ? (" " + s[l + 2]).slice(1) : "";
|
|
switch (b) {
|
|
case "PLAYLIST-TYPE":
|
|
h.type = D.toUpperCase();
|
|
break;
|
|
case "MEDIA-SEQUENCE":
|
|
f = h.startSN = parseInt(D);
|
|
break;
|
|
case "SKIP":
|
|
var C = new P(D);
|
|
Vt(h, C, ["RECENTLY-REMOVED-DATERANGES"]);
|
|
var _ = C.decimalInteger("SKIPPED-SEGMENTS");
|
|
if (E(_)) {
|
|
h.skippedSegments = _;
|
|
for (var x = _; x--; ) d.unshift(null);
|
|
f += _;
|
|
}
|
|
var M = C.enumeratedString("RECENTLY-REMOVED-DATERANGES");
|
|
M && (h.recentlyRemovedDateranges = M.split("\t"));
|
|
break;
|
|
case "TARGETDURATION":
|
|
h.targetduration = Math.max(parseInt(D), 1);
|
|
break;
|
|
case "VERSION":
|
|
h.version = parseInt(D);
|
|
break;
|
|
case "EXTM3U":
|
|
break;
|
|
case "ENDLIST":
|
|
h.live = !1;
|
|
break;
|
|
case "#":
|
|
(D || I) && y.tagList.push(I ? [D, I] : [D]);
|
|
break;
|
|
case "DISCONTINUITY":
|
|
m++, y.tagList.push(["DIS"]);
|
|
break;
|
|
case "GAP":
|
|
(y.gap = !0), y.tagList.push([b]);
|
|
break;
|
|
case "BITRATE":
|
|
y.tagList.push([b, D]);
|
|
break;
|
|
case "DATERANGE":
|
|
var O = new P(D);
|
|
Vt(h, O, [
|
|
"ID",
|
|
"CLASS",
|
|
"START-DATE",
|
|
"END-DATE",
|
|
"SCTE35-CMD",
|
|
"SCTE35-OUT",
|
|
"SCTE35-IN",
|
|
]),
|
|
Vt(h, O, O.clientAttrs);
|
|
var N = new F(O, h.dateRanges[O.ID]);
|
|
N.isValid || h.skippedSegments
|
|
? (h.dateRanges[N.id] = N)
|
|
: w.warn('Ignoring invalid DATERANGE tag: "' + D + '"'),
|
|
y.tagList.push(["EXT-X-DATERANGE", D]);
|
|
break;
|
|
case "DEFINE":
|
|
var U = new P(D);
|
|
Vt(h, U, ["NAME", "VALUE", "IMPORT", "QUERYPARAM"]),
|
|
"IMPORT" in U ? jt(h, U, a) : Wt(h, U, e);
|
|
break;
|
|
case "DISCONTINUITY-SEQUENCE":
|
|
m = parseInt(D);
|
|
break;
|
|
case "KEY":
|
|
var B = ie(D, e, h);
|
|
if (B.isSupported()) {
|
|
if ("NONE" === B.method) {
|
|
u = void 0;
|
|
break;
|
|
}
|
|
u || (u = {}),
|
|
u[B.keyFormat] && (u = o({}, u)),
|
|
(u[B.keyFormat] = B);
|
|
} else
|
|
w.warn(
|
|
'[Keys] Ignoring invalid EXT-X-KEY tag: "' + D + '"'
|
|
);
|
|
break;
|
|
case "START":
|
|
h.startTimeOffset = ne(D);
|
|
break;
|
|
case "MAP":
|
|
var V = new P(D);
|
|
if ((Vt(h, V, ["BYTERANGE", "URI"]), y.duration)) {
|
|
var Y = new G(i, e);
|
|
le(Y, V, r, u),
|
|
(c = Y),
|
|
(y.initSegment = c),
|
|
c.rawProgramDateTime &&
|
|
!y.rawProgramDateTime &&
|
|
(y.rawProgramDateTime = c.rawProgramDateTime);
|
|
} else le(y, V, r, u), (c = y), (S = !0);
|
|
break;
|
|
case "SERVER-CONTROL":
|
|
var W = new P(D);
|
|
(h.canBlockReload = W.bool("CAN-BLOCK-RELOAD")),
|
|
(h.canSkipUntil = W.optionalFloat("CAN-SKIP-UNTIL", 0)),
|
|
(h.canSkipDateRanges =
|
|
h.canSkipUntil > 0 && W.bool("CAN-SKIP-DATERANGES")),
|
|
(h.partHoldBack = W.optionalFloat("PART-HOLD-BACK", 0)),
|
|
(h.holdBack = W.optionalFloat("HOLD-BACK", 0));
|
|
break;
|
|
case "PART-INF":
|
|
var j = new P(D);
|
|
h.partTarget = j.decimalFloatingPoint("PART-TARGET");
|
|
break;
|
|
case "PART":
|
|
var q = h.partList;
|
|
q || (q = h.partList = []);
|
|
var X = g > 0 ? q[q.length - 1] : void 0,
|
|
z = g++,
|
|
Q = new P(D);
|
|
Vt(h, Q, ["BYTERANGE", "URI"]);
|
|
var $ = new K(Q, y, e, z, X);
|
|
q.push($), (y.duration += $.duration);
|
|
break;
|
|
case "PRELOAD-HINT":
|
|
var J = new P(D);
|
|
Vt(h, J, ["URI"]), (h.preloadHint = J);
|
|
break;
|
|
case "RENDITION-REPORT":
|
|
var Z = new P(D);
|
|
Vt(h, Z, ["URI"]),
|
|
(h.renditionReports = h.renditionReports || []),
|
|
h.renditionReports.push(Z);
|
|
break;
|
|
default:
|
|
w.warn("line parsed but not handled: " + s);
|
|
}
|
|
}
|
|
}
|
|
p && !p.relurl
|
|
? (d.pop(),
|
|
(v -= p.duration),
|
|
h.partList && (h.fragmentHint = p))
|
|
: h.partList &&
|
|
(oe(y, p),
|
|
(y.cc = m),
|
|
(h.fragmentHint = y),
|
|
u && ue(y, u, h));
|
|
var tt = d.length,
|
|
et = d[0],
|
|
rt = d[tt - 1];
|
|
if ((v += h.skippedSegments * h.targetduration) > 0 && tt && rt) {
|
|
h.averagetargetduration = v / tt;
|
|
var it = rt.sn;
|
|
(h.endSN = "initSegment" !== it ? it : 0),
|
|
h.live || (rt.endList = !0),
|
|
et && (h.startCC = et.cc);
|
|
} else (h.endSN = 0), (h.startCC = 0);
|
|
return (
|
|
h.fragmentHint && (v += h.fragmentHint.duration),
|
|
(h.totalduration = v),
|
|
(h.endCC = m),
|
|
T > 0 &&
|
|
(function (t, e) {
|
|
for (var r = t[e], i = e; i--; ) {
|
|
var n = t[i];
|
|
if (!n) return;
|
|
(n.programDateTime =
|
|
r.programDateTime - 1e3 * n.duration),
|
|
(r = n);
|
|
}
|
|
})(d, T),
|
|
h
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function ie(t, e, r) {
|
|
var i,
|
|
n,
|
|
a = new P(t);
|
|
Vt(r, a, ["KEYFORMAT", "KEYFORMATVERSIONS", "URI", "IV", "URI"]);
|
|
var s = null != (i = a.METHOD) ? i : "",
|
|
o = a.URI,
|
|
l = a.hexadecimalInteger("IV"),
|
|
u = a.KEYFORMATVERSIONS,
|
|
h = null != (n = a.KEYFORMAT) ? n : "identity";
|
|
o && a.IV && !l && w.error("Invalid IV: " + a.IV);
|
|
var d = o ? re.resolve(o, e) : "",
|
|
c = (u || "1").split("/").map(Number).filter(Number.isFinite);
|
|
return new Gt(s, d, h, c, l);
|
|
}
|
|
function ne(t) {
|
|
var e = new P(t).decimalFloatingPoint("TIME-OFFSET");
|
|
return E(e) ? e : null;
|
|
}
|
|
function ae(t, e) {
|
|
["video", "audio", "text"].forEach(function (r) {
|
|
var i = t.filter(function (t) {
|
|
return (function (t, e) {
|
|
var r = Xt[e];
|
|
return !!r && !0 === r[t.slice(0, 4)];
|
|
})(t, r);
|
|
});
|
|
if (i.length) {
|
|
var n = i.filter(function (t) {
|
|
return (
|
|
0 === t.lastIndexOf("avc1", 0) || 0 === t.lastIndexOf("mp4a", 0)
|
|
);
|
|
});
|
|
(e[r + "Codec"] = n.length > 0 ? n[0] : i[0]),
|
|
(t = t.filter(function (t) {
|
|
return -1 === i.indexOf(t);
|
|
}));
|
|
}
|
|
}),
|
|
(e.unknownCodecs = t);
|
|
}
|
|
function se(t, e, r) {
|
|
var i = e[r];
|
|
i && (t[r] = i);
|
|
}
|
|
function oe(t, e) {
|
|
t.rawProgramDateTime
|
|
? (t.programDateTime = Date.parse(t.rawProgramDateTime))
|
|
: null != e &&
|
|
e.programDateTime &&
|
|
(t.programDateTime = e.endProgramDateTime),
|
|
E(t.programDateTime) ||
|
|
((t.programDateTime = null), (t.rawProgramDateTime = null));
|
|
}
|
|
function le(t, e, r, i) {
|
|
(t.relurl = e.URI),
|
|
e.BYTERANGE && t.setByteRange(e.BYTERANGE),
|
|
(t.level = r),
|
|
(t.sn = "initSegment"),
|
|
i && (t.levelkeys = i),
|
|
(t.initSegment = null);
|
|
}
|
|
function ue(t, e, r) {
|
|
t.levelkeys = e;
|
|
var i = r.encryptedFragments;
|
|
(i.length && i[i.length - 1].levelkeys === e) ||
|
|
!Object.keys(e).some(function (t) {
|
|
return e[t].isCommonEncryption;
|
|
}) ||
|
|
i.push(t);
|
|
}
|
|
var he = "manifest",
|
|
de = "level",
|
|
ce = "audioTrack",
|
|
fe = "subtitleTrack",
|
|
ge = "main",
|
|
ve = "audio",
|
|
me = "subtitle";
|
|
function pe(t) {
|
|
switch (t.type) {
|
|
case ce:
|
|
return ve;
|
|
case fe:
|
|
return me;
|
|
default:
|
|
return ge;
|
|
}
|
|
}
|
|
function ye(t, e) {
|
|
var r = t.url;
|
|
return (void 0 !== r && 0 !== r.indexOf("data:")) || (r = e.url), r;
|
|
}
|
|
var Te = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.loaders = Object.create(null)),
|
|
(this.variableList = null),
|
|
(this.hls = t),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.startLoad = function (t) {}),
|
|
(e.stopLoad = function () {
|
|
this.destroyInternalLoaders();
|
|
}),
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.on(S.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this),
|
|
t.on(S.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.off(S.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this),
|
|
t.off(
|
|
S.SUBTITLE_TRACK_LOADING,
|
|
this.onSubtitleTrackLoading,
|
|
this
|
|
);
|
|
}),
|
|
(e.createInternalLoader = function (t) {
|
|
var e = this.hls.config,
|
|
r = e.pLoader,
|
|
i = e.loader,
|
|
n = new (r || i)(e);
|
|
return (this.loaders[t.type] = n), n;
|
|
}),
|
|
(e.getInternalLoader = function (t) {
|
|
return this.loaders[t.type];
|
|
}),
|
|
(e.resetInternalLoader = function (t) {
|
|
this.loaders[t] && delete this.loaders[t];
|
|
}),
|
|
(e.destroyInternalLoaders = function () {
|
|
for (var t in this.loaders) {
|
|
var e = this.loaders[t];
|
|
e && e.destroy(), this.resetInternalLoader(t);
|
|
}
|
|
}),
|
|
(e.destroy = function () {
|
|
(this.variableList = null),
|
|
this.unregisterListeners(),
|
|
this.destroyInternalLoaders();
|
|
}),
|
|
(e.onManifestLoading = function (t, e) {
|
|
var r = e.url;
|
|
(this.variableList = null),
|
|
this.load({
|
|
id: null,
|
|
level: 0,
|
|
responseType: "text",
|
|
type: he,
|
|
url: r,
|
|
deliveryDirectives: null,
|
|
});
|
|
}),
|
|
(e.onLevelLoading = function (t, e) {
|
|
var r = e.id,
|
|
i = e.level,
|
|
n = e.url,
|
|
a = e.deliveryDirectives;
|
|
this.load({
|
|
id: r,
|
|
level: i,
|
|
responseType: "text",
|
|
type: de,
|
|
url: n,
|
|
deliveryDirectives: a,
|
|
});
|
|
}),
|
|
(e.onAudioTrackLoading = function (t, e) {
|
|
var r = e.id,
|
|
i = e.groupId,
|
|
n = e.url,
|
|
a = e.deliveryDirectives;
|
|
this.load({
|
|
id: r,
|
|
groupId: i,
|
|
level: null,
|
|
responseType: "text",
|
|
type: ce,
|
|
url: n,
|
|
deliveryDirectives: a,
|
|
});
|
|
}),
|
|
(e.onSubtitleTrackLoading = function (t, e) {
|
|
var r = e.id,
|
|
i = e.groupId,
|
|
n = e.url,
|
|
a = e.deliveryDirectives;
|
|
this.load({
|
|
id: r,
|
|
groupId: i,
|
|
level: null,
|
|
responseType: "text",
|
|
type: fe,
|
|
url: n,
|
|
deliveryDirectives: a,
|
|
});
|
|
}),
|
|
(e.load = function (t) {
|
|
var e,
|
|
r,
|
|
i,
|
|
n = this,
|
|
a = this.hls.config,
|
|
s = this.getInternalLoader(t);
|
|
if (s) {
|
|
var l = s.context;
|
|
if (l && l.url === t.url)
|
|
return void w.trace(
|
|
"[playlist-loader]: playlist request ongoing"
|
|
);
|
|
w.log(
|
|
"[playlist-loader]: aborting previous loader for type: " +
|
|
t.type
|
|
),
|
|
s.abort();
|
|
}
|
|
if (
|
|
((r =
|
|
t.type === he
|
|
? a.manifestLoadPolicy.default
|
|
: o({}, a.playlistLoadPolicy.default, {
|
|
timeoutRetry: null,
|
|
errorRetry: null,
|
|
})),
|
|
(s = this.createInternalLoader(t)),
|
|
null != (e = t.deliveryDirectives) &&
|
|
e.part &&
|
|
(t.type === de && null !== t.level
|
|
? (i = this.hls.levels[t.level].details)
|
|
: t.type === ce && null !== t.id
|
|
? (i = this.hls.audioTracks[t.id].details)
|
|
: t.type === fe &&
|
|
null !== t.id &&
|
|
(i = this.hls.subtitleTracks[t.id].details),
|
|
i))
|
|
) {
|
|
var u = i.partTarget,
|
|
h = i.targetduration;
|
|
if (u && h) {
|
|
var d = 1e3 * Math.max(3 * u, 0.8 * h);
|
|
r = o({}, r, {
|
|
maxTimeToFirstByteMs: Math.min(d, r.maxTimeToFirstByteMs),
|
|
maxLoadTimeMs: Math.min(d, r.maxTimeToFirstByteMs),
|
|
});
|
|
}
|
|
}
|
|
var c = r.errorRetry || r.timeoutRetry || {},
|
|
f = {
|
|
loadPolicy: r,
|
|
timeout: r.maxLoadTimeMs,
|
|
maxRetry: c.maxNumRetry || 0,
|
|
retryDelay: c.retryDelayMs || 0,
|
|
maxRetryDelay: c.maxRetryDelayMs || 0,
|
|
},
|
|
g = {
|
|
onSuccess: function (t, e, r, i) {
|
|
var a = n.getInternalLoader(r);
|
|
n.resetInternalLoader(r.type);
|
|
var s = t.data;
|
|
0 === s.indexOf("#EXTM3U")
|
|
? ((e.parsing.start = performance.now()),
|
|
re.isMediaPlaylist(s)
|
|
? n.handleTrackOrLevelPlaylist(t, e, r, i || null, a)
|
|
: n.handleMasterPlaylist(t, e, r, i))
|
|
: n.handleManifestParsingError(
|
|
t,
|
|
r,
|
|
new Error("no EXTM3U delimiter"),
|
|
i || null,
|
|
e
|
|
);
|
|
},
|
|
onError: function (t, e, r, i) {
|
|
n.handleNetworkError(e, r, !1, t, i);
|
|
},
|
|
onTimeout: function (t, e, r) {
|
|
n.handleNetworkError(e, r, !0, void 0, t);
|
|
},
|
|
};
|
|
s.load(t, f, g);
|
|
}),
|
|
(e.handleMasterPlaylist = function (t, e, r, i) {
|
|
var n = this.hls,
|
|
a = t.data,
|
|
s = ye(t, r),
|
|
o = re.parseMasterPlaylist(a, s);
|
|
if (o.playlistParsingError)
|
|
this.handleManifestParsingError(
|
|
t,
|
|
r,
|
|
o.playlistParsingError,
|
|
i,
|
|
e
|
|
);
|
|
else {
|
|
var l = o.contentSteering,
|
|
u = o.levels,
|
|
h = o.sessionData,
|
|
d = o.sessionKeys,
|
|
c = o.startTimeOffset,
|
|
f = o.variableList;
|
|
this.variableList = f;
|
|
var g = re.parseMasterPlaylistMedia(a, s, o),
|
|
v = g.AUDIO,
|
|
m = void 0 === v ? [] : v,
|
|
p = g.SUBTITLES,
|
|
y = g["CLOSED-CAPTIONS"];
|
|
m.length &&
|
|
(m.some(function (t) {
|
|
return !t.url;
|
|
}) ||
|
|
!u[0].audioCodec ||
|
|
u[0].attrs.AUDIO ||
|
|
(w.log(
|
|
"[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"
|
|
),
|
|
m.unshift({
|
|
type: "main",
|
|
name: "main",
|
|
groupId: "main",
|
|
default: !1,
|
|
autoselect: !1,
|
|
forced: !1,
|
|
id: -1,
|
|
attrs: new P({}),
|
|
bitrate: 0,
|
|
url: "",
|
|
}))),
|
|
n.trigger(S.MANIFEST_LOADED, {
|
|
levels: u,
|
|
audioTracks: m,
|
|
subtitles: p,
|
|
captions: y,
|
|
contentSteering: l,
|
|
url: s,
|
|
stats: e,
|
|
networkDetails: i,
|
|
sessionData: h,
|
|
sessionKeys: d,
|
|
startTimeOffset: c,
|
|
variableList: f,
|
|
});
|
|
}
|
|
}),
|
|
(e.handleTrackOrLevelPlaylist = function (t, e, r, i, n) {
|
|
var a = this.hls,
|
|
s = r.id,
|
|
o = r.level,
|
|
l = r.type,
|
|
u = ye(t, r),
|
|
h = E(s) ? s : 0,
|
|
d = E(o) ? o : h,
|
|
c = pe(r),
|
|
f = re.parseLevelPlaylist(t.data, u, d, c, h, this.variableList);
|
|
if (l === he) {
|
|
var g = {
|
|
attrs: new P({}),
|
|
bitrate: 0,
|
|
details: f,
|
|
name: "",
|
|
url: u,
|
|
};
|
|
a.trigger(S.MANIFEST_LOADED, {
|
|
levels: [g],
|
|
audioTracks: [],
|
|
url: u,
|
|
stats: e,
|
|
networkDetails: i,
|
|
sessionData: null,
|
|
sessionKeys: null,
|
|
contentSteering: null,
|
|
startTimeOffset: null,
|
|
variableList: null,
|
|
});
|
|
}
|
|
(e.parsing.end = performance.now()),
|
|
(r.levelDetails = f),
|
|
this.handlePlaylistLoaded(f, t, e, r, i, n);
|
|
}),
|
|
(e.handleManifestParsingError = function (t, e, r, i, n) {
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.NETWORK_ERROR,
|
|
details: R.MANIFEST_PARSING_ERROR,
|
|
fatal: e.type === he,
|
|
url: t.url,
|
|
err: r,
|
|
error: r,
|
|
reason: r.message,
|
|
response: t,
|
|
context: e,
|
|
networkDetails: i,
|
|
stats: n,
|
|
});
|
|
}),
|
|
(e.handleNetworkError = function (t, e, r, n, a) {
|
|
void 0 === r && (r = !1);
|
|
var s =
|
|
"A network " +
|
|
(r
|
|
? "timeout"
|
|
: "error" + (n ? " (status " + n.code + ")" : "")) +
|
|
" occurred while loading " +
|
|
t.type;
|
|
t.type === de
|
|
? (s += ": " + t.level + " id: " + t.id)
|
|
: (t.type !== ce && t.type !== fe) ||
|
|
(s += " id: " + t.id + ' group-id: "' + t.groupId + '"');
|
|
var o = new Error(s);
|
|
w.warn("[playlist-loader]: " + s);
|
|
var l = R.UNKNOWN,
|
|
u = !1,
|
|
h = this.getInternalLoader(t);
|
|
switch (t.type) {
|
|
case he:
|
|
(l = r ? R.MANIFEST_LOAD_TIMEOUT : R.MANIFEST_LOAD_ERROR),
|
|
(u = !0);
|
|
break;
|
|
case de:
|
|
(l = r ? R.LEVEL_LOAD_TIMEOUT : R.LEVEL_LOAD_ERROR), (u = !1);
|
|
break;
|
|
case ce:
|
|
(l = r ? R.AUDIO_TRACK_LOAD_TIMEOUT : R.AUDIO_TRACK_LOAD_ERROR),
|
|
(u = !1);
|
|
break;
|
|
case fe:
|
|
(l = r ? R.SUBTITLE_TRACK_LOAD_TIMEOUT : R.SUBTITLE_LOAD_ERROR),
|
|
(u = !1);
|
|
}
|
|
h && this.resetInternalLoader(t.type);
|
|
var d = {
|
|
type: L.NETWORK_ERROR,
|
|
details: l,
|
|
fatal: u,
|
|
url: t.url,
|
|
loader: h,
|
|
context: t,
|
|
error: o,
|
|
networkDetails: e,
|
|
stats: a,
|
|
};
|
|
if (n) {
|
|
var c = (null == e ? void 0 : e.url) || t.url;
|
|
d.response = i({ url: c, data: void 0 }, n);
|
|
}
|
|
this.hls.trigger(S.ERROR, d);
|
|
}),
|
|
(e.handlePlaylistLoaded = function (t, e, r, i, n, a) {
|
|
var s = this.hls,
|
|
o = i.type,
|
|
l = i.level,
|
|
u = i.id,
|
|
h = i.groupId,
|
|
d = i.deliveryDirectives,
|
|
c = ye(e, i),
|
|
f = pe(i),
|
|
g = "number" == typeof i.level && f === ge ? l : void 0;
|
|
if (t.fragments.length) {
|
|
t.targetduration ||
|
|
(t.playlistParsingError = new Error("Missing Target Duration"));
|
|
var v = t.playlistParsingError;
|
|
if (v)
|
|
s.trigger(S.ERROR, {
|
|
type: L.NETWORK_ERROR,
|
|
details: R.LEVEL_PARSING_ERROR,
|
|
fatal: !1,
|
|
url: c,
|
|
error: v,
|
|
reason: v.message,
|
|
response: e,
|
|
context: i,
|
|
level: g,
|
|
parent: f,
|
|
networkDetails: n,
|
|
stats: r,
|
|
});
|
|
else
|
|
switch (
|
|
(t.live &&
|
|
a &&
|
|
(a.getCacheAge && (t.ageHeader = a.getCacheAge() || 0),
|
|
(a.getCacheAge && !isNaN(t.ageHeader)) ||
|
|
(t.ageHeader = 0)),
|
|
o)
|
|
) {
|
|
case he:
|
|
case de:
|
|
s.trigger(S.LEVEL_LOADED, {
|
|
details: t,
|
|
level: g || 0,
|
|
id: u || 0,
|
|
stats: r,
|
|
networkDetails: n,
|
|
deliveryDirectives: d,
|
|
});
|
|
break;
|
|
case ce:
|
|
s.trigger(S.AUDIO_TRACK_LOADED, {
|
|
details: t,
|
|
id: u || 0,
|
|
groupId: h || "",
|
|
stats: r,
|
|
networkDetails: n,
|
|
deliveryDirectives: d,
|
|
});
|
|
break;
|
|
case fe:
|
|
s.trigger(S.SUBTITLE_TRACK_LOADED, {
|
|
details: t,
|
|
id: u || 0,
|
|
groupId: h || "",
|
|
stats: r,
|
|
networkDetails: n,
|
|
deliveryDirectives: d,
|
|
});
|
|
}
|
|
} else {
|
|
var m = new Error("No Segments found in Playlist");
|
|
s.trigger(S.ERROR, {
|
|
type: L.NETWORK_ERROR,
|
|
details: R.LEVEL_EMPTY_ERROR,
|
|
fatal: !1,
|
|
url: c,
|
|
error: m,
|
|
reason: m.message,
|
|
response: e,
|
|
context: i,
|
|
level: g,
|
|
parent: f,
|
|
networkDetails: n,
|
|
stats: r,
|
|
});
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Ee(t, e) {
|
|
var r;
|
|
try {
|
|
r = new Event("addtrack");
|
|
} catch (t) {
|
|
(r = document.createEvent("Event")).initEvent("addtrack", !1, !1);
|
|
}
|
|
(r.track = t), e.dispatchEvent(r);
|
|
}
|
|
function Se(t, e) {
|
|
var r = t.mode;
|
|
if (
|
|
("disabled" === r && (t.mode = "hidden"),
|
|
t.cues && !t.cues.getCueById(e.id))
|
|
)
|
|
try {
|
|
if ((t.addCue(e), !t.cues.getCueById(e.id)))
|
|
throw new Error("addCue is failed for: " + e);
|
|
} catch (r) {
|
|
w.debug("[texttrack-utils]: " + r);
|
|
try {
|
|
var i = new self.TextTrackCue(e.startTime, e.endTime, e.text);
|
|
(i.id = e.id), t.addCue(i);
|
|
} catch (t) {
|
|
w.debug(
|
|
"[texttrack-utils]: Legacy TextTrackCue fallback failed: " + t
|
|
);
|
|
}
|
|
}
|
|
"disabled" === r && (t.mode = r);
|
|
}
|
|
function Le(t) {
|
|
var e = t.mode;
|
|
if (("disabled" === e && (t.mode = "hidden"), t.cues))
|
|
for (var r = t.cues.length; r--; ) t.removeCue(t.cues[r]);
|
|
"disabled" === e && (t.mode = e);
|
|
}
|
|
function Re(t, e, r, i) {
|
|
var n = t.mode;
|
|
if (
|
|
("disabled" === n && (t.mode = "hidden"), t.cues && t.cues.length > 0)
|
|
)
|
|
for (
|
|
var a = (function (t, e, r) {
|
|
var i = [],
|
|
n = (function (t, e) {
|
|
if (e < t[0].startTime) return 0;
|
|
var r = t.length - 1;
|
|
if (e > t[r].endTime) return -1;
|
|
for (var i = 0, n = r; i <= n; ) {
|
|
var a = Math.floor((n + i) / 2);
|
|
if (e < t[a].startTime) n = a - 1;
|
|
else {
|
|
if (!(e > t[a].startTime && i < r)) return a;
|
|
i = a + 1;
|
|
}
|
|
}
|
|
return t[i].startTime - e < e - t[n].startTime ? i : n;
|
|
})(t, e);
|
|
if (n > -1)
|
|
for (var a = n, s = t.length; a < s; a++) {
|
|
var o = t[a];
|
|
if (o.startTime >= e && o.endTime <= r) i.push(o);
|
|
else if (o.startTime > r) return i;
|
|
}
|
|
return i;
|
|
})(t.cues, e, r),
|
|
s = 0;
|
|
s < a.length;
|
|
s++
|
|
)
|
|
(i && !i(a[s])) || t.removeCue(a[s]);
|
|
"disabled" === n && (t.mode = n);
|
|
}
|
|
var Ae = "org.id3",
|
|
ke = "com.apple.quicktime.HLS",
|
|
be = "https://aomedia.org/emsg/ID3";
|
|
function De() {
|
|
if ("undefined" != typeof self)
|
|
return self.WebKitDataCue || self.VTTCue || self.TextTrackCue;
|
|
}
|
|
var Ie = (function () {
|
|
var t = De();
|
|
try {
|
|
new t(0, Number.POSITIVE_INFINITY, "");
|
|
} catch (t) {
|
|
return Number.MAX_VALUE;
|
|
}
|
|
return Number.POSITIVE_INFINITY;
|
|
})();
|
|
function we(t, e) {
|
|
return t.getTime() / 1e3 - e;
|
|
}
|
|
var Ce = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.id3Track = null),
|
|
(this.media = null),
|
|
(this.dateRangeCuesAppended = {}),
|
|
(this.hls = t),
|
|
this._registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this._unregisterListeners(),
|
|
(this.id3Track = null),
|
|
(this.media = null),
|
|
(this.dateRangeCuesAppended = {}),
|
|
(this.hls = null);
|
|
}),
|
|
(e._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this),
|
|
t.on(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.on(S.LEVEL_UPDATED, this.onLevelUpdated, this);
|
|
}),
|
|
(e._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(
|
|
S.FRAG_PARSING_METADATA,
|
|
this.onFragParsingMetadata,
|
|
this
|
|
),
|
|
t.off(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.off(S.LEVEL_UPDATED, this.onLevelUpdated, this);
|
|
}),
|
|
(e.onMediaAttached = function (t, e) {
|
|
this.media = e.media;
|
|
}),
|
|
(e.onMediaDetaching = function () {
|
|
this.id3Track &&
|
|
(Le(this.id3Track),
|
|
(this.id3Track = null),
|
|
(this.media = null),
|
|
(this.dateRangeCuesAppended = {}));
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
this.dateRangeCuesAppended = {};
|
|
}),
|
|
(e.createTrack = function (t) {
|
|
var e = this.getID3Track(t.textTracks);
|
|
return (e.mode = "hidden"), e;
|
|
}),
|
|
(e.getID3Track = function (t) {
|
|
if (this.media) {
|
|
for (var e = 0; e < t.length; e++) {
|
|
var r = t[e];
|
|
if ("metadata" === r.kind && "id3" === r.label)
|
|
return Ee(r, this.media), r;
|
|
}
|
|
return this.media.addTextTrack("metadata", "id3");
|
|
}
|
|
}),
|
|
(e.onFragParsingMetadata = function (t, e) {
|
|
if (this.media) {
|
|
var r = this.hls.config,
|
|
i = r.enableEmsgMetadataCues,
|
|
n = r.enableID3MetadataCues;
|
|
if (i || n) {
|
|
var a = e.samples;
|
|
this.id3Track ||
|
|
(this.id3Track = this.createTrack(this.media));
|
|
for (var s = De(), o = 0; o < a.length; o++) {
|
|
var l = a[o].type;
|
|
if ((l !== be || i) && n) {
|
|
var u = dt(a[o].data);
|
|
if (u) {
|
|
var h = a[o].pts,
|
|
d = h + a[o].duration;
|
|
d > Ie && (d = Ie), d - h <= 0 && (d = h + 0.25);
|
|
for (var c = 0; c < u.length; c++) {
|
|
var f = u[c];
|
|
if (!ut(f)) {
|
|
this.updateId3CueEnds(h, l);
|
|
var g = new s(h, d, "");
|
|
(g.value = f),
|
|
l && (g.type = l),
|
|
this.id3Track.addCue(g);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.updateId3CueEnds = function (t, e) {
|
|
var r,
|
|
i = null == (r = this.id3Track) ? void 0 : r.cues;
|
|
if (i)
|
|
for (var n = i.length; n--; ) {
|
|
var a = i[n];
|
|
a.type === e &&
|
|
a.startTime < t &&
|
|
a.endTime === Ie &&
|
|
(a.endTime = t);
|
|
}
|
|
}),
|
|
(e.onBufferFlushing = function (t, e) {
|
|
var r = e.startOffset,
|
|
i = e.endOffset,
|
|
n = e.type,
|
|
a = this.id3Track,
|
|
s = this.hls;
|
|
if (s) {
|
|
var o = s.config,
|
|
l = o.enableEmsgMetadataCues,
|
|
u = o.enableID3MetadataCues;
|
|
a &&
|
|
(l || u) &&
|
|
Re(
|
|
a,
|
|
r,
|
|
i,
|
|
"audio" === n
|
|
? function (t) {
|
|
return t.type === Ae && u;
|
|
}
|
|
: "video" === n
|
|
? function (t) {
|
|
return t.type === be && l;
|
|
}
|
|
: function (t) {
|
|
return (t.type === Ae && u) || (t.type === be && l);
|
|
}
|
|
);
|
|
}
|
|
}),
|
|
(e.onLevelUpdated = function (t, e) {
|
|
var r = this,
|
|
i = e.details;
|
|
if (
|
|
this.media &&
|
|
i.hasProgramDateTime &&
|
|
this.hls.config.enableDateRangeMetadataCues
|
|
) {
|
|
var n = this.dateRangeCuesAppended,
|
|
a = this.id3Track,
|
|
s = i.dateRanges,
|
|
o = Object.keys(s);
|
|
if (a)
|
|
for (
|
|
var l = Object.keys(n).filter(function (t) {
|
|
return !o.includes(t);
|
|
}),
|
|
u = function () {
|
|
var t = l[h];
|
|
Object.keys(n[t].cues).forEach(function (e) {
|
|
a.removeCue(n[t].cues[e]);
|
|
}),
|
|
delete n[t];
|
|
},
|
|
h = l.length;
|
|
h--;
|
|
|
|
)
|
|
u();
|
|
var d = i.fragments[i.fragments.length - 1];
|
|
if (
|
|
0 !== o.length &&
|
|
E(null == d ? void 0 : d.programDateTime)
|
|
) {
|
|
this.id3Track ||
|
|
(this.id3Track = this.createTrack(this.media));
|
|
for (
|
|
var c = d.programDateTime / 1e3 - d.start,
|
|
f = De(),
|
|
g = function () {
|
|
var t = o[v],
|
|
e = s[t],
|
|
i = n[t],
|
|
a = (null == i ? void 0 : i.cues) || {},
|
|
l = (null == i ? void 0 : i.durationKnown) || !1,
|
|
u = we(e.startDate, c),
|
|
h = Ie,
|
|
d = e.endDate;
|
|
if (d) (h = we(d, c)), (l = !0);
|
|
else if (e.endOnNext && !l) {
|
|
var g = o
|
|
.reduce(function (t, r) {
|
|
var i = s[r];
|
|
return (
|
|
i.class === e.class &&
|
|
i.id !== r &&
|
|
i.startDate > e.startDate &&
|
|
t.push(i),
|
|
t
|
|
);
|
|
}, [])
|
|
.sort(function (t, e) {
|
|
return (
|
|
t.startDate.getTime() - e.startDate.getTime()
|
|
);
|
|
})[0];
|
|
g && ((h = we(g.startDate, c)), (l = !0));
|
|
}
|
|
for (
|
|
var m, p, y = Object.keys(e.attr), T = 0;
|
|
T < y.length;
|
|
T++
|
|
) {
|
|
var E = y[T];
|
|
if (
|
|
"ID" !== (p = E) &&
|
|
"CLASS" !== p &&
|
|
"START-DATE" !== p &&
|
|
"DURATION" !== p &&
|
|
"END-DATE" !== p &&
|
|
"END-ON-NEXT" !== p
|
|
) {
|
|
var S = a[E];
|
|
if (S) l && !i.durationKnown && (S.endTime = h);
|
|
else {
|
|
var L = e.attr[E];
|
|
(S = new f(u, h, "")),
|
|
x(E) &&
|
|
((m = L),
|
|
(L = Uint8Array.from(
|
|
m
|
|
.replace(/^0x/, "")
|
|
.replace(/([\da-fA-F]{2}) ?/g, "0x$1 ")
|
|
.replace(/ +$/, "")
|
|
.split(" ")
|
|
).buffer)),
|
|
(S.value = { key: E, data: L }),
|
|
(S.type = ke),
|
|
(S.id = t),
|
|
r.id3Track.addCue(S),
|
|
(a[E] = S);
|
|
}
|
|
}
|
|
}
|
|
n[t] = { cues: a, dateRange: e, durationKnown: l };
|
|
},
|
|
v = 0;
|
|
v < o.length;
|
|
v++
|
|
)
|
|
g();
|
|
}
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
_e = (function () {
|
|
function t(t) {
|
|
var e = this;
|
|
(this.hls = void 0),
|
|
(this.config = void 0),
|
|
(this.media = null),
|
|
(this.levelDetails = null),
|
|
(this.currentTime = 0),
|
|
(this.stallCount = 0),
|
|
(this._latency = null),
|
|
(this.timeupdateHandler = function () {
|
|
return e.timeupdate();
|
|
}),
|
|
(this.hls = t),
|
|
(this.config = t.config),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
this.onMediaDetaching(),
|
|
(this.levelDetails = null),
|
|
(this.hls = this.timeupdateHandler = null);
|
|
}),
|
|
(e.registerListeners = function () {
|
|
this.hls.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
this.hls.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
this.hls.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
this.hls.on(S.LEVEL_UPDATED, this.onLevelUpdated, this),
|
|
this.hls.on(S.ERROR, this.onError, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
this.hls.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
this.hls.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
this.hls.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
this.hls.off(S.LEVEL_UPDATED, this.onLevelUpdated, this),
|
|
this.hls.off(S.ERROR, this.onError, this);
|
|
}),
|
|
(e.onMediaAttached = function (t, e) {
|
|
(this.media = e.media),
|
|
this.media.addEventListener(
|
|
"timeupdate",
|
|
this.timeupdateHandler
|
|
);
|
|
}),
|
|
(e.onMediaDetaching = function () {
|
|
this.media &&
|
|
(this.media.removeEventListener(
|
|
"timeupdate",
|
|
this.timeupdateHandler
|
|
),
|
|
(this.media = null));
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
(this.levelDetails = null),
|
|
(this._latency = null),
|
|
(this.stallCount = 0);
|
|
}),
|
|
(e.onLevelUpdated = function (t, e) {
|
|
var r = e.details;
|
|
(this.levelDetails = r),
|
|
r.advanced && this.timeupdate(),
|
|
!r.live &&
|
|
this.media &&
|
|
this.media.removeEventListener(
|
|
"timeupdate",
|
|
this.timeupdateHandler
|
|
);
|
|
}),
|
|
(e.onError = function (t, e) {
|
|
var r;
|
|
e.details === R.BUFFER_STALLED_ERROR &&
|
|
(this.stallCount++,
|
|
null != (r = this.levelDetails) &&
|
|
r.live &&
|
|
w.warn(
|
|
"[playback-rate-controller]: Stall detected, adjusting target latency"
|
|
));
|
|
}),
|
|
(e.timeupdate = function () {
|
|
var t = this.media,
|
|
e = this.levelDetails;
|
|
if (t && e) {
|
|
this.currentTime = t.currentTime;
|
|
var r = this.computeLatency();
|
|
if (null !== r) {
|
|
this._latency = r;
|
|
var i = this.config,
|
|
n = i.lowLatencyMode,
|
|
a = i.maxLiveSyncPlaybackRate;
|
|
if (n && 1 !== a) {
|
|
var s = this.targetLatency;
|
|
if (null !== s) {
|
|
var o = r - s,
|
|
l = o < Math.min(this.maxLatency, s + e.targetduration);
|
|
if (
|
|
e.live &&
|
|
l &&
|
|
o > 0.05 &&
|
|
this.forwardBufferLength > 1
|
|
) {
|
|
var u = Math.min(2, Math.max(1, a)),
|
|
h =
|
|
Math.round(
|
|
(2 /
|
|
(1 + Math.exp(-0.75 * o - this.edgeStalled))) *
|
|
20
|
|
) / 20;
|
|
t.playbackRate = Math.min(u, Math.max(1, h));
|
|
} else
|
|
1 !== t.playbackRate &&
|
|
0 !== t.playbackRate &&
|
|
(t.playbackRate = 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.estimateLiveEdge = function () {
|
|
var t = this.levelDetails;
|
|
return null === t ? null : t.edge + t.age;
|
|
}),
|
|
(e.computeLatency = function () {
|
|
var t = this.estimateLiveEdge();
|
|
return null === t ? null : t - this.currentTime;
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "latency",
|
|
get: function () {
|
|
return this._latency || 0;
|
|
},
|
|
},
|
|
{
|
|
key: "maxLatency",
|
|
get: function () {
|
|
var t = this.config,
|
|
e = this.levelDetails;
|
|
return void 0 !== t.liveMaxLatencyDuration
|
|
? t.liveMaxLatencyDuration
|
|
: e
|
|
? t.liveMaxLatencyDurationCount * e.targetduration
|
|
: 0;
|
|
},
|
|
},
|
|
{
|
|
key: "targetLatency",
|
|
get: function () {
|
|
var t = this.levelDetails;
|
|
if (null === t) return null;
|
|
var e = t.holdBack,
|
|
r = t.partHoldBack,
|
|
i = t.targetduration,
|
|
n = this.config,
|
|
a = n.liveSyncDuration,
|
|
s = n.liveSyncDurationCount,
|
|
o = n.lowLatencyMode,
|
|
l = this.hls.userConfig,
|
|
u = (o && r) || e;
|
|
(l.liveSyncDuration || l.liveSyncDurationCount || 0 === u) &&
|
|
(u = void 0 !== a ? a : s * i);
|
|
var h = i;
|
|
return u + Math.min(1 * this.stallCount, h);
|
|
},
|
|
},
|
|
{
|
|
key: "liveSyncPosition",
|
|
get: function () {
|
|
var t = this.estimateLiveEdge(),
|
|
e = this.targetLatency,
|
|
r = this.levelDetails;
|
|
if (null === t || null === e || null === r) return null;
|
|
var i = r.edge,
|
|
n = t - e - this.edgeStalled,
|
|
a = i - r.totalduration,
|
|
s =
|
|
i -
|
|
((this.config.lowLatencyMode && r.partTarget) ||
|
|
r.targetduration);
|
|
return Math.min(Math.max(a, n), s);
|
|
},
|
|
},
|
|
{
|
|
key: "drift",
|
|
get: function () {
|
|
var t = this.levelDetails;
|
|
return null === t ? 1 : t.drift;
|
|
},
|
|
},
|
|
{
|
|
key: "edgeStalled",
|
|
get: function () {
|
|
var t = this.levelDetails;
|
|
if (null === t) return 0;
|
|
var e =
|
|
3 *
|
|
((this.config.lowLatencyMode && t.partTarget) ||
|
|
t.targetduration);
|
|
return Math.max(t.age - e, 0);
|
|
},
|
|
},
|
|
{
|
|
key: "forwardBufferLength",
|
|
get: function () {
|
|
var t = this.media,
|
|
e = this.levelDetails;
|
|
if (!t || !e) return 0;
|
|
var r = t.buffered.length;
|
|
return (
|
|
(r ? t.buffered.end(r - 1) : e.edge) - this.currentTime
|
|
);
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})(),
|
|
Pe = ["NONE", "TYPE-0", "TYPE-1", null],
|
|
xe = "",
|
|
Fe = "YES",
|
|
Me = "v2",
|
|
Oe = (function () {
|
|
function t(t, e, r) {
|
|
(this.msn = void 0),
|
|
(this.part = void 0),
|
|
(this.skip = void 0),
|
|
(this.msn = t),
|
|
(this.part = e),
|
|
(this.skip = r);
|
|
}
|
|
return (
|
|
(t.prototype.addDirectives = function (t) {
|
|
var e = new self.URL(t);
|
|
return (
|
|
void 0 !== this.msn &&
|
|
e.searchParams.set("_HLS_msn", this.msn.toString()),
|
|
void 0 !== this.part &&
|
|
e.searchParams.set("_HLS_part", this.part.toString()),
|
|
this.skip && e.searchParams.set("_HLS_skip", this.skip),
|
|
e.href
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Ne = (function () {
|
|
function t(t) {
|
|
(this._attrs = void 0),
|
|
(this.audioCodec = void 0),
|
|
(this.bitrate = void 0),
|
|
(this.codecSet = void 0),
|
|
(this.height = void 0),
|
|
(this.id = void 0),
|
|
(this.name = void 0),
|
|
(this.videoCodec = void 0),
|
|
(this.width = void 0),
|
|
(this.unknownCodecs = void 0),
|
|
(this.audioGroupIds = void 0),
|
|
(this.details = void 0),
|
|
(this.fragmentError = 0),
|
|
(this.loadError = 0),
|
|
(this.loaded = void 0),
|
|
(this.realBitrate = 0),
|
|
(this.textGroupIds = void 0),
|
|
(this.url = void 0),
|
|
(this._urlId = 0),
|
|
(this.url = [t.url]),
|
|
(this._attrs = [t.attrs]),
|
|
(this.bitrate = t.bitrate),
|
|
t.details && (this.details = t.details),
|
|
(this.id = t.id || 0),
|
|
(this.name = t.name),
|
|
(this.width = t.width || 0),
|
|
(this.height = t.height || 0),
|
|
(this.audioCodec = t.audioCodec),
|
|
(this.videoCodec = t.videoCodec),
|
|
(this.unknownCodecs = t.unknownCodecs),
|
|
(this.codecSet = [t.videoCodec, t.audioCodec]
|
|
.filter(function (t) {
|
|
return t;
|
|
})
|
|
.join(",")
|
|
.replace(/\.[^.,]+/g, ""));
|
|
}
|
|
return (
|
|
(t.prototype.addFallback = function (t) {
|
|
this.url.push(t.url), this._attrs.push(t.attrs);
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "maxBitrate",
|
|
get: function () {
|
|
return Math.max(this.realBitrate, this.bitrate);
|
|
},
|
|
},
|
|
{
|
|
key: "attrs",
|
|
get: function () {
|
|
return this._attrs[this._urlId];
|
|
},
|
|
},
|
|
{
|
|
key: "pathwayId",
|
|
get: function () {
|
|
return this.attrs["PATHWAY-ID"] || ".";
|
|
},
|
|
},
|
|
{
|
|
key: "uri",
|
|
get: function () {
|
|
return this.url[this._urlId] || "";
|
|
},
|
|
},
|
|
{
|
|
key: "urlId",
|
|
get: function () {
|
|
return this._urlId;
|
|
},
|
|
set: function (t) {
|
|
var e = t % this.url.length;
|
|
this._urlId !== e &&
|
|
((this.fragmentError = 0),
|
|
(this.loadError = 0),
|
|
(this.details = void 0),
|
|
(this._urlId = e));
|
|
},
|
|
},
|
|
{
|
|
key: "audioGroupId",
|
|
get: function () {
|
|
var t;
|
|
return null == (t = this.audioGroupIds)
|
|
? void 0
|
|
: t[this.urlId];
|
|
},
|
|
},
|
|
{
|
|
key: "textGroupId",
|
|
get: function () {
|
|
var t;
|
|
return null == (t = this.textGroupIds)
|
|
? void 0
|
|
: t[this.urlId];
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})();
|
|
function Ue(t, e) {
|
|
var r = e.startPTS;
|
|
if (E(r)) {
|
|
var i,
|
|
n = 0;
|
|
e.sn > t.sn
|
|
? ((n = r - t.start), (i = t))
|
|
: ((n = t.start - r), (i = e)),
|
|
i.duration !== n && (i.duration = n);
|
|
} else
|
|
e.sn > t.sn
|
|
? t.cc === e.cc && t.minEndPTS
|
|
? (e.start = t.start + (t.minEndPTS - t.start))
|
|
: (e.start = t.start + t.duration)
|
|
: (e.start = Math.max(t.start - e.duration, 0));
|
|
}
|
|
function Be(t, e, r, i, n, a) {
|
|
i - r <= 0 &&
|
|
(w.warn("Fragment should have a positive duration", e),
|
|
(i = r + e.duration),
|
|
(a = n + e.duration));
|
|
var s = r,
|
|
o = i,
|
|
l = e.startPTS,
|
|
u = e.endPTS;
|
|
if (E(l)) {
|
|
var h = Math.abs(l - r);
|
|
E(e.deltaPTS)
|
|
? (e.deltaPTS = Math.max(h, e.deltaPTS))
|
|
: (e.deltaPTS = h),
|
|
(s = Math.max(r, l)),
|
|
(r = Math.min(r, l)),
|
|
(n = Math.min(n, e.startDTS)),
|
|
(o = Math.min(i, u)),
|
|
(i = Math.max(i, u)),
|
|
(a = Math.max(a, e.endDTS));
|
|
}
|
|
var d = r - e.start;
|
|
0 !== e.start && (e.start = r),
|
|
(e.duration = i - e.start),
|
|
(e.startPTS = r),
|
|
(e.maxStartPTS = s),
|
|
(e.startDTS = n),
|
|
(e.endPTS = i),
|
|
(e.minEndPTS = o),
|
|
(e.endDTS = a);
|
|
var c,
|
|
f = e.sn;
|
|
if (!t || f < t.startSN || f > t.endSN) return 0;
|
|
var g = f - t.startSN,
|
|
v = t.fragments;
|
|
for (v[g] = e, c = g; c > 0; c--) Ue(v[c], v[c - 1]);
|
|
for (c = g; c < v.length - 1; c++) Ue(v[c], v[c + 1]);
|
|
return (
|
|
t.fragmentHint && Ue(v[v.length - 1], t.fragmentHint),
|
|
(t.PTSKnown = t.alignedSliding = !0),
|
|
d
|
|
);
|
|
}
|
|
function Ge(t, e) {
|
|
for (var r = null, i = t.fragments, n = i.length - 1; n >= 0; n--) {
|
|
var a = i[n].initSegment;
|
|
if (a) {
|
|
r = a;
|
|
break;
|
|
}
|
|
}
|
|
t.fragmentHint && delete t.fragmentHint.endPTS;
|
|
var s,
|
|
l,
|
|
u,
|
|
h,
|
|
d,
|
|
c = 0;
|
|
if (
|
|
((function (t, e, r) {
|
|
for (
|
|
var i = e.skippedSegments,
|
|
n = Math.max(t.startSN, e.startSN) - e.startSN,
|
|
a =
|
|
(t.fragmentHint ? 1 : 0) +
|
|
(i ? e.endSN : Math.min(t.endSN, e.endSN)) -
|
|
e.startSN,
|
|
s = e.startSN - t.startSN,
|
|
o = e.fragmentHint
|
|
? e.fragments.concat(e.fragmentHint)
|
|
: e.fragments,
|
|
l = t.fragmentHint
|
|
? t.fragments.concat(t.fragmentHint)
|
|
: t.fragments,
|
|
u = n;
|
|
u <= a;
|
|
u++
|
|
) {
|
|
var h = l[s + u],
|
|
d = o[u];
|
|
i && !d && u < i && (d = e.fragments[u] = h), h && d && r(h, d);
|
|
}
|
|
})(t, e, function (t, i) {
|
|
t.relurl && (c = t.cc - i.cc),
|
|
E(t.startPTS) &&
|
|
E(t.endPTS) &&
|
|
((i.start = i.startPTS = t.startPTS),
|
|
(i.startDTS = t.startDTS),
|
|
(i.maxStartPTS = t.maxStartPTS),
|
|
(i.endPTS = t.endPTS),
|
|
(i.endDTS = t.endDTS),
|
|
(i.minEndPTS = t.minEndPTS),
|
|
(i.duration = t.endPTS - t.startPTS),
|
|
i.duration && (s = i),
|
|
(e.PTSKnown = e.alignedSliding = !0)),
|
|
(i.elementaryStreams = t.elementaryStreams),
|
|
(i.loader = t.loader),
|
|
(i.stats = t.stats),
|
|
(i.urlId = t.urlId),
|
|
t.initSegment &&
|
|
((i.initSegment = t.initSegment), (r = t.initSegment));
|
|
}),
|
|
r &&
|
|
(e.fragmentHint
|
|
? e.fragments.concat(e.fragmentHint)
|
|
: e.fragments
|
|
).forEach(function (t) {
|
|
var e;
|
|
(t.initSegment &&
|
|
t.initSegment.relurl !==
|
|
(null == (e = r) ? void 0 : e.relurl)) ||
|
|
(t.initSegment = r);
|
|
}),
|
|
e.skippedSegments)
|
|
)
|
|
if (
|
|
((e.deltaUpdateFailed = e.fragments.some(function (t) {
|
|
return !t;
|
|
})),
|
|
e.deltaUpdateFailed)
|
|
) {
|
|
w.warn(
|
|
"[level-helper] Previous playlist missing segments skipped in delta playlist"
|
|
);
|
|
for (var f = e.skippedSegments; f--; ) e.fragments.shift();
|
|
(e.startSN = e.fragments[0].sn), (e.startCC = e.fragments[0].cc);
|
|
} else
|
|
e.canSkipDateRanges &&
|
|
(e.dateRanges =
|
|
((l = t.dateRanges),
|
|
(u = e.dateRanges),
|
|
(h = e.recentlyRemovedDateranges),
|
|
(d = o({}, l)),
|
|
h &&
|
|
h.forEach(function (t) {
|
|
delete d[t];
|
|
}),
|
|
Object.keys(u).forEach(function (t) {
|
|
var e = new F(u[t].attr, d[t]);
|
|
e.isValid
|
|
? (d[t] = e)
|
|
: w.warn(
|
|
'Ignoring invalid Playlist Delta Update DATERANGE tag: "' +
|
|
JSON.stringify(u[t].attr) +
|
|
'"'
|
|
);
|
|
}),
|
|
d));
|
|
var g = e.fragments;
|
|
if (c) {
|
|
w.warn(
|
|
"discontinuity sliding from playlist, take drift into account"
|
|
);
|
|
for (var v = 0; v < g.length; v++) g[v].cc += c;
|
|
}
|
|
e.skippedSegments && (e.startCC = e.fragments[0].cc),
|
|
(function (t, e, r) {
|
|
if (t && e)
|
|
for (var i = 0, n = 0, a = t.length; n <= a; n++) {
|
|
var s = t[n],
|
|
o = e[n + i];
|
|
s && o && s.index === o.index && s.fragment.sn === o.fragment.sn
|
|
? r(s, o)
|
|
: i--;
|
|
}
|
|
})(t.partList, e.partList, function (t, e) {
|
|
(e.elementaryStreams = t.elementaryStreams), (e.stats = t.stats);
|
|
}),
|
|
s ? Be(e, s, s.startPTS, s.endPTS, s.startDTS, s.endDTS) : Ke(t, e),
|
|
g.length && (e.totalduration = e.edge - g[0].start),
|
|
(e.driftStartTime = t.driftStartTime),
|
|
(e.driftStart = t.driftStart);
|
|
var m = e.advancedDateTime;
|
|
if (e.advanced && m) {
|
|
var p = e.edge;
|
|
e.driftStart || ((e.driftStartTime = m), (e.driftStart = p)),
|
|
(e.driftEndTime = m),
|
|
(e.driftEnd = p);
|
|
} else
|
|
(e.driftEndTime = t.driftEndTime),
|
|
(e.driftEnd = t.driftEnd),
|
|
(e.advancedDateTime = t.advancedDateTime);
|
|
}
|
|
function Ke(t, e) {
|
|
var r = e.startSN + e.skippedSegments - t.startSN,
|
|
i = t.fragments;
|
|
r < 0 || r >= i.length || He(e, i[r].start);
|
|
}
|
|
function He(t, e) {
|
|
if (e) {
|
|
for (var r = t.fragments, i = t.skippedSegments; i < r.length; i++)
|
|
r[i].start += e;
|
|
t.fragmentHint && (t.fragmentHint.start += e);
|
|
}
|
|
}
|
|
function Ve(t, e, r) {
|
|
var i;
|
|
return null != t && t.details
|
|
? Ye(null == (i = t.details) ? void 0 : i.partList, e, r)
|
|
: null;
|
|
}
|
|
function Ye(t, e, r) {
|
|
if (t)
|
|
for (var i = t.length; i--; ) {
|
|
var n = t[i];
|
|
if (n.index === r && n.fragment.sn === e) return n;
|
|
}
|
|
return null;
|
|
}
|
|
function We(t) {
|
|
switch (t.details) {
|
|
case R.FRAG_LOAD_TIMEOUT:
|
|
case R.KEY_LOAD_TIMEOUT:
|
|
case R.LEVEL_LOAD_TIMEOUT:
|
|
case R.MANIFEST_LOAD_TIMEOUT:
|
|
return !0;
|
|
}
|
|
return !1;
|
|
}
|
|
function je(t, e) {
|
|
var r = We(e);
|
|
return t.default[(r ? "timeout" : "error") + "Retry"];
|
|
}
|
|
function qe(t, e) {
|
|
var r = "linear" === t.backoff ? 1 : Math.pow(2, e);
|
|
return Math.min(r * t.retryDelayMs, t.maxRetryDelayMs);
|
|
}
|
|
function Xe(t) {
|
|
return i(i({}, t), { errorRetry: null, timeoutRetry: null });
|
|
}
|
|
function ze(t, e, r, i) {
|
|
return (
|
|
!!t &&
|
|
e < t.maxNumRetry &&
|
|
((function (t) {
|
|
return (
|
|
(0 === t && !1 === navigator.onLine) ||
|
|
(!!t && (t < 400 || t > 499))
|
|
);
|
|
})(i) ||
|
|
!!r)
|
|
);
|
|
}
|
|
var Qe = function (t, e) {
|
|
for (var r = 0, i = t.length - 1, n = null, a = null; r <= i; ) {
|
|
var s = e((a = t[(n = ((r + i) / 2) | 0)]));
|
|
if (s > 0) r = n + 1;
|
|
else {
|
|
if (!(s < 0)) return a;
|
|
i = n - 1;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
function $e(t, e, r, i) {
|
|
void 0 === r && (r = 0), void 0 === i && (i = 0);
|
|
var n = null;
|
|
if (
|
|
(t
|
|
? (n = e[t.sn - e[0].sn + 1] || null)
|
|
: 0 === r && 0 === e[0].start && (n = e[0]),
|
|
n && 0 === Je(r, i, n))
|
|
)
|
|
return n;
|
|
var a = Qe(e, Je.bind(null, r, i));
|
|
return !a || (a === t && n) ? n : a;
|
|
}
|
|
function Je(t, e, r) {
|
|
if (
|
|
(void 0 === t && (t = 0),
|
|
void 0 === e && (e = 0),
|
|
r.start <= t && r.start + r.duration > t)
|
|
)
|
|
return 0;
|
|
var i = Math.min(e, r.duration + (r.deltaPTS ? r.deltaPTS : 0));
|
|
return r.start + r.duration - i <= t
|
|
? 1
|
|
: r.start - i > t && r.start
|
|
? -1
|
|
: 0;
|
|
}
|
|
function Ze(t, e, r) {
|
|
var i = 1e3 * Math.min(e, r.duration + (r.deltaPTS ? r.deltaPTS : 0));
|
|
return (r.endProgramDateTime || 0) - i > t;
|
|
}
|
|
var tr,
|
|
er = 3e5,
|
|
rr = 0,
|
|
ir = 2,
|
|
nr = 5,
|
|
ar = 0,
|
|
sr = 1,
|
|
or = 2,
|
|
lr = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.playlistError = 0),
|
|
(this.penalizedRenditions = {}),
|
|
(this.log = void 0),
|
|
(this.warn = void 0),
|
|
(this.error = void 0),
|
|
(this.hls = t),
|
|
(this.log = w.log.bind(w, "[info]:")),
|
|
(this.warn = w.warn.bind(w, "[warning]:")),
|
|
(this.error = w.error.bind(w, "[error]:")),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.ERROR, this.onError, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.LEVEL_UPDATED, this.onLevelUpdated, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t &&
|
|
(t.off(S.ERROR, this.onError, this),
|
|
t.off(S.ERROR, this.onErrorOut, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.LEVEL_UPDATED, this.onLevelUpdated, this));
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
(this.hls = null),
|
|
(this.penalizedRenditions = {});
|
|
}),
|
|
(e.startLoad = function (t) {
|
|
this.playlistError = 0;
|
|
}),
|
|
(e.stopLoad = function () {}),
|
|
(e.getVariantLevelIndex = function (t) {
|
|
return (null == t ? void 0 : t.type) === ge
|
|
? t.level
|
|
: this.hls.loadLevel;
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
(this.playlistError = 0), (this.penalizedRenditions = {});
|
|
}),
|
|
(e.onLevelUpdated = function () {
|
|
this.playlistError = 0;
|
|
}),
|
|
(e.onError = function (t, e) {
|
|
var r, i;
|
|
if (!e.fatal) {
|
|
var n = this.hls,
|
|
a = e.context;
|
|
switch (e.details) {
|
|
case R.FRAG_LOAD_ERROR:
|
|
case R.FRAG_LOAD_TIMEOUT:
|
|
case R.KEY_LOAD_ERROR:
|
|
case R.KEY_LOAD_TIMEOUT:
|
|
return void (e.errorAction =
|
|
this.getFragRetryOrSwitchAction(e));
|
|
case R.FRAG_PARSING_ERROR:
|
|
if (null != (r = e.frag) && r.gap)
|
|
return void (e.errorAction = { action: rr, flags: ar });
|
|
case R.FRAG_GAP:
|
|
case R.FRAG_DECRYPT_ERROR:
|
|
return (
|
|
(e.errorAction = this.getFragRetryOrSwitchAction(e)),
|
|
void (e.errorAction.action = ir)
|
|
);
|
|
case R.LEVEL_EMPTY_ERROR:
|
|
case R.LEVEL_PARSING_ERROR:
|
|
var s,
|
|
o,
|
|
l = e.parent === ge ? e.level : n.loadLevel;
|
|
return void (e.details === R.LEVEL_EMPTY_ERROR &&
|
|
null != (s = e.context) &&
|
|
null != (o = s.levelDetails) &&
|
|
o.live
|
|
? (e.errorAction = this.getPlaylistRetryOrSwitchAction(
|
|
e,
|
|
l
|
|
))
|
|
: ((e.levelRetry = !1),
|
|
(e.errorAction = this.getLevelSwitchAction(e, l))));
|
|
case R.LEVEL_LOAD_ERROR:
|
|
case R.LEVEL_LOAD_TIMEOUT:
|
|
return void (
|
|
"number" == typeof (null == a ? void 0 : a.level) &&
|
|
(e.errorAction = this.getPlaylistRetryOrSwitchAction(
|
|
e,
|
|
a.level
|
|
))
|
|
);
|
|
case R.AUDIO_TRACK_LOAD_ERROR:
|
|
case R.AUDIO_TRACK_LOAD_TIMEOUT:
|
|
case R.SUBTITLE_LOAD_ERROR:
|
|
case R.SUBTITLE_TRACK_LOAD_TIMEOUT:
|
|
if (a) {
|
|
var u = n.levels[n.loadLevel];
|
|
if (
|
|
u &&
|
|
((a.type === ce && a.groupId === u.audioGroupId) ||
|
|
(a.type === fe && a.groupId === u.textGroupId))
|
|
)
|
|
return (
|
|
(e.errorAction = this.getPlaylistRetryOrSwitchAction(
|
|
e,
|
|
n.loadLevel
|
|
)),
|
|
(e.errorAction.action = ir),
|
|
void (e.errorAction.flags = sr)
|
|
);
|
|
}
|
|
return;
|
|
case R.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:
|
|
var h = n.levels[n.loadLevel],
|
|
d = null == h ? void 0 : h.attrs["HDCP-LEVEL"];
|
|
return void (
|
|
d &&
|
|
(e.errorAction = { action: ir, flags: or, hdcpLevel: d })
|
|
);
|
|
case R.BUFFER_ADD_CODEC_ERROR:
|
|
case R.REMUX_ALLOC_ERROR:
|
|
return void (e.errorAction = this.getLevelSwitchAction(
|
|
e,
|
|
null != (i = e.level) ? i : n.loadLevel
|
|
));
|
|
case R.INTERNAL_EXCEPTION:
|
|
case R.BUFFER_APPENDING_ERROR:
|
|
case R.BUFFER_APPEND_ERROR:
|
|
case R.BUFFER_FULL_ERROR:
|
|
case R.LEVEL_SWITCH_ERROR:
|
|
case R.BUFFER_STALLED_ERROR:
|
|
case R.BUFFER_SEEK_OVER_HOLE:
|
|
case R.BUFFER_NUDGE_ON_STALL:
|
|
return void (e.errorAction = { action: rr, flags: ar });
|
|
}
|
|
if (e.type === L.KEY_SYSTEM_ERROR) {
|
|
var c = this.getVariantLevelIndex(e.frag);
|
|
return (
|
|
(e.levelRetry = !1),
|
|
void (e.errorAction = this.getLevelSwitchAction(e, c))
|
|
);
|
|
}
|
|
}
|
|
}),
|
|
(e.getPlaylistRetryOrSwitchAction = function (t, e) {
|
|
var r,
|
|
i = je(this.hls.config.playlistLoadPolicy, t),
|
|
n = this.playlistError++,
|
|
a = null == (r = t.response) ? void 0 : r.code;
|
|
if (ze(i, n, We(t), a))
|
|
return { action: nr, flags: ar, retryConfig: i, retryCount: n };
|
|
var s = this.getLevelSwitchAction(t, e);
|
|
return i && ((s.retryConfig = i), (s.retryCount = n)), s;
|
|
}),
|
|
(e.getFragRetryOrSwitchAction = function (t) {
|
|
var e = this.hls,
|
|
r = this.getVariantLevelIndex(t.frag),
|
|
i = e.levels[r],
|
|
n = e.config,
|
|
a = n.fragLoadPolicy,
|
|
s = n.keyLoadPolicy,
|
|
o = je(t.details.startsWith("key") ? s : a, t),
|
|
l = e.levels.reduce(function (t, e) {
|
|
return t + e.fragmentError;
|
|
}, 0);
|
|
if (i) {
|
|
var u;
|
|
t.details !== R.FRAG_GAP && i.fragmentError++;
|
|
var h = null == (u = t.response) ? void 0 : u.code;
|
|
if (ze(o, l, We(t), h))
|
|
return {
|
|
action: nr,
|
|
flags: ar,
|
|
retryConfig: o,
|
|
retryCount: l,
|
|
};
|
|
}
|
|
var d = this.getLevelSwitchAction(t, r);
|
|
return o && ((d.retryConfig = o), (d.retryCount = l)), d;
|
|
}),
|
|
(e.getLevelSwitchAction = function (t, e) {
|
|
var r = this.hls;
|
|
null == e && (e = r.loadLevel);
|
|
var i = this.hls.levels[e];
|
|
if (i && (i.loadError++, r.autoLevelEnabled)) {
|
|
for (
|
|
var n,
|
|
a,
|
|
s = -1,
|
|
o = r.levels,
|
|
l = r.loadLevel,
|
|
u = r.minAutoLevel,
|
|
h = r.maxAutoLevel,
|
|
d = null == (n = t.frag) ? void 0 : n.type,
|
|
c = null != (a = t.context) ? a : {},
|
|
f = c.type,
|
|
g = c.groupId,
|
|
v = o.length;
|
|
v--;
|
|
|
|
) {
|
|
var m = (v + l) % o.length;
|
|
if (m !== l && m >= u && m <= h && 0 === o[m].loadError) {
|
|
var p = o[m];
|
|
if (t.details === R.FRAG_GAP && t.frag) {
|
|
var y = o[m].details;
|
|
if (y) {
|
|
var T = $e(t.frag, y.fragments, t.frag.start);
|
|
if (null != T && T.gap) continue;
|
|
}
|
|
} else {
|
|
if (
|
|
(f === ce && g === p.audioGroupId) ||
|
|
(f === fe && g === p.textGroupId)
|
|
)
|
|
continue;
|
|
if (
|
|
(d === ve && i.audioGroupId === p.audioGroupId) ||
|
|
(d === me && i.textGroupId === p.textGroupId)
|
|
)
|
|
continue;
|
|
}
|
|
s = m;
|
|
break;
|
|
}
|
|
}
|
|
if (s > -1 && r.loadLevel !== s)
|
|
return (
|
|
(t.levelRetry = !0),
|
|
(this.playlistError = 0),
|
|
{ action: ir, flags: ar, nextAutoLevel: s }
|
|
);
|
|
}
|
|
return { action: ir, flags: sr };
|
|
}),
|
|
(e.onErrorOut = function (t, e) {
|
|
var r;
|
|
switch (null == (r = e.errorAction) ? void 0 : r.action) {
|
|
case rr:
|
|
break;
|
|
case ir:
|
|
this.sendAlternateToPenaltyBox(e),
|
|
e.errorAction.resolved ||
|
|
e.details === R.FRAG_GAP ||
|
|
(e.fatal = !0);
|
|
}
|
|
e.fatal && this.hls.stopLoad();
|
|
}),
|
|
(e.sendAlternateToPenaltyBox = function (t) {
|
|
var e = this.hls,
|
|
r = t.errorAction;
|
|
if (r) {
|
|
var i = r.flags,
|
|
n = r.hdcpLevel,
|
|
a = r.nextAutoLevel;
|
|
switch (i) {
|
|
case ar:
|
|
this.switchLevel(t, a);
|
|
break;
|
|
case sr:
|
|
r.resolved || (r.resolved = this.redundantFailover(t));
|
|
break;
|
|
case or:
|
|
n &&
|
|
((e.maxHdcpLevel = Pe[Pe.indexOf(n) - 1]),
|
|
(r.resolved = !0)),
|
|
this.warn(
|
|
'Restricting playback to HDCP-LEVEL of "' +
|
|
e.maxHdcpLevel +
|
|
'" or lower'
|
|
);
|
|
}
|
|
r.resolved || this.switchLevel(t, a);
|
|
}
|
|
}),
|
|
(e.switchLevel = function (t, e) {
|
|
void 0 !== e &&
|
|
t.errorAction &&
|
|
(this.warn("switching to level " + e + " after " + t.details),
|
|
(this.hls.nextAutoLevel = e),
|
|
(t.errorAction.resolved = !0),
|
|
(this.hls.nextLoadLevel = this.hls.nextAutoLevel));
|
|
}),
|
|
(e.redundantFailover = function (t) {
|
|
var e = this,
|
|
r = this.hls,
|
|
i = this.penalizedRenditions,
|
|
n = t.parent === ge ? t.level : r.loadLevel,
|
|
a = r.levels[n],
|
|
s = a.url.length,
|
|
o = t.frag ? t.frag.urlId : a.urlId;
|
|
a.urlId !== o ||
|
|
(t.frag && !a.details) ||
|
|
this.penalizeRendition(a, t);
|
|
for (
|
|
var l = function () {
|
|
var l = (o + u) % s,
|
|
h = i[l];
|
|
if (
|
|
!h ||
|
|
(function (t, e, r) {
|
|
if (performance.now() - t.lastErrorPerfMs > er)
|
|
return !0;
|
|
var i = t.details;
|
|
if (e.details === R.FRAG_GAP && i && e.frag) {
|
|
var n = e.frag.start,
|
|
a = $e(null, i.fragments, n);
|
|
if (a && !a.gap) return !0;
|
|
}
|
|
if (r && t.errors.length < r.errors.length) {
|
|
var s = t.errors[t.errors.length - 1];
|
|
if (
|
|
i &&
|
|
s.frag &&
|
|
e.frag &&
|
|
Math.abs(s.frag.start - e.frag.start) >
|
|
3 * i.targetduration
|
|
)
|
|
return !0;
|
|
}
|
|
return !1;
|
|
})(h, t, i[o])
|
|
)
|
|
return (
|
|
e.warn(
|
|
"Switching to Redundant Stream " +
|
|
(l + 1) +
|
|
"/" +
|
|
s +
|
|
': "' +
|
|
a.url[l] +
|
|
'" after ' +
|
|
t.details
|
|
),
|
|
(e.playlistError = 0),
|
|
r.levels.forEach(function (t) {
|
|
t.urlId = l;
|
|
}),
|
|
(r.nextLoadLevel = n),
|
|
{ v: !0 }
|
|
);
|
|
},
|
|
u = 1;
|
|
u < s;
|
|
u++
|
|
) {
|
|
var h = l();
|
|
if ("object" == typeof h) return h.v;
|
|
}
|
|
return !1;
|
|
}),
|
|
(e.penalizeRendition = function (t, e) {
|
|
var r = this.penalizedRenditions,
|
|
i = r[t.urlId] || {
|
|
lastErrorPerfMs: 0,
|
|
errors: [],
|
|
details: void 0,
|
|
};
|
|
(i.lastErrorPerfMs = performance.now()),
|
|
i.errors.push(e),
|
|
(i.details = t.details),
|
|
(r[t.urlId] = i);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
ur = (function () {
|
|
function t(t, e) {
|
|
(this.hls = void 0),
|
|
(this.timer = -1),
|
|
(this.requestScheduled = -1),
|
|
(this.canLoad = !1),
|
|
(this.log = void 0),
|
|
(this.warn = void 0),
|
|
(this.log = w.log.bind(w, e + ":")),
|
|
(this.warn = w.warn.bind(w, e + ":")),
|
|
(this.hls = t);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this.clearTimer(), (this.hls = this.log = this.warn = null);
|
|
}),
|
|
(e.clearTimer = function () {
|
|
clearTimeout(this.timer), (this.timer = -1);
|
|
}),
|
|
(e.startLoad = function () {
|
|
(this.canLoad = !0),
|
|
(this.requestScheduled = -1),
|
|
this.loadPlaylist();
|
|
}),
|
|
(e.stopLoad = function () {
|
|
(this.canLoad = !1), this.clearTimer();
|
|
}),
|
|
(e.switchParams = function (t, e) {
|
|
var r = null == e ? void 0 : e.renditionReports;
|
|
if (r) {
|
|
for (var i = -1, n = 0; n < r.length; n++) {
|
|
var a = r[n],
|
|
s = void 0;
|
|
try {
|
|
s = new self.URL(a.URI, e.url).href;
|
|
} catch (t) {
|
|
w.warn(
|
|
"Could not construct new URL for Rendition Report: " + t
|
|
),
|
|
(s = a.URI || "");
|
|
}
|
|
if (s === t) {
|
|
i = n;
|
|
break;
|
|
}
|
|
s === t.substring(0, s.length) && (i = n);
|
|
}
|
|
if (-1 !== i) {
|
|
var o = r[i],
|
|
l =
|
|
parseInt(o["LAST-MSN"]) ||
|
|
(null == e ? void 0 : e.lastPartSn),
|
|
u =
|
|
parseInt(o["LAST-PART"]) ||
|
|
(null == e ? void 0 : e.lastPartIndex);
|
|
if (this.hls.config.lowLatencyMode) {
|
|
var h = Math.min(e.age - e.partTarget, e.targetduration);
|
|
u >= 0 && h > e.partTarget && (u += 1);
|
|
}
|
|
return new Oe(l, u >= 0 ? u : void 0, xe);
|
|
}
|
|
}
|
|
}),
|
|
(e.loadPlaylist = function (t) {
|
|
-1 === this.requestScheduled &&
|
|
(this.requestScheduled = self.performance.now());
|
|
}),
|
|
(e.shouldLoadPlaylist = function (t) {
|
|
return (
|
|
this.canLoad && !!t && !!t.url && (!t.details || t.details.live)
|
|
);
|
|
}),
|
|
(e.shouldReloadPlaylist = function (t) {
|
|
return (
|
|
-1 === this.timer &&
|
|
-1 === this.requestScheduled &&
|
|
this.shouldLoadPlaylist(t)
|
|
);
|
|
}),
|
|
(e.playlistLoaded = function (t, e, r) {
|
|
var i = this,
|
|
n = e.details,
|
|
a = e.stats,
|
|
s = self.performance.now(),
|
|
o = a.loading.first ? Math.max(0, s - a.loading.first) : 0;
|
|
if (
|
|
((n.advancedDateTime = Date.now() - o),
|
|
n.live || (null != r && r.live))
|
|
) {
|
|
if (
|
|
(n.reloaded(r),
|
|
r &&
|
|
this.log(
|
|
"live playlist " +
|
|
t +
|
|
" " +
|
|
(n.advanced
|
|
? "REFRESHED " + n.lastPartSn + "-" + n.lastPartIndex
|
|
: n.updated
|
|
? "UPDATED"
|
|
: "MISSED")
|
|
),
|
|
r && n.fragments.length > 0 && Ge(r, n),
|
|
!this.canLoad || !n.live)
|
|
)
|
|
return;
|
|
var l,
|
|
u = void 0,
|
|
h = void 0;
|
|
if (n.canBlockReload && n.endSN && n.advanced) {
|
|
var d = this.hls.config.lowLatencyMode,
|
|
c = n.lastPartSn,
|
|
f = n.endSN,
|
|
g = n.lastPartIndex,
|
|
v = c === f;
|
|
-1 !== g
|
|
? ((u = v ? f + 1 : c), (h = v ? (d ? 0 : g) : g + 1))
|
|
: (u = f + 1);
|
|
var m = n.age,
|
|
p = m + n.ageHeader,
|
|
y = Math.min(p - n.partTarget, 1.5 * n.targetduration);
|
|
if (y > 0) {
|
|
if (r && y > r.tuneInGoal)
|
|
this.warn(
|
|
"CDN Tune-in goal increased from: " +
|
|
r.tuneInGoal +
|
|
" to: " +
|
|
y +
|
|
" with playlist age: " +
|
|
n.age
|
|
),
|
|
(y = 0);
|
|
else {
|
|
var T = Math.floor(y / n.targetduration);
|
|
(u += T),
|
|
void 0 !== h &&
|
|
(h += Math.round(
|
|
(y % n.targetduration) / n.partTarget
|
|
)),
|
|
this.log(
|
|
"CDN Tune-in age: " +
|
|
n.ageHeader +
|
|
"s last advanced " +
|
|
m.toFixed(2) +
|
|
"s goal: " +
|
|
y +
|
|
" skip sn " +
|
|
T +
|
|
" to part " +
|
|
h
|
|
);
|
|
}
|
|
n.tuneInGoal = y;
|
|
}
|
|
if (
|
|
((l = this.getDeliveryDirectives(
|
|
n,
|
|
e.deliveryDirectives,
|
|
u,
|
|
h
|
|
)),
|
|
d || !v)
|
|
)
|
|
return void this.loadPlaylist(l);
|
|
} else
|
|
(n.canBlockReload || n.canSkipUntil) &&
|
|
(l = this.getDeliveryDirectives(
|
|
n,
|
|
e.deliveryDirectives,
|
|
u,
|
|
h
|
|
));
|
|
var E = this.hls.mainForwardBufferInfo,
|
|
S = E ? E.end - E.len : 0,
|
|
L = (function (t, e) {
|
|
void 0 === e && (e = 1 / 0);
|
|
var r = 1e3 * t.targetduration;
|
|
if (t.updated) {
|
|
var i = t.fragments;
|
|
if (i.length && 4 * r > e) {
|
|
var n = 1e3 * i[i.length - 1].duration;
|
|
n < r && (r = n);
|
|
}
|
|
} else r /= 2;
|
|
return Math.round(r);
|
|
})(n, 1e3 * (n.edge - S));
|
|
n.updated &&
|
|
s > this.requestScheduled + L &&
|
|
(this.requestScheduled = a.loading.start),
|
|
void 0 !== u && n.canBlockReload
|
|
? (this.requestScheduled =
|
|
a.loading.first + L - (1e3 * n.partTarget || 1e3))
|
|
: -1 === this.requestScheduled ||
|
|
this.requestScheduled + L < s
|
|
? (this.requestScheduled = s)
|
|
: this.requestScheduled - s <= 0 &&
|
|
(this.requestScheduled += L);
|
|
var R = this.requestScheduled - s;
|
|
(R = Math.max(0, R)),
|
|
this.log(
|
|
"reload live playlist " + t + " in " + Math.round(R) + " ms"
|
|
),
|
|
(this.timer = self.setTimeout(function () {
|
|
return i.loadPlaylist(l);
|
|
}, R));
|
|
} else this.clearTimer();
|
|
}),
|
|
(e.getDeliveryDirectives = function (t, e, r, i) {
|
|
var n = (function (t, e) {
|
|
var r = t.canSkipUntil,
|
|
i = t.canSkipDateRanges,
|
|
n = t.endSN;
|
|
return r && (void 0 !== e ? e - n : 0) < r ? (i ? Me : Fe) : xe;
|
|
})(t, r);
|
|
return (
|
|
null != e &&
|
|
e.skip &&
|
|
t.deltaUpdateFailed &&
|
|
((r = e.msn), (i = e.part), (n = xe)),
|
|
new Oe(r, i, n)
|
|
);
|
|
}),
|
|
(e.checkRetry = function (t) {
|
|
var e = this,
|
|
r = t.details,
|
|
i = We(t),
|
|
n = t.errorAction,
|
|
a = n || {},
|
|
s = a.action,
|
|
o = a.retryCount,
|
|
l = void 0 === o ? 0 : o,
|
|
u = a.retryConfig,
|
|
h = !!n && !!u && (s === nr || (!n.resolved && s === ir));
|
|
if (h) {
|
|
var d;
|
|
if (((this.requestScheduled = -1), l >= u.maxNumRetry))
|
|
return !1;
|
|
if (i && null != (d = t.context) && d.deliveryDirectives)
|
|
this.warn(
|
|
"Retrying playlist loading " +
|
|
(l + 1) +
|
|
"/" +
|
|
u.maxNumRetry +
|
|
' after "' +
|
|
r +
|
|
'" without delivery-directives'
|
|
),
|
|
this.loadPlaylist();
|
|
else {
|
|
var c = qe(u, l);
|
|
(this.timer = self.setTimeout(function () {
|
|
return e.loadPlaylist();
|
|
}, c)),
|
|
this.warn(
|
|
"Retrying playlist loading " +
|
|
(l + 1) +
|
|
"/" +
|
|
u.maxNumRetry +
|
|
' after "' +
|
|
r +
|
|
'" in ' +
|
|
c +
|
|
"ms"
|
|
);
|
|
}
|
|
(t.levelRetry = !0), (n.resolved = !0);
|
|
}
|
|
return h;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
hr = (function (t) {
|
|
function e(e, r) {
|
|
var i;
|
|
return (
|
|
((i = t.call(this, e, "[level-controller]") || this)._levels =
|
|
[]),
|
|
(i._firstLevel = -1),
|
|
(i._startLevel = void 0),
|
|
(i.currentLevel = null),
|
|
(i.currentLevelIndex = -1),
|
|
(i.manualLevelIndex = -1),
|
|
(i.steering = void 0),
|
|
(i.onParsedComplete = void 0),
|
|
(i.steering = r),
|
|
i._registerListeners(),
|
|
i
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.on(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.on(S.LEVELS_UPDATED, this.onLevelsUpdated, this),
|
|
t.on(S.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
|
|
t.on(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.on(S.ERROR, this.onError, this);
|
|
}),
|
|
(r._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.off(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.off(S.LEVELS_UPDATED, this.onLevelsUpdated, this),
|
|
t.off(S.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
|
|
t.off(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.off(S.ERROR, this.onError, this);
|
|
}),
|
|
(r.destroy = function () {
|
|
this._unregisterListeners(),
|
|
(this.steering = null),
|
|
this.resetLevels(),
|
|
t.prototype.destroy.call(this);
|
|
}),
|
|
(r.startLoad = function () {
|
|
this._levels.forEach(function (t) {
|
|
(t.loadError = 0), (t.fragmentError = 0);
|
|
}),
|
|
t.prototype.startLoad.call(this);
|
|
}),
|
|
(r.resetLevels = function () {
|
|
(this._startLevel = void 0),
|
|
(this.manualLevelIndex = -1),
|
|
(this.currentLevelIndex = -1),
|
|
(this.currentLevel = null),
|
|
(this._levels = []);
|
|
}),
|
|
(r.onManifestLoading = function (t, e) {
|
|
this.resetLevels();
|
|
}),
|
|
(r.onManifestLoaded = function (t, e) {
|
|
var r,
|
|
i = [],
|
|
n = {};
|
|
e.levels.forEach(function (t) {
|
|
var e,
|
|
a = t.attrs;
|
|
-1 !==
|
|
(null == (e = t.audioCodec)
|
|
? void 0
|
|
: e.indexOf("mp4a.40.34")) &&
|
|
(tr || (tr = /chrome|firefox/i.test(navigator.userAgent)),
|
|
tr && (t.audioCodec = void 0));
|
|
var s = a.AUDIO,
|
|
o = a.CODECS,
|
|
l = a["FRAME-RATE"],
|
|
u = a["PATHWAY-ID"],
|
|
h = a.RESOLUTION,
|
|
d = a.SUBTITLES,
|
|
c =
|
|
(u || ".") + "-" + t.bitrate + "-" + h + "-" + l + "-" + o;
|
|
(r = n[c])
|
|
? r.addFallback(t)
|
|
: ((r = new Ne(t)), (n[c] = r), i.push(r)),
|
|
dr(r, "audio", s),
|
|
dr(r, "text", d);
|
|
}),
|
|
this.filterAndSortMediaOptions(i, e);
|
|
}),
|
|
(r.filterAndSortMediaOptions = function (t, e) {
|
|
var r = this,
|
|
i = [],
|
|
n = [],
|
|
a = !1,
|
|
s = !1,
|
|
o = !1,
|
|
l = t.filter(function (t) {
|
|
var e = t.audioCodec,
|
|
r = t.videoCodec,
|
|
i = t.width,
|
|
n = t.height,
|
|
l = t.unknownCodecs;
|
|
return (
|
|
a || (a = !(!i || !n)),
|
|
s || (s = !!r),
|
|
o || (o = !!e),
|
|
!(null != l && l.length) &&
|
|
(!e || Qt(e, "audio")) &&
|
|
(!r || Qt(r, "video"))
|
|
);
|
|
});
|
|
if (
|
|
((a || s) &&
|
|
o &&
|
|
(l = l.filter(function (t) {
|
|
var e = t.videoCodec,
|
|
r = t.width,
|
|
i = t.height;
|
|
return !!e || !(!r || !i);
|
|
})),
|
|
0 !== l.length)
|
|
) {
|
|
e.audioTracks &&
|
|
cr(
|
|
(i = e.audioTracks.filter(function (t) {
|
|
return !t.audioCodec || Qt(t.audioCodec, "audio");
|
|
}))
|
|
),
|
|
e.subtitles && cr((n = e.subtitles));
|
|
var u = l.slice(0);
|
|
l.sort(function (t, e) {
|
|
return t.attrs["HDCP-LEVEL"] !== e.attrs["HDCP-LEVEL"]
|
|
? (t.attrs["HDCP-LEVEL"] || "") >
|
|
(e.attrs["HDCP-LEVEL"] || "")
|
|
? 1
|
|
: -1
|
|
: t.bitrate !== e.bitrate
|
|
? t.bitrate - e.bitrate
|
|
: t.attrs["FRAME-RATE"] !== e.attrs["FRAME-RATE"]
|
|
? t.attrs.decimalFloatingPoint("FRAME-RATE") -
|
|
e.attrs.decimalFloatingPoint("FRAME-RATE")
|
|
: t.attrs.SCORE !== e.attrs.SCORE
|
|
? t.attrs.decimalFloatingPoint("SCORE") -
|
|
e.attrs.decimalFloatingPoint("SCORE")
|
|
: a && t.height !== e.height
|
|
? t.height - e.height
|
|
: 0;
|
|
});
|
|
var h = u[0];
|
|
if (
|
|
this.steering &&
|
|
(l = this.steering.filterParsedLevels(l)).length !== u.length
|
|
)
|
|
for (var d = 0; d < u.length; d++)
|
|
if (u[d].pathwayId === l[0].pathwayId) {
|
|
h = u[d];
|
|
break;
|
|
}
|
|
this._levels = l;
|
|
for (var c = 0; c < l.length; c++)
|
|
if (l[c] === h) {
|
|
(this._firstLevel = c),
|
|
this.log(
|
|
"manifest loaded, " +
|
|
l.length +
|
|
" level(s) found, first bitrate: " +
|
|
h.bitrate
|
|
);
|
|
break;
|
|
}
|
|
var f = o && !s,
|
|
g = {
|
|
levels: l,
|
|
audioTracks: i,
|
|
subtitleTracks: n,
|
|
sessionData: e.sessionData,
|
|
sessionKeys: e.sessionKeys,
|
|
firstLevel: this._firstLevel,
|
|
stats: e.stats,
|
|
audio: o,
|
|
video: s,
|
|
altAudio:
|
|
!f &&
|
|
i.some(function (t) {
|
|
return !!t.url;
|
|
}),
|
|
};
|
|
this.hls.trigger(S.MANIFEST_PARSED, g),
|
|
(this.hls.config.autoStartLoad || this.hls.forceStartLoad) &&
|
|
this.hls.startLoad(this.hls.config.startPosition);
|
|
} else
|
|
Promise.resolve().then(function () {
|
|
if (r.hls) {
|
|
var t = new Error(
|
|
"no level with compatible codecs found in manifest"
|
|
);
|
|
r.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.MANIFEST_INCOMPATIBLE_CODECS_ERROR,
|
|
fatal: !0,
|
|
url: e.url,
|
|
error: t,
|
|
reason: t.message,
|
|
});
|
|
}
|
|
});
|
|
}),
|
|
(r.onError = function (t, e) {
|
|
!e.fatal &&
|
|
e.context &&
|
|
e.context.type === de &&
|
|
e.context.level === this.level &&
|
|
this.checkRetry(e);
|
|
}),
|
|
(r.onFragLoaded = function (t, e) {
|
|
var r = e.frag;
|
|
if (void 0 !== r && r.type === ge) {
|
|
var i = this._levels[r.level];
|
|
void 0 !== i && (i.loadError = 0);
|
|
}
|
|
}),
|
|
(r.onLevelLoaded = function (t, e) {
|
|
var r,
|
|
i,
|
|
n = e.level,
|
|
a = e.details,
|
|
s = this._levels[n];
|
|
if (!s)
|
|
return (
|
|
this.warn("Invalid level index " + n),
|
|
void (
|
|
null != (i = e.deliveryDirectives) &&
|
|
i.skip &&
|
|
(a.deltaUpdateFailed = !0)
|
|
)
|
|
);
|
|
n === this.currentLevelIndex
|
|
? (0 === s.fragmentError && (s.loadError = 0),
|
|
this.playlistLoaded(n, e, s.details))
|
|
: null != (r = e.deliveryDirectives) &&
|
|
r.skip &&
|
|
(a.deltaUpdateFailed = !0);
|
|
}),
|
|
(r.onAudioTrackSwitched = function (t, e) {
|
|
var r = this.currentLevel;
|
|
if (r) {
|
|
var i = this.hls.audioTracks[e.id].groupId;
|
|
if (r.audioGroupIds && r.audioGroupId !== i) {
|
|
for (var n = -1, a = 0; a < r.audioGroupIds.length; a++)
|
|
if (r.audioGroupIds[a] === i) {
|
|
n = a;
|
|
break;
|
|
}
|
|
-1 !== n &&
|
|
n !== r.urlId &&
|
|
((r.urlId = n), this.canLoad && this.startLoad());
|
|
}
|
|
}
|
|
}),
|
|
(r.loadPlaylist = function (e) {
|
|
t.prototype.loadPlaylist.call(this);
|
|
var r = this.currentLevelIndex,
|
|
i = this.currentLevel;
|
|
if (i && this.shouldLoadPlaylist(i)) {
|
|
var n = i.urlId,
|
|
a = i.uri;
|
|
if (e)
|
|
try {
|
|
a = e.addDirectives(a);
|
|
} catch (t) {
|
|
this.warn(
|
|
"Could not construct new URL with HLS Delivery Directives: " +
|
|
t
|
|
);
|
|
}
|
|
var s = i.attrs["PATHWAY-ID"];
|
|
this.log(
|
|
"Loading level index " +
|
|
r +
|
|
(void 0 !== (null == e ? void 0 : e.msn)
|
|
? " at sn " + e.msn + " part " + e.part
|
|
: "") +
|
|
" with" +
|
|
(s ? " Pathway " + s : "") +
|
|
" URI " +
|
|
(n + 1) +
|
|
"/" +
|
|
i.url.length +
|
|
" " +
|
|
a
|
|
),
|
|
this.clearTimer(),
|
|
this.hls.trigger(S.LEVEL_LOADING, {
|
|
url: a,
|
|
level: r,
|
|
id: n,
|
|
deliveryDirectives: e || null,
|
|
});
|
|
}
|
|
}),
|
|
(r.removeLevel = function (t, e) {
|
|
var r = this,
|
|
i = function (t, r) {
|
|
return r !== e;
|
|
},
|
|
n = this._levels.filter(function (n, a) {
|
|
return (
|
|
a !== t ||
|
|
(n.url.length > 1 && void 0 !== e
|
|
? ((n.url = n.url.filter(i)),
|
|
n.audioGroupIds &&
|
|
(n.audioGroupIds = n.audioGroupIds.filter(i)),
|
|
n.textGroupIds &&
|
|
(n.textGroupIds = n.textGroupIds.filter(i)),
|
|
(n.urlId = 0),
|
|
!0)
|
|
: (r.steering && r.steering.removeLevel(n), !1))
|
|
);
|
|
});
|
|
this.hls.trigger(S.LEVELS_UPDATED, { levels: n });
|
|
}),
|
|
(r.onLevelsUpdated = function (t, e) {
|
|
var r = e.levels;
|
|
r.forEach(function (t, e) {
|
|
var r = t.details;
|
|
null != r &&
|
|
r.fragments &&
|
|
r.fragments.forEach(function (t) {
|
|
t.level = e;
|
|
});
|
|
}),
|
|
(this._levels = r);
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "levels",
|
|
get: function () {
|
|
return 0 === this._levels.length ? null : this._levels;
|
|
},
|
|
},
|
|
{
|
|
key: "level",
|
|
get: function () {
|
|
return this.currentLevelIndex;
|
|
},
|
|
set: function (t) {
|
|
var e = this._levels;
|
|
if (0 !== e.length) {
|
|
if (t < 0 || t >= e.length) {
|
|
var r = new Error("invalid level idx"),
|
|
i = t < 0;
|
|
if (
|
|
(this.hls.trigger(S.ERROR, {
|
|
type: L.OTHER_ERROR,
|
|
details: R.LEVEL_SWITCH_ERROR,
|
|
level: t,
|
|
fatal: i,
|
|
error: r,
|
|
reason: r.message,
|
|
}),
|
|
i)
|
|
)
|
|
return;
|
|
t = Math.min(t, e.length - 1);
|
|
}
|
|
var n = this.currentLevelIndex,
|
|
a = this.currentLevel,
|
|
s = a ? a.attrs["PATHWAY-ID"] : void 0,
|
|
l = e[t],
|
|
u = l.attrs["PATHWAY-ID"];
|
|
if (
|
|
((this.currentLevelIndex = t),
|
|
(this.currentLevel = l),
|
|
n !== t || !l.details || !a || s !== u)
|
|
) {
|
|
this.log(
|
|
"Switching to level " +
|
|
t +
|
|
(u ? " with Pathway " + u : "") +
|
|
" from level " +
|
|
n +
|
|
(s ? " with Pathway " + s : "")
|
|
);
|
|
var h = o({}, l, {
|
|
level: t,
|
|
maxBitrate: l.maxBitrate,
|
|
attrs: l.attrs,
|
|
uri: l.uri,
|
|
urlId: l.urlId,
|
|
});
|
|
delete h._attrs,
|
|
delete h._urlId,
|
|
this.hls.trigger(S.LEVEL_SWITCHING, h);
|
|
var d = l.details;
|
|
if (!d || d.live) {
|
|
var c = this.switchParams(
|
|
l.uri,
|
|
null == a ? void 0 : a.details
|
|
);
|
|
this.loadPlaylist(c);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: "manualLevel",
|
|
get: function () {
|
|
return this.manualLevelIndex;
|
|
},
|
|
set: function (t) {
|
|
(this.manualLevelIndex = t),
|
|
void 0 === this._startLevel && (this._startLevel = t),
|
|
-1 !== t && (this.level = t);
|
|
},
|
|
},
|
|
{
|
|
key: "firstLevel",
|
|
get: function () {
|
|
return this._firstLevel;
|
|
},
|
|
set: function (t) {
|
|
this._firstLevel = t;
|
|
},
|
|
},
|
|
{
|
|
key: "startLevel",
|
|
get: function () {
|
|
if (void 0 === this._startLevel) {
|
|
var t = this.hls.config.startLevel;
|
|
return void 0 !== t ? t : this._firstLevel;
|
|
}
|
|
return this._startLevel;
|
|
},
|
|
set: function (t) {
|
|
this._startLevel = t;
|
|
},
|
|
},
|
|
{
|
|
key: "nextLoadLevel",
|
|
get: function () {
|
|
return -1 !== this.manualLevelIndex
|
|
? this.manualLevelIndex
|
|
: this.hls.nextAutoLevel;
|
|
},
|
|
set: function (t) {
|
|
(this.level = t),
|
|
-1 === this.manualLevelIndex &&
|
|
(this.hls.nextAutoLevel = t);
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(ur);
|
|
function dr(t, e, r) {
|
|
r &&
|
|
("audio" === e
|
|
? (t.audioGroupIds || (t.audioGroupIds = []),
|
|
(t.audioGroupIds[t.url.length - 1] = r))
|
|
: "text" === e &&
|
|
(t.textGroupIds || (t.textGroupIds = []),
|
|
(t.textGroupIds[t.url.length - 1] = r)));
|
|
}
|
|
function cr(t) {
|
|
var e = {};
|
|
t.forEach(function (t) {
|
|
var r = t.groupId || "";
|
|
(t.id = e[r] = e[r] || 0), e[r]++;
|
|
});
|
|
}
|
|
var fr = "NOT_LOADED",
|
|
gr = "APPENDING",
|
|
vr = "PARTIAL",
|
|
mr = "OK",
|
|
pr = (function () {
|
|
function t(t) {
|
|
(this.activePartLists = Object.create(null)),
|
|
(this.endListFragments = Object.create(null)),
|
|
(this.fragments = Object.create(null)),
|
|
(this.timeRanges = Object.create(null)),
|
|
(this.bufferPadding = 0.2),
|
|
(this.hls = void 0),
|
|
(this.hasGaps = !1),
|
|
(this.hls = t),
|
|
this._registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.BUFFER_APPENDED, this.onBufferAppended, this),
|
|
t.on(S.FRAG_BUFFERED, this.onFragBuffered, this),
|
|
t.on(S.FRAG_LOADED, this.onFragLoaded, this);
|
|
}),
|
|
(e._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.BUFFER_APPENDED, this.onBufferAppended, this),
|
|
t.off(S.FRAG_BUFFERED, this.onFragBuffered, this),
|
|
t.off(S.FRAG_LOADED, this.onFragLoaded, this);
|
|
}),
|
|
(e.destroy = function () {
|
|
this._unregisterListeners(),
|
|
(this.fragments =
|
|
this.activePartLists =
|
|
this.endListFragments =
|
|
this.timeRanges =
|
|
null);
|
|
}),
|
|
(e.getAppendedFrag = function (t, e) {
|
|
var r = this.activePartLists[e];
|
|
if (r)
|
|
for (var i = r.length; i--; ) {
|
|
var n = r[i];
|
|
if (!n) break;
|
|
var a = n.end;
|
|
if (n.start <= t && null !== a && t <= a) return n;
|
|
}
|
|
return this.getBufferedFrag(t, e);
|
|
}),
|
|
(e.getBufferedFrag = function (t, e) {
|
|
for (
|
|
var r = this.fragments, i = Object.keys(r), n = i.length;
|
|
n--;
|
|
|
|
) {
|
|
var a = r[i[n]];
|
|
if ((null == a ? void 0 : a.body.type) === e && a.buffered) {
|
|
var s = a.body;
|
|
if (s.start <= t && t <= s.end) return s;
|
|
}
|
|
}
|
|
return null;
|
|
}),
|
|
(e.detectEvictedFragments = function (t, e, r, i) {
|
|
var n = this;
|
|
this.timeRanges && (this.timeRanges[t] = e);
|
|
var a = (null == i ? void 0 : i.fragment.sn) || -1;
|
|
Object.keys(this.fragments).forEach(function (i) {
|
|
var s = n.fragments[i];
|
|
if (s && !(a >= s.body.sn))
|
|
if (s.buffered || s.loaded) {
|
|
var o = s.range[t];
|
|
o &&
|
|
o.time.some(function (t) {
|
|
var r = !n.isTimeBuffered(t.startPTS, t.endPTS, e);
|
|
return r && n.removeFragment(s.body), r;
|
|
});
|
|
} else s.body.type === r && n.removeFragment(s.body);
|
|
});
|
|
}),
|
|
(e.detectPartialFragments = function (t) {
|
|
var e = this,
|
|
r = this.timeRanges,
|
|
i = t.frag,
|
|
n = t.part;
|
|
if (r && "initSegment" !== i.sn) {
|
|
var a = Tr(i),
|
|
s = this.fragments[a];
|
|
if (!(!s || (s.buffered && i.gap))) {
|
|
var o = !i.relurl;
|
|
Object.keys(r).forEach(function (t) {
|
|
var a = i.elementaryStreams[t];
|
|
if (a) {
|
|
var l = r[t],
|
|
u = o || !0 === a.partial;
|
|
s.range[t] = e.getBufferedTimes(i, n, u, l);
|
|
}
|
|
}),
|
|
(s.loaded = null),
|
|
Object.keys(s.range).length
|
|
? ((s.buffered = !0),
|
|
(s.body.endList = i.endList || s.body.endList) &&
|
|
(this.endListFragments[s.body.type] = s),
|
|
yr(s) || this.removeParts(i.sn - 1, i.type))
|
|
: this.removeFragment(s.body);
|
|
}
|
|
}
|
|
}),
|
|
(e.removeParts = function (t, e) {
|
|
var r = this.activePartLists[e];
|
|
r &&
|
|
(this.activePartLists[e] = r.filter(function (e) {
|
|
return e.fragment.sn >= t;
|
|
}));
|
|
}),
|
|
(e.fragBuffered = function (t, e) {
|
|
var r = Tr(t),
|
|
i = this.fragments[r];
|
|
!i &&
|
|
e &&
|
|
((i = this.fragments[r] =
|
|
{
|
|
body: t,
|
|
appendedPTS: null,
|
|
loaded: null,
|
|
buffered: !1,
|
|
range: Object.create(null),
|
|
}),
|
|
t.gap && (this.hasGaps = !0)),
|
|
i && ((i.loaded = null), (i.buffered = !0));
|
|
}),
|
|
(e.getBufferedTimes = function (t, e, r, i) {
|
|
for (
|
|
var n = { time: [], partial: r },
|
|
a = t.start,
|
|
s = t.end,
|
|
o = t.minEndPTS || s,
|
|
l = t.maxStartPTS || a,
|
|
u = 0;
|
|
u < i.length;
|
|
u++
|
|
) {
|
|
var h = i.start(u) - this.bufferPadding,
|
|
d = i.end(u) + this.bufferPadding;
|
|
if (l >= h && o <= d) {
|
|
n.time.push({
|
|
startPTS: Math.max(a, i.start(u)),
|
|
endPTS: Math.min(s, i.end(u)),
|
|
});
|
|
break;
|
|
}
|
|
if (a < d && s > h)
|
|
(n.partial = !0),
|
|
n.time.push({
|
|
startPTS: Math.max(a, i.start(u)),
|
|
endPTS: Math.min(s, i.end(u)),
|
|
});
|
|
else if (s <= h) break;
|
|
}
|
|
return n;
|
|
}),
|
|
(e.getPartialFragment = function (t) {
|
|
var e,
|
|
r,
|
|
i,
|
|
n = null,
|
|
a = 0,
|
|
s = this.bufferPadding,
|
|
o = this.fragments;
|
|
return (
|
|
Object.keys(o).forEach(function (l) {
|
|
var u = o[l];
|
|
u &&
|
|
yr(u) &&
|
|
((r = u.body.start - s),
|
|
(i = u.body.end + s),
|
|
t >= r &&
|
|
t <= i &&
|
|
((e = Math.min(t - r, i - t)),
|
|
a <= e && ((n = u.body), (a = e))));
|
|
}),
|
|
n
|
|
);
|
|
}),
|
|
(e.isEndListAppended = function (t) {
|
|
var e = this.endListFragments[t];
|
|
return void 0 !== e && (e.buffered || yr(e));
|
|
}),
|
|
(e.getState = function (t) {
|
|
var e = Tr(t),
|
|
r = this.fragments[e];
|
|
return r ? (r.buffered ? (yr(r) ? vr : mr) : gr) : fr;
|
|
}),
|
|
(e.isTimeBuffered = function (t, e, r) {
|
|
for (var i, n, a = 0; a < r.length; a++) {
|
|
if (
|
|
((i = r.start(a) - this.bufferPadding),
|
|
(n = r.end(a) + this.bufferPadding),
|
|
t >= i && e <= n)
|
|
)
|
|
return !0;
|
|
if (e <= i) return !1;
|
|
}
|
|
return !1;
|
|
}),
|
|
(e.onFragLoaded = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.part;
|
|
if ("initSegment" !== r.sn && !r.bitrateTest) {
|
|
var n = i ? null : e,
|
|
a = Tr(r);
|
|
this.fragments[a] = {
|
|
body: r,
|
|
appendedPTS: null,
|
|
loaded: n,
|
|
buffered: !1,
|
|
range: Object.create(null),
|
|
};
|
|
}
|
|
}),
|
|
(e.onBufferAppended = function (t, e) {
|
|
var r = this,
|
|
i = e.frag,
|
|
n = e.part,
|
|
a = e.timeRanges;
|
|
if ("initSegment" !== i.sn) {
|
|
var s = i.type;
|
|
if (n) {
|
|
var o = this.activePartLists[s];
|
|
o || (this.activePartLists[s] = o = []), o.push(n);
|
|
}
|
|
(this.timeRanges = a),
|
|
Object.keys(a).forEach(function (t) {
|
|
var e = a[t];
|
|
r.detectEvictedFragments(t, e, s, n);
|
|
});
|
|
}
|
|
}),
|
|
(e.onFragBuffered = function (t, e) {
|
|
this.detectPartialFragments(e);
|
|
}),
|
|
(e.hasFragment = function (t) {
|
|
var e = Tr(t);
|
|
return !!this.fragments[e];
|
|
}),
|
|
(e.hasParts = function (t) {
|
|
var e;
|
|
return !(null == (e = this.activePartLists[t]) || !e.length);
|
|
}),
|
|
(e.removeFragmentsInRange = function (t, e, r, i, n) {
|
|
var a = this;
|
|
(i && !this.hasGaps) ||
|
|
Object.keys(this.fragments).forEach(function (s) {
|
|
var o = a.fragments[s];
|
|
if (o) {
|
|
var l = o.body;
|
|
l.type !== r ||
|
|
(i && !l.gap) ||
|
|
(l.start < e &&
|
|
l.end > t &&
|
|
(o.buffered || n) &&
|
|
a.removeFragment(l));
|
|
}
|
|
});
|
|
}),
|
|
(e.removeFragment = function (t) {
|
|
var e = Tr(t);
|
|
(t.stats.loaded = 0), t.clearElementaryStreamInfo();
|
|
var r = this.activePartLists[t.type];
|
|
if (r) {
|
|
var i = t.sn;
|
|
this.activePartLists[t.type] = r.filter(function (t) {
|
|
return t.fragment.sn !== i;
|
|
});
|
|
}
|
|
delete this.fragments[e],
|
|
t.endList && delete this.endListFragments[t.type];
|
|
}),
|
|
(e.removeAllFragments = function () {
|
|
(this.fragments = Object.create(null)),
|
|
(this.endListFragments = Object.create(null)),
|
|
(this.activePartLists = Object.create(null)),
|
|
(this.hasGaps = !1);
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function yr(t) {
|
|
var e, r, i;
|
|
return (
|
|
t.buffered &&
|
|
(t.body.gap ||
|
|
(null == (e = t.range.video) ? void 0 : e.partial) ||
|
|
(null == (r = t.range.audio) ? void 0 : r.partial) ||
|
|
(null == (i = t.range.audiovideo) ? void 0 : i.partial))
|
|
);
|
|
}
|
|
function Tr(t) {
|
|
return t.type + "_" + t.level + "_" + t.urlId + "_" + t.sn;
|
|
}
|
|
var Er = Math.pow(2, 17),
|
|
Sr = (function () {
|
|
function t(t) {
|
|
(this.config = void 0),
|
|
(this.loader = null),
|
|
(this.partLoadTimeout = -1),
|
|
(this.config = t);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this.loader && (this.loader.destroy(), (this.loader = null));
|
|
}),
|
|
(e.abort = function () {
|
|
this.loader && this.loader.abort();
|
|
}),
|
|
(e.load = function (t, e) {
|
|
var r = this,
|
|
n = t.url;
|
|
if (!n)
|
|
return Promise.reject(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.FRAG_LOAD_ERROR,
|
|
fatal: !1,
|
|
frag: t,
|
|
error: new Error(
|
|
"Fragment does not have a " + (n ? "part list" : "url")
|
|
),
|
|
networkDetails: null,
|
|
})
|
|
);
|
|
this.abort();
|
|
var a = this.config,
|
|
s = a.fLoader,
|
|
o = a.loader;
|
|
return new Promise(function (l, u) {
|
|
if ((r.loader && r.loader.destroy(), t.gap)) {
|
|
if (
|
|
t.tagList.some(function (t) {
|
|
return "GAP" === t[0];
|
|
})
|
|
)
|
|
return void u(Rr(t));
|
|
t.gap = !1;
|
|
}
|
|
var h = (r.loader = t.loader = s ? new s(a) : new o(a)),
|
|
d = Lr(t),
|
|
c = Xe(a.fragLoadPolicy.default),
|
|
f = {
|
|
loadPolicy: c,
|
|
timeout: c.maxLoadTimeMs,
|
|
maxRetry: 0,
|
|
retryDelay: 0,
|
|
maxRetryDelay: 0,
|
|
highWaterMark: "initSegment" === t.sn ? 1 / 0 : Er,
|
|
};
|
|
(t.stats = h.stats),
|
|
h.load(d, f, {
|
|
onSuccess: function (e, i, n, a) {
|
|
r.resetLoader(t, h);
|
|
var s = e.data;
|
|
n.resetIV &&
|
|
t.decryptdata &&
|
|
((t.decryptdata.iv = new Uint8Array(s.slice(0, 16))),
|
|
(s = s.slice(16))),
|
|
l({
|
|
frag: t,
|
|
part: null,
|
|
payload: s,
|
|
networkDetails: a,
|
|
});
|
|
},
|
|
onError: function (e, a, s, o) {
|
|
r.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.FRAG_LOAD_ERROR,
|
|
fatal: !1,
|
|
frag: t,
|
|
response: i({ url: n, data: void 0 }, e),
|
|
error: new Error(
|
|
"HTTP Error " + e.code + " " + e.text
|
|
),
|
|
networkDetails: s,
|
|
stats: o,
|
|
})
|
|
);
|
|
},
|
|
onAbort: function (e, i, n) {
|
|
r.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.INTERNAL_ABORTED,
|
|
fatal: !1,
|
|
frag: t,
|
|
error: new Error("Aborted"),
|
|
networkDetails: n,
|
|
stats: e,
|
|
})
|
|
);
|
|
},
|
|
onTimeout: function (e, i, n) {
|
|
r.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.FRAG_LOAD_TIMEOUT,
|
|
fatal: !1,
|
|
frag: t,
|
|
error: new Error(
|
|
"Timeout after " + f.timeout + "ms"
|
|
),
|
|
networkDetails: n,
|
|
stats: e,
|
|
})
|
|
);
|
|
},
|
|
onProgress: function (r, i, n, a) {
|
|
e &&
|
|
e({
|
|
frag: t,
|
|
part: null,
|
|
payload: n,
|
|
networkDetails: a,
|
|
});
|
|
},
|
|
});
|
|
});
|
|
}),
|
|
(e.loadPart = function (t, e, r) {
|
|
var n = this;
|
|
this.abort();
|
|
var a = this.config,
|
|
s = a.fLoader,
|
|
o = a.loader;
|
|
return new Promise(function (l, u) {
|
|
if ((n.loader && n.loader.destroy(), t.gap || e.gap))
|
|
u(Rr(t, e));
|
|
else {
|
|
var h = (n.loader = t.loader = s ? new s(a) : new o(a)),
|
|
d = Lr(t, e),
|
|
c = Xe(a.fragLoadPolicy.default),
|
|
f = {
|
|
loadPolicy: c,
|
|
timeout: c.maxLoadTimeMs,
|
|
maxRetry: 0,
|
|
retryDelay: 0,
|
|
maxRetryDelay: 0,
|
|
highWaterMark: Er,
|
|
};
|
|
(e.stats = h.stats),
|
|
h.load(d, f, {
|
|
onSuccess: function (i, a, s, o) {
|
|
n.resetLoader(t, h), n.updateStatsFromPart(t, e);
|
|
var u = {
|
|
frag: t,
|
|
part: e,
|
|
payload: i.data,
|
|
networkDetails: o,
|
|
};
|
|
r(u), l(u);
|
|
},
|
|
onError: function (r, a, s, o) {
|
|
n.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.FRAG_LOAD_ERROR,
|
|
fatal: !1,
|
|
frag: t,
|
|
part: e,
|
|
response: i({ url: d.url, data: void 0 }, r),
|
|
error: new Error(
|
|
"HTTP Error " + r.code + " " + r.text
|
|
),
|
|
networkDetails: s,
|
|
stats: o,
|
|
})
|
|
);
|
|
},
|
|
onAbort: function (r, i, a) {
|
|
(t.stats.aborted = e.stats.aborted),
|
|
n.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.INTERNAL_ABORTED,
|
|
fatal: !1,
|
|
frag: t,
|
|
part: e,
|
|
error: new Error("Aborted"),
|
|
networkDetails: a,
|
|
stats: r,
|
|
})
|
|
);
|
|
},
|
|
onTimeout: function (r, i, a) {
|
|
n.resetLoader(t, h),
|
|
u(
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: R.FRAG_LOAD_TIMEOUT,
|
|
fatal: !1,
|
|
frag: t,
|
|
part: e,
|
|
error: new Error(
|
|
"Timeout after " + f.timeout + "ms"
|
|
),
|
|
networkDetails: a,
|
|
stats: r,
|
|
})
|
|
);
|
|
},
|
|
});
|
|
}
|
|
});
|
|
}),
|
|
(e.updateStatsFromPart = function (t, e) {
|
|
var r = t.stats,
|
|
i = e.stats,
|
|
n = i.total;
|
|
if (((r.loaded += i.loaded), n)) {
|
|
var a = Math.round(t.duration / e.duration),
|
|
s = Math.min(Math.round(r.loaded / n), a),
|
|
o = (a - s) * Math.round(r.loaded / s);
|
|
r.total = r.loaded + o;
|
|
} else r.total = Math.max(r.loaded, r.total);
|
|
var l = r.loading,
|
|
u = i.loading;
|
|
l.start
|
|
? (l.first += u.first - u.start)
|
|
: ((l.start = u.start), (l.first = u.first)),
|
|
(l.end = u.end);
|
|
}),
|
|
(e.resetLoader = function (t, e) {
|
|
(t.loader = null),
|
|
this.loader === e &&
|
|
(self.clearTimeout(this.partLoadTimeout),
|
|
(this.loader = null)),
|
|
e.destroy();
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Lr(t, e) {
|
|
void 0 === e && (e = null);
|
|
var r = e || t,
|
|
i = {
|
|
frag: t,
|
|
part: e,
|
|
responseType: "arraybuffer",
|
|
url: r.url,
|
|
headers: {},
|
|
rangeStart: 0,
|
|
rangeEnd: 0,
|
|
},
|
|
n = r.byteRangeStartOffset,
|
|
a = r.byteRangeEndOffset;
|
|
if (E(n) && E(a)) {
|
|
var s,
|
|
o = n,
|
|
l = a;
|
|
if (
|
|
"initSegment" === t.sn &&
|
|
"AES-128" === (null == (s = t.decryptdata) ? void 0 : s.method)
|
|
) {
|
|
var u = a - n;
|
|
u % 16 && (l = a + (16 - (u % 16))),
|
|
0 !== n && ((i.resetIV = !0), (o = n - 16));
|
|
}
|
|
(i.rangeStart = o), (i.rangeEnd = l);
|
|
}
|
|
return i;
|
|
}
|
|
function Rr(t, e) {
|
|
var r = new Error("GAP " + (t.gap ? "tag" : "attribute") + " found"),
|
|
i = {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_GAP,
|
|
fatal: !1,
|
|
frag: t,
|
|
error: r,
|
|
networkDetails: null,
|
|
};
|
|
return e && (i.part = e), ((e || t).stats.aborted = !0), new Ar(i);
|
|
}
|
|
var Ar = (function (t) {
|
|
function e(e) {
|
|
var r;
|
|
return (
|
|
((r = t.call(this, e.error.message) || this).data = void 0),
|
|
(r.data = e),
|
|
r
|
|
);
|
|
}
|
|
return l(e, t), e;
|
|
})(f(Error)),
|
|
kr = (function () {
|
|
function t(t) {
|
|
(this.config = void 0),
|
|
(this.keyUriToKeyInfo = {}),
|
|
(this.emeController = null),
|
|
(this.config = t);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.abort = function (t) {
|
|
for (var e in this.keyUriToKeyInfo) {
|
|
var r = this.keyUriToKeyInfo[e].loader;
|
|
if (r) {
|
|
if (t && t !== r.context.frag.type) return;
|
|
r.abort();
|
|
}
|
|
}
|
|
}),
|
|
(e.detach = function () {
|
|
for (var t in this.keyUriToKeyInfo) {
|
|
var e = this.keyUriToKeyInfo[t];
|
|
(e.mediaKeySessionContext ||
|
|
e.decryptdata.isCommonEncryption) &&
|
|
delete this.keyUriToKeyInfo[t];
|
|
}
|
|
}),
|
|
(e.destroy = function () {
|
|
for (var t in (this.detach(), this.keyUriToKeyInfo)) {
|
|
var e = this.keyUriToKeyInfo[t].loader;
|
|
e && e.destroy();
|
|
}
|
|
this.keyUriToKeyInfo = {};
|
|
}),
|
|
(e.createKeyLoadError = function (t, e, r, i, n) {
|
|
return (
|
|
void 0 === e && (e = R.KEY_LOAD_ERROR),
|
|
new Ar({
|
|
type: L.NETWORK_ERROR,
|
|
details: e,
|
|
fatal: !1,
|
|
frag: t,
|
|
response: n,
|
|
error: r,
|
|
networkDetails: i,
|
|
})
|
|
);
|
|
}),
|
|
(e.loadClear = function (t, e) {
|
|
var r = this;
|
|
if (this.emeController && this.config.emeEnabled)
|
|
for (
|
|
var i = t.sn,
|
|
n = t.cc,
|
|
a = function () {
|
|
var t = e[s];
|
|
if (
|
|
n <= t.cc &&
|
|
("initSegment" === i ||
|
|
"initSegment" === t.sn ||
|
|
i < t.sn)
|
|
)
|
|
return (
|
|
r.emeController
|
|
.selectKeySystemFormat(t)
|
|
.then(function (e) {
|
|
t.setKeyFormat(e);
|
|
}),
|
|
"break"
|
|
);
|
|
},
|
|
s = 0;
|
|
s < e.length && "break" !== a();
|
|
s++
|
|
);
|
|
}),
|
|
(e.load = function (t) {
|
|
var e = this;
|
|
return !t.decryptdata && t.encrypted && this.emeController
|
|
? this.emeController
|
|
.selectKeySystemFormat(t)
|
|
.then(function (r) {
|
|
return e.loadInternal(t, r);
|
|
})
|
|
: this.loadInternal(t);
|
|
}),
|
|
(e.loadInternal = function (t, e) {
|
|
var r, i;
|
|
e && t.setKeyFormat(e);
|
|
var n = t.decryptdata;
|
|
if (!n) {
|
|
var a = new Error(
|
|
e
|
|
? "Expected frag.decryptdata to be defined after setting format " +
|
|
e
|
|
: "Missing decryption data on fragment in onKeyLoading"
|
|
);
|
|
return Promise.reject(
|
|
this.createKeyLoadError(t, R.KEY_LOAD_ERROR, a)
|
|
);
|
|
}
|
|
var s = n.uri;
|
|
if (!s)
|
|
return Promise.reject(
|
|
this.createKeyLoadError(
|
|
t,
|
|
R.KEY_LOAD_ERROR,
|
|
new Error('Invalid key URI: "' + s + '"')
|
|
)
|
|
);
|
|
var o,
|
|
l = this.keyUriToKeyInfo[s];
|
|
if (null != (r = l) && r.decryptdata.key)
|
|
return (
|
|
(n.key = l.decryptdata.key),
|
|
Promise.resolve({ frag: t, keyInfo: l })
|
|
);
|
|
if (null != (i = l) && i.keyLoadPromise)
|
|
switch (
|
|
null == (o = l.mediaKeySessionContext) ? void 0 : o.keyStatus
|
|
) {
|
|
case void 0:
|
|
case "status-pending":
|
|
case "usable":
|
|
case "usable-in-future":
|
|
return l.keyLoadPromise.then(function (e) {
|
|
return (
|
|
(n.key = e.keyInfo.decryptdata.key),
|
|
{ frag: t, keyInfo: l }
|
|
);
|
|
});
|
|
}
|
|
switch (
|
|
((l = this.keyUriToKeyInfo[s] =
|
|
{
|
|
decryptdata: n,
|
|
keyLoadPromise: null,
|
|
loader: null,
|
|
mediaKeySessionContext: null,
|
|
}),
|
|
n.method)
|
|
) {
|
|
case "ISO-23001-7":
|
|
case "SAMPLE-AES":
|
|
case "SAMPLE-AES-CENC":
|
|
case "SAMPLE-AES-CTR":
|
|
return "identity" === n.keyFormat
|
|
? this.loadKeyHTTP(l, t)
|
|
: this.loadKeyEME(l, t);
|
|
case "AES-128":
|
|
return this.loadKeyHTTP(l, t);
|
|
default:
|
|
return Promise.reject(
|
|
this.createKeyLoadError(
|
|
t,
|
|
R.KEY_LOAD_ERROR,
|
|
new Error(
|
|
'Key supplied with unsupported METHOD: "' +
|
|
n.method +
|
|
'"'
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}),
|
|
(e.loadKeyEME = function (t, e) {
|
|
var r = { frag: e, keyInfo: t };
|
|
if (this.emeController && this.config.emeEnabled) {
|
|
var i = this.emeController.loadKey(r);
|
|
if (i)
|
|
return (t.keyLoadPromise = i.then(function (e) {
|
|
return (t.mediaKeySessionContext = e), r;
|
|
})).catch(function (e) {
|
|
throw ((t.keyLoadPromise = null), e);
|
|
});
|
|
}
|
|
return Promise.resolve(r);
|
|
}),
|
|
(e.loadKeyHTTP = function (t, e) {
|
|
var r = this,
|
|
n = this.config,
|
|
a = new (0, n.loader)(n);
|
|
return (
|
|
(e.keyLoader = t.loader = a),
|
|
(t.keyLoadPromise = new Promise(function (s, o) {
|
|
var l = {
|
|
keyInfo: t,
|
|
frag: e,
|
|
responseType: "arraybuffer",
|
|
url: t.decryptdata.uri,
|
|
},
|
|
u = n.keyLoadPolicy.default,
|
|
h = {
|
|
loadPolicy: u,
|
|
timeout: u.maxLoadTimeMs,
|
|
maxRetry: 0,
|
|
retryDelay: 0,
|
|
maxRetryDelay: 0,
|
|
},
|
|
d = {
|
|
onSuccess: function (t, e, i, n) {
|
|
var a = i.frag,
|
|
l = i.keyInfo,
|
|
u = i.url;
|
|
if (!a.decryptdata || l !== r.keyUriToKeyInfo[u])
|
|
return o(
|
|
r.createKeyLoadError(
|
|
a,
|
|
R.KEY_LOAD_ERROR,
|
|
new Error(
|
|
"after key load, decryptdata unset or changed"
|
|
),
|
|
n
|
|
)
|
|
);
|
|
(l.decryptdata.key = a.decryptdata.key =
|
|
new Uint8Array(t.data)),
|
|
(a.keyLoader = null),
|
|
(l.loader = null),
|
|
s({ frag: a, keyInfo: l });
|
|
},
|
|
onError: function (t, n, a, s) {
|
|
r.resetLoader(n),
|
|
o(
|
|
r.createKeyLoadError(
|
|
e,
|
|
R.KEY_LOAD_ERROR,
|
|
new Error(
|
|
"HTTP Error " +
|
|
t.code +
|
|
" loading key " +
|
|
t.text
|
|
),
|
|
a,
|
|
i({ url: l.url, data: void 0 }, t)
|
|
)
|
|
);
|
|
},
|
|
onTimeout: function (t, i, n) {
|
|
r.resetLoader(i),
|
|
o(
|
|
r.createKeyLoadError(
|
|
e,
|
|
R.KEY_LOAD_TIMEOUT,
|
|
new Error("key loading timed out"),
|
|
n
|
|
)
|
|
);
|
|
},
|
|
onAbort: function (t, i, n) {
|
|
r.resetLoader(i),
|
|
o(
|
|
r.createKeyLoadError(
|
|
e,
|
|
R.INTERNAL_ABORTED,
|
|
new Error("key loading aborted"),
|
|
n
|
|
)
|
|
);
|
|
},
|
|
};
|
|
a.load(l, h, d);
|
|
}))
|
|
);
|
|
}),
|
|
(e.resetLoader = function (t) {
|
|
var e = t.frag,
|
|
r = t.keyInfo,
|
|
i = t.url,
|
|
n = r.loader;
|
|
e.keyLoader === n && ((e.keyLoader = null), (r.loader = null)),
|
|
delete this.keyUriToKeyInfo[i],
|
|
n && n.destroy();
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
br = (function () {
|
|
function t() {
|
|
(this._boundTick = void 0),
|
|
(this._tickTimer = null),
|
|
(this._tickInterval = null),
|
|
(this._tickCallCount = 0),
|
|
(this._boundTick = this.tick.bind(this));
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this.onHandlerDestroying(), this.onHandlerDestroyed();
|
|
}),
|
|
(e.onHandlerDestroying = function () {
|
|
this.clearNextTick(), this.clearInterval();
|
|
}),
|
|
(e.onHandlerDestroyed = function () {}),
|
|
(e.hasInterval = function () {
|
|
return !!this._tickInterval;
|
|
}),
|
|
(e.hasNextTick = function () {
|
|
return !!this._tickTimer;
|
|
}),
|
|
(e.setInterval = function (t) {
|
|
return (
|
|
!this._tickInterval &&
|
|
((this._tickCallCount = 0),
|
|
(this._tickInterval = self.setInterval(this._boundTick, t)),
|
|
!0)
|
|
);
|
|
}),
|
|
(e.clearInterval = function () {
|
|
return (
|
|
!!this._tickInterval &&
|
|
(self.clearInterval(this._tickInterval),
|
|
(this._tickInterval = null),
|
|
!0)
|
|
);
|
|
}),
|
|
(e.clearNextTick = function () {
|
|
return (
|
|
!!this._tickTimer &&
|
|
(self.clearTimeout(this._tickTimer),
|
|
(this._tickTimer = null),
|
|
!0)
|
|
);
|
|
}),
|
|
(e.tick = function () {
|
|
this._tickCallCount++,
|
|
1 === this._tickCallCount &&
|
|
(this.doTick(),
|
|
this._tickCallCount > 1 && this.tickImmediate(),
|
|
(this._tickCallCount = 0));
|
|
}),
|
|
(e.tickImmediate = function () {
|
|
this.clearNextTick(),
|
|
(this._tickTimer = self.setTimeout(this._boundTick, 0));
|
|
}),
|
|
(e.doTick = function () {}),
|
|
t
|
|
);
|
|
})(),
|
|
Dr = {
|
|
length: 0,
|
|
start: function () {
|
|
return 0;
|
|
},
|
|
end: function () {
|
|
return 0;
|
|
},
|
|
},
|
|
Ir = (function () {
|
|
function t() {}
|
|
return (
|
|
(t.isBuffered = function (e, r) {
|
|
try {
|
|
if (e)
|
|
for (var i = t.getBuffered(e), n = 0; n < i.length; n++)
|
|
if (r >= i.start(n) && r <= i.end(n)) return !0;
|
|
} catch (t) {}
|
|
return !1;
|
|
}),
|
|
(t.bufferInfo = function (e, r, i) {
|
|
try {
|
|
if (e) {
|
|
var n,
|
|
a = t.getBuffered(e),
|
|
s = [];
|
|
for (n = 0; n < a.length; n++)
|
|
s.push({ start: a.start(n), end: a.end(n) });
|
|
return this.bufferedInfo(s, r, i);
|
|
}
|
|
} catch (t) {}
|
|
return { len: 0, start: r, end: r, nextStart: void 0 };
|
|
}),
|
|
(t.bufferedInfo = function (t, e, r) {
|
|
(e = Math.max(0, e)),
|
|
t.sort(function (t, e) {
|
|
var r = t.start - e.start;
|
|
return r || e.end - t.end;
|
|
});
|
|
var i = [];
|
|
if (r)
|
|
for (var n = 0; n < t.length; n++) {
|
|
var a = i.length;
|
|
if (a) {
|
|
var s = i[a - 1].end;
|
|
t[n].start - s < r
|
|
? t[n].end > s && (i[a - 1].end = t[n].end)
|
|
: i.push(t[n]);
|
|
} else i.push(t[n]);
|
|
}
|
|
else i = t;
|
|
for (var o, l = 0, u = e, h = e, d = 0; d < i.length; d++) {
|
|
var c = i[d].start,
|
|
f = i[d].end;
|
|
if (e + r >= c && e < f) (u = c), (l = (h = f) - e);
|
|
else if (e + r < c) {
|
|
o = c;
|
|
break;
|
|
}
|
|
}
|
|
return { len: l, start: u || 0, end: h || 0, nextStart: o };
|
|
}),
|
|
(t.getBuffered = function (t) {
|
|
try {
|
|
return t.buffered;
|
|
} catch (t) {
|
|
return w.log("failed to get media.buffered", t), Dr;
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
wr = function (t, e, r, i, n, a) {
|
|
void 0 === i && (i = 0),
|
|
void 0 === n && (n = -1),
|
|
void 0 === a && (a = !1),
|
|
(this.level = void 0),
|
|
(this.sn = void 0),
|
|
(this.part = void 0),
|
|
(this.id = void 0),
|
|
(this.size = void 0),
|
|
(this.partial = void 0),
|
|
(this.transmuxing = {
|
|
start: 0,
|
|
executeStart: 0,
|
|
executeEnd: 0,
|
|
end: 0,
|
|
}),
|
|
(this.buffering = {
|
|
audio: { start: 0, executeStart: 0, executeEnd: 0, end: 0 },
|
|
video: { start: 0, executeStart: 0, executeEnd: 0, end: 0 },
|
|
audiovideo: { start: 0, executeStart: 0, executeEnd: 0, end: 0 },
|
|
}),
|
|
(this.level = t),
|
|
(this.sn = e),
|
|
(this.id = r),
|
|
(this.size = i),
|
|
(this.part = n),
|
|
(this.partial = a);
|
|
};
|
|
function Cr(t, e) {
|
|
for (var r = null, i = 0, n = t.length; i < n; i++) {
|
|
var a = t[i];
|
|
if (a && a.cc === e) {
|
|
r = a;
|
|
break;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
function _r(t, e) {
|
|
if (t) {
|
|
var r = t.start + e;
|
|
(t.start = t.startPTS = r), (t.endPTS = r + t.duration);
|
|
}
|
|
}
|
|
function Pr(t, e) {
|
|
for (var r = e.fragments, i = 0, n = r.length; i < n; i++) _r(r[i], t);
|
|
e.fragmentHint && _r(e.fragmentHint, t), (e.alignedSliding = !0);
|
|
}
|
|
function xr(t, e, r) {
|
|
e &&
|
|
((function (t, e, r) {
|
|
if (
|
|
(function (t, e, r) {
|
|
return !(
|
|
!e.details ||
|
|
!(r.endCC > r.startCC || (t && t.cc < r.startCC))
|
|
);
|
|
})(t, r, e)
|
|
) {
|
|
var i = (function (t, e, r) {
|
|
var i = t.fragments,
|
|
n = e.fragments;
|
|
if (n.length && i.length) {
|
|
var a = Cr(i, n[0].cc);
|
|
if (a && (!a || a.startPTS)) return a;
|
|
w.log("No frag in previous level to align on");
|
|
} else w.log("No fragments to align");
|
|
})(r.details, e);
|
|
i &&
|
|
E(i.start) &&
|
|
(w.log(
|
|
"Adjusting PTS using last level due to CC increase within current level " +
|
|
e.url
|
|
),
|
|
Pr(i.start, e));
|
|
}
|
|
})(t, r, e),
|
|
!r.alignedSliding &&
|
|
e.details &&
|
|
(function (t, e) {
|
|
if (
|
|
e.fragments.length &&
|
|
t.hasProgramDateTime &&
|
|
e.hasProgramDateTime
|
|
) {
|
|
var r = e.fragments[0].programDateTime,
|
|
i = t.fragments[0].programDateTime,
|
|
n = (i - r) / 1e3 + e.fragments[0].start;
|
|
n &&
|
|
E(n) &&
|
|
(w.log(
|
|
"Adjusting PTS using programDateTime delta " +
|
|
(i - r) +
|
|
"ms, sliding:" +
|
|
n.toFixed(3) +
|
|
" " +
|
|
t.url +
|
|
" "
|
|
),
|
|
Pr(n, t));
|
|
}
|
|
})(r, e.details),
|
|
r.alignedSliding ||
|
|
!e.details ||
|
|
r.skippedSegments ||
|
|
Ke(e.details, r));
|
|
}
|
|
function Fr(t, e) {
|
|
if (t.hasProgramDateTime && e.hasProgramDateTime) {
|
|
var r = t.fragments,
|
|
i = e.fragments;
|
|
if (r.length && i.length) {
|
|
var n = i[Math.round(i.length / 2) - 1],
|
|
a = Cr(r, n.cc) || r[Math.round(r.length / 2) - 1],
|
|
s = n.programDateTime,
|
|
o = a.programDateTime;
|
|
null !== s &&
|
|
null !== o &&
|
|
Pr((o - s) / 1e3 - (a.start - n.start), t);
|
|
}
|
|
}
|
|
}
|
|
var Mr = (function () {
|
|
function t(t, e) {
|
|
(this.subtle = void 0),
|
|
(this.aesIV = void 0),
|
|
(this.subtle = t),
|
|
(this.aesIV = e);
|
|
}
|
|
return (
|
|
(t.prototype.decrypt = function (t, e) {
|
|
return this.subtle.decrypt(
|
|
{ name: "AES-CBC", iv: this.aesIV },
|
|
e,
|
|
t
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Or = (function () {
|
|
function t(t, e) {
|
|
(this.subtle = void 0),
|
|
(this.key = void 0),
|
|
(this.subtle = t),
|
|
(this.key = e);
|
|
}
|
|
return (
|
|
(t.prototype.expandKey = function () {
|
|
return this.subtle.importKey(
|
|
"raw",
|
|
this.key,
|
|
{ name: "AES-CBC" },
|
|
!1,
|
|
["encrypt", "decrypt"]
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Nr = (function () {
|
|
function t() {
|
|
(this.rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]),
|
|
(this.subMix = [
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
]),
|
|
(this.invSubMix = [
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
new Uint32Array(256),
|
|
]),
|
|
(this.sBox = new Uint32Array(256)),
|
|
(this.invSBox = new Uint32Array(256)),
|
|
(this.key = new Uint32Array(0)),
|
|
(this.ksRows = 0),
|
|
(this.keySize = 0),
|
|
(this.keySchedule = void 0),
|
|
(this.invKeySchedule = void 0),
|
|
this.initTable();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.uint8ArrayToUint32Array_ = function (t) {
|
|
for (
|
|
var e = new DataView(t), r = new Uint32Array(4), i = 0;
|
|
i < 4;
|
|
i++
|
|
)
|
|
r[i] = e.getUint32(4 * i);
|
|
return r;
|
|
}),
|
|
(e.initTable = function () {
|
|
var t = this.sBox,
|
|
e = this.invSBox,
|
|
r = this.subMix,
|
|
i = r[0],
|
|
n = r[1],
|
|
a = r[2],
|
|
s = r[3],
|
|
o = this.invSubMix,
|
|
l = o[0],
|
|
u = o[1],
|
|
h = o[2],
|
|
d = o[3],
|
|
c = new Uint32Array(256),
|
|
f = 0,
|
|
g = 0,
|
|
v = 0;
|
|
for (v = 0; v < 256; v++)
|
|
c[v] = v < 128 ? v << 1 : (v << 1) ^ 283;
|
|
for (v = 0; v < 256; v++) {
|
|
var m = g ^ (g << 1) ^ (g << 2) ^ (g << 3) ^ (g << 4);
|
|
(m = (m >>> 8) ^ (255 & m) ^ 99), (t[f] = m), (e[m] = f);
|
|
var p = c[f],
|
|
y = c[p],
|
|
T = c[y],
|
|
E = (257 * c[m]) ^ (16843008 * m);
|
|
(i[f] = (E << 24) | (E >>> 8)),
|
|
(n[f] = (E << 16) | (E >>> 16)),
|
|
(a[f] = (E << 8) | (E >>> 24)),
|
|
(s[f] = E),
|
|
(E =
|
|
(16843009 * T) ^ (65537 * y) ^ (257 * p) ^ (16843008 * f)),
|
|
(l[m] = (E << 24) | (E >>> 8)),
|
|
(u[m] = (E << 16) | (E >>> 16)),
|
|
(h[m] = (E << 8) | (E >>> 24)),
|
|
(d[m] = E),
|
|
f ? ((f = p ^ c[c[c[T ^ p]]]), (g ^= c[c[g]])) : (f = g = 1);
|
|
}
|
|
}),
|
|
(e.expandKey = function (t) {
|
|
for (
|
|
var e = this.uint8ArrayToUint32Array_(t), r = !0, i = 0;
|
|
i < e.length && r;
|
|
|
|
)
|
|
(r = e[i] === this.key[i]), i++;
|
|
if (!r) {
|
|
this.key = e;
|
|
var n = (this.keySize = e.length);
|
|
if (4 !== n && 6 !== n && 8 !== n)
|
|
throw new Error("Invalid aes key size=" + n);
|
|
var a,
|
|
s,
|
|
o,
|
|
l,
|
|
u = (this.ksRows = 4 * (n + 6 + 1)),
|
|
h = (this.keySchedule = new Uint32Array(u)),
|
|
d = (this.invKeySchedule = new Uint32Array(u)),
|
|
c = this.sBox,
|
|
f = this.rcon,
|
|
g = this.invSubMix,
|
|
v = g[0],
|
|
m = g[1],
|
|
p = g[2],
|
|
y = g[3];
|
|
for (a = 0; a < u; a++)
|
|
a < n
|
|
? (o = h[a] = e[a])
|
|
: ((l = o),
|
|
a % n == 0
|
|
? ((l =
|
|
(c[(l = (l << 8) | (l >>> 24)) >>> 24] << 24) |
|
|
(c[(l >>> 16) & 255] << 16) |
|
|
(c[(l >>> 8) & 255] << 8) |
|
|
c[255 & l]),
|
|
(l ^= f[(a / n) | 0] << 24))
|
|
: n > 6 &&
|
|
a % n == 4 &&
|
|
(l =
|
|
(c[l >>> 24] << 24) |
|
|
(c[(l >>> 16) & 255] << 16) |
|
|
(c[(l >>> 8) & 255] << 8) |
|
|
c[255 & l]),
|
|
(h[a] = o = (h[a - n] ^ l) >>> 0));
|
|
for (s = 0; s < u; s++)
|
|
(a = u - s),
|
|
(l = 3 & s ? h[a] : h[a - 4]),
|
|
(d[s] =
|
|
s < 4 || a <= 4
|
|
? l
|
|
: v[c[l >>> 24]] ^
|
|
m[c[(l >>> 16) & 255]] ^
|
|
p[c[(l >>> 8) & 255]] ^
|
|
y[c[255 & l]]),
|
|
(d[s] = d[s] >>> 0);
|
|
}
|
|
}),
|
|
(e.networkToHostOrderSwap = function (t) {
|
|
return (
|
|
(t << 24) |
|
|
((65280 & t) << 8) |
|
|
((16711680 & t) >> 8) |
|
|
(t >>> 24)
|
|
);
|
|
}),
|
|
(e.decrypt = function (t, e, r) {
|
|
for (
|
|
var i,
|
|
n,
|
|
a,
|
|
s,
|
|
o,
|
|
l,
|
|
u,
|
|
h,
|
|
d,
|
|
c,
|
|
f,
|
|
g,
|
|
v,
|
|
m,
|
|
p = this.keySize + 6,
|
|
y = this.invKeySchedule,
|
|
T = this.invSBox,
|
|
E = this.invSubMix,
|
|
S = E[0],
|
|
L = E[1],
|
|
R = E[2],
|
|
A = E[3],
|
|
k = this.uint8ArrayToUint32Array_(r),
|
|
b = k[0],
|
|
D = k[1],
|
|
I = k[2],
|
|
w = k[3],
|
|
C = new Int32Array(t),
|
|
_ = new Int32Array(C.length),
|
|
P = this.networkToHostOrderSwap;
|
|
e < C.length;
|
|
|
|
) {
|
|
for (
|
|
d = P(C[e]),
|
|
c = P(C[e + 1]),
|
|
f = P(C[e + 2]),
|
|
g = P(C[e + 3]),
|
|
o = d ^ y[0],
|
|
l = g ^ y[1],
|
|
u = f ^ y[2],
|
|
h = c ^ y[3],
|
|
v = 4,
|
|
m = 1;
|
|
m < p;
|
|
m++
|
|
)
|
|
(i =
|
|
S[o >>> 24] ^
|
|
L[(l >> 16) & 255] ^
|
|
R[(u >> 8) & 255] ^
|
|
A[255 & h] ^
|
|
y[v]),
|
|
(n =
|
|
S[l >>> 24] ^
|
|
L[(u >> 16) & 255] ^
|
|
R[(h >> 8) & 255] ^
|
|
A[255 & o] ^
|
|
y[v + 1]),
|
|
(a =
|
|
S[u >>> 24] ^
|
|
L[(h >> 16) & 255] ^
|
|
R[(o >> 8) & 255] ^
|
|
A[255 & l] ^
|
|
y[v + 2]),
|
|
(s =
|
|
S[h >>> 24] ^
|
|
L[(o >> 16) & 255] ^
|
|
R[(l >> 8) & 255] ^
|
|
A[255 & u] ^
|
|
y[v + 3]),
|
|
(o = i),
|
|
(l = n),
|
|
(u = a),
|
|
(h = s),
|
|
(v += 4);
|
|
(i =
|
|
(T[o >>> 24] << 24) ^
|
|
(T[(l >> 16) & 255] << 16) ^
|
|
(T[(u >> 8) & 255] << 8) ^
|
|
T[255 & h] ^
|
|
y[v]),
|
|
(n =
|
|
(T[l >>> 24] << 24) ^
|
|
(T[(u >> 16) & 255] << 16) ^
|
|
(T[(h >> 8) & 255] << 8) ^
|
|
T[255 & o] ^
|
|
y[v + 1]),
|
|
(a =
|
|
(T[u >>> 24] << 24) ^
|
|
(T[(h >> 16) & 255] << 16) ^
|
|
(T[(o >> 8) & 255] << 8) ^
|
|
T[255 & l] ^
|
|
y[v + 2]),
|
|
(s =
|
|
(T[h >>> 24] << 24) ^
|
|
(T[(o >> 16) & 255] << 16) ^
|
|
(T[(l >> 8) & 255] << 8) ^
|
|
T[255 & u] ^
|
|
y[v + 3]),
|
|
(_[e] = P(i ^ b)),
|
|
(_[e + 1] = P(s ^ D)),
|
|
(_[e + 2] = P(a ^ I)),
|
|
(_[e + 3] = P(n ^ w)),
|
|
(b = d),
|
|
(D = c),
|
|
(I = f),
|
|
(w = g),
|
|
(e += 4);
|
|
}
|
|
return _.buffer;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Ur = (function () {
|
|
function t(t, e) {
|
|
var r = (void 0 === e ? {} : e).removePKCS7Padding,
|
|
i = void 0 === r || r;
|
|
if (
|
|
((this.logEnabled = !0),
|
|
(this.removePKCS7Padding = void 0),
|
|
(this.subtle = null),
|
|
(this.softwareDecrypter = null),
|
|
(this.key = null),
|
|
(this.fastAesKey = null),
|
|
(this.remainderData = null),
|
|
(this.currentIV = null),
|
|
(this.currentResult = null),
|
|
(this.useSoftware = void 0),
|
|
(this.useSoftware = t.enableSoftwareAES),
|
|
(this.removePKCS7Padding = i),
|
|
i)
|
|
)
|
|
try {
|
|
var n = self.crypto;
|
|
n && (this.subtle = n.subtle || n.webkitSubtle);
|
|
} catch (t) {}
|
|
null === this.subtle && (this.useSoftware = !0);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
(this.subtle = null),
|
|
(this.softwareDecrypter = null),
|
|
(this.key = null),
|
|
(this.fastAesKey = null),
|
|
(this.remainderData = null),
|
|
(this.currentIV = null),
|
|
(this.currentResult = null);
|
|
}),
|
|
(e.isSync = function () {
|
|
return this.useSoftware;
|
|
}),
|
|
(e.flush = function () {
|
|
var t = this.currentResult,
|
|
e = this.remainderData;
|
|
if (!t || e) return this.reset(), null;
|
|
var r,
|
|
i,
|
|
n,
|
|
a = new Uint8Array(t);
|
|
return (
|
|
this.reset(),
|
|
this.removePKCS7Padding
|
|
? ((i = (r = a).byteLength),
|
|
(n = i && new DataView(r.buffer).getUint8(i - 1))
|
|
? rt(r, 0, i - n)
|
|
: r)
|
|
: a
|
|
);
|
|
}),
|
|
(e.reset = function () {
|
|
(this.currentResult = null),
|
|
(this.currentIV = null),
|
|
(this.remainderData = null),
|
|
this.softwareDecrypter && (this.softwareDecrypter = null);
|
|
}),
|
|
(e.decrypt = function (t, e, r) {
|
|
var i = this;
|
|
return this.useSoftware
|
|
? new Promise(function (n, a) {
|
|
i.softwareDecrypt(new Uint8Array(t), e, r);
|
|
var s = i.flush();
|
|
s
|
|
? n(s.buffer)
|
|
: a(
|
|
new Error("[softwareDecrypt] Failed to decrypt data")
|
|
);
|
|
})
|
|
: this.webCryptoDecrypt(new Uint8Array(t), e, r);
|
|
}),
|
|
(e.softwareDecrypt = function (t, e, r) {
|
|
var i = this.currentIV,
|
|
n = this.currentResult,
|
|
a = this.remainderData;
|
|
this.logOnce("JS AES decrypt"),
|
|
a && ((t = xt(a, t)), (this.remainderData = null));
|
|
var s = this.getValidChunk(t);
|
|
if (!s.length) return null;
|
|
i && (r = i);
|
|
var o = this.softwareDecrypter;
|
|
o || (o = this.softwareDecrypter = new Nr()), o.expandKey(e);
|
|
var l = n;
|
|
return (
|
|
(this.currentResult = o.decrypt(s.buffer, 0, r)),
|
|
(this.currentIV = rt(s, -16).buffer),
|
|
l || null
|
|
);
|
|
}),
|
|
(e.webCryptoDecrypt = function (t, e, r) {
|
|
var i = this,
|
|
n = this.subtle;
|
|
return (
|
|
(this.key === e && this.fastAesKey) ||
|
|
((this.key = e), (this.fastAesKey = new Or(n, e))),
|
|
this.fastAesKey
|
|
.expandKey()
|
|
.then(function (e) {
|
|
return n
|
|
? (i.logOnce("WebCrypto AES decrypt"),
|
|
new Mr(n, new Uint8Array(r)).decrypt(t.buffer, e))
|
|
: Promise.reject(new Error("web crypto not initialized"));
|
|
})
|
|
.catch(function (n) {
|
|
return (
|
|
w.warn(
|
|
"[decrypter]: WebCrypto Error, disable WebCrypto API, " +
|
|
n.name +
|
|
": " +
|
|
n.message
|
|
),
|
|
i.onWebCryptoError(t, e, r)
|
|
);
|
|
})
|
|
);
|
|
}),
|
|
(e.onWebCryptoError = function (t, e, r) {
|
|
(this.useSoftware = !0),
|
|
(this.logEnabled = !0),
|
|
this.softwareDecrypt(t, e, r);
|
|
var i = this.flush();
|
|
if (i) return i.buffer;
|
|
throw new Error(
|
|
"WebCrypto and softwareDecrypt: failed to decrypt data"
|
|
);
|
|
}),
|
|
(e.getValidChunk = function (t) {
|
|
var e = t,
|
|
r = t.length - (t.length % 16);
|
|
return (
|
|
r !== t.length &&
|
|
((e = rt(t, 0, r)), (this.remainderData = rt(t, r))),
|
|
e
|
|
);
|
|
}),
|
|
(e.logOnce = function (t) {
|
|
this.logEnabled &&
|
|
(w.log("[decrypter]: " + t), (this.logEnabled = !1));
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Br = function (t) {
|
|
for (var e = "", r = t.length, i = 0; i < r; i++)
|
|
e += "[" + t.start(i).toFixed(3) + "-" + t.end(i).toFixed(3) + "]";
|
|
return e;
|
|
},
|
|
Gr = "STOPPED",
|
|
Kr = "IDLE",
|
|
Hr = "KEY_LOADING",
|
|
Vr = "FRAG_LOADING",
|
|
Yr = "FRAG_LOADING_WAITING_RETRY",
|
|
Wr = "WAITING_TRACK",
|
|
jr = "PARSING",
|
|
qr = "PARSED",
|
|
Xr = "ENDED",
|
|
zr = "ERROR",
|
|
Qr = "WAITING_INIT_PTS",
|
|
$r = "WAITING_LEVEL",
|
|
Jr = (function (t) {
|
|
function e(e, r, i, n, a) {
|
|
var s;
|
|
return (
|
|
((s = t.call(this) || this).hls = void 0),
|
|
(s.fragPrevious = null),
|
|
(s.fragCurrent = null),
|
|
(s.fragmentTracker = void 0),
|
|
(s.transmuxer = null),
|
|
(s._state = Gr),
|
|
(s.playlistType = void 0),
|
|
(s.media = null),
|
|
(s.mediaBuffer = null),
|
|
(s.config = void 0),
|
|
(s.bitrateTest = !1),
|
|
(s.lastCurrentTime = 0),
|
|
(s.nextLoadPosition = 0),
|
|
(s.startPosition = 0),
|
|
(s.startTimeOffset = null),
|
|
(s.loadedmetadata = !1),
|
|
(s.retryDate = 0),
|
|
(s.levels = null),
|
|
(s.fragmentLoader = void 0),
|
|
(s.keyLoader = void 0),
|
|
(s.levelLastLoaded = null),
|
|
(s.startFragRequested = !1),
|
|
(s.decrypter = void 0),
|
|
(s.initPTS = []),
|
|
(s.onvseeking = null),
|
|
(s.onvended = null),
|
|
(s.logPrefix = ""),
|
|
(s.log = void 0),
|
|
(s.warn = void 0),
|
|
(s.playlistType = a),
|
|
(s.logPrefix = n),
|
|
(s.log = w.log.bind(w, n + ":")),
|
|
(s.warn = w.warn.bind(w, n + ":")),
|
|
(s.hls = e),
|
|
(s.fragmentLoader = new Sr(e.config)),
|
|
(s.keyLoader = i),
|
|
(s.fragmentTracker = r),
|
|
(s.config = e.config),
|
|
(s.decrypter = new Ur(e.config)),
|
|
e.on(
|
|
S.MANIFEST_LOADED,
|
|
s.onManifestLoaded,
|
|
(function (t) {
|
|
if (void 0 === t)
|
|
throw new ReferenceError(
|
|
"this hasn't been initialised - super() hasn't been called"
|
|
);
|
|
return t;
|
|
})(s)
|
|
),
|
|
s
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.doTick = function () {
|
|
this.onTickEnd();
|
|
}),
|
|
(r.onTickEnd = function () {}),
|
|
(r.startLoad = function (t) {}),
|
|
(r.stopLoad = function () {
|
|
this.fragmentLoader.abort(),
|
|
this.keyLoader.abort(this.playlistType);
|
|
var t = this.fragCurrent;
|
|
null != t &&
|
|
t.loader &&
|
|
(t.abortRequests(), this.fragmentTracker.removeFragment(t)),
|
|
this.resetTransmuxer(),
|
|
(this.fragCurrent = null),
|
|
(this.fragPrevious = null),
|
|
this.clearInterval(),
|
|
this.clearNextTick(),
|
|
(this.state = Gr);
|
|
}),
|
|
(r._streamEnded = function (t, e) {
|
|
if (e.live || t.nextStart || !t.end || !this.media) return !1;
|
|
var r = e.partList;
|
|
if (null != r && r.length) {
|
|
var i = r[r.length - 1];
|
|
return Ir.isBuffered(this.media, i.start + i.duration / 2);
|
|
}
|
|
var n = e.fragments[e.fragments.length - 1].type;
|
|
return this.fragmentTracker.isEndListAppended(n);
|
|
}),
|
|
(r.getLevelDetails = function () {
|
|
var t;
|
|
if (this.levels && null !== this.levelLastLoaded)
|
|
return null == (t = this.levels[this.levelLastLoaded])
|
|
? void 0
|
|
: t.details;
|
|
}),
|
|
(r.onMediaAttached = function (t, e) {
|
|
var r = (this.media = this.mediaBuffer = e.media);
|
|
(this.onvseeking = this.onMediaSeeking.bind(this)),
|
|
(this.onvended = this.onMediaEnded.bind(this)),
|
|
r.addEventListener("seeking", this.onvseeking),
|
|
r.addEventListener("ended", this.onvended);
|
|
var i = this.config;
|
|
this.levels &&
|
|
i.autoStartLoad &&
|
|
this.state === Gr &&
|
|
this.startLoad(i.startPosition);
|
|
}),
|
|
(r.onMediaDetaching = function () {
|
|
var t = this.media;
|
|
null != t &&
|
|
t.ended &&
|
|
(this.log("MSE detaching and video ended, reset startPosition"),
|
|
(this.startPosition = this.lastCurrentTime = 0)),
|
|
t &&
|
|
this.onvseeking &&
|
|
this.onvended &&
|
|
(t.removeEventListener("seeking", this.onvseeking),
|
|
t.removeEventListener("ended", this.onvended),
|
|
(this.onvseeking = this.onvended = null)),
|
|
this.keyLoader && this.keyLoader.detach(),
|
|
(this.media = this.mediaBuffer = null),
|
|
(this.loadedmetadata = !1),
|
|
this.fragmentTracker.removeAllFragments(),
|
|
this.stopLoad();
|
|
}),
|
|
(r.onMediaSeeking = function () {
|
|
var t = this.config,
|
|
e = this.fragCurrent,
|
|
r = this.media,
|
|
i = this.mediaBuffer,
|
|
n = this.state,
|
|
a = r ? r.currentTime : 0,
|
|
s = Ir.bufferInfo(i || r, a, t.maxBufferHole);
|
|
if (
|
|
(this.log(
|
|
"media seeking to " +
|
|
(E(a) ? a.toFixed(3) : a) +
|
|
", state: " +
|
|
n
|
|
),
|
|
this.state === Xr)
|
|
)
|
|
this.resetLoadingState();
|
|
else if (e) {
|
|
var o = t.maxFragLookUpTolerance,
|
|
l = e.start - o,
|
|
u = e.start + e.duration + o;
|
|
if (!s.len || u < s.start || l > s.end) {
|
|
var h = a > u;
|
|
(a < l || h) &&
|
|
(h &&
|
|
e.loader &&
|
|
(this.log(
|
|
"seeking outside of buffer while fragment load in progress, cancel fragment load"
|
|
),
|
|
e.abortRequests(),
|
|
this.resetLoadingState()),
|
|
(this.fragPrevious = null));
|
|
}
|
|
}
|
|
r &&
|
|
(this.fragmentTracker.removeFragmentsInRange(
|
|
a,
|
|
1 / 0,
|
|
this.playlistType,
|
|
!0
|
|
),
|
|
(this.lastCurrentTime = a)),
|
|
this.loadedmetadata ||
|
|
s.len ||
|
|
(this.nextLoadPosition = this.startPosition = a),
|
|
this.tickImmediate();
|
|
}),
|
|
(r.onMediaEnded = function () {
|
|
this.startPosition = this.lastCurrentTime = 0;
|
|
}),
|
|
(r.onManifestLoaded = function (t, e) {
|
|
(this.startTimeOffset = e.startTimeOffset), (this.initPTS = []);
|
|
}),
|
|
(r.onHandlerDestroying = function () {
|
|
this.stopLoad(), t.prototype.onHandlerDestroying.call(this);
|
|
}),
|
|
(r.onHandlerDestroyed = function () {
|
|
(this.state = Gr),
|
|
this.fragmentLoader && this.fragmentLoader.destroy(),
|
|
this.keyLoader && this.keyLoader.destroy(),
|
|
this.decrypter && this.decrypter.destroy(),
|
|
(this.hls =
|
|
this.log =
|
|
this.warn =
|
|
this.decrypter =
|
|
this.keyLoader =
|
|
this.fragmentLoader =
|
|
this.fragmentTracker =
|
|
null),
|
|
t.prototype.onHandlerDestroyed.call(this);
|
|
}),
|
|
(r.loadFragment = function (t, e, r) {
|
|
this._loadFragForPlayback(t, e, r);
|
|
}),
|
|
(r._loadFragForPlayback = function (t, e, r) {
|
|
var i = this;
|
|
this._doFragLoad(t, e, r, function (e) {
|
|
if (i.fragContextChanged(t))
|
|
return (
|
|
i.warn(
|
|
"Fragment " +
|
|
t.sn +
|
|
(e.part ? " p: " + e.part.index : "") +
|
|
" of level " +
|
|
t.level +
|
|
" was dropped during download."
|
|
),
|
|
void i.fragmentTracker.removeFragment(t)
|
|
);
|
|
t.stats.chunkCount++, i._handleFragmentLoadProgress(e);
|
|
})
|
|
.then(function (e) {
|
|
if (e) {
|
|
var r = i.state;
|
|
i.fragContextChanged(t)
|
|
? (r === Vr || (!i.fragCurrent && r === jr)) &&
|
|
(i.fragmentTracker.removeFragment(t), (i.state = Kr))
|
|
: ("payload" in e &&
|
|
(i.log(
|
|
"Loaded fragment " + t.sn + " of level " + t.level
|
|
),
|
|
i.hls.trigger(S.FRAG_LOADED, e)),
|
|
i._handleFragmentLoadComplete(e));
|
|
}
|
|
})
|
|
.catch(function (e) {
|
|
i.state !== Gr &&
|
|
i.state !== zr &&
|
|
(i.warn(e), i.resetFragmentLoading(t));
|
|
});
|
|
}),
|
|
(r.clearTrackerIfNeeded = function (t) {
|
|
var e,
|
|
r = this.fragmentTracker;
|
|
if (r.getState(t) === gr) {
|
|
var i = t.type,
|
|
n = this.getFwdBufferInfo(this.mediaBuffer, i),
|
|
a = Math.max(
|
|
t.duration,
|
|
n ? n.len : this.config.maxBufferLength
|
|
);
|
|
this.reduceMaxBufferLength(a) && r.removeFragment(t);
|
|
} else
|
|
0 ===
|
|
(null == (e = this.mediaBuffer) ? void 0 : e.buffered.length)
|
|
? r.removeAllFragments()
|
|
: r.hasParts(t.type) &&
|
|
(r.detectPartialFragments({
|
|
frag: t,
|
|
part: null,
|
|
stats: t.stats,
|
|
id: t.type,
|
|
}),
|
|
r.getState(t) === vr && r.removeFragment(t));
|
|
}),
|
|
(r.checkLiveUpdate = function (t) {
|
|
if (t.updated && !t.live) {
|
|
var e = t.fragments[t.fragments.length - 1];
|
|
this.fragmentTracker.detectPartialFragments({
|
|
frag: e,
|
|
part: null,
|
|
stats: e.stats,
|
|
id: e.type,
|
|
});
|
|
}
|
|
t.fragments[0] || (t.deltaUpdateFailed = !0);
|
|
}),
|
|
(r.flushMainBuffer = function (t, e, r) {
|
|
if ((void 0 === r && (r = null), t - e)) {
|
|
var i = { startOffset: t, endOffset: e, type: r };
|
|
this.hls.trigger(S.BUFFER_FLUSHING, i);
|
|
}
|
|
}),
|
|
(r._loadInitSegment = function (t, e) {
|
|
var r = this;
|
|
this._doFragLoad(t, e)
|
|
.then(function (e) {
|
|
if (!e || r.fragContextChanged(t) || !r.levels)
|
|
throw new Error("init load aborted");
|
|
return e;
|
|
})
|
|
.then(function (e) {
|
|
var i = r.hls,
|
|
n = e.payload,
|
|
a = t.decryptdata;
|
|
if (
|
|
n &&
|
|
n.byteLength > 0 &&
|
|
a &&
|
|
a.key &&
|
|
a.iv &&
|
|
"AES-128" === a.method
|
|
) {
|
|
var s = self.performance.now();
|
|
return r.decrypter
|
|
.decrypt(new Uint8Array(n), a.key.buffer, a.iv.buffer)
|
|
.catch(function (e) {
|
|
throw (
|
|
(i.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_DECRYPT_ERROR,
|
|
fatal: !1,
|
|
error: e,
|
|
reason: e.message,
|
|
frag: t,
|
|
}),
|
|
e)
|
|
);
|
|
})
|
|
.then(function (r) {
|
|
var n = self.performance.now();
|
|
return (
|
|
i.trigger(S.FRAG_DECRYPTED, {
|
|
frag: t,
|
|
payload: r,
|
|
stats: { tstart: s, tdecrypt: n },
|
|
}),
|
|
(e.payload = r),
|
|
e
|
|
);
|
|
});
|
|
}
|
|
return e;
|
|
})
|
|
.then(function (i) {
|
|
var n = r.fragCurrent,
|
|
a = r.hls;
|
|
if (!r.levels)
|
|
throw new Error("init load aborted, missing levels");
|
|
var s = t.stats;
|
|
(r.state = Kr),
|
|
(e.fragmentError = 0),
|
|
(t.data = new Uint8Array(i.payload)),
|
|
(s.parsing.start = s.buffering.start =
|
|
self.performance.now()),
|
|
(s.parsing.end = s.buffering.end = self.performance.now()),
|
|
i.frag === n &&
|
|
a.trigger(S.FRAG_BUFFERED, {
|
|
stats: s,
|
|
frag: n,
|
|
part: null,
|
|
id: t.type,
|
|
}),
|
|
r.tick();
|
|
})
|
|
.catch(function (e) {
|
|
r.state !== Gr &&
|
|
r.state !== zr &&
|
|
(r.warn(e), r.resetFragmentLoading(t));
|
|
});
|
|
}),
|
|
(r.fragContextChanged = function (t) {
|
|
var e = this.fragCurrent;
|
|
return (
|
|
!t ||
|
|
!e ||
|
|
t.level !== e.level ||
|
|
t.sn !== e.sn ||
|
|
t.urlId !== e.urlId
|
|
);
|
|
}),
|
|
(r.fragBufferedComplete = function (t, e) {
|
|
var r,
|
|
i,
|
|
n,
|
|
a,
|
|
s = this.mediaBuffer ? this.mediaBuffer : this.media;
|
|
this.log(
|
|
"Buffered " +
|
|
t.type +
|
|
" sn: " +
|
|
t.sn +
|
|
(e ? " part: " + e.index : "") +
|
|
" of " +
|
|
(this.playlistType === ge ? "level" : "track") +
|
|
" " +
|
|
t.level +
|
|
" (frag:[" +
|
|
(null != (r = t.startPTS) ? r : NaN).toFixed(3) +
|
|
"-" +
|
|
(null != (i = t.endPTS) ? i : NaN).toFixed(3) +
|
|
"] > buffer:" +
|
|
(s ? Br(Ir.getBuffered(s)) : "(detached)") +
|
|
")"
|
|
),
|
|
(this.state = Kr),
|
|
s &&
|
|
(!this.loadedmetadata &&
|
|
t.type == ge &&
|
|
s.buffered.length &&
|
|
(null == (n = this.fragCurrent) ? void 0 : n.sn) ===
|
|
(null == (a = this.fragPrevious) ? void 0 : a.sn) &&
|
|
((this.loadedmetadata = !0), this.seekToStartPos()),
|
|
this.tick());
|
|
}),
|
|
(r.seekToStartPos = function () {}),
|
|
(r._handleFragmentLoadComplete = function (t) {
|
|
var e = this.transmuxer;
|
|
if (e) {
|
|
var r = t.frag,
|
|
i = t.part,
|
|
n = t.partsLoaded,
|
|
a =
|
|
!n ||
|
|
0 === n.length ||
|
|
n.some(function (t) {
|
|
return !t;
|
|
}),
|
|
s = new wr(
|
|
r.level,
|
|
r.sn,
|
|
r.stats.chunkCount + 1,
|
|
0,
|
|
i ? i.index : -1,
|
|
!a
|
|
);
|
|
e.flush(s);
|
|
}
|
|
}),
|
|
(r._handleFragmentLoadProgress = function (t) {}),
|
|
(r._doFragLoad = function (t, e, r, i) {
|
|
var n,
|
|
a = this;
|
|
void 0 === r && (r = null);
|
|
var s = null == e ? void 0 : e.details;
|
|
if (!this.levels || !s)
|
|
throw new Error(
|
|
"frag load aborted, missing level" +
|
|
(s ? "" : " detail") +
|
|
"s"
|
|
);
|
|
var o = null;
|
|
if (
|
|
(!t.encrypted || (null != (n = t.decryptdata) && n.key)
|
|
? !t.encrypted &&
|
|
s.encryptedFragments.length &&
|
|
this.keyLoader.loadClear(t, s.encryptedFragments)
|
|
: (this.log(
|
|
"Loading key for " +
|
|
t.sn +
|
|
" of [" +
|
|
s.startSN +
|
|
"-" +
|
|
s.endSN +
|
|
"], " +
|
|
("[stream-controller]" === this.logPrefix
|
|
? "level"
|
|
: "track") +
|
|
" " +
|
|
t.level
|
|
),
|
|
(this.state = Hr),
|
|
(this.fragCurrent = t),
|
|
(o = this.keyLoader.load(t).then(function (t) {
|
|
if (!a.fragContextChanged(t.frag))
|
|
return (
|
|
a.hls.trigger(S.KEY_LOADED, t),
|
|
a.state === Hr && (a.state = Kr),
|
|
t
|
|
);
|
|
})),
|
|
this.hls.trigger(S.KEY_LOADING, { frag: t }),
|
|
null === this.fragCurrent &&
|
|
(o = Promise.reject(
|
|
new Error(
|
|
"frag load aborted, context changed in KEY_LOADING"
|
|
)
|
|
))),
|
|
(r = Math.max(t.start, r || 0)),
|
|
this.config.lowLatencyMode && "initSegment" !== t.sn)
|
|
) {
|
|
var l = s.partList;
|
|
if (l && i) {
|
|
r > t.end && s.fragmentHint && (t = s.fragmentHint);
|
|
var u = this.getNextPart(l, t, r);
|
|
if (u > -1) {
|
|
var h,
|
|
d = l[u];
|
|
return (
|
|
this.log(
|
|
"Loading part sn: " +
|
|
t.sn +
|
|
" p: " +
|
|
d.index +
|
|
" cc: " +
|
|
t.cc +
|
|
" of playlist [" +
|
|
s.startSN +
|
|
"-" +
|
|
s.endSN +
|
|
"] parts [0-" +
|
|
u +
|
|
"-" +
|
|
(l.length - 1) +
|
|
"] " +
|
|
("[stream-controller]" === this.logPrefix
|
|
? "level"
|
|
: "track") +
|
|
": " +
|
|
t.level +
|
|
", target: " +
|
|
parseFloat(r.toFixed(3))
|
|
),
|
|
(this.nextLoadPosition = d.start + d.duration),
|
|
(this.state = Vr),
|
|
(h = o
|
|
? o
|
|
.then(function (r) {
|
|
return !r || a.fragContextChanged(r.frag)
|
|
? null
|
|
: a.doFragPartsLoad(t, d, e, i);
|
|
})
|
|
.catch(function (t) {
|
|
return a.handleFragLoadError(t);
|
|
})
|
|
: this.doFragPartsLoad(t, d, e, i).catch(function (t) {
|
|
return a.handleFragLoadError(t);
|
|
})),
|
|
this.hls.trigger(S.FRAG_LOADING, {
|
|
frag: t,
|
|
part: d,
|
|
targetBufferTime: r,
|
|
}),
|
|
null === this.fragCurrent
|
|
? Promise.reject(
|
|
new Error(
|
|
"frag load aborted, context changed in FRAG_LOADING parts"
|
|
)
|
|
)
|
|
: h
|
|
);
|
|
}
|
|
if (!t.url || this.loadedEndOfParts(l, r))
|
|
return Promise.resolve(null);
|
|
}
|
|
}
|
|
this.log(
|
|
"Loading fragment " +
|
|
t.sn +
|
|
" cc: " +
|
|
t.cc +
|
|
" " +
|
|
(s ? "of [" + s.startSN + "-" + s.endSN + "] " : "") +
|
|
("[stream-controller]" === this.logPrefix
|
|
? "level"
|
|
: "track") +
|
|
": " +
|
|
t.level +
|
|
", target: " +
|
|
parseFloat(r.toFixed(3))
|
|
),
|
|
E(t.sn) &&
|
|
!this.bitrateTest &&
|
|
(this.nextLoadPosition = t.start + t.duration),
|
|
(this.state = Vr);
|
|
var c,
|
|
f = this.config.progressive;
|
|
return (
|
|
(c =
|
|
f && o
|
|
? o
|
|
.then(function (e) {
|
|
return !e ||
|
|
a.fragContextChanged(null == e ? void 0 : e.frag)
|
|
? null
|
|
: a.fragmentLoader.load(t, i);
|
|
})
|
|
.catch(function (t) {
|
|
return a.handleFragLoadError(t);
|
|
})
|
|
: Promise.all([
|
|
this.fragmentLoader.load(t, f ? i : void 0),
|
|
o,
|
|
])
|
|
.then(function (t) {
|
|
var e = t[0];
|
|
return !f && e && i && i(e), e;
|
|
})
|
|
.catch(function (t) {
|
|
return a.handleFragLoadError(t);
|
|
})),
|
|
this.hls.trigger(S.FRAG_LOADING, {
|
|
frag: t,
|
|
targetBufferTime: r,
|
|
}),
|
|
null === this.fragCurrent
|
|
? Promise.reject(
|
|
new Error(
|
|
"frag load aborted, context changed in FRAG_LOADING"
|
|
)
|
|
)
|
|
: c
|
|
);
|
|
}),
|
|
(r.doFragPartsLoad = function (t, e, r, i) {
|
|
var n = this;
|
|
return new Promise(function (a, s) {
|
|
var o,
|
|
l = [],
|
|
u = null == (o = r.details) ? void 0 : o.partList;
|
|
!(function e(o) {
|
|
n.fragmentLoader
|
|
.loadPart(t, o, i)
|
|
.then(function (i) {
|
|
l[o.index] = i;
|
|
var s = i.part;
|
|
n.hls.trigger(S.FRAG_LOADED, i);
|
|
var h =
|
|
Ve(r, t.sn, o.index + 1) || Ye(u, t.sn, o.index + 1);
|
|
if (!h) return a({ frag: t, part: s, partsLoaded: l });
|
|
e(h);
|
|
})
|
|
.catch(s);
|
|
})(e);
|
|
});
|
|
}),
|
|
(r.handleFragLoadError = function (t) {
|
|
if ("data" in t) {
|
|
var e = t.data;
|
|
t.data && e.details === R.INTERNAL_ABORTED
|
|
? this.handleFragLoadAborted(e.frag, e.part)
|
|
: this.hls.trigger(S.ERROR, e);
|
|
} else
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.OTHER_ERROR,
|
|
details: R.INTERNAL_EXCEPTION,
|
|
err: t,
|
|
error: t,
|
|
fatal: !0,
|
|
});
|
|
return null;
|
|
}),
|
|
(r._handleTransmuxerFlush = function (t) {
|
|
var e = this.getCurrentContext(t);
|
|
if (e && this.state === jr) {
|
|
var r = e.frag,
|
|
i = e.part,
|
|
n = e.level,
|
|
a = self.performance.now();
|
|
(r.stats.parsing.end = a),
|
|
i && (i.stats.parsing.end = a),
|
|
this.updateLevelTiming(r, i, n, t.partial);
|
|
} else
|
|
this.fragCurrent ||
|
|
this.state === Gr ||
|
|
this.state === zr ||
|
|
(this.state = Kr);
|
|
}),
|
|
(r.getCurrentContext = function (t) {
|
|
var e = this.levels,
|
|
r = this.fragCurrent,
|
|
i = t.level,
|
|
n = t.sn,
|
|
a = t.part;
|
|
if (null == e || !e[i])
|
|
return (
|
|
this.warn(
|
|
"Levels object was unset while buffering fragment " +
|
|
n +
|
|
" of level " +
|
|
i +
|
|
". The current chunk will not be buffered."
|
|
),
|
|
null
|
|
);
|
|
var s = e[i],
|
|
o = a > -1 ? Ve(s, n, a) : null,
|
|
l = o
|
|
? o.fragment
|
|
: (function (t, e, r) {
|
|
if (null == t || !t.details) return null;
|
|
var i = t.details,
|
|
n = i.fragments[e - i.startSN];
|
|
return (
|
|
n ||
|
|
((n = i.fragmentHint) && n.sn === e
|
|
? n
|
|
: e < i.startSN && r && r.sn === e
|
|
? r
|
|
: null)
|
|
);
|
|
})(s, n, r);
|
|
return l
|
|
? (r && r !== l && (l.stats = r.stats),
|
|
{ frag: l, part: o, level: s })
|
|
: null;
|
|
}),
|
|
(r.bufferFragmentData = function (t, e, r, i, n) {
|
|
var a;
|
|
if (t && this.state === jr) {
|
|
var s = t.data1,
|
|
o = t.data2,
|
|
l = s;
|
|
if ((s && o && (l = xt(s, o)), null != (a = l) && a.length)) {
|
|
var u = {
|
|
type: t.type,
|
|
frag: e,
|
|
part: r,
|
|
chunkMeta: i,
|
|
parent: e.type,
|
|
data: l,
|
|
};
|
|
if (
|
|
(this.hls.trigger(S.BUFFER_APPENDING, u),
|
|
t.dropped && t.independent && !r)
|
|
) {
|
|
if (n) return;
|
|
this.flushBufferGap(e);
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(r.flushBufferGap = function (t) {
|
|
var e = this.media;
|
|
if (e)
|
|
if (Ir.isBuffered(e, e.currentTime)) {
|
|
var r = e.currentTime,
|
|
i = Ir.bufferInfo(e, r, 0),
|
|
n = t.duration,
|
|
a = Math.min(
|
|
2 * this.config.maxFragLookUpTolerance,
|
|
0.25 * n
|
|
),
|
|
s = Math.max(Math.min(t.start - a, i.end - a), r + a);
|
|
t.start - s > a && this.flushMainBuffer(s, t.start);
|
|
} else this.flushMainBuffer(0, t.start);
|
|
}),
|
|
(r.getFwdBufferInfo = function (t, e) {
|
|
var r = this.getLoadPosition();
|
|
return E(r) ? this.getFwdBufferInfoAtPos(t, r, e) : null;
|
|
}),
|
|
(r.getFwdBufferInfoAtPos = function (t, e, r) {
|
|
var i = this.config.maxBufferHole,
|
|
n = Ir.bufferInfo(t, e, i);
|
|
if (0 === n.len && void 0 !== n.nextStart) {
|
|
var a = this.fragmentTracker.getBufferedFrag(e, r);
|
|
if (a && n.nextStart < a.end)
|
|
return Ir.bufferInfo(t, e, Math.max(n.nextStart, i));
|
|
}
|
|
return n;
|
|
}),
|
|
(r.getMaxBufferLength = function (t) {
|
|
var e,
|
|
r = this.config;
|
|
return (
|
|
(e = t
|
|
? Math.max((8 * r.maxBufferSize) / t, r.maxBufferLength)
|
|
: r.maxBufferLength),
|
|
Math.min(e, r.maxMaxBufferLength)
|
|
);
|
|
}),
|
|
(r.reduceMaxBufferLength = function (t) {
|
|
var e = this.config,
|
|
r = t || e.maxBufferLength;
|
|
return (
|
|
e.maxMaxBufferLength >= r &&
|
|
((e.maxMaxBufferLength /= 2),
|
|
this.warn(
|
|
"Reduce max buffer length to " + e.maxMaxBufferLength + "s"
|
|
),
|
|
!0)
|
|
);
|
|
}),
|
|
(r.getAppendedFrag = function (t, e) {
|
|
var r = this.fragmentTracker.getAppendedFrag(t, ge);
|
|
return r && "fragment" in r ? r.fragment : r;
|
|
}),
|
|
(r.getNextFragment = function (t, e) {
|
|
var r = e.fragments,
|
|
i = r.length;
|
|
if (!i) return null;
|
|
var n,
|
|
a = this.config,
|
|
s = r[0].start;
|
|
if (e.live) {
|
|
var o = a.initialLiveManifestSize;
|
|
if (i < o)
|
|
return (
|
|
this.warn(
|
|
"Not enough fragments to start playback (have: " +
|
|
i +
|
|
", need: " +
|
|
o +
|
|
")"
|
|
),
|
|
null
|
|
);
|
|
e.PTSKnown ||
|
|
this.startFragRequested ||
|
|
-1 !== this.startPosition ||
|
|
((n = this.getInitialLiveFragment(e, r)),
|
|
(this.startPosition = n
|
|
? this.hls.liveSyncPosition || n.start
|
|
: t));
|
|
} else t <= s && (n = r[0]);
|
|
if (!n) {
|
|
var l = a.lowLatencyMode ? e.partEnd : e.fragmentEnd;
|
|
n = this.getFragmentAtPosition(t, l, e);
|
|
}
|
|
return this.mapToInitFragWhenRequired(n);
|
|
}),
|
|
(r.isLoopLoading = function (t, e) {
|
|
var r = this.fragmentTracker.getState(t);
|
|
return (
|
|
(r === mr || (r === vr && !!t.gap)) && this.nextLoadPosition > e
|
|
);
|
|
}),
|
|
(r.getNextFragmentLoopLoading = function (t, e, r, i, n) {
|
|
var a = t.gap,
|
|
s = this.getNextFragment(this.nextLoadPosition, e);
|
|
if (null === s) return s;
|
|
if (((t = s), a && t && !t.gap && r.nextStart)) {
|
|
var o = this.getFwdBufferInfoAtPos(
|
|
this.mediaBuffer ? this.mediaBuffer : this.media,
|
|
r.nextStart,
|
|
i
|
|
);
|
|
if (null !== o && r.len + o.len >= n)
|
|
return (
|
|
this.log(
|
|
'buffer full after gaps in "' +
|
|
i +
|
|
'" playlist starting at sn: ' +
|
|
t.sn
|
|
),
|
|
null
|
|
);
|
|
}
|
|
return t;
|
|
}),
|
|
(r.mapToInitFragWhenRequired = function (t) {
|
|
return null == t ||
|
|
!t.initSegment ||
|
|
(null != t && t.initSegment.data) ||
|
|
this.bitrateTest
|
|
? t
|
|
: t.initSegment;
|
|
}),
|
|
(r.getNextPart = function (t, e, r) {
|
|
for (
|
|
var i = -1, n = !1, a = !0, s = 0, o = t.length;
|
|
s < o;
|
|
s++
|
|
) {
|
|
var l = t[s];
|
|
if (((a = a && !l.independent), i > -1 && r < l.start)) break;
|
|
var u = l.loaded;
|
|
u
|
|
? (i = -1)
|
|
: (n || l.independent || a) && l.fragment === e && (i = s),
|
|
(n = u);
|
|
}
|
|
return i;
|
|
}),
|
|
(r.loadedEndOfParts = function (t, e) {
|
|
var r = t[t.length - 1];
|
|
return r && e > r.start && r.loaded;
|
|
}),
|
|
(r.getInitialLiveFragment = function (t, e) {
|
|
var r = this.fragPrevious,
|
|
i = null;
|
|
if (r) {
|
|
if (
|
|
(t.hasProgramDateTime &&
|
|
(this.log(
|
|
"Live playlist, switching playlist, load frag with same PDT: " +
|
|
r.programDateTime
|
|
),
|
|
(i = (function (t, e, r) {
|
|
if (null === e || !Array.isArray(t) || !t.length || !E(e))
|
|
return null;
|
|
if (e < (t[0].programDateTime || 0)) return null;
|
|
if (e >= (t[t.length - 1].endProgramDateTime || 0))
|
|
return null;
|
|
r = r || 0;
|
|
for (var i = 0; i < t.length; ++i) {
|
|
var n = t[i];
|
|
if (Ze(e, r, n)) return n;
|
|
}
|
|
return null;
|
|
})(
|
|
e,
|
|
r.endProgramDateTime,
|
|
this.config.maxFragLookUpTolerance
|
|
))),
|
|
!i)
|
|
) {
|
|
var n = r.sn + 1;
|
|
if (n >= t.startSN && n <= t.endSN) {
|
|
var a = e[n - t.startSN];
|
|
r.cc === a.cc &&
|
|
((i = a),
|
|
this.log(
|
|
"Live playlist, switching playlist, load frag with next SN: " +
|
|
i.sn
|
|
));
|
|
}
|
|
i ||
|
|
((i = (function (t, e) {
|
|
return Qe(t, function (t) {
|
|
return t.cc < e ? 1 : t.cc > e ? -1 : 0;
|
|
});
|
|
})(e, r.cc)),
|
|
i &&
|
|
this.log(
|
|
"Live playlist, switching playlist, load frag with same CC: " +
|
|
i.sn
|
|
));
|
|
}
|
|
} else {
|
|
var s = this.hls.liveSyncPosition;
|
|
null !== s &&
|
|
(i = this.getFragmentAtPosition(
|
|
s,
|
|
this.bitrateTest ? t.fragmentEnd : t.edge,
|
|
t
|
|
));
|
|
}
|
|
return i;
|
|
}),
|
|
(r.getFragmentAtPosition = function (t, e, r) {
|
|
var i,
|
|
n = this.config,
|
|
a = this.fragPrevious,
|
|
s = r.fragments,
|
|
o = r.endSN,
|
|
l = r.fragmentHint,
|
|
u = n.maxFragLookUpTolerance,
|
|
h = r.partList,
|
|
d = !!(n.lowLatencyMode && null != h && h.length && l);
|
|
if (
|
|
(d && l && !this.bitrateTest && ((s = s.concat(l)), (o = l.sn)),
|
|
(i = t < e ? $e(a, s, t, t > e - u ? 0 : u) : s[s.length - 1]))
|
|
) {
|
|
var c = i.sn - r.startSN,
|
|
f = this.fragmentTracker.getState(i);
|
|
if (
|
|
((f === mr || (f === vr && i.gap)) && (a = i),
|
|
a &&
|
|
i.sn === a.sn &&
|
|
(!d || h[0].fragment.sn > i.sn) &&
|
|
a &&
|
|
i.level === a.level)
|
|
) {
|
|
var g = s[c + 1];
|
|
i =
|
|
i.sn < o && this.fragmentTracker.getState(g) !== mr
|
|
? g
|
|
: null;
|
|
}
|
|
}
|
|
return i;
|
|
}),
|
|
(r.synchronizeToLiveEdge = function (t) {
|
|
var e = this.config,
|
|
r = this.media;
|
|
if (r) {
|
|
var i = this.hls.liveSyncPosition,
|
|
n = r.currentTime,
|
|
a = t.fragments[0].start,
|
|
s = t.edge,
|
|
o = n >= a - e.maxFragLookUpTolerance && n <= s;
|
|
if (null !== i && r.duration > i && (n < i || !o)) {
|
|
var l =
|
|
void 0 !== e.liveMaxLatencyDuration
|
|
? e.liveMaxLatencyDuration
|
|
: e.liveMaxLatencyDurationCount * t.targetduration;
|
|
((!o && r.readyState < 4) || n < s - l) &&
|
|
(this.loadedmetadata || (this.nextLoadPosition = i),
|
|
r.readyState &&
|
|
(this.warn(
|
|
"Playback: " +
|
|
n.toFixed(3) +
|
|
" is located too far from the end of live sliding playlist: " +
|
|
s +
|
|
", reset currentTime to : " +
|
|
i.toFixed(3)
|
|
),
|
|
(r.currentTime = i)));
|
|
}
|
|
}
|
|
}),
|
|
(r.alignPlaylists = function (t, e) {
|
|
var r = this.levels,
|
|
i = this.levelLastLoaded,
|
|
n = this.fragPrevious,
|
|
a = null !== i ? r[i] : null,
|
|
s = t.fragments.length;
|
|
if (!s) return this.warn("No fragments in live playlist"), 0;
|
|
var o = t.fragments[0].start,
|
|
l = !e,
|
|
u = t.alignedSliding && E(o);
|
|
if (l || (!u && !o)) {
|
|
xr(n, a, t);
|
|
var h = t.fragments[0].start;
|
|
return (
|
|
this.log(
|
|
"Live playlist sliding: " +
|
|
h.toFixed(2) +
|
|
" start-sn: " +
|
|
(e ? e.startSN : "na") +
|
|
"->" +
|
|
t.startSN +
|
|
" prev-sn: " +
|
|
(n ? n.sn : "na") +
|
|
" fragments: " +
|
|
s
|
|
),
|
|
h
|
|
);
|
|
}
|
|
return o;
|
|
}),
|
|
(r.waitForCdnTuneIn = function (t) {
|
|
return (
|
|
t.live &&
|
|
t.canBlockReload &&
|
|
t.partTarget &&
|
|
t.tuneInGoal > Math.max(t.partHoldBack, 3 * t.partTarget)
|
|
);
|
|
}),
|
|
(r.setStartPosition = function (t, e) {
|
|
var r = this.startPosition;
|
|
if (
|
|
(r < e && (r = -1), -1 === r || -1 === this.lastCurrentTime)
|
|
) {
|
|
var i = null !== this.startTimeOffset,
|
|
n = i ? this.startTimeOffset : t.startTimeOffset;
|
|
null !== n && E(n)
|
|
? ((r = e + n),
|
|
n < 0 && (r += t.totalduration),
|
|
(r = Math.min(Math.max(e, r), e + t.totalduration)),
|
|
this.log(
|
|
"Start time offset " +
|
|
n +
|
|
" found in " +
|
|
(i ? "multivariant" : "media") +
|
|
" playlist, adjust startPosition to " +
|
|
r
|
|
),
|
|
(this.startPosition = r))
|
|
: t.live
|
|
? (r = this.hls.liveSyncPosition || e)
|
|
: (this.startPosition = r = 0),
|
|
(this.lastCurrentTime = r);
|
|
}
|
|
this.nextLoadPosition = r;
|
|
}),
|
|
(r.getLoadPosition = function () {
|
|
var t = this.media,
|
|
e = 0;
|
|
return (
|
|
this.loadedmetadata && t
|
|
? (e = t.currentTime)
|
|
: this.nextLoadPosition && (e = this.nextLoadPosition),
|
|
e
|
|
);
|
|
}),
|
|
(r.handleFragLoadAborted = function (t, e) {
|
|
this.transmuxer &&
|
|
"initSegment" !== t.sn &&
|
|
t.stats.aborted &&
|
|
(this.warn(
|
|
"Fragment " +
|
|
t.sn +
|
|
(e ? " part " + e.index : "") +
|
|
" of level " +
|
|
t.level +
|
|
" was aborted"
|
|
),
|
|
this.resetFragmentLoading(t));
|
|
}),
|
|
(r.resetFragmentLoading = function (t) {
|
|
(this.fragCurrent &&
|
|
(this.fragContextChanged(t) || this.state === Yr)) ||
|
|
(this.state = Kr);
|
|
}),
|
|
(r.onFragmentOrKeyLoadError = function (t, e) {
|
|
if (e.chunkMeta && !e.frag) {
|
|
var r = this.getCurrentContext(e.chunkMeta);
|
|
r && (e.frag = r.frag);
|
|
}
|
|
var i = e.frag;
|
|
if (i && i.type === t && this.levels)
|
|
if (this.fragContextChanged(i)) {
|
|
var n;
|
|
this.warn(
|
|
"Frag load error must match current frag to retry " +
|
|
i.url +
|
|
" > " +
|
|
(null == (n = this.fragCurrent) ? void 0 : n.url)
|
|
);
|
|
} else {
|
|
var a = e.details === R.FRAG_GAP;
|
|
a && this.fragmentTracker.fragBuffered(i, !0);
|
|
var s = e.errorAction,
|
|
o = s || {},
|
|
l = o.action,
|
|
u = o.retryCount,
|
|
h = void 0 === u ? 0 : u,
|
|
d = o.retryConfig;
|
|
if (s && l === nr && d) {
|
|
var c;
|
|
this.resetStartWhenNotLoaded(
|
|
null != (c = this.levelLastLoaded) ? c : i.level
|
|
);
|
|
var f = qe(d, h);
|
|
this.warn(
|
|
"Fragment " +
|
|
i.sn +
|
|
" of " +
|
|
t +
|
|
" " +
|
|
i.level +
|
|
" errored with " +
|
|
e.details +
|
|
", retrying loading " +
|
|
(h + 1) +
|
|
"/" +
|
|
d.maxNumRetry +
|
|
" in " +
|
|
f +
|
|
"ms"
|
|
),
|
|
(s.resolved = !0),
|
|
(this.retryDate = self.performance.now() + f),
|
|
(this.state = Yr);
|
|
} else
|
|
d && s
|
|
? (this.resetFragmentErrors(t),
|
|
h < d.maxNumRetry
|
|
? a || (s.resolved = !0)
|
|
: w.warn(
|
|
e.details +
|
|
" reached or exceeded max retry (" +
|
|
h +
|
|
")"
|
|
))
|
|
: (null == s ? void 0 : s.action) === ir
|
|
? (this.state = $r)
|
|
: (this.state = zr);
|
|
this.tickImmediate();
|
|
}
|
|
}),
|
|
(r.reduceLengthAndFlushBuffer = function (t) {
|
|
if (this.state === jr || this.state === qr) {
|
|
var e = t.parent,
|
|
r = this.getFwdBufferInfo(this.mediaBuffer, e),
|
|
i = r && r.len > 0.5;
|
|
i && this.reduceMaxBufferLength(r.len);
|
|
var n = !i;
|
|
return (
|
|
n &&
|
|
this.warn(
|
|
"Buffer full error while media.currentTime is not buffered, flush " +
|
|
e +
|
|
" buffer"
|
|
),
|
|
t.frag &&
|
|
(this.fragmentTracker.removeFragment(t.frag),
|
|
(this.nextLoadPosition = t.frag.start)),
|
|
this.resetLoadingState(),
|
|
n
|
|
);
|
|
}
|
|
return !1;
|
|
}),
|
|
(r.resetFragmentErrors = function (t) {
|
|
t === ve && (this.fragCurrent = null),
|
|
this.loadedmetadata || (this.startFragRequested = !1),
|
|
this.state !== Gr && (this.state = Kr);
|
|
}),
|
|
(r.afterBufferFlushed = function (t, e, r) {
|
|
if (t) {
|
|
var i = Ir.getBuffered(t);
|
|
this.fragmentTracker.detectEvictedFragments(e, i, r),
|
|
this.state === Xr && this.resetLoadingState();
|
|
}
|
|
}),
|
|
(r.resetLoadingState = function () {
|
|
this.log("Reset loading state"),
|
|
(this.fragCurrent = null),
|
|
(this.fragPrevious = null),
|
|
(this.state = Kr);
|
|
}),
|
|
(r.resetStartWhenNotLoaded = function (t) {
|
|
if (!this.loadedmetadata) {
|
|
this.startFragRequested = !1;
|
|
var e = this.levels ? this.levels[t].details : null;
|
|
null != e && e.live
|
|
? ((this.startPosition = -1),
|
|
this.setStartPosition(e, 0),
|
|
this.resetLoadingState())
|
|
: (this.nextLoadPosition = this.startPosition);
|
|
}
|
|
}),
|
|
(r.resetWhenMissingContext = function (t) {
|
|
var e;
|
|
this.warn(
|
|
"The loading context changed while buffering fragment " +
|
|
t.sn +
|
|
" of level " +
|
|
t.level +
|
|
". This chunk will not be buffered."
|
|
),
|
|
this.removeUnbufferedFrags(),
|
|
this.resetStartWhenNotLoaded(
|
|
null != (e = this.levelLastLoaded) ? e : t.level
|
|
),
|
|
this.resetLoadingState();
|
|
}),
|
|
(r.removeUnbufferedFrags = function (t) {
|
|
void 0 === t && (t = 0),
|
|
this.fragmentTracker.removeFragmentsInRange(
|
|
t,
|
|
1 / 0,
|
|
this.playlistType,
|
|
!1,
|
|
!0
|
|
);
|
|
}),
|
|
(r.updateLevelTiming = function (t, e, r, i) {
|
|
var n,
|
|
a = this,
|
|
s = r.details;
|
|
if (s) {
|
|
if (
|
|
Object.keys(t.elementaryStreams).reduce(function (e, n) {
|
|
var o = t.elementaryStreams[n];
|
|
if (o) {
|
|
var l = o.endPTS - o.startPTS;
|
|
if (l <= 0)
|
|
return (
|
|
a.warn(
|
|
"Could not parse fragment " +
|
|
t.sn +
|
|
" " +
|
|
n +
|
|
" duration reliably (" +
|
|
l +
|
|
")"
|
|
),
|
|
e || !1
|
|
);
|
|
var u = i
|
|
? 0
|
|
: Be(s, t, o.startPTS, o.endPTS, o.startDTS, o.endDTS);
|
|
return (
|
|
a.hls.trigger(S.LEVEL_PTS_UPDATED, {
|
|
details: s,
|
|
level: r,
|
|
drift: u,
|
|
type: n,
|
|
frag: t,
|
|
start: o.startPTS,
|
|
end: o.endPTS,
|
|
}),
|
|
!0
|
|
);
|
|
}
|
|
return e;
|
|
}, !1)
|
|
)
|
|
r.fragmentError = 0;
|
|
else if (
|
|
null === (null == (n = this.transmuxer) ? void 0 : n.error)
|
|
) {
|
|
var o = new Error(
|
|
"Found no media in fragment " +
|
|
t.sn +
|
|
" of level " +
|
|
t.level +
|
|
" resetting transmuxer to fallback to playlist timing"
|
|
);
|
|
if (
|
|
(0 === r.fragmentError &&
|
|
(r.fragmentError++,
|
|
(t.gap = !0),
|
|
this.fragmentTracker.removeFragment(t),
|
|
this.fragmentTracker.fragBuffered(t, !0)),
|
|
this.warn(o.message),
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
fatal: !1,
|
|
error: o,
|
|
frag: t,
|
|
reason:
|
|
"Found no media in msn " +
|
|
t.sn +
|
|
' of level "' +
|
|
r.url +
|
|
'"',
|
|
}),
|
|
!this.hls)
|
|
)
|
|
return;
|
|
this.resetTransmuxer();
|
|
}
|
|
(this.state = qr),
|
|
this.hls.trigger(S.FRAG_PARSED, { frag: t, part: e });
|
|
} else this.warn("level.details undefined");
|
|
}),
|
|
(r.resetTransmuxer = function () {
|
|
this.transmuxer &&
|
|
(this.transmuxer.destroy(), (this.transmuxer = null));
|
|
}),
|
|
(r.recoverWorkerError = function (t) {
|
|
var e, r, i;
|
|
"demuxerWorker" === t.event &&
|
|
(this.fragmentTracker.removeAllFragments(),
|
|
this.resetTransmuxer(),
|
|
this.resetStartWhenNotLoaded(
|
|
null !=
|
|
(e =
|
|
null != (r = this.levelLastLoaded)
|
|
? r
|
|
: null == (i = this.fragCurrent)
|
|
? void 0
|
|
: i.level)
|
|
? e
|
|
: 0
|
|
),
|
|
this.resetLoadingState());
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "state",
|
|
get: function () {
|
|
return this._state;
|
|
},
|
|
set: function (t) {
|
|
var e = this._state;
|
|
e !== t && ((this._state = t), this.log(e + "->" + t));
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(br);
|
|
function Zr() {
|
|
return self.SourceBuffer || self.WebKitSourceBuffer;
|
|
}
|
|
function ti(t, e) {
|
|
return (
|
|
void 0 === t && (t = ""),
|
|
void 0 === e && (e = 9e4),
|
|
{
|
|
type: t,
|
|
id: -1,
|
|
pid: -1,
|
|
inputTimeScale: e,
|
|
sequenceNumber: -1,
|
|
samples: [],
|
|
dropped: 0,
|
|
}
|
|
);
|
|
}
|
|
var ei = (function () {
|
|
function t() {
|
|
(this._audioTrack = void 0),
|
|
(this._id3Track = void 0),
|
|
(this.frameIndex = 0),
|
|
(this.cachedData = null),
|
|
(this.basePTS = null),
|
|
(this.initPTS = null),
|
|
(this.lastPTS = null);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.resetInitSegment = function (t, e, r, i) {
|
|
this._id3Track = {
|
|
type: "id3",
|
|
id: 3,
|
|
pid: -1,
|
|
inputTimeScale: 9e4,
|
|
sequenceNumber: 0,
|
|
samples: [],
|
|
dropped: 0,
|
|
};
|
|
}),
|
|
(e.resetTimeStamp = function (t) {
|
|
(this.initPTS = t), this.resetContiguity();
|
|
}),
|
|
(e.resetContiguity = function () {
|
|
(this.basePTS = null),
|
|
(this.lastPTS = null),
|
|
(this.frameIndex = 0);
|
|
}),
|
|
(e.canParse = function (t, e) {
|
|
return !1;
|
|
}),
|
|
(e.appendFrame = function (t, e, r) {}),
|
|
(e.demux = function (t, e) {
|
|
this.cachedData &&
|
|
((t = xt(this.cachedData, t)), (this.cachedData = null));
|
|
var r,
|
|
i = st(t, 0),
|
|
n = i ? i.length : 0,
|
|
a = this._audioTrack,
|
|
s = this._id3Track,
|
|
o = i
|
|
? (function (t) {
|
|
for (var e = dt(t), r = 0; r < e.length; r++) {
|
|
var i = e[r];
|
|
if (ut(i)) return mt(i);
|
|
}
|
|
})(i)
|
|
: void 0,
|
|
l = t.length;
|
|
for (
|
|
(null === this.basePTS || (0 === this.frameIndex && E(o))) &&
|
|
((this.basePTS = ri(o, e, this.initPTS)),
|
|
(this.lastPTS = this.basePTS)),
|
|
null === this.lastPTS && (this.lastPTS = this.basePTS),
|
|
i &&
|
|
i.length > 0 &&
|
|
s.samples.push({
|
|
pts: this.lastPTS,
|
|
dts: this.lastPTS,
|
|
data: i,
|
|
type: Ae,
|
|
duration: Number.POSITIVE_INFINITY,
|
|
});
|
|
n < l;
|
|
|
|
) {
|
|
if (this.canParse(t, n)) {
|
|
var u = this.appendFrame(a, t, n);
|
|
u
|
|
? (this.frameIndex++,
|
|
(this.lastPTS = u.sample.pts),
|
|
(r = n += u.length))
|
|
: (n = l);
|
|
} else
|
|
lt(t, n)
|
|
? ((i = st(t, n)),
|
|
s.samples.push({
|
|
pts: this.lastPTS,
|
|
dts: this.lastPTS,
|
|
data: i,
|
|
type: Ae,
|
|
duration: Number.POSITIVE_INFINITY,
|
|
}),
|
|
(r = n += i.length))
|
|
: n++;
|
|
if (n === l && r !== l) {
|
|
var h = rt(t, r);
|
|
this.cachedData
|
|
? (this.cachedData = xt(this.cachedData, h))
|
|
: (this.cachedData = h);
|
|
}
|
|
}
|
|
return {
|
|
audioTrack: a,
|
|
videoTrack: ti(),
|
|
id3Track: s,
|
|
textTrack: ti(),
|
|
};
|
|
}),
|
|
(e.demuxSampleAes = function (t, e, r) {
|
|
return Promise.reject(
|
|
new Error(
|
|
"[" +
|
|
this +
|
|
"] This demuxer does not support Sample-AES decryption"
|
|
)
|
|
);
|
|
}),
|
|
(e.flush = function (t) {
|
|
var e = this.cachedData;
|
|
return (
|
|
e && ((this.cachedData = null), this.demux(e, 0)),
|
|
{
|
|
audioTrack: this._audioTrack,
|
|
videoTrack: ti(),
|
|
id3Track: this._id3Track,
|
|
textTrack: ti(),
|
|
}
|
|
);
|
|
}),
|
|
(e.destroy = function () {}),
|
|
t
|
|
);
|
|
})(),
|
|
ri = function (t, e, r) {
|
|
return E(t)
|
|
? 90 * t
|
|
: 9e4 * e + (r ? (9e4 * r.baseTime) / r.timescale : 0);
|
|
};
|
|
function ii(t, e) {
|
|
return 255 === t[e] && 240 == (246 & t[e + 1]);
|
|
}
|
|
function ni(t, e) {
|
|
return 1 & t[e + 1] ? 7 : 9;
|
|
}
|
|
function ai(t, e) {
|
|
return (
|
|
((3 & t[e + 3]) << 11) | (t[e + 4] << 3) | ((224 & t[e + 5]) >>> 5)
|
|
);
|
|
}
|
|
function si(t, e) {
|
|
return e + 1 < t.length && ii(t, e);
|
|
}
|
|
function oi(t, e) {
|
|
if (si(t, e)) {
|
|
var r = ni(t, e);
|
|
if (e + r >= t.length) return !1;
|
|
var i = ai(t, e);
|
|
if (i <= r) return !1;
|
|
var n = e + i;
|
|
return n === t.length || si(t, n);
|
|
}
|
|
return !1;
|
|
}
|
|
function li(t, e, r, i, n) {
|
|
if (!t.samplerate) {
|
|
var a = (function (t, e, r, i) {
|
|
var n,
|
|
a,
|
|
s,
|
|
o,
|
|
l = navigator.userAgent.toLowerCase(),
|
|
u = i,
|
|
h = [
|
|
96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3,
|
|
11025, 8e3, 7350,
|
|
];
|
|
n = 1 + ((192 & e[r + 2]) >>> 6);
|
|
var d = (60 & e[r + 2]) >>> 2;
|
|
if (!(d > h.length - 1))
|
|
return (
|
|
(s = (1 & e[r + 2]) << 2),
|
|
(s |= (192 & e[r + 3]) >>> 6),
|
|
w.log(
|
|
"manifest codec:" +
|
|
i +
|
|
", ADTS type:" +
|
|
n +
|
|
", samplingIndex:" +
|
|
d
|
|
),
|
|
/firefox/i.test(l)
|
|
? d >= 6
|
|
? ((n = 5), (o = new Array(4)), (a = d - 3))
|
|
: ((n = 2), (o = new Array(2)), (a = d))
|
|
: -1 !== l.indexOf("android")
|
|
? ((n = 2), (o = new Array(2)), (a = d))
|
|
: ((n = 5),
|
|
(o = new Array(4)),
|
|
(i &&
|
|
(-1 !== i.indexOf("mp4a.40.29") ||
|
|
-1 !== i.indexOf("mp4a.40.5"))) ||
|
|
(!i && d >= 6)
|
|
? (a = d - 3)
|
|
: (((i &&
|
|
-1 !== i.indexOf("mp4a.40.2") &&
|
|
((d >= 6 && 1 === s) || /vivaldi/i.test(l))) ||
|
|
(!i && 1 === s)) &&
|
|
((n = 2), (o = new Array(2))),
|
|
(a = d))),
|
|
(o[0] = n << 3),
|
|
(o[0] |= (14 & d) >> 1),
|
|
(o[1] |= (1 & d) << 7),
|
|
(o[1] |= s << 3),
|
|
5 === n &&
|
|
((o[1] |= (14 & a) >> 1),
|
|
(o[2] = (1 & a) << 7),
|
|
(o[2] |= 8),
|
|
(o[3] = 0)),
|
|
{
|
|
config: o,
|
|
samplerate: h[d],
|
|
channelCount: s,
|
|
codec: "mp4a.40." + n,
|
|
manifestCodec: u,
|
|
}
|
|
);
|
|
t.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
fatal: !0,
|
|
reason: "invalid ADTS sampling index:" + d,
|
|
});
|
|
})(e, r, i, n);
|
|
if (!a) return;
|
|
(t.config = a.config),
|
|
(t.samplerate = a.samplerate),
|
|
(t.channelCount = a.channelCount),
|
|
(t.codec = a.codec),
|
|
(t.manifestCodec = a.manifestCodec),
|
|
w.log(
|
|
"parsed codec:" +
|
|
t.codec +
|
|
", rate:" +
|
|
a.samplerate +
|
|
", channels:" +
|
|
a.channelCount
|
|
);
|
|
}
|
|
}
|
|
function ui(t) {
|
|
return 9216e4 / t;
|
|
}
|
|
function hi(t, e, r, i, n) {
|
|
var a,
|
|
s = i + n * ui(t.samplerate),
|
|
o = (function (t, e) {
|
|
var r = ni(t, e);
|
|
if (e + r <= t.length) {
|
|
var i = ai(t, e) - r;
|
|
if (i > 0) return { headerLength: r, frameLength: i };
|
|
}
|
|
})(e, r);
|
|
if (o) {
|
|
var l = o.frameLength,
|
|
u = o.headerLength,
|
|
h = u + l,
|
|
d = Math.max(0, r + h - e.length);
|
|
d
|
|
? (a = new Uint8Array(h - u)).set(e.subarray(r + u, e.length), 0)
|
|
: (a = e.subarray(r + u, r + h));
|
|
var c = { unit: a, pts: s };
|
|
return d || t.samples.push(c), { sample: c, length: h, missing: d };
|
|
}
|
|
var f = e.length - r;
|
|
return (
|
|
(a = new Uint8Array(f)).set(e.subarray(r, e.length), 0),
|
|
{ sample: { unit: a, pts: s }, length: f, missing: -1 }
|
|
);
|
|
}
|
|
var di = (function (t) {
|
|
function e(e, r) {
|
|
var i;
|
|
return (
|
|
((i = t.call(this) || this).observer = void 0),
|
|
(i.config = void 0),
|
|
(i.observer = e),
|
|
(i.config = r),
|
|
i
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.resetInitSegment = function (e, r, i, n) {
|
|
t.prototype.resetInitSegment.call(this, e, r, i, n),
|
|
(this._audioTrack = {
|
|
container: "audio/adts",
|
|
type: "audio",
|
|
id: 2,
|
|
pid: -1,
|
|
sequenceNumber: 0,
|
|
segmentCodec: "aac",
|
|
samples: [],
|
|
manifestCodec: r,
|
|
duration: n,
|
|
inputTimeScale: 9e4,
|
|
dropped: 0,
|
|
});
|
|
}),
|
|
(e.probe = function (t) {
|
|
if (!t) return !1;
|
|
for (var e = (st(t, 0) || []).length, r = t.length; e < r; e++)
|
|
if (oi(t, e)) return w.log("ADTS sync word found !"), !0;
|
|
return !1;
|
|
}),
|
|
(r.canParse = function (t, e) {
|
|
return (function (t, e) {
|
|
return (
|
|
(function (t, e) {
|
|
return e + 5 < t.length;
|
|
})(t, e) &&
|
|
ii(t, e) &&
|
|
ai(t, e) <= t.length - e
|
|
);
|
|
})(t, e);
|
|
}),
|
|
(r.appendFrame = function (t, e, r) {
|
|
li(t, this.observer, e, r, t.manifestCodec);
|
|
var i = hi(t, e, r, this.basePTS, this.frameIndex);
|
|
if (i && 0 === i.missing) return i;
|
|
}),
|
|
e
|
|
);
|
|
})(ei),
|
|
ci = /\/emsg[-/]ID3/i,
|
|
fi = (function () {
|
|
function t(t, e) {
|
|
(this.remainderData = null),
|
|
(this.timeOffset = 0),
|
|
(this.config = void 0),
|
|
(this.videoTrack = void 0),
|
|
(this.audioTrack = void 0),
|
|
(this.id3Track = void 0),
|
|
(this.txtTrack = void 0),
|
|
(this.config = e);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.resetTimeStamp = function () {}),
|
|
(e.resetInitSegment = function (t, e, r, i) {
|
|
var n = (this.videoTrack = ti("video", 1)),
|
|
a = (this.audioTrack = ti("audio", 1)),
|
|
s = (this.txtTrack = ti("text", 1));
|
|
if (
|
|
((this.id3Track = ti("id3", 1)),
|
|
(this.timeOffset = 0),
|
|
null != t && t.byteLength)
|
|
) {
|
|
var o = Ct(t);
|
|
if (o.video) {
|
|
var l = o.video,
|
|
u = l.id,
|
|
h = l.timescale,
|
|
d = l.codec;
|
|
(n.id = u), (n.timescale = s.timescale = h), (n.codec = d);
|
|
}
|
|
if (o.audio) {
|
|
var c = o.audio,
|
|
f = c.id,
|
|
g = c.timescale,
|
|
v = c.codec;
|
|
(a.id = f), (a.timescale = g), (a.codec = v);
|
|
}
|
|
(s.id = Lt.text),
|
|
(n.sampleDuration = 0),
|
|
(n.duration = a.duration = i);
|
|
}
|
|
}),
|
|
(e.resetContiguity = function () {
|
|
this.remainderData = null;
|
|
}),
|
|
(t.probe = function (t) {
|
|
return (
|
|
It((t = t.length > 16384 ? t.subarray(0, 16384) : t), ["moof"])
|
|
.length > 0
|
|
);
|
|
}),
|
|
(e.demux = function (t, e) {
|
|
this.timeOffset = e;
|
|
var r = t,
|
|
i = this.videoTrack,
|
|
n = this.txtTrack;
|
|
if (this.config.progressive) {
|
|
this.remainderData && (r = xt(this.remainderData, t));
|
|
var a = (function (t) {
|
|
var e = { valid: null, remainder: null },
|
|
r = It(t, ["moof"]);
|
|
if (!r) return e;
|
|
if (r.length < 2) return (e.remainder = t), e;
|
|
var i = r[r.length - 1];
|
|
return (
|
|
(e.valid = rt(t, 0, i.byteOffset - 8)),
|
|
(e.remainder = rt(t, i.byteOffset - 8)),
|
|
e
|
|
);
|
|
})(r);
|
|
(this.remainderData = a.remainder),
|
|
(i.samples = a.valid || new Uint8Array());
|
|
} else i.samples = r;
|
|
var s = this.extractID3Track(i, e);
|
|
return (
|
|
(n.samples = Ft(e, i)),
|
|
{
|
|
videoTrack: i,
|
|
audioTrack: this.audioTrack,
|
|
id3Track: s,
|
|
textTrack: this.txtTrack,
|
|
}
|
|
);
|
|
}),
|
|
(e.flush = function () {
|
|
var t = this.timeOffset,
|
|
e = this.videoTrack,
|
|
r = this.txtTrack;
|
|
(e.samples = this.remainderData || new Uint8Array()),
|
|
(this.remainderData = null);
|
|
var i = this.extractID3Track(e, this.timeOffset);
|
|
return (
|
|
(r.samples = Ft(t, e)),
|
|
{
|
|
videoTrack: e,
|
|
audioTrack: ti(),
|
|
id3Track: i,
|
|
textTrack: ti(),
|
|
}
|
|
);
|
|
}),
|
|
(e.extractID3Track = function (t, e) {
|
|
var r = this.id3Track;
|
|
if (t.samples.length) {
|
|
var i = It(t.samples, ["emsg"]);
|
|
i &&
|
|
i.forEach(function (t) {
|
|
var i = (function (t) {
|
|
var e = t[0],
|
|
r = "",
|
|
i = "",
|
|
n = 0,
|
|
a = 0,
|
|
s = 0,
|
|
o = 0,
|
|
l = 0,
|
|
u = 0;
|
|
if (0 === e) {
|
|
for (; "\0" !== Rt(t.subarray(u, u + 1)); )
|
|
(r += Rt(t.subarray(u, u + 1))), (u += 1);
|
|
for (
|
|
r += Rt(t.subarray(u, u + 1)), u += 1;
|
|
"\0" !== Rt(t.subarray(u, u + 1));
|
|
|
|
)
|
|
(i += Rt(t.subarray(u, u + 1))), (u += 1);
|
|
(i += Rt(t.subarray(u, u + 1))),
|
|
(u += 1),
|
|
(n = kt(t, 12)),
|
|
(a = kt(t, 16)),
|
|
(o = kt(t, 20)),
|
|
(l = kt(t, 24)),
|
|
(u = 28);
|
|
} else if (1 === e) {
|
|
n = kt(t, (u += 4));
|
|
var h = kt(t, (u += 4)),
|
|
d = kt(t, (u += 4));
|
|
for (
|
|
u += 4,
|
|
s = Math.pow(2, 32) * h + d,
|
|
Number.isSafeInteger(s) ||
|
|
((s = Number.MAX_SAFE_INTEGER),
|
|
w.warn(
|
|
"Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box"
|
|
)),
|
|
o = kt(t, u),
|
|
l = kt(t, (u += 4)),
|
|
u += 4;
|
|
"\0" !== Rt(t.subarray(u, u + 1));
|
|
|
|
)
|
|
(r += Rt(t.subarray(u, u + 1))), (u += 1);
|
|
for (
|
|
r += Rt(t.subarray(u, u + 1)), u += 1;
|
|
"\0" !== Rt(t.subarray(u, u + 1));
|
|
|
|
)
|
|
(i += Rt(t.subarray(u, u + 1))), (u += 1);
|
|
(i += Rt(t.subarray(u, u + 1))), (u += 1);
|
|
}
|
|
return {
|
|
schemeIdUri: r,
|
|
value: i,
|
|
timeScale: n,
|
|
presentationTime: s,
|
|
presentationTimeDelta: a,
|
|
eventDuration: o,
|
|
id: l,
|
|
payload: t.subarray(u, t.byteLength),
|
|
};
|
|
})(t);
|
|
if (ci.test(i.schemeIdUri)) {
|
|
var n = E(i.presentationTime)
|
|
? i.presentationTime / i.timeScale
|
|
: e + i.presentationTimeDelta / i.timeScale,
|
|
a =
|
|
4294967295 === i.eventDuration
|
|
? Number.POSITIVE_INFINITY
|
|
: i.eventDuration / i.timeScale;
|
|
a <= 0.001 && (a = Number.POSITIVE_INFINITY);
|
|
var s = i.payload;
|
|
r.samples.push({
|
|
data: s,
|
|
len: s.byteLength,
|
|
dts: n,
|
|
pts: n,
|
|
type: be,
|
|
duration: a,
|
|
});
|
|
}
|
|
});
|
|
}
|
|
return r;
|
|
}),
|
|
(e.demuxSampleAes = function (t, e, r) {
|
|
return Promise.reject(
|
|
new Error(
|
|
"The MP4 demuxer does not support SAMPLE-AES decryption"
|
|
)
|
|
);
|
|
}),
|
|
(e.destroy = function () {}),
|
|
t
|
|
);
|
|
})(),
|
|
gi = null,
|
|
vi = [
|
|
32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32,
|
|
48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40,
|
|
48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64,
|
|
80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48,
|
|
56, 64, 80, 96, 112, 128, 144, 160,
|
|
],
|
|
mi = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3],
|
|
pi = [
|
|
[0, 72, 144, 12],
|
|
[0, 0, 0, 0],
|
|
[0, 72, 144, 12],
|
|
[0, 144, 144, 12],
|
|
],
|
|
yi = [0, 1, 1, 4];
|
|
function Ti(t, e, r, i, n) {
|
|
if (!(r + 24 > e.length)) {
|
|
var a = Ei(e, r);
|
|
if (a && r + a.frameLength <= e.length) {
|
|
var s = i + n * ((9e4 * a.samplesPerFrame) / a.sampleRate),
|
|
o = { unit: e.subarray(r, r + a.frameLength), pts: s, dts: s };
|
|
return (
|
|
(t.config = []),
|
|
(t.channelCount = a.channelCount),
|
|
(t.samplerate = a.sampleRate),
|
|
t.samples.push(o),
|
|
{ sample: o, length: a.frameLength, missing: 0 }
|
|
);
|
|
}
|
|
}
|
|
}
|
|
function Ei(t, e) {
|
|
var r = (t[e + 1] >> 3) & 3,
|
|
i = (t[e + 1] >> 1) & 3,
|
|
n = (t[e + 2] >> 4) & 15,
|
|
a = (t[e + 2] >> 2) & 3;
|
|
if (1 !== r && 0 !== n && 15 !== n && 3 !== a) {
|
|
var s = (t[e + 2] >> 1) & 1,
|
|
o = t[e + 3] >> 6,
|
|
l = 1e3 * vi[14 * (3 === r ? 3 - i : 3 === i ? 3 : 4) + n - 1],
|
|
u = mi[3 * (3 === r ? 0 : 2 === r ? 1 : 2) + a],
|
|
h = 3 === o ? 1 : 2,
|
|
d = pi[r][i],
|
|
c = yi[i],
|
|
f = 8 * d * c,
|
|
g = Math.floor((d * l) / u + s) * c;
|
|
if (null === gi) {
|
|
var v = (navigator.userAgent || "").match(/Chrome\/(\d+)/i);
|
|
gi = v ? parseInt(v[1]) : 0;
|
|
}
|
|
return (
|
|
!!gi &&
|
|
gi <= 87 &&
|
|
2 === i &&
|
|
l >= 224e3 &&
|
|
0 === o &&
|
|
(t[e + 3] = 128 | t[e + 3]),
|
|
{
|
|
sampleRate: u,
|
|
channelCount: h,
|
|
frameLength: g,
|
|
samplesPerFrame: f,
|
|
}
|
|
);
|
|
}
|
|
}
|
|
function Si(t, e) {
|
|
return 255 === t[e] && 224 == (224 & t[e + 1]) && 0 != (6 & t[e + 1]);
|
|
}
|
|
function Li(t, e) {
|
|
return e + 1 < t.length && Si(t, e);
|
|
}
|
|
function Ri(t, e) {
|
|
if (e + 1 < t.length && Si(t, e)) {
|
|
var r = Ei(t, e),
|
|
i = 4;
|
|
null != r && r.frameLength && (i = r.frameLength);
|
|
var n = e + i;
|
|
return n === t.length || Li(t, n);
|
|
}
|
|
return !1;
|
|
}
|
|
var Ai = (function () {
|
|
function t(t) {
|
|
(this.data = void 0),
|
|
(this.bytesAvailable = void 0),
|
|
(this.word = void 0),
|
|
(this.bitsAvailable = void 0),
|
|
(this.data = t),
|
|
(this.bytesAvailable = t.byteLength),
|
|
(this.word = 0),
|
|
(this.bitsAvailable = 0);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.loadWord = function () {
|
|
var t = this.data,
|
|
e = this.bytesAvailable,
|
|
r = t.byteLength - e,
|
|
i = new Uint8Array(4),
|
|
n = Math.min(4, e);
|
|
if (0 === n) throw new Error("no bytes available");
|
|
i.set(t.subarray(r, r + n)),
|
|
(this.word = new DataView(i.buffer).getUint32(0)),
|
|
(this.bitsAvailable = 8 * n),
|
|
(this.bytesAvailable -= n);
|
|
}),
|
|
(e.skipBits = function (t) {
|
|
var e;
|
|
(t = Math.min(t, 8 * this.bytesAvailable + this.bitsAvailable)),
|
|
this.bitsAvailable > t
|
|
? ((this.word <<= t), (this.bitsAvailable -= t))
|
|
: ((t -= this.bitsAvailable),
|
|
(t -= (e = t >> 3) << 3),
|
|
(this.bytesAvailable -= e),
|
|
this.loadWord(),
|
|
(this.word <<= t),
|
|
(this.bitsAvailable -= t));
|
|
}),
|
|
(e.readBits = function (t) {
|
|
var e = Math.min(this.bitsAvailable, t),
|
|
r = this.word >>> (32 - e);
|
|
if (
|
|
(t > 32 && w.error("Cannot read more than 32 bits at a time"),
|
|
(this.bitsAvailable -= e),
|
|
this.bitsAvailable > 0)
|
|
)
|
|
this.word <<= e;
|
|
else {
|
|
if (!(this.bytesAvailable > 0))
|
|
throw new Error("no bits available");
|
|
this.loadWord();
|
|
}
|
|
return (e = t - e) > 0 && this.bitsAvailable
|
|
? (r << e) | this.readBits(e)
|
|
: r;
|
|
}),
|
|
(e.skipLZ = function () {
|
|
var t;
|
|
for (t = 0; t < this.bitsAvailable; ++t)
|
|
if (0 != (this.word & (2147483648 >>> t)))
|
|
return (this.word <<= t), (this.bitsAvailable -= t), t;
|
|
return this.loadWord(), t + this.skipLZ();
|
|
}),
|
|
(e.skipUEG = function () {
|
|
this.skipBits(1 + this.skipLZ());
|
|
}),
|
|
(e.skipEG = function () {
|
|
this.skipBits(1 + this.skipLZ());
|
|
}),
|
|
(e.readUEG = function () {
|
|
var t = this.skipLZ();
|
|
return this.readBits(t + 1) - 1;
|
|
}),
|
|
(e.readEG = function () {
|
|
var t = this.readUEG();
|
|
return 1 & t ? (1 + t) >>> 1 : -1 * (t >>> 1);
|
|
}),
|
|
(e.readBoolean = function () {
|
|
return 1 === this.readBits(1);
|
|
}),
|
|
(e.readUByte = function () {
|
|
return this.readBits(8);
|
|
}),
|
|
(e.readUShort = function () {
|
|
return this.readBits(16);
|
|
}),
|
|
(e.readUInt = function () {
|
|
return this.readBits(32);
|
|
}),
|
|
(e.skipScalingList = function (t) {
|
|
for (var e = 8, r = 8, i = 0; i < t; i++)
|
|
0 !== r && (r = (e + this.readEG() + 256) % 256),
|
|
(e = 0 === r ? e : r);
|
|
}),
|
|
(e.readSPS = function () {
|
|
var t,
|
|
e,
|
|
r,
|
|
i = 0,
|
|
n = 0,
|
|
a = 0,
|
|
s = 0,
|
|
o = this.readUByte.bind(this),
|
|
l = this.readBits.bind(this),
|
|
u = this.readUEG.bind(this),
|
|
h = this.readBoolean.bind(this),
|
|
d = this.skipBits.bind(this),
|
|
c = this.skipEG.bind(this),
|
|
f = this.skipUEG.bind(this),
|
|
g = this.skipScalingList.bind(this);
|
|
o();
|
|
var v = o();
|
|
if (
|
|
(l(5),
|
|
d(3),
|
|
o(),
|
|
f(),
|
|
100 === v ||
|
|
110 === v ||
|
|
122 === v ||
|
|
244 === v ||
|
|
44 === v ||
|
|
83 === v ||
|
|
86 === v ||
|
|
118 === v ||
|
|
128 === v)
|
|
) {
|
|
var m = u();
|
|
if ((3 === m && d(1), f(), f(), d(1), h()))
|
|
for (e = 3 !== m ? 8 : 12, r = 0; r < e; r++)
|
|
h() && g(r < 6 ? 16 : 64);
|
|
}
|
|
f();
|
|
var p = u();
|
|
if (0 === p) u();
|
|
else if (1 === p)
|
|
for (d(1), c(), c(), t = u(), r = 0; r < t; r++) c();
|
|
f(), d(1);
|
|
var y = u(),
|
|
T = u(),
|
|
E = l(1);
|
|
0 === E && d(1),
|
|
d(1),
|
|
h() && ((i = u()), (n = u()), (a = u()), (s = u()));
|
|
var S = [1, 1];
|
|
if (h() && h())
|
|
switch (o()) {
|
|
case 1:
|
|
S = [1, 1];
|
|
break;
|
|
case 2:
|
|
S = [12, 11];
|
|
break;
|
|
case 3:
|
|
S = [10, 11];
|
|
break;
|
|
case 4:
|
|
S = [16, 11];
|
|
break;
|
|
case 5:
|
|
S = [40, 33];
|
|
break;
|
|
case 6:
|
|
S = [24, 11];
|
|
break;
|
|
case 7:
|
|
S = [20, 11];
|
|
break;
|
|
case 8:
|
|
S = [32, 11];
|
|
break;
|
|
case 9:
|
|
S = [80, 33];
|
|
break;
|
|
case 10:
|
|
S = [18, 11];
|
|
break;
|
|
case 11:
|
|
S = [15, 11];
|
|
break;
|
|
case 12:
|
|
S = [64, 33];
|
|
break;
|
|
case 13:
|
|
S = [160, 99];
|
|
break;
|
|
case 14:
|
|
S = [4, 3];
|
|
break;
|
|
case 15:
|
|
S = [3, 2];
|
|
break;
|
|
case 16:
|
|
S = [2, 1];
|
|
break;
|
|
case 255:
|
|
S = [(o() << 8) | o(), (o() << 8) | o()];
|
|
}
|
|
return {
|
|
width: Math.ceil(16 * (y + 1) - 2 * i - 2 * n),
|
|
height: (2 - E) * (T + 1) * 16 - (E ? 2 : 4) * (a + s),
|
|
pixelRatio: S,
|
|
};
|
|
}),
|
|
(e.readSliceType = function () {
|
|
return this.readUByte(), this.readUEG(), this.readUEG();
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
ki = (function () {
|
|
function t(t, e, r) {
|
|
(this.keyData = void 0),
|
|
(this.decrypter = void 0),
|
|
(this.keyData = r),
|
|
(this.decrypter = new Ur(e, { removePKCS7Padding: !1 }));
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.decryptBuffer = function (t) {
|
|
return this.decrypter.decrypt(
|
|
t,
|
|
this.keyData.key.buffer,
|
|
this.keyData.iv.buffer
|
|
);
|
|
}),
|
|
(e.decryptAacSample = function (t, e, r) {
|
|
var i = this,
|
|
n = t[e].unit;
|
|
if (!(n.length <= 16)) {
|
|
var a = n.subarray(16, n.length - (n.length % 16)),
|
|
s = a.buffer.slice(a.byteOffset, a.byteOffset + a.length);
|
|
this.decryptBuffer(s).then(function (a) {
|
|
var s = new Uint8Array(a);
|
|
n.set(s, 16),
|
|
i.decrypter.isSync() || i.decryptAacSamples(t, e + 1, r);
|
|
});
|
|
}
|
|
}),
|
|
(e.decryptAacSamples = function (t, e, r) {
|
|
for (; ; e++) {
|
|
if (e >= t.length) return void r();
|
|
if (
|
|
!(
|
|
t[e].unit.length < 32 ||
|
|
(this.decryptAacSample(t, e, r), this.decrypter.isSync())
|
|
)
|
|
)
|
|
return;
|
|
}
|
|
}),
|
|
(e.getAvcEncryptedData = function (t) {
|
|
for (
|
|
var e = 16 * Math.floor((t.length - 48) / 160) + 16,
|
|
r = new Int8Array(e),
|
|
i = 0,
|
|
n = 32;
|
|
n < t.length - 16;
|
|
n += 160, i += 16
|
|
)
|
|
r.set(t.subarray(n, n + 16), i);
|
|
return r;
|
|
}),
|
|
(e.getAvcDecryptedUnit = function (t, e) {
|
|
for (
|
|
var r = new Uint8Array(e), i = 0, n = 32;
|
|
n < t.length - 16;
|
|
n += 160, i += 16
|
|
)
|
|
t.set(r.subarray(i, i + 16), n);
|
|
return t;
|
|
}),
|
|
(e.decryptAvcSample = function (t, e, r, i, n) {
|
|
var a = this,
|
|
s = Nt(n.data),
|
|
o = this.getAvcEncryptedData(s);
|
|
this.decryptBuffer(o.buffer).then(function (o) {
|
|
(n.data = a.getAvcDecryptedUnit(s, o)),
|
|
a.decrypter.isSync() || a.decryptAvcSamples(t, e, r + 1, i);
|
|
});
|
|
}),
|
|
(e.decryptAvcSamples = function (t, e, r, i) {
|
|
if (t instanceof Uint8Array)
|
|
throw new Error("Cannot decrypt samples of type Uint8Array");
|
|
for (; ; e++, r = 0) {
|
|
if (e >= t.length) return void i();
|
|
for (var n = t[e].units; !(r >= n.length); r++) {
|
|
var a = n[r];
|
|
if (
|
|
!(
|
|
a.data.length <= 48 ||
|
|
(1 !== a.type && 5 !== a.type) ||
|
|
(this.decryptAvcSample(t, e, r, i, a),
|
|
this.decrypter.isSync())
|
|
)
|
|
)
|
|
return;
|
|
}
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
bi = 188,
|
|
Di = (function () {
|
|
function t(t, e, r) {
|
|
(this.observer = void 0),
|
|
(this.config = void 0),
|
|
(this.typeSupported = void 0),
|
|
(this.sampleAes = null),
|
|
(this.pmtParsed = !1),
|
|
(this.audioCodec = void 0),
|
|
(this.videoCodec = void 0),
|
|
(this._duration = 0),
|
|
(this._pmtId = -1),
|
|
(this._avcTrack = void 0),
|
|
(this._audioTrack = void 0),
|
|
(this._id3Track = void 0),
|
|
(this._txtTrack = void 0),
|
|
(this.aacOverFlow = null),
|
|
(this.avcSample = null),
|
|
(this.remainderData = null),
|
|
(this.observer = t),
|
|
(this.config = e),
|
|
(this.typeSupported = r);
|
|
}
|
|
(t.probe = function (e) {
|
|
var r = t.syncOffset(e);
|
|
return (
|
|
r > 0 &&
|
|
w.warn(
|
|
"MPEG2-TS detected but first sync word found @ offset " + r
|
|
),
|
|
-1 !== r
|
|
);
|
|
}),
|
|
(t.syncOffset = function (t) {
|
|
for (
|
|
var e = t.length, r = Math.min(940, t.length - bi) + 1, i = 0;
|
|
i < r;
|
|
|
|
) {
|
|
for (var n = !1, a = -1, s = 0, o = i; o < e; o += bi) {
|
|
if (71 !== t[o]) {
|
|
if (s) return -1;
|
|
break;
|
|
}
|
|
if (
|
|
(s++,
|
|
-1 === a &&
|
|
0 !== (a = o) &&
|
|
(r = Math.min(a + 18612, t.length - bi) + 1),
|
|
n || (n = 0 === wi(t, o)),
|
|
n && s > 1 && ((0 === a && s > 2) || o + bi > r))
|
|
)
|
|
return a;
|
|
}
|
|
i++;
|
|
}
|
|
return -1;
|
|
}),
|
|
(t.createTrack = function (t, e) {
|
|
return {
|
|
container:
|
|
"video" === t || "audio" === t ? "video/mp2t" : void 0,
|
|
type: t,
|
|
id: Lt[t],
|
|
pid: -1,
|
|
inputTimeScale: 9e4,
|
|
sequenceNumber: 0,
|
|
samples: [],
|
|
dropped: 0,
|
|
duration: "audio" === t ? e : void 0,
|
|
};
|
|
});
|
|
var e = t.prototype;
|
|
return (
|
|
(e.resetInitSegment = function (e, r, i, n) {
|
|
(this.pmtParsed = !1),
|
|
(this._pmtId = -1),
|
|
(this._avcTrack = t.createTrack("video")),
|
|
(this._audioTrack = t.createTrack("audio", n)),
|
|
(this._id3Track = t.createTrack("id3")),
|
|
(this._txtTrack = t.createTrack("text")),
|
|
(this._audioTrack.segmentCodec = "aac"),
|
|
(this.aacOverFlow = null),
|
|
(this.avcSample = null),
|
|
(this.remainderData = null),
|
|
(this.audioCodec = r),
|
|
(this.videoCodec = i),
|
|
(this._duration = n);
|
|
}),
|
|
(e.resetTimeStamp = function () {}),
|
|
(e.resetContiguity = function () {
|
|
var t = this._audioTrack,
|
|
e = this._avcTrack,
|
|
r = this._id3Track;
|
|
t && (t.pesData = null),
|
|
e && (e.pesData = null),
|
|
r && (r.pesData = null),
|
|
(this.aacOverFlow = null),
|
|
(this.avcSample = null),
|
|
(this.remainderData = null);
|
|
}),
|
|
(e.demux = function (e, r, i, n) {
|
|
var a;
|
|
void 0 === i && (i = !1),
|
|
void 0 === n && (n = !1),
|
|
i || (this.sampleAes = null);
|
|
var s = this._avcTrack,
|
|
o = this._audioTrack,
|
|
l = this._id3Track,
|
|
u = this._txtTrack,
|
|
h = s.pid,
|
|
d = s.pesData,
|
|
c = o.pid,
|
|
f = l.pid,
|
|
g = o.pesData,
|
|
v = l.pesData,
|
|
m = null,
|
|
p = this.pmtParsed,
|
|
y = this._pmtId,
|
|
T = e.length;
|
|
if (
|
|
(this.remainderData &&
|
|
((T = (e = xt(this.remainderData, e)).length),
|
|
(this.remainderData = null)),
|
|
T < bi && !n)
|
|
)
|
|
return (
|
|
(this.remainderData = e),
|
|
{ audioTrack: o, videoTrack: s, id3Track: l, textTrack: u }
|
|
);
|
|
var E = Math.max(0, t.syncOffset(e));
|
|
(T -= (T - E) % bi) < e.byteLength &&
|
|
!n &&
|
|
(this.remainderData = new Uint8Array(
|
|
e.buffer,
|
|
T,
|
|
e.buffer.byteLength - T
|
|
));
|
|
for (var A = 0, k = E; k < T; k += bi)
|
|
if (71 === e[k]) {
|
|
var b = !!(64 & e[k + 1]),
|
|
D = wi(e, k),
|
|
I = void 0;
|
|
if ((48 & e[k + 3]) >> 4 > 1) {
|
|
if ((I = k + 5 + e[k + 4]) === k + bi) continue;
|
|
} else I = k + 4;
|
|
switch (D) {
|
|
case h:
|
|
b &&
|
|
(d && (a = Pi(d)) && this.parseAVCPES(s, u, a, !1),
|
|
(d = { data: [], size: 0 })),
|
|
d &&
|
|
(d.data.push(e.subarray(I, k + bi)),
|
|
(d.size += k + bi - I));
|
|
break;
|
|
case c:
|
|
if (b) {
|
|
if (g && (a = Pi(g)))
|
|
switch (o.segmentCodec) {
|
|
case "aac":
|
|
this.parseAACPES(o, a);
|
|
break;
|
|
case "mp3":
|
|
this.parseMPEGPES(o, a);
|
|
}
|
|
g = { data: [], size: 0 };
|
|
}
|
|
g &&
|
|
(g.data.push(e.subarray(I, k + bi)),
|
|
(g.size += k + bi - I));
|
|
break;
|
|
case f:
|
|
b &&
|
|
(v && (a = Pi(v)) && this.parseID3PES(l, a),
|
|
(v = { data: [], size: 0 })),
|
|
v &&
|
|
(v.data.push(e.subarray(I, k + bi)),
|
|
(v.size += k + bi - I));
|
|
break;
|
|
case 0:
|
|
b && (I += e[I] + 1), (y = this._pmtId = Ci(e, I));
|
|
break;
|
|
case y:
|
|
b && (I += e[I] + 1);
|
|
var C = _i(e, I, this.typeSupported, i);
|
|
(h = C.avc) > 0 && (s.pid = h),
|
|
(c = C.audio) > 0 &&
|
|
((o.pid = c), (o.segmentCodec = C.segmentCodec)),
|
|
(f = C.id3) > 0 && (l.pid = f),
|
|
null === m ||
|
|
p ||
|
|
(w.warn(
|
|
"MPEG-TS PMT found at " +
|
|
k +
|
|
" after unknown PID '" +
|
|
m +
|
|
"'. Backtracking to sync byte @" +
|
|
E +
|
|
" to parse all TS packets."
|
|
),
|
|
(m = null),
|
|
(k = E - 188)),
|
|
(p = this.pmtParsed = !0);
|
|
break;
|
|
case 17:
|
|
case 8191:
|
|
break;
|
|
default:
|
|
m = D;
|
|
}
|
|
} else A++;
|
|
if (A > 0) {
|
|
var _ = new Error(
|
|
"Found " + A + " TS packet/s that do not start with 0x47"
|
|
);
|
|
this.observer.emit(S.ERROR, S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
fatal: !1,
|
|
error: _,
|
|
reason: _.message,
|
|
});
|
|
}
|
|
(s.pesData = d), (o.pesData = g), (l.pesData = v);
|
|
var P = {
|
|
audioTrack: o,
|
|
videoTrack: s,
|
|
id3Track: l,
|
|
textTrack: u,
|
|
};
|
|
return n && this.extractRemainingSamples(P), P;
|
|
}),
|
|
(e.flush = function () {
|
|
var t,
|
|
e = this.remainderData;
|
|
return (
|
|
(this.remainderData = null),
|
|
(t = e
|
|
? this.demux(e, -1, !1, !0)
|
|
: {
|
|
videoTrack: this._avcTrack,
|
|
audioTrack: this._audioTrack,
|
|
id3Track: this._id3Track,
|
|
textTrack: this._txtTrack,
|
|
}),
|
|
this.extractRemainingSamples(t),
|
|
this.sampleAes ? this.decrypt(t, this.sampleAes) : t
|
|
);
|
|
}),
|
|
(e.extractRemainingSamples = function (t) {
|
|
var e,
|
|
r = t.audioTrack,
|
|
i = t.videoTrack,
|
|
n = t.id3Track,
|
|
a = t.textTrack,
|
|
s = i.pesData,
|
|
o = r.pesData,
|
|
l = n.pesData;
|
|
if (
|
|
(s && (e = Pi(s))
|
|
? (this.parseAVCPES(i, a, e, !0), (i.pesData = null))
|
|
: (i.pesData = s),
|
|
o && (e = Pi(o)))
|
|
) {
|
|
switch (r.segmentCodec) {
|
|
case "aac":
|
|
this.parseAACPES(r, e);
|
|
break;
|
|
case "mp3":
|
|
this.parseMPEGPES(r, e);
|
|
}
|
|
r.pesData = null;
|
|
} else
|
|
null != o &&
|
|
o.size &&
|
|
w.log(
|
|
"last AAC PES packet truncated,might overlap between fragments"
|
|
),
|
|
(r.pesData = o);
|
|
l && (e = Pi(l))
|
|
? (this.parseID3PES(n, e), (n.pesData = null))
|
|
: (n.pesData = l);
|
|
}),
|
|
(e.demuxSampleAes = function (t, e, r) {
|
|
var i = this.demux(t, r, !0, !this.config.progressive),
|
|
n = (this.sampleAes = new ki(this.observer, this.config, e));
|
|
return this.decrypt(i, n);
|
|
}),
|
|
(e.decrypt = function (t, e) {
|
|
return new Promise(function (r) {
|
|
var i = t.audioTrack,
|
|
n = t.videoTrack;
|
|
i.samples && "aac" === i.segmentCodec
|
|
? e.decryptAacSamples(i.samples, 0, function () {
|
|
n.samples
|
|
? e.decryptAvcSamples(n.samples, 0, 0, function () {
|
|
r(t);
|
|
})
|
|
: r(t);
|
|
})
|
|
: n.samples &&
|
|
e.decryptAvcSamples(n.samples, 0, 0, function () {
|
|
r(t);
|
|
});
|
|
});
|
|
}),
|
|
(e.destroy = function () {
|
|
this._duration = 0;
|
|
}),
|
|
(e.parseAVCPES = function (t, e, r, i) {
|
|
var n,
|
|
a = this,
|
|
s = this.parseAVCNALu(t, r.data),
|
|
o = this.avcSample,
|
|
l = !1;
|
|
(r.data = null),
|
|
o &&
|
|
s.length &&
|
|
!t.audFound &&
|
|
(xi(o, t), (o = this.avcSample = Ii(!1, r.pts, r.dts, ""))),
|
|
s.forEach(function (i) {
|
|
var s;
|
|
switch (i.type) {
|
|
case 1:
|
|
var u = !1;
|
|
n = !0;
|
|
var h,
|
|
d = i.data;
|
|
if (l && d.length > 4) {
|
|
var c = new Ai(d).readSliceType();
|
|
(2 !== c && 4 !== c && 7 !== c && 9 !== c) || (u = !0);
|
|
}
|
|
u &&
|
|
null != (h = o) &&
|
|
h.frame &&
|
|
!o.key &&
|
|
(xi(o, t), (o = a.avcSample = null)),
|
|
o || (o = a.avcSample = Ii(!0, r.pts, r.dts, "")),
|
|
(o.frame = !0),
|
|
(o.key = u);
|
|
break;
|
|
case 5:
|
|
(n = !0),
|
|
null != (s = o) &&
|
|
s.frame &&
|
|
!o.key &&
|
|
(xi(o, t), (o = a.avcSample = null)),
|
|
o || (o = a.avcSample = Ii(!0, r.pts, r.dts, "")),
|
|
(o.key = !0),
|
|
(o.frame = !0);
|
|
break;
|
|
case 6:
|
|
(n = !0), Ot(i.data, 1, r.pts, e.samples);
|
|
break;
|
|
case 7:
|
|
if (((n = !0), (l = !0), !t.sps)) {
|
|
var f = i.data,
|
|
g = new Ai(f).readSPS();
|
|
(t.width = g.width),
|
|
(t.height = g.height),
|
|
(t.pixelRatio = g.pixelRatio),
|
|
(t.sps = [f]),
|
|
(t.duration = a._duration);
|
|
for (
|
|
var v = f.subarray(1, 4), m = "avc1.", p = 0;
|
|
p < 3;
|
|
p++
|
|
) {
|
|
var y = v[p].toString(16);
|
|
y.length < 2 && (y = "0" + y), (m += y);
|
|
}
|
|
t.codec = m;
|
|
}
|
|
break;
|
|
case 8:
|
|
(n = !0), t.pps || (t.pps = [i.data]);
|
|
break;
|
|
case 9:
|
|
(n = !1),
|
|
(t.audFound = !0),
|
|
o && xi(o, t),
|
|
(o = a.avcSample = Ii(!1, r.pts, r.dts, ""));
|
|
break;
|
|
case 12:
|
|
n = !0;
|
|
break;
|
|
default:
|
|
(n = !1), o && (o.debug += "unknown NAL " + i.type + " ");
|
|
}
|
|
o && n && o.units.push(i);
|
|
}),
|
|
i && o && (xi(o, t), (this.avcSample = null));
|
|
}),
|
|
(e.getLastNalUnit = function (t) {
|
|
var e,
|
|
r,
|
|
i = this.avcSample;
|
|
if (
|
|
((i && 0 !== i.units.length) || (i = t[t.length - 1]),
|
|
null != (e = i) && e.units)
|
|
) {
|
|
var n = i.units;
|
|
r = n[n.length - 1];
|
|
}
|
|
return r;
|
|
}),
|
|
(e.parseAVCNALu = function (t, e) {
|
|
var r,
|
|
i,
|
|
n = e.byteLength,
|
|
a = t.naluState || 0,
|
|
s = a,
|
|
o = [],
|
|
l = 0,
|
|
u = -1,
|
|
h = 0;
|
|
for (
|
|
-1 === a && ((u = 0), (h = 31 & e[0]), (a = 0), (l = 1));
|
|
l < n;
|
|
|
|
)
|
|
if (((r = e[l++]), a))
|
|
if (1 !== a)
|
|
if (r)
|
|
if (1 === r) {
|
|
if (u >= 0) {
|
|
var d = { data: e.subarray(u, l - a - 1), type: h };
|
|
o.push(d);
|
|
} else {
|
|
var c = this.getLastNalUnit(t.samples);
|
|
if (
|
|
c &&
|
|
(s &&
|
|
l <= 4 - s &&
|
|
c.state &&
|
|
(c.data = c.data.subarray(
|
|
0,
|
|
c.data.byteLength - s
|
|
)),
|
|
(i = l - a - 1) > 0)
|
|
) {
|
|
var f = new Uint8Array(c.data.byteLength + i);
|
|
f.set(c.data, 0),
|
|
f.set(e.subarray(0, i), c.data.byteLength),
|
|
(c.data = f),
|
|
(c.state = 0);
|
|
}
|
|
}
|
|
l < n ? ((u = l), (h = 31 & e[l]), (a = 0)) : (a = -1);
|
|
} else a = 0;
|
|
else a = 3;
|
|
else a = r ? 0 : 2;
|
|
else a = r ? 0 : 1;
|
|
if (u >= 0 && a >= 0) {
|
|
var g = { data: e.subarray(u, n), type: h, state: a };
|
|
o.push(g);
|
|
}
|
|
if (0 === o.length) {
|
|
var v = this.getLastNalUnit(t.samples);
|
|
if (v) {
|
|
var m = new Uint8Array(v.data.byteLength + e.byteLength);
|
|
m.set(v.data, 0), m.set(e, v.data.byteLength), (v.data = m);
|
|
}
|
|
}
|
|
return (t.naluState = a), o;
|
|
}),
|
|
(e.parseAACPES = function (t, e) {
|
|
var r,
|
|
i,
|
|
n,
|
|
a = 0,
|
|
s = this.aacOverFlow,
|
|
o = e.data;
|
|
if (s) {
|
|
this.aacOverFlow = null;
|
|
var l = s.missing,
|
|
u = s.sample.unit.byteLength;
|
|
if (-1 === l) {
|
|
var h = new Uint8Array(u + o.byteLength);
|
|
h.set(s.sample.unit, 0), h.set(o, u), (o = h);
|
|
} else {
|
|
var d = u - l;
|
|
s.sample.unit.set(o.subarray(0, l), d),
|
|
t.samples.push(s.sample),
|
|
(a = s.missing);
|
|
}
|
|
}
|
|
for (r = a, i = o.length; r < i - 1 && !si(o, r); r++);
|
|
if (r !== a) {
|
|
var c,
|
|
f = r < i - 1;
|
|
c = f
|
|
? "AAC PES did not start with ADTS header,offset:" + r
|
|
: "No ADTS header found in AAC PES";
|
|
var g = new Error(c);
|
|
if (
|
|
(w.warn("parsing error: " + c),
|
|
this.observer.emit(S.ERROR, S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
fatal: !1,
|
|
levelRetry: f,
|
|
error: g,
|
|
reason: c,
|
|
}),
|
|
!f)
|
|
)
|
|
return;
|
|
}
|
|
if (
|
|
(li(t, this.observer, o, r, this.audioCodec), void 0 !== e.pts)
|
|
)
|
|
n = e.pts;
|
|
else {
|
|
if (!s) return void w.warn("[tsdemuxer]: AAC PES unknown PTS");
|
|
var v = ui(t.samplerate);
|
|
n = s.sample.pts + v;
|
|
}
|
|
for (var m, p = 0; r < i; ) {
|
|
if (((r += (m = hi(t, o, r, n, p)).length), m.missing)) {
|
|
this.aacOverFlow = m;
|
|
break;
|
|
}
|
|
for (p++; r < i - 1 && !si(o, r); r++);
|
|
}
|
|
}),
|
|
(e.parseMPEGPES = function (t, e) {
|
|
var r = e.data,
|
|
i = r.length,
|
|
n = 0,
|
|
a = 0,
|
|
s = e.pts;
|
|
if (void 0 !== s)
|
|
for (; a < i; )
|
|
if (Li(r, a)) {
|
|
var o = Ti(t, r, a, s, n);
|
|
if (!o) break;
|
|
(a += o.length), n++;
|
|
} else a++;
|
|
else w.warn("[tsdemuxer]: MPEG PES unknown PTS");
|
|
}),
|
|
(e.parseID3PES = function (t, e) {
|
|
if (void 0 !== e.pts) {
|
|
var r = o({}, e, {
|
|
type: this._avcTrack ? be : Ae,
|
|
duration: Number.POSITIVE_INFINITY,
|
|
});
|
|
t.samples.push(r);
|
|
} else w.warn("[tsdemuxer]: ID3 PES unknown PTS");
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Ii(t, e, r, i) {
|
|
return {
|
|
key: t,
|
|
frame: !1,
|
|
pts: e,
|
|
dts: r,
|
|
units: [],
|
|
debug: i,
|
|
length: 0,
|
|
};
|
|
}
|
|
function wi(t, e) {
|
|
return ((31 & t[e + 1]) << 8) + t[e + 2];
|
|
}
|
|
function Ci(t, e) {
|
|
return ((31 & t[e + 10]) << 8) | t[e + 11];
|
|
}
|
|
function _i(t, e, r, i) {
|
|
var n = { audio: -1, avc: -1, id3: -1, segmentCodec: "aac" },
|
|
a = e + 3 + (((15 & t[e + 1]) << 8) | t[e + 2]) - 4;
|
|
for (e += 12 + (((15 & t[e + 10]) << 8) | t[e + 11]); e < a; ) {
|
|
var s = wi(t, e);
|
|
switch (t[e]) {
|
|
case 207:
|
|
if (!i) {
|
|
w.log(
|
|
"ADTS AAC with AES-128-CBC frame encryption found in unencrypted stream"
|
|
);
|
|
break;
|
|
}
|
|
case 15:
|
|
-1 === n.audio && (n.audio = s);
|
|
break;
|
|
case 21:
|
|
-1 === n.id3 && (n.id3 = s);
|
|
break;
|
|
case 219:
|
|
if (!i) {
|
|
w.log(
|
|
"H.264 with AES-128-CBC slice encryption found in unencrypted stream"
|
|
);
|
|
break;
|
|
}
|
|
case 27:
|
|
-1 === n.avc && (n.avc = s);
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
!0 !== r.mpeg && !0 !== r.mp3
|
|
? w.log("MPEG audio found, not supported in this browser")
|
|
: -1 === n.audio && ((n.audio = s), (n.segmentCodec = "mp3"));
|
|
break;
|
|
case 36:
|
|
w.warn("Unsupported HEVC stream type found");
|
|
}
|
|
e += 5 + (((15 & t[e + 3]) << 8) | t[e + 4]);
|
|
}
|
|
return n;
|
|
}
|
|
function Pi(t) {
|
|
var e,
|
|
r,
|
|
i,
|
|
n,
|
|
a,
|
|
s = 0,
|
|
o = t.data;
|
|
if (!t || 0 === t.size) return null;
|
|
for (; o[0].length < 19 && o.length > 1; ) {
|
|
var l = new Uint8Array(o[0].length + o[1].length);
|
|
l.set(o[0]), l.set(o[1], o[0].length), (o[0] = l), o.splice(1, 1);
|
|
}
|
|
if (1 === ((e = o[0])[0] << 16) + (e[1] << 8) + e[2]) {
|
|
if ((r = (e[4] << 8) + e[5]) && r > t.size - 6) return null;
|
|
var u = e[7];
|
|
192 & u &&
|
|
((n =
|
|
536870912 * (14 & e[9]) +
|
|
4194304 * (255 & e[10]) +
|
|
16384 * (254 & e[11]) +
|
|
128 * (255 & e[12]) +
|
|
(254 & e[13]) / 2),
|
|
64 & u
|
|
? n -
|
|
(a =
|
|
536870912 * (14 & e[14]) +
|
|
4194304 * (255 & e[15]) +
|
|
16384 * (254 & e[16]) +
|
|
128 * (255 & e[17]) +
|
|
(254 & e[18]) / 2) >
|
|
54e5 &&
|
|
(w.warn(
|
|
Math.round((n - a) / 9e4) +
|
|
"s delta between PTS and DTS, align them"
|
|
),
|
|
(n = a))
|
|
: (a = n));
|
|
var h = (i = e[8]) + 9;
|
|
if (t.size <= h) return null;
|
|
t.size -= h;
|
|
for (
|
|
var d = new Uint8Array(t.size), c = 0, f = o.length;
|
|
c < f;
|
|
c++
|
|
) {
|
|
var g = (e = o[c]).byteLength;
|
|
if (h) {
|
|
if (h > g) {
|
|
h -= g;
|
|
continue;
|
|
}
|
|
(e = e.subarray(h)), (g -= h), (h = 0);
|
|
}
|
|
d.set(e, s), (s += g);
|
|
}
|
|
return r && (r -= i + 3), { data: d, pts: n, dts: a, len: r };
|
|
}
|
|
return null;
|
|
}
|
|
function xi(t, e) {
|
|
if (t.units.length && t.frame) {
|
|
if (void 0 === t.pts) {
|
|
var r = e.samples,
|
|
i = r.length;
|
|
if (!i) return void e.dropped++;
|
|
var n = r[i - 1];
|
|
(t.pts = n.pts), (t.dts = n.dts);
|
|
}
|
|
e.samples.push(t);
|
|
}
|
|
t.debug.length && w.log(t.pts + "/" + t.dts + ":" + t.debug);
|
|
}
|
|
var Fi = (function (t) {
|
|
function e() {
|
|
return t.apply(this, arguments) || this;
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.resetInitSegment = function (e, r, i, n) {
|
|
t.prototype.resetInitSegment.call(this, e, r, i, n),
|
|
(this._audioTrack = {
|
|
container: "audio/mpeg",
|
|
type: "audio",
|
|
id: 2,
|
|
pid: -1,
|
|
sequenceNumber: 0,
|
|
segmentCodec: "mp3",
|
|
samples: [],
|
|
manifestCodec: r,
|
|
duration: n,
|
|
inputTimeScale: 9e4,
|
|
dropped: 0,
|
|
});
|
|
}),
|
|
(e.probe = function (t) {
|
|
if (!t) return !1;
|
|
for (var e = (st(t, 0) || []).length, r = t.length; e < r; e++)
|
|
if (Ri(t, e)) return w.log("MPEG Audio sync word found !"), !0;
|
|
return !1;
|
|
}),
|
|
(r.canParse = function (t, e) {
|
|
return (function (t, e) {
|
|
return Si(t, e) && 4 <= t.length - e;
|
|
})(t, e);
|
|
}),
|
|
(r.appendFrame = function (t, e, r) {
|
|
if (null !== this.basePTS)
|
|
return Ti(t, e, r, this.basePTS, this.frameIndex);
|
|
}),
|
|
e
|
|
);
|
|
})(ei),
|
|
Mi = (function () {
|
|
function t() {}
|
|
return (
|
|
(t.getSilentFrame = function (t, e) {
|
|
if ("mp4a.40.2" === t) {
|
|
if (1 === e) return new Uint8Array([0, 200, 0, 128, 35, 128]);
|
|
if (2 === e)
|
|
return new Uint8Array([33, 0, 73, 144, 2, 25, 0, 35, 128]);
|
|
if (3 === e)
|
|
return new Uint8Array([
|
|
0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 142,
|
|
]);
|
|
if (4 === e)
|
|
return new Uint8Array([
|
|
0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 128, 44, 128,
|
|
8, 2, 56,
|
|
]);
|
|
if (5 === e)
|
|
return new Uint8Array([
|
|
0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4,
|
|
153, 0, 33, 144, 2, 56,
|
|
]);
|
|
if (6 === e)
|
|
return new Uint8Array([
|
|
0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4,
|
|
153, 0, 33, 144, 2, 0, 178, 0, 32, 8, 224,
|
|
]);
|
|
} else {
|
|
if (1 === e)
|
|
return new Uint8Array([
|
|
1, 64, 34, 128, 163, 78, 230, 128, 186, 8, 0, 0, 0, 28, 6,
|
|
241, 193, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94,
|
|
]);
|
|
if (2 === e)
|
|
return new Uint8Array([
|
|
1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149,
|
|
0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94,
|
|
]);
|
|
if (3 === e)
|
|
return new Uint8Array([
|
|
1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149,
|
|
0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
|
|
90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94,
|
|
]);
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Oi = Math.pow(2, 32) - 1,
|
|
Ni = (function () {
|
|
function t() {}
|
|
return (
|
|
(t.init = function () {
|
|
var e;
|
|
for (e in ((t.types = {
|
|
avc1: [],
|
|
avcC: [],
|
|
btrt: [],
|
|
dinf: [],
|
|
dref: [],
|
|
esds: [],
|
|
ftyp: [],
|
|
hdlr: [],
|
|
mdat: [],
|
|
mdhd: [],
|
|
mdia: [],
|
|
mfhd: [],
|
|
minf: [],
|
|
moof: [],
|
|
moov: [],
|
|
mp4a: [],
|
|
".mp3": [],
|
|
mvex: [],
|
|
mvhd: [],
|
|
pasp: [],
|
|
sdtp: [],
|
|
stbl: [],
|
|
stco: [],
|
|
stsc: [],
|
|
stsd: [],
|
|
stsz: [],
|
|
stts: [],
|
|
tfdt: [],
|
|
tfhd: [],
|
|
traf: [],
|
|
trak: [],
|
|
trun: [],
|
|
trex: [],
|
|
tkhd: [],
|
|
vmhd: [],
|
|
smhd: [],
|
|
}),
|
|
t.types))
|
|
t.types.hasOwnProperty(e) &&
|
|
(t.types[e] = [
|
|
e.charCodeAt(0),
|
|
e.charCodeAt(1),
|
|
e.charCodeAt(2),
|
|
e.charCodeAt(3),
|
|
]);
|
|
var r = new Uint8Array([
|
|
0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 100, 101, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 86, 105, 100, 101, 111, 72, 97, 110, 100,
|
|
108, 101, 114, 0,
|
|
]),
|
|
i = new Uint8Array([
|
|
0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100,
|
|
108, 101, 114, 0,
|
|
]);
|
|
t.HDLR_TYPES = { video: r, audio: i };
|
|
var n = new Uint8Array([
|
|
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0,
|
|
0, 1,
|
|
]),
|
|
a = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]);
|
|
(t.STTS = t.STSC = t.STCO = a),
|
|
(t.STSZ = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])),
|
|
(t.VMHD = new Uint8Array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])),
|
|
(t.SMHD = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0])),
|
|
(t.STSD = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1]));
|
|
var s = new Uint8Array([105, 115, 111, 109]),
|
|
o = new Uint8Array([97, 118, 99, 49]),
|
|
l = new Uint8Array([0, 0, 0, 1]);
|
|
(t.FTYP = t.box(t.types.ftyp, s, l, s, o)),
|
|
(t.DINF = t.box(t.types.dinf, t.box(t.types.dref, n)));
|
|
}),
|
|
(t.box = function (t) {
|
|
for (
|
|
var e = 8,
|
|
r = arguments.length,
|
|
i = new Array(r > 1 ? r - 1 : 0),
|
|
n = 1;
|
|
n < r;
|
|
n++
|
|
)
|
|
i[n - 1] = arguments[n];
|
|
for (var a = i.length, s = a; a--; ) e += i[a].byteLength;
|
|
var o = new Uint8Array(e);
|
|
for (
|
|
o[0] = (e >> 24) & 255,
|
|
o[1] = (e >> 16) & 255,
|
|
o[2] = (e >> 8) & 255,
|
|
o[3] = 255 & e,
|
|
o.set(t, 4),
|
|
a = 0,
|
|
e = 8;
|
|
a < s;
|
|
a++
|
|
)
|
|
o.set(i[a], e), (e += i[a].byteLength);
|
|
return o;
|
|
}),
|
|
(t.hdlr = function (e) {
|
|
return t.box(t.types.hdlr, t.HDLR_TYPES[e]);
|
|
}),
|
|
(t.mdat = function (e) {
|
|
return t.box(t.types.mdat, e);
|
|
}),
|
|
(t.mdhd = function (e, r) {
|
|
r *= e;
|
|
var i = Math.floor(r / (Oi + 1)),
|
|
n = Math.floor(r % (Oi + 1));
|
|
return t.box(
|
|
t.types.mdhd,
|
|
new Uint8Array([
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
(e >> 24) & 255,
|
|
(e >> 16) & 255,
|
|
(e >> 8) & 255,
|
|
255 & e,
|
|
i >> 24,
|
|
(i >> 16) & 255,
|
|
(i >> 8) & 255,
|
|
255 & i,
|
|
n >> 24,
|
|
(n >> 16) & 255,
|
|
(n >> 8) & 255,
|
|
255 & n,
|
|
85,
|
|
196,
|
|
0,
|
|
0,
|
|
])
|
|
);
|
|
}),
|
|
(t.mdia = function (e) {
|
|
return t.box(
|
|
t.types.mdia,
|
|
t.mdhd(e.timescale, e.duration),
|
|
t.hdlr(e.type),
|
|
t.minf(e)
|
|
);
|
|
}),
|
|
(t.mfhd = function (e) {
|
|
return t.box(
|
|
t.types.mfhd,
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
e >> 24,
|
|
(e >> 16) & 255,
|
|
(e >> 8) & 255,
|
|
255 & e,
|
|
])
|
|
);
|
|
}),
|
|
(t.minf = function (e) {
|
|
return "audio" === e.type
|
|
? t.box(
|
|
t.types.minf,
|
|
t.box(t.types.smhd, t.SMHD),
|
|
t.DINF,
|
|
t.stbl(e)
|
|
)
|
|
: t.box(
|
|
t.types.minf,
|
|
t.box(t.types.vmhd, t.VMHD),
|
|
t.DINF,
|
|
t.stbl(e)
|
|
);
|
|
}),
|
|
(t.moof = function (e, r, i) {
|
|
return t.box(t.types.moof, t.mfhd(e), t.traf(i, r));
|
|
}),
|
|
(t.moov = function (e) {
|
|
for (var r = e.length, i = []; r--; ) i[r] = t.trak(e[r]);
|
|
return t.box.apply(
|
|
null,
|
|
[t.types.moov, t.mvhd(e[0].timescale, e[0].duration)]
|
|
.concat(i)
|
|
.concat(t.mvex(e))
|
|
);
|
|
}),
|
|
(t.mvex = function (e) {
|
|
for (var r = e.length, i = []; r--; ) i[r] = t.trex(e[r]);
|
|
return t.box.apply(null, [t.types.mvex].concat(i));
|
|
}),
|
|
(t.mvhd = function (e, r) {
|
|
r *= e;
|
|
var i = Math.floor(r / (Oi + 1)),
|
|
n = Math.floor(r % (Oi + 1)),
|
|
a = new Uint8Array([
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
(e >> 24) & 255,
|
|
(e >> 16) & 255,
|
|
(e >> 8) & 255,
|
|
255 & e,
|
|
i >> 24,
|
|
(i >> 16) & 255,
|
|
(i >> 8) & 255,
|
|
255 & i,
|
|
n >> 24,
|
|
(n >> 16) & 255,
|
|
(n >> 8) & 255,
|
|
255 & n,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
64,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
]);
|
|
return t.box(t.types.mvhd, a);
|
|
}),
|
|
(t.sdtp = function (e) {
|
|
var r,
|
|
i,
|
|
n = e.samples || [],
|
|
a = new Uint8Array(4 + n.length);
|
|
for (r = 0; r < n.length; r++)
|
|
(i = n[r].flags),
|
|
(a[r + 4] =
|
|
(i.dependsOn << 4) |
|
|
(i.isDependedOn << 2) |
|
|
i.hasRedundancy);
|
|
return t.box(t.types.sdtp, a);
|
|
}),
|
|
(t.stbl = function (e) {
|
|
return t.box(
|
|
t.types.stbl,
|
|
t.stsd(e),
|
|
t.box(t.types.stts, t.STTS),
|
|
t.box(t.types.stsc, t.STSC),
|
|
t.box(t.types.stsz, t.STSZ),
|
|
t.box(t.types.stco, t.STCO)
|
|
);
|
|
}),
|
|
(t.avc1 = function (e) {
|
|
var r,
|
|
i,
|
|
n,
|
|
a = [],
|
|
s = [];
|
|
for (r = 0; r < e.sps.length; r++)
|
|
(n = (i = e.sps[r]).byteLength),
|
|
a.push((n >>> 8) & 255),
|
|
a.push(255 & n),
|
|
(a = a.concat(Array.prototype.slice.call(i)));
|
|
for (r = 0; r < e.pps.length; r++)
|
|
(n = (i = e.pps[r]).byteLength),
|
|
s.push((n >>> 8) & 255),
|
|
s.push(255 & n),
|
|
(s = s.concat(Array.prototype.slice.call(i)));
|
|
var o = t.box(
|
|
t.types.avcC,
|
|
new Uint8Array(
|
|
[1, a[3], a[4], a[5], 255, 224 | e.sps.length]
|
|
.concat(a)
|
|
.concat([e.pps.length])
|
|
.concat(s)
|
|
)
|
|
),
|
|
l = e.width,
|
|
u = e.height,
|
|
h = e.pixelRatio[0],
|
|
d = e.pixelRatio[1];
|
|
return t.box(
|
|
t.types.avc1,
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
(l >> 8) & 255,
|
|
255 & l,
|
|
(u >> 8) & 255,
|
|
255 & u,
|
|
0,
|
|
72,
|
|
0,
|
|
0,
|
|
0,
|
|
72,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
18,
|
|
100,
|
|
97,
|
|
105,
|
|
108,
|
|
121,
|
|
109,
|
|
111,
|
|
116,
|
|
105,
|
|
111,
|
|
110,
|
|
47,
|
|
104,
|
|
108,
|
|
115,
|
|
46,
|
|
106,
|
|
115,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
24,
|
|
17,
|
|
17,
|
|
]),
|
|
o,
|
|
t.box(
|
|
t.types.btrt,
|
|
new Uint8Array([
|
|
0, 28, 156, 128, 0, 45, 198, 192, 0, 45, 198, 192,
|
|
])
|
|
),
|
|
t.box(
|
|
t.types.pasp,
|
|
new Uint8Array([
|
|
h >> 24,
|
|
(h >> 16) & 255,
|
|
(h >> 8) & 255,
|
|
255 & h,
|
|
d >> 24,
|
|
(d >> 16) & 255,
|
|
(d >> 8) & 255,
|
|
255 & d,
|
|
])
|
|
)
|
|
);
|
|
}),
|
|
(t.esds = function (t) {
|
|
var e = t.config.length;
|
|
return new Uint8Array(
|
|
[
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
23 + e,
|
|
0,
|
|
1,
|
|
0,
|
|
4,
|
|
15 + e,
|
|
64,
|
|
21,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
5,
|
|
]
|
|
.concat([e])
|
|
.concat(t.config)
|
|
.concat([6, 1, 2])
|
|
);
|
|
}),
|
|
(t.mp4a = function (e) {
|
|
var r = e.samplerate;
|
|
return t.box(
|
|
t.types.mp4a,
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
e.channelCount,
|
|
0,
|
|
16,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
(r >> 8) & 255,
|
|
255 & r,
|
|
0,
|
|
0,
|
|
]),
|
|
t.box(t.types.esds, t.esds(e))
|
|
);
|
|
}),
|
|
(t.mp3 = function (e) {
|
|
var r = e.samplerate;
|
|
return t.box(
|
|
t.types[".mp3"],
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
e.channelCount,
|
|
0,
|
|
16,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
(r >> 8) & 255,
|
|
255 & r,
|
|
0,
|
|
0,
|
|
])
|
|
);
|
|
}),
|
|
(t.stsd = function (e) {
|
|
return "audio" === e.type
|
|
? "mp3" === e.segmentCodec && "mp3" === e.codec
|
|
? t.box(t.types.stsd, t.STSD, t.mp3(e))
|
|
: t.box(t.types.stsd, t.STSD, t.mp4a(e))
|
|
: t.box(t.types.stsd, t.STSD, t.avc1(e));
|
|
}),
|
|
(t.tkhd = function (e) {
|
|
var r = e.id,
|
|
i = e.duration * e.timescale,
|
|
n = e.width,
|
|
a = e.height,
|
|
s = Math.floor(i / (Oi + 1)),
|
|
o = Math.floor(i % (Oi + 1));
|
|
return t.box(
|
|
t.types.tkhd,
|
|
new Uint8Array([
|
|
1,
|
|
0,
|
|
0,
|
|
7,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
(r >> 24) & 255,
|
|
(r >> 16) & 255,
|
|
(r >> 8) & 255,
|
|
255 & r,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
s >> 24,
|
|
(s >> 16) & 255,
|
|
(s >> 8) & 255,
|
|
255 & s,
|
|
o >> 24,
|
|
(o >> 16) & 255,
|
|
(o >> 8) & 255,
|
|
255 & o,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
64,
|
|
0,
|
|
0,
|
|
0,
|
|
(n >> 8) & 255,
|
|
255 & n,
|
|
0,
|
|
0,
|
|
(a >> 8) & 255,
|
|
255 & a,
|
|
0,
|
|
0,
|
|
])
|
|
);
|
|
}),
|
|
(t.traf = function (e, r) {
|
|
var i = t.sdtp(e),
|
|
n = e.id,
|
|
a = Math.floor(r / (Oi + 1)),
|
|
s = Math.floor(r % (Oi + 1));
|
|
return t.box(
|
|
t.types.traf,
|
|
t.box(
|
|
t.types.tfhd,
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
n >> 24,
|
|
(n >> 16) & 255,
|
|
(n >> 8) & 255,
|
|
255 & n,
|
|
])
|
|
),
|
|
t.box(
|
|
t.types.tfdt,
|
|
new Uint8Array([
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
a >> 24,
|
|
(a >> 16) & 255,
|
|
(a >> 8) & 255,
|
|
255 & a,
|
|
s >> 24,
|
|
(s >> 16) & 255,
|
|
(s >> 8) & 255,
|
|
255 & s,
|
|
])
|
|
),
|
|
t.trun(e, i.length + 16 + 20 + 8 + 16 + 8 + 8),
|
|
i
|
|
);
|
|
}),
|
|
(t.trak = function (e) {
|
|
return (
|
|
(e.duration = e.duration || 4294967295),
|
|
t.box(t.types.trak, t.tkhd(e), t.mdia(e))
|
|
);
|
|
}),
|
|
(t.trex = function (e) {
|
|
var r = e.id;
|
|
return t.box(
|
|
t.types.trex,
|
|
new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
r >> 24,
|
|
(r >> 16) & 255,
|
|
(r >> 8) & 255,
|
|
255 & r,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
])
|
|
);
|
|
}),
|
|
(t.trun = function (e, r) {
|
|
var i,
|
|
n,
|
|
a,
|
|
s,
|
|
o,
|
|
l,
|
|
u = e.samples || [],
|
|
h = u.length,
|
|
d = 12 + 16 * h,
|
|
c = new Uint8Array(d);
|
|
for (
|
|
r += 8 + d,
|
|
c.set(
|
|
[
|
|
"video" === e.type ? 1 : 0,
|
|
0,
|
|
15,
|
|
1,
|
|
(h >>> 24) & 255,
|
|
(h >>> 16) & 255,
|
|
(h >>> 8) & 255,
|
|
255 & h,
|
|
(r >>> 24) & 255,
|
|
(r >>> 16) & 255,
|
|
(r >>> 8) & 255,
|
|
255 & r,
|
|
],
|
|
0
|
|
),
|
|
i = 0;
|
|
i < h;
|
|
i++
|
|
)
|
|
(a = (n = u[i]).duration),
|
|
(s = n.size),
|
|
(o = n.flags),
|
|
(l = n.cts),
|
|
c.set(
|
|
[
|
|
(a >>> 24) & 255,
|
|
(a >>> 16) & 255,
|
|
(a >>> 8) & 255,
|
|
255 & a,
|
|
(s >>> 24) & 255,
|
|
(s >>> 16) & 255,
|
|
(s >>> 8) & 255,
|
|
255 & s,
|
|
(o.isLeading << 2) | o.dependsOn,
|
|
(o.isDependedOn << 6) |
|
|
(o.hasRedundancy << 4) |
|
|
(o.paddingValue << 1) |
|
|
o.isNonSync,
|
|
61440 & o.degradPrio,
|
|
15 & o.degradPrio,
|
|
(l >>> 24) & 255,
|
|
(l >>> 16) & 255,
|
|
(l >>> 8) & 255,
|
|
255 & l,
|
|
],
|
|
12 + 16 * i
|
|
);
|
|
return t.box(t.types.trun, c);
|
|
}),
|
|
(t.initSegment = function (e) {
|
|
t.types || t.init();
|
|
var r = t.moov(e),
|
|
i = new Uint8Array(t.FTYP.byteLength + r.byteLength);
|
|
return i.set(t.FTYP), i.set(r, t.FTYP.byteLength), i;
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Ui(t, e, r, i) {
|
|
void 0 === r && (r = 1), void 0 === i && (i = !1);
|
|
var n = t * e * r;
|
|
return i ? Math.round(n) : n;
|
|
}
|
|
function Bi(t, e) {
|
|
return void 0 === e && (e = !1), Ui(t, 1e3, 1 / 9e4, e);
|
|
}
|
|
(Ni.types = void 0),
|
|
(Ni.HDLR_TYPES = void 0),
|
|
(Ni.STTS = void 0),
|
|
(Ni.STSC = void 0),
|
|
(Ni.STCO = void 0),
|
|
(Ni.STSZ = void 0),
|
|
(Ni.VMHD = void 0),
|
|
(Ni.SMHD = void 0),
|
|
(Ni.STSD = void 0),
|
|
(Ni.FTYP = void 0),
|
|
(Ni.DINF = void 0);
|
|
var Gi = null,
|
|
Ki = null,
|
|
Hi = (function () {
|
|
function t(t, e, r, i) {
|
|
if (
|
|
((this.observer = void 0),
|
|
(this.config = void 0),
|
|
(this.typeSupported = void 0),
|
|
(this.ISGenerated = !1),
|
|
(this._initPTS = null),
|
|
(this._initDTS = null),
|
|
(this.nextAvcDts = null),
|
|
(this.nextAudioPts = null),
|
|
(this.videoSampleDuration = null),
|
|
(this.isAudioContiguous = !1),
|
|
(this.isVideoContiguous = !1),
|
|
(this.observer = t),
|
|
(this.config = e),
|
|
(this.typeSupported = r),
|
|
(this.ISGenerated = !1),
|
|
null === Gi)
|
|
) {
|
|
var n = (navigator.userAgent || "").match(/Chrome\/(\d+)/i);
|
|
Gi = n ? parseInt(n[1]) : 0;
|
|
}
|
|
if (null === Ki) {
|
|
var a = navigator.userAgent.match(/Safari\/(\d+)/i);
|
|
Ki = a ? parseInt(a[1]) : 0;
|
|
}
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {}),
|
|
(e.resetTimeStamp = function (t) {
|
|
w.log("[mp4-remuxer]: initPTS & initDTS reset"),
|
|
(this._initPTS = this._initDTS = t);
|
|
}),
|
|
(e.resetNextTimestamp = function () {
|
|
w.log("[mp4-remuxer]: reset next timestamp"),
|
|
(this.isVideoContiguous = !1),
|
|
(this.isAudioContiguous = !1);
|
|
}),
|
|
(e.resetInitSegment = function () {
|
|
w.log("[mp4-remuxer]: ISGenerated flag reset"),
|
|
(this.ISGenerated = !1);
|
|
}),
|
|
(e.getVideoStartPts = function (t) {
|
|
var e = !1,
|
|
r = t.reduce(function (t, r) {
|
|
var i = r.pts - t;
|
|
return i < -4294967296
|
|
? ((e = !0), Vi(t, r.pts))
|
|
: i > 0
|
|
? t
|
|
: r.pts;
|
|
}, t[0].pts);
|
|
return e && w.debug("PTS rollover detected"), r;
|
|
}),
|
|
(e.remux = function (t, e, r, i, n, a, s, o) {
|
|
var l,
|
|
u,
|
|
h,
|
|
d,
|
|
c,
|
|
f,
|
|
g = n,
|
|
v = n,
|
|
m = t.pid > -1,
|
|
p = e.pid > -1,
|
|
y = e.samples.length,
|
|
T = t.samples.length > 0,
|
|
E = (s && y > 0) || y > 1;
|
|
if (((!m || T) && (!p || E)) || this.ISGenerated || s) {
|
|
this.ISGenerated || (h = this.generateIS(t, e, n, a));
|
|
var S,
|
|
L = this.isVideoContiguous,
|
|
R = -1;
|
|
if (
|
|
E &&
|
|
((R = (function (t) {
|
|
for (var e = 0; e < t.length; e++) if (t[e].key) return e;
|
|
return -1;
|
|
})(e.samples)),
|
|
!L && this.config.forceKeyFrameOnDiscontinuity)
|
|
)
|
|
if (((f = !0), R > 0)) {
|
|
w.warn(
|
|
"[mp4-remuxer]: Dropped " +
|
|
R +
|
|
" out of " +
|
|
y +
|
|
" video samples due to a missing keyframe"
|
|
);
|
|
var A = this.getVideoStartPts(e.samples);
|
|
(e.samples = e.samples.slice(R)),
|
|
(e.dropped += R),
|
|
(S = v += (e.samples[0].pts - A) / e.inputTimeScale);
|
|
} else
|
|
-1 === R &&
|
|
(w.warn(
|
|
"[mp4-remuxer]: No keyframe found out of " +
|
|
y +
|
|
" video samples"
|
|
),
|
|
(f = !1));
|
|
if (this.ISGenerated) {
|
|
if (T && E) {
|
|
var k = this.getVideoStartPts(e.samples),
|
|
b = (Vi(t.samples[0].pts, k) - k) / e.inputTimeScale;
|
|
(g += Math.max(0, b)), (v += Math.max(0, -b));
|
|
}
|
|
if (T) {
|
|
if (
|
|
(t.samplerate ||
|
|
(w.warn(
|
|
"[mp4-remuxer]: regenerate InitSegment as audio detected"
|
|
),
|
|
(h = this.generateIS(t, e, n, a))),
|
|
(u = this.remuxAudio(
|
|
t,
|
|
g,
|
|
this.isAudioContiguous,
|
|
a,
|
|
p || E || o === ve ? v : void 0
|
|
)),
|
|
E)
|
|
) {
|
|
var D = u ? u.endPTS - u.startPTS : 0;
|
|
e.inputTimeScale ||
|
|
(w.warn(
|
|
"[mp4-remuxer]: regenerate InitSegment as video detected"
|
|
),
|
|
(h = this.generateIS(t, e, n, a))),
|
|
(l = this.remuxVideo(e, v, L, D));
|
|
}
|
|
} else E && (l = this.remuxVideo(e, v, L, 0));
|
|
l &&
|
|
((l.firstKeyFrame = R),
|
|
(l.independent = -1 !== R),
|
|
(l.firstKeyFramePTS = S));
|
|
}
|
|
}
|
|
return (
|
|
this.ISGenerated &&
|
|
this._initPTS &&
|
|
this._initDTS &&
|
|
(r.samples.length &&
|
|
(c = Yi(r, n, this._initPTS, this._initDTS)),
|
|
i.samples.length && (d = Wi(i, n, this._initPTS))),
|
|
{
|
|
audio: u,
|
|
video: l,
|
|
initSegment: h,
|
|
independent: f,
|
|
text: d,
|
|
id3: c,
|
|
}
|
|
);
|
|
}),
|
|
(e.generateIS = function (t, e, r, i) {
|
|
var n,
|
|
a,
|
|
s,
|
|
o = t.samples,
|
|
l = e.samples,
|
|
u = this.typeSupported,
|
|
h = {},
|
|
d = this._initPTS,
|
|
c = !d || i,
|
|
f = "audio/mp4";
|
|
if (
|
|
(c && (n = a = 1 / 0),
|
|
t.config &&
|
|
o.length &&
|
|
((t.timescale = t.samplerate),
|
|
"mp3" === t.segmentCodec &&
|
|
(u.mpeg
|
|
? ((f = "audio/mpeg"), (t.codec = ""))
|
|
: u.mp3 && (t.codec = "mp3")),
|
|
(h.audio = {
|
|
id: "audio",
|
|
container: f,
|
|
codec: t.codec,
|
|
initSegment:
|
|
"mp3" === t.segmentCodec && u.mpeg
|
|
? new Uint8Array(0)
|
|
: Ni.initSegment([t]),
|
|
metadata: { channelCount: t.channelCount },
|
|
}),
|
|
c &&
|
|
((s = t.inputTimeScale),
|
|
d && s === d.timescale
|
|
? (c = !1)
|
|
: (n = a = o[0].pts - Math.round(s * r)))),
|
|
e.sps &&
|
|
e.pps &&
|
|
l.length &&
|
|
((e.timescale = e.inputTimeScale),
|
|
(h.video = {
|
|
id: "main",
|
|
container: "video/mp4",
|
|
codec: e.codec,
|
|
initSegment: Ni.initSegment([e]),
|
|
metadata: { width: e.width, height: e.height },
|
|
}),
|
|
c))
|
|
)
|
|
if (((s = e.inputTimeScale), d && s === d.timescale)) c = !1;
|
|
else {
|
|
var g = this.getVideoStartPts(l),
|
|
v = Math.round(s * r);
|
|
(a = Math.min(a, Vi(l[0].dts, g) - v)),
|
|
(n = Math.min(n, g - v));
|
|
}
|
|
if (Object.keys(h).length)
|
|
return (
|
|
(this.ISGenerated = !0),
|
|
c
|
|
? ((this._initPTS = { baseTime: n, timescale: s }),
|
|
(this._initDTS = { baseTime: a, timescale: s }))
|
|
: (n = s = void 0),
|
|
{ tracks: h, initPTS: n, timescale: s }
|
|
);
|
|
}),
|
|
(e.remuxVideo = function (t, e, r, i) {
|
|
var n,
|
|
a,
|
|
s = t.inputTimeScale,
|
|
l = t.samples,
|
|
u = [],
|
|
h = l.length,
|
|
d = this._initPTS,
|
|
c = this.nextAvcDts,
|
|
f = 8,
|
|
g = this.videoSampleDuration,
|
|
v = Number.POSITIVE_INFINITY,
|
|
m = Number.NEGATIVE_INFINITY,
|
|
p = !1;
|
|
(r && null !== c) ||
|
|
(c = e * s - (l[0].pts - Vi(l[0].dts, l[0].pts)));
|
|
for (var y = (d.baseTime * s) / d.timescale, T = 0; T < h; T++) {
|
|
var E = l[T];
|
|
(E.pts = Vi(E.pts - y, c)),
|
|
(E.dts = Vi(E.dts - y, c)),
|
|
E.dts < l[T > 0 ? T - 1 : T].dts && (p = !0);
|
|
}
|
|
p &&
|
|
l.sort(function (t, e) {
|
|
var r = t.dts - e.dts,
|
|
i = t.pts - e.pts;
|
|
return r || i;
|
|
}),
|
|
(n = l[0].dts);
|
|
var A = (a = l[l.length - 1].dts) - n,
|
|
k = A ? Math.round(A / (h - 1)) : g || t.inputTimeScale / 30;
|
|
if (r) {
|
|
var b = n - c,
|
|
D = b > k,
|
|
I = b < -1;
|
|
if (
|
|
(D || I) &&
|
|
(D
|
|
? w.warn(
|
|
"AVC: " +
|
|
Bi(b, !0) +
|
|
" ms (" +
|
|
b +
|
|
"dts) hole between fragments detected, filling it"
|
|
)
|
|
: w.warn(
|
|
"AVC: " +
|
|
Bi(-b, !0) +
|
|
" ms (" +
|
|
b +
|
|
"dts) overlapping between fragments detected"
|
|
),
|
|
!I || c >= l[0].pts)
|
|
) {
|
|
n = c;
|
|
var C = l[0].pts - b;
|
|
(l[0].dts = n),
|
|
(l[0].pts = C),
|
|
w.log(
|
|
"Video: First PTS/DTS adjusted: " +
|
|
Bi(C, !0) +
|
|
"/" +
|
|
Bi(n, !0) +
|
|
", delta: " +
|
|
Bi(b, !0) +
|
|
" ms"
|
|
);
|
|
}
|
|
}
|
|
n = Math.max(0, n);
|
|
for (var _ = 0, P = 0, x = 0; x < h; x++) {
|
|
for (
|
|
var F = l[x], M = F.units, O = M.length, N = 0, U = 0;
|
|
U < O;
|
|
U++
|
|
)
|
|
N += M[U].data.length;
|
|
(P += N),
|
|
(_ += O),
|
|
(F.length = N),
|
|
(F.dts = Math.max(F.dts, n)),
|
|
(v = Math.min(F.pts, v)),
|
|
(m = Math.max(F.pts, m));
|
|
}
|
|
a = l[h - 1].dts;
|
|
var B,
|
|
G = P + 4 * _ + 8;
|
|
try {
|
|
B = new Uint8Array(G);
|
|
} catch (t) {
|
|
return void this.observer.emit(S.ERROR, S.ERROR, {
|
|
type: L.MUX_ERROR,
|
|
details: R.REMUX_ALLOC_ERROR,
|
|
fatal: !1,
|
|
error: t,
|
|
bytes: G,
|
|
reason: "fail allocating video mdat " + G,
|
|
});
|
|
}
|
|
var K = new DataView(B.buffer);
|
|
K.setUint32(0, G), B.set(Ni.types.mdat, 4);
|
|
for (
|
|
var H = !1,
|
|
V = Number.POSITIVE_INFINITY,
|
|
Y = Number.POSITIVE_INFINITY,
|
|
W = Number.NEGATIVE_INFINITY,
|
|
j = Number.NEGATIVE_INFINITY,
|
|
q = 0;
|
|
q < h;
|
|
q++
|
|
) {
|
|
for (
|
|
var X = l[q], z = X.units, Q = 0, $ = 0, J = z.length;
|
|
$ < J;
|
|
$++
|
|
) {
|
|
var Z = z[$],
|
|
tt = Z.data,
|
|
et = Z.data.byteLength;
|
|
K.setUint32(f, et),
|
|
(f += 4),
|
|
B.set(tt, f),
|
|
(f += et),
|
|
(Q += 4 + et);
|
|
}
|
|
var rt = void 0;
|
|
if (q < h - 1)
|
|
(g = l[q + 1].dts - X.dts), (rt = l[q + 1].pts - X.pts);
|
|
else {
|
|
var it = this.config,
|
|
nt = q > 0 ? X.dts - l[q - 1].dts : k;
|
|
if (
|
|
((rt = q > 0 ? X.pts - l[q - 1].pts : k),
|
|
it.stretchShortVideoTrack && null !== this.nextAudioPts)
|
|
) {
|
|
var at = Math.floor(it.maxBufferHole * s),
|
|
st = (i ? v + i * s : this.nextAudioPts) - X.pts;
|
|
st > at
|
|
? ((g = st - nt) < 0 ? (g = nt) : (H = !0),
|
|
w.log(
|
|
"[mp4-remuxer]: It is approximately " +
|
|
st / 90 +
|
|
" ms to the next segment; using duration " +
|
|
g / 90 +
|
|
" ms for the last video frame."
|
|
))
|
|
: (g = nt);
|
|
} else g = nt;
|
|
}
|
|
var ot = Math.round(X.pts - X.dts);
|
|
(V = Math.min(V, g)),
|
|
(W = Math.max(W, g)),
|
|
(Y = Math.min(Y, rt)),
|
|
(j = Math.max(j, rt)),
|
|
u.push(new qi(X.key, g, Q, ot));
|
|
}
|
|
if (u.length)
|
|
if (Gi) {
|
|
if (Gi < 70) {
|
|
var lt = u[0].flags;
|
|
(lt.dependsOn = 2), (lt.isNonSync = 0);
|
|
}
|
|
} else if (
|
|
Ki &&
|
|
j - Y < W - V &&
|
|
k / W < 0.025 &&
|
|
0 === u[0].cts
|
|
) {
|
|
w.warn(
|
|
"Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration."
|
|
);
|
|
for (var ut = n, ht = 0, dt = u.length; ht < dt; ht++) {
|
|
var ct = ut + u[ht].duration,
|
|
ft = ut + u[ht].cts;
|
|
if (ht < dt - 1) {
|
|
var gt = ct + u[ht + 1].cts;
|
|
u[ht].duration = gt - ft;
|
|
} else u[ht].duration = ht ? u[ht - 1].duration : k;
|
|
(u[ht].cts = 0), (ut = ct);
|
|
}
|
|
}
|
|
(g = H || !g ? k : g),
|
|
(this.nextAvcDts = c = a + g),
|
|
(this.videoSampleDuration = g),
|
|
(this.isVideoContiguous = !0);
|
|
var vt = {
|
|
data1: Ni.moof(t.sequenceNumber++, n, o({}, t, { samples: u })),
|
|
data2: B,
|
|
startPTS: v / s,
|
|
endPTS: (m + g) / s,
|
|
startDTS: n / s,
|
|
endDTS: c / s,
|
|
type: "video",
|
|
hasAudio: !1,
|
|
hasVideo: !0,
|
|
nb: u.length,
|
|
dropped: t.dropped,
|
|
};
|
|
return (t.samples = []), (t.dropped = 0), vt;
|
|
}),
|
|
(e.remuxAudio = function (t, e, r, i, n) {
|
|
var a = t.inputTimeScale,
|
|
s = a / (t.samplerate ? t.samplerate : a),
|
|
l = "aac" === t.segmentCodec ? 1024 : 1152,
|
|
u = l * s,
|
|
h = this._initPTS,
|
|
d = "mp3" === t.segmentCodec && this.typeSupported.mpeg,
|
|
c = [],
|
|
f = void 0 !== n,
|
|
g = t.samples,
|
|
v = d ? 0 : 8,
|
|
m = this.nextAudioPts || -1,
|
|
p = e * a,
|
|
y = (h.baseTime * a) / h.timescale;
|
|
if (
|
|
((this.isAudioContiguous = r =
|
|
r ||
|
|
(g.length &&
|
|
m > 0 &&
|
|
((i && Math.abs(p - m) < 9e3) ||
|
|
Math.abs(Vi(g[0].pts - y, p) - m) < 20 * u))),
|
|
g.forEach(function (t) {
|
|
t.pts = Vi(t.pts - y, p);
|
|
}),
|
|
!r || m < 0)
|
|
) {
|
|
if (
|
|
((g = g.filter(function (t) {
|
|
return t.pts >= 0;
|
|
})),
|
|
!g.length)
|
|
)
|
|
return;
|
|
m = 0 === n ? 0 : i && !f ? Math.max(0, p) : g[0].pts;
|
|
}
|
|
if ("aac" === t.segmentCodec)
|
|
for (
|
|
var T = this.config.maxAudioFramesDrift, E = 0, A = m;
|
|
E < g.length;
|
|
E++
|
|
) {
|
|
var k = g[E],
|
|
b = k.pts,
|
|
D = b - A,
|
|
I = Math.abs((1e3 * D) / a);
|
|
if (D <= -T * u && f)
|
|
0 === E &&
|
|
(w.warn(
|
|
"Audio frame @ " +
|
|
(b / a).toFixed(3) +
|
|
"s overlaps nextAudioPts by " +
|
|
Math.round((1e3 * D) / a) +
|
|
" ms."
|
|
),
|
|
(this.nextAudioPts = m = A = b));
|
|
else if (D >= T * u && I < 1e4 && f) {
|
|
var C = Math.round(D / u);
|
|
(A = b - C * u) < 0 && (C--, (A += u)),
|
|
0 === E && (this.nextAudioPts = m = A),
|
|
w.warn(
|
|
"[mp4-remuxer]: Injecting " +
|
|
C +
|
|
" audio frame @ " +
|
|
(A / a).toFixed(3) +
|
|
"s due to " +
|
|
Math.round((1e3 * D) / a) +
|
|
" ms gap."
|
|
);
|
|
for (var _ = 0; _ < C; _++) {
|
|
var P = Math.max(A, 0),
|
|
x = Mi.getSilentFrame(
|
|
t.manifestCodec || t.codec,
|
|
t.channelCount
|
|
);
|
|
x ||
|
|
(w.log(
|
|
"[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead."
|
|
),
|
|
(x = k.unit.subarray())),
|
|
g.splice(E, 0, { unit: x, pts: P }),
|
|
(A += u),
|
|
E++;
|
|
}
|
|
}
|
|
(k.pts = A), (A += u);
|
|
}
|
|
for (var F, M = null, O = null, N = 0, U = g.length; U--; )
|
|
N += g[U].unit.byteLength;
|
|
for (var B = 0, G = g.length; B < G; B++) {
|
|
var K = g[B],
|
|
H = K.unit,
|
|
V = K.pts;
|
|
if (null !== O) c[B - 1].duration = Math.round((V - O) / s);
|
|
else {
|
|
if (
|
|
(r && "aac" === t.segmentCodec && (V = m),
|
|
(M = V),
|
|
!(N > 0))
|
|
)
|
|
return;
|
|
N += v;
|
|
try {
|
|
F = new Uint8Array(N);
|
|
} catch (t) {
|
|
return void this.observer.emit(S.ERROR, S.ERROR, {
|
|
type: L.MUX_ERROR,
|
|
details: R.REMUX_ALLOC_ERROR,
|
|
fatal: !1,
|
|
error: t,
|
|
bytes: N,
|
|
reason: "fail allocating audio mdat " + N,
|
|
});
|
|
}
|
|
d ||
|
|
(new DataView(F.buffer).setUint32(0, N),
|
|
F.set(Ni.types.mdat, 4));
|
|
}
|
|
F.set(H, v);
|
|
var Y = H.byteLength;
|
|
(v += Y), c.push(new qi(!0, l, Y, 0)), (O = V);
|
|
}
|
|
var W = c.length;
|
|
if (W) {
|
|
var j = c[c.length - 1];
|
|
this.nextAudioPts = m = O + s * j.duration;
|
|
var q = d
|
|
? new Uint8Array(0)
|
|
: Ni.moof(
|
|
t.sequenceNumber++,
|
|
M / s,
|
|
o({}, t, { samples: c })
|
|
);
|
|
t.samples = [];
|
|
var X = M / a,
|
|
z = m / a,
|
|
Q = {
|
|
data1: q,
|
|
data2: F,
|
|
startPTS: X,
|
|
endPTS: z,
|
|
startDTS: X,
|
|
endDTS: z,
|
|
type: "audio",
|
|
hasAudio: !0,
|
|
hasVideo: !1,
|
|
nb: W,
|
|
};
|
|
return (this.isAudioContiguous = !0), Q;
|
|
}
|
|
}),
|
|
(e.remuxEmptyAudio = function (t, e, r, i) {
|
|
var n = t.inputTimeScale,
|
|
a = n / (t.samplerate ? t.samplerate : n),
|
|
s = this.nextAudioPts,
|
|
o = this._initDTS,
|
|
l = (9e4 * o.baseTime) / o.timescale,
|
|
u = (null !== s ? s : i.startDTS * n) + l,
|
|
h = i.endDTS * n + l,
|
|
d = 1024 * a,
|
|
c = Math.ceil((h - u) / d),
|
|
f = Mi.getSilentFrame(
|
|
t.manifestCodec || t.codec,
|
|
t.channelCount
|
|
);
|
|
if ((w.warn("[mp4-remuxer]: remux empty Audio"), f)) {
|
|
for (var g = [], v = 0; v < c; v++) {
|
|
var m = u + v * d;
|
|
g.push({ unit: f, pts: m, dts: m });
|
|
}
|
|
return (t.samples = g), this.remuxAudio(t, e, r, !1);
|
|
}
|
|
w.trace(
|
|
"[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec"
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Vi(t, e) {
|
|
var r;
|
|
if (null === e) return t;
|
|
for (
|
|
r = e < t ? -8589934592 : 8589934592;
|
|
Math.abs(t - e) > 4294967296;
|
|
|
|
)
|
|
t += r;
|
|
return t;
|
|
}
|
|
function Yi(t, e, r, i) {
|
|
var n = t.samples.length;
|
|
if (n) {
|
|
for (var a = t.inputTimeScale, s = 0; s < n; s++) {
|
|
var o = t.samples[s];
|
|
(o.pts = Vi(o.pts - (r.baseTime * a) / r.timescale, e * a) / a),
|
|
(o.dts = Vi(o.dts - (i.baseTime * a) / i.timescale, e * a) / a);
|
|
}
|
|
var l = t.samples;
|
|
return (t.samples = []), { samples: l };
|
|
}
|
|
}
|
|
function Wi(t, e, r) {
|
|
var i = t.samples.length;
|
|
if (i) {
|
|
for (var n = t.inputTimeScale, a = 0; a < i; a++) {
|
|
var s = t.samples[a];
|
|
s.pts = Vi(s.pts - (r.baseTime * n) / r.timescale, e * n) / n;
|
|
}
|
|
t.samples.sort(function (t, e) {
|
|
return t.pts - e.pts;
|
|
});
|
|
var o = t.samples;
|
|
return (t.samples = []), { samples: o };
|
|
}
|
|
}
|
|
var ji,
|
|
qi = function (t, e, r, i) {
|
|
(this.size = void 0),
|
|
(this.duration = void 0),
|
|
(this.cts = void 0),
|
|
(this.flags = void 0),
|
|
(this.duration = e),
|
|
(this.size = r),
|
|
(this.cts = i),
|
|
(this.flags = new Xi(t));
|
|
},
|
|
Xi = function (t) {
|
|
(this.isLeading = 0),
|
|
(this.isDependedOn = 0),
|
|
(this.hasRedundancy = 0),
|
|
(this.degradPrio = 0),
|
|
(this.dependsOn = 1),
|
|
(this.isNonSync = 1),
|
|
(this.dependsOn = t ? 2 : 1),
|
|
(this.isNonSync = t ? 0 : 1);
|
|
},
|
|
zi = (function () {
|
|
function t() {
|
|
(this.emitInitSegment = !1),
|
|
(this.audioCodec = void 0),
|
|
(this.videoCodec = void 0),
|
|
(this.initData = void 0),
|
|
(this.initPTS = null),
|
|
(this.initTracks = void 0),
|
|
(this.lastEndTime = null);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {}),
|
|
(e.resetTimeStamp = function (t) {
|
|
(this.initPTS = t), (this.lastEndTime = null);
|
|
}),
|
|
(e.resetNextTimestamp = function () {
|
|
this.lastEndTime = null;
|
|
}),
|
|
(e.resetInitSegment = function (t, e, r, i) {
|
|
(this.audioCodec = e),
|
|
(this.videoCodec = r),
|
|
this.generateInitSegment(
|
|
(function (t, e) {
|
|
if (!t || !e) return t;
|
|
var r = e.keyId;
|
|
return (
|
|
r &&
|
|
e.isCommonEncryption &&
|
|
It(t, ["moov", "trak"]).forEach(function (t) {
|
|
var e = It(t, [
|
|
"mdia",
|
|
"minf",
|
|
"stbl",
|
|
"stsd",
|
|
])[0].subarray(8),
|
|
i = It(e, ["enca"]),
|
|
n = i.length > 0;
|
|
n || (i = It(e, ["encv"])),
|
|
i.forEach(function (t) {
|
|
It(n ? t.subarray(28) : t.subarray(78), [
|
|
"sinf",
|
|
]).forEach(function (t) {
|
|
var e = _t(t);
|
|
if (e) {
|
|
var i = e.subarray(8, 24);
|
|
i.some(function (t) {
|
|
return 0 !== t;
|
|
}) ||
|
|
(w.log(
|
|
"[eme] Patching keyId in 'enc" +
|
|
(n ? "a" : "v") +
|
|
">sinf>>tenc' box: " +
|
|
Tt(i) +
|
|
" -> " +
|
|
Tt(r)
|
|
),
|
|
e.set(r, 8));
|
|
}
|
|
});
|
|
});
|
|
}),
|
|
t
|
|
);
|
|
})(t, i)
|
|
),
|
|
(this.emitInitSegment = !0);
|
|
}),
|
|
(e.generateInitSegment = function (t) {
|
|
var e = this.audioCodec,
|
|
r = this.videoCodec;
|
|
if (null == t || !t.byteLength)
|
|
return (
|
|
(this.initTracks = void 0), void (this.initData = void 0)
|
|
);
|
|
var i = (this.initData = Ct(t));
|
|
e || (e = Qi(i.audio, O)), r || (r = Qi(i.video, N));
|
|
var n = {};
|
|
i.audio && i.video
|
|
? (n.audiovideo = {
|
|
container: "video/mp4",
|
|
codec: e + "," + r,
|
|
initSegment: t,
|
|
id: "main",
|
|
})
|
|
: i.audio
|
|
? (n.audio = {
|
|
container: "audio/mp4",
|
|
codec: e,
|
|
initSegment: t,
|
|
id: "audio",
|
|
})
|
|
: i.video
|
|
? (n.video = {
|
|
container: "video/mp4",
|
|
codec: r,
|
|
initSegment: t,
|
|
id: "main",
|
|
})
|
|
: w.warn(
|
|
"[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes."
|
|
),
|
|
(this.initTracks = n);
|
|
}),
|
|
(e.remux = function (t, e, r, i, n, a) {
|
|
var s,
|
|
o,
|
|
l = this.initPTS,
|
|
u = this.lastEndTime,
|
|
h = {
|
|
audio: void 0,
|
|
video: void 0,
|
|
text: i,
|
|
id3: r,
|
|
initSegment: void 0,
|
|
};
|
|
E(u) || (u = this.lastEndTime = n || 0);
|
|
var d = e.samples;
|
|
if (null == d || !d.length) return h;
|
|
var c = { initPTS: void 0, timescale: 1 },
|
|
f = this.initData;
|
|
if (
|
|
((null != (s = f) && s.length) ||
|
|
(this.generateInitSegment(d), (f = this.initData)),
|
|
null == (o = f) || !o.length)
|
|
)
|
|
return (
|
|
w.warn(
|
|
"[passthrough-remuxer.ts]: Failed to generate initSegment."
|
|
),
|
|
h
|
|
);
|
|
this.emitInitSegment &&
|
|
((c.tracks = this.initTracks), (this.emitInitSegment = !1));
|
|
var g = (function (t, e) {
|
|
for (
|
|
var r = 0, i = 0, n = 0, a = It(t, ["moof", "traf"]), s = 0;
|
|
s < a.length;
|
|
s++
|
|
) {
|
|
var o = a[s],
|
|
l = It(o, ["tfhd"])[0],
|
|
u = e[kt(l, 4)];
|
|
if (u) {
|
|
var h = u.default,
|
|
d = kt(l, 0) | (null == h ? void 0 : h.flags),
|
|
c = null == h ? void 0 : h.duration;
|
|
8 & d && (c = kt(l, 2 & d ? 12 : 8));
|
|
for (
|
|
var f = u.timescale || 9e4, g = It(o, ["trun"]), v = 0;
|
|
v < g.length;
|
|
v++
|
|
)
|
|
!(r = Pt(g[v])) && c && (r = c * kt(g[v], 4)),
|
|
u.type === N
|
|
? (i += r / f)
|
|
: u.type === O && (n += r / f);
|
|
}
|
|
}
|
|
if (0 === i && 0 === n) {
|
|
for (
|
|
var m = 0, p = It(t, ["sidx"]), y = 0;
|
|
y < p.length;
|
|
y++
|
|
) {
|
|
var T = wt(p[y]);
|
|
null != T &&
|
|
T.references &&
|
|
(m += T.references.reduce(function (t, e) {
|
|
return t + e.info.duration || 0;
|
|
}, 0));
|
|
}
|
|
return m;
|
|
}
|
|
return i || n;
|
|
})(d, f),
|
|
v = (function (t, e) {
|
|
return It(e, ["moof", "traf"]).reduce(function (e, r) {
|
|
var i = It(r, ["tfdt"])[0],
|
|
n = i[0],
|
|
a = It(r, ["tfhd"]).reduce(function (e, r) {
|
|
var a = kt(r, 4),
|
|
s = t[a];
|
|
if (s) {
|
|
var o = kt(i, 4);
|
|
if (1 === n) {
|
|
if (o === Et)
|
|
return (
|
|
w.warn(
|
|
"[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time"
|
|
),
|
|
e
|
|
);
|
|
(o *= Et + 1), (o += kt(i, 8));
|
|
}
|
|
var l = o / (s.timescale || 9e4);
|
|
if (isFinite(l) && (null === e || l < e)) return l;
|
|
}
|
|
return e;
|
|
}, null);
|
|
return null !== a && isFinite(a) && (null === e || a < e)
|
|
? a
|
|
: e;
|
|
}, null);
|
|
})(f, d),
|
|
m = null === v ? n : v;
|
|
((function (t, e, r, i) {
|
|
if (null === t) return !0;
|
|
var n = Math.max(i, 1),
|
|
a = e - t.baseTime / t.timescale;
|
|
return Math.abs(a - r) > n;
|
|
})(l, m, n, g) ||
|
|
(c.timescale !== l.timescale && a)) &&
|
|
((c.initPTS = m - n),
|
|
l &&
|
|
1 === l.timescale &&
|
|
w.warn("Adjusting initPTS by " + (c.initPTS - l.baseTime)),
|
|
(this.initPTS = l = { baseTime: c.initPTS, timescale: 1 }));
|
|
var p = t ? m - l.baseTime / l.timescale : u,
|
|
y = p + g;
|
|
!(function (t, e, r) {
|
|
It(e, ["moof", "traf"]).forEach(function (e) {
|
|
It(e, ["tfhd"]).forEach(function (i) {
|
|
var n = kt(i, 4),
|
|
a = t[n];
|
|
if (a) {
|
|
var s = a.timescale || 9e4;
|
|
It(e, ["tfdt"]).forEach(function (t) {
|
|
var e = t[0],
|
|
i = kt(t, 4);
|
|
if (0 === e)
|
|
(i -= r * s), Dt(t, 4, (i = Math.max(i, 0)));
|
|
else {
|
|
(i *= Math.pow(2, 32)),
|
|
(i += kt(t, 8)),
|
|
(i -= r * s),
|
|
(i = Math.max(i, 0));
|
|
var n = Math.floor(i / (Et + 1)),
|
|
a = Math.floor(i % (Et + 1));
|
|
Dt(t, 4, n), Dt(t, 8, a);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
})(f, d, l.baseTime / l.timescale),
|
|
g > 0
|
|
? (this.lastEndTime = y)
|
|
: (w.warn(
|
|
"Duration parsed from mp4 should be greater than zero"
|
|
),
|
|
this.resetNextTimestamp());
|
|
var T = !!f.audio,
|
|
S = !!f.video,
|
|
L = "";
|
|
T && (L += "audio"), S && (L += "video");
|
|
var R = {
|
|
data1: d,
|
|
startPTS: p,
|
|
startDTS: p,
|
|
endPTS: y,
|
|
endDTS: y,
|
|
type: L,
|
|
hasAudio: T,
|
|
hasVideo: S,
|
|
nb: 1,
|
|
dropped: 0,
|
|
};
|
|
return (
|
|
(h.audio = "audio" === R.type ? R : void 0),
|
|
(h.video = "audio" !== R.type ? R : void 0),
|
|
(h.initSegment = c),
|
|
(h.id3 = Yi(r, n, l, l)),
|
|
i.samples.length && (h.text = Wi(i, n, l)),
|
|
h
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Qi(t, e) {
|
|
var r = null == t ? void 0 : t.codec;
|
|
return r && r.length > 4
|
|
? r
|
|
: "hvc1" === r || "hev1" === r
|
|
? "hvc1.1.6.L120.90"
|
|
: "av01" === r
|
|
? "av01.0.04M.08"
|
|
: "avc1" === r || e === N
|
|
? "avc1.42e01e"
|
|
: "mp4a.40.5";
|
|
}
|
|
try {
|
|
ji = self.performance.now.bind(self.performance);
|
|
} catch (t) {
|
|
w.debug("Unable to use Performance API on this environment"),
|
|
(ji = "undefined" != typeof self && self.Date.now);
|
|
}
|
|
var $i = [
|
|
{ demux: fi, remux: zi },
|
|
{ demux: Di, remux: Hi },
|
|
{ demux: di, remux: Hi },
|
|
{ demux: Fi, remux: Hi },
|
|
],
|
|
Ji = (function () {
|
|
function t(t, e, r, i, n) {
|
|
(this.async = !1),
|
|
(this.observer = void 0),
|
|
(this.typeSupported = void 0),
|
|
(this.config = void 0),
|
|
(this.vendor = void 0),
|
|
(this.id = void 0),
|
|
(this.demuxer = void 0),
|
|
(this.remuxer = void 0),
|
|
(this.decrypter = void 0),
|
|
(this.probe = void 0),
|
|
(this.decryptionPromise = null),
|
|
(this.transmuxConfig = void 0),
|
|
(this.currentTransmuxState = void 0),
|
|
(this.observer = t),
|
|
(this.typeSupported = e),
|
|
(this.config = r),
|
|
(this.vendor = i),
|
|
(this.id = n);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.configure = function (t) {
|
|
(this.transmuxConfig = t),
|
|
this.decrypter && this.decrypter.reset();
|
|
}),
|
|
(e.push = function (t, e, r, i) {
|
|
var n = this,
|
|
a = r.transmuxing;
|
|
a.executeStart = ji();
|
|
var s = new Uint8Array(t),
|
|
o = this.currentTransmuxState,
|
|
l = this.transmuxConfig;
|
|
i && (this.currentTransmuxState = i);
|
|
var u = i || o,
|
|
h = u.contiguous,
|
|
d = u.discontinuity,
|
|
c = u.trackSwitch,
|
|
f = u.accurateTimeOffset,
|
|
g = u.timeOffset,
|
|
v = u.initSegmentChange,
|
|
m = l.audioCodec,
|
|
p = l.videoCodec,
|
|
y = l.defaultInitPts,
|
|
T = l.duration,
|
|
E = l.initSegmentData,
|
|
A = (function (t, e) {
|
|
var r = null;
|
|
return (
|
|
t.byteLength > 0 &&
|
|
null != e &&
|
|
null != e.key &&
|
|
null !== e.iv &&
|
|
null != e.method &&
|
|
(r = e),
|
|
r
|
|
);
|
|
})(s, e);
|
|
if (A && "AES-128" === A.method) {
|
|
var k = this.getDecrypter();
|
|
if (!k.isSync())
|
|
return (
|
|
(this.decryptionPromise = k
|
|
.webCryptoDecrypt(s, A.key.buffer, A.iv.buffer)
|
|
.then(function (t) {
|
|
var e = n.push(t, null, r);
|
|
return (n.decryptionPromise = null), e;
|
|
})),
|
|
this.decryptionPromise
|
|
);
|
|
var b = k.softwareDecrypt(s, A.key.buffer, A.iv.buffer);
|
|
if ((r.part > -1 && (b = k.flush()), !b))
|
|
return (a.executeEnd = ji()), Zi(r);
|
|
s = new Uint8Array(b);
|
|
}
|
|
var D = this.needsProbing(d, c);
|
|
if (D) {
|
|
var I = this.configureTransmuxer(s);
|
|
if (I)
|
|
return (
|
|
w.warn("[transmuxer] " + I.message),
|
|
this.observer.emit(S.ERROR, S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
fatal: !1,
|
|
error: I,
|
|
reason: I.message,
|
|
}),
|
|
(a.executeEnd = ji()),
|
|
Zi(r)
|
|
);
|
|
}
|
|
(d || c || v || D) && this.resetInitSegment(E, m, p, T, e),
|
|
(d || v || D) && this.resetInitialTimestamp(y),
|
|
h || this.resetContiguity();
|
|
var C = this.transmux(s, A, g, f, r),
|
|
_ = this.currentTransmuxState;
|
|
return (
|
|
(_.contiguous = !0),
|
|
(_.discontinuity = !1),
|
|
(_.trackSwitch = !1),
|
|
(a.executeEnd = ji()),
|
|
C
|
|
);
|
|
}),
|
|
(e.flush = function (t) {
|
|
var e = this,
|
|
r = t.transmuxing;
|
|
r.executeStart = ji();
|
|
var i = this.decrypter,
|
|
n = this.currentTransmuxState,
|
|
a = this.decryptionPromise;
|
|
if (a)
|
|
return a.then(function () {
|
|
return e.flush(t);
|
|
});
|
|
var s = [],
|
|
o = n.timeOffset;
|
|
if (i) {
|
|
var l = i.flush();
|
|
l && s.push(this.push(l, null, t));
|
|
}
|
|
var u = this.demuxer,
|
|
h = this.remuxer;
|
|
if (!u || !h) return (r.executeEnd = ji()), [Zi(t)];
|
|
var d = u.flush(o);
|
|
return tn(d)
|
|
? d.then(function (r) {
|
|
return e.flushRemux(s, r, t), s;
|
|
})
|
|
: (this.flushRemux(s, d, t), s);
|
|
}),
|
|
(e.flushRemux = function (t, e, r) {
|
|
var i = e.audioTrack,
|
|
n = e.videoTrack,
|
|
a = e.id3Track,
|
|
s = e.textTrack,
|
|
o = this.currentTransmuxState,
|
|
l = o.accurateTimeOffset,
|
|
u = o.timeOffset;
|
|
w.log(
|
|
"[transmuxer.ts]: Flushed fragment " +
|
|
r.sn +
|
|
(r.part > -1 ? " p: " + r.part : "") +
|
|
" of level " +
|
|
r.level
|
|
);
|
|
var h = this.remuxer.remux(i, n, a, s, u, l, !0, this.id);
|
|
t.push({ remuxResult: h, chunkMeta: r }),
|
|
(r.transmuxing.executeEnd = ji());
|
|
}),
|
|
(e.resetInitialTimestamp = function (t) {
|
|
var e = this.demuxer,
|
|
r = this.remuxer;
|
|
e && r && (e.resetTimeStamp(t), r.resetTimeStamp(t));
|
|
}),
|
|
(e.resetContiguity = function () {
|
|
var t = this.demuxer,
|
|
e = this.remuxer;
|
|
t && e && (t.resetContiguity(), e.resetNextTimestamp());
|
|
}),
|
|
(e.resetInitSegment = function (t, e, r, i, n) {
|
|
var a = this.demuxer,
|
|
s = this.remuxer;
|
|
a &&
|
|
s &&
|
|
(a.resetInitSegment(t, e, r, i),
|
|
s.resetInitSegment(t, e, r, n));
|
|
}),
|
|
(e.destroy = function () {
|
|
this.demuxer && (this.demuxer.destroy(), (this.demuxer = void 0)),
|
|
this.remuxer &&
|
|
(this.remuxer.destroy(), (this.remuxer = void 0));
|
|
}),
|
|
(e.transmux = function (t, e, r, i, n) {
|
|
return e && "SAMPLE-AES" === e.method
|
|
? this.transmuxSampleAes(t, e, r, i, n)
|
|
: this.transmuxUnencrypted(t, r, i, n);
|
|
}),
|
|
(e.transmuxUnencrypted = function (t, e, r, i) {
|
|
var n = this.demuxer.demux(t, e, !1, !this.config.progressive),
|
|
a = n.audioTrack,
|
|
s = n.videoTrack,
|
|
o = n.id3Track,
|
|
l = n.textTrack;
|
|
return {
|
|
remuxResult: this.remuxer.remux(a, s, o, l, e, r, !1, this.id),
|
|
chunkMeta: i,
|
|
};
|
|
}),
|
|
(e.transmuxSampleAes = function (t, e, r, i, n) {
|
|
var a = this;
|
|
return this.demuxer.demuxSampleAes(t, e, r).then(function (t) {
|
|
return {
|
|
remuxResult: a.remuxer.remux(
|
|
t.audioTrack,
|
|
t.videoTrack,
|
|
t.id3Track,
|
|
t.textTrack,
|
|
r,
|
|
i,
|
|
!1,
|
|
a.id
|
|
),
|
|
chunkMeta: n,
|
|
};
|
|
});
|
|
}),
|
|
(e.configureTransmuxer = function (t) {
|
|
for (
|
|
var e,
|
|
r = this.config,
|
|
i = this.observer,
|
|
n = this.typeSupported,
|
|
a = this.vendor,
|
|
s = 0,
|
|
o = $i.length;
|
|
s < o;
|
|
s++
|
|
)
|
|
if ($i[s].demux.probe(t)) {
|
|
e = $i[s];
|
|
break;
|
|
}
|
|
if (!e)
|
|
return new Error(
|
|
"Failed to find demuxer by probing fragment data"
|
|
);
|
|
var l = this.demuxer,
|
|
u = this.remuxer,
|
|
h = e.remux,
|
|
d = e.demux;
|
|
(u && u instanceof h) || (this.remuxer = new h(i, r, n, a)),
|
|
(l && l instanceof d) ||
|
|
((this.demuxer = new d(i, r, n)), (this.probe = d.probe));
|
|
}),
|
|
(e.needsProbing = function (t, e) {
|
|
return !this.demuxer || !this.remuxer || t || e;
|
|
}),
|
|
(e.getDecrypter = function () {
|
|
var t = this.decrypter;
|
|
return t || (t = this.decrypter = new Ur(this.config)), t;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Zi = function (t) {
|
|
return { remuxResult: {}, chunkMeta: t };
|
|
};
|
|
function tn(t) {
|
|
return "then" in t && t.then instanceof Function;
|
|
}
|
|
var en = function (t, e, r, i, n) {
|
|
(this.audioCodec = void 0),
|
|
(this.videoCodec = void 0),
|
|
(this.initSegmentData = void 0),
|
|
(this.duration = void 0),
|
|
(this.defaultInitPts = void 0),
|
|
(this.audioCodec = t),
|
|
(this.videoCodec = e),
|
|
(this.initSegmentData = r),
|
|
(this.duration = i),
|
|
(this.defaultInitPts = n || null);
|
|
},
|
|
rn = function (t, e, r, i, n, a) {
|
|
(this.discontinuity = void 0),
|
|
(this.contiguous = void 0),
|
|
(this.accurateTimeOffset = void 0),
|
|
(this.trackSwitch = void 0),
|
|
(this.timeOffset = void 0),
|
|
(this.initSegmentChange = void 0),
|
|
(this.discontinuity = t),
|
|
(this.contiguous = e),
|
|
(this.accurateTimeOffset = r),
|
|
(this.trackSwitch = i),
|
|
(this.timeOffset = n),
|
|
(this.initSegmentChange = a);
|
|
},
|
|
nn = { exports: {} };
|
|
!(function (t) {
|
|
var e = Object.prototype.hasOwnProperty,
|
|
r = "~";
|
|
function i() {}
|
|
function n(t, e, r) {
|
|
(this.fn = t), (this.context = e), (this.once = r || !1);
|
|
}
|
|
function a(t, e, i, a, s) {
|
|
if ("function" != typeof i)
|
|
throw new TypeError("The listener must be a function");
|
|
var o = new n(i, a || t, s),
|
|
l = r ? r + e : e;
|
|
return (
|
|
t._events[l]
|
|
? t._events[l].fn
|
|
? (t._events[l] = [t._events[l], o])
|
|
: t._events[l].push(o)
|
|
: ((t._events[l] = o), t._eventsCount++),
|
|
t
|
|
);
|
|
}
|
|
function s(t, e) {
|
|
0 == --t._eventsCount ? (t._events = new i()) : delete t._events[e];
|
|
}
|
|
function o() {
|
|
(this._events = new i()), (this._eventsCount = 0);
|
|
}
|
|
Object.create &&
|
|
((i.prototype = Object.create(null)), new i().__proto__ || (r = !1)),
|
|
(o.prototype.eventNames = function () {
|
|
var t,
|
|
i,
|
|
n = [];
|
|
if (0 === this._eventsCount) return n;
|
|
for (i in (t = this._events))
|
|
e.call(t, i) && n.push(r ? i.slice(1) : i);
|
|
return Object.getOwnPropertySymbols
|
|
? n.concat(Object.getOwnPropertySymbols(t))
|
|
: n;
|
|
}),
|
|
(o.prototype.listeners = function (t) {
|
|
var e = r ? r + t : t,
|
|
i = this._events[e];
|
|
if (!i) return [];
|
|
if (i.fn) return [i.fn];
|
|
for (var n = 0, a = i.length, s = new Array(a); n < a; n++)
|
|
s[n] = i[n].fn;
|
|
return s;
|
|
}),
|
|
(o.prototype.listenerCount = function (t) {
|
|
var e = r ? r + t : t,
|
|
i = this._events[e];
|
|
return i ? (i.fn ? 1 : i.length) : 0;
|
|
}),
|
|
(o.prototype.emit = function (t, e, i, n, a, s) {
|
|
var o = r ? r + t : t;
|
|
if (!this._events[o]) return !1;
|
|
var l,
|
|
u,
|
|
h = this._events[o],
|
|
d = arguments.length;
|
|
if (h.fn) {
|
|
switch ((h.once && this.removeListener(t, h.fn, void 0, !0), d)) {
|
|
case 1:
|
|
return h.fn.call(h.context), !0;
|
|
case 2:
|
|
return h.fn.call(h.context, e), !0;
|
|
case 3:
|
|
return h.fn.call(h.context, e, i), !0;
|
|
case 4:
|
|
return h.fn.call(h.context, e, i, n), !0;
|
|
case 5:
|
|
return h.fn.call(h.context, e, i, n, a), !0;
|
|
case 6:
|
|
return h.fn.call(h.context, e, i, n, a, s), !0;
|
|
}
|
|
for (u = 1, l = new Array(d - 1); u < d; u++)
|
|
l[u - 1] = arguments[u];
|
|
h.fn.apply(h.context, l);
|
|
} else {
|
|
var c,
|
|
f = h.length;
|
|
for (u = 0; u < f; u++)
|
|
switch (
|
|
(h[u].once && this.removeListener(t, h[u].fn, void 0, !0), d)
|
|
) {
|
|
case 1:
|
|
h[u].fn.call(h[u].context);
|
|
break;
|
|
case 2:
|
|
h[u].fn.call(h[u].context, e);
|
|
break;
|
|
case 3:
|
|
h[u].fn.call(h[u].context, e, i);
|
|
break;
|
|
case 4:
|
|
h[u].fn.call(h[u].context, e, i, n);
|
|
break;
|
|
default:
|
|
if (!l)
|
|
for (c = 1, l = new Array(d - 1); c < d; c++)
|
|
l[c - 1] = arguments[c];
|
|
h[u].fn.apply(h[u].context, l);
|
|
}
|
|
}
|
|
return !0;
|
|
}),
|
|
(o.prototype.on = function (t, e, r) {
|
|
return a(this, t, e, r, !1);
|
|
}),
|
|
(o.prototype.once = function (t, e, r) {
|
|
return a(this, t, e, r, !0);
|
|
}),
|
|
(o.prototype.removeListener = function (t, e, i, n) {
|
|
var a = r ? r + t : t;
|
|
if (!this._events[a]) return this;
|
|
if (!e) return s(this, a), this;
|
|
var o = this._events[a];
|
|
if (o.fn)
|
|
o.fn !== e ||
|
|
(n && !o.once) ||
|
|
(i && o.context !== i) ||
|
|
s(this, a);
|
|
else {
|
|
for (var l = 0, u = [], h = o.length; l < h; l++)
|
|
(o[l].fn !== e ||
|
|
(n && !o[l].once) ||
|
|
(i && o[l].context !== i)) &&
|
|
u.push(o[l]);
|
|
u.length
|
|
? (this._events[a] = 1 === u.length ? u[0] : u)
|
|
: s(this, a);
|
|
}
|
|
return this;
|
|
}),
|
|
(o.prototype.removeAllListeners = function (t) {
|
|
var e;
|
|
return (
|
|
t
|
|
? ((e = r ? r + t : t), this._events[e] && s(this, e))
|
|
: ((this._events = new i()), (this._eventsCount = 0)),
|
|
this
|
|
);
|
|
}),
|
|
(o.prototype.off = o.prototype.removeListener),
|
|
(o.prototype.addListener = o.prototype.on),
|
|
(o.prefixed = r),
|
|
(o.EventEmitter = o),
|
|
(t.exports = o);
|
|
})(nn);
|
|
var an = p(nn.exports);
|
|
function sn(t, e) {
|
|
if (
|
|
!(
|
|
(r = e.remuxResult).audio ||
|
|
r.video ||
|
|
r.text ||
|
|
r.id3 ||
|
|
r.initSegment
|
|
)
|
|
)
|
|
return !1;
|
|
var r,
|
|
i = [],
|
|
n = e.remuxResult,
|
|
a = n.audio,
|
|
s = n.video;
|
|
return (
|
|
a && on(i, a),
|
|
s && on(i, s),
|
|
t.postMessage({ event: "transmuxComplete", data: e }, i),
|
|
!0
|
|
);
|
|
}
|
|
function on(t, e) {
|
|
e.data1 && t.push(e.data1.buffer), e.data2 && t.push(e.data2.buffer);
|
|
}
|
|
function ln(t, e, r) {
|
|
e.reduce(function (e, r) {
|
|
return sn(t, r) || e;
|
|
}, !1) || t.postMessage({ event: "transmuxComplete", data: e[0] }),
|
|
t.postMessage({ event: "flush", data: r });
|
|
}
|
|
void 0 !== e &&
|
|
e &&
|
|
(function (t) {
|
|
var e = new an(),
|
|
r = function (e, r) {
|
|
t.postMessage({ event: e, data: r });
|
|
};
|
|
e.on(S.FRAG_DECRYPTED, r), e.on(S.ERROR, r);
|
|
var i = function () {
|
|
var t = function (t) {
|
|
var e = function (e) {
|
|
r("workerLog", { logType: t, message: e });
|
|
};
|
|
w[t] = e;
|
|
};
|
|
for (var e in w) t(e);
|
|
};
|
|
t.addEventListener("message", function (n) {
|
|
var a = n.data;
|
|
switch (a.cmd) {
|
|
case "init":
|
|
var s = JSON.parse(a.config);
|
|
(t.transmuxer = new Ji(e, a.typeSupported, s, a.vendor, a.id)),
|
|
I(s.debug, a.id),
|
|
i(),
|
|
r("init", null);
|
|
break;
|
|
case "configure":
|
|
t.transmuxer.configure(a.config);
|
|
break;
|
|
case "demux":
|
|
var o = t.transmuxer.push(
|
|
a.data,
|
|
a.decryptdata,
|
|
a.chunkMeta,
|
|
a.state
|
|
);
|
|
tn(o)
|
|
? ((t.transmuxer.async = !0),
|
|
o
|
|
.then(function (e) {
|
|
sn(t, e);
|
|
})
|
|
.catch(function (t) {
|
|
r(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
chunkMeta: a.chunkMeta,
|
|
fatal: !1,
|
|
error: t,
|
|
err: t,
|
|
reason: "transmuxer-worker push error",
|
|
});
|
|
}))
|
|
: ((t.transmuxer.async = !1), sn(t, o));
|
|
break;
|
|
case "flush":
|
|
var l = a.chunkMeta,
|
|
u = t.transmuxer.flush(l);
|
|
tn(u) || t.transmuxer.async
|
|
? (tn(u) || (u = Promise.resolve(u)),
|
|
u
|
|
.then(function (e) {
|
|
ln(t, e, l);
|
|
})
|
|
.catch(function (t) {
|
|
r(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
chunkMeta: a.chunkMeta,
|
|
fatal: !1,
|
|
error: t,
|
|
err: t,
|
|
reason: "transmuxer-worker flush error",
|
|
});
|
|
}))
|
|
: ln(t, u, l);
|
|
}
|
|
});
|
|
})(self);
|
|
var un = qt() || {
|
|
isTypeSupported: function () {
|
|
return !1;
|
|
},
|
|
},
|
|
hn = (function () {
|
|
function e(e, r, i, n) {
|
|
var a = this;
|
|
(this.error = null),
|
|
(this.hls = void 0),
|
|
(this.id = void 0),
|
|
(this.observer = void 0),
|
|
(this.frag = null),
|
|
(this.part = null),
|
|
(this.useWorker = void 0),
|
|
(this.workerContext = null),
|
|
(this.onwmsg = void 0),
|
|
(this.transmuxer = null),
|
|
(this.onTransmuxComplete = void 0),
|
|
(this.onFlush = void 0);
|
|
var s = e.config;
|
|
(this.hls = e),
|
|
(this.id = r),
|
|
(this.useWorker = !!s.enableWorker),
|
|
(this.onTransmuxComplete = i),
|
|
(this.onFlush = n);
|
|
var o = function (t, e) {
|
|
((e = e || {}).frag = a.frag),
|
|
(e.id = a.id),
|
|
t === S.ERROR && (a.error = e.error),
|
|
a.hls.trigger(t, e);
|
|
};
|
|
(this.observer = new an()),
|
|
this.observer.on(S.FRAG_DECRYPTED, o),
|
|
this.observer.on(S.ERROR, o);
|
|
var l,
|
|
u,
|
|
h,
|
|
d,
|
|
c = {
|
|
mp4: un.isTypeSupported("video/mp4"),
|
|
mpeg: un.isTypeSupported("audio/mpeg"),
|
|
mp3: un.isTypeSupported('audio/mp4; codecs="mp3"'),
|
|
},
|
|
f = navigator.vendor;
|
|
if (
|
|
!this.useWorker ||
|
|
"undefined" == typeof Worker ||
|
|
(s.workerPath, 0)
|
|
)
|
|
this.transmuxer = new Ji(this.observer, c, s, f, r);
|
|
else
|
|
try {
|
|
s.workerPath
|
|
? (w.log(
|
|
"loading Web Worker " + s.workerPath + ' for "' + r + '"'
|
|
),
|
|
(this.workerContext =
|
|
((h = s.workerPath),
|
|
(d = new self.URL(h, self.location.href).href),
|
|
{ worker: new self.Worker(d), scriptURL: d })))
|
|
: (w.log('injecting Web Worker for "' + r + '"'),
|
|
(this.workerContext =
|
|
((l = new self.Blob(
|
|
[
|
|
"var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" +
|
|
t.toString() +
|
|
")(true);",
|
|
],
|
|
{ type: "text/javascript" }
|
|
)),
|
|
(u = self.URL.createObjectURL(l)),
|
|
{ worker: new self.Worker(u), objectURL: u }))),
|
|
(this.onwmsg = function (t) {
|
|
return a.onWorkerMessage(t);
|
|
});
|
|
var g = this.workerContext.worker;
|
|
g.addEventListener("message", this.onwmsg),
|
|
(g.onerror = function (t) {
|
|
var e = new Error(
|
|
t.message + " (" + t.filename + ":" + t.lineno + ")"
|
|
);
|
|
(s.enableWorker = !1),
|
|
w.warn(
|
|
'Error in "' + r + '" Web Worker, fallback to inline'
|
|
),
|
|
a.hls.trigger(S.ERROR, {
|
|
type: L.OTHER_ERROR,
|
|
details: R.INTERNAL_EXCEPTION,
|
|
fatal: !1,
|
|
event: "demuxerWorker",
|
|
error: e,
|
|
});
|
|
}),
|
|
g.postMessage({
|
|
cmd: "init",
|
|
typeSupported: c,
|
|
vendor: f,
|
|
id: r,
|
|
config: JSON.stringify(s),
|
|
});
|
|
} catch (t) {
|
|
w.warn(
|
|
'Error setting up "' + r + '" Web Worker, fallback to inline',
|
|
t
|
|
),
|
|
this.resetWorker(),
|
|
(this.error = null),
|
|
(this.transmuxer = new Ji(this.observer, c, s, f, r));
|
|
}
|
|
}
|
|
var r = e.prototype;
|
|
return (
|
|
(r.resetWorker = function () {
|
|
if (this.workerContext) {
|
|
var t = this.workerContext,
|
|
e = t.worker,
|
|
r = t.objectURL;
|
|
r && self.URL.revokeObjectURL(r),
|
|
e.removeEventListener("message", this.onwmsg),
|
|
(e.onerror = null),
|
|
e.terminate(),
|
|
(this.workerContext = null);
|
|
}
|
|
}),
|
|
(r.destroy = function () {
|
|
if (this.workerContext)
|
|
this.resetWorker(), (this.onwmsg = void 0);
|
|
else {
|
|
var t = this.transmuxer;
|
|
t && (t.destroy(), (this.transmuxer = null));
|
|
}
|
|
var e = this.observer;
|
|
e && e.removeAllListeners(),
|
|
(this.frag = null),
|
|
(this.observer = null),
|
|
(this.hls = null);
|
|
}),
|
|
(r.push = function (t, e, r, i, n, a, s, o, l, u) {
|
|
var h,
|
|
d,
|
|
c = this;
|
|
l.transmuxing.start = self.performance.now();
|
|
var f = this.transmuxer,
|
|
g = a ? a.start : n.start,
|
|
v = n.decryptdata,
|
|
m = this.frag,
|
|
p = !(m && n.cc === m.cc),
|
|
y = !(m && l.level === m.level),
|
|
T = m ? l.sn - m.sn : -1,
|
|
E = this.part ? l.part - this.part.index : -1,
|
|
S =
|
|
0 === T &&
|
|
l.id > 1 &&
|
|
l.id === (null == m ? void 0 : m.stats.chunkCount),
|
|
L = !y && (1 === T || (0 === T && (1 === E || (S && E <= 0)))),
|
|
R = self.performance.now();
|
|
(y || T || 0 === n.stats.parsing.start) &&
|
|
(n.stats.parsing.start = R),
|
|
!a || (!E && L) || (a.stats.parsing.start = R);
|
|
var A = !(
|
|
m &&
|
|
(null == (h = n.initSegment) ? void 0 : h.url) ===
|
|
(null == (d = m.initSegment) ? void 0 : d.url)
|
|
),
|
|
k = new rn(p, L, o, y, g, A);
|
|
if (!L || p || A) {
|
|
w.log(
|
|
"[transmuxer-interface, " +
|
|
n.type +
|
|
"]: Starting new transmux session for sn: " +
|
|
l.sn +
|
|
" p: " +
|
|
l.part +
|
|
" level: " +
|
|
l.level +
|
|
" id: " +
|
|
l.id +
|
|
"\n discontinuity: " +
|
|
p +
|
|
"\n trackSwitch: " +
|
|
y +
|
|
"\n contiguous: " +
|
|
L +
|
|
"\n accurateTimeOffset: " +
|
|
o +
|
|
"\n timeOffset: " +
|
|
g +
|
|
"\n initSegmentChange: " +
|
|
A
|
|
);
|
|
var b = new en(r, i, e, s, u);
|
|
this.configureTransmuxer(b);
|
|
}
|
|
if (((this.frag = n), (this.part = a), this.workerContext))
|
|
this.workerContext.worker.postMessage(
|
|
{
|
|
cmd: "demux",
|
|
data: t,
|
|
decryptdata: v,
|
|
chunkMeta: l,
|
|
state: k,
|
|
},
|
|
t instanceof ArrayBuffer ? [t] : []
|
|
);
|
|
else if (f) {
|
|
var D = f.push(t, v, l, k);
|
|
tn(D)
|
|
? ((f.async = !0),
|
|
D.then(function (t) {
|
|
c.handleTransmuxComplete(t);
|
|
}).catch(function (t) {
|
|
c.transmuxerError(
|
|
t,
|
|
l,
|
|
"transmuxer-interface push error"
|
|
);
|
|
}))
|
|
: ((f.async = !1), this.handleTransmuxComplete(D));
|
|
}
|
|
}),
|
|
(r.flush = function (t) {
|
|
var e = this;
|
|
t.transmuxing.start = self.performance.now();
|
|
var r = this.transmuxer;
|
|
if (this.workerContext)
|
|
this.workerContext.worker.postMessage({
|
|
cmd: "flush",
|
|
chunkMeta: t,
|
|
});
|
|
else if (r) {
|
|
var i = r.flush(t);
|
|
tn(i) || r.async
|
|
? (tn(i) || (i = Promise.resolve(i)),
|
|
i
|
|
.then(function (r) {
|
|
e.handleFlushResult(r, t);
|
|
})
|
|
.catch(function (r) {
|
|
e.transmuxerError(
|
|
r,
|
|
t,
|
|
"transmuxer-interface flush error"
|
|
);
|
|
}))
|
|
: this.handleFlushResult(i, t);
|
|
}
|
|
}),
|
|
(r.transmuxerError = function (t, e, r) {
|
|
this.hls &&
|
|
((this.error = t),
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_PARSING_ERROR,
|
|
chunkMeta: e,
|
|
fatal: !1,
|
|
error: t,
|
|
err: t,
|
|
reason: r,
|
|
}));
|
|
}),
|
|
(r.handleFlushResult = function (t, e) {
|
|
var r = this;
|
|
t.forEach(function (t) {
|
|
r.handleTransmuxComplete(t);
|
|
}),
|
|
this.onFlush(e);
|
|
}),
|
|
(r.onWorkerMessage = function (t) {
|
|
var e = t.data,
|
|
r = this.hls;
|
|
switch (e.event) {
|
|
case "init":
|
|
var i,
|
|
n = null == (i = this.workerContext) ? void 0 : i.objectURL;
|
|
n && self.URL.revokeObjectURL(n);
|
|
break;
|
|
case "transmuxComplete":
|
|
this.handleTransmuxComplete(e.data);
|
|
break;
|
|
case "flush":
|
|
this.onFlush(e.data);
|
|
break;
|
|
case "workerLog":
|
|
w[e.data.logType] && w[e.data.logType](e.data.message);
|
|
break;
|
|
default:
|
|
(e.data = e.data || {}),
|
|
(e.data.frag = this.frag),
|
|
(e.data.id = this.id),
|
|
r.trigger(e.event, e.data);
|
|
}
|
|
}),
|
|
(r.configureTransmuxer = function (t) {
|
|
var e = this.transmuxer;
|
|
this.workerContext
|
|
? this.workerContext.worker.postMessage({
|
|
cmd: "configure",
|
|
config: t,
|
|
})
|
|
: e && e.configure(t);
|
|
}),
|
|
(r.handleTransmuxComplete = function (t) {
|
|
(t.chunkMeta.transmuxing.end = self.performance.now()),
|
|
this.onTransmuxComplete(t);
|
|
}),
|
|
e
|
|
);
|
|
})(),
|
|
dn = (function () {
|
|
function t(t, e, r, i) {
|
|
(this.config = void 0),
|
|
(this.media = null),
|
|
(this.fragmentTracker = void 0),
|
|
(this.hls = void 0),
|
|
(this.nudgeRetry = 0),
|
|
(this.stallReported = !1),
|
|
(this.stalled = null),
|
|
(this.moved = !1),
|
|
(this.seeking = !1),
|
|
(this.config = t),
|
|
(this.media = e),
|
|
(this.fragmentTracker = r),
|
|
(this.hls = i);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
(this.media = null), (this.hls = this.fragmentTracker = null);
|
|
}),
|
|
(e.poll = function (t, e) {
|
|
var r = this.config,
|
|
i = this.media,
|
|
n = this.stalled;
|
|
if (null !== i) {
|
|
var a = i.currentTime,
|
|
s = i.seeking,
|
|
o = this.seeking && !s,
|
|
l = !this.seeking && s;
|
|
if (((this.seeking = s), a === t)) {
|
|
if (l || o) this.stalled = null;
|
|
else if (
|
|
!((i.paused && !s) || i.ended || 0 === i.playbackRate) &&
|
|
Ir.getBuffered(i).length
|
|
) {
|
|
var u = Ir.bufferInfo(i, a, 0),
|
|
h = u.len > 0,
|
|
d = u.nextStart || 0;
|
|
if (h || d) {
|
|
if (s) {
|
|
var c = u.len > 2,
|
|
f =
|
|
!d ||
|
|
(e && e.start <= a) ||
|
|
(d - a > 2 &&
|
|
!this.fragmentTracker.getPartialFragment(a));
|
|
if (c || f) return;
|
|
this.moved = !1;
|
|
}
|
|
if (!this.moved && null !== this.stalled) {
|
|
var g,
|
|
v = Math.max(d, u.start || 0) - a,
|
|
m = this.hls.levels
|
|
? this.hls.levels[this.hls.currentLevel]
|
|
: null,
|
|
p = (
|
|
null == m || null == (g = m.details)
|
|
? void 0
|
|
: g.live
|
|
)
|
|
? 2 * m.details.targetduration
|
|
: 2,
|
|
y = this.fragmentTracker.getPartialFragment(a);
|
|
if (v > 0 && (v <= p || y))
|
|
return void this._trySkipBufferHole(y);
|
|
}
|
|
var T = self.performance.now();
|
|
if (null !== n) {
|
|
var E = T - n;
|
|
if (
|
|
s ||
|
|
!(E >= 250) ||
|
|
(this._reportStall(u), this.media)
|
|
) {
|
|
var S = Ir.bufferInfo(i, a, r.maxBufferHole);
|
|
this._tryFixBufferStall(S, E);
|
|
}
|
|
} else this.stalled = T;
|
|
}
|
|
}
|
|
} else if (((this.moved = !0), null !== n)) {
|
|
if (this.stallReported) {
|
|
var L = self.performance.now() - n;
|
|
w.warn(
|
|
"playback not stuck anymore @" +
|
|
a +
|
|
", after " +
|
|
Math.round(L) +
|
|
"ms"
|
|
),
|
|
(this.stallReported = !1);
|
|
}
|
|
(this.stalled = null), (this.nudgeRetry = 0);
|
|
}
|
|
}
|
|
}),
|
|
(e._tryFixBufferStall = function (t, e) {
|
|
var r = this.config,
|
|
i = this.fragmentTracker,
|
|
n = this.media;
|
|
if (null !== n) {
|
|
var a = n.currentTime,
|
|
s = i.getPartialFragment(a);
|
|
if (s && (this._trySkipBufferHole(s) || !this.media)) return;
|
|
(t.len > r.maxBufferHole ||
|
|
(t.nextStart && t.nextStart - a < r.maxBufferHole)) &&
|
|
e > 1e3 * r.highBufferWatchdogPeriod &&
|
|
(w.warn("Trying to nudge playhead over buffer-hole"),
|
|
(this.stalled = null),
|
|
this._tryNudgeBuffer());
|
|
}
|
|
}),
|
|
(e._reportStall = function (t) {
|
|
var e = this.hls,
|
|
r = this.media;
|
|
if (!this.stallReported && r) {
|
|
this.stallReported = !0;
|
|
var i = new Error(
|
|
"Playback stalling at @" +
|
|
r.currentTime +
|
|
" due to low buffer (" +
|
|
JSON.stringify(t) +
|
|
")"
|
|
);
|
|
w.warn(i.message),
|
|
e.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_STALLED_ERROR,
|
|
fatal: !1,
|
|
error: i,
|
|
buffer: t.len,
|
|
});
|
|
}
|
|
}),
|
|
(e._trySkipBufferHole = function (t) {
|
|
var e = this.config,
|
|
r = this.hls,
|
|
i = this.media;
|
|
if (null === i) return 0;
|
|
var n = i.currentTime,
|
|
a = Ir.bufferInfo(i, n, 0),
|
|
s = n < a.start ? a.start : a.nextStart;
|
|
if (s) {
|
|
var o = a.len <= e.maxBufferHole,
|
|
l = a.len > 0 && a.len < 1 && i.readyState < 3,
|
|
u = s - n;
|
|
if (u > 0 && (o || l)) {
|
|
if (u > e.maxBufferHole) {
|
|
var h = this.fragmentTracker,
|
|
d = !1;
|
|
if (0 === n) {
|
|
var c = h.getAppendedFrag(0, ge);
|
|
c && s < c.end && (d = !0);
|
|
}
|
|
if (!d) {
|
|
var f = t || h.getAppendedFrag(n, ge);
|
|
if (f) {
|
|
for (var g = !1, v = f.end; v < s; ) {
|
|
var m = h.getPartialFragment(v);
|
|
if (!m) {
|
|
g = !0;
|
|
break;
|
|
}
|
|
v += m.duration;
|
|
}
|
|
if (g) return 0;
|
|
}
|
|
}
|
|
}
|
|
var p = Math.max(s + 0.05, n + 0.1);
|
|
if (
|
|
(w.warn(
|
|
"skipping hole, adjusting currentTime from " +
|
|
n +
|
|
" to " +
|
|
p
|
|
),
|
|
(this.moved = !0),
|
|
(this.stalled = null),
|
|
(i.currentTime = p),
|
|
t && !t.gap)
|
|
) {
|
|
var y = new Error(
|
|
"fragment loaded with buffer holes, seeking from " +
|
|
n +
|
|
" to " +
|
|
p
|
|
);
|
|
r.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_SEEK_OVER_HOLE,
|
|
fatal: !1,
|
|
error: y,
|
|
reason: y.message,
|
|
frag: t,
|
|
});
|
|
}
|
|
return p;
|
|
}
|
|
}
|
|
return 0;
|
|
}),
|
|
(e._tryNudgeBuffer = function () {
|
|
var t = this.config,
|
|
e = this.hls,
|
|
r = this.media,
|
|
i = this.nudgeRetry;
|
|
if (null !== r) {
|
|
var n = r.currentTime;
|
|
if ((this.nudgeRetry++, i < t.nudgeMaxRetry)) {
|
|
var a = n + (i + 1) * t.nudgeOffset,
|
|
s = new Error(
|
|
"Nudging 'currentTime' from " + n + " to " + a
|
|
);
|
|
w.warn(s.message),
|
|
(r.currentTime = a),
|
|
e.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_NUDGE_ON_STALL,
|
|
error: s,
|
|
fatal: !1,
|
|
});
|
|
} else {
|
|
var o = new Error(
|
|
"Playhead still not moving while enough data buffered @" +
|
|
n +
|
|
" after " +
|
|
t.nudgeMaxRetry +
|
|
" nudges"
|
|
);
|
|
w.error(o.message),
|
|
e.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_STALLED_ERROR,
|
|
error: o,
|
|
fatal: !0,
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
cn = (function (t) {
|
|
function e(e, r, i) {
|
|
var n;
|
|
return (
|
|
((n =
|
|
t.call(this, e, r, i, "[stream-controller]", ge) ||
|
|
this).audioCodecSwap = !1),
|
|
(n.gapController = null),
|
|
(n.level = -1),
|
|
(n._forceStartLoad = !1),
|
|
(n.altAudio = !1),
|
|
(n.audioOnly = !1),
|
|
(n.fragPlaying = null),
|
|
(n.onvplaying = null),
|
|
(n.onvseeked = null),
|
|
(n.fragLastKbps = 0),
|
|
(n.couldBacktrack = !1),
|
|
(n.backtrackFragment = null),
|
|
(n.audioCodecSwitch = !1),
|
|
(n.videoBuffer = null),
|
|
n._registerListeners(),
|
|
n
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.on(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.on(
|
|
S.FRAG_LOAD_EMERGENCY_ABORTED,
|
|
this.onFragLoadEmergencyAborted,
|
|
this
|
|
),
|
|
t.on(S.ERROR, this.onError, this),
|
|
t.on(S.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
|
|
t.on(S.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
|
|
t.on(S.BUFFER_CREATED, this.onBufferCreated, this),
|
|
t.on(S.BUFFER_FLUSHED, this.onBufferFlushed, this),
|
|
t.on(S.LEVELS_UPDATED, this.onLevelsUpdated, this),
|
|
t.on(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.off(
|
|
S.FRAG_LOAD_EMERGENCY_ABORTED,
|
|
this.onFragLoadEmergencyAborted,
|
|
this
|
|
),
|
|
t.off(S.ERROR, this.onError, this),
|
|
t.off(
|
|
S.AUDIO_TRACK_SWITCHING,
|
|
this.onAudioTrackSwitching,
|
|
this
|
|
),
|
|
t.off(S.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
|
|
t.off(S.BUFFER_CREATED, this.onBufferCreated, this),
|
|
t.off(S.BUFFER_FLUSHED, this.onBufferFlushed, this),
|
|
t.off(S.LEVELS_UPDATED, this.onLevelsUpdated, this),
|
|
t.off(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r.onHandlerDestroying = function () {
|
|
this._unregisterListeners(), this.onMediaDetaching();
|
|
}),
|
|
(r.startLoad = function (t) {
|
|
if (this.levels) {
|
|
var e = this.lastCurrentTime,
|
|
r = this.hls;
|
|
if (
|
|
(this.stopLoad(),
|
|
this.setInterval(100),
|
|
(this.level = -1),
|
|
!this.startFragRequested)
|
|
) {
|
|
var i = r.startLevel;
|
|
-1 === i &&
|
|
(r.config.testBandwidth && this.levels.length > 1
|
|
? ((i = 0), (this.bitrateTest = !0))
|
|
: (i = r.nextAutoLevel)),
|
|
(this.level = r.nextLoadLevel = i),
|
|
(this.loadedmetadata = !1);
|
|
}
|
|
e > 0 &&
|
|
-1 === t &&
|
|
(this.log(
|
|
"Override startPosition with lastCurrentTime @" +
|
|
e.toFixed(3)
|
|
),
|
|
(t = e)),
|
|
(this.state = Kr),
|
|
(this.nextLoadPosition =
|
|
this.startPosition =
|
|
this.lastCurrentTime =
|
|
t),
|
|
this.tick();
|
|
} else (this._forceStartLoad = !0), (this.state = Gr);
|
|
}),
|
|
(r.stopLoad = function () {
|
|
(this._forceStartLoad = !1), t.prototype.stopLoad.call(this);
|
|
}),
|
|
(r.doTick = function () {
|
|
switch (this.state) {
|
|
case $r:
|
|
var t,
|
|
e = this.levels,
|
|
r = this.level,
|
|
i = null == e || null == (t = e[r]) ? void 0 : t.details;
|
|
if (i && (!i.live || this.levelLastLoaded === this.level)) {
|
|
if (this.waitForCdnTuneIn(i)) break;
|
|
this.state = Kr;
|
|
break;
|
|
}
|
|
if (this.hls.nextLoadLevel !== this.level) {
|
|
this.state = Kr;
|
|
break;
|
|
}
|
|
break;
|
|
case Yr:
|
|
var n,
|
|
a = self.performance.now(),
|
|
s = this.retryDate;
|
|
(!s || a >= s || (null != (n = this.media) && n.seeking)) &&
|
|
(this.resetStartWhenNotLoaded(this.level),
|
|
(this.state = Kr));
|
|
}
|
|
this.state === Kr && this.doTickIdle(), this.onTickEnd();
|
|
}),
|
|
(r.onTickEnd = function () {
|
|
t.prototype.onTickEnd.call(this),
|
|
this.checkBuffer(),
|
|
this.checkFragmentChanged();
|
|
}),
|
|
(r.doTickIdle = function () {
|
|
var t = this.hls,
|
|
e = this.levelLastLoaded,
|
|
r = this.levels,
|
|
i = this.media,
|
|
n = t.config,
|
|
a = t.nextLoadLevel;
|
|
if (
|
|
null !== e &&
|
|
(i || (!this.startFragRequested && n.startFragPrefetch)) &&
|
|
(!this.altAudio || !this.audioOnly) &&
|
|
null != r &&
|
|
r[a]
|
|
) {
|
|
var s = r[a],
|
|
o = this.getMainFwdBufferInfo();
|
|
if (null !== o) {
|
|
var l = this.getLevelDetails();
|
|
if (l && this._streamEnded(o, l)) {
|
|
var u = {};
|
|
return (
|
|
this.altAudio && (u.type = "video"),
|
|
this.hls.trigger(S.BUFFER_EOS, u),
|
|
void (this.state = Xr)
|
|
);
|
|
}
|
|
t.loadLevel !== a &&
|
|
-1 === t.manualLevel &&
|
|
this.log(
|
|
"Adapting to level " + a + " from level " + this.level
|
|
),
|
|
(this.level = t.nextLoadLevel = a);
|
|
var h = s.details;
|
|
if (
|
|
!h ||
|
|
this.state === $r ||
|
|
(h.live && this.levelLastLoaded !== a)
|
|
)
|
|
return (this.level = a), void (this.state = $r);
|
|
var d = o.len,
|
|
c = this.getMaxBufferLength(s.maxBitrate);
|
|
if (!(d >= c)) {
|
|
this.backtrackFragment &&
|
|
this.backtrackFragment.start > o.end &&
|
|
(this.backtrackFragment = null);
|
|
var f = this.backtrackFragment
|
|
? this.backtrackFragment.start
|
|
: o.end,
|
|
g = this.getNextFragment(f, h);
|
|
if (
|
|
this.couldBacktrack &&
|
|
!this.fragPrevious &&
|
|
g &&
|
|
"initSegment" !== g.sn &&
|
|
this.fragmentTracker.getState(g) !== mr
|
|
) {
|
|
var v,
|
|
m =
|
|
(null != (v = this.backtrackFragment) ? v : g).sn -
|
|
h.startSN,
|
|
p = h.fragments[m - 1];
|
|
p &&
|
|
g.cc === p.cc &&
|
|
((g = p), this.fragmentTracker.removeFragment(p));
|
|
} else
|
|
this.backtrackFragment &&
|
|
o.len &&
|
|
(this.backtrackFragment = null);
|
|
if (g && this.isLoopLoading(g, f)) {
|
|
if (!g.gap) {
|
|
var y = this.audioOnly && !this.altAudio ? O : N,
|
|
T =
|
|
(y === N ? this.videoBuffer : this.mediaBuffer) ||
|
|
this.media;
|
|
T && this.afterBufferFlushed(T, y, ge);
|
|
}
|
|
g = this.getNextFragmentLoopLoading(g, h, o, ge, c);
|
|
}
|
|
g &&
|
|
(!g.initSegment ||
|
|
g.initSegment.data ||
|
|
this.bitrateTest ||
|
|
(g = g.initSegment),
|
|
this.loadFragment(g, s, f));
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(r.loadFragment = function (e, r, i) {
|
|
var n = this.fragmentTracker.getState(e);
|
|
(this.fragCurrent = e),
|
|
n === fr || n === vr
|
|
? "initSegment" === e.sn
|
|
? this._loadInitSegment(e, r)
|
|
: this.bitrateTest
|
|
? (this.log(
|
|
"Fragment " +
|
|
e.sn +
|
|
" of level " +
|
|
e.level +
|
|
" is being downloaded to test bitrate and will not be buffered"
|
|
),
|
|
this._loadBitrateTestFrag(e, r))
|
|
: ((this.startFragRequested = !0),
|
|
t.prototype.loadFragment.call(this, e, r, i))
|
|
: this.clearTrackerIfNeeded(e);
|
|
}),
|
|
(r.getBufferedFrag = function (t) {
|
|
return this.fragmentTracker.getBufferedFrag(t, ge);
|
|
}),
|
|
(r.followingBufferedFrag = function (t) {
|
|
return t ? this.getBufferedFrag(t.end + 0.5) : null;
|
|
}),
|
|
(r.immediateLevelSwitch = function () {
|
|
this.abortCurrentFrag(),
|
|
this.flushMainBuffer(0, Number.POSITIVE_INFINITY);
|
|
}),
|
|
(r.nextLevelSwitch = function () {
|
|
var t = this.levels,
|
|
e = this.media;
|
|
if (null != e && e.readyState) {
|
|
var r,
|
|
i = this.getAppendedFrag(e.currentTime);
|
|
i && i.start > 1 && this.flushMainBuffer(0, i.start - 1);
|
|
var n = this.getLevelDetails();
|
|
if (null != n && n.live) {
|
|
var a = this.getMainFwdBufferInfo();
|
|
if (!a || a.len < 2 * n.targetduration) return;
|
|
}
|
|
if (!e.paused && t) {
|
|
var s = t[this.hls.nextLoadLevel],
|
|
o = this.fragLastKbps;
|
|
r =
|
|
o && this.fragCurrent
|
|
? (this.fragCurrent.duration * s.maxBitrate) / (1e3 * o) +
|
|
1
|
|
: 0;
|
|
} else r = 0;
|
|
var l = this.getBufferedFrag(e.currentTime + r);
|
|
if (l) {
|
|
var u = this.followingBufferedFrag(l);
|
|
if (u) {
|
|
this.abortCurrentFrag();
|
|
var h = u.maxStartPTS ? u.maxStartPTS : u.start,
|
|
d = u.duration,
|
|
c = Math.max(
|
|
l.end,
|
|
h +
|
|
Math.min(
|
|
Math.max(
|
|
d - this.config.maxFragLookUpTolerance,
|
|
0.5 * d
|
|
),
|
|
0.75 * d
|
|
)
|
|
);
|
|
this.flushMainBuffer(c, Number.POSITIVE_INFINITY);
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(r.abortCurrentFrag = function () {
|
|
var t = this.fragCurrent;
|
|
switch (
|
|
((this.fragCurrent = null),
|
|
(this.backtrackFragment = null),
|
|
t &&
|
|
(t.abortRequests(), this.fragmentTracker.removeFragment(t)),
|
|
this.state)
|
|
) {
|
|
case Hr:
|
|
case Vr:
|
|
case Yr:
|
|
case jr:
|
|
case qr:
|
|
this.state = Kr;
|
|
}
|
|
this.nextLoadPosition = this.getLoadPosition();
|
|
}),
|
|
(r.flushMainBuffer = function (e, r) {
|
|
t.prototype.flushMainBuffer.call(
|
|
this,
|
|
e,
|
|
r,
|
|
this.altAudio ? "video" : null
|
|
);
|
|
}),
|
|
(r.onMediaAttached = function (e, r) {
|
|
t.prototype.onMediaAttached.call(this, e, r);
|
|
var i = r.media;
|
|
(this.onvplaying = this.onMediaPlaying.bind(this)),
|
|
(this.onvseeked = this.onMediaSeeked.bind(this)),
|
|
i.addEventListener("playing", this.onvplaying),
|
|
i.addEventListener("seeked", this.onvseeked),
|
|
(this.gapController = new dn(
|
|
this.config,
|
|
i,
|
|
this.fragmentTracker,
|
|
this.hls
|
|
));
|
|
}),
|
|
(r.onMediaDetaching = function () {
|
|
var e = this.media;
|
|
e &&
|
|
this.onvplaying &&
|
|
this.onvseeked &&
|
|
(e.removeEventListener("playing", this.onvplaying),
|
|
e.removeEventListener("seeked", this.onvseeked),
|
|
(this.onvplaying = this.onvseeked = null),
|
|
(this.videoBuffer = null)),
|
|
(this.fragPlaying = null),
|
|
this.gapController &&
|
|
(this.gapController.destroy(), (this.gapController = null)),
|
|
t.prototype.onMediaDetaching.call(this);
|
|
}),
|
|
(r.onMediaPlaying = function () {
|
|
this.tick();
|
|
}),
|
|
(r.onMediaSeeked = function () {
|
|
var t = this.media,
|
|
e = t ? t.currentTime : null;
|
|
E(e) && this.log("Media seeked to " + e.toFixed(3));
|
|
var r = this.getMainFwdBufferInfo();
|
|
null !== r && 0 !== r.len
|
|
? this.tick()
|
|
: this.warn(
|
|
'Main forward buffer length on "seeked" event ' +
|
|
(r ? r.len : "empty") +
|
|
")"
|
|
);
|
|
}),
|
|
(r.onManifestLoading = function () {
|
|
this.log("Trigger BUFFER_RESET"),
|
|
this.hls.trigger(S.BUFFER_RESET, void 0),
|
|
this.fragmentTracker.removeAllFragments(),
|
|
(this.couldBacktrack = !1),
|
|
(this.startPosition = this.lastCurrentTime = 0),
|
|
(this.levels =
|
|
this.fragPlaying =
|
|
this.backtrackFragment =
|
|
null),
|
|
(this.altAudio = this.audioOnly = !1);
|
|
}),
|
|
(r.onManifestParsed = function (t, e) {
|
|
var r,
|
|
i,
|
|
n,
|
|
a = !1,
|
|
s = !1;
|
|
e.levels.forEach(function (t) {
|
|
(r = t.audioCodec) &&
|
|
(-1 !== r.indexOf("mp4a.40.2") && (a = !0),
|
|
-1 !== r.indexOf("mp4a.40.5") && (s = !0));
|
|
}),
|
|
(this.audioCodecSwitch =
|
|
a &&
|
|
s &&
|
|
!(
|
|
"function" ==
|
|
typeof (null == (n = Zr()) || null == (i = n.prototype)
|
|
? void 0
|
|
: i.changeType)
|
|
)),
|
|
this.audioCodecSwitch &&
|
|
this.log(
|
|
"Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"
|
|
),
|
|
(this.levels = e.levels),
|
|
(this.startFragRequested = !1);
|
|
}),
|
|
(r.onLevelLoading = function (t, e) {
|
|
var r = this.levels;
|
|
if (r && this.state === Kr) {
|
|
var i = r[e.level];
|
|
(!i.details ||
|
|
(i.details.live && this.levelLastLoaded !== e.level) ||
|
|
this.waitForCdnTuneIn(i.details)) &&
|
|
(this.state = $r);
|
|
}
|
|
}),
|
|
(r.onLevelLoaded = function (t, e) {
|
|
var r,
|
|
i = this.levels,
|
|
n = e.level,
|
|
a = e.details,
|
|
s = a.totalduration;
|
|
if (i) {
|
|
this.log(
|
|
"Level " +
|
|
n +
|
|
" loaded [" +
|
|
a.startSN +
|
|
"," +
|
|
a.endSN +
|
|
"]" +
|
|
(a.lastPartSn
|
|
? "[part-" + a.lastPartSn + "-" + a.lastPartIndex + "]"
|
|
: "") +
|
|
", cc [" +
|
|
a.startCC +
|
|
", " +
|
|
a.endCC +
|
|
"] duration:" +
|
|
s
|
|
);
|
|
var o = i[n],
|
|
l = this.fragCurrent;
|
|
!l ||
|
|
(this.state !== Vr && this.state !== Yr) ||
|
|
(l.level === e.level && l.urlId === o.urlId) ||
|
|
!l.loader ||
|
|
this.abortCurrentFrag();
|
|
var u = 0;
|
|
if (a.live || (null != (r = o.details) && r.live)) {
|
|
if ((this.checkLiveUpdate(a), a.deltaUpdateFailed)) return;
|
|
u = this.alignPlaylists(a, o.details);
|
|
}
|
|
if (
|
|
((o.details = a),
|
|
(this.levelLastLoaded = n),
|
|
this.hls.trigger(S.LEVEL_UPDATED, { details: a, level: n }),
|
|
this.state === $r)
|
|
) {
|
|
if (this.waitForCdnTuneIn(a)) return;
|
|
this.state = Kr;
|
|
}
|
|
this.startFragRequested
|
|
? a.live && this.synchronizeToLiveEdge(a)
|
|
: this.setStartPosition(a, u),
|
|
this.tick();
|
|
} else this.warn("Levels were reset while loading level " + n);
|
|
}),
|
|
(r._handleFragmentLoadProgress = function (t) {
|
|
var e,
|
|
r = t.frag,
|
|
i = t.part,
|
|
n = t.payload,
|
|
a = this.levels;
|
|
if (a) {
|
|
var s = a[r.level],
|
|
o = s.details;
|
|
if (!o)
|
|
return (
|
|
this.warn(
|
|
"Dropping fragment " +
|
|
r.sn +
|
|
" of level " +
|
|
r.level +
|
|
" after level details were reset"
|
|
),
|
|
void this.fragmentTracker.removeFragment(r)
|
|
);
|
|
var l = s.videoCodec,
|
|
u = o.PTSKnown || !o.live,
|
|
h = null == (e = r.initSegment) ? void 0 : e.data,
|
|
d = this._getAudioCodec(s),
|
|
c = (this.transmuxer =
|
|
this.transmuxer ||
|
|
new hn(
|
|
this.hls,
|
|
ge,
|
|
this._handleTransmuxComplete.bind(this),
|
|
this._handleTransmuxerFlush.bind(this)
|
|
)),
|
|
f = i ? i.index : -1,
|
|
g = -1 !== f,
|
|
v = new wr(
|
|
r.level,
|
|
r.sn,
|
|
r.stats.chunkCount,
|
|
n.byteLength,
|
|
f,
|
|
g
|
|
),
|
|
m = this.initPTS[r.cc];
|
|
c.push(n, h, d, l, r, i, o.totalduration, u, v, m);
|
|
} else
|
|
this.warn(
|
|
"Levels were reset while fragment load was in progress. Fragment " +
|
|
r.sn +
|
|
" of level " +
|
|
r.level +
|
|
" will not be buffered"
|
|
);
|
|
}),
|
|
(r.onAudioTrackSwitching = function (t, e) {
|
|
var r = this.altAudio;
|
|
if (!e.url) {
|
|
if (this.mediaBuffer !== this.media) {
|
|
this.log(
|
|
"Switching on main audio, use media.buffered to schedule main fragment loading"
|
|
),
|
|
(this.mediaBuffer = this.media);
|
|
var i = this.fragCurrent;
|
|
i &&
|
|
(this.log(
|
|
"Switching to main audio track, cancel main fragment load"
|
|
),
|
|
i.abortRequests(),
|
|
this.fragmentTracker.removeFragment(i)),
|
|
this.resetTransmuxer(),
|
|
this.resetLoadingState();
|
|
} else this.audioOnly && this.resetTransmuxer();
|
|
var n = this.hls;
|
|
r &&
|
|
(n.trigger(S.BUFFER_FLUSHING, {
|
|
startOffset: 0,
|
|
endOffset: Number.POSITIVE_INFINITY,
|
|
type: null,
|
|
}),
|
|
this.fragmentTracker.removeAllFragments()),
|
|
n.trigger(S.AUDIO_TRACK_SWITCHED, e);
|
|
}
|
|
}),
|
|
(r.onAudioTrackSwitched = function (t, e) {
|
|
var r = e.id,
|
|
i = !!this.hls.audioTracks[r].url;
|
|
if (i) {
|
|
var n = this.videoBuffer;
|
|
n &&
|
|
this.mediaBuffer !== n &&
|
|
(this.log(
|
|
"Switching on alternate audio, use video.buffered to schedule main fragment loading"
|
|
),
|
|
(this.mediaBuffer = n));
|
|
}
|
|
(this.altAudio = i), this.tick();
|
|
}),
|
|
(r.onBufferCreated = function (t, e) {
|
|
var r,
|
|
i,
|
|
n = e.tracks,
|
|
a = !1;
|
|
for (var s in n) {
|
|
var o = n[s];
|
|
if ("main" === o.id) {
|
|
if (((i = s), (r = o), "video" === s)) {
|
|
var l = n[s];
|
|
l && (this.videoBuffer = l.buffer);
|
|
}
|
|
} else a = !0;
|
|
}
|
|
a && r
|
|
? (this.log(
|
|
"Alternate track found, use " +
|
|
i +
|
|
".buffered to schedule main fragment loading"
|
|
),
|
|
(this.mediaBuffer = r.buffer))
|
|
: (this.mediaBuffer = this.media);
|
|
}),
|
|
(r.onFragBuffered = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.part;
|
|
if (!r || r.type === ge) {
|
|
if (this.fragContextChanged(r))
|
|
return (
|
|
this.warn(
|
|
"Fragment " +
|
|
r.sn +
|
|
(i ? " p: " + i.index : "") +
|
|
" of level " +
|
|
r.level +
|
|
" finished buffering, but was aborted. state: " +
|
|
this.state
|
|
),
|
|
void (this.state === qr && (this.state = Kr))
|
|
);
|
|
var n = i ? i.stats : r.stats;
|
|
(this.fragLastKbps = Math.round(
|
|
(8 * n.total) / (n.buffering.end - n.loading.first)
|
|
)),
|
|
"initSegment" !== r.sn && (this.fragPrevious = r),
|
|
this.fragBufferedComplete(r, i);
|
|
}
|
|
}),
|
|
(r.onError = function (t, e) {
|
|
var r;
|
|
if (e.fatal) this.state = zr;
|
|
else
|
|
switch (e.details) {
|
|
case R.FRAG_GAP:
|
|
case R.FRAG_PARSING_ERROR:
|
|
case R.FRAG_DECRYPT_ERROR:
|
|
case R.FRAG_LOAD_ERROR:
|
|
case R.FRAG_LOAD_TIMEOUT:
|
|
case R.KEY_LOAD_ERROR:
|
|
case R.KEY_LOAD_TIMEOUT:
|
|
this.onFragmentOrKeyLoadError(ge, e);
|
|
break;
|
|
case R.LEVEL_LOAD_ERROR:
|
|
case R.LEVEL_LOAD_TIMEOUT:
|
|
case R.LEVEL_PARSING_ERROR:
|
|
e.levelRetry ||
|
|
this.state !== $r ||
|
|
(null == (r = e.context) ? void 0 : r.type) !== de ||
|
|
(this.state = Kr);
|
|
break;
|
|
case R.BUFFER_FULL_ERROR:
|
|
if (!e.parent || "main" !== e.parent) return;
|
|
this.reduceLengthAndFlushBuffer(e) &&
|
|
this.flushMainBuffer(0, Number.POSITIVE_INFINITY);
|
|
break;
|
|
case R.INTERNAL_EXCEPTION:
|
|
this.recoverWorkerError(e);
|
|
}
|
|
}),
|
|
(r.checkBuffer = function () {
|
|
var t = this.media,
|
|
e = this.gapController;
|
|
if (t && e && t.readyState) {
|
|
if (this.loadedmetadata || !Ir.getBuffered(t).length) {
|
|
var r = this.state !== Kr ? this.fragCurrent : null;
|
|
e.poll(this.lastCurrentTime, r);
|
|
}
|
|
this.lastCurrentTime = t.currentTime;
|
|
}
|
|
}),
|
|
(r.onFragLoadEmergencyAborted = function () {
|
|
(this.state = Kr),
|
|
this.loadedmetadata ||
|
|
((this.startFragRequested = !1),
|
|
(this.nextLoadPosition = this.startPosition)),
|
|
this.tickImmediate();
|
|
}),
|
|
(r.onBufferFlushed = function (t, e) {
|
|
var r = e.type;
|
|
if (r !== O || (this.audioOnly && !this.altAudio)) {
|
|
var i =
|
|
(r === N ? this.videoBuffer : this.mediaBuffer) || this.media;
|
|
this.afterBufferFlushed(i, r, ge);
|
|
}
|
|
}),
|
|
(r.onLevelsUpdated = function (t, e) {
|
|
this.levels = e.levels;
|
|
}),
|
|
(r.swapAudioCodec = function () {
|
|
this.audioCodecSwap = !this.audioCodecSwap;
|
|
}),
|
|
(r.seekToStartPos = function () {
|
|
var t = this.media;
|
|
if (t) {
|
|
var e = t.currentTime,
|
|
r = this.startPosition;
|
|
if (r >= 0 && e < r) {
|
|
if (t.seeking)
|
|
return void this.log(
|
|
"could not seek to " + r + ", already seeking at " + e
|
|
);
|
|
var i = Ir.getBuffered(t),
|
|
n = (i.length ? i.start(0) : 0) - r;
|
|
n > 0 &&
|
|
(n < this.config.maxBufferHole ||
|
|
n < this.config.maxFragLookUpTolerance) &&
|
|
(this.log(
|
|
"adjusting start position by " +
|
|
n +
|
|
" to match buffer start"
|
|
),
|
|
(r += n),
|
|
(this.startPosition = r)),
|
|
this.log(
|
|
"seek to target start position " +
|
|
r +
|
|
" from current time " +
|
|
e
|
|
),
|
|
(t.currentTime = r);
|
|
}
|
|
}
|
|
}),
|
|
(r._getAudioCodec = function (t) {
|
|
var e = this.config.defaultAudioCodec || t.audioCodec;
|
|
return (
|
|
this.audioCodecSwap &&
|
|
e &&
|
|
(this.log("Swapping audio codec"),
|
|
(e =
|
|
-1 !== e.indexOf("mp4a.40.5") ? "mp4a.40.2" : "mp4a.40.5")),
|
|
e
|
|
);
|
|
}),
|
|
(r._loadBitrateTestFrag = function (t, e) {
|
|
var r = this;
|
|
(t.bitrateTest = !0),
|
|
this._doFragLoad(t, e).then(function (i) {
|
|
var n = r.hls;
|
|
if (i && !r.fragContextChanged(t)) {
|
|
(e.fragmentError = 0),
|
|
(r.state = Kr),
|
|
(r.startFragRequested = !1),
|
|
(r.bitrateTest = !1);
|
|
var a = t.stats;
|
|
(a.parsing.start =
|
|
a.parsing.end =
|
|
a.buffering.start =
|
|
a.buffering.end =
|
|
self.performance.now()),
|
|
n.trigger(S.FRAG_LOADED, i),
|
|
(t.bitrateTest = !1);
|
|
}
|
|
});
|
|
}),
|
|
(r._handleTransmuxComplete = function (t) {
|
|
var e,
|
|
r = "main",
|
|
i = this.hls,
|
|
n = t.remuxResult,
|
|
a = t.chunkMeta,
|
|
s = this.getCurrentContext(a);
|
|
if (s) {
|
|
var o = s.frag,
|
|
l = s.part,
|
|
u = s.level,
|
|
h = n.video,
|
|
d = n.text,
|
|
c = n.id3,
|
|
f = n.initSegment,
|
|
g = u.details,
|
|
v = this.altAudio ? void 0 : n.audio;
|
|
if (this.fragContextChanged(o))
|
|
this.fragmentTracker.removeFragment(o);
|
|
else {
|
|
if (((this.state = jr), f)) {
|
|
if (null != f && f.tracks) {
|
|
var m = o.initSegment || o;
|
|
this._bufferInitSegment(u, f.tracks, m, a),
|
|
i.trigger(S.FRAG_PARSING_INIT_SEGMENT, {
|
|
frag: m,
|
|
id: r,
|
|
tracks: f.tracks,
|
|
});
|
|
}
|
|
var p = f.initPTS,
|
|
y = f.timescale;
|
|
E(p) &&
|
|
((this.initPTS[o.cc] = { baseTime: p, timescale: y }),
|
|
i.trigger(S.INIT_PTS_FOUND, {
|
|
frag: o,
|
|
id: r,
|
|
initPTS: p,
|
|
timescale: y,
|
|
}));
|
|
}
|
|
if (h && g && "initSegment" !== o.sn) {
|
|
var T = g.fragments[o.sn - 1 - g.startSN],
|
|
L = o.sn === g.startSN,
|
|
R = !T || o.cc > T.cc;
|
|
if (!1 !== n.independent) {
|
|
var A = h.startPTS,
|
|
k = h.endPTS,
|
|
b = h.startDTS,
|
|
D = h.endDTS;
|
|
if (l)
|
|
l.elementaryStreams[h.type] = {
|
|
startPTS: A,
|
|
endPTS: k,
|
|
startDTS: b,
|
|
endDTS: D,
|
|
};
|
|
else if (
|
|
(h.firstKeyFrame &&
|
|
h.independent &&
|
|
1 === a.id &&
|
|
!R &&
|
|
(this.couldBacktrack = !0),
|
|
h.dropped && h.independent)
|
|
) {
|
|
var I = this.getMainFwdBufferInfo(),
|
|
w =
|
|
(I ? I.end : this.getLoadPosition()) +
|
|
this.config.maxBufferHole,
|
|
C = h.firstKeyFramePTS ? h.firstKeyFramePTS : A;
|
|
if (!L && w < C - this.config.maxBufferHole && !R)
|
|
return void this.backtrack(o);
|
|
R && (o.gap = !0),
|
|
o.setElementaryStreamInfo(
|
|
h.type,
|
|
o.start,
|
|
k,
|
|
o.start,
|
|
D,
|
|
!0
|
|
);
|
|
}
|
|
o.setElementaryStreamInfo(h.type, A, k, b, D),
|
|
this.backtrackFragment && (this.backtrackFragment = o),
|
|
this.bufferFragmentData(h, o, l, a, L || R);
|
|
} else {
|
|
if (!L && !R) return void this.backtrack(o);
|
|
o.gap = !0;
|
|
}
|
|
}
|
|
if (v) {
|
|
var _ = v.startPTS,
|
|
P = v.endPTS,
|
|
x = v.startDTS,
|
|
F = v.endDTS;
|
|
l &&
|
|
(l.elementaryStreams[O] = {
|
|
startPTS: _,
|
|
endPTS: P,
|
|
startDTS: x,
|
|
endDTS: F,
|
|
}),
|
|
o.setElementaryStreamInfo(O, _, P, x, F),
|
|
this.bufferFragmentData(v, o, l, a);
|
|
}
|
|
if (g && null != c && null != (e = c.samples) && e.length) {
|
|
var M = { id: r, frag: o, details: g, samples: c.samples };
|
|
i.trigger(S.FRAG_PARSING_METADATA, M);
|
|
}
|
|
if (g && d) {
|
|
var N = { id: r, frag: o, details: g, samples: d.samples };
|
|
i.trigger(S.FRAG_PARSING_USERDATA, N);
|
|
}
|
|
}
|
|
} else this.resetWhenMissingContext(a);
|
|
}),
|
|
(r._bufferInitSegment = function (t, e, r, i) {
|
|
var n = this;
|
|
if (this.state === jr) {
|
|
(this.audioOnly = !!e.audio && !e.video),
|
|
this.altAudio && !this.audioOnly && delete e.audio;
|
|
var a = e.audio,
|
|
s = e.video,
|
|
o = e.audiovideo;
|
|
if (a) {
|
|
var l = t.audioCodec,
|
|
u = navigator.userAgent.toLowerCase();
|
|
this.audioCodecSwitch &&
|
|
(l &&
|
|
(l =
|
|
-1 !== l.indexOf("mp4a.40.5")
|
|
? "mp4a.40.2"
|
|
: "mp4a.40.5"),
|
|
1 !== a.metadata.channelCount &&
|
|
-1 === u.indexOf("firefox") &&
|
|
(l = "mp4a.40.5")),
|
|
-1 !== u.indexOf("android") &&
|
|
"audio/mpeg" !== a.container &&
|
|
((l = "mp4a.40.2"),
|
|
this.log("Android: force audio codec to " + l)),
|
|
t.audioCodec &&
|
|
t.audioCodec !== l &&
|
|
this.log(
|
|
'Swapping manifest audio codec "' +
|
|
t.audioCodec +
|
|
'" for "' +
|
|
l +
|
|
'"'
|
|
),
|
|
(a.levelCodec = l),
|
|
(a.id = "main"),
|
|
this.log(
|
|
"Init audio buffer, container:" +
|
|
a.container +
|
|
", codecs[selected/level/parsed]=[" +
|
|
(l || "") +
|
|
"/" +
|
|
(t.audioCodec || "") +
|
|
"/" +
|
|
a.codec +
|
|
"]"
|
|
);
|
|
}
|
|
s &&
|
|
((s.levelCodec = t.videoCodec),
|
|
(s.id = "main"),
|
|
this.log(
|
|
"Init video buffer, container:" +
|
|
s.container +
|
|
", codecs[level/parsed]=[" +
|
|
(t.videoCodec || "") +
|
|
"/" +
|
|
s.codec +
|
|
"]"
|
|
)),
|
|
o &&
|
|
this.log(
|
|
"Init audiovideo buffer, container:" +
|
|
o.container +
|
|
", codecs[level/parsed]=[" +
|
|
(t.attrs.CODECS || "") +
|
|
"/" +
|
|
o.codec +
|
|
"]"
|
|
),
|
|
this.hls.trigger(S.BUFFER_CODECS, e),
|
|
Object.keys(e).forEach(function (t) {
|
|
var a = e[t].initSegment;
|
|
null != a &&
|
|
a.byteLength &&
|
|
n.hls.trigger(S.BUFFER_APPENDING, {
|
|
type: t,
|
|
data: a,
|
|
frag: r,
|
|
part: null,
|
|
chunkMeta: i,
|
|
parent: r.type,
|
|
});
|
|
}),
|
|
this.tick();
|
|
}
|
|
}),
|
|
(r.getMainFwdBufferInfo = function () {
|
|
return this.getFwdBufferInfo(
|
|
this.mediaBuffer ? this.mediaBuffer : this.media,
|
|
ge
|
|
);
|
|
}),
|
|
(r.backtrack = function (t) {
|
|
(this.couldBacktrack = !0),
|
|
(this.backtrackFragment = t),
|
|
this.resetTransmuxer(),
|
|
this.flushBufferGap(t),
|
|
this.fragmentTracker.removeFragment(t),
|
|
(this.fragPrevious = null),
|
|
(this.nextLoadPosition = t.start),
|
|
(this.state = Kr);
|
|
}),
|
|
(r.checkFragmentChanged = function () {
|
|
var t = this.media,
|
|
e = null;
|
|
if (t && t.readyState > 1 && !1 === t.seeking) {
|
|
var r = t.currentTime;
|
|
if (
|
|
(Ir.isBuffered(t, r)
|
|
? (e = this.getAppendedFrag(r))
|
|
: Ir.isBuffered(t, r + 0.1) &&
|
|
(e = this.getAppendedFrag(r + 0.1)),
|
|
e)
|
|
) {
|
|
this.backtrackFragment = null;
|
|
var i = this.fragPlaying,
|
|
n = e.level;
|
|
(i &&
|
|
e.sn === i.sn &&
|
|
i.level === n &&
|
|
e.urlId === i.urlId) ||
|
|
((this.fragPlaying = e),
|
|
this.hls.trigger(S.FRAG_CHANGED, { frag: e }),
|
|
(i && i.level === n) ||
|
|
this.hls.trigger(S.LEVEL_SWITCHED, { level: n }));
|
|
}
|
|
}
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "nextLevel",
|
|
get: function () {
|
|
var t = this.nextBufferedFrag;
|
|
return t ? t.level : -1;
|
|
},
|
|
},
|
|
{
|
|
key: "currentFrag",
|
|
get: function () {
|
|
var t = this.media;
|
|
return t
|
|
? this.fragPlaying || this.getAppendedFrag(t.currentTime)
|
|
: null;
|
|
},
|
|
},
|
|
{
|
|
key: "currentProgramDateTime",
|
|
get: function () {
|
|
var t = this.media;
|
|
if (t) {
|
|
var e = t.currentTime,
|
|
r = this.currentFrag;
|
|
if (r && E(e) && E(r.programDateTime)) {
|
|
var i = r.programDateTime + 1e3 * (e - r.start);
|
|
return new Date(i);
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
},
|
|
{
|
|
key: "currentLevel",
|
|
get: function () {
|
|
var t = this.currentFrag;
|
|
return t ? t.level : -1;
|
|
},
|
|
},
|
|
{
|
|
key: "nextBufferedFrag",
|
|
get: function () {
|
|
var t = this.currentFrag;
|
|
return t ? this.followingBufferedFrag(t) : null;
|
|
},
|
|
},
|
|
{
|
|
key: "forceStartLoad",
|
|
get: function () {
|
|
return this._forceStartLoad;
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(Jr),
|
|
fn = (function () {
|
|
function t(t, e, r) {
|
|
void 0 === e && (e = 0),
|
|
void 0 === r && (r = 0),
|
|
(this.halfLife = void 0),
|
|
(this.alpha_ = void 0),
|
|
(this.estimate_ = void 0),
|
|
(this.totalWeight_ = void 0),
|
|
(this.halfLife = t),
|
|
(this.alpha_ = t ? Math.exp(Math.log(0.5) / t) : 0),
|
|
(this.estimate_ = e),
|
|
(this.totalWeight_ = r);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.sample = function (t, e) {
|
|
var r = Math.pow(this.alpha_, t);
|
|
(this.estimate_ = e * (1 - r) + r * this.estimate_),
|
|
(this.totalWeight_ += t);
|
|
}),
|
|
(e.getTotalWeight = function () {
|
|
return this.totalWeight_;
|
|
}),
|
|
(e.getEstimate = function () {
|
|
if (this.alpha_) {
|
|
var t = 1 - Math.pow(this.alpha_, this.totalWeight_);
|
|
if (t) return this.estimate_ / t;
|
|
}
|
|
return this.estimate_;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
gn = (function () {
|
|
function t(t, e, r, i) {
|
|
void 0 === i && (i = 100),
|
|
(this.defaultEstimate_ = void 0),
|
|
(this.minWeight_ = void 0),
|
|
(this.minDelayMs_ = void 0),
|
|
(this.slow_ = void 0),
|
|
(this.fast_ = void 0),
|
|
(this.defaultTTFB_ = void 0),
|
|
(this.ttfb_ = void 0),
|
|
(this.defaultEstimate_ = r),
|
|
(this.minWeight_ = 0.001),
|
|
(this.minDelayMs_ = 50),
|
|
(this.slow_ = new fn(t)),
|
|
(this.fast_ = new fn(e)),
|
|
(this.defaultTTFB_ = i),
|
|
(this.ttfb_ = new fn(t));
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.update = function (t, e) {
|
|
var r = this.slow_,
|
|
i = this.fast_,
|
|
n = this.ttfb_;
|
|
r.halfLife !== t &&
|
|
(this.slow_ = new fn(t, r.getEstimate(), r.getTotalWeight())),
|
|
i.halfLife !== e &&
|
|
(this.fast_ = new fn(e, i.getEstimate(), i.getTotalWeight())),
|
|
n.halfLife !== t &&
|
|
(this.ttfb_ = new fn(t, n.getEstimate(), n.getTotalWeight()));
|
|
}),
|
|
(e.sample = function (t, e) {
|
|
var r = (t = Math.max(t, this.minDelayMs_)) / 1e3,
|
|
i = (8 * e) / r;
|
|
this.fast_.sample(r, i), this.slow_.sample(r, i);
|
|
}),
|
|
(e.sampleTTFB = function (t) {
|
|
var e = t / 1e3,
|
|
r = Math.sqrt(2) * Math.exp(-Math.pow(e, 2) / 2);
|
|
this.ttfb_.sample(r, Math.max(t, 5));
|
|
}),
|
|
(e.canEstimate = function () {
|
|
return this.fast_.getTotalWeight() >= this.minWeight_;
|
|
}),
|
|
(e.getEstimate = function () {
|
|
return this.canEstimate()
|
|
? Math.min(this.fast_.getEstimate(), this.slow_.getEstimate())
|
|
: this.defaultEstimate_;
|
|
}),
|
|
(e.getEstimateTTFB = function () {
|
|
return this.ttfb_.getTotalWeight() >= this.minWeight_
|
|
? this.ttfb_.getEstimate()
|
|
: this.defaultTTFB_;
|
|
}),
|
|
(e.destroy = function () {}),
|
|
t
|
|
);
|
|
})(),
|
|
vn = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.lastLevelLoadSec = 0),
|
|
(this.lastLoadedFragLevel = 0),
|
|
(this._nextAutoLevel = -1),
|
|
(this.timer = -1),
|
|
(this.onCheck = this._abandonRulesCheck.bind(this)),
|
|
(this.fragCurrent = null),
|
|
(this.partCurrent = null),
|
|
(this.bitrateTestDelay = 0),
|
|
(this.bwEstimator = void 0),
|
|
(this.hls = t);
|
|
var e = t.config;
|
|
(this.bwEstimator = new gn(
|
|
e.abrEwmaSlowVoD,
|
|
e.abrEwmaFastVoD,
|
|
e.abrEwmaDefaultEstimate
|
|
)),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.FRAG_LOADING, this.onFragLoading, this),
|
|
t.on(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.on(S.FRAG_BUFFERED, this.onFragBuffered, this),
|
|
t.on(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.on(S.LEVEL_LOADED, this.onLevelLoaded, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.FRAG_LOADING, this.onFragLoading, this),
|
|
t.off(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.off(S.FRAG_BUFFERED, this.onFragBuffered, this),
|
|
t.off(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.off(S.LEVEL_LOADED, this.onLevelLoaded, this);
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
this.clearTimer(),
|
|
(this.hls = this.onCheck = null),
|
|
(this.fragCurrent = this.partCurrent = null);
|
|
}),
|
|
(e.onFragLoading = function (t, e) {
|
|
var r,
|
|
i = e.frag;
|
|
this.ignoreFragment(i) ||
|
|
((this.fragCurrent = i),
|
|
(this.partCurrent = null != (r = e.part) ? r : null),
|
|
this.clearTimer(),
|
|
(this.timer = self.setInterval(this.onCheck, 100)));
|
|
}),
|
|
(e.onLevelSwitching = function (t, e) {
|
|
this.clearTimer();
|
|
}),
|
|
(e.getTimeToLoadFrag = function (t, e, r, i) {
|
|
return t + r / e + (i ? this.lastLevelLoadSec : 0);
|
|
}),
|
|
(e.onLevelLoaded = function (t, e) {
|
|
var r = this.hls.config,
|
|
i = e.stats,
|
|
n = i.total,
|
|
a = i.bwEstimate;
|
|
E(n) && E(a) && (this.lastLevelLoadSec = (8 * n) / a),
|
|
e.details.live
|
|
? this.bwEstimator.update(
|
|
r.abrEwmaSlowLive,
|
|
r.abrEwmaFastLive
|
|
)
|
|
: this.bwEstimator.update(r.abrEwmaSlowVoD, r.abrEwmaFastVoD);
|
|
}),
|
|
(e._abandonRulesCheck = function () {
|
|
var t = this.fragCurrent,
|
|
e = this.partCurrent,
|
|
r = this.hls,
|
|
i = r.autoLevelEnabled,
|
|
n = r.media;
|
|
if (t && n) {
|
|
var a = performance.now(),
|
|
s = e ? e.stats : t.stats,
|
|
o = e ? e.duration : t.duration,
|
|
l = a - s.loading.start;
|
|
if (
|
|
s.aborted ||
|
|
(s.loaded && s.loaded === s.total) ||
|
|
0 === t.level
|
|
)
|
|
return this.clearTimer(), void (this._nextAutoLevel = -1);
|
|
if (i && !n.paused && n.playbackRate && n.readyState) {
|
|
var u = r.mainForwardBufferInfo;
|
|
if (null !== u) {
|
|
var h = this.bwEstimator.getEstimateTTFB(),
|
|
d = Math.abs(n.playbackRate);
|
|
if (!(l <= Math.max(h, (o / (2 * d)) * 1e3))) {
|
|
var c = u.len / d;
|
|
if (!(c >= (2 * o) / d)) {
|
|
var f = s.loading.first
|
|
? s.loading.first - s.loading.start
|
|
: -1,
|
|
g = s.loaded && f > -1,
|
|
v = this.bwEstimator.getEstimate(),
|
|
m = r.levels,
|
|
p = r.minAutoLevel,
|
|
y = m[t.level],
|
|
T =
|
|
s.total ||
|
|
Math.max(
|
|
s.loaded,
|
|
Math.round((o * y.maxBitrate) / 8)
|
|
),
|
|
L = l - f;
|
|
L < 1 && g && (L = Math.min(l, (8 * s.loaded) / v));
|
|
var R = g ? (1e3 * s.loaded) / L : 0,
|
|
A = R ? (T - s.loaded) / R : (8 * T) / v + h / 1e3;
|
|
if (!(A <= c)) {
|
|
var k,
|
|
b = R ? 8 * R : v,
|
|
D = Number.POSITIVE_INFINITY;
|
|
for (k = t.level - 1; k > p; k--) {
|
|
var I = m[k].maxBitrate;
|
|
if (
|
|
(D = this.getTimeToLoadFrag(
|
|
h / 1e3,
|
|
b,
|
|
o * I,
|
|
!m[k].details
|
|
)) < c
|
|
)
|
|
break;
|
|
}
|
|
D >= A ||
|
|
D > 10 * o ||
|
|
((r.nextLoadLevel = k),
|
|
g
|
|
? this.bwEstimator.sample(
|
|
l - Math.min(h, f),
|
|
s.loaded
|
|
)
|
|
: this.bwEstimator.sampleTTFB(l),
|
|
this.clearTimer(),
|
|
w.warn(
|
|
"[abr] Fragment " +
|
|
t.sn +
|
|
(e ? " part " + e.index : "") +
|
|
" of level " +
|
|
t.level +
|
|
" is loading too slowly;\n Time to underbuffer: " +
|
|
c.toFixed(3) +
|
|
" s\n Estimated load time for current fragment: " +
|
|
A.toFixed(3) +
|
|
" s\n Estimated load time for down switch fragment: " +
|
|
D.toFixed(3) +
|
|
" s\n TTFB estimate: " +
|
|
f +
|
|
"\n Current BW estimate: " +
|
|
(E(v) ? (v / 1024).toFixed(3) : "Unknown") +
|
|
" Kb/s\n New BW estimate: " +
|
|
(this.bwEstimator.getEstimate() / 1024).toFixed(
|
|
3
|
|
) +
|
|
" Kb/s\n Aborting and switching to level " +
|
|
k
|
|
),
|
|
t.loader &&
|
|
((this.fragCurrent = this.partCurrent = null),
|
|
t.abortRequests()),
|
|
r.trigger(S.FRAG_LOAD_EMERGENCY_ABORTED, {
|
|
frag: t,
|
|
part: e,
|
|
stats: s,
|
|
}));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.onFragLoaded = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.part,
|
|
n = i ? i.stats : r.stats;
|
|
if (
|
|
(r.type === ge &&
|
|
this.bwEstimator.sampleTTFB(
|
|
n.loading.first - n.loading.start
|
|
),
|
|
!this.ignoreFragment(r))
|
|
) {
|
|
if (
|
|
(this.clearTimer(),
|
|
(this.lastLoadedFragLevel = r.level),
|
|
(this._nextAutoLevel = -1),
|
|
this.hls.config.abrMaxWithRealBitrate)
|
|
) {
|
|
var a = i ? i.duration : r.duration,
|
|
s = this.hls.levels[r.level],
|
|
o = (s.loaded ? s.loaded.bytes : 0) + n.loaded,
|
|
l = (s.loaded ? s.loaded.duration : 0) + a;
|
|
(s.loaded = { bytes: o, duration: l }),
|
|
(s.realBitrate = Math.round((8 * o) / l));
|
|
}
|
|
if (r.bitrateTest) {
|
|
var u = { stats: n, frag: r, part: i, id: r.type };
|
|
this.onFragBuffered(S.FRAG_BUFFERED, u), (r.bitrateTest = !1);
|
|
}
|
|
}
|
|
}),
|
|
(e.onFragBuffered = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.part,
|
|
n = null != i && i.stats.loaded ? i.stats : r.stats;
|
|
if (!n.aborted && !this.ignoreFragment(r)) {
|
|
var a =
|
|
n.parsing.end -
|
|
n.loading.start -
|
|
Math.min(
|
|
n.loading.first - n.loading.start,
|
|
this.bwEstimator.getEstimateTTFB()
|
|
);
|
|
this.bwEstimator.sample(a, n.loaded),
|
|
(n.bwEstimate = this.bwEstimator.getEstimate()),
|
|
r.bitrateTest
|
|
? (this.bitrateTestDelay = a / 1e3)
|
|
: (this.bitrateTestDelay = 0);
|
|
}
|
|
}),
|
|
(e.ignoreFragment = function (t) {
|
|
return t.type !== ge || "initSegment" === t.sn;
|
|
}),
|
|
(e.clearTimer = function () {
|
|
self.clearInterval(this.timer);
|
|
}),
|
|
(e.getNextABRAutoLevel = function () {
|
|
var t = this.fragCurrent,
|
|
e = this.partCurrent,
|
|
r = this.hls,
|
|
i = r.maxAutoLevel,
|
|
n = r.config,
|
|
a = r.minAutoLevel,
|
|
s = r.media,
|
|
o = e ? e.duration : t ? t.duration : 0,
|
|
l = s && 0 !== s.playbackRate ? Math.abs(s.playbackRate) : 1,
|
|
u = this.bwEstimator
|
|
? this.bwEstimator.getEstimate()
|
|
: n.abrEwmaDefaultEstimate,
|
|
h = r.mainForwardBufferInfo,
|
|
d = (h ? h.len : 0) / l,
|
|
c = this.findBestLevel(
|
|
u,
|
|
a,
|
|
i,
|
|
d,
|
|
n.abrBandWidthFactor,
|
|
n.abrBandWidthUpFactor
|
|
);
|
|
if (c >= 0) return c;
|
|
w.trace(
|
|
"[abr] " +
|
|
(d ? "rebuffering expected" : "buffer is empty") +
|
|
", finding optimal quality level"
|
|
);
|
|
var f = o
|
|
? Math.min(o, n.maxStarvationDelay)
|
|
: n.maxStarvationDelay,
|
|
g = n.abrBandWidthFactor,
|
|
v = n.abrBandWidthUpFactor;
|
|
if (!d) {
|
|
var m = this.bitrateTestDelay;
|
|
m &&
|
|
((f =
|
|
(o ? Math.min(o, n.maxLoadingDelay) : n.maxLoadingDelay) -
|
|
m),
|
|
w.trace(
|
|
"[abr] bitrate test took " +
|
|
Math.round(1e3 * m) +
|
|
"ms, set first fragment max fetchDuration to " +
|
|
Math.round(1e3 * f) +
|
|
" ms"
|
|
),
|
|
(g = v = 1));
|
|
}
|
|
return (
|
|
(c = this.findBestLevel(u, a, i, d + f, g, v)), Math.max(c, 0)
|
|
);
|
|
}),
|
|
(e.findBestLevel = function (t, e, r, i, n, a) {
|
|
for (
|
|
var s,
|
|
o = this.fragCurrent,
|
|
l = this.partCurrent,
|
|
u = this.lastLoadedFragLevel,
|
|
h = this.hls.levels,
|
|
d = h[u],
|
|
c = !(null == d || null == (s = d.details) || !s.live),
|
|
f = null == d ? void 0 : d.codecSet,
|
|
g = l ? l.duration : o ? o.duration : 0,
|
|
v = this.bwEstimator.getEstimateTTFB() / 1e3,
|
|
m = e,
|
|
p = -1,
|
|
y = r;
|
|
y >= e;
|
|
y--
|
|
) {
|
|
var T = h[y];
|
|
if (!T || (f && T.codecSet !== f))
|
|
T && ((m = Math.min(y, m)), (p = Math.max(y, p)));
|
|
else {
|
|
-1 !== p &&
|
|
w.trace(
|
|
"[abr] Skipped level(s) " +
|
|
m +
|
|
"-" +
|
|
p +
|
|
' with CODECS:"' +
|
|
h[p].attrs.CODECS +
|
|
'"; not compatible with "' +
|
|
d.attrs.CODECS +
|
|
'"'
|
|
);
|
|
var S = T.details,
|
|
L =
|
|
(l
|
|
? null == S
|
|
? void 0
|
|
: S.partTarget
|
|
: null == S
|
|
? void 0
|
|
: S.averagetargetduration) || g,
|
|
R = void 0;
|
|
R = y <= u ? n * t : a * t;
|
|
var A = h[y].maxBitrate,
|
|
k = this.getTimeToLoadFrag(v, R, A * L, void 0 === S);
|
|
if (
|
|
(w.trace(
|
|
"[abr] level:" +
|
|
y +
|
|
" adjustedbw-bitrate:" +
|
|
Math.round(R - A) +
|
|
" avgDuration:" +
|
|
L.toFixed(1) +
|
|
" maxFetchDuration:" +
|
|
i.toFixed(1) +
|
|
" fetchDuration:" +
|
|
k.toFixed(1)
|
|
),
|
|
R > A &&
|
|
(0 === k ||
|
|
!E(k) ||
|
|
(c && !this.bitrateTestDelay) ||
|
|
k < i))
|
|
)
|
|
return y;
|
|
}
|
|
}
|
|
return -1;
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "nextAutoLevel",
|
|
get: function () {
|
|
var t = this._nextAutoLevel,
|
|
e = this.bwEstimator;
|
|
if (-1 !== t && !e.canEstimate()) return t;
|
|
var r = this.getNextABRAutoLevel();
|
|
if (-1 !== t) {
|
|
var i = this.hls.levels;
|
|
if (
|
|
i.length > Math.max(t, r) &&
|
|
i[t].loadError <= i[r].loadError
|
|
)
|
|
return t;
|
|
}
|
|
return -1 !== t && (r = Math.min(t, r)), r;
|
|
},
|
|
set: function (t) {
|
|
this._nextAutoLevel = t;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})(),
|
|
mn = (function () {
|
|
function t() {
|
|
(this.chunks = []), (this.dataLength = 0);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.push = function (t) {
|
|
this.chunks.push(t), (this.dataLength += t.length);
|
|
}),
|
|
(e.flush = function () {
|
|
var t,
|
|
e = this.chunks,
|
|
r = this.dataLength;
|
|
return e.length
|
|
? ((t =
|
|
1 === e.length
|
|
? e[0]
|
|
: (function (t, e) {
|
|
for (
|
|
var r = new Uint8Array(e), i = 0, n = 0;
|
|
n < t.length;
|
|
n++
|
|
) {
|
|
var a = t[n];
|
|
r.set(a, i), (i += a.length);
|
|
}
|
|
return r;
|
|
})(e, r)),
|
|
this.reset(),
|
|
t)
|
|
: new Uint8Array(0);
|
|
}),
|
|
(e.reset = function () {
|
|
(this.chunks.length = 0), (this.dataLength = 0);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
pn = (function (t) {
|
|
function e(e, r, i) {
|
|
var n;
|
|
return (
|
|
((n =
|
|
t.call(this, e, r, i, "[audio-stream-controller]", ve) ||
|
|
this).videoBuffer = null),
|
|
(n.videoTrackCC = -1),
|
|
(n.waitingVideoCC = -1),
|
|
(n.bufferedTrack = null),
|
|
(n.switchingTrack = null),
|
|
(n.trackId = -1),
|
|
(n.waitingData = null),
|
|
(n.mainDetails = null),
|
|
(n.bufferFlushed = !1),
|
|
(n.cachedTrackLoadedData = null),
|
|
n._registerListeners(),
|
|
n
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.onHandlerDestroying = function () {
|
|
this._unregisterListeners(),
|
|
(this.mainDetails = null),
|
|
(this.bufferedTrack = null),
|
|
(this.switchingTrack = null);
|
|
}),
|
|
(r._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.on(S.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this),
|
|
t.on(S.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
|
|
t.on(S.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this),
|
|
t.on(S.ERROR, this.onError, this),
|
|
t.on(S.BUFFER_RESET, this.onBufferReset, this),
|
|
t.on(S.BUFFER_CREATED, this.onBufferCreated, this),
|
|
t.on(S.BUFFER_FLUSHED, this.onBufferFlushed, this),
|
|
t.on(S.INIT_PTS_FOUND, this.onInitPtsFound, this),
|
|
t.on(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.off(S.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this),
|
|
t.off(
|
|
S.AUDIO_TRACK_SWITCHING,
|
|
this.onAudioTrackSwitching,
|
|
this
|
|
),
|
|
t.off(S.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this),
|
|
t.off(S.ERROR, this.onError, this),
|
|
t.off(S.BUFFER_RESET, this.onBufferReset, this),
|
|
t.off(S.BUFFER_CREATED, this.onBufferCreated, this),
|
|
t.off(S.BUFFER_FLUSHED, this.onBufferFlushed, this),
|
|
t.off(S.INIT_PTS_FOUND, this.onInitPtsFound, this),
|
|
t.off(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r.onInitPtsFound = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.id,
|
|
n = e.initPTS,
|
|
a = e.timescale;
|
|
if ("main" === i) {
|
|
var s = r.cc;
|
|
(this.initPTS[r.cc] = { baseTime: n, timescale: a }),
|
|
this.log("InitPTS for cc: " + s + " found from main: " + n),
|
|
(this.videoTrackCC = s),
|
|
this.state === Qr && this.tick();
|
|
}
|
|
}),
|
|
(r.startLoad = function (t) {
|
|
if (!this.levels)
|
|
return (this.startPosition = t), void (this.state = Gr);
|
|
var e = this.lastCurrentTime;
|
|
this.stopLoad(),
|
|
this.setInterval(100),
|
|
e > 0 && -1 === t
|
|
? (this.log(
|
|
"Override startPosition with lastCurrentTime @" +
|
|
e.toFixed(3)
|
|
),
|
|
(t = e),
|
|
(this.state = Kr))
|
|
: ((this.loadedmetadata = !1), (this.state = Wr)),
|
|
(this.nextLoadPosition =
|
|
this.startPosition =
|
|
this.lastCurrentTime =
|
|
t),
|
|
this.tick();
|
|
}),
|
|
(r.doTick = function () {
|
|
switch (this.state) {
|
|
case Kr:
|
|
this.doTickIdle();
|
|
break;
|
|
case Wr:
|
|
var e,
|
|
r = this.levels,
|
|
i = this.trackId,
|
|
n = null == r || null == (e = r[i]) ? void 0 : e.details;
|
|
if (n) {
|
|
if (this.waitForCdnTuneIn(n)) break;
|
|
this.state = Qr;
|
|
}
|
|
break;
|
|
case Yr:
|
|
var a,
|
|
s = performance.now(),
|
|
o = this.retryDate;
|
|
(!o || s >= o || (null != (a = this.media) && a.seeking)) &&
|
|
(this.log("RetryDate reached, switch back to IDLE state"),
|
|
this.resetStartWhenNotLoaded(this.trackId),
|
|
(this.state = Kr));
|
|
break;
|
|
case Qr:
|
|
var l = this.waitingData;
|
|
if (l) {
|
|
var u = l.frag,
|
|
h = l.part,
|
|
d = l.cache,
|
|
c = l.complete;
|
|
if (void 0 !== this.initPTS[u.cc]) {
|
|
(this.waitingData = null),
|
|
(this.waitingVideoCC = -1),
|
|
(this.state = Vr);
|
|
var f = {
|
|
frag: u,
|
|
part: h,
|
|
payload: d.flush(),
|
|
networkDetails: null,
|
|
};
|
|
this._handleFragmentLoadProgress(f),
|
|
c &&
|
|
t.prototype._handleFragmentLoadComplete.call(this, f);
|
|
} else if (this.videoTrackCC !== this.waitingVideoCC)
|
|
this.log(
|
|
"Waiting fragment cc (" +
|
|
u.cc +
|
|
") cancelled because video is at cc " +
|
|
this.videoTrackCC
|
|
),
|
|
this.clearWaitingFragment();
|
|
else {
|
|
var g = this.getLoadPosition(),
|
|
v = Ir.bufferInfo(
|
|
this.mediaBuffer,
|
|
g,
|
|
this.config.maxBufferHole
|
|
);
|
|
Je(v.end, this.config.maxFragLookUpTolerance, u) < 0 &&
|
|
(this.log(
|
|
"Waiting fragment cc (" +
|
|
u.cc +
|
|
") @ " +
|
|
u.start +
|
|
" cancelled because another fragment at " +
|
|
v.end +
|
|
" is needed"
|
|
),
|
|
this.clearWaitingFragment());
|
|
}
|
|
} else this.state = Kr;
|
|
}
|
|
this.onTickEnd();
|
|
}),
|
|
(r.clearWaitingFragment = function () {
|
|
var t = this.waitingData;
|
|
t &&
|
|
(this.fragmentTracker.removeFragment(t.frag),
|
|
(this.waitingData = null),
|
|
(this.waitingVideoCC = -1),
|
|
(this.state = Kr));
|
|
}),
|
|
(r.resetLoadingState = function () {
|
|
this.clearWaitingFragment(),
|
|
t.prototype.resetLoadingState.call(this);
|
|
}),
|
|
(r.onTickEnd = function () {
|
|
var t = this.media;
|
|
null != t &&
|
|
t.readyState &&
|
|
(this.lastCurrentTime = t.currentTime);
|
|
}),
|
|
(r.doTickIdle = function () {
|
|
var t = this.hls,
|
|
e = this.levels,
|
|
r = this.media,
|
|
i = this.trackId,
|
|
n = t.config;
|
|
if (
|
|
null != e &&
|
|
e[i] &&
|
|
(r || (!this.startFragRequested && n.startFragPrefetch))
|
|
) {
|
|
var a = e[i],
|
|
s = a.details;
|
|
if (
|
|
!s ||
|
|
(s.live && this.levelLastLoaded !== i) ||
|
|
this.waitForCdnTuneIn(s)
|
|
)
|
|
this.state = Wr;
|
|
else {
|
|
var o = this.mediaBuffer ? this.mediaBuffer : this.media;
|
|
this.bufferFlushed &&
|
|
o &&
|
|
((this.bufferFlushed = !1),
|
|
this.afterBufferFlushed(o, O, ve));
|
|
var l = this.getFwdBufferInfo(o, ve);
|
|
if (null !== l) {
|
|
var u = this.bufferedTrack,
|
|
h = this.switchingTrack;
|
|
if (!h && this._streamEnded(l, s))
|
|
return (
|
|
t.trigger(S.BUFFER_EOS, { type: "audio" }),
|
|
void (this.state = Xr)
|
|
);
|
|
var d = this.getFwdBufferInfo(
|
|
this.videoBuffer ? this.videoBuffer : this.media,
|
|
ge
|
|
),
|
|
c = l.len,
|
|
f = this.getMaxBufferLength(null == d ? void 0 : d.len);
|
|
if (!(c >= f) || h) {
|
|
var g = s.fragments[0].start,
|
|
v = l.end;
|
|
if (h && r) {
|
|
var m = this.getLoadPosition();
|
|
u && h.attrs !== u.attrs && (v = m),
|
|
s.PTSKnown &&
|
|
m < g &&
|
|
(l.end > g || l.nextStart) &&
|
|
(this.log(
|
|
"Alt audio track ahead of main track, seek to start of alt audio track"
|
|
),
|
|
(r.currentTime = g + 0.05));
|
|
}
|
|
var p = this.getNextFragment(v, s),
|
|
y = !1;
|
|
if (
|
|
(p &&
|
|
this.isLoopLoading(p, v) &&
|
|
((y = !!p.gap),
|
|
(p = this.getNextFragmentLoopLoading(
|
|
p,
|
|
s,
|
|
l,
|
|
ge,
|
|
f
|
|
))),
|
|
p)
|
|
) {
|
|
var T = d && p.start > d.end + s.targetduration;
|
|
if (T || ((null == d || !d.len) && l.len)) {
|
|
var E = this.getAppendedFrag(p.start, ge);
|
|
if (null === E) return;
|
|
if (
|
|
(y || (y = !!E.gap || (!!T && 0 === d.len)),
|
|
(T && !y) ||
|
|
(y && l.nextStart && l.nextStart < E.end))
|
|
)
|
|
return;
|
|
}
|
|
this.loadFragment(p, a, v);
|
|
} else this.bufferFlushed = !0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(r.getMaxBufferLength = function (e) {
|
|
var r = t.prototype.getMaxBufferLength.call(this);
|
|
return e
|
|
? Math.min(Math.max(r, e), this.config.maxMaxBufferLength)
|
|
: r;
|
|
}),
|
|
(r.onMediaDetaching = function () {
|
|
(this.videoBuffer = null),
|
|
t.prototype.onMediaDetaching.call(this);
|
|
}),
|
|
(r.onAudioTracksUpdated = function (t, e) {
|
|
var r = e.audioTracks;
|
|
this.resetTransmuxer(),
|
|
(this.levels = r.map(function (t) {
|
|
return new Ne(t);
|
|
}));
|
|
}),
|
|
(r.onAudioTrackSwitching = function (t, e) {
|
|
var r = !!e.url;
|
|
this.trackId = e.id;
|
|
var i = this.fragCurrent;
|
|
i && (i.abortRequests(), this.removeUnbufferedFrags(i.start)),
|
|
this.resetLoadingState(),
|
|
r ? this.setInterval(100) : this.resetTransmuxer(),
|
|
r
|
|
? ((this.switchingTrack = e), (this.state = Kr))
|
|
: ((this.switchingTrack = null),
|
|
(this.bufferedTrack = e),
|
|
(this.state = Gr)),
|
|
this.tick();
|
|
}),
|
|
(r.onManifestLoading = function () {
|
|
this.fragmentTracker.removeAllFragments(),
|
|
(this.startPosition = this.lastCurrentTime = 0),
|
|
(this.bufferFlushed = !1),
|
|
(this.levels =
|
|
this.mainDetails =
|
|
this.waitingData =
|
|
this.bufferedTrack =
|
|
this.cachedTrackLoadedData =
|
|
this.switchingTrack =
|
|
null),
|
|
(this.startFragRequested = !1),
|
|
(this.trackId = this.videoTrackCC = this.waitingVideoCC = -1);
|
|
}),
|
|
(r.onLevelLoaded = function (t, e) {
|
|
(this.mainDetails = e.details),
|
|
null !== this.cachedTrackLoadedData &&
|
|
(this.hls.trigger(
|
|
S.AUDIO_TRACK_LOADED,
|
|
this.cachedTrackLoadedData
|
|
),
|
|
(this.cachedTrackLoadedData = null));
|
|
}),
|
|
(r.onAudioTrackLoaded = function (t, e) {
|
|
var r;
|
|
if (null != this.mainDetails) {
|
|
var i = this.levels,
|
|
n = e.details,
|
|
a = e.id;
|
|
if (i) {
|
|
this.log(
|
|
"Track " +
|
|
a +
|
|
" loaded [" +
|
|
n.startSN +
|
|
"," +
|
|
n.endSN +
|
|
"]" +
|
|
(n.lastPartSn
|
|
? "[part-" + n.lastPartSn + "-" + n.lastPartIndex + "]"
|
|
: "") +
|
|
",duration:" +
|
|
n.totalduration
|
|
);
|
|
var s = i[a],
|
|
o = 0;
|
|
if (n.live || (null != (r = s.details) && r.live)) {
|
|
this.checkLiveUpdate(n);
|
|
var l = this.mainDetails;
|
|
if (n.deltaUpdateFailed || !l) return;
|
|
!s.details && n.hasProgramDateTime && l.hasProgramDateTime
|
|
? (Fr(n, l), (o = n.fragments[0].start))
|
|
: (o = this.alignPlaylists(n, s.details));
|
|
}
|
|
(s.details = n),
|
|
(this.levelLastLoaded = a),
|
|
this.startFragRequested ||
|
|
(!this.mainDetails && n.live) ||
|
|
this.setStartPosition(s.details, o),
|
|
this.state !== Wr ||
|
|
this.waitForCdnTuneIn(n) ||
|
|
(this.state = Kr),
|
|
this.tick();
|
|
} else
|
|
this.warn("Audio tracks were reset while loading level " + a);
|
|
} else this.cachedTrackLoadedData = e;
|
|
}),
|
|
(r._handleFragmentLoadProgress = function (t) {
|
|
var e,
|
|
r = t.frag,
|
|
i = t.part,
|
|
n = t.payload,
|
|
a = this.config,
|
|
s = this.trackId,
|
|
o = this.levels;
|
|
if (o) {
|
|
var l = o[s];
|
|
if (l) {
|
|
var u = l.details;
|
|
if (!u)
|
|
return (
|
|
this.warn(
|
|
"Audio track details undefined on fragment load progress"
|
|
),
|
|
void this.removeUnbufferedFrags(r.start)
|
|
);
|
|
var h = a.defaultAudioCodec || l.audioCodec || "mp4a.40.2",
|
|
d = this.transmuxer;
|
|
d ||
|
|
(d = this.transmuxer =
|
|
new hn(
|
|
this.hls,
|
|
ve,
|
|
this._handleTransmuxComplete.bind(this),
|
|
this._handleTransmuxerFlush.bind(this)
|
|
));
|
|
var c = this.initPTS[r.cc],
|
|
f = null == (e = r.initSegment) ? void 0 : e.data;
|
|
if (void 0 !== c) {
|
|
var g = i ? i.index : -1,
|
|
v = -1 !== g,
|
|
m = new wr(
|
|
r.level,
|
|
r.sn,
|
|
r.stats.chunkCount,
|
|
n.byteLength,
|
|
g,
|
|
v
|
|
);
|
|
d.push(n, f, h, "", r, i, u.totalduration, !1, m, c);
|
|
} else
|
|
this.log(
|
|
"Unknown video PTS for cc " +
|
|
r.cc +
|
|
", waiting for video PTS before demuxing audio frag " +
|
|
r.sn +
|
|
" of [" +
|
|
u.startSN +
|
|
" ," +
|
|
u.endSN +
|
|
"],track " +
|
|
s
|
|
),
|
|
(this.waitingData = this.waitingData || {
|
|
frag: r,
|
|
part: i,
|
|
cache: new mn(),
|
|
complete: !1,
|
|
}).cache.push(new Uint8Array(n)),
|
|
(this.waitingVideoCC = this.videoTrackCC),
|
|
(this.state = Qr);
|
|
} else
|
|
this.warn(
|
|
"Audio track is undefined on fragment load progress"
|
|
);
|
|
} else
|
|
this.warn(
|
|
"Audio tracks were reset while fragment load was in progress. Fragment " +
|
|
r.sn +
|
|
" of level " +
|
|
r.level +
|
|
" will not be buffered"
|
|
);
|
|
}),
|
|
(r._handleFragmentLoadComplete = function (e) {
|
|
this.waitingData
|
|
? (this.waitingData.complete = !0)
|
|
: t.prototype._handleFragmentLoadComplete.call(this, e);
|
|
}),
|
|
(r.onBufferReset = function () {
|
|
(this.mediaBuffer = this.videoBuffer = null),
|
|
(this.loadedmetadata = !1);
|
|
}),
|
|
(r.onBufferCreated = function (t, e) {
|
|
var r = e.tracks.audio;
|
|
r && (this.mediaBuffer = r.buffer || null),
|
|
e.tracks.video &&
|
|
(this.videoBuffer = e.tracks.video.buffer || null);
|
|
}),
|
|
(r.onFragBuffered = function (t, e) {
|
|
var r = e.frag,
|
|
n = e.part;
|
|
if (r.type === ve)
|
|
if (this.fragContextChanged(r))
|
|
this.warn(
|
|
"Fragment " +
|
|
r.sn +
|
|
(n ? " p: " + n.index : "") +
|
|
" of level " +
|
|
r.level +
|
|
" finished buffering, but was aborted. state: " +
|
|
this.state +
|
|
", audioSwitch: " +
|
|
(this.switchingTrack ? this.switchingTrack.name : "false")
|
|
);
|
|
else {
|
|
if ("initSegment" !== r.sn) {
|
|
this.fragPrevious = r;
|
|
var a = this.switchingTrack;
|
|
a &&
|
|
((this.bufferedTrack = a),
|
|
(this.switchingTrack = null),
|
|
this.hls.trigger(S.AUDIO_TRACK_SWITCHED, i({}, a)));
|
|
}
|
|
this.fragBufferedComplete(r, n);
|
|
}
|
|
else if (!this.loadedmetadata && r.type === ge) {
|
|
var s = this.videoBuffer || this.media;
|
|
s && Ir.getBuffered(s).length && (this.loadedmetadata = !0);
|
|
}
|
|
}),
|
|
(r.onError = function (e, r) {
|
|
var i;
|
|
if (r.fatal) this.state = zr;
|
|
else
|
|
switch (r.details) {
|
|
case R.FRAG_GAP:
|
|
case R.FRAG_PARSING_ERROR:
|
|
case R.FRAG_DECRYPT_ERROR:
|
|
case R.FRAG_LOAD_ERROR:
|
|
case R.FRAG_LOAD_TIMEOUT:
|
|
case R.KEY_LOAD_ERROR:
|
|
case R.KEY_LOAD_TIMEOUT:
|
|
this.onFragmentOrKeyLoadError(ve, r);
|
|
break;
|
|
case R.AUDIO_TRACK_LOAD_ERROR:
|
|
case R.AUDIO_TRACK_LOAD_TIMEOUT:
|
|
case R.LEVEL_PARSING_ERROR:
|
|
r.levelRetry ||
|
|
this.state !== Wr ||
|
|
(null == (i = r.context) ? void 0 : i.type) !== ce ||
|
|
(this.state = Kr);
|
|
break;
|
|
case R.BUFFER_FULL_ERROR:
|
|
if (!r.parent || "audio" !== r.parent) return;
|
|
this.reduceLengthAndFlushBuffer(r) &&
|
|
((this.bufferedTrack = null),
|
|
t.prototype.flushMainBuffer.call(
|
|
this,
|
|
0,
|
|
Number.POSITIVE_INFINITY,
|
|
"audio"
|
|
));
|
|
break;
|
|
case R.INTERNAL_EXCEPTION:
|
|
this.recoverWorkerError(r);
|
|
}
|
|
}),
|
|
(r.onBufferFlushed = function (t, e) {
|
|
e.type === O &&
|
|
((this.bufferFlushed = !0),
|
|
this.state === Xr && (this.state = Kr));
|
|
}),
|
|
(r._handleTransmuxComplete = function (t) {
|
|
var e,
|
|
r = "audio",
|
|
i = this.hls,
|
|
n = t.remuxResult,
|
|
a = t.chunkMeta,
|
|
s = this.getCurrentContext(a);
|
|
if (s) {
|
|
var l = s.frag,
|
|
u = s.part,
|
|
h = s.level.details,
|
|
d = n.audio,
|
|
c = n.text,
|
|
f = n.id3,
|
|
g = n.initSegment;
|
|
if (!this.fragContextChanged(l) && h) {
|
|
if (
|
|
((this.state = jr),
|
|
this.switchingTrack &&
|
|
d &&
|
|
this.completeAudioSwitch(this.switchingTrack),
|
|
null != g && g.tracks)
|
|
) {
|
|
var v = l.initSegment || l;
|
|
this._bufferInitSegment(g.tracks, v, a),
|
|
i.trigger(S.FRAG_PARSING_INIT_SEGMENT, {
|
|
frag: v,
|
|
id: r,
|
|
tracks: g.tracks,
|
|
});
|
|
}
|
|
if (d) {
|
|
var m = d.startPTS,
|
|
p = d.endPTS,
|
|
y = d.startDTS,
|
|
T = d.endDTS;
|
|
u &&
|
|
(u.elementaryStreams[O] = {
|
|
startPTS: m,
|
|
endPTS: p,
|
|
startDTS: y,
|
|
endDTS: T,
|
|
}),
|
|
l.setElementaryStreamInfo(O, m, p, y, T),
|
|
this.bufferFragmentData(d, l, u, a);
|
|
}
|
|
if (null != f && null != (e = f.samples) && e.length) {
|
|
var E = o({ id: r, frag: l, details: h }, f);
|
|
i.trigger(S.FRAG_PARSING_METADATA, E);
|
|
}
|
|
if (c) {
|
|
var L = o({ id: r, frag: l, details: h }, c);
|
|
i.trigger(S.FRAG_PARSING_USERDATA, L);
|
|
}
|
|
} else this.fragmentTracker.removeFragment(l);
|
|
} else this.resetWhenMissingContext(a);
|
|
}),
|
|
(r._bufferInitSegment = function (t, e, r) {
|
|
if (this.state === jr) {
|
|
t.video && delete t.video;
|
|
var i = t.audio;
|
|
if (i) {
|
|
(i.levelCodec = i.codec),
|
|
(i.id = "audio"),
|
|
this.log(
|
|
"Init audio buffer, container:" +
|
|
i.container +
|
|
", codecs[parsed]=[" +
|
|
i.codec +
|
|
"]"
|
|
),
|
|
this.hls.trigger(S.BUFFER_CODECS, t);
|
|
var n = i.initSegment;
|
|
if (null != n && n.byteLength) {
|
|
var a = {
|
|
type: "audio",
|
|
frag: e,
|
|
part: null,
|
|
chunkMeta: r,
|
|
parent: e.type,
|
|
data: n,
|
|
};
|
|
this.hls.trigger(S.BUFFER_APPENDING, a);
|
|
}
|
|
this.tick();
|
|
}
|
|
}
|
|
}),
|
|
(r.loadFragment = function (e, r, i) {
|
|
var n,
|
|
a = this.fragmentTracker.getState(e);
|
|
(this.fragCurrent = e),
|
|
this.switchingTrack || a === fr || a === vr
|
|
? "initSegment" === e.sn
|
|
? this._loadInitSegment(e, r)
|
|
: null != (n = r.details) && n.live && !this.initPTS[e.cc]
|
|
? (this.log(
|
|
"Waiting for video PTS in continuity counter " +
|
|
e.cc +
|
|
" of live stream before loading audio fragment " +
|
|
e.sn +
|
|
" of level " +
|
|
this.trackId
|
|
),
|
|
(this.state = Qr))
|
|
: ((this.startFragRequested = !0),
|
|
t.prototype.loadFragment.call(this, e, r, i))
|
|
: this.clearTrackerIfNeeded(e);
|
|
}),
|
|
(r.completeAudioSwitch = function (e) {
|
|
var r = this.hls,
|
|
n = this.media,
|
|
a = this.bufferedTrack,
|
|
s = null == a ? void 0 : a.attrs,
|
|
o = e.attrs;
|
|
n &&
|
|
s &&
|
|
(s.CHANNELS !== o.CHANNELS ||
|
|
s.NAME !== o.NAME ||
|
|
s.LANGUAGE !== o.LANGUAGE) &&
|
|
(this.log("Switching audio track : flushing all audio"),
|
|
t.prototype.flushMainBuffer.call(
|
|
this,
|
|
0,
|
|
Number.POSITIVE_INFINITY,
|
|
"audio"
|
|
)),
|
|
(this.bufferedTrack = e),
|
|
(this.switchingTrack = null),
|
|
r.trigger(S.AUDIO_TRACK_SWITCHED, i({}, e));
|
|
}),
|
|
e
|
|
);
|
|
})(Jr),
|
|
yn = (function (t) {
|
|
function e(e) {
|
|
var r;
|
|
return (
|
|
((r =
|
|
t.call(this, e, "[audio-track-controller]") || this).tracks =
|
|
[]),
|
|
(r.groupId = null),
|
|
(r.tracksInGroup = []),
|
|
(r.trackId = -1),
|
|
(r.currentTrack = null),
|
|
(r.selectDefaultTrack = !0),
|
|
r.registerListeners(),
|
|
r
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.on(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.on(S.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this),
|
|
t.on(S.ERROR, this.onError, this);
|
|
}),
|
|
(r.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.off(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.off(S.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this),
|
|
t.off(S.ERROR, this.onError, this);
|
|
}),
|
|
(r.destroy = function () {
|
|
this.unregisterListeners(),
|
|
(this.tracks.length = 0),
|
|
(this.tracksInGroup.length = 0),
|
|
(this.currentTrack = null),
|
|
t.prototype.destroy.call(this);
|
|
}),
|
|
(r.onManifestLoading = function () {
|
|
(this.tracks = []),
|
|
(this.groupId = null),
|
|
(this.tracksInGroup = []),
|
|
(this.trackId = -1),
|
|
(this.currentTrack = null),
|
|
(this.selectDefaultTrack = !0);
|
|
}),
|
|
(r.onManifestParsed = function (t, e) {
|
|
this.tracks = e.audioTracks || [];
|
|
}),
|
|
(r.onAudioTrackLoaded = function (t, e) {
|
|
var r = e.id,
|
|
i = e.groupId,
|
|
n = e.details,
|
|
a = this.tracksInGroup[r];
|
|
if (a && a.groupId === i) {
|
|
var s = a.details;
|
|
(a.details = e.details),
|
|
this.log(
|
|
"audio-track " +
|
|
r +
|
|
' "' +
|
|
a.name +
|
|
'" lang:' +
|
|
a.lang +
|
|
" group:" +
|
|
i +
|
|
" loaded [" +
|
|
n.startSN +
|
|
"-" +
|
|
n.endSN +
|
|
"]"
|
|
),
|
|
r === this.trackId && this.playlistLoaded(r, e, s);
|
|
} else
|
|
this.warn(
|
|
"Track with id:" +
|
|
r +
|
|
" and group:" +
|
|
i +
|
|
" not found in active group " +
|
|
a.groupId
|
|
);
|
|
}),
|
|
(r.onLevelLoading = function (t, e) {
|
|
this.switchLevel(e.level);
|
|
}),
|
|
(r.onLevelSwitching = function (t, e) {
|
|
this.switchLevel(e.level);
|
|
}),
|
|
(r.switchLevel = function (t) {
|
|
var e = this.hls.levels[t];
|
|
if (null != e && e.audioGroupIds) {
|
|
var r = e.audioGroupIds[e.urlId];
|
|
if (this.groupId !== r) {
|
|
this.groupId = r || null;
|
|
var i = this.tracks.filter(function (t) {
|
|
return !r || t.groupId === r;
|
|
});
|
|
this.selectDefaultTrack &&
|
|
!i.some(function (t) {
|
|
return t.default;
|
|
}) &&
|
|
(this.selectDefaultTrack = !1),
|
|
(this.tracksInGroup = i);
|
|
var n = { audioTracks: i };
|
|
this.log(
|
|
"Updating audio tracks, " +
|
|
i.length +
|
|
" track(s) found in group:" +
|
|
r
|
|
),
|
|
this.hls.trigger(S.AUDIO_TRACKS_UPDATED, n),
|
|
this.selectInitialTrack();
|
|
} else
|
|
this.shouldReloadPlaylist(this.currentTrack) &&
|
|
this.setAudioTrack(this.trackId);
|
|
}
|
|
}),
|
|
(r.onError = function (t, e) {
|
|
!e.fatal &&
|
|
e.context &&
|
|
e.context.type === ce &&
|
|
e.context.id === this.trackId &&
|
|
e.context.groupId === this.groupId &&
|
|
((this.requestScheduled = -1), this.checkRetry(e));
|
|
}),
|
|
(r.setAudioTrack = function (t) {
|
|
var e = this.tracksInGroup;
|
|
if (t < 0 || t >= e.length)
|
|
this.warn("Invalid id passed to audio-track controller");
|
|
else {
|
|
this.clearTimer();
|
|
var r = this.currentTrack;
|
|
e[this.trackId];
|
|
var n = e[t],
|
|
a = n.groupId,
|
|
s = n.name;
|
|
if (
|
|
(this.log(
|
|
"Switching to audio-track " +
|
|
t +
|
|
' "' +
|
|
s +
|
|
'" lang:' +
|
|
n.lang +
|
|
" group:" +
|
|
a
|
|
),
|
|
(this.trackId = t),
|
|
(this.currentTrack = n),
|
|
(this.selectDefaultTrack = !1),
|
|
this.hls.trigger(S.AUDIO_TRACK_SWITCHING, i({}, n)),
|
|
!n.details || n.details.live)
|
|
) {
|
|
var o = this.switchParams(
|
|
n.url,
|
|
null == r ? void 0 : r.details
|
|
);
|
|
this.loadPlaylist(o);
|
|
}
|
|
}
|
|
}),
|
|
(r.selectInitialTrack = function () {
|
|
var t = this.tracksInGroup,
|
|
e =
|
|
this.findTrackId(this.currentTrack) | this.findTrackId(null);
|
|
if (-1 !== e) this.setAudioTrack(e);
|
|
else {
|
|
var r = new Error(
|
|
"No track found for running audio group-ID: " +
|
|
this.groupId +
|
|
" track count: " +
|
|
t.length
|
|
);
|
|
this.warn(r.message),
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.AUDIO_TRACK_LOAD_ERROR,
|
|
fatal: !0,
|
|
error: r,
|
|
});
|
|
}
|
|
}),
|
|
(r.findTrackId = function (t) {
|
|
for (var e = this.tracksInGroup, r = 0; r < e.length; r++) {
|
|
var i = e[r];
|
|
if (!this.selectDefaultTrack || i.default) {
|
|
if (
|
|
!t ||
|
|
(void 0 !== t.attrs["STABLE-RENDITION-ID"] &&
|
|
t.attrs["STABLE-RENDITION-ID"] ===
|
|
i.attrs["STABLE-RENDITION-ID"])
|
|
)
|
|
return i.id;
|
|
if (t.name === i.name && t.lang === i.lang) return i.id;
|
|
}
|
|
}
|
|
return -1;
|
|
}),
|
|
(r.loadPlaylist = function (e) {
|
|
t.prototype.loadPlaylist.call(this);
|
|
var r = this.tracksInGroup[this.trackId];
|
|
if (this.shouldLoadPlaylist(r)) {
|
|
var i = r.id,
|
|
n = r.groupId,
|
|
a = r.url;
|
|
if (e)
|
|
try {
|
|
a = e.addDirectives(a);
|
|
} catch (t) {
|
|
this.warn(
|
|
"Could not construct new URL with HLS Delivery Directives: " +
|
|
t
|
|
);
|
|
}
|
|
this.log(
|
|
"loading audio-track playlist " +
|
|
i +
|
|
' "' +
|
|
r.name +
|
|
'" lang:' +
|
|
r.lang +
|
|
" group:" +
|
|
n
|
|
),
|
|
this.clearTimer(),
|
|
this.hls.trigger(S.AUDIO_TRACK_LOADING, {
|
|
url: a,
|
|
id: i,
|
|
groupId: n,
|
|
deliveryDirectives: e || null,
|
|
});
|
|
}
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "audioTracks",
|
|
get: function () {
|
|
return this.tracksInGroup;
|
|
},
|
|
},
|
|
{
|
|
key: "audioTrack",
|
|
get: function () {
|
|
return this.trackId;
|
|
},
|
|
set: function (t) {
|
|
(this.selectDefaultTrack = !1), this.setAudioTrack(t);
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(ur);
|
|
function Tn(t, e) {
|
|
if (t.length !== e.length) return !1;
|
|
for (var r = 0; r < t.length; r++)
|
|
if (!En(t[r].attrs, e[r].attrs)) return !1;
|
|
return !0;
|
|
}
|
|
function En(t, e) {
|
|
var r = t["STABLE-RENDITION-ID"];
|
|
return r
|
|
? r === e["STABLE-RENDITION-ID"]
|
|
: ![
|
|
"LANGUAGE",
|
|
"NAME",
|
|
"CHARACTERISTICS",
|
|
"AUTOSELECT",
|
|
"DEFAULT",
|
|
"FORCED",
|
|
].some(function (r) {
|
|
return t[r] !== e[r];
|
|
});
|
|
}
|
|
var Sn = (function (t) {
|
|
function e(e, r, i) {
|
|
var n;
|
|
return (
|
|
((n =
|
|
t.call(this, e, r, i, "[subtitle-stream-controller]", me) ||
|
|
this).levels = []),
|
|
(n.currentTrackId = -1),
|
|
(n.tracksBuffered = []),
|
|
(n.mainDetails = null),
|
|
n._registerListeners(),
|
|
n
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.onHandlerDestroying = function () {
|
|
this._unregisterListeners(), (this.mainDetails = null);
|
|
}),
|
|
(r._registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.on(S.ERROR, this.onError, this),
|
|
t.on(
|
|
S.SUBTITLE_TRACKS_UPDATED,
|
|
this.onSubtitleTracksUpdated,
|
|
this
|
|
),
|
|
t.on(S.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this),
|
|
t.on(S.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
|
|
t.on(
|
|
S.SUBTITLE_FRAG_PROCESSED,
|
|
this.onSubtitleFragProcessed,
|
|
this
|
|
),
|
|
t.on(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.on(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r._unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.LEVEL_LOADED, this.onLevelLoaded, this),
|
|
t.off(S.ERROR, this.onError, this),
|
|
t.off(
|
|
S.SUBTITLE_TRACKS_UPDATED,
|
|
this.onSubtitleTracksUpdated,
|
|
this
|
|
),
|
|
t.off(
|
|
S.SUBTITLE_TRACK_SWITCH,
|
|
this.onSubtitleTrackSwitch,
|
|
this
|
|
),
|
|
t.off(
|
|
S.SUBTITLE_TRACK_LOADED,
|
|
this.onSubtitleTrackLoaded,
|
|
this
|
|
),
|
|
t.off(
|
|
S.SUBTITLE_FRAG_PROCESSED,
|
|
this.onSubtitleFragProcessed,
|
|
this
|
|
),
|
|
t.off(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.off(S.FRAG_BUFFERED, this.onFragBuffered, this);
|
|
}),
|
|
(r.startLoad = function (t) {
|
|
this.stopLoad(),
|
|
(this.state = Kr),
|
|
this.setInterval(500),
|
|
(this.nextLoadPosition =
|
|
this.startPosition =
|
|
this.lastCurrentTime =
|
|
t),
|
|
this.tick();
|
|
}),
|
|
(r.onManifestLoading = function () {
|
|
(this.mainDetails = null),
|
|
this.fragmentTracker.removeAllFragments();
|
|
}),
|
|
(r.onMediaDetaching = function () {
|
|
(this.tracksBuffered = []),
|
|
t.prototype.onMediaDetaching.call(this);
|
|
}),
|
|
(r.onLevelLoaded = function (t, e) {
|
|
this.mainDetails = e.details;
|
|
}),
|
|
(r.onSubtitleFragProcessed = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.success;
|
|
if (((this.fragPrevious = r), (this.state = Kr), i)) {
|
|
var n = this.tracksBuffered[this.currentTrackId];
|
|
if (n) {
|
|
for (var a, s = r.start, o = 0; o < n.length; o++)
|
|
if (s >= n[o].start && s <= n[o].end) {
|
|
a = n[o];
|
|
break;
|
|
}
|
|
var l = r.start + r.duration;
|
|
a ? (a.end = l) : ((a = { start: s, end: l }), n.push(a)),
|
|
this.fragmentTracker.fragBuffered(r);
|
|
}
|
|
}
|
|
}),
|
|
(r.onBufferFlushing = function (t, e) {
|
|
var r = e.startOffset,
|
|
i = e.endOffset;
|
|
if (0 === r && i !== Number.POSITIVE_INFINITY) {
|
|
var n = i - 1;
|
|
if (n <= 0) return;
|
|
(e.endOffsetSubtitles = Math.max(0, n)),
|
|
this.tracksBuffered.forEach(function (t) {
|
|
for (var e = 0; e < t.length; )
|
|
if (t[e].end <= n) t.shift();
|
|
else {
|
|
if (!(t[e].start < n)) break;
|
|
(t[e].start = n), e++;
|
|
}
|
|
}),
|
|
this.fragmentTracker.removeFragmentsInRange(r, n, me);
|
|
}
|
|
}),
|
|
(r.onFragBuffered = function (t, e) {
|
|
var r;
|
|
this.loadedmetadata ||
|
|
e.frag.type !== ge ||
|
|
(null != (r = this.media) &&
|
|
r.buffered.length &&
|
|
(this.loadedmetadata = !0));
|
|
}),
|
|
(r.onError = function (t, e) {
|
|
var r = e.frag;
|
|
(null == r ? void 0 : r.type) === me &&
|
|
(this.fragCurrent && this.fragCurrent.abortRequests(),
|
|
this.state !== Gr && (this.state = Kr));
|
|
}),
|
|
(r.onSubtitleTracksUpdated = function (t, e) {
|
|
var r = this,
|
|
i = e.subtitleTracks;
|
|
Tn(this.levels, i)
|
|
? (this.levels = i.map(function (t) {
|
|
return new Ne(t);
|
|
}))
|
|
: ((this.tracksBuffered = []),
|
|
(this.levels = i.map(function (t) {
|
|
var e = new Ne(t);
|
|
return (r.tracksBuffered[e.id] = []), e;
|
|
})),
|
|
this.fragmentTracker.removeFragmentsInRange(
|
|
0,
|
|
Number.POSITIVE_INFINITY,
|
|
me
|
|
),
|
|
(this.fragPrevious = null),
|
|
(this.mediaBuffer = null));
|
|
}),
|
|
(r.onSubtitleTrackSwitch = function (t, e) {
|
|
if (
|
|
((this.currentTrackId = e.id),
|
|
this.levels.length && -1 !== this.currentTrackId)
|
|
) {
|
|
var r = this.levels[this.currentTrackId];
|
|
null != r && r.details
|
|
? (this.mediaBuffer = this.mediaBufferTimeRanges)
|
|
: (this.mediaBuffer = null),
|
|
r && this.setInterval(500);
|
|
} else this.clearInterval();
|
|
}),
|
|
(r.onSubtitleTrackLoaded = function (t, e) {
|
|
var r,
|
|
i = e.details,
|
|
n = e.id,
|
|
a = this.currentTrackId,
|
|
s = this.levels;
|
|
if (s.length) {
|
|
var o = s[a];
|
|
if (!(n >= s.length || n !== a) && o) {
|
|
this.mediaBuffer = this.mediaBufferTimeRanges;
|
|
var l = 0;
|
|
if (i.live || (null != (r = o.details) && r.live)) {
|
|
var u = this.mainDetails;
|
|
if (i.deltaUpdateFailed || !u) return;
|
|
var h = u.fragments[0];
|
|
o.details
|
|
? 0 === (l = this.alignPlaylists(i, o.details)) &&
|
|
h &&
|
|
He(i, (l = h.start))
|
|
: i.hasProgramDateTime && u.hasProgramDateTime
|
|
? (Fr(i, u), (l = i.fragments[0].start))
|
|
: h && He(i, (l = h.start));
|
|
}
|
|
(o.details = i),
|
|
(this.levelLastLoaded = n),
|
|
this.startFragRequested ||
|
|
(!this.mainDetails && i.live) ||
|
|
this.setStartPosition(o.details, l),
|
|
this.tick(),
|
|
i.live &&
|
|
!this.fragCurrent &&
|
|
this.media &&
|
|
this.state === Kr &&
|
|
($e(null, i.fragments, this.media.currentTime, 0) ||
|
|
(this.warn(
|
|
"Subtitle playlist not aligned with playback"
|
|
),
|
|
(o.details = void 0)));
|
|
}
|
|
}
|
|
}),
|
|
(r._handleFragmentLoadComplete = function (t) {
|
|
var e = this,
|
|
r = t.frag,
|
|
i = t.payload,
|
|
n = r.decryptdata,
|
|
a = this.hls;
|
|
if (
|
|
!this.fragContextChanged(r) &&
|
|
i &&
|
|
i.byteLength > 0 &&
|
|
n &&
|
|
n.key &&
|
|
n.iv &&
|
|
"AES-128" === n.method
|
|
) {
|
|
var s = performance.now();
|
|
this.decrypter
|
|
.decrypt(new Uint8Array(i), n.key.buffer, n.iv.buffer)
|
|
.catch(function (t) {
|
|
throw (
|
|
(a.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.FRAG_DECRYPT_ERROR,
|
|
fatal: !1,
|
|
error: t,
|
|
reason: t.message,
|
|
frag: r,
|
|
}),
|
|
t)
|
|
);
|
|
})
|
|
.then(function (t) {
|
|
var e = performance.now();
|
|
a.trigger(S.FRAG_DECRYPTED, {
|
|
frag: r,
|
|
payload: t,
|
|
stats: { tstart: s, tdecrypt: e },
|
|
});
|
|
})
|
|
.catch(function (t) {
|
|
e.warn(t.name + ": " + t.message), (e.state = Kr);
|
|
});
|
|
}
|
|
}),
|
|
(r.doTick = function () {
|
|
if (this.media) {
|
|
if (this.state === Kr) {
|
|
var t = this.currentTrackId,
|
|
e = this.levels,
|
|
r = e[t];
|
|
if (!e.length || !r || !r.details) return;
|
|
var i = this.config,
|
|
n = this.getLoadPosition(),
|
|
a = Ir.bufferedInfo(
|
|
this.tracksBuffered[this.currentTrackId] || [],
|
|
n,
|
|
i.maxBufferHole
|
|
),
|
|
s = a.end,
|
|
o = a.len,
|
|
l = this.getFwdBufferInfo(this.media, ge),
|
|
u = r.details;
|
|
if (
|
|
o >
|
|
this.getMaxBufferLength(null == l ? void 0 : l.len) +
|
|
u.levelTargetDuration
|
|
)
|
|
return;
|
|
var h = u.fragments,
|
|
d = h.length,
|
|
c = u.edge,
|
|
f = null,
|
|
g = this.fragPrevious;
|
|
if (s < c) {
|
|
var v = i.maxFragLookUpTolerance,
|
|
m = s > c - v ? 0 : v;
|
|
!(f = $e(g, h, Math.max(h[0].start, s), m)) &&
|
|
g &&
|
|
g.start < h[0].start &&
|
|
(f = h[0]);
|
|
} else f = h[d - 1];
|
|
if (!f) return;
|
|
if (
|
|
"initSegment" !== (f = this.mapToInitFragWhenRequired(f)).sn
|
|
) {
|
|
var p = h[f.sn - u.startSN - 1];
|
|
p &&
|
|
p.cc === f.cc &&
|
|
this.fragmentTracker.getState(p) === fr &&
|
|
(f = p);
|
|
}
|
|
this.fragmentTracker.getState(f) === fr &&
|
|
this.loadFragment(f, r, s);
|
|
}
|
|
} else this.state = Kr;
|
|
}),
|
|
(r.getMaxBufferLength = function (e) {
|
|
var r = t.prototype.getMaxBufferLength.call(this);
|
|
return e ? Math.max(r, e) : r;
|
|
}),
|
|
(r.loadFragment = function (e, r, i) {
|
|
(this.fragCurrent = e),
|
|
"initSegment" === e.sn
|
|
? this._loadInitSegment(e, r)
|
|
: ((this.startFragRequested = !0),
|
|
t.prototype.loadFragment.call(this, e, r, i));
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "mediaBufferTimeRanges",
|
|
get: function () {
|
|
return new Ln(this.tracksBuffered[this.currentTrackId] || []);
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(Jr),
|
|
Ln = function (t) {
|
|
this.buffered = void 0;
|
|
var e = function (e, r, i) {
|
|
if ((r >>>= 0) > i - 1)
|
|
throw new DOMException(
|
|
"Failed to execute '" +
|
|
e +
|
|
"' on 'TimeRanges': The index provided (" +
|
|
r +
|
|
") is greater than the maximum bound (" +
|
|
i +
|
|
")"
|
|
);
|
|
return t[r][e];
|
|
};
|
|
this.buffered = {
|
|
get length() {
|
|
return t.length;
|
|
},
|
|
end: function (r) {
|
|
return e("end", r, t.length);
|
|
},
|
|
start: function (r) {
|
|
return e("start", r, t.length);
|
|
},
|
|
};
|
|
},
|
|
Rn = (function (t) {
|
|
function e(e) {
|
|
var r;
|
|
return (
|
|
((r =
|
|
t.call(this, e, "[subtitle-track-controller]") || this).media =
|
|
null),
|
|
(r.tracks = []),
|
|
(r.groupId = null),
|
|
(r.tracksInGroup = []),
|
|
(r.trackId = -1),
|
|
(r.selectDefaultTrack = !0),
|
|
(r.queuedDefaultTrack = -1),
|
|
(r.trackChangeListener = function () {
|
|
return r.onTextTracksChanged();
|
|
}),
|
|
(r.asyncPollTrackChange = function () {
|
|
return r.pollTrackChange(0);
|
|
}),
|
|
(r.useTextTrackPolling = !1),
|
|
(r.subtitlePollingInterval = -1),
|
|
(r._subtitleDisplay = !0),
|
|
r.registerListeners(),
|
|
r
|
|
);
|
|
}
|
|
l(e, t);
|
|
var r = e.prototype;
|
|
return (
|
|
(r.destroy = function () {
|
|
this.unregisterListeners(),
|
|
(this.tracks.length = 0),
|
|
(this.tracksInGroup.length = 0),
|
|
(this.trackChangeListener = this.asyncPollTrackChange = null),
|
|
t.prototype.destroy.call(this);
|
|
}),
|
|
(r.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.on(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.on(S.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
|
|
t.on(S.ERROR, this.onError, this);
|
|
}),
|
|
(r.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.LEVEL_LOADING, this.onLevelLoading, this),
|
|
t.off(S.LEVEL_SWITCHING, this.onLevelSwitching, this),
|
|
t.off(
|
|
S.SUBTITLE_TRACK_LOADED,
|
|
this.onSubtitleTrackLoaded,
|
|
this
|
|
),
|
|
t.off(S.ERROR, this.onError, this);
|
|
}),
|
|
(r.onMediaAttached = function (t, e) {
|
|
(this.media = e.media),
|
|
this.media &&
|
|
(this.queuedDefaultTrack > -1 &&
|
|
((this.subtitleTrack = this.queuedDefaultTrack),
|
|
(this.queuedDefaultTrack = -1)),
|
|
(this.useTextTrackPolling = !(
|
|
this.media.textTracks && "onchange" in this.media.textTracks
|
|
)),
|
|
this.useTextTrackPolling
|
|
? this.pollTrackChange(500)
|
|
: this.media.textTracks.addEventListener(
|
|
"change",
|
|
this.asyncPollTrackChange
|
|
));
|
|
}),
|
|
(r.pollTrackChange = function (t) {
|
|
self.clearInterval(this.subtitlePollingInterval),
|
|
(this.subtitlePollingInterval = self.setInterval(
|
|
this.trackChangeListener,
|
|
t
|
|
));
|
|
}),
|
|
(r.onMediaDetaching = function () {
|
|
this.media &&
|
|
(self.clearInterval(this.subtitlePollingInterval),
|
|
this.useTextTrackPolling ||
|
|
this.media.textTracks.removeEventListener(
|
|
"change",
|
|
this.asyncPollTrackChange
|
|
),
|
|
this.trackId > -1 && (this.queuedDefaultTrack = this.trackId),
|
|
An(this.media.textTracks).forEach(function (t) {
|
|
Le(t);
|
|
}),
|
|
(this.subtitleTrack = -1),
|
|
(this.media = null));
|
|
}),
|
|
(r.onManifestLoading = function () {
|
|
(this.tracks = []),
|
|
(this.groupId = null),
|
|
(this.tracksInGroup = []),
|
|
(this.trackId = -1),
|
|
(this.selectDefaultTrack = !0);
|
|
}),
|
|
(r.onManifestParsed = function (t, e) {
|
|
this.tracks = e.subtitleTracks;
|
|
}),
|
|
(r.onSubtitleTrackLoaded = function (t, e) {
|
|
var r = e.id,
|
|
i = e.details,
|
|
n = this.trackId,
|
|
a = this.tracksInGroup[n];
|
|
if (a) {
|
|
var s = a.details;
|
|
(a.details = e.details),
|
|
this.log(
|
|
"subtitle track " +
|
|
r +
|
|
" loaded [" +
|
|
i.startSN +
|
|
"-" +
|
|
i.endSN +
|
|
"]"
|
|
),
|
|
r === this.trackId && this.playlistLoaded(r, e, s);
|
|
} else this.warn("Invalid subtitle track id " + r);
|
|
}),
|
|
(r.onLevelLoading = function (t, e) {
|
|
this.switchLevel(e.level);
|
|
}),
|
|
(r.onLevelSwitching = function (t, e) {
|
|
this.switchLevel(e.level);
|
|
}),
|
|
(r.switchLevel = function (t) {
|
|
var e = this.hls.levels[t];
|
|
if (null != e && e.textGroupIds) {
|
|
var r = e.textGroupIds[e.urlId],
|
|
i = this.tracksInGroup
|
|
? this.tracksInGroup[this.trackId]
|
|
: void 0;
|
|
if (this.groupId !== r) {
|
|
var n = this.tracks.filter(function (t) {
|
|
return !r || t.groupId === r;
|
|
});
|
|
this.tracksInGroup = n;
|
|
var a =
|
|
this.findTrackId(null == i ? void 0 : i.name) ||
|
|
this.findTrackId();
|
|
this.groupId = r || null;
|
|
var s = { subtitleTracks: n };
|
|
this.log(
|
|
"Updating subtitle tracks, " +
|
|
n.length +
|
|
' track(s) found in "' +
|
|
r +
|
|
'" group-id'
|
|
),
|
|
this.hls.trigger(S.SUBTITLE_TRACKS_UPDATED, s),
|
|
-1 !== a && this.setSubtitleTrack(a, i);
|
|
} else
|
|
this.shouldReloadPlaylist(i) &&
|
|
this.setSubtitleTrack(this.trackId, i);
|
|
}
|
|
}),
|
|
(r.findTrackId = function (t) {
|
|
for (var e = this.tracksInGroup, r = 0; r < e.length; r++) {
|
|
var i = e[r];
|
|
if (
|
|
(!this.selectDefaultTrack || i.default) &&
|
|
(!t || t === i.name)
|
|
)
|
|
return i.id;
|
|
}
|
|
return -1;
|
|
}),
|
|
(r.onError = function (t, e) {
|
|
!e.fatal &&
|
|
e.context &&
|
|
e.context.type === fe &&
|
|
e.context.id === this.trackId &&
|
|
e.context.groupId === this.groupId &&
|
|
this.checkRetry(e);
|
|
}),
|
|
(r.loadPlaylist = function (e) {
|
|
t.prototype.loadPlaylist.call(this);
|
|
var r = this.tracksInGroup[this.trackId];
|
|
if (this.shouldLoadPlaylist(r)) {
|
|
var i = r.id,
|
|
n = r.groupId,
|
|
a = r.url;
|
|
if (e)
|
|
try {
|
|
a = e.addDirectives(a);
|
|
} catch (t) {
|
|
this.warn(
|
|
"Could not construct new URL with HLS Delivery Directives: " +
|
|
t
|
|
);
|
|
}
|
|
this.log("Loading subtitle playlist for id " + i),
|
|
this.hls.trigger(S.SUBTITLE_TRACK_LOADING, {
|
|
url: a,
|
|
id: i,
|
|
groupId: n,
|
|
deliveryDirectives: e || null,
|
|
});
|
|
}
|
|
}),
|
|
(r.toggleTrackModes = function (t) {
|
|
var e = this,
|
|
r = this.media,
|
|
i = this.trackId;
|
|
if (r) {
|
|
var n = An(r.textTracks),
|
|
a = n.filter(function (t) {
|
|
return t.groupId === e.groupId;
|
|
});
|
|
if (-1 === t)
|
|
[].slice.call(n).forEach(function (t) {
|
|
t.mode = "disabled";
|
|
});
|
|
else {
|
|
var s = a[i];
|
|
s && (s.mode = "disabled");
|
|
}
|
|
var o = a[t];
|
|
o && (o.mode = this.subtitleDisplay ? "showing" : "hidden");
|
|
}
|
|
}),
|
|
(r.setSubtitleTrack = function (t, e) {
|
|
var r,
|
|
i = this.tracksInGroup;
|
|
if (this.media) {
|
|
if (
|
|
(this.trackId !== t && this.toggleTrackModes(t),
|
|
!(
|
|
(this.trackId === t &&
|
|
(-1 === t || (null != (r = i[t]) && r.details))) ||
|
|
t < -1 ||
|
|
t >= i.length
|
|
))
|
|
) {
|
|
this.clearTimer();
|
|
var n = i[t];
|
|
if (
|
|
(this.log(
|
|
"Switching to subtitle-track " +
|
|
t +
|
|
(n
|
|
? ' "' +
|
|
n.name +
|
|
'" lang:' +
|
|
n.lang +
|
|
" group:" +
|
|
n.groupId
|
|
: "")
|
|
),
|
|
(this.trackId = t),
|
|
n)
|
|
) {
|
|
var a = n.id,
|
|
s = n.groupId,
|
|
o = void 0 === s ? "" : s,
|
|
l = n.name,
|
|
u = n.type,
|
|
h = n.url;
|
|
this.hls.trigger(S.SUBTITLE_TRACK_SWITCH, {
|
|
id: a,
|
|
groupId: o,
|
|
name: l,
|
|
type: u,
|
|
url: h,
|
|
});
|
|
var d = this.switchParams(
|
|
n.url,
|
|
null == e ? void 0 : e.details
|
|
);
|
|
this.loadPlaylist(d);
|
|
} else this.hls.trigger(S.SUBTITLE_TRACK_SWITCH, { id: t });
|
|
}
|
|
} else this.queuedDefaultTrack = t;
|
|
}),
|
|
(r.onTextTracksChanged = function () {
|
|
if (
|
|
(this.useTextTrackPolling ||
|
|
self.clearInterval(this.subtitlePollingInterval),
|
|
this.media && this.hls.config.renderTextTracksNatively)
|
|
) {
|
|
for (
|
|
var t = -1, e = An(this.media.textTracks), r = 0;
|
|
r < e.length;
|
|
r++
|
|
)
|
|
if ("hidden" === e[r].mode) t = r;
|
|
else if ("showing" === e[r].mode) {
|
|
t = r;
|
|
break;
|
|
}
|
|
this.subtitleTrack !== t && (this.subtitleTrack = t);
|
|
}
|
|
}),
|
|
a(e, [
|
|
{
|
|
key: "subtitleDisplay",
|
|
get: function () {
|
|
return this._subtitleDisplay;
|
|
},
|
|
set: function (t) {
|
|
(this._subtitleDisplay = t),
|
|
this.trackId > -1 && this.toggleTrackModes(this.trackId);
|
|
},
|
|
},
|
|
{
|
|
key: "subtitleTracks",
|
|
get: function () {
|
|
return this.tracksInGroup;
|
|
},
|
|
},
|
|
{
|
|
key: "subtitleTrack",
|
|
get: function () {
|
|
return this.trackId;
|
|
},
|
|
set: function (t) {
|
|
this.selectDefaultTrack = !1;
|
|
var e = this.tracksInGroup
|
|
? this.tracksInGroup[this.trackId]
|
|
: void 0;
|
|
this.setSubtitleTrack(t, e);
|
|
},
|
|
},
|
|
]),
|
|
e
|
|
);
|
|
})(ur);
|
|
function An(t) {
|
|
for (var e = [], r = 0; r < t.length; r++) {
|
|
var i = t[r];
|
|
("subtitles" !== i.kind && "captions" !== i.kind) ||
|
|
!i.label ||
|
|
e.push(t[r]);
|
|
}
|
|
return e;
|
|
}
|
|
var kn = (function () {
|
|
function t(t) {
|
|
(this.buffers = void 0),
|
|
(this.queues = { video: [], audio: [], audiovideo: [] }),
|
|
(this.buffers = t);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.append = function (t, e) {
|
|
var r = this.queues[e];
|
|
r.push(t),
|
|
1 === r.length && this.buffers[e] && this.executeNext(e);
|
|
}),
|
|
(e.insertAbort = function (t, e) {
|
|
this.queues[e].unshift(t), this.executeNext(e);
|
|
}),
|
|
(e.appendBlocker = function (t) {
|
|
var e,
|
|
r = new Promise(function (t) {
|
|
e = t;
|
|
}),
|
|
i = {
|
|
execute: e,
|
|
onStart: function () {},
|
|
onComplete: function () {},
|
|
onError: function () {},
|
|
};
|
|
return this.append(i, t), r;
|
|
}),
|
|
(e.executeNext = function (t) {
|
|
var e = this.buffers,
|
|
r = this.queues,
|
|
i = e[t],
|
|
n = r[t];
|
|
if (n.length) {
|
|
var a = n[0];
|
|
try {
|
|
a.execute();
|
|
} catch (e) {
|
|
w.warn(
|
|
"[buffer-operation-queue]: Unhandled exception executing the current operation"
|
|
),
|
|
a.onError(e),
|
|
(null != i && i.updating) ||
|
|
(n.shift(), this.executeNext(t));
|
|
}
|
|
}
|
|
}),
|
|
(e.shiftAndExecuteNext = function (t) {
|
|
this.queues[t].shift(), this.executeNext(t);
|
|
}),
|
|
(e.current = function (t) {
|
|
return this.queues[t][0];
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
bn = qt(),
|
|
Dn = /([ha]vc.)(?:\.[^.,]+)+/,
|
|
In = (function () {
|
|
function t(t) {
|
|
var e = this;
|
|
(this.details = null),
|
|
(this._objectUrl = null),
|
|
(this.operationQueue = void 0),
|
|
(this.listeners = void 0),
|
|
(this.hls = void 0),
|
|
(this.bufferCodecEventsExpected = 0),
|
|
(this._bufferCodecEventsTotal = 0),
|
|
(this.media = null),
|
|
(this.mediaSource = null),
|
|
(this.lastMpegAudioChunk = null),
|
|
(this.appendError = 0),
|
|
(this.tracks = {}),
|
|
(this.pendingTracks = {}),
|
|
(this.sourceBuffer = void 0),
|
|
(this._onMediaSourceOpen = function () {
|
|
var t = e.media,
|
|
r = e.mediaSource;
|
|
w.log("[buffer-controller]: Media source opened"),
|
|
t &&
|
|
(t.removeEventListener("emptied", e._onMediaEmptied),
|
|
e.updateMediaElementDuration(),
|
|
e.hls.trigger(S.MEDIA_ATTACHED, { media: t })),
|
|
r &&
|
|
r.removeEventListener("sourceopen", e._onMediaSourceOpen),
|
|
e.checkPendingTracks();
|
|
}),
|
|
(this._onMediaSourceClose = function () {
|
|
w.log("[buffer-controller]: Media source closed");
|
|
}),
|
|
(this._onMediaSourceEnded = function () {
|
|
w.log("[buffer-controller]: Media source ended");
|
|
}),
|
|
(this._onMediaEmptied = function () {
|
|
var t = e.media,
|
|
r = e._objectUrl;
|
|
t &&
|
|
t.src !== r &&
|
|
w.error(
|
|
"Media element src was set while attaching MediaSource (" +
|
|
r +
|
|
" > " +
|
|
t.src +
|
|
")"
|
|
);
|
|
}),
|
|
(this.hls = t),
|
|
this._initSourceBuffer(),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.hasSourceTypes = function () {
|
|
return (
|
|
this.getSourceBufferTypes().length > 0 ||
|
|
Object.keys(this.pendingTracks).length > 0
|
|
);
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
(this.details = null),
|
|
(this.lastMpegAudioChunk = null);
|
|
}),
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.BUFFER_RESET, this.onBufferReset, this),
|
|
t.on(S.BUFFER_APPENDING, this.onBufferAppending, this),
|
|
t.on(S.BUFFER_CODECS, this.onBufferCodecs, this),
|
|
t.on(S.BUFFER_EOS, this.onBufferEos, this),
|
|
t.on(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.on(S.LEVEL_UPDATED, this.onLevelUpdated, this),
|
|
t.on(S.FRAG_PARSED, this.onFragParsed, this),
|
|
t.on(S.FRAG_CHANGED, this.onFragChanged, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.BUFFER_RESET, this.onBufferReset, this),
|
|
t.off(S.BUFFER_APPENDING, this.onBufferAppending, this),
|
|
t.off(S.BUFFER_CODECS, this.onBufferCodecs, this),
|
|
t.off(S.BUFFER_EOS, this.onBufferEos, this),
|
|
t.off(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
t.off(S.LEVEL_UPDATED, this.onLevelUpdated, this),
|
|
t.off(S.FRAG_PARSED, this.onFragParsed, this),
|
|
t.off(S.FRAG_CHANGED, this.onFragChanged, this);
|
|
}),
|
|
(e._initSourceBuffer = function () {
|
|
(this.sourceBuffer = {}),
|
|
(this.operationQueue = new kn(this.sourceBuffer)),
|
|
(this.listeners = { audio: [], video: [], audiovideo: [] }),
|
|
(this.lastMpegAudioChunk = null);
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
(this.bufferCodecEventsExpected = this._bufferCodecEventsTotal =
|
|
0),
|
|
(this.details = null);
|
|
}),
|
|
(e.onManifestParsed = function (t, e) {
|
|
var r = 2;
|
|
((e.audio && !e.video) || !e.altAudio) && (r = 1),
|
|
(this.bufferCodecEventsExpected = this._bufferCodecEventsTotal =
|
|
r),
|
|
w.log(
|
|
this.bufferCodecEventsExpected +
|
|
" bufferCodec event(s) expected"
|
|
);
|
|
}),
|
|
(e.onMediaAttaching = function (t, e) {
|
|
var r = (this.media = e.media);
|
|
if (r && bn) {
|
|
var i = (this.mediaSource = new bn());
|
|
i.addEventListener("sourceopen", this._onMediaSourceOpen),
|
|
i.addEventListener("sourceended", this._onMediaSourceEnded),
|
|
i.addEventListener("sourceclose", this._onMediaSourceClose),
|
|
(r.src = self.URL.createObjectURL(i)),
|
|
(this._objectUrl = r.src),
|
|
r.addEventListener("emptied", this._onMediaEmptied);
|
|
}
|
|
}),
|
|
(e.onMediaDetaching = function () {
|
|
var t = this.media,
|
|
e = this.mediaSource,
|
|
r = this._objectUrl;
|
|
if (e) {
|
|
if (
|
|
(w.log("[buffer-controller]: media source detaching"),
|
|
"open" === e.readyState)
|
|
)
|
|
try {
|
|
e.endOfStream();
|
|
} catch (t) {
|
|
w.warn(
|
|
"[buffer-controller]: onMediaDetaching: " +
|
|
t.message +
|
|
" while calling endOfStream"
|
|
);
|
|
}
|
|
this.onBufferReset(),
|
|
e.removeEventListener("sourceopen", this._onMediaSourceOpen),
|
|
e.removeEventListener(
|
|
"sourceended",
|
|
this._onMediaSourceEnded
|
|
),
|
|
e.removeEventListener(
|
|
"sourceclose",
|
|
this._onMediaSourceClose
|
|
),
|
|
t &&
|
|
(t.removeEventListener("emptied", this._onMediaEmptied),
|
|
r && self.URL.revokeObjectURL(r),
|
|
t.src === r
|
|
? (t.removeAttribute("src"), t.load())
|
|
: w.warn(
|
|
"[buffer-controller]: media.src was changed by a third party - skip cleanup"
|
|
)),
|
|
(this.mediaSource = null),
|
|
(this.media = null),
|
|
(this._objectUrl = null),
|
|
(this.bufferCodecEventsExpected =
|
|
this._bufferCodecEventsTotal),
|
|
(this.pendingTracks = {}),
|
|
(this.tracks = {});
|
|
}
|
|
this.hls.trigger(S.MEDIA_DETACHED, void 0);
|
|
}),
|
|
(e.onBufferReset = function () {
|
|
var t = this;
|
|
this.getSourceBufferTypes().forEach(function (e) {
|
|
var r = t.sourceBuffer[e];
|
|
try {
|
|
r &&
|
|
(t.removeBufferListeners(e),
|
|
t.mediaSource && t.mediaSource.removeSourceBuffer(r),
|
|
(t.sourceBuffer[e] = void 0));
|
|
} catch (t) {
|
|
w.warn(
|
|
"[buffer-controller]: Failed to reset the " + e + " buffer",
|
|
t
|
|
);
|
|
}
|
|
}),
|
|
this._initSourceBuffer();
|
|
}),
|
|
(e.onBufferCodecs = function (t, e) {
|
|
var r = this,
|
|
i = this.getSourceBufferTypes().length;
|
|
Object.keys(e).forEach(function (t) {
|
|
if (i) {
|
|
var n = r.tracks[t];
|
|
if (n && "function" == typeof n.buffer.changeType) {
|
|
var a = e[t],
|
|
s = a.id,
|
|
o = a.codec,
|
|
l = a.levelCodec,
|
|
u = a.container,
|
|
h = a.metadata,
|
|
d = (n.levelCodec || n.codec).replace(Dn, "$1"),
|
|
c = (l || o).replace(Dn, "$1");
|
|
if (d !== c) {
|
|
var f = u + ";codecs=" + (l || o);
|
|
r.appendChangeType(t, f),
|
|
w.log(
|
|
"[buffer-controller]: switching codec " +
|
|
d +
|
|
" to " +
|
|
c
|
|
),
|
|
(r.tracks[t] = {
|
|
buffer: n.buffer,
|
|
codec: o,
|
|
container: u,
|
|
levelCodec: l,
|
|
metadata: h,
|
|
id: s,
|
|
});
|
|
}
|
|
}
|
|
} else r.pendingTracks[t] = e[t];
|
|
}),
|
|
i ||
|
|
((this.bufferCodecEventsExpected = Math.max(
|
|
this.bufferCodecEventsExpected - 1,
|
|
0
|
|
)),
|
|
this.mediaSource &&
|
|
"open" === this.mediaSource.readyState &&
|
|
this.checkPendingTracks());
|
|
}),
|
|
(e.appendChangeType = function (t, e) {
|
|
var r = this,
|
|
i = this.operationQueue,
|
|
n = {
|
|
execute: function () {
|
|
var n = r.sourceBuffer[t];
|
|
n &&
|
|
(w.log(
|
|
"[buffer-controller]: changing " +
|
|
t +
|
|
" sourceBuffer type to " +
|
|
e
|
|
),
|
|
n.changeType(e)),
|
|
i.shiftAndExecuteNext(t);
|
|
},
|
|
onStart: function () {},
|
|
onComplete: function () {},
|
|
onError: function (e) {
|
|
w.warn(
|
|
"[buffer-controller]: Failed to change " +
|
|
t +
|
|
" SourceBuffer type",
|
|
e
|
|
);
|
|
},
|
|
};
|
|
i.append(n, t);
|
|
}),
|
|
(e.onBufferAppending = function (t, e) {
|
|
var r = this,
|
|
i = this.hls,
|
|
n = this.operationQueue,
|
|
a = this.tracks,
|
|
s = e.data,
|
|
o = e.type,
|
|
l = e.frag,
|
|
u = e.part,
|
|
h = e.chunkMeta,
|
|
d = h.buffering[o],
|
|
c = self.performance.now();
|
|
d.start = c;
|
|
var f = l.stats.buffering,
|
|
g = u ? u.stats.buffering : null;
|
|
0 === f.start && (f.start = c),
|
|
g && 0 === g.start && (g.start = c);
|
|
var v = a.audio,
|
|
m = !1;
|
|
"audio" === o &&
|
|
"audio/mpeg" === (null == v ? void 0 : v.container) &&
|
|
((m =
|
|
!this.lastMpegAudioChunk ||
|
|
1 === h.id ||
|
|
this.lastMpegAudioChunk.sn !== h.sn),
|
|
(this.lastMpegAudioChunk = h));
|
|
var p = l.start,
|
|
y = {
|
|
execute: function () {
|
|
if (((d.executeStart = self.performance.now()), m)) {
|
|
var t = r.sourceBuffer[o];
|
|
if (t) {
|
|
var e = p - t.timestampOffset;
|
|
Math.abs(e) >= 0.1 &&
|
|
(w.log(
|
|
"[buffer-controller]: Updating audio SourceBuffer timestampOffset to " +
|
|
p +
|
|
" (delta: " +
|
|
e +
|
|
") sn: " +
|
|
l.sn +
|
|
")"
|
|
),
|
|
(t.timestampOffset = p));
|
|
}
|
|
}
|
|
r.appendExecutor(s, o);
|
|
},
|
|
onStart: function () {},
|
|
onComplete: function () {
|
|
var t = self.performance.now();
|
|
(d.executeEnd = d.end = t),
|
|
0 === f.first && (f.first = t),
|
|
g && 0 === g.first && (g.first = t);
|
|
var e = r.sourceBuffer,
|
|
i = {};
|
|
for (var n in e) i[n] = Ir.getBuffered(e[n]);
|
|
(r.appendError = 0),
|
|
r.hls.trigger(S.BUFFER_APPENDED, {
|
|
type: o,
|
|
frag: l,
|
|
part: u,
|
|
chunkMeta: h,
|
|
parent: l.type,
|
|
timeRanges: i,
|
|
});
|
|
},
|
|
onError: function (t) {
|
|
w.error(
|
|
"[buffer-controller]: Error encountered while trying to append to the " +
|
|
o +
|
|
" SourceBuffer",
|
|
t
|
|
);
|
|
var e = {
|
|
type: L.MEDIA_ERROR,
|
|
parent: l.type,
|
|
details: R.BUFFER_APPEND_ERROR,
|
|
frag: l,
|
|
part: u,
|
|
chunkMeta: h,
|
|
error: t,
|
|
err: t,
|
|
fatal: !1,
|
|
};
|
|
t.code === DOMException.QUOTA_EXCEEDED_ERR
|
|
? (e.details = R.BUFFER_FULL_ERROR)
|
|
: (r.appendError++,
|
|
(e.details = R.BUFFER_APPEND_ERROR),
|
|
r.appendError > i.config.appendErrorMaxRetry &&
|
|
(w.error(
|
|
"[buffer-controller]: Failed " +
|
|
i.config.appendErrorMaxRetry +
|
|
" times to append segment in sourceBuffer"
|
|
),
|
|
(e.fatal = !0))),
|
|
i.trigger(S.ERROR, e);
|
|
},
|
|
};
|
|
n.append(y, o);
|
|
}),
|
|
(e.onBufferFlushing = function (t, e) {
|
|
var r = this,
|
|
i = this.operationQueue,
|
|
n = function (t) {
|
|
return {
|
|
execute: r.removeExecutor.bind(
|
|
r,
|
|
t,
|
|
e.startOffset,
|
|
e.endOffset
|
|
),
|
|
onStart: function () {},
|
|
onComplete: function () {
|
|
r.hls.trigger(S.BUFFER_FLUSHED, { type: t });
|
|
},
|
|
onError: function (e) {
|
|
w.warn(
|
|
"[buffer-controller]: Failed to remove from " +
|
|
t +
|
|
" SourceBuffer",
|
|
e
|
|
);
|
|
},
|
|
};
|
|
};
|
|
e.type
|
|
? i.append(n(e.type), e.type)
|
|
: this.getSourceBufferTypes().forEach(function (t) {
|
|
i.append(n(t), t);
|
|
});
|
|
}),
|
|
(e.onFragParsed = function (t, e) {
|
|
var r = this,
|
|
i = e.frag,
|
|
n = e.part,
|
|
a = [],
|
|
s = n ? n.elementaryStreams : i.elementaryStreams;
|
|
s[U]
|
|
? a.push("audiovideo")
|
|
: (s[O] && a.push("audio"), s[N] && a.push("video")),
|
|
0 === a.length &&
|
|
w.warn(
|
|
"Fragments must have at least one ElementaryStreamType set. type: " +
|
|
i.type +
|
|
" level: " +
|
|
i.level +
|
|
" sn: " +
|
|
i.sn
|
|
),
|
|
this.blockBuffers(function () {
|
|
var t = self.performance.now();
|
|
(i.stats.buffering.end = t), n && (n.stats.buffering.end = t);
|
|
var e = n ? n.stats : i.stats;
|
|
r.hls.trigger(S.FRAG_BUFFERED, {
|
|
frag: i,
|
|
part: n,
|
|
stats: e,
|
|
id: i.type,
|
|
});
|
|
}, a);
|
|
}),
|
|
(e.onFragChanged = function (t, e) {
|
|
this.flushBackBuffer();
|
|
}),
|
|
(e.onBufferEos = function (t, e) {
|
|
var r = this;
|
|
this.getSourceBufferTypes().reduce(function (t, i) {
|
|
var n = r.sourceBuffer[i];
|
|
return (
|
|
!n ||
|
|
(e.type && e.type !== i) ||
|
|
((n.ending = !0),
|
|
n.ended ||
|
|
((n.ended = !0),
|
|
w.log(
|
|
"[buffer-controller]: " + i + " sourceBuffer now EOS"
|
|
))),
|
|
t && !(n && !n.ended)
|
|
);
|
|
}, !0) &&
|
|
(w.log(
|
|
"[buffer-controller]: Queueing mediaSource.endOfStream()"
|
|
),
|
|
this.blockBuffers(function () {
|
|
r.getSourceBufferTypes().forEach(function (t) {
|
|
var e = r.sourceBuffer[t];
|
|
e && (e.ending = !1);
|
|
});
|
|
var t = r.mediaSource;
|
|
t && "open" === t.readyState
|
|
? (w.log(
|
|
"[buffer-controller]: Calling mediaSource.endOfStream()"
|
|
),
|
|
t.endOfStream())
|
|
: t &&
|
|
w.info(
|
|
"[buffer-controller]: Could not call mediaSource.endOfStream(). mediaSource.readyState: " +
|
|
t.readyState
|
|
);
|
|
}));
|
|
}),
|
|
(e.onLevelUpdated = function (t, e) {
|
|
var r = e.details;
|
|
r.fragments.length &&
|
|
((this.details = r),
|
|
this.getSourceBufferTypes().length
|
|
? this.blockBuffers(
|
|
this.updateMediaElementDuration.bind(this)
|
|
)
|
|
: this.updateMediaElementDuration());
|
|
}),
|
|
(e.flushBackBuffer = function () {
|
|
var t = this.hls,
|
|
e = this.details,
|
|
r = this.media,
|
|
i = this.sourceBuffer;
|
|
if (r && null !== e) {
|
|
var n = this.getSourceBufferTypes();
|
|
if (n.length) {
|
|
var a =
|
|
e.live && null !== t.config.liveBackBufferLength
|
|
? t.config.liveBackBufferLength
|
|
: t.config.backBufferLength;
|
|
if (E(a) && !(a < 0)) {
|
|
var s = r.currentTime,
|
|
o = e.levelTargetDuration,
|
|
l = Math.max(a, o),
|
|
u = Math.floor(s / o) * o - l;
|
|
n.forEach(function (r) {
|
|
var n = i[r];
|
|
if (n) {
|
|
var a = Ir.getBuffered(n);
|
|
if (a.length > 0 && u > a.start(0)) {
|
|
if (
|
|
(t.trigger(S.BACK_BUFFER_REACHED, { bufferEnd: u }),
|
|
e.live)
|
|
)
|
|
t.trigger(S.LIVE_BACK_BUFFER_REACHED, {
|
|
bufferEnd: u,
|
|
});
|
|
else if (n.ended && a.end(a.length - 1) - s < 2 * o)
|
|
return void w.info(
|
|
"[buffer-controller]: Cannot flush " +
|
|
r +
|
|
" back buffer while SourceBuffer is in ended state"
|
|
);
|
|
t.trigger(S.BUFFER_FLUSHING, {
|
|
startOffset: 0,
|
|
endOffset: u,
|
|
type: r,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.updateMediaElementDuration = function () {
|
|
if (
|
|
this.details &&
|
|
this.media &&
|
|
this.mediaSource &&
|
|
"open" === this.mediaSource.readyState
|
|
) {
|
|
var t = this.details,
|
|
e = this.hls,
|
|
r = this.media,
|
|
i = this.mediaSource,
|
|
n = t.fragments[0].start + t.totalduration,
|
|
a = r.duration,
|
|
s = E(i.duration) ? i.duration : 0;
|
|
t.live && e.config.liveDurationInfinity
|
|
? (w.log(
|
|
"[buffer-controller]: Media Source duration is set to Infinity"
|
|
),
|
|
(i.duration = 1 / 0),
|
|
this.updateSeekableRange(t))
|
|
: ((n > s && n > a) || !E(a)) &&
|
|
(w.log(
|
|
"[buffer-controller]: Updating Media Source duration to " +
|
|
n.toFixed(3)
|
|
),
|
|
(i.duration = n));
|
|
}
|
|
}),
|
|
(e.updateSeekableRange = function (t) {
|
|
var e = this.mediaSource,
|
|
r = t.fragments;
|
|
if (r.length && t.live && null != e && e.setLiveSeekableRange) {
|
|
var i = Math.max(0, r[0].start),
|
|
n = Math.max(i, i + t.totalduration);
|
|
e.setLiveSeekableRange(i, n);
|
|
}
|
|
}),
|
|
(e.checkPendingTracks = function () {
|
|
var t = this.bufferCodecEventsExpected,
|
|
e = this.operationQueue,
|
|
r = this.pendingTracks,
|
|
i = Object.keys(r).length;
|
|
if ((i && !t) || 2 === i) {
|
|
this.createSourceBuffers(r), (this.pendingTracks = {});
|
|
var n = this.getSourceBufferTypes();
|
|
if (n.length)
|
|
this.hls.trigger(S.BUFFER_CREATED, { tracks: this.tracks }),
|
|
n.forEach(function (t) {
|
|
e.executeNext(t);
|
|
});
|
|
else {
|
|
var a = new Error(
|
|
"could not create source buffer for media codec(s)"
|
|
);
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_INCOMPATIBLE_CODECS_ERROR,
|
|
fatal: !0,
|
|
error: a,
|
|
reason: a.message,
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
(e.createSourceBuffers = function (t) {
|
|
var e = this.sourceBuffer,
|
|
r = this.mediaSource;
|
|
if (!r)
|
|
throw Error(
|
|
"createSourceBuffers called when mediaSource was null"
|
|
);
|
|
for (var i in t)
|
|
if (!e[i]) {
|
|
var n = t[i];
|
|
if (!n)
|
|
throw Error(
|
|
"source buffer exists for track " +
|
|
i +
|
|
", however track does not"
|
|
);
|
|
var a = n.levelCodec || n.codec,
|
|
s = n.container + ";codecs=" + a;
|
|
w.log(
|
|
"[buffer-controller]: creating sourceBuffer(" + s + ")"
|
|
);
|
|
try {
|
|
var o = (e[i] = r.addSourceBuffer(s)),
|
|
l = i;
|
|
this.addBufferListener(
|
|
l,
|
|
"updatestart",
|
|
this._onSBUpdateStart
|
|
),
|
|
this.addBufferListener(
|
|
l,
|
|
"updateend",
|
|
this._onSBUpdateEnd
|
|
),
|
|
this.addBufferListener(l, "error", this._onSBUpdateError),
|
|
(this.tracks[i] = {
|
|
buffer: o,
|
|
codec: a,
|
|
container: n.container,
|
|
levelCodec: n.levelCodec,
|
|
metadata: n.metadata,
|
|
id: n.id,
|
|
});
|
|
} catch (t) {
|
|
w.error(
|
|
"[buffer-controller]: error while trying to add sourceBuffer: " +
|
|
t.message
|
|
),
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_ADD_CODEC_ERROR,
|
|
fatal: !1,
|
|
error: t,
|
|
mimeType: s,
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
(e._onSBUpdateStart = function (t) {
|
|
this.operationQueue.current(t).onStart();
|
|
}),
|
|
(e._onSBUpdateEnd = function (t) {
|
|
var e = this.operationQueue;
|
|
e.current(t).onComplete(), e.shiftAndExecuteNext(t);
|
|
}),
|
|
(e._onSBUpdateError = function (t, e) {
|
|
var r = new Error(t + " SourceBuffer error");
|
|
w.error("[buffer-controller]: " + r, e),
|
|
this.hls.trigger(S.ERROR, {
|
|
type: L.MEDIA_ERROR,
|
|
details: R.BUFFER_APPENDING_ERROR,
|
|
error: r,
|
|
fatal: !1,
|
|
});
|
|
var i = this.operationQueue.current(t);
|
|
i && i.onError(e);
|
|
}),
|
|
(e.removeExecutor = function (t, e, r) {
|
|
var i = this.media,
|
|
n = this.mediaSource,
|
|
a = this.operationQueue,
|
|
s = this.sourceBuffer[t];
|
|
if (!i || !n || !s)
|
|
return (
|
|
w.warn(
|
|
"[buffer-controller]: Attempting to remove from the " +
|
|
t +
|
|
" SourceBuffer, but it does not exist"
|
|
),
|
|
void a.shiftAndExecuteNext(t)
|
|
);
|
|
var o = E(i.duration) ? i.duration : 1 / 0,
|
|
l = E(n.duration) ? n.duration : 1 / 0,
|
|
u = Math.max(0, e),
|
|
h = Math.min(r, o, l);
|
|
h > u && !s.ending
|
|
? ((s.ended = !1),
|
|
w.log(
|
|
"[buffer-controller]: Removing [" +
|
|
u +
|
|
"," +
|
|
h +
|
|
"] from the " +
|
|
t +
|
|
" SourceBuffer"
|
|
),
|
|
s.remove(u, h))
|
|
: a.shiftAndExecuteNext(t);
|
|
}),
|
|
(e.appendExecutor = function (t, e) {
|
|
var r = this.operationQueue,
|
|
i = this.sourceBuffer[e];
|
|
if (!i)
|
|
return (
|
|
w.warn(
|
|
"[buffer-controller]: Attempting to append to the " +
|
|
e +
|
|
" SourceBuffer, but it does not exist"
|
|
),
|
|
void r.shiftAndExecuteNext(e)
|
|
);
|
|
(i.ended = !1), i.appendBuffer(t);
|
|
}),
|
|
(e.blockBuffers = function (t, e) {
|
|
var r = this;
|
|
if (
|
|
(void 0 === e && (e = this.getSourceBufferTypes()), !e.length)
|
|
)
|
|
return (
|
|
w.log(
|
|
"[buffer-controller]: Blocking operation requested, but no SourceBuffers exist"
|
|
),
|
|
void Promise.resolve().then(t)
|
|
);
|
|
var i = this.operationQueue,
|
|
n = e.map(function (t) {
|
|
return i.appendBlocker(t);
|
|
});
|
|
Promise.all(n).then(function () {
|
|
t(),
|
|
e.forEach(function (t) {
|
|
var e = r.sourceBuffer[t];
|
|
(null != e && e.updating) || i.shiftAndExecuteNext(t);
|
|
});
|
|
});
|
|
}),
|
|
(e.getSourceBufferTypes = function () {
|
|
return Object.keys(this.sourceBuffer);
|
|
}),
|
|
(e.addBufferListener = function (t, e, r) {
|
|
var i = this.sourceBuffer[t];
|
|
if (i) {
|
|
var n = r.bind(this, t);
|
|
this.listeners[t].push({ event: e, listener: n }),
|
|
i.addEventListener(e, n);
|
|
}
|
|
}),
|
|
(e.removeBufferListeners = function (t) {
|
|
var e = this.sourceBuffer[t];
|
|
e &&
|
|
this.listeners[t].forEach(function (t) {
|
|
e.removeEventListener(t.event, t.listener);
|
|
});
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
wn = {
|
|
42: 225,
|
|
92: 233,
|
|
94: 237,
|
|
95: 243,
|
|
96: 250,
|
|
123: 231,
|
|
124: 247,
|
|
125: 209,
|
|
126: 241,
|
|
127: 9608,
|
|
128: 174,
|
|
129: 176,
|
|
130: 189,
|
|
131: 191,
|
|
132: 8482,
|
|
133: 162,
|
|
134: 163,
|
|
135: 9834,
|
|
136: 224,
|
|
137: 32,
|
|
138: 232,
|
|
139: 226,
|
|
140: 234,
|
|
141: 238,
|
|
142: 244,
|
|
143: 251,
|
|
144: 193,
|
|
145: 201,
|
|
146: 211,
|
|
147: 218,
|
|
148: 220,
|
|
149: 252,
|
|
150: 8216,
|
|
151: 161,
|
|
152: 42,
|
|
153: 8217,
|
|
154: 9473,
|
|
155: 169,
|
|
156: 8480,
|
|
157: 8226,
|
|
158: 8220,
|
|
159: 8221,
|
|
160: 192,
|
|
161: 194,
|
|
162: 199,
|
|
163: 200,
|
|
164: 202,
|
|
165: 203,
|
|
166: 235,
|
|
167: 206,
|
|
168: 207,
|
|
169: 239,
|
|
170: 212,
|
|
171: 217,
|
|
172: 249,
|
|
173: 219,
|
|
174: 171,
|
|
175: 187,
|
|
176: 195,
|
|
177: 227,
|
|
178: 205,
|
|
179: 204,
|
|
180: 236,
|
|
181: 210,
|
|
182: 242,
|
|
183: 213,
|
|
184: 245,
|
|
185: 123,
|
|
186: 125,
|
|
187: 92,
|
|
188: 94,
|
|
189: 95,
|
|
190: 124,
|
|
191: 8764,
|
|
192: 196,
|
|
193: 228,
|
|
194: 214,
|
|
195: 246,
|
|
196: 223,
|
|
197: 165,
|
|
198: 164,
|
|
199: 9475,
|
|
200: 197,
|
|
201: 229,
|
|
202: 216,
|
|
203: 248,
|
|
204: 9487,
|
|
205: 9491,
|
|
206: 9495,
|
|
207: 9499,
|
|
},
|
|
Cn = function (t) {
|
|
var e = t;
|
|
return wn.hasOwnProperty(t) && (e = wn[t]), String.fromCharCode(e);
|
|
},
|
|
_n = 15,
|
|
Pn = 100,
|
|
xn = { 17: 1, 18: 3, 21: 5, 22: 7, 23: 9, 16: 11, 19: 12, 20: 14 },
|
|
Fn = { 17: 2, 18: 4, 21: 6, 22: 8, 23: 10, 19: 13, 20: 15 },
|
|
Mn = { 25: 1, 26: 3, 29: 5, 30: 7, 31: 9, 24: 11, 27: 12, 28: 14 },
|
|
On = { 25: 2, 26: 4, 29: 6, 30: 8, 31: 10, 27: 13, 28: 15 },
|
|
Nn = [
|
|
"white",
|
|
"green",
|
|
"blue",
|
|
"cyan",
|
|
"red",
|
|
"yellow",
|
|
"magenta",
|
|
"black",
|
|
"transparent",
|
|
],
|
|
Un = (function () {
|
|
function t() {
|
|
(this.time = null), (this.verboseLevel = 0);
|
|
}
|
|
return (
|
|
(t.prototype.log = function (t, e) {
|
|
if (this.verboseLevel >= t) {
|
|
var r = "function" == typeof e ? e() : e;
|
|
w.log(this.time + " [" + t + "] " + r);
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Bn = function (t) {
|
|
for (var e = [], r = 0; r < t.length; r++) e.push(t[r].toString(16));
|
|
return e;
|
|
},
|
|
Gn = (function () {
|
|
function t(t, e, r, i, n) {
|
|
(this.foreground = void 0),
|
|
(this.underline = void 0),
|
|
(this.italics = void 0),
|
|
(this.background = void 0),
|
|
(this.flash = void 0),
|
|
(this.foreground = t || "white"),
|
|
(this.underline = e || !1),
|
|
(this.italics = r || !1),
|
|
(this.background = i || "black"),
|
|
(this.flash = n || !1);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.reset = function () {
|
|
(this.foreground = "white"),
|
|
(this.underline = !1),
|
|
(this.italics = !1),
|
|
(this.background = "black"),
|
|
(this.flash = !1);
|
|
}),
|
|
(e.setStyles = function (t) {
|
|
for (
|
|
var e = [
|
|
"foreground",
|
|
"underline",
|
|
"italics",
|
|
"background",
|
|
"flash",
|
|
],
|
|
r = 0;
|
|
r < e.length;
|
|
r++
|
|
) {
|
|
var i = e[r];
|
|
t.hasOwnProperty(i) && (this[i] = t[i]);
|
|
}
|
|
}),
|
|
(e.isDefault = function () {
|
|
return (
|
|
"white" === this.foreground &&
|
|
!this.underline &&
|
|
!this.italics &&
|
|
"black" === this.background &&
|
|
!this.flash
|
|
);
|
|
}),
|
|
(e.equals = function (t) {
|
|
return (
|
|
this.foreground === t.foreground &&
|
|
this.underline === t.underline &&
|
|
this.italics === t.italics &&
|
|
this.background === t.background &&
|
|
this.flash === t.flash
|
|
);
|
|
}),
|
|
(e.copy = function (t) {
|
|
(this.foreground = t.foreground),
|
|
(this.underline = t.underline),
|
|
(this.italics = t.italics),
|
|
(this.background = t.background),
|
|
(this.flash = t.flash);
|
|
}),
|
|
(e.toString = function () {
|
|
return (
|
|
"color=" +
|
|
this.foreground +
|
|
", underline=" +
|
|
this.underline +
|
|
", italics=" +
|
|
this.italics +
|
|
", background=" +
|
|
this.background +
|
|
", flash=" +
|
|
this.flash
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Kn = (function () {
|
|
function t(t, e, r, i, n, a) {
|
|
(this.uchar = void 0),
|
|
(this.penState = void 0),
|
|
(this.uchar = t || " "),
|
|
(this.penState = new Gn(e, r, i, n, a));
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.reset = function () {
|
|
(this.uchar = " "), this.penState.reset();
|
|
}),
|
|
(e.setChar = function (t, e) {
|
|
(this.uchar = t), this.penState.copy(e);
|
|
}),
|
|
(e.setPenState = function (t) {
|
|
this.penState.copy(t);
|
|
}),
|
|
(e.equals = function (t) {
|
|
return this.uchar === t.uchar && this.penState.equals(t.penState);
|
|
}),
|
|
(e.copy = function (t) {
|
|
(this.uchar = t.uchar), this.penState.copy(t.penState);
|
|
}),
|
|
(e.isEmpty = function () {
|
|
return " " === this.uchar && this.penState.isDefault();
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Hn = (function () {
|
|
function t(t) {
|
|
(this.chars = void 0),
|
|
(this.pos = void 0),
|
|
(this.currPenState = void 0),
|
|
(this.cueStartTime = void 0),
|
|
(this.logger = void 0),
|
|
(this.chars = []);
|
|
for (var e = 0; e < Pn; e++) this.chars.push(new Kn());
|
|
(this.logger = t), (this.pos = 0), (this.currPenState = new Gn());
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.equals = function (t) {
|
|
for (var e = !0, r = 0; r < Pn; r++)
|
|
if (!this.chars[r].equals(t.chars[r])) {
|
|
e = !1;
|
|
break;
|
|
}
|
|
return e;
|
|
}),
|
|
(e.copy = function (t) {
|
|
for (var e = 0; e < Pn; e++) this.chars[e].copy(t.chars[e]);
|
|
}),
|
|
(e.isEmpty = function () {
|
|
for (var t = !0, e = 0; e < Pn; e++)
|
|
if (!this.chars[e].isEmpty()) {
|
|
t = !1;
|
|
break;
|
|
}
|
|
return t;
|
|
}),
|
|
(e.setCursor = function (t) {
|
|
this.pos !== t && (this.pos = t),
|
|
this.pos < 0
|
|
? (this.logger.log(3, "Negative cursor position " + this.pos),
|
|
(this.pos = 0))
|
|
: this.pos > Pn &&
|
|
(this.logger.log(
|
|
3,
|
|
"Too large cursor position " + this.pos
|
|
),
|
|
(this.pos = Pn));
|
|
}),
|
|
(e.moveCursor = function (t) {
|
|
var e = this.pos + t;
|
|
if (t > 1)
|
|
for (var r = this.pos + 1; r < e + 1; r++)
|
|
this.chars[r].setPenState(this.currPenState);
|
|
this.setCursor(e);
|
|
}),
|
|
(e.backSpace = function () {
|
|
this.moveCursor(-1),
|
|
this.chars[this.pos].setChar(" ", this.currPenState);
|
|
}),
|
|
(e.insertChar = function (t) {
|
|
var e = this;
|
|
t >= 144 && this.backSpace();
|
|
var r = Cn(t);
|
|
this.pos >= Pn
|
|
? this.logger.log(0, function () {
|
|
return (
|
|
"Cannot insert " +
|
|
t.toString(16) +
|
|
" (" +
|
|
r +
|
|
") at position " +
|
|
e.pos +
|
|
". Skipping it!"
|
|
);
|
|
})
|
|
: (this.chars[this.pos].setChar(r, this.currPenState),
|
|
this.moveCursor(1));
|
|
}),
|
|
(e.clearFromPos = function (t) {
|
|
var e;
|
|
for (e = t; e < Pn; e++) this.chars[e].reset();
|
|
}),
|
|
(e.clear = function () {
|
|
this.clearFromPos(0), (this.pos = 0), this.currPenState.reset();
|
|
}),
|
|
(e.clearToEndOfRow = function () {
|
|
this.clearFromPos(this.pos);
|
|
}),
|
|
(e.getTextString = function () {
|
|
for (var t = [], e = !0, r = 0; r < Pn; r++) {
|
|
var i = this.chars[r].uchar;
|
|
" " !== i && (e = !1), t.push(i);
|
|
}
|
|
return e ? "" : t.join("");
|
|
}),
|
|
(e.setPenStyles = function (t) {
|
|
this.currPenState.setStyles(t),
|
|
this.chars[this.pos].setPenState(this.currPenState);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Vn = (function () {
|
|
function t(t) {
|
|
(this.rows = void 0),
|
|
(this.currRow = void 0),
|
|
(this.nrRollUpRows = void 0),
|
|
(this.lastOutputScreen = void 0),
|
|
(this.logger = void 0),
|
|
(this.rows = []);
|
|
for (var e = 0; e < _n; e++) this.rows.push(new Hn(t));
|
|
(this.logger = t),
|
|
(this.currRow = 14),
|
|
(this.nrRollUpRows = null),
|
|
(this.lastOutputScreen = null),
|
|
this.reset();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.reset = function () {
|
|
for (var t = 0; t < _n; t++) this.rows[t].clear();
|
|
this.currRow = 14;
|
|
}),
|
|
(e.equals = function (t) {
|
|
for (var e = !0, r = 0; r < _n; r++)
|
|
if (!this.rows[r].equals(t.rows[r])) {
|
|
e = !1;
|
|
break;
|
|
}
|
|
return e;
|
|
}),
|
|
(e.copy = function (t) {
|
|
for (var e = 0; e < _n; e++) this.rows[e].copy(t.rows[e]);
|
|
}),
|
|
(e.isEmpty = function () {
|
|
for (var t = !0, e = 0; e < _n; e++)
|
|
if (!this.rows[e].isEmpty()) {
|
|
t = !1;
|
|
break;
|
|
}
|
|
return t;
|
|
}),
|
|
(e.backSpace = function () {
|
|
this.rows[this.currRow].backSpace();
|
|
}),
|
|
(e.clearToEndOfRow = function () {
|
|
this.rows[this.currRow].clearToEndOfRow();
|
|
}),
|
|
(e.insertChar = function (t) {
|
|
this.rows[this.currRow].insertChar(t);
|
|
}),
|
|
(e.setPen = function (t) {
|
|
this.rows[this.currRow].setPenStyles(t);
|
|
}),
|
|
(e.moveCursor = function (t) {
|
|
this.rows[this.currRow].moveCursor(t);
|
|
}),
|
|
(e.setCursor = function (t) {
|
|
this.logger.log(2, "setCursor: " + t),
|
|
this.rows[this.currRow].setCursor(t);
|
|
}),
|
|
(e.setPAC = function (t) {
|
|
this.logger.log(2, function () {
|
|
return "pacData = " + JSON.stringify(t);
|
|
});
|
|
var e = t.row - 1;
|
|
if (
|
|
(this.nrRollUpRows &&
|
|
e < this.nrRollUpRows - 1 &&
|
|
(e = this.nrRollUpRows - 1),
|
|
this.nrRollUpRows && this.currRow !== e)
|
|
) {
|
|
for (var r = 0; r < _n; r++) this.rows[r].clear();
|
|
var i = this.currRow + 1 - this.nrRollUpRows,
|
|
n = this.lastOutputScreen;
|
|
if (n) {
|
|
var a = n.rows[i].cueStartTime,
|
|
s = this.logger.time;
|
|
if (a && null !== s && a < s)
|
|
for (var o = 0; o < this.nrRollUpRows; o++)
|
|
this.rows[e - this.nrRollUpRows + o + 1].copy(
|
|
n.rows[i + o]
|
|
);
|
|
}
|
|
}
|
|
this.currRow = e;
|
|
var l = this.rows[this.currRow];
|
|
if (null !== t.indent) {
|
|
var u = t.indent,
|
|
h = Math.max(u - 1, 0);
|
|
l.setCursor(t.indent),
|
|
(t.color = l.chars[h].penState.foreground);
|
|
}
|
|
var d = {
|
|
foreground: t.color,
|
|
underline: t.underline,
|
|
italics: t.italics,
|
|
background: "black",
|
|
flash: !1,
|
|
};
|
|
this.setPen(d);
|
|
}),
|
|
(e.setBkgData = function (t) {
|
|
this.logger.log(2, function () {
|
|
return "bkgData = " + JSON.stringify(t);
|
|
}),
|
|
this.backSpace(),
|
|
this.setPen(t),
|
|
this.insertChar(32);
|
|
}),
|
|
(e.setRollUpRows = function (t) {
|
|
this.nrRollUpRows = t;
|
|
}),
|
|
(e.rollUp = function () {
|
|
var t = this;
|
|
if (null !== this.nrRollUpRows) {
|
|
this.logger.log(1, function () {
|
|
return t.getDisplayText();
|
|
});
|
|
var e = this.currRow + 1 - this.nrRollUpRows,
|
|
r = this.rows.splice(e, 1)[0];
|
|
r.clear(),
|
|
this.rows.splice(this.currRow, 0, r),
|
|
this.logger.log(2, "Rolling up");
|
|
} else this.logger.log(3, "roll_up but nrRollUpRows not set yet");
|
|
}),
|
|
(e.getDisplayText = function (t) {
|
|
t = t || !1;
|
|
for (var e = [], r = "", i = -1, n = 0; n < _n; n++) {
|
|
var a = this.rows[n].getTextString();
|
|
a &&
|
|
((i = n + 1),
|
|
t ? e.push("Row " + i + ": '" + a + "'") : e.push(a.trim()));
|
|
}
|
|
return (
|
|
e.length > 0 &&
|
|
(r = t ? "[" + e.join(" | ") + "]" : e.join("\n")),
|
|
r
|
|
);
|
|
}),
|
|
(e.getTextAndFormat = function () {
|
|
return this.rows;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Yn = (function () {
|
|
function t(t, e, r) {
|
|
(this.chNr = void 0),
|
|
(this.outputFilter = void 0),
|
|
(this.mode = void 0),
|
|
(this.verbose = void 0),
|
|
(this.displayedMemory = void 0),
|
|
(this.nonDisplayedMemory = void 0),
|
|
(this.lastOutputScreen = void 0),
|
|
(this.currRollUpRow = void 0),
|
|
(this.writeScreen = void 0),
|
|
(this.cueStartTime = void 0),
|
|
(this.logger = void 0),
|
|
(this.chNr = t),
|
|
(this.outputFilter = e),
|
|
(this.mode = null),
|
|
(this.verbose = 0),
|
|
(this.displayedMemory = new Vn(r)),
|
|
(this.nonDisplayedMemory = new Vn(r)),
|
|
(this.lastOutputScreen = new Vn(r)),
|
|
(this.currRollUpRow = this.displayedMemory.rows[14]),
|
|
(this.writeScreen = this.displayedMemory),
|
|
(this.mode = null),
|
|
(this.cueStartTime = null),
|
|
(this.logger = r);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.reset = function () {
|
|
(this.mode = null),
|
|
this.displayedMemory.reset(),
|
|
this.nonDisplayedMemory.reset(),
|
|
this.lastOutputScreen.reset(),
|
|
this.outputFilter.reset(),
|
|
(this.currRollUpRow = this.displayedMemory.rows[14]),
|
|
(this.writeScreen = this.displayedMemory),
|
|
(this.mode = null),
|
|
(this.cueStartTime = null);
|
|
}),
|
|
(e.getHandler = function () {
|
|
return this.outputFilter;
|
|
}),
|
|
(e.setHandler = function (t) {
|
|
this.outputFilter = t;
|
|
}),
|
|
(e.setPAC = function (t) {
|
|
this.writeScreen.setPAC(t);
|
|
}),
|
|
(e.setBkgData = function (t) {
|
|
this.writeScreen.setBkgData(t);
|
|
}),
|
|
(e.setMode = function (t) {
|
|
t !== this.mode &&
|
|
((this.mode = t),
|
|
this.logger.log(2, function () {
|
|
return "MODE=" + t;
|
|
}),
|
|
"MODE_POP-ON" === this.mode
|
|
? (this.writeScreen = this.nonDisplayedMemory)
|
|
: ((this.writeScreen = this.displayedMemory),
|
|
this.writeScreen.reset()),
|
|
"MODE_ROLL-UP" !== this.mode &&
|
|
((this.displayedMemory.nrRollUpRows = null),
|
|
(this.nonDisplayedMemory.nrRollUpRows = null)),
|
|
(this.mode = t));
|
|
}),
|
|
(e.insertChars = function (t) {
|
|
for (var e = this, r = 0; r < t.length; r++)
|
|
this.writeScreen.insertChar(t[r]);
|
|
var i =
|
|
this.writeScreen === this.displayedMemory ? "DISP" : "NON_DISP";
|
|
this.logger.log(2, function () {
|
|
return i + ": " + e.writeScreen.getDisplayText(!0);
|
|
}),
|
|
("MODE_PAINT-ON" !== this.mode &&
|
|
"MODE_ROLL-UP" !== this.mode) ||
|
|
(this.logger.log(1, function () {
|
|
return "DISPLAYED: " + e.displayedMemory.getDisplayText(!0);
|
|
}),
|
|
this.outputDataUpdate());
|
|
}),
|
|
(e.ccRCL = function () {
|
|
this.logger.log(2, "RCL - Resume Caption Loading"),
|
|
this.setMode("MODE_POP-ON");
|
|
}),
|
|
(e.ccBS = function () {
|
|
this.logger.log(2, "BS - BackSpace"),
|
|
"MODE_TEXT" !== this.mode &&
|
|
(this.writeScreen.backSpace(),
|
|
this.writeScreen === this.displayedMemory &&
|
|
this.outputDataUpdate());
|
|
}),
|
|
(e.ccAOF = function () {}),
|
|
(e.ccAON = function () {}),
|
|
(e.ccDER = function () {
|
|
this.logger.log(2, "DER- Delete to End of Row"),
|
|
this.writeScreen.clearToEndOfRow(),
|
|
this.outputDataUpdate();
|
|
}),
|
|
(e.ccRU = function (t) {
|
|
this.logger.log(2, "RU(" + t + ") - Roll Up"),
|
|
(this.writeScreen = this.displayedMemory),
|
|
this.setMode("MODE_ROLL-UP"),
|
|
this.writeScreen.setRollUpRows(t);
|
|
}),
|
|
(e.ccFON = function () {
|
|
this.logger.log(2, "FON - Flash On"),
|
|
this.writeScreen.setPen({ flash: !0 });
|
|
}),
|
|
(e.ccRDC = function () {
|
|
this.logger.log(2, "RDC - Resume Direct Captioning"),
|
|
this.setMode("MODE_PAINT-ON");
|
|
}),
|
|
(e.ccTR = function () {
|
|
this.logger.log(2, "TR"), this.setMode("MODE_TEXT");
|
|
}),
|
|
(e.ccRTD = function () {
|
|
this.logger.log(2, "RTD"), this.setMode("MODE_TEXT");
|
|
}),
|
|
(e.ccEDM = function () {
|
|
this.logger.log(2, "EDM - Erase Displayed Memory"),
|
|
this.displayedMemory.reset(),
|
|
this.outputDataUpdate(!0);
|
|
}),
|
|
(e.ccCR = function () {
|
|
this.logger.log(2, "CR - Carriage Return"),
|
|
this.writeScreen.rollUp(),
|
|
this.outputDataUpdate(!0);
|
|
}),
|
|
(e.ccENM = function () {
|
|
this.logger.log(2, "ENM - Erase Non-displayed Memory"),
|
|
this.nonDisplayedMemory.reset();
|
|
}),
|
|
(e.ccEOC = function () {
|
|
var t = this;
|
|
if (
|
|
(this.logger.log(2, "EOC - End Of Caption"),
|
|
"MODE_POP-ON" === this.mode)
|
|
) {
|
|
var e = this.displayedMemory;
|
|
(this.displayedMemory = this.nonDisplayedMemory),
|
|
(this.nonDisplayedMemory = e),
|
|
(this.writeScreen = this.nonDisplayedMemory),
|
|
this.logger.log(1, function () {
|
|
return "DISP: " + t.displayedMemory.getDisplayText();
|
|
});
|
|
}
|
|
this.outputDataUpdate(!0);
|
|
}),
|
|
(e.ccTO = function (t) {
|
|
this.logger.log(2, "TO(" + t + ") - Tab Offset"),
|
|
this.writeScreen.moveCursor(t);
|
|
}),
|
|
(e.ccMIDROW = function (t) {
|
|
var e = { flash: !1 };
|
|
if (
|
|
((e.underline = t % 2 == 1), (e.italics = t >= 46), e.italics)
|
|
)
|
|
e.foreground = "white";
|
|
else {
|
|
var r = Math.floor(t / 2) - 16;
|
|
e.foreground = [
|
|
"white",
|
|
"green",
|
|
"blue",
|
|
"cyan",
|
|
"red",
|
|
"yellow",
|
|
"magenta",
|
|
][r];
|
|
}
|
|
this.logger.log(2, "MIDROW: " + JSON.stringify(e)),
|
|
this.writeScreen.setPen(e);
|
|
}),
|
|
(e.outputDataUpdate = function (t) {
|
|
void 0 === t && (t = !1);
|
|
var e = this.logger.time;
|
|
null !== e &&
|
|
this.outputFilter &&
|
|
(null !== this.cueStartTime || this.displayedMemory.isEmpty()
|
|
? this.displayedMemory.equals(this.lastOutputScreen) ||
|
|
(this.outputFilter.newCue(
|
|
this.cueStartTime,
|
|
e,
|
|
this.lastOutputScreen
|
|
),
|
|
t &&
|
|
this.outputFilter.dispatchCue &&
|
|
this.outputFilter.dispatchCue(),
|
|
(this.cueStartTime = this.displayedMemory.isEmpty()
|
|
? null
|
|
: e))
|
|
: (this.cueStartTime = e),
|
|
this.lastOutputScreen.copy(this.displayedMemory));
|
|
}),
|
|
(e.cueSplitAtTime = function (t) {
|
|
this.outputFilter &&
|
|
(this.displayedMemory.isEmpty() ||
|
|
(this.outputFilter.newCue &&
|
|
this.outputFilter.newCue(
|
|
this.cueStartTime,
|
|
t,
|
|
this.displayedMemory
|
|
),
|
|
(this.cueStartTime = t)));
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Wn = (function () {
|
|
function t(t, e, r) {
|
|
(this.channels = void 0),
|
|
(this.currentChannel = 0),
|
|
(this.cmdHistory = void 0),
|
|
(this.logger = void 0);
|
|
var i = new Un();
|
|
(this.channels = [null, new Yn(t, e, i), new Yn(t + 1, r, i)]),
|
|
(this.cmdHistory = { a: null, b: null }),
|
|
(this.logger = i);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.getHandler = function (t) {
|
|
return this.channels[t].getHandler();
|
|
}),
|
|
(e.setHandler = function (t, e) {
|
|
this.channels[t].setHandler(e);
|
|
}),
|
|
(e.addData = function (t, e) {
|
|
var r,
|
|
i,
|
|
n,
|
|
a = !1;
|
|
this.logger.time = t;
|
|
for (var s = 0; s < e.length; s += 2)
|
|
if (
|
|
((i = 127 & e[s]), (n = 127 & e[s + 1]), 0 !== i || 0 !== n)
|
|
) {
|
|
if (
|
|
(this.logger.log(
|
|
3,
|
|
"[" + Bn([e[s], e[s + 1]]) + "] -> (" + Bn([i, n]) + ")"
|
|
),
|
|
(r = this.parseCmd(i, n)) || (r = this.parseMidrow(i, n)),
|
|
r || (r = this.parsePAC(i, n)),
|
|
r || (r = this.parseBackgroundAttributes(i, n)),
|
|
!r && (a = this.parseChars(i, n)))
|
|
) {
|
|
var o = this.currentChannel;
|
|
o && o > 0
|
|
? this.channels[o].insertChars(a)
|
|
: this.logger.log(2, "No channel found yet. TEXT-MODE?");
|
|
}
|
|
r ||
|
|
a ||
|
|
this.logger.log(
|
|
2,
|
|
"Couldn't parse cleaned data " +
|
|
Bn([i, n]) +
|
|
" orig: " +
|
|
Bn([e[s], e[s + 1]])
|
|
);
|
|
}
|
|
}),
|
|
(e.parseCmd = function (t, e) {
|
|
var r = this.cmdHistory;
|
|
if (
|
|
!(
|
|
((20 === t || 28 === t || 21 === t || 29 === t) &&
|
|
e >= 32 &&
|
|
e <= 47) ||
|
|
((23 === t || 31 === t) && e >= 33 && e <= 35)
|
|
)
|
|
)
|
|
return !1;
|
|
if (qn(t, e, r))
|
|
return (
|
|
jn(null, null, r),
|
|
this.logger.log(
|
|
3,
|
|
"Repeated command (" + Bn([t, e]) + ") is dropped"
|
|
),
|
|
!0
|
|
);
|
|
var i = 20 === t || 21 === t || 23 === t ? 1 : 2,
|
|
n = this.channels[i];
|
|
return (
|
|
20 === t || 21 === t || 28 === t || 29 === t
|
|
? 32 === e
|
|
? n.ccRCL()
|
|
: 33 === e
|
|
? n.ccBS()
|
|
: 34 === e
|
|
? n.ccAOF()
|
|
: 35 === e
|
|
? n.ccAON()
|
|
: 36 === e
|
|
? n.ccDER()
|
|
: 37 === e
|
|
? n.ccRU(2)
|
|
: 38 === e
|
|
? n.ccRU(3)
|
|
: 39 === e
|
|
? n.ccRU(4)
|
|
: 40 === e
|
|
? n.ccFON()
|
|
: 41 === e
|
|
? n.ccRDC()
|
|
: 42 === e
|
|
? n.ccTR()
|
|
: 43 === e
|
|
? n.ccRTD()
|
|
: 44 === e
|
|
? n.ccEDM()
|
|
: 45 === e
|
|
? n.ccCR()
|
|
: 46 === e
|
|
? n.ccENM()
|
|
: 47 === e && n.ccEOC()
|
|
: n.ccTO(e - 32),
|
|
jn(t, e, r),
|
|
(this.currentChannel = i),
|
|
!0
|
|
);
|
|
}),
|
|
(e.parseMidrow = function (t, e) {
|
|
var r = 0;
|
|
if ((17 === t || 25 === t) && e >= 32 && e <= 47) {
|
|
if ((r = 17 === t ? 1 : 2) !== this.currentChannel)
|
|
return (
|
|
this.logger.log(0, "Mismatch channel in midrow parsing"), !1
|
|
);
|
|
var i = this.channels[r];
|
|
return (
|
|
!!i &&
|
|
(i.ccMIDROW(e),
|
|
this.logger.log(3, "MIDROW (" + Bn([t, e]) + ")"),
|
|
!0)
|
|
);
|
|
}
|
|
return !1;
|
|
}),
|
|
(e.parsePAC = function (t, e) {
|
|
var r,
|
|
i = this.cmdHistory;
|
|
if (
|
|
!(
|
|
(((t >= 17 && t <= 23) || (t >= 25 && t <= 31)) &&
|
|
e >= 64 &&
|
|
e <= 127) ||
|
|
((16 === t || 24 === t) && e >= 64 && e <= 95)
|
|
)
|
|
)
|
|
return !1;
|
|
if (qn(t, e, i)) return jn(null, null, i), !0;
|
|
var n = t <= 23 ? 1 : 2;
|
|
r =
|
|
e >= 64 && e <= 95
|
|
? 1 === n
|
|
? xn[t]
|
|
: Mn[t]
|
|
: 1 === n
|
|
? Fn[t]
|
|
: On[t];
|
|
var a = this.channels[n];
|
|
return (
|
|
!!a &&
|
|
(a.setPAC(this.interpretPAC(r, e)),
|
|
jn(t, e, i),
|
|
(this.currentChannel = n),
|
|
!0)
|
|
);
|
|
}),
|
|
(e.interpretPAC = function (t, e) {
|
|
var r,
|
|
i = {
|
|
color: null,
|
|
italics: !1,
|
|
indent: null,
|
|
underline: !1,
|
|
row: t,
|
|
};
|
|
return (
|
|
(r = e > 95 ? e - 96 : e - 64),
|
|
(i.underline = 1 == (1 & r)),
|
|
r <= 13
|
|
? (i.color = [
|
|
"white",
|
|
"green",
|
|
"blue",
|
|
"cyan",
|
|
"red",
|
|
"yellow",
|
|
"magenta",
|
|
"white",
|
|
][Math.floor(r / 2)])
|
|
: r <= 15
|
|
? ((i.italics = !0), (i.color = "white"))
|
|
: (i.indent = 4 * Math.floor((r - 16) / 2)),
|
|
i
|
|
);
|
|
}),
|
|
(e.parseChars = function (t, e) {
|
|
var r,
|
|
i,
|
|
n = null,
|
|
a = null;
|
|
if (
|
|
(t >= 25 ? ((r = 2), (a = t - 8)) : ((r = 1), (a = t)),
|
|
a >= 17 && a <= 19
|
|
? ((i = 17 === a ? e + 80 : 18 === a ? e + 112 : e + 144),
|
|
this.logger.log(
|
|
2,
|
|
"Special char '" + Cn(i) + "' in channel " + r
|
|
),
|
|
(n = [i]))
|
|
: t >= 32 && t <= 127 && (n = 0 === e ? [t] : [t, e]),
|
|
n)
|
|
) {
|
|
var s = Bn(n);
|
|
this.logger.log(3, "Char codes = " + s.join(",")),
|
|
jn(t, e, this.cmdHistory);
|
|
}
|
|
return n;
|
|
}),
|
|
(e.parseBackgroundAttributes = function (t, e) {
|
|
var r;
|
|
if (
|
|
!(
|
|
((16 === t || 24 === t) && e >= 32 && e <= 47) ||
|
|
((23 === t || 31 === t) && e >= 45 && e <= 47)
|
|
)
|
|
)
|
|
return !1;
|
|
var i = {};
|
|
16 === t || 24 === t
|
|
? ((r = Math.floor((e - 32) / 2)),
|
|
(i.background = Nn[r]),
|
|
e % 2 == 1 && (i.background = i.background + "_semi"))
|
|
: 45 === e
|
|
? (i.background = "transparent")
|
|
: ((i.foreground = "black"), 47 === e && (i.underline = !0));
|
|
var n = t <= 23 ? 1 : 2;
|
|
return (
|
|
this.channels[n].setBkgData(i), jn(t, e, this.cmdHistory), !0
|
|
);
|
|
}),
|
|
(e.reset = function () {
|
|
for (var t = 0; t < Object.keys(this.channels).length; t++) {
|
|
var e = this.channels[t];
|
|
e && e.reset();
|
|
}
|
|
this.cmdHistory = { a: null, b: null };
|
|
}),
|
|
(e.cueSplitAtTime = function (t) {
|
|
for (var e = 0; e < this.channels.length; e++) {
|
|
var r = this.channels[e];
|
|
r && r.cueSplitAtTime(t);
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function jn(t, e, r) {
|
|
(r.a = t), (r.b = e);
|
|
}
|
|
function qn(t, e, r) {
|
|
return r.a === t && r.b === e;
|
|
}
|
|
var Xn = (function () {
|
|
function t(t, e) {
|
|
(this.timelineController = void 0),
|
|
(this.cueRanges = []),
|
|
(this.trackName = void 0),
|
|
(this.startTime = null),
|
|
(this.endTime = null),
|
|
(this.screen = null),
|
|
(this.timelineController = t),
|
|
(this.trackName = e);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.dispatchCue = function () {
|
|
null !== this.startTime &&
|
|
(this.timelineController.addCues(
|
|
this.trackName,
|
|
this.startTime,
|
|
this.endTime,
|
|
this.screen,
|
|
this.cueRanges
|
|
),
|
|
(this.startTime = null));
|
|
}),
|
|
(e.newCue = function (t, e, r) {
|
|
(null === this.startTime || this.startTime > t) &&
|
|
(this.startTime = t),
|
|
(this.endTime = e),
|
|
(this.screen = r),
|
|
this.timelineController.createCaptionsTrack(this.trackName);
|
|
}),
|
|
(e.reset = function () {
|
|
(this.cueRanges = []), (this.startTime = null);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
zn = (function () {
|
|
if ("undefined" != typeof self && self.VTTCue) return self.VTTCue;
|
|
var t = ["", "lr", "rl"],
|
|
e = ["start", "middle", "end", "left", "right"];
|
|
function r(t, e) {
|
|
if ("string" != typeof e) return !1;
|
|
if (!Array.isArray(t)) return !1;
|
|
var r = e.toLowerCase();
|
|
return !!~t.indexOf(r) && r;
|
|
}
|
|
function i(t) {
|
|
return r(e, t);
|
|
}
|
|
function n(t) {
|
|
for (
|
|
var e = arguments.length, r = new Array(e > 1 ? e - 1 : 0), i = 1;
|
|
i < e;
|
|
i++
|
|
)
|
|
r[i - 1] = arguments[i];
|
|
for (var n = 1; n < arguments.length; n++) {
|
|
var a = arguments[n];
|
|
for (var s in a) t[s] = a[s];
|
|
}
|
|
return t;
|
|
}
|
|
function a(e, a, s) {
|
|
var o = this,
|
|
l = { enumerable: !0 };
|
|
o.hasBeenReset = !1;
|
|
var u = "",
|
|
h = !1,
|
|
d = e,
|
|
c = a,
|
|
f = s,
|
|
g = null,
|
|
v = "",
|
|
m = !0,
|
|
p = "auto",
|
|
y = "start",
|
|
T = 50,
|
|
E = "middle",
|
|
S = 50,
|
|
L = "middle";
|
|
Object.defineProperty(
|
|
o,
|
|
"id",
|
|
n({}, l, {
|
|
get: function () {
|
|
return u;
|
|
},
|
|
set: function (t) {
|
|
u = "" + t;
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"pauseOnExit",
|
|
n({}, l, {
|
|
get: function () {
|
|
return h;
|
|
},
|
|
set: function (t) {
|
|
h = !!t;
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"startTime",
|
|
n({}, l, {
|
|
get: function () {
|
|
return d;
|
|
},
|
|
set: function (t) {
|
|
if ("number" != typeof t)
|
|
throw new TypeError(
|
|
"Start time must be set to a number."
|
|
);
|
|
(d = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"endTime",
|
|
n({}, l, {
|
|
get: function () {
|
|
return c;
|
|
},
|
|
set: function (t) {
|
|
if ("number" != typeof t)
|
|
throw new TypeError("End time must be set to a number.");
|
|
(c = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"text",
|
|
n({}, l, {
|
|
get: function () {
|
|
return f;
|
|
},
|
|
set: function (t) {
|
|
(f = "" + t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"region",
|
|
n({}, l, {
|
|
get: function () {
|
|
return g;
|
|
},
|
|
set: function (t) {
|
|
(g = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"vertical",
|
|
n({}, l, {
|
|
get: function () {
|
|
return v;
|
|
},
|
|
set: function (e) {
|
|
var i = (function (e) {
|
|
return r(t, e);
|
|
})(e);
|
|
if (!1 === i)
|
|
throw new SyntaxError(
|
|
"An invalid or illegal string was specified."
|
|
);
|
|
(v = i), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"snapToLines",
|
|
n({}, l, {
|
|
get: function () {
|
|
return m;
|
|
},
|
|
set: function (t) {
|
|
(m = !!t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"line",
|
|
n({}, l, {
|
|
get: function () {
|
|
return p;
|
|
},
|
|
set: function (t) {
|
|
if ("number" != typeof t && "auto" !== t)
|
|
throw new SyntaxError(
|
|
"An invalid number or illegal string was specified."
|
|
);
|
|
(p = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"lineAlign",
|
|
n({}, l, {
|
|
get: function () {
|
|
return y;
|
|
},
|
|
set: function (t) {
|
|
var e = i(t);
|
|
if (!e)
|
|
throw new SyntaxError(
|
|
"An invalid or illegal string was specified."
|
|
);
|
|
(y = e), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"position",
|
|
n({}, l, {
|
|
get: function () {
|
|
return T;
|
|
},
|
|
set: function (t) {
|
|
if (t < 0 || t > 100)
|
|
throw new Error("Position must be between 0 and 100.");
|
|
(T = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"positionAlign",
|
|
n({}, l, {
|
|
get: function () {
|
|
return E;
|
|
},
|
|
set: function (t) {
|
|
var e = i(t);
|
|
if (!e)
|
|
throw new SyntaxError(
|
|
"An invalid or illegal string was specified."
|
|
);
|
|
(E = e), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"size",
|
|
n({}, l, {
|
|
get: function () {
|
|
return S;
|
|
},
|
|
set: function (t) {
|
|
if (t < 0 || t > 100)
|
|
throw new Error("Size must be between 0 and 100.");
|
|
(S = t), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
Object.defineProperty(
|
|
o,
|
|
"align",
|
|
n({}, l, {
|
|
get: function () {
|
|
return L;
|
|
},
|
|
set: function (t) {
|
|
var e = i(t);
|
|
if (!e)
|
|
throw new SyntaxError(
|
|
"An invalid or illegal string was specified."
|
|
);
|
|
(L = e), (this.hasBeenReset = !0);
|
|
},
|
|
})
|
|
),
|
|
(o.displayState = void 0);
|
|
}
|
|
return (
|
|
(a.prototype.getCueAsHTML = function () {
|
|
return self.WebVTT.convertCueToDOMTree(self, this.text);
|
|
}),
|
|
a
|
|
);
|
|
})(),
|
|
Qn = (function () {
|
|
function t() {}
|
|
return (
|
|
(t.prototype.decode = function (t, e) {
|
|
if (!t) return "";
|
|
if ("string" != typeof t)
|
|
throw new Error("Error - expected string data.");
|
|
return decodeURIComponent(encodeURIComponent(t));
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function $n(t) {
|
|
function e(t, e, r, i) {
|
|
return 3600 * (0 | t) + 60 * (0 | e) + (0 | r) + parseFloat(i || 0);
|
|
}
|
|
var r = t.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);
|
|
return r
|
|
? parseFloat(r[2]) > 59
|
|
? e(r[2], r[3], 0, r[4])
|
|
: e(r[1], r[2], r[3], r[4])
|
|
: null;
|
|
}
|
|
var Jn = (function () {
|
|
function t() {
|
|
this.values = Object.create(null);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.set = function (t, e) {
|
|
this.get(t) || "" === e || (this.values[t] = e);
|
|
}),
|
|
(e.get = function (t, e, r) {
|
|
return r
|
|
? this.has(t)
|
|
? this.values[t]
|
|
: e[r]
|
|
: this.has(t)
|
|
? this.values[t]
|
|
: e;
|
|
}),
|
|
(e.has = function (t) {
|
|
return t in this.values;
|
|
}),
|
|
(e.alt = function (t, e, r) {
|
|
for (var i = 0; i < r.length; ++i)
|
|
if (e === r[i]) {
|
|
this.set(t, e);
|
|
break;
|
|
}
|
|
}),
|
|
(e.integer = function (t, e) {
|
|
/^-?\d+$/.test(e) && this.set(t, parseInt(e, 10));
|
|
}),
|
|
(e.percent = function (t, e) {
|
|
if (/^([\d]{1,3})(\.[\d]*)?%$/.test(e)) {
|
|
var r = parseFloat(e);
|
|
if (r >= 0 && r <= 100) return this.set(t, r), !0;
|
|
}
|
|
return !1;
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Zn(t, e, r, i) {
|
|
var n = i ? t.split(i) : [t];
|
|
for (var a in n)
|
|
if ("string" == typeof n[a]) {
|
|
var s = n[a].split(r);
|
|
2 === s.length && e(s[0], s[1]);
|
|
}
|
|
}
|
|
var ta = new zn(0, 0, ""),
|
|
ea = "middle" === ta.align ? "middle" : "center";
|
|
function ra(t, e, r) {
|
|
var i = t;
|
|
function n() {
|
|
var e = $n(t);
|
|
if (null === e) throw new Error("Malformed timestamp: " + i);
|
|
return (t = t.replace(/^[^\sa-zA-Z-]+/, "")), e;
|
|
}
|
|
function a() {
|
|
t = t.replace(/^\s+/, "");
|
|
}
|
|
if ((a(), (e.startTime = n()), a(), "--\x3e" !== t.slice(0, 3)))
|
|
throw new Error(
|
|
"Malformed time stamp (time stamps must be separated by '--\x3e'): " +
|
|
i
|
|
);
|
|
(t = t.slice(3)),
|
|
a(),
|
|
(e.endTime = n()),
|
|
a(),
|
|
(function (t, e) {
|
|
var i = new Jn();
|
|
Zn(
|
|
t,
|
|
function (t, e) {
|
|
var n;
|
|
switch (t) {
|
|
case "region":
|
|
for (var a = r.length - 1; a >= 0; a--)
|
|
if (r[a].id === e) {
|
|
i.set(t, r[a].region);
|
|
break;
|
|
}
|
|
break;
|
|
case "vertical":
|
|
i.alt(t, e, ["rl", "lr"]);
|
|
break;
|
|
case "line":
|
|
(n = e.split(",")),
|
|
i.integer(t, n[0]),
|
|
i.percent(t, n[0]) && i.set("snapToLines", !1),
|
|
i.alt(t, n[0], ["auto"]),
|
|
2 === n.length &&
|
|
i.alt("lineAlign", n[1], ["start", ea, "end"]);
|
|
break;
|
|
case "position":
|
|
(n = e.split(",")),
|
|
i.percent(t, n[0]),
|
|
2 === n.length &&
|
|
i.alt("positionAlign", n[1], [
|
|
"start",
|
|
ea,
|
|
"end",
|
|
"line-left",
|
|
"line-right",
|
|
"auto",
|
|
]);
|
|
break;
|
|
case "size":
|
|
i.percent(t, e);
|
|
break;
|
|
case "align":
|
|
i.alt(t, e, ["start", ea, "end", "left", "right"]);
|
|
}
|
|
},
|
|
/:/,
|
|
/\s/
|
|
),
|
|
(e.region = i.get("region", null)),
|
|
(e.vertical = i.get("vertical", ""));
|
|
var n = i.get("line", "auto");
|
|
"auto" === n && -1 === ta.line && (n = -1),
|
|
(e.line = n),
|
|
(e.lineAlign = i.get("lineAlign", "start")),
|
|
(e.snapToLines = i.get("snapToLines", !0)),
|
|
(e.size = i.get("size", 100)),
|
|
(e.align = i.get("align", ea));
|
|
var a = i.get("position", "auto");
|
|
"auto" === a &&
|
|
50 === ta.position &&
|
|
(a =
|
|
"start" === e.align || "left" === e.align
|
|
? 0
|
|
: "end" === e.align || "right" === e.align
|
|
? 100
|
|
: 50),
|
|
(e.position = a);
|
|
})(t, e);
|
|
}
|
|
function ia(t) {
|
|
return t.replace(/<br(?: \/)?>/gi, "\n");
|
|
}
|
|
var na = (function () {
|
|
function t() {
|
|
(this.state = "INITIAL"),
|
|
(this.buffer = ""),
|
|
(this.decoder = new Qn()),
|
|
(this.regionList = []),
|
|
(this.cue = null),
|
|
(this.oncue = void 0),
|
|
(this.onparsingerror = void 0),
|
|
(this.onflush = void 0);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.parse = function (t) {
|
|
var e = this;
|
|
function r() {
|
|
var t = e.buffer,
|
|
r = 0;
|
|
for (
|
|
t = ia(t);
|
|
r < t.length && "\r" !== t[r] && "\n" !== t[r];
|
|
|
|
)
|
|
++r;
|
|
var i = t.slice(0, r);
|
|
return (
|
|
"\r" === t[r] && ++r,
|
|
"\n" === t[r] && ++r,
|
|
(e.buffer = t.slice(r)),
|
|
i
|
|
);
|
|
}
|
|
t && (e.buffer += e.decoder.decode(t, { stream: !0 }));
|
|
try {
|
|
var i = "";
|
|
if ("INITIAL" === e.state) {
|
|
if (!/\r\n|\n/.test(e.buffer)) return this;
|
|
var n = (i = r()).match(/^()?WEBVTT([ \t].*)?$/);
|
|
if (null == n || !n[0])
|
|
throw new Error("Malformed WebVTT signature.");
|
|
e.state = "HEADER";
|
|
}
|
|
for (var a = !1; e.buffer; ) {
|
|
if (!/\r\n|\n/.test(e.buffer)) return this;
|
|
switch ((a ? (a = !1) : (i = r()), e.state)) {
|
|
case "HEADER":
|
|
/:/.test(i)
|
|
? Zn(i, function (t, e) {}, /:/)
|
|
: i || (e.state = "ID");
|
|
continue;
|
|
case "NOTE":
|
|
i || (e.state = "ID");
|
|
continue;
|
|
case "ID":
|
|
if (/^NOTE($|[ \t])/.test(i)) {
|
|
e.state = "NOTE";
|
|
break;
|
|
}
|
|
if (!i) continue;
|
|
if (
|
|
((e.cue = new zn(0, 0, "")),
|
|
(e.state = "CUE"),
|
|
-1 === i.indexOf("--\x3e"))
|
|
) {
|
|
e.cue.id = i;
|
|
continue;
|
|
}
|
|
case "CUE":
|
|
if (!e.cue) {
|
|
e.state = "BADCUE";
|
|
continue;
|
|
}
|
|
try {
|
|
ra(i, e.cue, e.regionList);
|
|
} catch (t) {
|
|
(e.cue = null), (e.state = "BADCUE");
|
|
continue;
|
|
}
|
|
e.state = "CUETEXT";
|
|
continue;
|
|
case "CUETEXT":
|
|
var s = -1 !== i.indexOf("--\x3e");
|
|
if (!i || (s && (a = !0))) {
|
|
e.oncue && e.cue && e.oncue(e.cue),
|
|
(e.cue = null),
|
|
(e.state = "ID");
|
|
continue;
|
|
}
|
|
if (null === e.cue) continue;
|
|
e.cue.text && (e.cue.text += "\n"), (e.cue.text += i);
|
|
continue;
|
|
case "BADCUE":
|
|
i || (e.state = "ID");
|
|
}
|
|
}
|
|
} catch (t) {
|
|
"CUETEXT" === e.state && e.cue && e.oncue && e.oncue(e.cue),
|
|
(e.cue = null),
|
|
(e.state = "INITIAL" === e.state ? "BADWEBVTT" : "BADCUE");
|
|
}
|
|
return this;
|
|
}),
|
|
(e.flush = function () {
|
|
var t = this;
|
|
try {
|
|
if (
|
|
((t.cue || "HEADER" === t.state) &&
|
|
((t.buffer += "\n\n"), t.parse()),
|
|
"INITIAL" === t.state || "BADWEBVTT" === t.state)
|
|
)
|
|
throw new Error("Malformed WebVTT signature.");
|
|
} catch (e) {
|
|
t.onparsingerror && t.onparsingerror(e);
|
|
}
|
|
return t.onflush && t.onflush(), this;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
aa = /\r\n|\n\r|\n|\r/g,
|
|
sa = function (t, e, r) {
|
|
return void 0 === r && (r = 0), t.slice(r, r + e.length) === e;
|
|
},
|
|
oa = function (t) {
|
|
for (var e = 5381, r = t.length; r; )
|
|
e = (33 * e) ^ t.charCodeAt(--r);
|
|
return (e >>> 0).toString();
|
|
};
|
|
function la(t, e, r) {
|
|
return oa(t.toString()) + oa(e.toString()) + oa(r);
|
|
}
|
|
function ua(t, e, r, i, n, a, s) {
|
|
var o,
|
|
l,
|
|
u,
|
|
h = new na(),
|
|
d = pt(new Uint8Array(t)).trim().replace(aa, "\n").split("\n"),
|
|
c = [],
|
|
f = e
|
|
? ((o = e.baseTime),
|
|
void 0 === (l = e.timescale) && (l = 1),
|
|
Ui(o, 9e4, 1 / l))
|
|
: 0,
|
|
g = "00:00.000",
|
|
v = 0,
|
|
m = 0,
|
|
p = !0;
|
|
(h.oncue = function (t) {
|
|
var a = r[i],
|
|
s = r.ccOffset,
|
|
o = (v - f) / 9e4;
|
|
if (
|
|
(null != a &&
|
|
a.new &&
|
|
(void 0 !== m
|
|
? (s = r.ccOffset = a.start)
|
|
: (function (t, e, r) {
|
|
var i = t[e],
|
|
n = t[i.prevCC];
|
|
if (!n || (!n.new && i.new))
|
|
return (
|
|
(t.ccOffset = t.presentationOffset = i.start),
|
|
void (i.new = !1)
|
|
);
|
|
for (; null != (a = n) && a.new; ) {
|
|
var a;
|
|
(t.ccOffset += i.start - n.start),
|
|
(i.new = !1),
|
|
(n = t[(i = n).prevCC]);
|
|
}
|
|
t.presentationOffset = r;
|
|
})(r, i, o)),
|
|
o)
|
|
) {
|
|
if (!e)
|
|
return void (u = new Error("Missing initPTS for VTT MPEGTS"));
|
|
s = o - r.presentationOffset;
|
|
}
|
|
var l = t.endTime - t.startTime,
|
|
h = Vi(9e4 * (t.startTime + s - m), 9e4 * n) / 9e4;
|
|
(t.startTime = Math.max(h, 0)), (t.endTime = Math.max(h + l, 0));
|
|
var d = t.text.trim();
|
|
(t.text = decodeURIComponent(encodeURIComponent(d))),
|
|
t.id || (t.id = la(t.startTime, t.endTime, d)),
|
|
t.endTime > 0 && c.push(t);
|
|
}),
|
|
(h.onparsingerror = function (t) {
|
|
u = t;
|
|
}),
|
|
(h.onflush = function () {
|
|
u ? s(u) : a(c);
|
|
}),
|
|
d.forEach(function (t) {
|
|
if (p) {
|
|
if (sa(t, "X-TIMESTAMP-MAP=")) {
|
|
(p = !1),
|
|
t
|
|
.slice(16)
|
|
.split(",")
|
|
.forEach(function (t) {
|
|
sa(t, "LOCAL:")
|
|
? (g = t.slice(6))
|
|
: sa(t, "MPEGTS:") && (v = parseInt(t.slice(7)));
|
|
});
|
|
try {
|
|
m =
|
|
(function (t) {
|
|
var e = parseInt(t.slice(-3)),
|
|
r = parseInt(t.slice(-6, -4)),
|
|
i = parseInt(t.slice(-9, -7)),
|
|
n =
|
|
t.length > 9
|
|
? parseInt(t.substring(0, t.indexOf(":")))
|
|
: 0;
|
|
if (!(E(e) && E(r) && E(i) && E(n)))
|
|
throw Error("Malformed X-TIMESTAMP-MAP: Local:" + t);
|
|
return (e += 1e3 * r), (e += 6e4 * i) + 36e5 * n;
|
|
})(g) / 1e3;
|
|
} catch (t) {
|
|
u = t;
|
|
}
|
|
return;
|
|
}
|
|
"" === t && (p = !1);
|
|
}
|
|
h.parse(t + "\n");
|
|
}),
|
|
h.flush();
|
|
}
|
|
var ha = "stpp.ttml.im1t",
|
|
da = /^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/,
|
|
ca = /^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/,
|
|
fa = {
|
|
left: "start",
|
|
center: "center",
|
|
right: "end",
|
|
start: "start",
|
|
end: "end",
|
|
};
|
|
function ga(t, e, r, i) {
|
|
var n = It(new Uint8Array(t), ["mdat"]);
|
|
if (0 !== n.length) {
|
|
var a,
|
|
s,
|
|
l,
|
|
u,
|
|
h = n.map(function (t) {
|
|
return pt(t);
|
|
}),
|
|
d =
|
|
((a = e.baseTime),
|
|
(s = 1),
|
|
void 0 === (l = e.timescale) && (l = 1),
|
|
void 0 === u && (u = !1),
|
|
Ui(a, s, 1 / l, u));
|
|
try {
|
|
h.forEach(function (t) {
|
|
return r(
|
|
(function (t, e) {
|
|
var r = new DOMParser()
|
|
.parseFromString(t, "text/xml")
|
|
.getElementsByTagName("tt")[0];
|
|
if (!r) throw new Error("Invalid ttml");
|
|
var i = {
|
|
frameRate: 30,
|
|
subFrameRate: 1,
|
|
frameRateMultiplier: 0,
|
|
tickRate: 0,
|
|
},
|
|
n = Object.keys(i).reduce(function (t, e) {
|
|
return (t[e] = r.getAttribute("ttp:" + e) || i[e]), t;
|
|
}, {}),
|
|
a = "preserve" !== r.getAttribute("xml:space"),
|
|
s = ma(va(r, "styling", "style")),
|
|
l = ma(va(r, "layout", "region")),
|
|
u = va(r, "body", "[begin]");
|
|
return [].map
|
|
.call(u, function (t) {
|
|
var r = pa(t, a);
|
|
if (!r || !t.hasAttribute("begin")) return null;
|
|
var i = Ea(t.getAttribute("begin"), n),
|
|
u = Ea(t.getAttribute("dur"), n),
|
|
h = Ea(t.getAttribute("end"), n);
|
|
if (null === i) throw Ta(t);
|
|
if (null === h) {
|
|
if (null === u) throw Ta(t);
|
|
h = i + u;
|
|
}
|
|
var d = new zn(i - e, h - e, r);
|
|
d.id = la(d.startTime, d.endTime, d.text);
|
|
var c = (function (t, e, r) {
|
|
var i = "http://www.w3.org/ns/ttml#styling",
|
|
n = null,
|
|
a = [
|
|
"displayAlign",
|
|
"textAlign",
|
|
"color",
|
|
"backgroundColor",
|
|
"fontSize",
|
|
"fontFamily",
|
|
],
|
|
s =
|
|
null != t && t.hasAttribute("style")
|
|
? t.getAttribute("style")
|
|
: null;
|
|
return (
|
|
s && r.hasOwnProperty(s) && (n = r[s]),
|
|
a.reduce(function (r, a) {
|
|
var s = ya(e, i, a) || ya(t, i, a) || ya(n, i, a);
|
|
return s && (r[a] = s), r;
|
|
}, {})
|
|
);
|
|
})(
|
|
l[t.getAttribute("region")],
|
|
s[t.getAttribute("style")],
|
|
s
|
|
),
|
|
f = c.textAlign;
|
|
if (f) {
|
|
var g = fa[f];
|
|
g && (d.lineAlign = g), (d.align = f);
|
|
}
|
|
return o(d, c), d;
|
|
})
|
|
.filter(function (t) {
|
|
return null !== t;
|
|
});
|
|
})(t, d)
|
|
);
|
|
});
|
|
} catch (t) {
|
|
i(t);
|
|
}
|
|
} else i(new Error("Could not parse IMSC1 mdat"));
|
|
}
|
|
function va(t, e, r) {
|
|
var i = t.getElementsByTagName(e)[0];
|
|
return i ? [].slice.call(i.querySelectorAll(r)) : [];
|
|
}
|
|
function ma(t) {
|
|
return t.reduce(function (t, e) {
|
|
var r = e.getAttribute("xml:id");
|
|
return r && (t[r] = e), t;
|
|
}, {});
|
|
}
|
|
function pa(t, e) {
|
|
return [].slice.call(t.childNodes).reduce(function (t, r, i) {
|
|
var n;
|
|
return "br" === r.nodeName && i
|
|
? t + "\n"
|
|
: null != (n = r.childNodes) && n.length
|
|
? pa(r, e)
|
|
: e
|
|
? t + r.textContent.trim().replace(/\s+/g, " ")
|
|
: t + r.textContent;
|
|
}, "");
|
|
}
|
|
function ya(t, e, r) {
|
|
return t && t.hasAttributeNS(e, r) ? t.getAttributeNS(e, r) : null;
|
|
}
|
|
function Ta(t) {
|
|
return new Error("Could not parse ttml timestamp " + t);
|
|
}
|
|
function Ea(t, e) {
|
|
if (!t) return null;
|
|
var r = $n(t);
|
|
return (
|
|
null === r &&
|
|
(da.test(t)
|
|
? (r = (function (t, e) {
|
|
var r = da.exec(t),
|
|
i = (0 | r[4]) + (0 | r[5]) / e.subFrameRate;
|
|
return (
|
|
3600 * (0 | r[1]) +
|
|
60 * (0 | r[2]) +
|
|
(0 | r[3]) +
|
|
i / e.frameRate
|
|
);
|
|
})(t, e))
|
|
: ca.test(t) &&
|
|
(r = (function (t, e) {
|
|
var r = ca.exec(t),
|
|
i = Number(r[1]);
|
|
switch (r[2]) {
|
|
case "h":
|
|
return 3600 * i;
|
|
case "m":
|
|
return 60 * i;
|
|
case "ms":
|
|
return 1e3 * i;
|
|
case "f":
|
|
return i / e.frameRate;
|
|
case "t":
|
|
return i / e.tickRate;
|
|
}
|
|
return i;
|
|
})(t, e))),
|
|
r
|
|
);
|
|
}
|
|
var Sa = (function () {
|
|
function t(t) {
|
|
if (
|
|
((this.hls = void 0),
|
|
(this.media = null),
|
|
(this.config = void 0),
|
|
(this.enabled = !0),
|
|
(this.Cues = void 0),
|
|
(this.textTracks = []),
|
|
(this.tracks = []),
|
|
(this.initPTS = []),
|
|
(this.unparsedVttFrags = []),
|
|
(this.captionsTracks = {}),
|
|
(this.nonNativeCaptionsTracks = {}),
|
|
(this.cea608Parser1 = void 0),
|
|
(this.cea608Parser2 = void 0),
|
|
(this.lastSn = -1),
|
|
(this.lastPartIndex = -1),
|
|
(this.prevCC = -1),
|
|
(this.vttCCs = {
|
|
ccOffset: 0,
|
|
presentationOffset: 0,
|
|
0: { start: 0, prevCC: -1, new: !0 },
|
|
}),
|
|
(this.captionsProperties = void 0),
|
|
(this.hls = t),
|
|
(this.config = t.config),
|
|
(this.Cues = t.config.cueHandler),
|
|
(this.captionsProperties = {
|
|
textTrack1: {
|
|
label: this.config.captionsTextTrack1Label,
|
|
languageCode: this.config.captionsTextTrack1LanguageCode,
|
|
},
|
|
textTrack2: {
|
|
label: this.config.captionsTextTrack2Label,
|
|
languageCode: this.config.captionsTextTrack2LanguageCode,
|
|
},
|
|
textTrack3: {
|
|
label: this.config.captionsTextTrack3Label,
|
|
languageCode: this.config.captionsTextTrack3LanguageCode,
|
|
},
|
|
textTrack4: {
|
|
label: this.config.captionsTextTrack4Label,
|
|
languageCode: this.config.captionsTextTrack4LanguageCode,
|
|
},
|
|
}),
|
|
this.config.enableCEA708Captions)
|
|
) {
|
|
var e = new Xn(this, "textTrack1"),
|
|
r = new Xn(this, "textTrack2"),
|
|
i = new Xn(this, "textTrack3"),
|
|
n = new Xn(this, "textTrack4");
|
|
(this.cea608Parser1 = new Wn(1, e, r)),
|
|
(this.cea608Parser2 = new Wn(3, i, n));
|
|
}
|
|
t.on(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.on(S.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this),
|
|
t.on(S.FRAG_LOADING, this.onFragLoading, this),
|
|
t.on(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.on(S.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this),
|
|
t.on(S.FRAG_DECRYPTED, this.onFragDecrypted, this),
|
|
t.on(S.INIT_PTS_FOUND, this.onInitPtsFound, this),
|
|
t.on(S.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this),
|
|
t.on(S.BUFFER_FLUSHING, this.onBufferFlushing, this);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this),
|
|
t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.off(
|
|
S.SUBTITLE_TRACKS_UPDATED,
|
|
this.onSubtitleTracksUpdated,
|
|
this
|
|
),
|
|
t.off(S.FRAG_LOADING, this.onFragLoading, this),
|
|
t.off(S.FRAG_LOADED, this.onFragLoaded, this),
|
|
t.off(S.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this),
|
|
t.off(S.FRAG_DECRYPTED, this.onFragDecrypted, this),
|
|
t.off(S.INIT_PTS_FOUND, this.onInitPtsFound, this),
|
|
t.off(
|
|
S.SUBTITLE_TRACKS_CLEARED,
|
|
this.onSubtitleTracksCleared,
|
|
this
|
|
),
|
|
t.off(S.BUFFER_FLUSHING, this.onBufferFlushing, this),
|
|
(this.hls =
|
|
this.config =
|
|
this.cea608Parser1 =
|
|
this.cea608Parser2 =
|
|
null);
|
|
}),
|
|
(e.addCues = function (t, e, r, i, n) {
|
|
for (var a, s, o, l, u = !1, h = n.length; h--; ) {
|
|
var d = n[h],
|
|
c =
|
|
((a = d[0]),
|
|
(s = d[1]),
|
|
(o = e),
|
|
(l = r),
|
|
Math.min(s, l) - Math.max(a, o));
|
|
if (
|
|
c >= 0 &&
|
|
((d[0] = Math.min(d[0], e)),
|
|
(d[1] = Math.max(d[1], r)),
|
|
(u = !0),
|
|
c / (r - e) > 0.5)
|
|
)
|
|
return;
|
|
}
|
|
if ((u || n.push([e, r]), this.config.renderTextTracksNatively)) {
|
|
var f = this.captionsTracks[t];
|
|
this.Cues.newCue(f, e, r, i);
|
|
} else {
|
|
var g = this.Cues.newCue(null, e, r, i);
|
|
this.hls.trigger(S.CUES_PARSED, {
|
|
type: "captions",
|
|
cues: g,
|
|
track: t,
|
|
});
|
|
}
|
|
}),
|
|
(e.onInitPtsFound = function (t, e) {
|
|
var r = this,
|
|
i = e.frag,
|
|
n = e.id,
|
|
a = e.initPTS,
|
|
s = e.timescale,
|
|
o = this.unparsedVttFrags;
|
|
"main" === n &&
|
|
(this.initPTS[i.cc] = { baseTime: a, timescale: s }),
|
|
o.length &&
|
|
((this.unparsedVttFrags = []),
|
|
o.forEach(function (t) {
|
|
r.onFragLoaded(S.FRAG_LOADED, t);
|
|
}));
|
|
}),
|
|
(e.getExistingTrack = function (t) {
|
|
var e = this.media;
|
|
if (e)
|
|
for (var r = 0; r < e.textTracks.length; r++) {
|
|
var i = e.textTracks[r];
|
|
if (i[t]) return i;
|
|
}
|
|
return null;
|
|
}),
|
|
(e.createCaptionsTrack = function (t) {
|
|
this.config.renderTextTracksNatively
|
|
? this.createNativeTrack(t)
|
|
: this.createNonNativeTrack(t);
|
|
}),
|
|
(e.createNativeTrack = function (t) {
|
|
if (!this.captionsTracks[t]) {
|
|
var e = this.captionsProperties,
|
|
r = this.captionsTracks,
|
|
i = this.media,
|
|
n = e[t],
|
|
a = n.label,
|
|
s = n.languageCode,
|
|
o = this.getExistingTrack(t);
|
|
if (o) (r[t] = o), Le(r[t]), Ee(r[t], i);
|
|
else {
|
|
var l = this.createTextTrack("captions", a, s);
|
|
l && ((l[t] = !0), (r[t] = l));
|
|
}
|
|
}
|
|
}),
|
|
(e.createNonNativeTrack = function (t) {
|
|
if (!this.nonNativeCaptionsTracks[t]) {
|
|
var e = this.captionsProperties[t];
|
|
if (e) {
|
|
var r = {
|
|
_id: t,
|
|
label: e.label,
|
|
kind: "captions",
|
|
default: !!e.media && !!e.media.default,
|
|
closedCaptions: e.media,
|
|
};
|
|
(this.nonNativeCaptionsTracks[t] = r),
|
|
this.hls.trigger(S.NON_NATIVE_TEXT_TRACKS_FOUND, {
|
|
tracks: [r],
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
(e.createTextTrack = function (t, e, r) {
|
|
var i = this.media;
|
|
if (i) return i.addTextTrack(t, e, r);
|
|
}),
|
|
(e.onMediaAttaching = function (t, e) {
|
|
(this.media = e.media), this._cleanTracks();
|
|
}),
|
|
(e.onMediaDetaching = function () {
|
|
var t = this.captionsTracks;
|
|
Object.keys(t).forEach(function (e) {
|
|
Le(t[e]), delete t[e];
|
|
}),
|
|
(this.nonNativeCaptionsTracks = {});
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
(this.lastSn = -1),
|
|
(this.lastPartIndex = -1),
|
|
(this.prevCC = -1),
|
|
(this.vttCCs = {
|
|
ccOffset: 0,
|
|
presentationOffset: 0,
|
|
0: { start: 0, prevCC: -1, new: !0 },
|
|
}),
|
|
this._cleanTracks(),
|
|
(this.tracks = []),
|
|
(this.captionsTracks = {}),
|
|
(this.nonNativeCaptionsTracks = {}),
|
|
(this.textTracks = []),
|
|
(this.unparsedVttFrags = []),
|
|
(this.initPTS = []),
|
|
this.cea608Parser1 &&
|
|
this.cea608Parser2 &&
|
|
(this.cea608Parser1.reset(), this.cea608Parser2.reset());
|
|
}),
|
|
(e._cleanTracks = function () {
|
|
var t = this.media;
|
|
if (t) {
|
|
var e = t.textTracks;
|
|
if (e) for (var r = 0; r < e.length; r++) Le(e[r]);
|
|
}
|
|
}),
|
|
(e.onSubtitleTracksUpdated = function (t, e) {
|
|
var r = this,
|
|
i = e.subtitleTracks || [],
|
|
n = i.some(function (t) {
|
|
return t.textCodec === ha;
|
|
});
|
|
if (this.config.enableWebVTT || (n && this.config.enableIMSC1)) {
|
|
if (Tn(this.tracks, i)) return void (this.tracks = i);
|
|
if (
|
|
((this.textTracks = []),
|
|
(this.tracks = i),
|
|
this.config.renderTextTracksNatively)
|
|
) {
|
|
var a = this.media ? this.media.textTracks : null;
|
|
this.tracks.forEach(function (t, e) {
|
|
var i;
|
|
if (a && e < a.length) {
|
|
for (var n = null, s = 0; s < a.length; s++)
|
|
if (La(a[s], t)) {
|
|
n = a[s];
|
|
break;
|
|
}
|
|
n && (i = n);
|
|
}
|
|
if (i) Le(i);
|
|
else {
|
|
var o = r._captionsOrSubtitlesFromCharacteristics(t);
|
|
(i = r.createTextTrack(o, t.name, t.lang)) &&
|
|
(i.mode = "disabled");
|
|
}
|
|
i && ((i.groupId = t.groupId), r.textTracks.push(i));
|
|
});
|
|
} else if (this.tracks.length) {
|
|
var s = this.tracks.map(function (t) {
|
|
return {
|
|
label: t.name,
|
|
kind: t.type.toLowerCase(),
|
|
default: t.default,
|
|
subtitleTrack: t,
|
|
};
|
|
});
|
|
this.hls.trigger(S.NON_NATIVE_TEXT_TRACKS_FOUND, { tracks: s });
|
|
}
|
|
}
|
|
}),
|
|
(e._captionsOrSubtitlesFromCharacteristics = function (t) {
|
|
if (t.attrs.CHARACTERISTICS) {
|
|
var e = /transcribes-spoken-dialog/gi.test(
|
|
t.attrs.CHARACTERISTICS
|
|
),
|
|
r = /describes-music-and-sound/gi.test(t.attrs.CHARACTERISTICS);
|
|
if (e && r) return "captions";
|
|
}
|
|
return "subtitles";
|
|
}),
|
|
(e.onManifestLoaded = function (t, e) {
|
|
var r = this;
|
|
this.config.enableCEA708Captions &&
|
|
e.captions &&
|
|
e.captions.forEach(function (t) {
|
|
var e = /(?:CC|SERVICE)([1-4])/.exec(t.instreamId);
|
|
if (e) {
|
|
var i = "textTrack" + e[1],
|
|
n = r.captionsProperties[i];
|
|
n &&
|
|
((n.label = t.name),
|
|
t.lang && (n.languageCode = t.lang),
|
|
(n.media = t));
|
|
}
|
|
});
|
|
}),
|
|
(e.closedCaptionsForLevel = function (t) {
|
|
var e = this.hls.levels[t.level];
|
|
return null == e ? void 0 : e.attrs["CLOSED-CAPTIONS"];
|
|
}),
|
|
(e.onFragLoading = function (t, e) {
|
|
var r = this.cea608Parser1,
|
|
i = this.cea608Parser2,
|
|
n = this.lastSn,
|
|
a = this.lastPartIndex;
|
|
if (this.enabled && r && i && e.frag.type === ge) {
|
|
var s,
|
|
o,
|
|
l = e.frag.sn,
|
|
u =
|
|
null !=
|
|
(s = null == e || null == (o = e.part) ? void 0 : o.index)
|
|
? s
|
|
: -1;
|
|
l === n + 1 || (l === n && u === a + 1) || (r.reset(), i.reset()),
|
|
(this.lastSn = l),
|
|
(this.lastPartIndex = u);
|
|
}
|
|
}),
|
|
(e.onFragLoaded = function (t, e) {
|
|
var r = e.frag,
|
|
i = e.payload;
|
|
if (r.type === me)
|
|
if (i.byteLength) {
|
|
var n = r.decryptdata,
|
|
a = "stats" in e;
|
|
if (null == n || !n.encrypted || a) {
|
|
var s = this.tracks[r.level],
|
|
o = this.vttCCs;
|
|
o[r.cc] ||
|
|
((o[r.cc] = {
|
|
start: r.start,
|
|
prevCC: this.prevCC,
|
|
new: !0,
|
|
}),
|
|
(this.prevCC = r.cc)),
|
|
s && s.textCodec === ha
|
|
? this._parseIMSC1(r, i)
|
|
: this._parseVTTs(e);
|
|
}
|
|
} else
|
|
this.hls.trigger(S.SUBTITLE_FRAG_PROCESSED, {
|
|
success: !1,
|
|
frag: r,
|
|
error: new Error("Empty subtitle payload"),
|
|
});
|
|
}),
|
|
(e._parseIMSC1 = function (t, e) {
|
|
var r = this,
|
|
i = this.hls;
|
|
ga(
|
|
e,
|
|
this.initPTS[t.cc],
|
|
function (e) {
|
|
r._appendCues(e, t.level),
|
|
i.trigger(S.SUBTITLE_FRAG_PROCESSED, {
|
|
success: !0,
|
|
frag: t,
|
|
});
|
|
},
|
|
function (e) {
|
|
w.log("Failed to parse IMSC1: " + e),
|
|
i.trigger(S.SUBTITLE_FRAG_PROCESSED, {
|
|
success: !1,
|
|
frag: t,
|
|
error: e,
|
|
});
|
|
}
|
|
);
|
|
}),
|
|
(e._parseVTTs = function (t) {
|
|
var e,
|
|
r = this,
|
|
i = t.frag,
|
|
n = t.payload,
|
|
a = this.initPTS,
|
|
s = this.unparsedVttFrags,
|
|
o = a.length - 1;
|
|
if (a[i.cc] || -1 !== o) {
|
|
var l = this.hls;
|
|
ua(
|
|
null != (e = i.initSegment) && e.data
|
|
? xt(i.initSegment.data, new Uint8Array(n))
|
|
: n,
|
|
this.initPTS[i.cc],
|
|
this.vttCCs,
|
|
i.cc,
|
|
i.start,
|
|
function (t) {
|
|
r._appendCues(t, i.level),
|
|
l.trigger(S.SUBTITLE_FRAG_PROCESSED, {
|
|
success: !0,
|
|
frag: i,
|
|
});
|
|
},
|
|
function (e) {
|
|
var a = "Missing initPTS for VTT MPEGTS" === e.message;
|
|
a ? s.push(t) : r._fallbackToIMSC1(i, n),
|
|
w.log("Failed to parse VTT cue: " + e),
|
|
(a && o > i.cc) ||
|
|
l.trigger(S.SUBTITLE_FRAG_PROCESSED, {
|
|
success: !1,
|
|
frag: i,
|
|
error: e,
|
|
});
|
|
}
|
|
);
|
|
} else s.push(t);
|
|
}),
|
|
(e._fallbackToIMSC1 = function (t, e) {
|
|
var r = this,
|
|
i = this.tracks[t.level];
|
|
i.textCodec ||
|
|
ga(
|
|
e,
|
|
this.initPTS[t.cc],
|
|
function () {
|
|
(i.textCodec = ha), r._parseIMSC1(t, e);
|
|
},
|
|
function () {
|
|
i.textCodec = "wvtt";
|
|
}
|
|
);
|
|
}),
|
|
(e._appendCues = function (t, e) {
|
|
var r = this.hls;
|
|
if (this.config.renderTextTracksNatively) {
|
|
var i = this.textTracks[e];
|
|
if (!i || "disabled" === i.mode) return;
|
|
t.forEach(function (t) {
|
|
return Se(i, t);
|
|
});
|
|
} else {
|
|
var n = this.tracks[e];
|
|
if (!n) return;
|
|
var a = n.default ? "default" : "subtitles" + e;
|
|
r.trigger(S.CUES_PARSED, {
|
|
type: "subtitles",
|
|
cues: t,
|
|
track: a,
|
|
});
|
|
}
|
|
}),
|
|
(e.onFragDecrypted = function (t, e) {
|
|
e.frag.type === me && this.onFragLoaded(S.FRAG_LOADED, e);
|
|
}),
|
|
(e.onSubtitleTracksCleared = function () {
|
|
(this.tracks = []), (this.captionsTracks = {});
|
|
}),
|
|
(e.onFragParsingUserdata = function (t, e) {
|
|
var r = this.cea608Parser1,
|
|
i = this.cea608Parser2;
|
|
if (this.enabled && r && i) {
|
|
var n = e.frag,
|
|
a = e.samples;
|
|
if (n.type !== ge || "NONE" !== this.closedCaptionsForLevel(n))
|
|
for (var s = 0; s < a.length; s++) {
|
|
var o = a[s].bytes;
|
|
if (o) {
|
|
var l = this.extractCea608Data(o);
|
|
r.addData(a[s].pts, l[0]), i.addData(a[s].pts, l[1]);
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.onBufferFlushing = function (t, e) {
|
|
var r = e.startOffset,
|
|
i = e.endOffset,
|
|
n = e.endOffsetSubtitles,
|
|
a = e.type,
|
|
s = this.media;
|
|
if (s && !(s.currentTime < i)) {
|
|
if (!a || "video" === a) {
|
|
var o = this.captionsTracks;
|
|
Object.keys(o).forEach(function (t) {
|
|
return Re(o[t], r, i);
|
|
});
|
|
}
|
|
if (
|
|
this.config.renderTextTracksNatively &&
|
|
0 === r &&
|
|
void 0 !== n
|
|
) {
|
|
var l = this.textTracks;
|
|
Object.keys(l).forEach(function (t) {
|
|
return Re(l[t], r, n);
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
(e.extractCea608Data = function (t) {
|
|
for (var e = [[], []], r = 31 & t[0], i = 2, n = 0; n < r; n++) {
|
|
var a = t[i++],
|
|
s = 127 & t[i++],
|
|
o = 127 & t[i++];
|
|
if ((0 !== s || 0 !== o) && 0 != (4 & a)) {
|
|
var l = 3 & a;
|
|
(0 !== l && 1 !== l) || (e[l].push(s), e[l].push(o));
|
|
}
|
|
}
|
|
return e;
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function La(t, e) {
|
|
return !!t && t.label === e.name && !(t.textTrack1 || t.textTrack2);
|
|
}
|
|
var Ra = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.autoLevelCapping = void 0),
|
|
(this.firstLevel = void 0),
|
|
(this.media = void 0),
|
|
(this.restrictedLevels = void 0),
|
|
(this.timer = void 0),
|
|
(this.clientRect = void 0),
|
|
(this.streamController = void 0),
|
|
(this.hls = t),
|
|
(this.autoLevelCapping = Number.POSITIVE_INFINITY),
|
|
(this.firstLevel = -1),
|
|
(this.media = null),
|
|
(this.restrictedLevels = []),
|
|
(this.timer = void 0),
|
|
(this.clientRect = null),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.setStreamController = function (t) {
|
|
this.streamController = t;
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListener(),
|
|
this.hls.config.capLevelToPlayerSize && this.stopCapping(),
|
|
(this.media = null),
|
|
(this.clientRect = null),
|
|
(this.hls = this.streamController = null);
|
|
}),
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this),
|
|
t.on(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.BUFFER_CODECS, this.onBufferCodecs, this),
|
|
t.on(S.MEDIA_DETACHING, this.onMediaDetaching, this);
|
|
}),
|
|
(e.unregisterListener = function () {
|
|
var t = this.hls;
|
|
t.off(S.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this),
|
|
t.off(S.MEDIA_ATTACHING, this.onMediaAttaching, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.BUFFER_CODECS, this.onBufferCodecs, this),
|
|
t.off(S.MEDIA_DETACHING, this.onMediaDetaching, this);
|
|
}),
|
|
(e.onFpsDropLevelCapping = function (t, e) {
|
|
var r = this.hls.levels[e.droppedLevel];
|
|
this.isLevelAllowed(r) &&
|
|
this.restrictedLevels.push({
|
|
bitrate: r.bitrate,
|
|
height: r.height,
|
|
width: r.width,
|
|
});
|
|
}),
|
|
(e.onMediaAttaching = function (t, e) {
|
|
(this.media =
|
|
e.media instanceof HTMLVideoElement ? e.media : null),
|
|
(this.clientRect = null);
|
|
}),
|
|
(e.onManifestParsed = function (t, e) {
|
|
var r = this.hls;
|
|
(this.restrictedLevels = []),
|
|
(this.firstLevel = e.firstLevel),
|
|
r.config.capLevelToPlayerSize && e.video && this.startCapping();
|
|
}),
|
|
(e.onBufferCodecs = function (t, e) {
|
|
this.hls.config.capLevelToPlayerSize &&
|
|
e.video &&
|
|
this.startCapping();
|
|
}),
|
|
(e.onMediaDetaching = function () {
|
|
this.stopCapping();
|
|
}),
|
|
(e.detectPlayerSize = function () {
|
|
if (this.media && this.mediaHeight > 0 && this.mediaWidth > 0) {
|
|
var t = this.hls.levels;
|
|
if (t.length) {
|
|
var e = this.hls;
|
|
(e.autoLevelCapping = this.getMaxLevel(t.length - 1)),
|
|
e.autoLevelCapping > this.autoLevelCapping &&
|
|
this.streamController &&
|
|
this.streamController.nextLevelSwitch(),
|
|
(this.autoLevelCapping = e.autoLevelCapping);
|
|
}
|
|
}
|
|
}),
|
|
(e.getMaxLevel = function (e) {
|
|
var r = this,
|
|
i = this.hls.levels;
|
|
if (!i.length) return -1;
|
|
var n = i.filter(function (t, i) {
|
|
return r.isLevelAllowed(t) && i <= e;
|
|
});
|
|
return (
|
|
(this.clientRect = null),
|
|
t.getMaxLevelByMediaSize(n, this.mediaWidth, this.mediaHeight)
|
|
);
|
|
}),
|
|
(e.startCapping = function () {
|
|
this.timer ||
|
|
((this.autoLevelCapping = Number.POSITIVE_INFINITY),
|
|
(this.hls.firstLevel = this.getMaxLevel(this.firstLevel)),
|
|
self.clearInterval(this.timer),
|
|
(this.timer = self.setInterval(
|
|
this.detectPlayerSize.bind(this),
|
|
1e3
|
|
)),
|
|
this.detectPlayerSize());
|
|
}),
|
|
(e.stopCapping = function () {
|
|
(this.restrictedLevels = []),
|
|
(this.firstLevel = -1),
|
|
(this.autoLevelCapping = Number.POSITIVE_INFINITY),
|
|
this.timer &&
|
|
(self.clearInterval(this.timer), (this.timer = void 0));
|
|
}),
|
|
(e.getDimensions = function () {
|
|
if (this.clientRect) return this.clientRect;
|
|
var t = this.media,
|
|
e = { width: 0, height: 0 };
|
|
if (t) {
|
|
var r = t.getBoundingClientRect();
|
|
(e.width = r.width),
|
|
(e.height = r.height),
|
|
e.width ||
|
|
e.height ||
|
|
((e.width = r.right - r.left || t.width || 0),
|
|
(e.height = r.bottom - r.top || t.height || 0));
|
|
}
|
|
return (this.clientRect = e), e;
|
|
}),
|
|
(e.isLevelAllowed = function (t) {
|
|
return !this.restrictedLevels.some(function (e) {
|
|
return (
|
|
t.bitrate === e.bitrate &&
|
|
t.width === e.width &&
|
|
t.height === e.height
|
|
);
|
|
});
|
|
}),
|
|
(t.getMaxLevelByMediaSize = function (t, e, r) {
|
|
if (null == t || !t.length) return -1;
|
|
for (var i, n, a = t.length - 1, s = 0; s < t.length; s += 1) {
|
|
var o = t[s];
|
|
if (
|
|
(o.width >= e || o.height >= r) &&
|
|
((i = o),
|
|
!(n = t[s + 1]) ||
|
|
i.width !== n.width ||
|
|
i.height !== n.height)
|
|
) {
|
|
a = s;
|
|
break;
|
|
}
|
|
}
|
|
return a;
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "mediaWidth",
|
|
get: function () {
|
|
return this.getDimensions().width * this.contentScaleFactor;
|
|
},
|
|
},
|
|
{
|
|
key: "mediaHeight",
|
|
get: function () {
|
|
return this.getDimensions().height * this.contentScaleFactor;
|
|
},
|
|
},
|
|
{
|
|
key: "contentScaleFactor",
|
|
get: function () {
|
|
var t = 1;
|
|
if (!this.hls.config.ignoreDevicePixelRatio)
|
|
try {
|
|
t = self.devicePixelRatio;
|
|
} catch (t) {}
|
|
return t;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})(),
|
|
Aa = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.isVideoPlaybackQualityAvailable = !1),
|
|
(this.timer = void 0),
|
|
(this.media = null),
|
|
(this.lastTime = void 0),
|
|
(this.lastDroppedFrames = 0),
|
|
(this.lastDecodedFrames = 0),
|
|
(this.streamController = void 0),
|
|
(this.hls = t),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.setStreamController = function (t) {
|
|
this.streamController = t;
|
|
}),
|
|
(e.registerListeners = function () {
|
|
this.hls.on(S.MEDIA_ATTACHING, this.onMediaAttaching, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
this.hls.off(S.MEDIA_ATTACHING, this.onMediaAttaching, this);
|
|
}),
|
|
(e.destroy = function () {
|
|
this.timer && clearInterval(this.timer),
|
|
this.unregisterListeners(),
|
|
(this.isVideoPlaybackQualityAvailable = !1),
|
|
(this.media = null);
|
|
}),
|
|
(e.onMediaAttaching = function (t, e) {
|
|
var r = this.hls.config;
|
|
if (r.capLevelOnFPSDrop) {
|
|
var i =
|
|
e.media instanceof self.HTMLVideoElement ? e.media : null;
|
|
(this.media = i),
|
|
i &&
|
|
"function" == typeof i.getVideoPlaybackQuality &&
|
|
(this.isVideoPlaybackQualityAvailable = !0),
|
|
self.clearInterval(this.timer),
|
|
(this.timer = self.setInterval(
|
|
this.checkFPSInterval.bind(this),
|
|
r.fpsDroppedMonitoringPeriod
|
|
));
|
|
}
|
|
}),
|
|
(e.checkFPS = function (t, e, r) {
|
|
var i = performance.now();
|
|
if (e) {
|
|
if (this.lastTime) {
|
|
var n = i - this.lastTime,
|
|
a = r - this.lastDroppedFrames,
|
|
s = e - this.lastDecodedFrames,
|
|
o = (1e3 * a) / n,
|
|
l = this.hls;
|
|
if (
|
|
(l.trigger(S.FPS_DROP, {
|
|
currentDropped: a,
|
|
currentDecoded: s,
|
|
totalDroppedFrames: r,
|
|
}),
|
|
o > 0 && a > l.config.fpsDroppedMonitoringThreshold * s)
|
|
) {
|
|
var u = l.currentLevel;
|
|
w.warn(
|
|
"drop FPS ratio greater than max allowed value for currentLevel: " +
|
|
u
|
|
),
|
|
u > 0 &&
|
|
(-1 === l.autoLevelCapping ||
|
|
l.autoLevelCapping >= u) &&
|
|
((u -= 1),
|
|
l.trigger(S.FPS_DROP_LEVEL_CAPPING, {
|
|
level: u,
|
|
droppedLevel: l.currentLevel,
|
|
}),
|
|
(l.autoLevelCapping = u),
|
|
this.streamController.nextLevelSwitch());
|
|
}
|
|
}
|
|
(this.lastTime = i),
|
|
(this.lastDroppedFrames = r),
|
|
(this.lastDecodedFrames = e);
|
|
}
|
|
}),
|
|
(e.checkFPSInterval = function () {
|
|
var t = this.media;
|
|
if (t)
|
|
if (this.isVideoPlaybackQualityAvailable) {
|
|
var e = t.getVideoPlaybackQuality();
|
|
this.checkFPS(t, e.totalVideoFrames, e.droppedVideoFrames);
|
|
} else
|
|
this.checkFPS(
|
|
t,
|
|
t.webkitDecodedFrameCount,
|
|
t.webkitDroppedFrameCount
|
|
);
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
ka = "[eme]",
|
|
ba = (function () {
|
|
function t(e) {
|
|
(this.hls = void 0),
|
|
(this.config = void 0),
|
|
(this.media = null),
|
|
(this.keyFormatPromise = null),
|
|
(this.keySystemAccessPromises = {}),
|
|
(this._requestLicenseFailureCount = 0),
|
|
(this.mediaKeySessions = []),
|
|
(this.keyIdToKeySessionPromise = {}),
|
|
(this.setMediaKeysQueue = t.CDMCleanupPromise
|
|
? [t.CDMCleanupPromise]
|
|
: []),
|
|
(this.onMediaEncrypted = this._onMediaEncrypted.bind(this)),
|
|
(this.onWaitingForKey = this._onWaitingForKey.bind(this)),
|
|
(this.debug = w.debug.bind(w, ka)),
|
|
(this.log = w.log.bind(w, ka)),
|
|
(this.warn = w.warn.bind(w, ka)),
|
|
(this.error = w.error.bind(w, ka)),
|
|
(this.hls = e),
|
|
(this.config = e.config),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(), this.onMediaDetached();
|
|
var t = this.config;
|
|
(t.requestMediaKeySystemAccessFunc = null),
|
|
(t.licenseXhrSetup = t.licenseResponseCallback = void 0),
|
|
(t.drmSystems = t.drmSystemOptions = {}),
|
|
(this.hls =
|
|
this.onMediaEncrypted =
|
|
this.onWaitingForKey =
|
|
this.keyIdToKeySessionPromise =
|
|
null),
|
|
(this.config = null);
|
|
}),
|
|
(e.registerListeners = function () {
|
|
this.hls.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
this.hls.on(S.MEDIA_DETACHED, this.onMediaDetached, this),
|
|
this.hls.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
this.hls.on(S.MANIFEST_LOADED, this.onManifestLoaded, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
this.hls.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
this.hls.off(S.MEDIA_DETACHED, this.onMediaDetached, this),
|
|
this.hls.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
this.hls.off(S.MANIFEST_LOADED, this.onManifestLoaded, this);
|
|
}),
|
|
(e.getLicenseServerUrl = function (t) {
|
|
var e = this.config,
|
|
r = e.drmSystems,
|
|
i = e.widevineLicenseUrl,
|
|
n = r[t];
|
|
if (n) return n.licenseUrl;
|
|
if (t === j.WIDEVINE && i) return i;
|
|
throw new Error(
|
|
'no license server URL configured for key-system "' + t + '"'
|
|
);
|
|
}),
|
|
(e.getServerCertificateUrl = function (t) {
|
|
var e = this.config.drmSystems[t];
|
|
if (e) return e.serverCertificateUrl;
|
|
this.log(
|
|
'No Server Certificate in config.drmSystems["' + t + '"]'
|
|
);
|
|
}),
|
|
(e.attemptKeySystemAccess = function (t) {
|
|
var e = this,
|
|
r = this.hls.levels,
|
|
i = function (t, e, r) {
|
|
return !!t && r.indexOf(t) === e;
|
|
},
|
|
n = r
|
|
.map(function (t) {
|
|
return t.audioCodec;
|
|
})
|
|
.filter(i),
|
|
a = r
|
|
.map(function (t) {
|
|
return t.videoCodec;
|
|
})
|
|
.filter(i);
|
|
return (
|
|
n.length + a.length === 0 && a.push("avc1.42e01e"),
|
|
new Promise(function (r, i) {
|
|
!(function t(s) {
|
|
var o = s.shift();
|
|
e.getMediaKeysPromise(o, n, a)
|
|
.then(function (t) {
|
|
return r({ keySystem: o, mediaKeys: t });
|
|
})
|
|
.catch(function (e) {
|
|
s.length
|
|
? t(s)
|
|
: i(
|
|
e instanceof Da
|
|
? e
|
|
: new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_NO_ACCESS,
|
|
error: e,
|
|
fatal: !0,
|
|
},
|
|
e.message
|
|
)
|
|
);
|
|
});
|
|
})(t);
|
|
})
|
|
);
|
|
}),
|
|
(e.requestMediaKeySystemAccess = function (t, e) {
|
|
var r = this.config.requestMediaKeySystemAccessFunc;
|
|
if ("function" != typeof r) {
|
|
var i =
|
|
"Configured requestMediaKeySystemAccess is not a function " +
|
|
r;
|
|
return (
|
|
null === et &&
|
|
"http:" === self.location.protocol &&
|
|
(i =
|
|
"navigator.requestMediaKeySystemAccess is not available over insecure protocol " +
|
|
location.protocol),
|
|
Promise.reject(new Error(i))
|
|
);
|
|
}
|
|
return r(t, e);
|
|
}),
|
|
(e.getMediaKeysPromise = function (t, e, r) {
|
|
var i = this,
|
|
n = (function (t, e, r, i) {
|
|
var n;
|
|
switch (t) {
|
|
case j.FAIRPLAY:
|
|
n = ["cenc", "sinf"];
|
|
break;
|
|
case j.WIDEVINE:
|
|
case j.PLAYREADY:
|
|
n = ["cenc"];
|
|
break;
|
|
case j.CLEARKEY:
|
|
n = ["cenc", "keyids"];
|
|
break;
|
|
default:
|
|
throw new Error("Unknown key-system: " + t);
|
|
}
|
|
return (function (t, e, r, i) {
|
|
return [
|
|
{
|
|
initDataTypes: t,
|
|
persistentState: i.persistentState || "not-allowed",
|
|
distinctiveIdentifier:
|
|
i.distinctiveIdentifier || "not-allowed",
|
|
sessionTypes: i.sessionTypes || [
|
|
i.sessionType || "temporary",
|
|
],
|
|
audioCapabilities: e.map(function (t) {
|
|
return {
|
|
contentType: 'audio/mp4; codecs="' + t + '"',
|
|
robustness: i.audioRobustness || "",
|
|
encryptionScheme: i.audioEncryptionScheme || null,
|
|
};
|
|
}),
|
|
videoCapabilities: r.map(function (t) {
|
|
return {
|
|
contentType: 'video/mp4; codecs="' + t + '"',
|
|
robustness: i.videoRobustness || "",
|
|
encryptionScheme: i.videoEncryptionScheme || null,
|
|
};
|
|
}),
|
|
},
|
|
];
|
|
})(n, e, r, i);
|
|
})(t, e, r, this.config.drmSystemOptions),
|
|
a = this.keySystemAccessPromises[t],
|
|
s = null == a ? void 0 : a.keySystemAccess;
|
|
if (!s) {
|
|
this.log(
|
|
'Requesting encrypted media "' +
|
|
t +
|
|
'" key-system access with config: ' +
|
|
JSON.stringify(n)
|
|
),
|
|
(s = this.requestMediaKeySystemAccess(t, n));
|
|
var o = (this.keySystemAccessPromises[t] = {
|
|
keySystemAccess: s,
|
|
});
|
|
return (
|
|
s.catch(function (e) {
|
|
i.log(
|
|
'Failed to obtain access to key-system "' + t + '": ' + e
|
|
);
|
|
}),
|
|
s.then(function (e) {
|
|
i.log(
|
|
'Access for key-system "' + e.keySystem + '" obtained'
|
|
);
|
|
var r = i.fetchServerCertificate(t);
|
|
return (
|
|
i.log('Create media-keys for "' + t + '"'),
|
|
(o.mediaKeys = e.createMediaKeys().then(function (e) {
|
|
return (
|
|
i.log('Media-keys created for "' + t + '"'),
|
|
r.then(function (r) {
|
|
return r
|
|
? i.setMediaKeysServerCertificate(e, t, r)
|
|
: e;
|
|
})
|
|
);
|
|
})),
|
|
o.mediaKeys.catch(function (e) {
|
|
i.error(
|
|
'Failed to create media-keys for "' + t + '"}: ' + e
|
|
);
|
|
}),
|
|
o.mediaKeys
|
|
);
|
|
})
|
|
);
|
|
}
|
|
return s.then(function () {
|
|
return a.mediaKeys;
|
|
});
|
|
}),
|
|
(e.createMediaKeySessionContext = function (t) {
|
|
var e = t.decryptdata,
|
|
r = t.keySystem,
|
|
i = t.mediaKeys;
|
|
this.log(
|
|
'Creating key-system session "' +
|
|
r +
|
|
'" keyId: ' +
|
|
Tt(e.keyId || [])
|
|
);
|
|
var n = i.createSession(),
|
|
a = {
|
|
decryptdata: e,
|
|
keySystem: r,
|
|
mediaKeys: i,
|
|
mediaKeysSession: n,
|
|
keyStatus: "status-pending",
|
|
};
|
|
return this.mediaKeySessions.push(a), a;
|
|
}),
|
|
(e.renewKeySession = function (t) {
|
|
var e = t.decryptdata;
|
|
if (e.pssh) {
|
|
var r = this.createMediaKeySessionContext(t),
|
|
i = this.getKeyIdString(e);
|
|
this.keyIdToKeySessionPromise[i] =
|
|
this.generateRequestWithPreferredKeySession(
|
|
r,
|
|
"cenc",
|
|
e.pssh,
|
|
"expired"
|
|
);
|
|
} else
|
|
this.warn(
|
|
"Could not renew expired session. Missing pssh initData."
|
|
);
|
|
this.removeSession(t);
|
|
}),
|
|
(e.getKeyIdString = function (t) {
|
|
if (!t)
|
|
throw new Error(
|
|
"Could not read keyId of undefined decryptdata"
|
|
);
|
|
if (null === t.keyId) throw new Error("keyId is null");
|
|
return Tt(t.keyId);
|
|
}),
|
|
(e.updateKeySession = function (t, e) {
|
|
var r,
|
|
i = t.mediaKeysSession;
|
|
return (
|
|
this.log(
|
|
'Updating key-session "' +
|
|
i.sessionId +
|
|
'" for keyID ' +
|
|
Tt((null == (r = t.decryptdata) ? void 0 : r.keyId) || []) +
|
|
"\n } (data length: " +
|
|
(e ? e.byteLength : e) +
|
|
")"
|
|
),
|
|
i.update(e)
|
|
);
|
|
}),
|
|
(e.selectKeySystemFormat = function (t) {
|
|
var e = Object.keys(t.levelkeys || {});
|
|
return (
|
|
this.keyFormatPromise ||
|
|
(this.log(
|
|
"Selecting key-system from fragment (sn: " +
|
|
t.sn +
|
|
" " +
|
|
t.type +
|
|
": " +
|
|
t.level +
|
|
") key formats " +
|
|
e.join(", ")
|
|
),
|
|
(this.keyFormatPromise = this.getKeyFormatPromise(e))),
|
|
this.keyFormatPromise
|
|
);
|
|
}),
|
|
(e.getKeyFormatPromise = function (t) {
|
|
var e = this;
|
|
return new Promise(function (r, i) {
|
|
var n = tt(e.config),
|
|
a = t.map($).filter(function (t) {
|
|
return !!t && -1 !== n.indexOf(t);
|
|
});
|
|
return e
|
|
.getKeySystemSelectionPromise(a)
|
|
.then(function (t) {
|
|
var e = t.keySystem,
|
|
n = Z(e);
|
|
n
|
|
? r(n)
|
|
: i(
|
|
new Error(
|
|
'Unable to find format for key-system "' + e + '"'
|
|
)
|
|
);
|
|
})
|
|
.catch(i);
|
|
});
|
|
}),
|
|
(e.loadKey = function (t) {
|
|
var e = this,
|
|
r = t.keyInfo.decryptdata,
|
|
i = this.getKeyIdString(r),
|
|
n =
|
|
"(keyId: " +
|
|
i +
|
|
' format: "' +
|
|
r.keyFormat +
|
|
'" method: ' +
|
|
r.method +
|
|
" uri: " +
|
|
r.uri +
|
|
")";
|
|
this.log("Starting session for key " + n);
|
|
var a = this.keyIdToKeySessionPromise[i];
|
|
return (
|
|
a ||
|
|
(a = this.keyIdToKeySessionPromise[i] =
|
|
this.getKeySystemForKeyPromise(r).then(function (i) {
|
|
var a = i.keySystem,
|
|
s = i.mediaKeys;
|
|
return (
|
|
e.throwIfDestroyed(),
|
|
e.log(
|
|
"Handle encrypted media sn: " +
|
|
t.frag.sn +
|
|
" " +
|
|
t.frag.type +
|
|
": " +
|
|
t.frag.level +
|
|
" using key " +
|
|
n
|
|
),
|
|
e.attemptSetMediaKeys(a, s).then(function () {
|
|
e.throwIfDestroyed();
|
|
var t = e.createMediaKeySessionContext({
|
|
keySystem: a,
|
|
mediaKeys: s,
|
|
decryptdata: r,
|
|
});
|
|
return e.generateRequestWithPreferredKeySession(
|
|
t,
|
|
"cenc",
|
|
r.pssh,
|
|
"playlist-key"
|
|
);
|
|
})
|
|
);
|
|
})).catch(function (t) {
|
|
return e.handleError(t);
|
|
}),
|
|
a
|
|
);
|
|
}),
|
|
(e.throwIfDestroyed = function (t) {
|
|
if (!this.hls) throw new Error("invalid state");
|
|
}),
|
|
(e.handleError = function (t) {
|
|
this.hls &&
|
|
(this.error(t.message),
|
|
t instanceof Da
|
|
? this.hls.trigger(S.ERROR, t.data)
|
|
: this.hls.trigger(S.ERROR, {
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_NO_KEYS,
|
|
error: t,
|
|
fatal: !0,
|
|
}));
|
|
}),
|
|
(e.getKeySystemForKeyPromise = function (t) {
|
|
var e = this.getKeyIdString(t),
|
|
r = this.keyIdToKeySessionPromise[e];
|
|
if (!r) {
|
|
var i = $(t.keyFormat),
|
|
n = i ? [i] : tt(this.config);
|
|
return this.attemptKeySystemAccess(n);
|
|
}
|
|
return r;
|
|
}),
|
|
(e.getKeySystemSelectionPromise = function (t) {
|
|
if ((t.length || (t = tt(this.config)), 0 === t.length))
|
|
throw new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_NO_CONFIGURED_LICENSE,
|
|
fatal: !0,
|
|
},
|
|
"Missing key-system license configuration options " +
|
|
JSON.stringify({ drmSystems: this.config.drmSystems })
|
|
);
|
|
return this.attemptKeySystemAccess(t);
|
|
}),
|
|
(e._onMediaEncrypted = function (t) {
|
|
var e = this,
|
|
r = t.initDataType,
|
|
i = t.initData;
|
|
if (
|
|
(this.debug(
|
|
'"' + t.type + '" event: init data type: "' + r + '"'
|
|
),
|
|
null !== i)
|
|
) {
|
|
var n, a;
|
|
if ("sinf" === r && this.config.drmSystems[j.FAIRPLAY]) {
|
|
var s = Rt(new Uint8Array(i));
|
|
try {
|
|
var o = V(JSON.parse(s).sinf),
|
|
l = _t(new Uint8Array(o));
|
|
if (!l) return;
|
|
(n = l.subarray(8, 24)), (a = j.FAIRPLAY);
|
|
} catch (t) {
|
|
return void this.warn(
|
|
'Failed to parse sinf "encrypted" event message initData'
|
|
);
|
|
}
|
|
} else {
|
|
var u = (function (t) {
|
|
if (!(t instanceof ArrayBuffer) || t.byteLength < 32)
|
|
return null;
|
|
var e = {
|
|
version: 0,
|
|
systemId: "",
|
|
kids: null,
|
|
data: null,
|
|
},
|
|
r = new DataView(t),
|
|
i = r.getUint32(0);
|
|
if (t.byteLength !== i && i > 44) return null;
|
|
if (1886614376 !== r.getUint32(4)) return null;
|
|
if (((e.version = r.getUint32(8) >>> 24), e.version > 1))
|
|
return null;
|
|
e.systemId = Tt(new Uint8Array(t, 12, 16));
|
|
var n = r.getUint32(28);
|
|
if (0 === e.version) {
|
|
if (i - 32 < n) return null;
|
|
e.data = new Uint8Array(t, 32, n);
|
|
} else if (1 === e.version) {
|
|
e.kids = [];
|
|
for (var a = 0; a < n; a++)
|
|
e.kids.push(new Uint8Array(t, 32 + 16 * a, 16));
|
|
}
|
|
return e;
|
|
})(i);
|
|
if (null === u) return;
|
|
0 === u.version &&
|
|
u.systemId === J &&
|
|
u.data &&
|
|
(n = u.data.subarray(8, 24)),
|
|
(a = (function (t) {
|
|
if (t === J) return j.WIDEVINE;
|
|
})(u.systemId));
|
|
}
|
|
if (a && n) {
|
|
for (
|
|
var h = Tt(n),
|
|
d = this.keyIdToKeySessionPromise,
|
|
c = this.mediaKeySessions,
|
|
f = d[h],
|
|
g = function () {
|
|
var t = c[v],
|
|
a = t.decryptdata;
|
|
if (a.pssh || !a.keyId) return "continue";
|
|
var s = Tt(a.keyId);
|
|
return h === s ||
|
|
-1 !== a.uri.replace(/-/g, "").indexOf(h)
|
|
? ((f = d[s]),
|
|
delete d[s],
|
|
(a.pssh = new Uint8Array(i)),
|
|
(a.keyId = n),
|
|
(f = d[h] =
|
|
f.then(function () {
|
|
return e.generateRequestWithPreferredKeySession(
|
|
t,
|
|
r,
|
|
i,
|
|
"encrypted-event-key-match"
|
|
);
|
|
})),
|
|
"break")
|
|
: void 0;
|
|
},
|
|
v = 0;
|
|
v < c.length;
|
|
v++
|
|
) {
|
|
var m = g();
|
|
if ("continue" !== m && "break" === m) break;
|
|
}
|
|
f ||
|
|
(f = d[h] =
|
|
this.getKeySystemSelectionPromise([a]).then(function (t) {
|
|
var a,
|
|
s = t.keySystem,
|
|
o = t.mediaKeys;
|
|
e.throwIfDestroyed();
|
|
var l = new Gt(
|
|
"ISO-23001-7",
|
|
h,
|
|
null != (a = Z(s)) ? a : ""
|
|
);
|
|
return (
|
|
(l.pssh = new Uint8Array(i)),
|
|
(l.keyId = n),
|
|
e.attemptSetMediaKeys(s, o).then(function () {
|
|
e.throwIfDestroyed();
|
|
var t = e.createMediaKeySessionContext({
|
|
decryptdata: l,
|
|
keySystem: s,
|
|
mediaKeys: o,
|
|
});
|
|
return e.generateRequestWithPreferredKeySession(
|
|
t,
|
|
r,
|
|
i,
|
|
"encrypted-event-no-match"
|
|
);
|
|
})
|
|
);
|
|
})),
|
|
f.catch(function (t) {
|
|
return e.handleError(t);
|
|
});
|
|
}
|
|
}
|
|
}),
|
|
(e._onWaitingForKey = function (t) {
|
|
this.log('"' + t.type + '" event');
|
|
}),
|
|
(e.attemptSetMediaKeys = function (t, e) {
|
|
var r = this,
|
|
i = this.setMediaKeysQueue.slice();
|
|
this.log('Setting media-keys for "' + t + '"');
|
|
var n = Promise.all(i).then(function () {
|
|
if (!r.media)
|
|
throw new Error(
|
|
"Attempted to set mediaKeys without media element attached"
|
|
);
|
|
return r.media.setMediaKeys(e);
|
|
});
|
|
return (
|
|
this.setMediaKeysQueue.push(n),
|
|
n.then(function () {
|
|
r.log('Media-keys set for "' + t + '"'),
|
|
i.push(n),
|
|
(r.setMediaKeysQueue = r.setMediaKeysQueue.filter(function (
|
|
t
|
|
) {
|
|
return -1 === i.indexOf(t);
|
|
}));
|
|
})
|
|
);
|
|
}),
|
|
(e.generateRequestWithPreferredKeySession = function (t, e, r, i) {
|
|
var n,
|
|
a,
|
|
s = this,
|
|
o =
|
|
null == (n = this.config.drmSystems) ||
|
|
null == (a = n[t.keySystem])
|
|
? void 0
|
|
: a.generateRequest;
|
|
if (o)
|
|
try {
|
|
var l = o.call(this.hls, e, r, t);
|
|
if (!l)
|
|
throw new Error(
|
|
"Invalid response from configured generateRequest filter"
|
|
);
|
|
(e = l.initDataType),
|
|
(r = t.decryptdata.pssh =
|
|
l.initData ? new Uint8Array(l.initData) : null);
|
|
} catch (t) {
|
|
var u;
|
|
if (
|
|
(this.warn(t.message),
|
|
null != (u = this.hls) && u.config.debug)
|
|
)
|
|
throw t;
|
|
}
|
|
if (null === r)
|
|
return (
|
|
this.log(
|
|
'Skipping key-session request for "' + i + '" (no initData)'
|
|
),
|
|
Promise.resolve(t)
|
|
);
|
|
var h = this.getKeyIdString(t.decryptdata);
|
|
this.log(
|
|
'Generating key-session request for "' +
|
|
i +
|
|
'": ' +
|
|
h +
|
|
" (init data type: " +
|
|
e +
|
|
" length: " +
|
|
(r ? r.byteLength : null) +
|
|
")"
|
|
);
|
|
var d = new an();
|
|
(t.mediaKeysSession.onmessage = function (e) {
|
|
var r = t.mediaKeysSession;
|
|
if (r) {
|
|
var i = e.messageType,
|
|
n = e.message;
|
|
s.log(
|
|
'"' +
|
|
i +
|
|
'" message event for session "' +
|
|
r.sessionId +
|
|
'" message size: ' +
|
|
n.byteLength
|
|
),
|
|
"license-request" === i || "license-renewal" === i
|
|
? s.renewLicense(t, n).catch(function (t) {
|
|
s.handleError(t), d.emit("error", t);
|
|
})
|
|
: "license-release" === i
|
|
? t.keySystem === j.FAIRPLAY &&
|
|
(s.updateKeySession(t, W("acknowledged")),
|
|
s.removeSession(t))
|
|
: s.warn('unhandled media key message type "' + i + '"');
|
|
} else d.emit("error", new Error("invalid state"));
|
|
}),
|
|
(t.mediaKeysSession.onkeystatuseschange = function (e) {
|
|
if (t.mediaKeysSession) {
|
|
s.onKeyStatusChange(t);
|
|
var r = t.keyStatus;
|
|
d.emit("keyStatus", r),
|
|
"expired" === r &&
|
|
(s.warn(t.keySystem + " expired for key " + h),
|
|
s.renewKeySession(t));
|
|
} else d.emit("error", new Error("invalid state"));
|
|
});
|
|
var c = new Promise(function (t, e) {
|
|
d.on("error", e),
|
|
d.on("keyStatus", function (r) {
|
|
r.startsWith("usable")
|
|
? t()
|
|
: "output-restricted" === r
|
|
? e(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED,
|
|
fatal: !1,
|
|
},
|
|
"HDCP level output restricted"
|
|
)
|
|
)
|
|
: "internal-error" === r
|
|
? e(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_STATUS_INTERNAL_ERROR,
|
|
fatal: !0,
|
|
},
|
|
'key status changed to "' + r + '"'
|
|
)
|
|
)
|
|
: "expired" === r
|
|
? e(new Error("key expired while generating request"))
|
|
: s.warn('unhandled key status change "' + r + '"');
|
|
});
|
|
});
|
|
return t.mediaKeysSession
|
|
.generateRequest(e, r)
|
|
.then(function () {
|
|
var e;
|
|
s.log(
|
|
'Request generated for key-session "' +
|
|
(null == (e = t.mediaKeysSession)
|
|
? void 0
|
|
: e.sessionId) +
|
|
'" keyId: ' +
|
|
h
|
|
);
|
|
})
|
|
.catch(function (t) {
|
|
throw new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_NO_SESSION,
|
|
error: t,
|
|
fatal: !1,
|
|
},
|
|
"Error generating key-session request: " + t
|
|
);
|
|
})
|
|
.then(function () {
|
|
return c;
|
|
})
|
|
.catch(function (e) {
|
|
throw (d.removeAllListeners(), s.removeSession(t), e);
|
|
})
|
|
.then(function () {
|
|
return d.removeAllListeners(), t;
|
|
});
|
|
}),
|
|
(e.onKeyStatusChange = function (t) {
|
|
var e = this;
|
|
t.mediaKeysSession.keyStatuses.forEach(function (r, i) {
|
|
e.log(
|
|
'key status change "' +
|
|
r +
|
|
'" for keyStatuses keyId: ' +
|
|
Tt(
|
|
"buffer" in i
|
|
? new Uint8Array(i.buffer, i.byteOffset, i.byteLength)
|
|
: new Uint8Array(i)
|
|
) +
|
|
" session keyId: " +
|
|
Tt(new Uint8Array(t.decryptdata.keyId || [])) +
|
|
" uri: " +
|
|
t.decryptdata.uri
|
|
),
|
|
(t.keyStatus = r);
|
|
});
|
|
}),
|
|
(e.fetchServerCertificate = function (t) {
|
|
var e = this.config,
|
|
r = new (0, e.loader)(e),
|
|
n = this.getServerCertificateUrl(t);
|
|
return n
|
|
? (this.log('Fetching serverCertificate for "' + t + '"'),
|
|
new Promise(function (a, s) {
|
|
var o = { responseType: "arraybuffer", url: n },
|
|
l = e.certLoadPolicy.default,
|
|
u = {
|
|
loadPolicy: l,
|
|
timeout: l.maxLoadTimeMs,
|
|
maxRetry: 0,
|
|
retryDelay: 0,
|
|
maxRetryDelay: 0,
|
|
},
|
|
h = {
|
|
onSuccess: function (t, e, r, i) {
|
|
a(t.data);
|
|
},
|
|
onError: function (e, r, a, l) {
|
|
s(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details:
|
|
R.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,
|
|
fatal: !0,
|
|
networkDetails: a,
|
|
response: i({ url: o.url, data: void 0 }, e),
|
|
},
|
|
'"' +
|
|
t +
|
|
'" certificate request failed (' +
|
|
n +
|
|
"). Status: " +
|
|
e.code +
|
|
" (" +
|
|
e.text +
|
|
")"
|
|
)
|
|
);
|
|
},
|
|
onTimeout: function (e, r, i) {
|
|
s(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details:
|
|
R.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,
|
|
fatal: !0,
|
|
networkDetails: i,
|
|
response: { url: o.url, data: void 0 },
|
|
},
|
|
'"' +
|
|
t +
|
|
'" certificate request timed out (' +
|
|
n +
|
|
")"
|
|
)
|
|
);
|
|
},
|
|
onAbort: function (t, e, r) {
|
|
s(new Error("aborted"));
|
|
},
|
|
};
|
|
r.load(o, u, h);
|
|
}))
|
|
: Promise.resolve();
|
|
}),
|
|
(e.setMediaKeysServerCertificate = function (t, e, r) {
|
|
var i = this;
|
|
return new Promise(function (n, a) {
|
|
t.setServerCertificate(r)
|
|
.then(function (a) {
|
|
i.log(
|
|
"setServerCertificate " +
|
|
(a ? "success" : "not supported by CDM") +
|
|
" (" +
|
|
(null == r ? void 0 : r.byteLength) +
|
|
') on "' +
|
|
e +
|
|
'"'
|
|
),
|
|
n(t);
|
|
})
|
|
.catch(function (t) {
|
|
a(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details:
|
|
R.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,
|
|
error: t,
|
|
fatal: !0,
|
|
},
|
|
t.message
|
|
)
|
|
);
|
|
});
|
|
});
|
|
}),
|
|
(e.renewLicense = function (t, e) {
|
|
var r = this;
|
|
return this.requestLicense(t, new Uint8Array(e)).then(function (
|
|
e
|
|
) {
|
|
return r
|
|
.updateKeySession(t, new Uint8Array(e))
|
|
.catch(function (t) {
|
|
throw new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_SESSION_UPDATE_FAILED,
|
|
error: t,
|
|
fatal: !0,
|
|
},
|
|
t.message
|
|
);
|
|
});
|
|
});
|
|
}),
|
|
(e.setupLicenseXHR = function (t, e, r, i) {
|
|
var n = this,
|
|
a = this.config.licenseXhrSetup;
|
|
return a
|
|
? Promise.resolve()
|
|
.then(function () {
|
|
if (!r.decryptdata) throw new Error("Key removed");
|
|
return a.call(n.hls, t, e, r, i);
|
|
})
|
|
.catch(function (s) {
|
|
if (!r.decryptdata) throw s;
|
|
return t.open("POST", e, !0), a.call(n.hls, t, e, r, i);
|
|
})
|
|
.then(function (r) {
|
|
return (
|
|
t.readyState || t.open("POST", e, !0),
|
|
{ xhr: t, licenseChallenge: r || i }
|
|
);
|
|
})
|
|
: (t.open("POST", e, !0),
|
|
Promise.resolve({ xhr: t, licenseChallenge: i }));
|
|
}),
|
|
(e.requestLicense = function (t, e) {
|
|
var r = this,
|
|
i = this.config.keyLoadPolicy.default;
|
|
return new Promise(function (n, a) {
|
|
var s = r.getLicenseServerUrl(t.keySystem);
|
|
r.log("Sending license request to URL: " + s);
|
|
var o = new XMLHttpRequest();
|
|
(o.responseType = "arraybuffer"),
|
|
(o.onreadystatechange = function () {
|
|
if (!r.hls || !t.mediaKeysSession)
|
|
return a(new Error("invalid state"));
|
|
if (4 === o.readyState)
|
|
if (200 === o.status) {
|
|
r._requestLicenseFailureCount = 0;
|
|
var l = o.response;
|
|
r.log(
|
|
"License received " +
|
|
(l instanceof ArrayBuffer ? l.byteLength : l)
|
|
);
|
|
var u = r.config.licenseResponseCallback;
|
|
if (u)
|
|
try {
|
|
l = u.call(r.hls, o, s, t);
|
|
} catch (t) {
|
|
r.error(t);
|
|
}
|
|
n(l);
|
|
} else {
|
|
var h = i.errorRetry,
|
|
d = h ? h.maxNumRetry : 0;
|
|
if (
|
|
(r._requestLicenseFailureCount++,
|
|
r._requestLicenseFailureCount > d ||
|
|
(o.status >= 400 && o.status < 500))
|
|
)
|
|
a(
|
|
new Da(
|
|
{
|
|
type: L.KEY_SYSTEM_ERROR,
|
|
details: R.KEY_SYSTEM_LICENSE_REQUEST_FAILED,
|
|
fatal: !0,
|
|
networkDetails: o,
|
|
response: {
|
|
url: s,
|
|
data: void 0,
|
|
code: o.status,
|
|
text: o.statusText,
|
|
},
|
|
},
|
|
"License Request XHR failed (" +
|
|
s +
|
|
"). Status: " +
|
|
o.status +
|
|
" (" +
|
|
o.statusText +
|
|
")"
|
|
)
|
|
);
|
|
else {
|
|
var c = d - r._requestLicenseFailureCount + 1;
|
|
r.warn(
|
|
"Retrying license request, " + c + " attempts left"
|
|
),
|
|
r.requestLicense(t, e).then(n, a);
|
|
}
|
|
}
|
|
}),
|
|
t.licenseXhr &&
|
|
t.licenseXhr.readyState !== XMLHttpRequest.DONE &&
|
|
t.licenseXhr.abort(),
|
|
(t.licenseXhr = o),
|
|
r.setupLicenseXHR(o, s, t, e).then(function (t) {
|
|
var e = t.xhr,
|
|
r = t.licenseChallenge;
|
|
e.send(r);
|
|
});
|
|
});
|
|
}),
|
|
(e.onMediaAttached = function (t, e) {
|
|
if (this.config.emeEnabled) {
|
|
var r = e.media;
|
|
(this.media = r),
|
|
r.addEventListener("encrypted", this.onMediaEncrypted),
|
|
r.addEventListener("waitingforkey", this.onWaitingForKey);
|
|
}
|
|
}),
|
|
(e.onMediaDetached = function () {
|
|
var e = this,
|
|
r = this.media,
|
|
i = this.mediaKeySessions;
|
|
r &&
|
|
(r.removeEventListener("encrypted", this.onMediaEncrypted),
|
|
r.removeEventListener("waitingforkey", this.onWaitingForKey),
|
|
(this.media = null)),
|
|
(this._requestLicenseFailureCount = 0),
|
|
(this.setMediaKeysQueue = []),
|
|
(this.mediaKeySessions = []),
|
|
(this.keyIdToKeySessionPromise = {}),
|
|
Gt.clearKeyUriToKeyIdMap();
|
|
var n = i.length;
|
|
t.CDMCleanupPromise = Promise.all(
|
|
i
|
|
.map(function (t) {
|
|
return e.removeSession(t);
|
|
})
|
|
.concat(
|
|
null == r
|
|
? void 0
|
|
: r.setMediaKeys(null).catch(function (t) {
|
|
e.log(
|
|
"Could not clear media keys: " +
|
|
t +
|
|
". media.src: " +
|
|
(null == r ? void 0 : r.src)
|
|
);
|
|
})
|
|
)
|
|
)
|
|
.then(function () {
|
|
n &&
|
|
(e.log(
|
|
"finished closing key sessions and clearing media keys"
|
|
),
|
|
(i.length = 0));
|
|
})
|
|
.catch(function (t) {
|
|
e.log(
|
|
"Could not close sessions and clear media keys: " +
|
|
t +
|
|
". media.src: " +
|
|
(null == r ? void 0 : r.src)
|
|
);
|
|
});
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
this.keyFormatPromise = null;
|
|
}),
|
|
(e.onManifestLoaded = function (t, e) {
|
|
var r = e.sessionKeys;
|
|
if (r && this.config.emeEnabled && !this.keyFormatPromise) {
|
|
var i = r.reduce(function (t, e) {
|
|
return (
|
|
-1 === t.indexOf(e.keyFormat) && t.push(e.keyFormat), t
|
|
);
|
|
}, []);
|
|
this.log(
|
|
"Selecting key-system from session-keys " + i.join(", ")
|
|
),
|
|
(this.keyFormatPromise = this.getKeyFormatPromise(i));
|
|
}
|
|
}),
|
|
(e.removeSession = function (t) {
|
|
var e = this,
|
|
r = t.mediaKeysSession,
|
|
i = t.licenseXhr;
|
|
if (r) {
|
|
this.log(
|
|
"Remove licenses and keys and close session " + r.sessionId
|
|
),
|
|
(r.onmessage = null),
|
|
(r.onkeystatuseschange = null),
|
|
i && i.readyState !== XMLHttpRequest.DONE && i.abort(),
|
|
(t.mediaKeysSession = t.decryptdata = t.licenseXhr = void 0);
|
|
var n = this.mediaKeySessions.indexOf(t);
|
|
return (
|
|
n > -1 && this.mediaKeySessions.splice(n, 1),
|
|
r
|
|
.remove()
|
|
.catch(function (t) {
|
|
e.log("Could not remove session: " + t);
|
|
})
|
|
.then(function () {
|
|
return r.close();
|
|
})
|
|
.catch(function (t) {
|
|
e.log("Could not close session: " + t);
|
|
})
|
|
);
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
ba.CDMCleanupPromise = void 0;
|
|
var Da = (function (t) {
|
|
function e(e, r) {
|
|
var i;
|
|
return (
|
|
((i = t.call(this, r) || this).data = void 0),
|
|
e.error || (e.error = new Error(r)),
|
|
(i.data = e),
|
|
(e.err = e.error),
|
|
i
|
|
);
|
|
}
|
|
return l(e, t), e;
|
|
})(f(Error)),
|
|
Ia = "m",
|
|
wa = "a",
|
|
Ca = "v",
|
|
_a = "av",
|
|
Pa = "i",
|
|
xa = "tt",
|
|
Fa = (function () {
|
|
function t(e) {
|
|
var r = this;
|
|
(this.hls = void 0),
|
|
(this.config = void 0),
|
|
(this.media = void 0),
|
|
(this.sid = void 0),
|
|
(this.cid = void 0),
|
|
(this.useHeaders = !1),
|
|
(this.initialized = !1),
|
|
(this.starved = !1),
|
|
(this.buffering = !0),
|
|
(this.audioBuffer = void 0),
|
|
(this.videoBuffer = void 0),
|
|
(this.onWaiting = function () {
|
|
r.initialized && (r.starved = !0), (r.buffering = !0);
|
|
}),
|
|
(this.onPlaying = function () {
|
|
r.initialized || (r.initialized = !0), (r.buffering = !1);
|
|
}),
|
|
(this.applyPlaylistData = function (t) {
|
|
try {
|
|
r.apply(t, { ot: Ia, su: !r.initialized });
|
|
} catch (t) {
|
|
w.warn("Could not generate manifest CMCD data.", t);
|
|
}
|
|
}),
|
|
(this.applyFragmentData = function (t) {
|
|
try {
|
|
var e = t.frag,
|
|
i = r.hls.levels[e.level],
|
|
n = r.getObjectType(e),
|
|
a = { d: 1e3 * e.duration, ot: n };
|
|
(n !== Ca && n !== wa && n != _a) ||
|
|
((a.br = i.bitrate / 1e3),
|
|
(a.tb = r.getTopBandwidth(n) / 1e3),
|
|
(a.bl = r.getBufferLength(n))),
|
|
r.apply(t, a);
|
|
} catch (t) {
|
|
w.warn("Could not generate segment CMCD data.", t);
|
|
}
|
|
}),
|
|
(this.hls = e);
|
|
var i = (this.config = e.config),
|
|
n = i.cmcd;
|
|
null != n &&
|
|
((i.pLoader = this.createPlaylistLoader()),
|
|
(i.fLoader = this.createFragmentLoader()),
|
|
(this.sid = n.sessionId || t.uuid()),
|
|
(this.cid = n.contentId),
|
|
(this.useHeaders = !0 === n.useHeaders),
|
|
this.registerListeners());
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.on(S.MEDIA_DETACHED, this.onMediaDetached, this),
|
|
t.on(S.BUFFER_CREATED, this.onBufferCreated, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t.off(S.MEDIA_ATTACHED, this.onMediaAttached, this),
|
|
t.off(S.MEDIA_DETACHED, this.onMediaDetached, this),
|
|
t.off(S.BUFFER_CREATED, this.onBufferCreated, this);
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
this.onMediaDetached(),
|
|
(this.hls =
|
|
this.config =
|
|
this.audioBuffer =
|
|
this.videoBuffer =
|
|
null);
|
|
}),
|
|
(e.onMediaAttached = function (t, e) {
|
|
(this.media = e.media),
|
|
this.media.addEventListener("waiting", this.onWaiting),
|
|
this.media.addEventListener("playing", this.onPlaying);
|
|
}),
|
|
(e.onMediaDetached = function () {
|
|
this.media &&
|
|
(this.media.removeEventListener("waiting", this.onWaiting),
|
|
this.media.removeEventListener("playing", this.onPlaying),
|
|
(this.media = null));
|
|
}),
|
|
(e.onBufferCreated = function (t, e) {
|
|
var r, i;
|
|
(this.audioBuffer =
|
|
null == (r = e.tracks.audio) ? void 0 : r.buffer),
|
|
(this.videoBuffer =
|
|
null == (i = e.tracks.video) ? void 0 : i.buffer);
|
|
}),
|
|
(e.createData = function () {
|
|
var t;
|
|
return {
|
|
v: 1,
|
|
sf: "h",
|
|
sid: this.sid,
|
|
cid: this.cid,
|
|
pr: null == (t = this.media) ? void 0 : t.playbackRate,
|
|
mtp: this.hls.bandwidthEstimate / 1e3,
|
|
};
|
|
}),
|
|
(e.apply = function (e, r) {
|
|
void 0 === r && (r = {}), o(r, this.createData());
|
|
var i = r.ot === Pa || r.ot === Ca || r.ot === _a;
|
|
if (
|
|
(this.starved &&
|
|
i &&
|
|
((r.bs = !0), (r.su = !0), (this.starved = !1)),
|
|
null == r.su && (r.su = this.buffering),
|
|
this.useHeaders)
|
|
) {
|
|
var n = t.toHeaders(r);
|
|
if (!Object.keys(n).length) return;
|
|
e.headers || (e.headers = {}), o(e.headers, n);
|
|
} else {
|
|
var a = t.toQuery(r);
|
|
if (!a) return;
|
|
e.url = t.appendQueryToUri(e.url, a);
|
|
}
|
|
}),
|
|
(e.getObjectType = function (t) {
|
|
var e = t.type;
|
|
return "subtitle" === e
|
|
? xa
|
|
: "initSegment" === t.sn
|
|
? Pa
|
|
: "audio" === e
|
|
? wa
|
|
: "main" === e
|
|
? this.hls.audioTracks.length
|
|
? Ca
|
|
: _a
|
|
: void 0;
|
|
}),
|
|
(e.getTopBandwidth = function (t) {
|
|
var e,
|
|
r = 0,
|
|
i = this.hls;
|
|
if (t === wa) e = i.audioTracks;
|
|
else {
|
|
var n = i.maxAutoLevel,
|
|
a = n > -1 ? n + 1 : i.levels.length;
|
|
e = i.levels.slice(0, a);
|
|
}
|
|
for (var s, o = v(e); !(s = o()).done; ) {
|
|
var l = s.value;
|
|
l.bitrate > r && (r = l.bitrate);
|
|
}
|
|
return r > 0 ? r : NaN;
|
|
}),
|
|
(e.getBufferLength = function (t) {
|
|
var e = this.hls.media,
|
|
r = t === wa ? this.audioBuffer : this.videoBuffer;
|
|
return r && e
|
|
? 1e3 *
|
|
Ir.bufferInfo(r, e.currentTime, this.config.maxBufferHole)
|
|
.len
|
|
: NaN;
|
|
}),
|
|
(e.createPlaylistLoader = function () {
|
|
var t = this.config.pLoader,
|
|
e = this.applyPlaylistData,
|
|
r = t || this.config.loader;
|
|
return (function () {
|
|
function t(t) {
|
|
(this.loader = void 0), (this.loader = new r(t));
|
|
}
|
|
var i = t.prototype;
|
|
return (
|
|
(i.destroy = function () {
|
|
this.loader.destroy();
|
|
}),
|
|
(i.abort = function () {
|
|
this.loader.abort();
|
|
}),
|
|
(i.load = function (t, r, i) {
|
|
e(t), this.loader.load(t, r, i);
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "stats",
|
|
get: function () {
|
|
return this.loader.stats;
|
|
},
|
|
},
|
|
{
|
|
key: "context",
|
|
get: function () {
|
|
return this.loader.context;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})();
|
|
}),
|
|
(e.createFragmentLoader = function () {
|
|
var t = this.config.fLoader,
|
|
e = this.applyFragmentData,
|
|
r = t || this.config.loader;
|
|
return (function () {
|
|
function t(t) {
|
|
(this.loader = void 0), (this.loader = new r(t));
|
|
}
|
|
var i = t.prototype;
|
|
return (
|
|
(i.destroy = function () {
|
|
this.loader.destroy();
|
|
}),
|
|
(i.abort = function () {
|
|
this.loader.abort();
|
|
}),
|
|
(i.load = function (t, r, i) {
|
|
e(t), this.loader.load(t, r, i);
|
|
}),
|
|
a(t, [
|
|
{
|
|
key: "stats",
|
|
get: function () {
|
|
return this.loader.stats;
|
|
},
|
|
},
|
|
{
|
|
key: "context",
|
|
get: function () {
|
|
return this.loader.context;
|
|
},
|
|
},
|
|
]),
|
|
t
|
|
);
|
|
})();
|
|
}),
|
|
(t.uuid = function () {
|
|
var t = URL.createObjectURL(new Blob()),
|
|
e = t.toString();
|
|
return URL.revokeObjectURL(t), e.slice(e.lastIndexOf("/") + 1);
|
|
}),
|
|
(t.serialize = function (t) {
|
|
for (
|
|
var e,
|
|
r = [],
|
|
i = function (t) {
|
|
return (
|
|
!Number.isNaN(t) && null != t && "" !== t && !1 !== t
|
|
);
|
|
},
|
|
n = function (t) {
|
|
return Math.round(t);
|
|
},
|
|
a = function (t) {
|
|
return 100 * n(t / 100);
|
|
},
|
|
s = {
|
|
br: n,
|
|
d: n,
|
|
bl: a,
|
|
dl: a,
|
|
mtp: a,
|
|
nor: function (t) {
|
|
return encodeURIComponent(t);
|
|
},
|
|
rtp: a,
|
|
tb: n,
|
|
},
|
|
o = v(Object.keys(t || {}).sort());
|
|
!(e = o()).done;
|
|
|
|
) {
|
|
var l = e.value,
|
|
u = t[l];
|
|
if (
|
|
i(u) &&
|
|
!(("v" === l && 1 === u) || ("pr" == l && 1 === u))
|
|
) {
|
|
var h = s[l];
|
|
h && (u = h(u));
|
|
var d = typeof u,
|
|
c = void 0;
|
|
(c =
|
|
"ot" === l || "sf" === l || "st" === l
|
|
? l + "=" + u
|
|
: "boolean" === d
|
|
? l
|
|
: "number" === d
|
|
? l + "=" + u
|
|
: l + "=" + JSON.stringify(u)),
|
|
r.push(c);
|
|
}
|
|
}
|
|
return r.join(",");
|
|
}),
|
|
(t.toHeaders = function (e) {
|
|
for (
|
|
var r = {},
|
|
i = ["Object", "Request", "Session", "Status"],
|
|
n = [{}, {}, {}, {}],
|
|
a = {
|
|
br: 0,
|
|
d: 0,
|
|
ot: 0,
|
|
tb: 0,
|
|
bl: 1,
|
|
dl: 1,
|
|
mtp: 1,
|
|
nor: 1,
|
|
nrr: 1,
|
|
su: 1,
|
|
cid: 2,
|
|
pr: 2,
|
|
sf: 2,
|
|
sid: 2,
|
|
st: 2,
|
|
v: 2,
|
|
bs: 3,
|
|
rtp: 3,
|
|
},
|
|
s = 0,
|
|
o = Object.keys(e);
|
|
s < o.length;
|
|
s++
|
|
) {
|
|
var l = o[s];
|
|
n[null != a[l] ? a[l] : 1][l] = e[l];
|
|
}
|
|
for (var u = 0; u < n.length; u++) {
|
|
var h = t.serialize(n[u]);
|
|
h && (r["CMCD-" + i[u]] = h);
|
|
}
|
|
return r;
|
|
}),
|
|
(t.toQuery = function (e) {
|
|
return "CMCD=" + encodeURIComponent(t.serialize(e));
|
|
}),
|
|
(t.appendQueryToUri = function (t, e) {
|
|
if (!e) return t;
|
|
var r = t.includes("?") ? "&" : "?";
|
|
return "" + t + r + e;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Ma = (function () {
|
|
function t(t) {
|
|
(this.hls = void 0),
|
|
(this.log = void 0),
|
|
(this.loader = null),
|
|
(this.uri = null),
|
|
(this.pathwayId = "."),
|
|
(this.pathwayPriority = null),
|
|
(this.timeToLoad = 300),
|
|
(this.reloadTimer = -1),
|
|
(this.updated = 0),
|
|
(this.started = !1),
|
|
(this.enabled = !0),
|
|
(this.levels = null),
|
|
(this.audioTracks = null),
|
|
(this.subtitleTracks = null),
|
|
(this.penalizedPathways = {}),
|
|
(this.hls = t),
|
|
(this.log = w.log.bind(w, "[content-steering]:")),
|
|
this.registerListeners();
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.registerListeners = function () {
|
|
var t = this.hls;
|
|
t.on(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.on(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.on(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.on(S.ERROR, this.onError, this);
|
|
}),
|
|
(e.unregisterListeners = function () {
|
|
var t = this.hls;
|
|
t &&
|
|
(t.off(S.MANIFEST_LOADING, this.onManifestLoading, this),
|
|
t.off(S.MANIFEST_LOADED, this.onManifestLoaded, this),
|
|
t.off(S.MANIFEST_PARSED, this.onManifestParsed, this),
|
|
t.off(S.ERROR, this.onError, this));
|
|
}),
|
|
(e.startLoad = function () {
|
|
if (
|
|
((this.started = !0),
|
|
self.clearTimeout(this.reloadTimer),
|
|
this.enabled && this.uri)
|
|
)
|
|
if (this.updated) {
|
|
var t = Math.max(
|
|
1e3 * this.timeToLoad - (performance.now() - this.updated),
|
|
0
|
|
);
|
|
this.scheduleRefresh(this.uri, t);
|
|
} else this.loadSteeringManifest(this.uri);
|
|
}),
|
|
(e.stopLoad = function () {
|
|
(this.started = !1),
|
|
this.loader && (this.loader.destroy(), (this.loader = null)),
|
|
self.clearTimeout(this.reloadTimer);
|
|
}),
|
|
(e.destroy = function () {
|
|
this.unregisterListeners(),
|
|
this.stopLoad(),
|
|
(this.hls = null),
|
|
(this.levels = this.audioTracks = this.subtitleTracks = null);
|
|
}),
|
|
(e.removeLevel = function (t) {
|
|
var e = this.levels;
|
|
e &&
|
|
(this.levels = e.filter(function (e) {
|
|
return e !== t;
|
|
}));
|
|
}),
|
|
(e.onManifestLoading = function () {
|
|
this.stopLoad(),
|
|
(this.enabled = !0),
|
|
(this.timeToLoad = 300),
|
|
(this.updated = 0),
|
|
(this.uri = null),
|
|
(this.pathwayId = "."),
|
|
(this.levels = this.audioTracks = this.subtitleTracks = null);
|
|
}),
|
|
(e.onManifestLoaded = function (t, e) {
|
|
var r = e.contentSteering;
|
|
null !== r &&
|
|
((this.pathwayId = r.pathwayId),
|
|
(this.uri = r.uri),
|
|
this.started && this.startLoad());
|
|
}),
|
|
(e.onManifestParsed = function (t, e) {
|
|
(this.audioTracks = e.audioTracks),
|
|
(this.subtitleTracks = e.subtitleTracks);
|
|
}),
|
|
(e.onError = function (t, e) {
|
|
var r = e.errorAction;
|
|
if ((null == r ? void 0 : r.action) === ir && r.flags === sr) {
|
|
var i = this.pathwayPriority,
|
|
n = this.pathwayId;
|
|
this.penalizedPathways[n] ||
|
|
(this.penalizedPathways[n] = performance.now()),
|
|
!i &&
|
|
this.levels &&
|
|
(i = this.levels.reduce(function (t, e) {
|
|
return (
|
|
-1 === t.indexOf(e.pathwayId) && t.push(e.pathwayId), t
|
|
);
|
|
}, [])),
|
|
i &&
|
|
i.length > 1 &&
|
|
(this.updatePathwayPriority(i),
|
|
(r.resolved = this.pathwayId !== n));
|
|
}
|
|
}),
|
|
(e.filterParsedLevels = function (t) {
|
|
this.levels = t;
|
|
var e = this.getLevelsForPathway(this.pathwayId);
|
|
if (0 === e.length) {
|
|
var r = t[0].pathwayId;
|
|
this.log(
|
|
"No levels found in Pathway " +
|
|
this.pathwayId +
|
|
'. Setting initial Pathway to "' +
|
|
r +
|
|
'"'
|
|
),
|
|
(e = this.getLevelsForPathway(r)),
|
|
(this.pathwayId = r);
|
|
}
|
|
return e.length !== t.length
|
|
? (this.log(
|
|
"Found " +
|
|
e.length +
|
|
"/" +
|
|
t.length +
|
|
' levels in Pathway "' +
|
|
this.pathwayId +
|
|
'"'
|
|
),
|
|
e)
|
|
: t;
|
|
}),
|
|
(e.getLevelsForPathway = function (t) {
|
|
return null === this.levels
|
|
? []
|
|
: this.levels.filter(function (e) {
|
|
return t === e.pathwayId;
|
|
});
|
|
}),
|
|
(e.updatePathwayPriority = function (t) {
|
|
var e;
|
|
this.pathwayPriority = t;
|
|
var r = this.penalizedPathways,
|
|
i = performance.now();
|
|
Object.keys(r).forEach(function (t) {
|
|
i - r[t] > 3e5 && delete r[t];
|
|
});
|
|
for (var n = 0; n < t.length; n++) {
|
|
var a = t[n];
|
|
if (!r[a]) {
|
|
if (a === this.pathwayId) return;
|
|
var s = this.hls.nextLoadLevel,
|
|
o = this.hls.levels[s];
|
|
if ((e = this.getLevelsForPathway(a)).length > 0) {
|
|
this.log('Setting Pathway to "' + a + '"'),
|
|
(this.pathwayId = a),
|
|
this.hls.trigger(S.LEVELS_UPDATED, { levels: e });
|
|
var l = this.hls.levels[s];
|
|
o &&
|
|
l &&
|
|
this.levels &&
|
|
(l.attrs["STABLE-VARIANT-ID"] !==
|
|
o.attrs["STABLE-VARIANT-ID"] &&
|
|
l.bitrate !== o.bitrate &&
|
|
this.log(
|
|
"Unstable Pathways change from bitrate " +
|
|
o.bitrate +
|
|
" to " +
|
|
l.bitrate
|
|
),
|
|
(this.hls.nextLoadLevel = s));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.clonePathways = function (t) {
|
|
var e = this,
|
|
r = this.levels;
|
|
if (r) {
|
|
var i = {},
|
|
n = {};
|
|
t.forEach(function (t) {
|
|
var a = t.ID,
|
|
s = t["BASE-ID"],
|
|
l = t["URI-REPLACEMENT"];
|
|
if (
|
|
!r.some(function (t) {
|
|
return t.pathwayId === a;
|
|
})
|
|
) {
|
|
var u = e.getLevelsForPathway(s).map(function (t) {
|
|
var e = o({}, t);
|
|
(e.details = void 0),
|
|
(e.url = Na(
|
|
t.uri,
|
|
t.attrs["STABLE-VARIANT-ID"],
|
|
"PER-VARIANT-URIS",
|
|
l
|
|
));
|
|
var r = new P(t.attrs);
|
|
r["PATHWAY-ID"] = a;
|
|
var s = r.AUDIO && r.AUDIO + "_clone_" + a,
|
|
u = r.SUBTITLES && r.SUBTITLES + "_clone_" + a;
|
|
s && ((i[r.AUDIO] = s), (r.AUDIO = s)),
|
|
u && ((n[r.SUBTITLES] = u), (r.SUBTITLES = u)),
|
|
(e.attrs = r);
|
|
var h = new Ne(e);
|
|
return dr(h, "audio", s), dr(h, "text", u), h;
|
|
});
|
|
r.push.apply(r, u),
|
|
Oa(e.audioTracks, i, l, a),
|
|
Oa(e.subtitleTracks, n, l, a);
|
|
}
|
|
});
|
|
}
|
|
}),
|
|
(e.loadSteeringManifest = function (t) {
|
|
var e,
|
|
r = this,
|
|
i = this.hls.config,
|
|
n = i.loader;
|
|
this.loader && this.loader.destroy(), (this.loader = new n(i));
|
|
try {
|
|
e = new self.URL(t);
|
|
} catch (e) {
|
|
return (
|
|
(this.enabled = !1),
|
|
void this.log("Failed to parse Steering Manifest URI: " + t)
|
|
);
|
|
}
|
|
if ("data:" !== e.protocol) {
|
|
var a =
|
|
0 | (this.hls.bandwidthEstimate || i.abrEwmaDefaultEstimate);
|
|
e.searchParams.set("_HLS_pathway", this.pathwayId),
|
|
e.searchParams.set("_HLS_throughput", "" + a);
|
|
}
|
|
var s = { responseType: "json", url: e.href },
|
|
o = i.steeringManifestLoadPolicy.default,
|
|
l = o.errorRetry || o.timeoutRetry || {},
|
|
u = {
|
|
loadPolicy: o,
|
|
timeout: o.maxLoadTimeMs,
|
|
maxRetry: l.maxNumRetry || 0,
|
|
retryDelay: l.retryDelayMs || 0,
|
|
maxRetryDelay: l.maxRetryDelayMs || 0,
|
|
},
|
|
h = {
|
|
onSuccess: function (t, i, n, a) {
|
|
r.log('Loaded steering manifest: "' + e + '"');
|
|
var s = t.data;
|
|
if (1 === s.VERSION) {
|
|
(r.updated = performance.now()), (r.timeToLoad = s.TTL);
|
|
var o = s["RELOAD-URI"],
|
|
l = s["PATHWAY-CLONES"],
|
|
u = s["PATHWAY-PRIORITY"];
|
|
if (o)
|
|
try {
|
|
r.uri = new self.URL(o, e).href;
|
|
} catch (t) {
|
|
return (
|
|
(r.enabled = !1),
|
|
void r.log(
|
|
"Failed to parse Steering Manifest RELOAD-URI: " +
|
|
o
|
|
)
|
|
);
|
|
}
|
|
r.scheduleRefresh(r.uri || n.url),
|
|
l && r.clonePathways(l),
|
|
u && r.updatePathwayPriority(u);
|
|
} else
|
|
r.log(
|
|
"Steering VERSION " + s.VERSION + " not supported!"
|
|
);
|
|
},
|
|
onError: function (t, e, i, n) {
|
|
if (
|
|
(r.log(
|
|
"Error loading steering manifest: " +
|
|
t.code +
|
|
" " +
|
|
t.text +
|
|
" (" +
|
|
e.url +
|
|
")"
|
|
),
|
|
r.stopLoad(),
|
|
410 === t.code)
|
|
)
|
|
return (
|
|
(r.enabled = !1),
|
|
void r.log(
|
|
"Steering manifest " + e.url + " no longer available"
|
|
)
|
|
);
|
|
var a = 1e3 * r.timeToLoad;
|
|
if (429 !== t.code) r.scheduleRefresh(r.uri || e.url, a);
|
|
else {
|
|
var s = r.loader;
|
|
if (
|
|
"function" ==
|
|
typeof (null == s ? void 0 : s.getResponseHeader)
|
|
) {
|
|
var o = s.getResponseHeader("Retry-After");
|
|
o && (a = 1e3 * parseFloat(o));
|
|
}
|
|
r.log("Steering manifest " + e.url + " rate limited");
|
|
}
|
|
},
|
|
onTimeout: function (t, e, i) {
|
|
r.log("Timeout loading steering manifest (" + e.url + ")"),
|
|
r.scheduleRefresh(r.uri || e.url);
|
|
},
|
|
};
|
|
this.log("Requesting steering manifest: " + e),
|
|
this.loader.load(s, u, h);
|
|
}),
|
|
(e.scheduleRefresh = function (t, e) {
|
|
var r = this;
|
|
void 0 === e && (e = 1e3 * this.timeToLoad),
|
|
self.clearTimeout(this.reloadTimer),
|
|
(this.reloadTimer = self.setTimeout(function () {
|
|
r.loadSteeringManifest(t);
|
|
}, e));
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Oa(t, e, r, i) {
|
|
t &&
|
|
Object.keys(e).forEach(function (n) {
|
|
var a = t
|
|
.filter(function (t) {
|
|
return t.groupId === n;
|
|
})
|
|
.map(function (t) {
|
|
var a = o({}, t);
|
|
return (
|
|
(a.details = void 0),
|
|
(a.attrs = new P(a.attrs)),
|
|
(a.url = a.attrs.URI =
|
|
Na(
|
|
t.url,
|
|
t.attrs["STABLE-RENDITION-ID"],
|
|
"PER-RENDITION-URIS",
|
|
r
|
|
)),
|
|
(a.groupId = a.attrs["GROUP-ID"] = e[n]),
|
|
(a.attrs["PATHWAY-ID"] = i),
|
|
a
|
|
);
|
|
});
|
|
t.push.apply(t, a);
|
|
});
|
|
}
|
|
function Na(t, e, r, i) {
|
|
var n,
|
|
a = i.HOST,
|
|
s = i.PARAMS,
|
|
o = i[r];
|
|
e && (n = null == o ? void 0 : o[e]) && (t = n);
|
|
var l = new self.URL(t);
|
|
return (
|
|
a && !n && (l.host = a),
|
|
s &&
|
|
Object.keys(s)
|
|
.sort()
|
|
.forEach(function (t) {
|
|
t && l.searchParams.set(t, s[t]);
|
|
}),
|
|
l.href
|
|
);
|
|
}
|
|
var Ua = /^age:\s*[\d.]+\s*$/im,
|
|
Ba = (function () {
|
|
function t(t) {
|
|
(this.xhrSetup = void 0),
|
|
(this.requestTimeout = void 0),
|
|
(this.retryTimeout = void 0),
|
|
(this.retryDelay = void 0),
|
|
(this.config = null),
|
|
(this.callbacks = null),
|
|
(this.context = void 0),
|
|
(this.loader = null),
|
|
(this.stats = void 0),
|
|
(this.xhrSetup = (t && t.xhrSetup) || null),
|
|
(this.stats = new M()),
|
|
(this.retryDelay = 0);
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
(this.callbacks = null),
|
|
this.abortInternal(),
|
|
(this.loader = null),
|
|
(this.config = null);
|
|
}),
|
|
(e.abortInternal = function () {
|
|
var t = this.loader;
|
|
self.clearTimeout(this.requestTimeout),
|
|
self.clearTimeout(this.retryTimeout),
|
|
t &&
|
|
((t.onreadystatechange = null),
|
|
(t.onprogress = null),
|
|
4 !== t.readyState && ((this.stats.aborted = !0), t.abort()));
|
|
}),
|
|
(e.abort = function () {
|
|
var t;
|
|
this.abortInternal(),
|
|
null != (t = this.callbacks) &&
|
|
t.onAbort &&
|
|
this.callbacks.onAbort(this.stats, this.context, this.loader);
|
|
}),
|
|
(e.load = function (t, e, r) {
|
|
if (this.stats.loading.start)
|
|
throw new Error("Loader can only be used once.");
|
|
(this.stats.loading.start = self.performance.now()),
|
|
(this.context = t),
|
|
(this.config = e),
|
|
(this.callbacks = r),
|
|
this.loadInternal();
|
|
}),
|
|
(e.loadInternal = function () {
|
|
var t = this,
|
|
e = this.config,
|
|
r = this.context;
|
|
if (e) {
|
|
var i = (this.loader = new self.XMLHttpRequest()),
|
|
n = this.stats;
|
|
(n.loading.first = 0), (n.loaded = 0), (n.aborted = !1);
|
|
var a = this.xhrSetup;
|
|
a
|
|
? Promise.resolve()
|
|
.then(function () {
|
|
if (!t.stats.aborted) return a(i, r.url);
|
|
})
|
|
.catch(function (t) {
|
|
return i.open("GET", r.url, !0), a(i, r.url);
|
|
})
|
|
.then(function () {
|
|
t.stats.aborted || t.openAndSendXhr(i, r, e);
|
|
})
|
|
.catch(function (e) {
|
|
t.callbacks.onError(
|
|
{ code: i.status, text: e.message },
|
|
r,
|
|
i,
|
|
n
|
|
);
|
|
})
|
|
: this.openAndSendXhr(i, r, e);
|
|
}
|
|
}),
|
|
(e.openAndSendXhr = function (t, e, r) {
|
|
t.readyState || t.open("GET", e.url, !0);
|
|
var i = this.context.headers,
|
|
n = r.loadPolicy,
|
|
a = n.maxTimeToFirstByteMs,
|
|
s = n.maxLoadTimeMs;
|
|
if (i) for (var o in i) t.setRequestHeader(o, i[o]);
|
|
e.rangeEnd &&
|
|
t.setRequestHeader(
|
|
"Range",
|
|
"bytes=" + e.rangeStart + "-" + (e.rangeEnd - 1)
|
|
),
|
|
(t.onreadystatechange = this.readystatechange.bind(this)),
|
|
(t.onprogress = this.loadprogress.bind(this)),
|
|
(t.responseType = e.responseType),
|
|
self.clearTimeout(this.requestTimeout),
|
|
(r.timeout = a && E(a) ? a : s),
|
|
(this.requestTimeout = self.setTimeout(
|
|
this.loadtimeout.bind(this),
|
|
r.timeout
|
|
)),
|
|
t.send();
|
|
}),
|
|
(e.readystatechange = function () {
|
|
var t = this.context,
|
|
e = this.loader,
|
|
r = this.stats;
|
|
if (t && e) {
|
|
var i = e.readyState,
|
|
n = this.config;
|
|
if (
|
|
!r.aborted &&
|
|
i >= 2 &&
|
|
(0 === r.loading.first &&
|
|
((r.loading.first = Math.max(
|
|
self.performance.now(),
|
|
r.loading.start
|
|
)),
|
|
n.timeout !== n.loadPolicy.maxLoadTimeMs &&
|
|
(self.clearTimeout(this.requestTimeout),
|
|
(n.timeout = n.loadPolicy.maxLoadTimeMs),
|
|
(this.requestTimeout = self.setTimeout(
|
|
this.loadtimeout.bind(this),
|
|
n.loadPolicy.maxLoadTimeMs -
|
|
(r.loading.first - r.loading.start)
|
|
)))),
|
|
4 === i)
|
|
) {
|
|
self.clearTimeout(this.requestTimeout),
|
|
(e.onreadystatechange = null),
|
|
(e.onprogress = null);
|
|
var a = e.status,
|
|
s = "text" !== e.responseType;
|
|
if (
|
|
a >= 200 &&
|
|
a < 300 &&
|
|
((s && e.response) || null !== e.responseText)
|
|
) {
|
|
r.loading.end = Math.max(
|
|
self.performance.now(),
|
|
r.loading.first
|
|
);
|
|
var o = s ? e.response : e.responseText,
|
|
l =
|
|
"arraybuffer" === e.responseType
|
|
? o.byteLength
|
|
: o.length;
|
|
if (
|
|
((r.loaded = r.total = l),
|
|
(r.bwEstimate =
|
|
(8e3 * r.total) / (r.loading.end - r.loading.first)),
|
|
!this.callbacks)
|
|
)
|
|
return;
|
|
var u = this.callbacks.onProgress;
|
|
if ((u && u(r, t, o, e), !this.callbacks)) return;
|
|
var h = { url: e.responseURL, data: o, code: a };
|
|
this.callbacks.onSuccess(h, r, t, e);
|
|
} else {
|
|
var d = n.loadPolicy.errorRetry;
|
|
ze(d, r.retry, !1, a)
|
|
? this.retry(d)
|
|
: (w.error(a + " while loading " + t.url),
|
|
this.callbacks.onError(
|
|
{ code: a, text: e.statusText },
|
|
t,
|
|
e,
|
|
r
|
|
));
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
(e.loadtimeout = function () {
|
|
var t,
|
|
e =
|
|
null == (t = this.config)
|
|
? void 0
|
|
: t.loadPolicy.timeoutRetry;
|
|
if (ze(e, this.stats.retry, !0)) this.retry(e);
|
|
else {
|
|
w.warn("timeout while loading " + this.context.url);
|
|
var r = this.callbacks;
|
|
r &&
|
|
(this.abortInternal(),
|
|
r.onTimeout(this.stats, this.context, this.loader));
|
|
}
|
|
}),
|
|
(e.retry = function (t) {
|
|
var e = this.context,
|
|
r = this.stats;
|
|
(this.retryDelay = qe(t, r.retry)),
|
|
r.retry++,
|
|
w.warn(
|
|
(status ? "HTTP Status " + status : "Timeout") +
|
|
" while loading " +
|
|
e.url +
|
|
", retrying " +
|
|
r.retry +
|
|
"/" +
|
|
t.maxNumRetry +
|
|
" in " +
|
|
this.retryDelay +
|
|
"ms"
|
|
),
|
|
this.abortInternal(),
|
|
(this.loader = null),
|
|
self.clearTimeout(this.retryTimeout),
|
|
(this.retryTimeout = self.setTimeout(
|
|
this.loadInternal.bind(this),
|
|
this.retryDelay
|
|
));
|
|
}),
|
|
(e.loadprogress = function (t) {
|
|
var e = this.stats;
|
|
(e.loaded = t.loaded), t.lengthComputable && (e.total = t.total);
|
|
}),
|
|
(e.getCacheAge = function () {
|
|
var t = null;
|
|
if (this.loader && Ua.test(this.loader.getAllResponseHeaders())) {
|
|
var e = this.loader.getResponseHeader("age");
|
|
t = e ? parseFloat(e) : null;
|
|
}
|
|
return t;
|
|
}),
|
|
(e.getResponseHeader = function (t) {
|
|
return this.loader &&
|
|
new RegExp("^" + t + ":\\s*[\\d.]+\\s*$", "im").test(
|
|
this.loader.getAllResponseHeaders()
|
|
)
|
|
? this.loader.getResponseHeader(t)
|
|
: null;
|
|
}),
|
|
t
|
|
);
|
|
})(),
|
|
Ga = /(\d+)-(\d+)\/(\d+)/,
|
|
Ka = (function () {
|
|
function t(t) {
|
|
(this.fetchSetup = void 0),
|
|
(this.requestTimeout = void 0),
|
|
(this.request = void 0),
|
|
(this.response = void 0),
|
|
(this.controller = void 0),
|
|
(this.context = void 0),
|
|
(this.config = null),
|
|
(this.callbacks = null),
|
|
(this.stats = void 0),
|
|
(this.loader = null),
|
|
(this.fetchSetup = t.fetchSetup || Ha),
|
|
(this.controller = new self.AbortController()),
|
|
(this.stats = new M());
|
|
}
|
|
var e = t.prototype;
|
|
return (
|
|
(e.destroy = function () {
|
|
(this.loader = this.callbacks = null), this.abortInternal();
|
|
}),
|
|
(e.abortInternal = function () {
|
|
var t = this.response;
|
|
(null != t && t.ok) ||
|
|
((this.stats.aborted = !0), this.controller.abort());
|
|
}),
|
|
(e.abort = function () {
|
|
var t;
|
|
this.abortInternal(),
|
|
null != (t = this.callbacks) &&
|
|
t.onAbort &&
|
|
this.callbacks.onAbort(
|
|
this.stats,
|
|
this.context,
|
|
this.response
|
|
);
|
|
}),
|
|
(e.load = function (t, e, r) {
|
|
var i = this,
|
|
n = this.stats;
|
|
if (n.loading.start)
|
|
throw new Error("Loader can only be used once.");
|
|
n.loading.start = self.performance.now();
|
|
var a = (function (t, e) {
|
|
var r = {
|
|
method: "GET",
|
|
mode: "cors",
|
|
credentials: "same-origin",
|
|
signal: e,
|
|
headers: new self.Headers(o({}, t.headers)),
|
|
};
|
|
return (
|
|
t.rangeEnd &&
|
|
r.headers.set(
|
|
"Range",
|
|
"bytes=" + t.rangeStart + "-" + String(t.rangeEnd - 1)
|
|
),
|
|
r
|
|
);
|
|
})(t, this.controller.signal),
|
|
s = r.onProgress,
|
|
l = "arraybuffer" === t.responseType,
|
|
u = l ? "byteLength" : "length",
|
|
h = e.loadPolicy,
|
|
d = h.maxTimeToFirstByteMs,
|
|
c = h.maxLoadTimeMs;
|
|
(this.context = t),
|
|
(this.config = e),
|
|
(this.callbacks = r),
|
|
(this.request = this.fetchSetup(t, a)),
|
|
self.clearTimeout(this.requestTimeout),
|
|
(e.timeout = d && E(d) ? d : c),
|
|
(this.requestTimeout = self.setTimeout(function () {
|
|
i.abortInternal(), r.onTimeout(n, t, i.response);
|
|
}, e.timeout)),
|
|
self
|
|
.fetch(this.request)
|
|
.then(function (a) {
|
|
i.response = i.loader = a;
|
|
var o = Math.max(self.performance.now(), n.loading.start);
|
|
if (
|
|
(self.clearTimeout(i.requestTimeout),
|
|
(e.timeout = c),
|
|
(i.requestTimeout = self.setTimeout(function () {
|
|
i.abortInternal(), r.onTimeout(n, t, i.response);
|
|
}, c - (o - n.loading.start))),
|
|
!a.ok)
|
|
) {
|
|
var u = a.status,
|
|
h = a.statusText;
|
|
throw new Va(h || "fetch, bad network response", u, a);
|
|
}
|
|
return (
|
|
(n.loading.first = o),
|
|
(n.total =
|
|
(function (t) {
|
|
var e = t.get("Content-Range");
|
|
if (e) {
|
|
var r = (function (t) {
|
|
var e = Ga.exec(t);
|
|
if (e) return parseInt(e[2]) - parseInt(e[1]) + 1;
|
|
})(e);
|
|
if (E(r)) return r;
|
|
}
|
|
var i = t.get("Content-Length");
|
|
if (i) return parseInt(i);
|
|
})(a.headers) || n.total),
|
|
s && E(e.highWaterMark)
|
|
? i.loadProgressively(a, n, t, e.highWaterMark, s)
|
|
: l
|
|
? a.arrayBuffer()
|
|
: "json" === t.responseType
|
|
? a.json()
|
|
: a.text()
|
|
);
|
|
})
|
|
.then(function (a) {
|
|
var o = i.response;
|
|
self.clearTimeout(i.requestTimeout),
|
|
(n.loading.end = Math.max(
|
|
self.performance.now(),
|
|
n.loading.first
|
|
));
|
|
var l = a[u];
|
|
l && (n.loaded = n.total = l);
|
|
var h = { url: o.url, data: a, code: o.status };
|
|
s && !E(e.highWaterMark) && s(n, t, a, o),
|
|
r.onSuccess(h, n, t, o);
|
|
})
|
|
.catch(function (e) {
|
|
if ((self.clearTimeout(i.requestTimeout), !n.aborted)) {
|
|
var a = (e && e.code) || 0,
|
|
s = e ? e.message : null;
|
|
r.onError(
|
|
{ code: a, text: s },
|
|
t,
|
|
e ? e.details : null,
|
|
n
|
|
);
|
|
}
|
|
});
|
|
}),
|
|
(e.getCacheAge = function () {
|
|
var t = null;
|
|
if (this.response) {
|
|
var e = this.response.headers.get("age");
|
|
t = e ? parseFloat(e) : null;
|
|
}
|
|
return t;
|
|
}),
|
|
(e.getResponseHeader = function (t) {
|
|
return this.response ? this.response.headers.get(t) : null;
|
|
}),
|
|
(e.loadProgressively = function (t, e, r, i, n) {
|
|
void 0 === i && (i = 0);
|
|
var a = new mn(),
|
|
s = t.body.getReader();
|
|
return (function o() {
|
|
return s
|
|
.read()
|
|
.then(function (s) {
|
|
if (s.done)
|
|
return (
|
|
a.dataLength && n(e, r, a.flush(), t),
|
|
Promise.resolve(new ArrayBuffer(0))
|
|
);
|
|
var l = s.value,
|
|
u = l.length;
|
|
return (
|
|
(e.loaded += u),
|
|
u < i || a.dataLength
|
|
? (a.push(l),
|
|
a.dataLength >= i && n(e, r, a.flush(), t))
|
|
: n(e, r, l, t),
|
|
o()
|
|
);
|
|
})
|
|
.catch(function () {
|
|
return Promise.reject();
|
|
});
|
|
})();
|
|
}),
|
|
t
|
|
);
|
|
})();
|
|
function Ha(t, e) {
|
|
return new self.Request(t.url, e);
|
|
}
|
|
var Va = (function (t) {
|
|
function e(e, r, i) {
|
|
var n;
|
|
return (
|
|
((n = t.call(this, e) || this).code = void 0),
|
|
(n.details = void 0),
|
|
(n.code = r),
|
|
(n.details = i),
|
|
n
|
|
);
|
|
}
|
|
return l(e, t), e;
|
|
})(f(Error)),
|
|
Ya = /\s/,
|
|
Wa = i(
|
|
i(
|
|
{
|
|
autoStartLoad: !0,
|
|
startPosition: -1,
|
|
defaultAudioCodec: void 0,
|
|
debug: !1,
|
|
capLevelOnFPSDrop: !1,
|
|
capLevelToPlayerSize: !1,
|
|
ignoreDevicePixelRatio: !1,
|
|
initialLiveManifestSize: 1,
|
|
maxBufferLength: 30,
|
|
backBufferLength: 1 / 0,
|
|
maxBufferSize: 6e7,
|
|
maxBufferHole: 0.1,
|
|
highBufferWatchdogPeriod: 2,
|
|
nudgeOffset: 0.1,
|
|
nudgeMaxRetry: 3,
|
|
maxFragLookUpTolerance: 0.25,
|
|
liveSyncDurationCount: 3,
|
|
liveMaxLatencyDurationCount: 1 / 0,
|
|
liveSyncDuration: void 0,
|
|
liveMaxLatencyDuration: void 0,
|
|
maxLiveSyncPlaybackRate: 1,
|
|
liveDurationInfinity: !1,
|
|
liveBackBufferLength: null,
|
|
maxMaxBufferLength: 600,
|
|
enableWorker: !0,
|
|
workerPath: null,
|
|
enableSoftwareAES: !0,
|
|
startLevel: void 0,
|
|
startFragPrefetch: !1,
|
|
fpsDroppedMonitoringPeriod: 5e3,
|
|
fpsDroppedMonitoringThreshold: 0.2,
|
|
appendErrorMaxRetry: 3,
|
|
loader: Ba,
|
|
fLoader: void 0,
|
|
pLoader: void 0,
|
|
xhrSetup: void 0,
|
|
licenseXhrSetup: void 0,
|
|
licenseResponseCallback: void 0,
|
|
abrController: vn,
|
|
bufferController: In,
|
|
capLevelController: Ra,
|
|
errorController: lr,
|
|
fpsController: Aa,
|
|
stretchShortVideoTrack: !1,
|
|
maxAudioFramesDrift: 1,
|
|
forceKeyFrameOnDiscontinuity: !0,
|
|
abrEwmaFastLive: 3,
|
|
abrEwmaSlowLive: 9,
|
|
abrEwmaFastVoD: 3,
|
|
abrEwmaSlowVoD: 9,
|
|
abrEwmaDefaultEstimate: 5e5,
|
|
abrBandWidthFactor: 0.95,
|
|
abrBandWidthUpFactor: 0.7,
|
|
abrMaxWithRealBitrate: !1,
|
|
maxStarvationDelay: 4,
|
|
maxLoadingDelay: 4,
|
|
minAutoBitrate: 0,
|
|
emeEnabled: !1,
|
|
widevineLicenseUrl: void 0,
|
|
drmSystems: {},
|
|
drmSystemOptions: {},
|
|
requestMediaKeySystemAccessFunc: et,
|
|
testBandwidth: !0,
|
|
progressive: !1,
|
|
lowLatencyMode: !0,
|
|
cmcd: void 0,
|
|
enableDateRangeMetadataCues: !0,
|
|
enableEmsgMetadataCues: !0,
|
|
enableID3MetadataCues: !0,
|
|
certLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 8e3,
|
|
maxLoadTimeMs: 2e4,
|
|
timeoutRetry: null,
|
|
errorRetry: null,
|
|
},
|
|
},
|
|
keyLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 8e3,
|
|
maxLoadTimeMs: 2e4,
|
|
timeoutRetry: {
|
|
maxNumRetry: 1,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 2e4,
|
|
backoff: "linear",
|
|
},
|
|
errorRetry: {
|
|
maxNumRetry: 8,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 2e4,
|
|
backoff: "linear",
|
|
},
|
|
},
|
|
},
|
|
manifestLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 1 / 0,
|
|
maxLoadTimeMs: 2e4,
|
|
timeoutRetry: {
|
|
maxNumRetry: 2,
|
|
retryDelayMs: 0,
|
|
maxRetryDelayMs: 0,
|
|
},
|
|
errorRetry: {
|
|
maxNumRetry: 1,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 8e3,
|
|
},
|
|
},
|
|
},
|
|
playlistLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 1e4,
|
|
maxLoadTimeMs: 2e4,
|
|
timeoutRetry: {
|
|
maxNumRetry: 2,
|
|
retryDelayMs: 0,
|
|
maxRetryDelayMs: 0,
|
|
},
|
|
errorRetry: {
|
|
maxNumRetry: 2,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 8e3,
|
|
},
|
|
},
|
|
},
|
|
fragLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 1e4,
|
|
maxLoadTimeMs: 12e4,
|
|
timeoutRetry: {
|
|
maxNumRetry: 4,
|
|
retryDelayMs: 0,
|
|
maxRetryDelayMs: 0,
|
|
},
|
|
errorRetry: {
|
|
maxNumRetry: 6,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 8e3,
|
|
},
|
|
},
|
|
},
|
|
steeringManifestLoadPolicy: {
|
|
default: {
|
|
maxTimeToFirstByteMs: 1e4,
|
|
maxLoadTimeMs: 2e4,
|
|
timeoutRetry: {
|
|
maxNumRetry: 2,
|
|
retryDelayMs: 0,
|
|
maxRetryDelayMs: 0,
|
|
},
|
|
errorRetry: {
|
|
maxNumRetry: 1,
|
|
retryDelayMs: 1e3,
|
|
maxRetryDelayMs: 8e3,
|
|
},
|
|
},
|
|
},
|
|
manifestLoadingTimeOut: 1e4,
|
|
manifestLoadingMaxRetry: 1,
|
|
manifestLoadingRetryDelay: 1e3,
|
|
manifestLoadingMaxRetryTimeout: 64e3,
|
|
levelLoadingTimeOut: 1e4,
|
|
levelLoadingMaxRetry: 4,
|
|
levelLoadingRetryDelay: 1e3,
|
|
levelLoadingMaxRetryTimeout: 64e3,
|
|
fragLoadingTimeOut: 2e4,
|
|
fragLoadingMaxRetry: 6,
|
|
fragLoadingRetryDelay: 1e3,
|
|
fragLoadingMaxRetryTimeout: 64e3,
|
|
},
|
|
{
|
|
cueHandler: {
|
|
newCue: function (t, e, r, i) {
|
|
for (
|
|
var n,
|
|
a,
|
|
s,
|
|
o,
|
|
l,
|
|
u = [],
|
|
h = self.VTTCue || self.TextTrackCue,
|
|
d = 0;
|
|
d < i.rows.length;
|
|
d++
|
|
)
|
|
if (
|
|
((s = !0), (o = 0), (l = ""), !(n = i.rows[d]).isEmpty())
|
|
) {
|
|
for (var c, f = 0; f < n.chars.length; f++)
|
|
Ya.test(n.chars[f].uchar) && s
|
|
? o++
|
|
: ((l += n.chars[f].uchar), (s = !1));
|
|
(n.cueStartTime = e),
|
|
e === r && (r += 1e-4),
|
|
o >= 16 ? o-- : o++;
|
|
var g = ia(l.trim()),
|
|
v = la(e, r, g);
|
|
(null != t && null != (c = t.cues) && c.getCueById(v)) ||
|
|
(((a = new h(e, r, g)).id = v),
|
|
(a.line = d + 1),
|
|
(a.align = "left"),
|
|
(a.position =
|
|
10 + Math.min(80, 10 * Math.floor((8 * o) / 32))),
|
|
u.push(a));
|
|
}
|
|
return (
|
|
t &&
|
|
u.length &&
|
|
(u.sort(function (t, e) {
|
|
return "auto" === t.line || "auto" === e.line
|
|
? 0
|
|
: t.line > 8 && e.line > 8
|
|
? e.line - t.line
|
|
: t.line - e.line;
|
|
}),
|
|
u.forEach(function (e) {
|
|
return Se(t, e);
|
|
})),
|
|
u
|
|
);
|
|
},
|
|
},
|
|
enableWebVTT: !0,
|
|
enableIMSC1: !0,
|
|
enableCEA708Captions: !0,
|
|
captionsTextTrack1Label: "English",
|
|
captionsTextTrack1LanguageCode: "en",
|
|
captionsTextTrack2Label: "Spanish",
|
|
captionsTextTrack2LanguageCode: "es",
|
|
captionsTextTrack3Label: "Unknown CC",
|
|
captionsTextTrack3LanguageCode: "",
|
|
captionsTextTrack4Label: "Unknown CC",
|
|
captionsTextTrack4LanguageCode: "",
|
|
renderTextTracksNatively: !0,
|
|
}
|
|
),
|
|
{},
|
|
{
|
|
subtitleStreamController: Sn,
|
|
subtitleTrackController: Rn,
|
|
timelineController: Sa,
|
|
audioStreamController: pn,
|
|
audioTrackController: yn,
|
|
emeController: ba,
|
|
cmcdController: Fa,
|
|
contentSteeringController: Ma,
|
|
}
|
|
);
|
|
function ja(t) {
|
|
return t && "object" == typeof t
|
|
? Array.isArray(t)
|
|
? t.map(ja)
|
|
: Object.keys(t).reduce(function (e, r) {
|
|
return (e[r] = ja(t[r])), e;
|
|
}, {})
|
|
: t;
|
|
}
|
|
function qa(t) {
|
|
var e = t.loader;
|
|
e !== Ka && e !== Ba
|
|
? (w.log(
|
|
"[config]: Custom loader detected, cannot enable progressive streaming"
|
|
),
|
|
(t.progressive = !1))
|
|
: (function () {
|
|
if (
|
|
self.fetch &&
|
|
self.AbortController &&
|
|
self.ReadableStream &&
|
|
self.Request
|
|
)
|
|
try {
|
|
return new self.ReadableStream({}), !0;
|
|
} catch (t) {}
|
|
return !1;
|
|
})() &&
|
|
((t.loader = Ka),
|
|
(t.progressive = !0),
|
|
(t.enableSoftwareAES = !0),
|
|
w.log(
|
|
"[config]: Progressive streaming enabled, using FetchLoader"
|
|
));
|
|
}
|
|
var Xa = (function () {
|
|
function t(e) {
|
|
void 0 === e && (e = {}),
|
|
(this.config = void 0),
|
|
(this.userConfig = void 0),
|
|
(this.coreComponents = void 0),
|
|
(this.networkControllers = void 0),
|
|
(this._emitter = new an()),
|
|
(this._autoLevelCapping = void 0),
|
|
(this._maxHdcpLevel = null),
|
|
(this.abrController = void 0),
|
|
(this.bufferController = void 0),
|
|
(this.capLevelController = void 0),
|
|
(this.latencyController = void 0),
|
|
(this.levelController = void 0),
|
|
(this.streamController = void 0),
|
|
(this.audioTrackController = void 0),
|
|
(this.subtitleTrackController = void 0),
|
|
(this.emeController = void 0),
|
|
(this.cmcdController = void 0),
|
|
(this._media = null),
|
|
(this.url = null),
|
|
I(e.debug || !1, "Hls instance");
|
|
var r = (this.config = (function (t, e) {
|
|
if (
|
|
(e.liveSyncDurationCount || e.liveMaxLatencyDurationCount) &&
|
|
(e.liveSyncDuration || e.liveMaxLatencyDuration)
|
|
)
|
|
throw new Error(
|
|
"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration"
|
|
);
|
|
if (
|
|
void 0 !== e.liveMaxLatencyDurationCount &&
|
|
(void 0 === e.liveSyncDurationCount ||
|
|
e.liveMaxLatencyDurationCount <= e.liveSyncDurationCount)
|
|
)
|
|
throw new Error(
|
|
'Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"'
|
|
);
|
|
if (
|
|
void 0 !== e.liveMaxLatencyDuration &&
|
|
(void 0 === e.liveSyncDuration ||
|
|
e.liveMaxLatencyDuration <= e.liveSyncDuration)
|
|
)
|
|
throw new Error(
|
|
'Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"'
|
|
);
|
|
var r = ja(t),
|
|
n = ["TimeOut", "MaxRetry", "RetryDelay", "MaxRetryTimeout"];
|
|
return (
|
|
["manifest", "level", "frag"].forEach(function (t) {
|
|
var i = ("level" === t ? "playlist" : t) + "LoadPolicy",
|
|
a = void 0 === e[i],
|
|
s = [];
|
|
n.forEach(function (n) {
|
|
var o = t + "Loading" + n,
|
|
l = e[o];
|
|
if (void 0 !== l && a) {
|
|
s.push(o);
|
|
var u = r[i].default;
|
|
switch (((e[i] = { default: u }), n)) {
|
|
case "TimeOut":
|
|
(u.maxLoadTimeMs = l), (u.maxTimeToFirstByteMs = l);
|
|
break;
|
|
case "MaxRetry":
|
|
(u.errorRetry.maxNumRetry = l),
|
|
(u.timeoutRetry.maxNumRetry = l);
|
|
break;
|
|
case "RetryDelay":
|
|
(u.errorRetry.retryDelayMs = l),
|
|
(u.timeoutRetry.retryDelayMs = l);
|
|
break;
|
|
case "MaxRetryTimeout":
|
|
(u.errorRetry.maxRetryDelayMs = l),
|
|
(u.timeoutRetry.maxRetryDelayMs = l);
|
|
}
|
|
}
|
|
}),
|
|
s.length &&
|
|
w.warn(
|
|
'hls.js config: "' +
|
|
s.join('", "') +
|
|
'" setting(s) are deprecated, use "' +
|
|
i +
|
|
'": ' +
|
|
JSON.stringify(e[i])
|
|
);
|
|
}),
|
|
i(i({}, r), e)
|
|
);
|
|
})(t.DefaultConfig, e));
|
|
(this.userConfig = e),
|
|
(this._autoLevelCapping = -1),
|
|
r.progressive && qa(r);
|
|
var n = r.abrController,
|
|
a = r.bufferController,
|
|
s = r.capLevelController,
|
|
o = r.errorController,
|
|
l = r.fpsController,
|
|
u = new o(this),
|
|
h = (this.abrController = new n(this)),
|
|
d = (this.bufferController = new a(this)),
|
|
c = (this.capLevelController = new s(this)),
|
|
f = new l(this),
|
|
g = new Te(this),
|
|
v = new Ce(this),
|
|
m = r.contentSteeringController,
|
|
p = m ? new m(this) : null,
|
|
y = (this.levelController = new hr(this, p)),
|
|
T = new pr(this),
|
|
E = new kr(this.config),
|
|
L = (this.streamController = new cn(this, T, E));
|
|
c.setStreamController(L), f.setStreamController(L);
|
|
var R = [g, y, L];
|
|
p && R.splice(1, 0, p), (this.networkControllers = R);
|
|
var A = [h, d, c, f, v, T];
|
|
this.audioTrackController = this.createController(
|
|
r.audioTrackController,
|
|
R
|
|
);
|
|
var k = r.audioStreamController;
|
|
k && R.push(new k(this, T, E)),
|
|
(this.subtitleTrackController = this.createController(
|
|
r.subtitleTrackController,
|
|
R
|
|
));
|
|
var b = r.subtitleStreamController;
|
|
b && R.push(new b(this, T, E)),
|
|
this.createController(r.timelineController, A),
|
|
(E.emeController = this.emeController =
|
|
this.createController(r.emeController, A)),
|
|
(this.cmcdController = this.createController(r.cmcdController, A)),
|
|
(this.latencyController = this.createController(_e, A)),
|
|
(this.coreComponents = A),
|
|
R.push(u);
|
|
var D = u.onErrorOut;
|
|
"function" == typeof D && this.on(S.ERROR, D, u);
|
|
}
|
|
t.isSupported = function () {
|
|
return (function () {
|
|
var t = qt();
|
|
if (!t) return !1;
|
|
var e = Zr(),
|
|
r =
|
|
t &&
|
|
"function" == typeof t.isTypeSupported &&
|
|
t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),
|
|
i =
|
|
!e ||
|
|
(e.prototype &&
|
|
"function" == typeof e.prototype.appendBuffer &&
|
|
"function" == typeof e.prototype.remove);
|
|
return !!r && !!i;
|
|
})();
|
|
};
|
|
var e = t.prototype;
|
|
return (
|
|
(e.createController = function (t, e) {
|
|
if (t) {
|
|
var r = new t(this);
|
|
return e && e.push(r), r;
|
|
}
|
|
return null;
|
|
}),
|
|
(e.on = function (t, e, r) {
|
|
void 0 === r && (r = this), this._emitter.on(t, e, r);
|
|
}),
|
|
(e.once = function (t, e, r) {
|
|
void 0 === r && (r = this), this._emitter.once(t, e, r);
|
|
}),
|
|
(e.removeAllListeners = function (t) {
|
|
this._emitter.removeAllListeners(t);
|
|
}),
|
|
(e.off = function (t, e, r, i) {
|
|
void 0 === r && (r = this), this._emitter.off(t, e, r, i);
|
|
}),
|
|
(e.listeners = function (t) {
|
|
return this._emitter.listeners(t);
|
|
}),
|
|
(e.emit = function (t, e, r) {
|
|
return this._emitter.emit(t, e, r);
|
|
}),
|
|
(e.trigger = function (t, e) {
|
|
if (this.config.debug) return this.emit(t, t, e);
|
|
try {
|
|
return this.emit(t, t, e);
|
|
} catch (e) {
|
|
w.error(
|
|
"An internal error happened while handling event " +
|
|
t +
|
|
'. Error message: "' +
|
|
e.message +
|
|
'". Here is a stacktrace:',
|
|
e
|
|
),
|
|
this.trigger(S.ERROR, {
|
|
type: L.OTHER_ERROR,
|
|
details: R.INTERNAL_EXCEPTION,
|
|
fatal: !1,
|
|
event: t,
|
|
error: e,
|
|
});
|
|
}
|
|
return !1;
|
|
}),
|
|
(e.listenerCount = function (t) {
|
|
return this._emitter.listenerCount(t);
|
|
}),
|
|
(e.destroy = function () {
|
|
w.log("destroy"),
|
|
this.trigger(S.DESTROYING, void 0),
|
|
this.detachMedia(),
|
|
this.removeAllListeners(),
|
|
(this._autoLevelCapping = -1),
|
|
(this.url = null),
|
|
this.networkControllers.forEach(function (t) {
|
|
return t.destroy();
|
|
}),
|
|
(this.networkControllers.length = 0),
|
|
this.coreComponents.forEach(function (t) {
|
|
return t.destroy();
|
|
}),
|
|
(this.coreComponents.length = 0);
|
|
var t = this.config;
|
|
(t.xhrSetup = t.fetchSetup = void 0), (this.userConfig = null);
|
|
}),
|
|
(e.attachMedia = function (t) {
|
|
w.log("attachMedia"),
|
|
(this._media = t),
|
|
this.trigger(S.MEDIA_ATTACHING, { media: t });
|
|
}),
|
|
(e.detachMedia = function () {
|
|
w.log("detachMedia"),
|
|
this.trigger(S.MEDIA_DETACHING, void 0),
|
|
(this._media = null);
|
|
}),
|
|
(e.loadSource = function (t) {
|
|
this.stopLoad();
|
|
var e = this.media,
|
|
r = this.url,
|
|
i = (this.url = T.buildAbsoluteURL(self.location.href, t, {
|
|
alwaysNormalize: !0,
|
|
}));
|
|
w.log("loadSource:" + i),
|
|
e &&
|
|
r &&
|
|
(r !== i || this.bufferController.hasSourceTypes()) &&
|
|
(this.detachMedia(), this.attachMedia(e)),
|
|
this.trigger(S.MANIFEST_LOADING, { url: t });
|
|
}),
|
|
(e.startLoad = function (t) {
|
|
void 0 === t && (t = -1),
|
|
w.log("startLoad(" + t + ")"),
|
|
this.networkControllers.forEach(function (e) {
|
|
e.startLoad(t);
|
|
});
|
|
}),
|
|
(e.stopLoad = function () {
|
|
w.log("stopLoad"),
|
|
this.networkControllers.forEach(function (t) {
|
|
t.stopLoad();
|
|
});
|
|
}),
|
|
(e.swapAudioCodec = function () {
|
|
w.log("swapAudioCodec"), this.streamController.swapAudioCodec();
|
|
}),
|
|
(e.recoverMediaError = function () {
|
|
w.log("recoverMediaError");
|
|
var t = this._media;
|
|
this.detachMedia(), t && this.attachMedia(t);
|
|
}),
|
|
(e.removeLevel = function (t, e) {
|
|
void 0 === e && (e = 0), this.levelController.removeLevel(t, e);
|
|
}),
|
|
a(
|
|
t,
|
|
[
|
|
{
|
|
key: "levels",
|
|
get: function () {
|
|
var t = this.levelController.levels;
|
|
return t || [];
|
|
},
|
|
},
|
|
{
|
|
key: "currentLevel",
|
|
get: function () {
|
|
return this.streamController.currentLevel;
|
|
},
|
|
set: function (t) {
|
|
w.log("set currentLevel:" + t),
|
|
(this.loadLevel = t),
|
|
this.abrController.clearTimer(),
|
|
this.streamController.immediateLevelSwitch();
|
|
},
|
|
},
|
|
{
|
|
key: "nextLevel",
|
|
get: function () {
|
|
return this.streamController.nextLevel;
|
|
},
|
|
set: function (t) {
|
|
w.log("set nextLevel:" + t),
|
|
(this.levelController.manualLevel = t),
|
|
this.streamController.nextLevelSwitch();
|
|
},
|
|
},
|
|
{
|
|
key: "loadLevel",
|
|
get: function () {
|
|
return this.levelController.level;
|
|
},
|
|
set: function (t) {
|
|
w.log("set loadLevel:" + t),
|
|
(this.levelController.manualLevel = t);
|
|
},
|
|
},
|
|
{
|
|
key: "nextLoadLevel",
|
|
get: function () {
|
|
return this.levelController.nextLoadLevel;
|
|
},
|
|
set: function (t) {
|
|
this.levelController.nextLoadLevel = t;
|
|
},
|
|
},
|
|
{
|
|
key: "firstLevel",
|
|
get: function () {
|
|
return Math.max(
|
|
this.levelController.firstLevel,
|
|
this.minAutoLevel
|
|
);
|
|
},
|
|
set: function (t) {
|
|
w.log("set firstLevel:" + t),
|
|
(this.levelController.firstLevel = t);
|
|
},
|
|
},
|
|
{
|
|
key: "startLevel",
|
|
get: function () {
|
|
return this.levelController.startLevel;
|
|
},
|
|
set: function (t) {
|
|
w.log("set startLevel:" + t),
|
|
-1 !== t && (t = Math.max(t, this.minAutoLevel)),
|
|
(this.levelController.startLevel = t);
|
|
},
|
|
},
|
|
{
|
|
key: "capLevelToPlayerSize",
|
|
get: function () {
|
|
return this.config.capLevelToPlayerSize;
|
|
},
|
|
set: function (t) {
|
|
var e = !!t;
|
|
e !== this.config.capLevelToPlayerSize &&
|
|
(e
|
|
? this.capLevelController.startCapping()
|
|
: (this.capLevelController.stopCapping(),
|
|
(this.autoLevelCapping = -1),
|
|
this.streamController.nextLevelSwitch()),
|
|
(this.config.capLevelToPlayerSize = e));
|
|
},
|
|
},
|
|
{
|
|
key: "autoLevelCapping",
|
|
get: function () {
|
|
return this._autoLevelCapping;
|
|
},
|
|
set: function (t) {
|
|
this._autoLevelCapping !== t &&
|
|
(w.log("set autoLevelCapping:" + t),
|
|
(this._autoLevelCapping = t));
|
|
},
|
|
},
|
|
{
|
|
key: "bandwidthEstimate",
|
|
get: function () {
|
|
var t = this.abrController.bwEstimator;
|
|
return t ? t.getEstimate() : NaN;
|
|
},
|
|
},
|
|
{
|
|
key: "ttfbEstimate",
|
|
get: function () {
|
|
var t = this.abrController.bwEstimator;
|
|
return t ? t.getEstimateTTFB() : NaN;
|
|
},
|
|
},
|
|
{
|
|
key: "maxHdcpLevel",
|
|
get: function () {
|
|
return this._maxHdcpLevel;
|
|
},
|
|
set: function (t) {
|
|
Pe.indexOf(t) > -1 && (this._maxHdcpLevel = t);
|
|
},
|
|
},
|
|
{
|
|
key: "autoLevelEnabled",
|
|
get: function () {
|
|
return -1 === this.levelController.manualLevel;
|
|
},
|
|
},
|
|
{
|
|
key: "manualLevel",
|
|
get: function () {
|
|
return this.levelController.manualLevel;
|
|
},
|
|
},
|
|
{
|
|
key: "minAutoLevel",
|
|
get: function () {
|
|
var t = this.levels,
|
|
e = this.config.minAutoBitrate;
|
|
if (!t) return 0;
|
|
for (var r = t.length, i = 0; i < r; i++)
|
|
if (t[i].maxBitrate >= e) return i;
|
|
return 0;
|
|
},
|
|
},
|
|
{
|
|
key: "maxAutoLevel",
|
|
get: function () {
|
|
var t,
|
|
e = this.levels,
|
|
r = this.autoLevelCapping,
|
|
i = this.maxHdcpLevel;
|
|
if (((t = -1 === r && e && e.length ? e.length - 1 : r), i))
|
|
for (var n = t; n--; ) {
|
|
var a = e[n].attrs["HDCP-LEVEL"];
|
|
if (a && a <= i) return n;
|
|
}
|
|
return t;
|
|
},
|
|
},
|
|
{
|
|
key: "nextAutoLevel",
|
|
get: function () {
|
|
return Math.min(
|
|
Math.max(
|
|
this.abrController.nextAutoLevel,
|
|
this.minAutoLevel
|
|
),
|
|
this.maxAutoLevel
|
|
);
|
|
},
|
|
set: function (t) {
|
|
this.abrController.nextAutoLevel = Math.max(
|
|
this.minAutoLevel,
|
|
t
|
|
);
|
|
},
|
|
},
|
|
{
|
|
key: "playingDate",
|
|
get: function () {
|
|
return this.streamController.currentProgramDateTime;
|
|
},
|
|
},
|
|
{
|
|
key: "mainForwardBufferInfo",
|
|
get: function () {
|
|
return this.streamController.getMainFwdBufferInfo();
|
|
},
|
|
},
|
|
{
|
|
key: "audioTracks",
|
|
get: function () {
|
|
var t = this.audioTrackController;
|
|
return t ? t.audioTracks : [];
|
|
},
|
|
},
|
|
{
|
|
key: "audioTrack",
|
|
get: function () {
|
|
var t = this.audioTrackController;
|
|
return t ? t.audioTrack : -1;
|
|
},
|
|
set: function (t) {
|
|
var e = this.audioTrackController;
|
|
e && (e.audioTrack = t);
|
|
},
|
|
},
|
|
{
|
|
key: "subtitleTracks",
|
|
get: function () {
|
|
var t = this.subtitleTrackController;
|
|
return t ? t.subtitleTracks : [];
|
|
},
|
|
},
|
|
{
|
|
key: "subtitleTrack",
|
|
get: function () {
|
|
var t = this.subtitleTrackController;
|
|
return t ? t.subtitleTrack : -1;
|
|
},
|
|
set: function (t) {
|
|
var e = this.subtitleTrackController;
|
|
e && (e.subtitleTrack = t);
|
|
},
|
|
},
|
|
{
|
|
key: "media",
|
|
get: function () {
|
|
return this._media;
|
|
},
|
|
},
|
|
{
|
|
key: "subtitleDisplay",
|
|
get: function () {
|
|
var t = this.subtitleTrackController;
|
|
return !!t && t.subtitleDisplay;
|
|
},
|
|
set: function (t) {
|
|
var e = this.subtitleTrackController;
|
|
e && (e.subtitleDisplay = t);
|
|
},
|
|
},
|
|
{
|
|
key: "lowLatencyMode",
|
|
get: function () {
|
|
return this.config.lowLatencyMode;
|
|
},
|
|
set: function (t) {
|
|
this.config.lowLatencyMode = t;
|
|
},
|
|
},
|
|
{
|
|
key: "liveSyncPosition",
|
|
get: function () {
|
|
return this.latencyController.liveSyncPosition;
|
|
},
|
|
},
|
|
{
|
|
key: "latency",
|
|
get: function () {
|
|
return this.latencyController.latency;
|
|
},
|
|
},
|
|
{
|
|
key: "maxLatency",
|
|
get: function () {
|
|
return this.latencyController.maxLatency;
|
|
},
|
|
},
|
|
{
|
|
key: "targetLatency",
|
|
get: function () {
|
|
return this.latencyController.targetLatency;
|
|
},
|
|
},
|
|
{
|
|
key: "drift",
|
|
get: function () {
|
|
return this.latencyController.drift;
|
|
},
|
|
},
|
|
{
|
|
key: "forceStartLoad",
|
|
get: function () {
|
|
return this.streamController.forceStartLoad;
|
|
},
|
|
},
|
|
],
|
|
[
|
|
{
|
|
key: "version",
|
|
get: function () {
|
|
return "1.4.12";
|
|
},
|
|
},
|
|
{
|
|
key: "Events",
|
|
get: function () {
|
|
return S;
|
|
},
|
|
},
|
|
{
|
|
key: "ErrorTypes",
|
|
get: function () {
|
|
return L;
|
|
},
|
|
},
|
|
{
|
|
key: "ErrorDetails",
|
|
get: function () {
|
|
return R;
|
|
},
|
|
},
|
|
{
|
|
key: "DefaultConfig",
|
|
get: function () {
|
|
return t.defaultConfig ? t.defaultConfig : Wa;
|
|
},
|
|
set: function (e) {
|
|
t.defaultConfig = e;
|
|
},
|
|
},
|
|
]
|
|
),
|
|
t
|
|
);
|
|
})();
|
|
return (Xa.defaultConfig = void 0), Xa;
|
|
}),
|
|
"object" == typeof exports && "undefined" != typeof module
|
|
? (module.exports = i())
|
|
: "function" == typeof define && define.amd
|
|
? define(i)
|
|
: ((r = "undefined" != typeof globalThis ? globalThis : r || self).Hls =
|
|
i());
|
|
})(!1);
|
|
//# sourceMappingURL=hls.min.js.map
|