From ef9420d89f1435cd02b1a1f10b4e0e83b4b2c599 Mon Sep 17 00:00:00 2001 From: Rob Walch Date: Tue, 14 Jul 2020 18:44:17 -0400 Subject: [PATCH] Fix for IE11 missing Number.MAX_SAFE_INTEGER --- src/polyfills/{number-isFinite.js => number.js} | 2 ++ src/remux/mp4-remuxer.js | 12 ++++++------ webpack.config.js | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) rename src/polyfills/{number-isFinite.js => number.js} (61%) diff --git a/src/polyfills/number-isFinite.js b/src/polyfills/number.js similarity index 61% rename from src/polyfills/number-isFinite.js rename to src/polyfills/number.js index 5d2885c6660..ed3d28d0128 100644 --- a/src/polyfills/number-isFinite.js +++ b/src/polyfills/number.js @@ -1,3 +1,5 @@ export const isFiniteNumber = Number.isFinite || function (value) { return typeof value === 'number' && isFinite(value); }; + +export const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; diff --git a/src/remux/mp4-remuxer.js b/src/remux/mp4-remuxer.js index ccd2462db0e..f2091f5200e 100644 --- a/src/remux/mp4-remuxer.js +++ b/src/remux/mp4-remuxer.js @@ -192,8 +192,8 @@ class MP4Remuxer { let moof; let firstDTS; let lastDTS; - let minPTS = Number.MAX_SAFE_INTEGER; - let maxPTS = -Number.MAX_SAFE_INTEGER; + let minPTS = Number.POSITIVE_INFINITY; + let maxPTS = Number.NEGATIVE_INFINITY; const timeScale = track.timescale; const inputSamples = track.samples; const outputSamples = []; @@ -217,7 +217,7 @@ class MP4Remuxer { // consecutive fragments are frags with // - less than 100ms gaps between new time offset (if accurate) and next expected PTS OR // - less than 200 ms PTS gaps (timeScale/5) - contiguous |= (inputSamples.length && nextAvcDts && + contiguous |= (nbSamples && nextAvcDts && ((accurateTimeOffset && Math.abs(timeOffset - nextAvcDts / timeScale) < 0.1) || Math.abs((inputSamples[0].pts - nextAvcDts - initPTS)) < timeScale / 5) ); @@ -249,14 +249,14 @@ class MP4Remuxer { let PTSDTSshift = inputSamples.reduce((prev, curr) => Math.max(Math.min(prev, curr.pts - curr.dts), -1 * PTS_DTS_SHIFT_TOLERANCE_90KHZ), 0); if (PTSDTSshift < 0) { logger.warn(`PTS < DTS detected in video samples, shifting DTS by ${toMsFromMpegTsClock(PTSDTSshift, true)} ms to overcome this issue`); - for (let i = 0; i < inputSamples.length; i++) { + for (let i = 0; i < nbSamples; i++) { inputSamples[i].dts = Math.max(0, inputSamples[i].dts + PTSDTSshift); } } // Get first/last DTS firstDTS = inputSamples[0].dts; - lastDTS = inputSamples[inputSamples.length - 1].dts; + lastDTS = inputSamples[nbSamples - 1].dts; // check timestamp continuity across consecutive fragments (this is to remove inter-fragment gap/hole) const delta = firstDTS - nextAvcDts; @@ -282,7 +282,7 @@ class MP4Remuxer { // sample duration (as expected by trun MP4 boxes), should be the delta between sample DTS // set this constant duration as being the avg delta between consecutive DTS. if (isSafari) { - mp4SampleDuration = Math.round((lastDTS - firstDTS) / (inputSamples.length - 1)); + mp4SampleDuration = Math.round((lastDTS - firstDTS) / (nbSamples - 1)); } // Clamp first DTS to 0 so that we're still aligning on initPTS, diff --git a/webpack.config.js b/webpack.config.js index 3390f814a3f..753b3cecc5b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -76,7 +76,9 @@ const baseConfig = { visitor: { CallExpression: function (espath) { if (espath.get('callee').matchesPattern('Number.isFinite')) { - espath.node.callee = importHelper.addNamed(espath, 'isFiniteNumber', path.resolve('src/polyfills/number-isFinite')); + espath.node.callee = importHelper.addNamed(espath, 'isFiniteNumber', path.resolve('src/polyfills/number')); + } else if (espath.get('callee').matchesPattern('Number.MAX_SAFE_INTEGER')) { + espath.node.callee = importHelper.addNamed(espath, 'MAX_SAFE_INTEGER', path.resolve('src/polyfills/number')); } } }