@remotion/media-parser 4.0.286 → 4.0.287
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +2 -2
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +6 -3
- package/dist/containers/iso-base-media/get-keyframes.js +1 -1
- package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +2 -2
- package/dist/containers/iso-base-media/get-seeking-byte.d.ts +15 -0
- package/dist/containers/iso-base-media/{get-seeking-from-mp4.js → get-seeking-byte.js} +16 -2
- package/dist/containers/iso-base-media/mdat/mdat.js +6 -3
- package/dist/containers/iso-base-media/process-box.js +5 -3
- package/dist/containers/iso-base-media/{get-seeking-info-from-mp4.d.ts → seeking-hints.d.ts} +8 -3
- package/dist/containers/iso-base-media/seeking-hints.js +52 -0
- package/dist/containers/iso-base-media/traversal.d.ts +4 -2
- package/dist/containers/iso-base-media/traversal.js +6 -5
- package/dist/containers/m3u/iterate-over-segment-files.js +23 -20
- package/dist/containers/riff/parse-video-section.js +1 -1
- package/dist/containers/transport-stream/handle-aac-packet.js +4 -1
- package/dist/containers/transport-stream/handle-avc-packet.js +4 -1
- package/dist/containers/transport-stream/seeking-hints.d.ts +9 -0
- package/dist/containers/transport-stream/seeking-hints.js +26 -0
- package/dist/containers/wav/get-seeking-byte.d.ts +2 -2
- package/dist/containers/wav/get-seeking-byte.js +2 -2
- package/dist/containers/wav/seeking-hints.d.ts +12 -0
- package/dist/containers/wav/seeking-hints.js +25 -0
- package/dist/containers/webm/seek/get-seeking-byte.d.ts +3 -5
- package/dist/containers/webm/seek/get-seeking-byte.js +5 -5
- package/dist/containers/webm/seek/seeking-hints.d.ts +10 -0
- package/dist/containers/webm/seek/seeking-hints.js +28 -0
- package/dist/controller/media-parser-controller.d.ts +3 -0
- package/dist/controller/media-parser-controller.js +15 -0
- package/dist/download-and-parse-media.js +2 -1
- package/dist/emit-available-info.js +1 -1
- package/dist/esm/index.mjs +430 -197
- package/dist/esm/node-writer.mjs +1 -2
- package/dist/esm/node.mjs +1 -2
- package/dist/esm/server-worker.mjs +46 -1
- package/dist/esm/universal.mjs +2 -4
- package/dist/esm/web.mjs +1 -2
- package/dist/esm/worker-server-entry.mjs +466 -204
- package/dist/esm/worker-web-entry.mjs +465 -202
- package/dist/esm/worker.mjs +46 -1
- package/dist/{forward-controller.d.ts → forward-controller-pause-resume-abort.d.ts} +1 -1
- package/dist/{forward-controller.js → forward-controller-pause-resume-abort.js} +3 -3
- package/dist/get-audio-codec.js +2 -2
- package/dist/get-dimensions.js +1 -1
- package/dist/get-duration.js +3 -2
- package/dist/get-fps.js +1 -0
- package/dist/get-is-hdr.js +2 -2
- package/dist/get-keyframes.js +1 -1
- package/dist/get-seeking-byte.d.ts +7 -5
- package/dist/get-seeking-byte.js +13 -12
- package/dist/{get-seeking-info.d.ts → get-seeking-hints.d.ts} +7 -3
- package/dist/get-seeking-hints.js +35 -0
- package/dist/get-tracks.d.ts +4 -4
- package/dist/get-tracks.js +8 -6
- package/dist/get-video-codec.js +2 -2
- package/dist/has-all-info.js +1 -1
- package/dist/index.d.ts +31 -3
- package/dist/internal-parse-media.js +16 -1
- package/dist/iterator/buffer-iterator.js +3 -4
- package/dist/metadata/metadata-from-iso.js +1 -0
- package/dist/options.d.ts +2 -0
- package/dist/parse-media-on-worker-entry.js +51 -1
- package/dist/parse-media.js +2 -1
- package/dist/samples-from-moof.d.ts +2 -2
- package/dist/samples-from-moof.js +5 -8
- package/dist/seeking-hints.d.ts +39 -0
- package/dist/set-seeking-hints.d.ts +6 -0
- package/dist/set-seeking-hints.js +27 -0
- package/dist/state/has-tracks-section.js +3 -1
- package/dist/state/iso-base-media/cached-sample-positions.js +1 -1
- package/dist/state/iso-base-media/iso-state.d.ts +18 -2
- package/dist/state/iso-base-media/iso-state.js +4 -0
- package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -0
- package/dist/state/iso-base-media/lazy-mfra-load.js +13 -0
- package/dist/state/iso-base-media/moov-box.d.ts +7 -2
- package/dist/state/iso-base-media/moov-box.js +1 -1
- package/dist/state/iso-base-media/precomputed-moof.d.ts +11 -0
- package/dist/state/iso-base-media/precomputed-moof.js +28 -0
- package/dist/state/iso-base-media/precomputed-tfra.d.ts +6 -0
- package/dist/state/iso-base-media/precomputed-tfra.js +17 -0
- package/dist/state/keyframes.d.ts +2 -0
- package/dist/state/keyframes.js +17 -9
- package/dist/state/matroska/lazy-cues-fetch.d.ts +7 -1
- package/dist/state/matroska/lazy-cues-fetch.js +21 -0
- package/dist/state/matroska/webm.d.ts +7 -0
- package/dist/state/matroska/webm.js +9 -1
- package/dist/state/parser-state.d.ts +31 -3
- package/dist/state/samples-observed/slow-duration-fps.js +0 -3
- package/dist/state/transport-stream/observed-pes-header.d.ts +2 -0
- package/dist/state/transport-stream/observed-pes-header.js +22 -12
- package/dist/state/transport-stream/pts-start-offset.d.ts +4 -1
- package/dist/state/transport-stream/pts-start-offset.js +1 -1
- package/dist/state/transport-stream/transport-stream.d.ts +5 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/with-resolvers.d.ts +5 -0
- package/dist/work-on-seek-request.js +8 -5
- package/dist/worker/{forward-controller.js → forward-controller-to-worker.js} +17 -0
- package/dist/worker/serialize-error.d.ts +6 -1
- package/dist/worker/serialize-error.js +2 -1
- package/dist/worker/worker-types.d.ts +12 -2
- package/dist/worker-server.js +16 -5
- package/package.json +3 -3
- package/dist/containers/iso-base-media/get-mfra-atom.d.ts +0 -9
- package/dist/containers/iso-base-media/get-mfra-atom.js +0 -12
- package/dist/containers/iso-base-media/get-seeking-from-mp4.d.ts +0 -11
- package/dist/containers/iso-base-media/get-seeking-info-from-mp4.js +0 -25
- package/dist/containers/iso-base-media/mfra/mfra.d.ts +0 -2
- package/dist/containers/iso-base-media/mfra/mfra.js +0 -11
- package/dist/containers/transport-stream/get-seeking-info.d.ts +0 -4
- package/dist/containers/transport-stream/get-seeking-info.js +0 -17
- package/dist/containers/transport-stream/next-pes-header-store.d.ts +0 -6
- package/dist/containers/transport-stream/next-pes-header-store.js +0 -18
- package/dist/containers/transport-stream/start-offset.d.ts +0 -4
- package/dist/containers/transport-stream/start-offset.js +0 -13
- package/dist/containers/wav/get-seeking-info.d.ts +0 -7
- package/dist/containers/wav/get-seeking-info.js +0 -20
- package/dist/containers/wav/parse-video-section.d.ts +0 -5
- package/dist/containers/wav/parse-video-section.js +0 -41
- package/dist/containers/webm/cues/fetch-web-cues.d.ts +0 -12
- package/dist/containers/webm/cues/fetch-web-cues.js +0 -32
- package/dist/containers/webm/cues/format-cues.d.ts +0 -8
- package/dist/containers/webm/cues/format-cues.js +0 -41
- package/dist/containers/webm/cues/get-seeking-byte.d.ts +0 -14
- package/dist/containers/webm/cues/get-seeking-byte.js +0 -91
- package/dist/containers/webm/fetch-web-cues.d.ts +0 -12
- package/dist/containers/webm/fetch-web-cues.js +0 -29
- package/dist/containers/webm/get-seeking-byte.d.ts +0 -14
- package/dist/containers/webm/get-seeking-byte.js +0 -91
- package/dist/containers/webm/get-seeking-info.d.ts +0 -3
- package/dist/containers/webm/get-seeking-info.js +0 -17
- package/dist/containers/webm/seek/get-seeking-info.d.ts +0 -3
- package/dist/containers/webm/seek/get-seeking-info.js +0 -17
- package/dist/emitter.d.ts +0 -33
- package/dist/emitter.js +0 -65
- package/dist/get-sample-positions-from-lpcm.d.ts +0 -3
- package/dist/get-sample-positions-from-lpcm.js +0 -46
- package/dist/get-seeking-info.js +0 -35
- package/dist/media-parser-controller.d.ts +0 -21
- package/dist/media-parser-controller.js +0 -38
- package/dist/pause-signal.d.ts +0 -11
- package/dist/pause-signal.js +0 -38
- package/dist/readers/state/aac-state.d.ts +0 -13
- package/dist/readers/state/aac-state.js +0 -17
- package/dist/readers/state/can-skip-tracks.d.ts +0 -16
- package/dist/readers/state/can-skip-tracks.js +0 -60
- package/dist/readers/state/current-reader.d.ts +0 -6
- package/dist/readers/state/current-reader.js +0 -13
- package/dist/readers/state/emitted-fields.d.ts +0 -1
- package/dist/readers/state/emitted-fields.js +0 -37
- package/dist/readers/state/flac-state.d.ts +0 -4
- package/dist/readers/state/flac-state.js +0 -13
- package/dist/readers/state/has-tracks-section.d.ts +0 -14
- package/dist/readers/state/has-tracks-section.js +0 -37
- package/dist/readers/state/images.d.ts +0 -9
- package/dist/readers/state/images.js +0 -14
- package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +0 -12
- package/dist/readers/state/iso-base-media/cached-sample-positions.js +0 -46
- package/dist/readers/state/iso-base-media/iso-state.d.ts +0 -24
- package/dist/readers/state/iso-base-media/iso-state.js +0 -20
- package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +0 -13
- package/dist/readers/state/iso-base-media/lazy-mfra-load.js +0 -29
- package/dist/readers/state/iso-base-media/moov-box.d.ts +0 -5
- package/dist/readers/state/iso-base-media/moov-box.js +0 -13
- package/dist/readers/state/keyframes.d.ts +0 -6
- package/dist/readers/state/keyframes.js +0 -15
- package/dist/readers/state/m3u-state.d.ts +0 -44
- package/dist/readers/state/m3u-state.js +0 -124
- package/dist/readers/state/may-skip-video-data.d.ts +0 -4
- package/dist/readers/state/may-skip-video-data.js +0 -18
- package/dist/readers/state/mp3.d.ts +0 -15
- package/dist/readers/state/mp3.js +0 -19
- package/dist/readers/state/need-samples-for-fields.d.ts +0 -6
- package/dist/readers/state/need-samples-for-fields.js +0 -39
- package/dist/readers/state/parser-state.d.ts +0 -252
- package/dist/readers/state/parser-state.js +0 -124
- package/dist/readers/state/riff.d.ts +0 -10
- package/dist/readers/state/riff.js +0 -32
- package/dist/readers/state/sample-callbacks.d.ts +0 -44
- package/dist/readers/state/sample-callbacks.js +0 -118
- package/dist/readers/state/seek-infinite-loop.d.ts +0 -5
- package/dist/readers/state/seek-infinite-loop.js +0 -22
- package/dist/readers/state/slow-duration-fps.d.ts +0 -11
- package/dist/readers/state/slow-duration-fps.js +0 -86
- package/dist/readers/state/structure.d.ts +0 -15
- package/dist/readers/state/structure.js +0 -78
- package/dist/readers/state/timings.d.ts +0 -8
- package/dist/readers/state/timings.js +0 -13
- package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +0 -6
- package/dist/readers/state/transport-stream/last-emitted-sample.js +0 -16
- package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +0 -6
- package/dist/readers/state/transport-stream/next-pes-header-store.js +0 -18
- package/dist/readers/state/transport-stream/start-offset.d.ts +0 -4
- package/dist/readers/state/transport-stream/start-offset.js +0 -13
- package/dist/readers/state/transport-stream/transport-stream.d.ts +0 -19
- package/dist/readers/state/transport-stream/transport-stream.js +0 -25
- package/dist/readers/state/video-section.d.ts +0 -33
- package/dist/readers/state/video-section.js +0 -65
- package/dist/readers/state/webm.d.ts +0 -28
- package/dist/readers/state/webm.js +0 -109
- package/dist/seek-signal.d.ts +0 -19
- package/dist/seek-signal.js +0 -24
- package/dist/seeking-info.d.ts +0 -31
- package/dist/server-worker.module.d.ts +0 -2
- package/dist/server-worker.module.js +0 -12
- package/dist/state/matroska/lazy-seek-fetch.d.ts +0 -1
- package/dist/state/matroska/lazy-seek-fetch.js +0 -5
- package/dist/state/matroska.d.ts +0 -0
- package/dist/state/matroska.js +0 -1
- package/dist/state/slow-duration-fps.d.ts +0 -11
- package/dist/state/slow-duration-fps.js +0 -86
- package/dist/state/transport-stream/start-offset.d.ts +0 -5
- package/dist/state/transport-stream/start-offset.js +0 -13
- package/dist/state/transport-stream.d.ts +0 -8
- package/dist/state/transport-stream.js +0 -11
- package/dist/state/uml.d.ts +0 -32
- package/dist/state/uml.js +0 -52
- package/dist/state/webm.d.ts +0 -30
- package/dist/state/webm.js +0 -109
- package/dist/state/work-on-seek-request-options.d.ts +0 -3
- package/dist/state/work-on-seek-request-options.js +0 -26
- package/dist/worker.module.d.ts +0 -4
- package/dist/worker.module.js +0 -12
- /package/dist/{seeking-info.js → seeking-hints.js} +0 -0
- /package/dist/worker/{forward-controller.d.ts → forward-controller-to-worker.d.ts} +0 -0
package/dist/esm/index.mjs
CHANGED
|
@@ -1117,6 +1117,40 @@ var detectFileType = (data) => {
|
|
|
1117
1117
|
return { type: "unknown" };
|
|
1118
1118
|
};
|
|
1119
1119
|
|
|
1120
|
+
// src/log.ts
|
|
1121
|
+
var logLevels = ["trace", "verbose", "info", "warn", "error"];
|
|
1122
|
+
var getNumberForLogLevel = (level) => {
|
|
1123
|
+
return logLevels.indexOf(level);
|
|
1124
|
+
};
|
|
1125
|
+
var isEqualOrBelowLogLevel = (currentLevel, level) => {
|
|
1126
|
+
return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
|
|
1127
|
+
};
|
|
1128
|
+
var Log = {
|
|
1129
|
+
trace: (logLevel, ...args) => {
|
|
1130
|
+
if (isEqualOrBelowLogLevel(logLevel, "trace")) {
|
|
1131
|
+
return console.log(...args);
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
verbose: (logLevel, ...args) => {
|
|
1135
|
+
if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
|
|
1136
|
+
return console.log(...args);
|
|
1137
|
+
}
|
|
1138
|
+
},
|
|
1139
|
+
info: (logLevel, ...args) => {
|
|
1140
|
+
if (isEqualOrBelowLogLevel(logLevel, "info")) {
|
|
1141
|
+
return console.log(...args);
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
1144
|
+
warn: (logLevel, ...args) => {
|
|
1145
|
+
if (isEqualOrBelowLogLevel(logLevel, "warn")) {
|
|
1146
|
+
return console.warn(...args);
|
|
1147
|
+
}
|
|
1148
|
+
},
|
|
1149
|
+
error: (...args) => {
|
|
1150
|
+
return console.error(...args);
|
|
1151
|
+
}
|
|
1152
|
+
};
|
|
1153
|
+
|
|
1120
1154
|
// src/iterator/buffer-manager.ts
|
|
1121
1155
|
var bufferManager = ({
|
|
1122
1156
|
initialData,
|
|
@@ -1320,8 +1354,7 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
1320
1354
|
};
|
|
1321
1355
|
const getPaddedFourByteNumber = () => {
|
|
1322
1356
|
let lastInt = 128;
|
|
1323
|
-
while (lastInt = getUint8(), lastInt === 128) {
|
|
1324
|
-
}
|
|
1357
|
+
while (lastInt = getUint8(), lastInt === 128) {}
|
|
1325
1358
|
return lastInt;
|
|
1326
1359
|
};
|
|
1327
1360
|
const getUint32 = () => {
|
|
@@ -1389,11 +1422,11 @@ var getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
1389
1422
|
return (1 << zerosCount) - 1 + suffix;
|
|
1390
1423
|
};
|
|
1391
1424
|
const peekB = (length) => {
|
|
1392
|
-
|
|
1425
|
+
Log.info("info", [...getSlice(length)].map((b) => b.toString(16).padStart(2, "0")));
|
|
1393
1426
|
counter.decrement(length);
|
|
1394
1427
|
};
|
|
1395
1428
|
const peekD = (length) => {
|
|
1396
|
-
|
|
1429
|
+
Log.info("info", [...getSlice(length)].map((b) => b.toString(16).padStart(2, "0")));
|
|
1397
1430
|
counter.decrement(length);
|
|
1398
1431
|
};
|
|
1399
1432
|
const leb128 = () => {
|
|
@@ -1731,40 +1764,6 @@ var parseMvhd = ({
|
|
|
1731
1764
|
};
|
|
1732
1765
|
};
|
|
1733
1766
|
|
|
1734
|
-
// src/log.ts
|
|
1735
|
-
var logLevels = ["trace", "verbose", "info", "warn", "error"];
|
|
1736
|
-
var getNumberForLogLevel = (level) => {
|
|
1737
|
-
return logLevels.indexOf(level);
|
|
1738
|
-
};
|
|
1739
|
-
var isEqualOrBelowLogLevel = (currentLevel, level) => {
|
|
1740
|
-
return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
|
|
1741
|
-
};
|
|
1742
|
-
var Log = {
|
|
1743
|
-
trace: (logLevel, ...args) => {
|
|
1744
|
-
if (isEqualOrBelowLogLevel(logLevel, "trace")) {
|
|
1745
|
-
return console.log(...args);
|
|
1746
|
-
}
|
|
1747
|
-
},
|
|
1748
|
-
verbose: (logLevel, ...args) => {
|
|
1749
|
-
if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
|
|
1750
|
-
return console.log(...args);
|
|
1751
|
-
}
|
|
1752
|
-
},
|
|
1753
|
-
info: (logLevel, ...args) => {
|
|
1754
|
-
if (isEqualOrBelowLogLevel(logLevel, "info")) {
|
|
1755
|
-
return console.log(...args);
|
|
1756
|
-
}
|
|
1757
|
-
},
|
|
1758
|
-
warn: (logLevel, ...args) => {
|
|
1759
|
-
if (isEqualOrBelowLogLevel(logLevel, "warn")) {
|
|
1760
|
-
return console.warn(...args);
|
|
1761
|
-
}
|
|
1762
|
-
},
|
|
1763
|
-
error: (...args) => {
|
|
1764
|
-
return console.error(...args);
|
|
1765
|
-
}
|
|
1766
|
-
};
|
|
1767
|
-
|
|
1768
1767
|
// src/containers/avc/codec-string.ts
|
|
1769
1768
|
var getCodecStringFromSpsAndPps = (sps) => {
|
|
1770
1769
|
return `avc1.${sps.spsData.profile.toString(16).padStart(2, "0")}${sps.spsData.compatibility.toString(16).padStart(2, "0")}${sps.spsData.level.toString(16).padStart(2, "0")}`;
|
|
@@ -2038,6 +2037,29 @@ var parseEsds = ({
|
|
|
2038
2037
|
};
|
|
2039
2038
|
};
|
|
2040
2039
|
|
|
2040
|
+
// src/state/iso-base-media/precomputed-moof.ts
|
|
2041
|
+
var precomputedMoofState = () => {
|
|
2042
|
+
let moofBoxes = [];
|
|
2043
|
+
return {
|
|
2044
|
+
getMoofBoxes: () => moofBoxes,
|
|
2045
|
+
setMoofBoxes: (boxes) => {
|
|
2046
|
+
moofBoxes = boxes;
|
|
2047
|
+
}
|
|
2048
|
+
};
|
|
2049
|
+
};
|
|
2050
|
+
var toMoofBox = (box) => {
|
|
2051
|
+
if (box.type !== "regular-box") {
|
|
2052
|
+
throw new Error("expected regular bpx");
|
|
2053
|
+
}
|
|
2054
|
+
return {
|
|
2055
|
+
offset: box.offset,
|
|
2056
|
+
trafBoxes: box.children.filter((c) => c.type === "regular-box" && c.boxType === "traf")
|
|
2057
|
+
};
|
|
2058
|
+
};
|
|
2059
|
+
var deduplicateMoofBoxesByOffset = (moofBoxes) => {
|
|
2060
|
+
return moofBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
|
|
2061
|
+
};
|
|
2062
|
+
|
|
2041
2063
|
// src/containers/iso-base-media/traversal.ts
|
|
2042
2064
|
var getMoovFromFromIsoStructure = (structure) => {
|
|
2043
2065
|
const moovBox = structure.boxes.find((s) => s.type === "moov-box");
|
|
@@ -2049,11 +2071,12 @@ var getMoovFromFromIsoStructure = (structure) => {
|
|
|
2049
2071
|
var getMoovBoxFromState = ({
|
|
2050
2072
|
structureState,
|
|
2051
2073
|
isoState,
|
|
2052
|
-
mp4HeaderSegment
|
|
2074
|
+
mp4HeaderSegment,
|
|
2075
|
+
mayUsePrecomputed
|
|
2053
2076
|
}) => {
|
|
2054
|
-
const got = isoState.moov.
|
|
2055
|
-
if (got) {
|
|
2056
|
-
return got;
|
|
2077
|
+
const got = isoState.moov.getMoovBoxAndPrecomputed();
|
|
2078
|
+
if (got && (mayUsePrecomputed || !got.precomputed)) {
|
|
2079
|
+
return got.moovBox;
|
|
2057
2080
|
}
|
|
2058
2081
|
if (mp4HeaderSegment) {
|
|
2059
2082
|
return getMoovFromFromIsoStructure(mp4HeaderSegment);
|
|
@@ -2063,7 +2086,7 @@ var getMoovBoxFromState = ({
|
|
|
2063
2086
|
};
|
|
2064
2087
|
var getMoofBoxes = (main) => {
|
|
2065
2088
|
const moofBoxes = main.filter((s) => s.type === "regular-box" && s.boxType === "moof");
|
|
2066
|
-
return moofBoxes;
|
|
2089
|
+
return moofBoxes.map((m) => toMoofBox(m));
|
|
2067
2090
|
};
|
|
2068
2091
|
var getMvhdBox = (moovBox) => {
|
|
2069
2092
|
const mvHdBox = moovBox.children.find((s) => s.type === "mvhd-box");
|
|
@@ -2335,7 +2358,8 @@ var getFpsFromIsoMaseMedia = (state) => {
|
|
|
2335
2358
|
const moovBox = getMoovBoxFromState({
|
|
2336
2359
|
structureState: state.structure,
|
|
2337
2360
|
isoState: state.iso,
|
|
2338
|
-
mp4HeaderSegment: state.mp4HeaderSegment
|
|
2361
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
2362
|
+
mayUsePrecomputed: true
|
|
2339
2363
|
});
|
|
2340
2364
|
if (!moovBox) {
|
|
2341
2365
|
return null;
|
|
@@ -3270,14 +3294,15 @@ var matroskaHasTracks = ({
|
|
|
3270
3294
|
};
|
|
3271
3295
|
|
|
3272
3296
|
// src/get-tracks.ts
|
|
3273
|
-
var isoBaseMediaHasTracks = (state) => {
|
|
3297
|
+
var isoBaseMediaHasTracks = (state, mayUsePrecomputed) => {
|
|
3274
3298
|
return Boolean(getMoovBoxFromState({
|
|
3275
3299
|
structureState: state.structure,
|
|
3276
3300
|
isoState: state.iso,
|
|
3277
|
-
mp4HeaderSegment: state.mp4HeaderSegment
|
|
3301
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
3302
|
+
mayUsePrecomputed
|
|
3278
3303
|
}));
|
|
3279
3304
|
};
|
|
3280
|
-
var getHasTracks = (state) => {
|
|
3305
|
+
var getHasTracks = (state, mayUsePrecomputed) => {
|
|
3281
3306
|
const structure = state.structure.getStructure();
|
|
3282
3307
|
if (structure.type === "matroska") {
|
|
3283
3308
|
return matroskaHasTracks({
|
|
@@ -3286,7 +3311,7 @@ var getHasTracks = (state) => {
|
|
|
3286
3311
|
});
|
|
3287
3312
|
}
|
|
3288
3313
|
if (structure.type === "iso-base-media") {
|
|
3289
|
-
return isoBaseMediaHasTracks(state);
|
|
3314
|
+
return isoBaseMediaHasTracks(state, mayUsePrecomputed);
|
|
3290
3315
|
}
|
|
3291
3316
|
if (structure.type === "riff") {
|
|
3292
3317
|
return hasAllTracksFromAvi(state);
|
|
@@ -3358,11 +3383,12 @@ var getTracksFromMoovBox = (moovBox) => {
|
|
|
3358
3383
|
otherTracks
|
|
3359
3384
|
};
|
|
3360
3385
|
};
|
|
3361
|
-
var getTracksFromIsoBaseMedia = (state) => {
|
|
3386
|
+
var getTracksFromIsoBaseMedia = (state, mayUsePrecomputed) => {
|
|
3362
3387
|
const moovBox = getMoovBoxFromState({
|
|
3363
3388
|
structureState: state.structure,
|
|
3364
3389
|
isoState: state.iso,
|
|
3365
|
-
mp4HeaderSegment: state.mp4HeaderSegment
|
|
3390
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
3391
|
+
mayUsePrecomputed
|
|
3366
3392
|
});
|
|
3367
3393
|
if (!moovBox) {
|
|
3368
3394
|
return {
|
|
@@ -3384,13 +3410,13 @@ var defaultGetTracks = (parserState) => {
|
|
|
3384
3410
|
videoTracks: tracks2.filter((t) => t.type === "video")
|
|
3385
3411
|
};
|
|
3386
3412
|
};
|
|
3387
|
-
var getTracks = (state) => {
|
|
3413
|
+
var getTracks = (state, mayUsePrecomputed) => {
|
|
3388
3414
|
const structure = state.structure.getStructure();
|
|
3389
3415
|
if (structure.type === "matroska") {
|
|
3390
3416
|
return getCategorizedTracksFromMatroska(state);
|
|
3391
3417
|
}
|
|
3392
3418
|
if (structure.type === "iso-base-media") {
|
|
3393
|
-
return getTracksFromIsoBaseMedia(state);
|
|
3419
|
+
return getTracksFromIsoBaseMedia(state, mayUsePrecomputed);
|
|
3394
3420
|
}
|
|
3395
3421
|
if (structure.type === "riff") {
|
|
3396
3422
|
return getTracksFromAvi(structure, state);
|
|
@@ -3406,7 +3432,7 @@ var getTracks = (state) => {
|
|
|
3406
3432
|
|
|
3407
3433
|
// src/get-audio-codec.ts
|
|
3408
3434
|
var getAudioCodec = (parserState) => {
|
|
3409
|
-
const tracks2 = getTracks(parserState);
|
|
3435
|
+
const tracks2 = getTracks(parserState, true);
|
|
3410
3436
|
const allTracks = tracks2.audioTracks.length + tracks2.otherTracks.length + tracks2.videoTracks.length;
|
|
3411
3437
|
if (allTracks === 0) {
|
|
3412
3438
|
throw new Error("No tracks yet");
|
|
@@ -3421,7 +3447,7 @@ var getAudioCodec = (parserState) => {
|
|
|
3421
3447
|
return null;
|
|
3422
3448
|
};
|
|
3423
3449
|
var hasAudioCodec = (state) => {
|
|
3424
|
-
return getHasTracks(state);
|
|
3450
|
+
return getHasTracks(state, true);
|
|
3425
3451
|
};
|
|
3426
3452
|
var getCodecSpecificatorFromEsdsBox = ({
|
|
3427
3453
|
child
|
|
@@ -3753,11 +3779,11 @@ var getPrimariesFromIndex = (index) => {
|
|
|
3753
3779
|
|
|
3754
3780
|
// src/get-video-codec.ts
|
|
3755
3781
|
var getVideoCodec = (state) => {
|
|
3756
|
-
const track = getTracks(state);
|
|
3782
|
+
const track = getTracks(state, true);
|
|
3757
3783
|
return track.videoTracks[0]?.codecWithoutConfig ?? null;
|
|
3758
3784
|
};
|
|
3759
3785
|
var hasVideoCodec = (state) => {
|
|
3760
|
-
return getHasTracks(state);
|
|
3786
|
+
return getHasTracks(state, true);
|
|
3761
3787
|
};
|
|
3762
3788
|
var getVideoPrivateData = (trakBox) => {
|
|
3763
3789
|
const videoSample = getStsdVideoConfig(trakBox);
|
|
@@ -5122,7 +5148,7 @@ var processBox = async ({
|
|
|
5122
5148
|
iterator.discard(boxSize - 8);
|
|
5123
5149
|
return null;
|
|
5124
5150
|
}
|
|
5125
|
-
if (isoState && isoState.moov.
|
|
5151
|
+
if (isoState && isoState.moov.getMoovBoxAndPrecomputed() && !isoState.moov.getMoovBoxAndPrecomputed()?.precomputed) {
|
|
5126
5152
|
Log.verbose(logLevel, "Moov box already parsed, skipping");
|
|
5127
5153
|
iterator.discard(boxSize - 8);
|
|
5128
5154
|
return null;
|
|
@@ -6376,6 +6402,19 @@ var mediaParserController = () => {
|
|
|
6376
6402
|
}
|
|
6377
6403
|
await pauseSignal.waitUntilResume();
|
|
6378
6404
|
};
|
|
6405
|
+
let seekingHintResolution = null;
|
|
6406
|
+
const getSeekingHints = () => {
|
|
6407
|
+
if (!seekingHintResolution) {
|
|
6408
|
+
throw new Error("The mediaParserController() was not yet used in a parseMedia() call");
|
|
6409
|
+
}
|
|
6410
|
+
return seekingHintResolution();
|
|
6411
|
+
};
|
|
6412
|
+
const attachSeekingHintResolution = (callback) => {
|
|
6413
|
+
if (seekingHintResolution) {
|
|
6414
|
+
throw new Error("The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.");
|
|
6415
|
+
}
|
|
6416
|
+
seekingHintResolution = callback;
|
|
6417
|
+
};
|
|
6379
6418
|
return {
|
|
6380
6419
|
abort: (reason) => {
|
|
6381
6420
|
abortController.abort(reason);
|
|
@@ -6386,12 +6425,14 @@ var mediaParserController = () => {
|
|
|
6386
6425
|
resume: pauseSignal.resume,
|
|
6387
6426
|
addEventListener: emitter.addEventListener,
|
|
6388
6427
|
removeEventListener: emitter.removeEventListener,
|
|
6428
|
+
getSeekingHints,
|
|
6389
6429
|
_internals: {
|
|
6390
6430
|
signal: abortController.signal,
|
|
6391
6431
|
checkForAbortAndPause,
|
|
6392
6432
|
seekSignal,
|
|
6393
6433
|
markAsReadyToEmitEvents: emitter.markAsReady,
|
|
6394
|
-
performedSeeksSignal
|
|
6434
|
+
performedSeeksSignal,
|
|
6435
|
+
attachSeekingHintResolution
|
|
6395
6436
|
}
|
|
6396
6437
|
};
|
|
6397
6438
|
};
|
|
@@ -6521,7 +6562,7 @@ var getDimensions = (state) => {
|
|
|
6521
6562
|
if (structure && isAudioStructure(structure)) {
|
|
6522
6563
|
return null;
|
|
6523
6564
|
}
|
|
6524
|
-
const { videoTracks } = getTracks(state);
|
|
6565
|
+
const { videoTracks } = getTracks(state, true);
|
|
6525
6566
|
if (!videoTracks.length) {
|
|
6526
6567
|
return null;
|
|
6527
6568
|
}
|
|
@@ -6614,13 +6655,12 @@ var getSamplesFromMoof = ({
|
|
|
6614
6655
|
moofBox,
|
|
6615
6656
|
trackId
|
|
6616
6657
|
}) => {
|
|
6617
|
-
|
|
6618
|
-
throw new Error("Expected moof-box");
|
|
6619
|
-
}
|
|
6620
|
-
const trafs = moofBox.children.filter((c) => c.type === "regular-box" && c.boxType === "traf");
|
|
6621
|
-
const mapped = trafs.map((traf) => {
|
|
6658
|
+
const mapped = moofBox.trafBoxes.map((traf) => {
|
|
6622
6659
|
const tfhdBox = getTfhdBox(traf);
|
|
6623
|
-
|
|
6660
|
+
if (!tfhdBox || tfhdBox.trackId !== trackId) {
|
|
6661
|
+
return [];
|
|
6662
|
+
}
|
|
6663
|
+
return getSamplesFromTraf(traf, moofBox.offset);
|
|
6624
6664
|
});
|
|
6625
6665
|
return mapped.flat(1);
|
|
6626
6666
|
};
|
|
@@ -6632,10 +6672,13 @@ var collectSamplePositionsFromMoofBoxes = ({
|
|
|
6632
6672
|
tkhdBox
|
|
6633
6673
|
}) => {
|
|
6634
6674
|
const isComplete = tfraBoxes.length > 0 && tfraBoxes.every((t) => t.entries.length === moofBoxes.length);
|
|
6635
|
-
const
|
|
6636
|
-
return getSamplesFromMoof({
|
|
6675
|
+
const samplePositions = moofBoxes.map((m) => {
|
|
6676
|
+
return getSamplesFromMoof({
|
|
6677
|
+
moofBox: m,
|
|
6678
|
+
trackId: tkhdBox.trackId
|
|
6679
|
+
});
|
|
6637
6680
|
});
|
|
6638
|
-
return { samplePositions
|
|
6681
|
+
return { samplePositions, isComplete };
|
|
6639
6682
|
};
|
|
6640
6683
|
|
|
6641
6684
|
// src/get-sample-positions.ts
|
|
@@ -7003,7 +7046,8 @@ var getDurationFromIsoBaseMedia = (parserState) => {
|
|
|
7003
7046
|
const moovBox = getMoovBoxFromState({
|
|
7004
7047
|
structureState: parserState.structure,
|
|
7005
7048
|
isoState: parserState.iso,
|
|
7006
|
-
mp4HeaderSegment: parserState.mp4HeaderSegment
|
|
7049
|
+
mp4HeaderSegment: parserState.mp4HeaderSegment,
|
|
7050
|
+
mayUsePrecomputed: true
|
|
7007
7051
|
});
|
|
7008
7052
|
if (!moovBox) {
|
|
7009
7053
|
return null;
|
|
@@ -7020,7 +7064,7 @@ var getDurationFromIsoBaseMedia = (parserState) => {
|
|
|
7020
7064
|
if (mvhdBox.durationInSeconds > 0) {
|
|
7021
7065
|
return mvhdBox.durationInSeconds;
|
|
7022
7066
|
}
|
|
7023
|
-
const tracks2 = getTracks(parserState);
|
|
7067
|
+
const tracks2 = getTracks(parserState, true);
|
|
7024
7068
|
const allTracks = [
|
|
7025
7069
|
...tracks2.videoTracks,
|
|
7026
7070
|
...tracks2.audioTracks,
|
|
@@ -7084,7 +7128,7 @@ var hasDuration = (parserState) => {
|
|
|
7084
7128
|
if (structure === null) {
|
|
7085
7129
|
return false;
|
|
7086
7130
|
}
|
|
7087
|
-
return getHasTracks(parserState);
|
|
7131
|
+
return getHasTracks(parserState, true);
|
|
7088
7132
|
};
|
|
7089
7133
|
var hasSlowDuration = (parserState) => {
|
|
7090
7134
|
try {
|
|
@@ -7099,16 +7143,16 @@ var isVideoTrackHdr = (track) => {
|
|
|
7099
7143
|
return track.color.matrixCoefficients === "bt2020" && track.color.transferCharacteristics === "arib-std-b67" && track.color.primaries === "bt2020";
|
|
7100
7144
|
};
|
|
7101
7145
|
var getIsHdr = (state) => {
|
|
7102
|
-
const { videoTracks } = getTracks(state);
|
|
7146
|
+
const { videoTracks } = getTracks(state, true);
|
|
7103
7147
|
return videoTracks.some((track) => isVideoTrackHdr(track));
|
|
7104
7148
|
};
|
|
7105
7149
|
var hasHdr = (state) => {
|
|
7106
|
-
return getHasTracks(state);
|
|
7150
|
+
return getHasTracks(state, true);
|
|
7107
7151
|
};
|
|
7108
7152
|
|
|
7109
7153
|
// src/containers/iso-base-media/get-keyframes.ts
|
|
7110
7154
|
var getKeyframesFromIsoBaseMedia = (state) => {
|
|
7111
|
-
const { videoTracks } = getTracksFromIsoBaseMedia(state);
|
|
7155
|
+
const { videoTracks } = getTracksFromIsoBaseMedia(state, true);
|
|
7112
7156
|
const structure = state.structure.getIsoStructure();
|
|
7113
7157
|
const moofBoxes = getMoofBoxes(structure.boxes);
|
|
7114
7158
|
const tfraBoxes = getTfraBoxes(structure);
|
|
@@ -7149,7 +7193,7 @@ var getKeyframes = (state) => {
|
|
|
7149
7193
|
var hasKeyframes = (parserState) => {
|
|
7150
7194
|
const structure = parserState.structure.getStructure();
|
|
7151
7195
|
if (structure.type === "iso-base-media") {
|
|
7152
|
-
return getHasTracks(parserState);
|
|
7196
|
+
return getHasTracks(parserState, true);
|
|
7153
7197
|
}
|
|
7154
7198
|
return true;
|
|
7155
7199
|
};
|
|
@@ -7262,7 +7306,8 @@ var getMetadataFromIsoBase = (state) => {
|
|
|
7262
7306
|
const moov = getMoovBoxFromState({
|
|
7263
7307
|
structureState: state.structure,
|
|
7264
7308
|
isoState: state.iso,
|
|
7265
|
-
mp4HeaderSegment: state.mp4HeaderSegment
|
|
7309
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
7310
|
+
mayUsePrecomputed: true
|
|
7266
7311
|
});
|
|
7267
7312
|
if (!moov) {
|
|
7268
7313
|
return [];
|
|
@@ -7615,13 +7660,15 @@ var findBestSegmentFromTfra = ({
|
|
|
7615
7660
|
};
|
|
7616
7661
|
};
|
|
7617
7662
|
|
|
7618
|
-
// src/containers/iso-base-media/get-seeking-
|
|
7663
|
+
// src/containers/iso-base-media/get-seeking-byte.ts
|
|
7619
7664
|
var getSeekingByteFromIsoBaseMedia = async ({
|
|
7620
7665
|
info,
|
|
7621
7666
|
time,
|
|
7622
7667
|
logLevel,
|
|
7623
7668
|
currentPosition,
|
|
7624
|
-
isoState
|
|
7669
|
+
isoState,
|
|
7670
|
+
mp4HeaderSegment,
|
|
7671
|
+
structure
|
|
7625
7672
|
}) => {
|
|
7626
7673
|
const tracks2 = getTracksFromMoovBox(info.moovBox);
|
|
7627
7674
|
const allTracks = [
|
|
@@ -7629,6 +7676,18 @@ var getSeekingByteFromIsoBaseMedia = async ({
|
|
|
7629
7676
|
...tracks2.audioTracks,
|
|
7630
7677
|
...tracks2.otherTracks
|
|
7631
7678
|
];
|
|
7679
|
+
const hasMoov = Boolean(getMoovBoxFromState({
|
|
7680
|
+
mp4HeaderSegment,
|
|
7681
|
+
structureState: structure,
|
|
7682
|
+
isoState,
|
|
7683
|
+
mayUsePrecomputed: false
|
|
7684
|
+
}));
|
|
7685
|
+
if (!hasMoov) {
|
|
7686
|
+
Log.trace(logLevel, "No moov box found, must wait");
|
|
7687
|
+
return {
|
|
7688
|
+
type: "valid-but-must-wait"
|
|
7689
|
+
};
|
|
7690
|
+
}
|
|
7632
7691
|
const firstVideoTrack = allTracks.find((t) => t.type === "video");
|
|
7633
7692
|
if (!firstVideoTrack) {
|
|
7634
7693
|
throw new Error("No video track found");
|
|
@@ -7664,7 +7723,7 @@ var getSeekingByteFromIsoBaseMedia = async ({
|
|
|
7664
7723
|
}
|
|
7665
7724
|
}
|
|
7666
7725
|
}
|
|
7667
|
-
const atom = await isoState.mfra.triggerLoad();
|
|
7726
|
+
const atom = await (info.mfraAlreadyLoaded ? Promise.resolve(info.mfraAlreadyLoaded) : isoState.mfra.triggerLoad());
|
|
7668
7727
|
if (atom) {
|
|
7669
7728
|
const moofOffset = findBestSegmentFromTfra({
|
|
7670
7729
|
mfra: atom,
|
|
@@ -7735,12 +7794,12 @@ var getSeekingByteFromWav = ({
|
|
|
7735
7794
|
time
|
|
7736
7795
|
}) => {
|
|
7737
7796
|
const bytesPerSecond = info.sampleRate * info.blockAlign;
|
|
7738
|
-
const durationInSeconds = info.
|
|
7797
|
+
const durationInSeconds = info.mediaSection.size / bytesPerSecond;
|
|
7739
7798
|
const timeRoundedDown = Math.floor(Math.min(time, durationInSeconds - 0.0000001) * WAVE_SAMPLES_PER_SECOND) / WAVE_SAMPLES_PER_SECOND;
|
|
7740
7799
|
const byteOffset = bytesPerSecond * timeRoundedDown;
|
|
7741
7800
|
return Promise.resolve({
|
|
7742
7801
|
type: "do-seek",
|
|
7743
|
-
byte: byteOffset + info.
|
|
7802
|
+
byte: byteOffset + info.mediaSection.start
|
|
7744
7803
|
});
|
|
7745
7804
|
};
|
|
7746
7805
|
|
|
@@ -7801,8 +7860,7 @@ var getSeekingByteFromMatroska = async ({
|
|
|
7801
7860
|
webmState,
|
|
7802
7861
|
info,
|
|
7803
7862
|
logLevel,
|
|
7804
|
-
mediaSection
|
|
7805
|
-
keyframes
|
|
7863
|
+
mediaSection
|
|
7806
7864
|
}) => {
|
|
7807
7865
|
if (!info.track) {
|
|
7808
7866
|
Log.trace(logLevel, "No video track found, cannot seek yet");
|
|
@@ -7810,9 +7868,9 @@ var getSeekingByteFromMatroska = async ({
|
|
|
7810
7868
|
type: "valid-but-must-wait"
|
|
7811
7869
|
};
|
|
7812
7870
|
}
|
|
7813
|
-
const cuesResponse = await webmState.cues.getLoadedCues();
|
|
7871
|
+
const cuesResponse = info.loadedCues ?? await webmState.cues.getLoadedCues();
|
|
7814
7872
|
const byteFromObservedKeyframe = findKeyframeBeforeTime2({
|
|
7815
|
-
keyframes: keyframes
|
|
7873
|
+
keyframes: info.keyframes,
|
|
7816
7874
|
time
|
|
7817
7875
|
});
|
|
7818
7876
|
const byteFromCues = getByteFromCues({
|
|
@@ -7948,7 +8006,10 @@ var handleAvcPacket = async ({
|
|
|
7948
8006
|
const dimensions = getDimensionsFromSps(spsAndPps.sps.spsData);
|
|
7949
8007
|
const sampleAspectRatio = getSampleAspectRatioFromSps(spsAndPps.sps.spsData);
|
|
7950
8008
|
const startOffset = makeSamplesStartAtZero ? Math.min(streamBuffer.pesHeader.pts, streamBuffer.pesHeader.dts ?? Infinity) : 0;
|
|
7951
|
-
transportStream.startOffset.setOffset(
|
|
8009
|
+
transportStream.startOffset.setOffset({
|
|
8010
|
+
trackId: programId,
|
|
8011
|
+
newOffset: startOffset
|
|
8012
|
+
});
|
|
7952
8013
|
const track = {
|
|
7953
8014
|
m3uStreamFormat: null,
|
|
7954
8015
|
rotation: 0,
|
|
@@ -8012,20 +8073,30 @@ var handleAvcPacket = async ({
|
|
|
8012
8073
|
var makeObservedPesHeader = () => {
|
|
8013
8074
|
const pesHeaders = [];
|
|
8014
8075
|
const confirmedAsKeyframe = [];
|
|
8076
|
+
const addPesHeader = (pesHeader) => {
|
|
8077
|
+
if (pesHeaders.find((p) => p.offset === pesHeader.offset)) {
|
|
8078
|
+
return;
|
|
8079
|
+
}
|
|
8080
|
+
pesHeaders.push(pesHeader);
|
|
8081
|
+
};
|
|
8082
|
+
const markPtsAsKeyframe = (pts) => {
|
|
8083
|
+
confirmedAsKeyframe.push(pts);
|
|
8084
|
+
};
|
|
8085
|
+
const getPesKeyframeHeaders = () => {
|
|
8086
|
+
return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
|
|
8087
|
+
};
|
|
8088
|
+
const setPesKeyframesFromSeekingHints = (hints) => {
|
|
8089
|
+
for (const pesHeader of hints.observedPesHeaders) {
|
|
8090
|
+
addPesHeader(pesHeader);
|
|
8091
|
+
markPtsAsKeyframe(pesHeader.pts);
|
|
8092
|
+
}
|
|
8093
|
+
};
|
|
8015
8094
|
const state = {
|
|
8016
8095
|
pesHeaders,
|
|
8017
|
-
addPesHeader
|
|
8018
|
-
|
|
8019
|
-
|
|
8020
|
-
|
|
8021
|
-
pesHeaders.push(pesHeader);
|
|
8022
|
-
},
|
|
8023
|
-
markPtsAsKeyframe: (pts) => {
|
|
8024
|
-
confirmedAsKeyframe.push(pts);
|
|
8025
|
-
},
|
|
8026
|
-
getPesKeyframeHeaders: () => {
|
|
8027
|
-
return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
|
|
8028
|
-
}
|
|
8096
|
+
addPesHeader,
|
|
8097
|
+
markPtsAsKeyframe,
|
|
8098
|
+
getPesKeyframeHeaders,
|
|
8099
|
+
setPesKeyframesFromSeekingHints
|
|
8029
8100
|
};
|
|
8030
8101
|
return state;
|
|
8031
8102
|
};
|
|
@@ -8047,34 +8118,36 @@ var getSeekingByte = ({
|
|
|
8047
8118
|
transportStream,
|
|
8048
8119
|
webmState,
|
|
8049
8120
|
mediaSection,
|
|
8050
|
-
|
|
8121
|
+
mp4HeaderSegment,
|
|
8122
|
+
structure
|
|
8051
8123
|
}) => {
|
|
8052
|
-
if (info.type === "iso-base-media-seeking-
|
|
8124
|
+
if (info.type === "iso-base-media-seeking-hints") {
|
|
8053
8125
|
return getSeekingByteFromIsoBaseMedia({
|
|
8054
8126
|
info,
|
|
8055
8127
|
time,
|
|
8056
8128
|
logLevel,
|
|
8057
8129
|
currentPosition,
|
|
8058
|
-
isoState
|
|
8130
|
+
isoState,
|
|
8131
|
+
mp4HeaderSegment,
|
|
8132
|
+
structure
|
|
8059
8133
|
});
|
|
8060
8134
|
}
|
|
8061
|
-
if (info.type === "wav-seeking-
|
|
8135
|
+
if (info.type === "wav-seeking-hints") {
|
|
8062
8136
|
return getSeekingByteFromWav({
|
|
8063
8137
|
info,
|
|
8064
8138
|
time
|
|
8065
8139
|
});
|
|
8066
8140
|
}
|
|
8067
|
-
if (info.type === "webm-seeking-
|
|
8141
|
+
if (info.type === "webm-seeking-hints") {
|
|
8068
8142
|
return getSeekingByteFromMatroska({
|
|
8069
8143
|
info,
|
|
8070
8144
|
time,
|
|
8071
8145
|
webmState,
|
|
8072
8146
|
logLevel,
|
|
8073
|
-
mediaSection
|
|
8074
|
-
keyframes
|
|
8147
|
+
mediaSection
|
|
8075
8148
|
});
|
|
8076
8149
|
}
|
|
8077
|
-
if (info.type === "transport-stream-seeking-
|
|
8150
|
+
if (info.type === "transport-stream-seeking-hints") {
|
|
8078
8151
|
const lastKeyframeBeforeTimeInSeconds = getLastKeyFrameBeforeTimeInSeconds({
|
|
8079
8152
|
observedPesHeaders: info.observedPesHeaders,
|
|
8080
8153
|
timeInSeconds: time,
|
|
@@ -8090,8 +8163,22 @@ var getSeekingByte = ({
|
|
|
8090
8163
|
throw new Error(`Unknown seeking info type: ${info}`);
|
|
8091
8164
|
};
|
|
8092
8165
|
|
|
8093
|
-
// src/
|
|
8094
|
-
var
|
|
8166
|
+
// src/state/iso-base-media/precomputed-tfra.ts
|
|
8167
|
+
var precomputedTfraState = () => {
|
|
8168
|
+
let tfraBoxes = [];
|
|
8169
|
+
return {
|
|
8170
|
+
getTfraBoxes: () => tfraBoxes,
|
|
8171
|
+
setTfraBoxes: (boxes) => {
|
|
8172
|
+
tfraBoxes = boxes;
|
|
8173
|
+
}
|
|
8174
|
+
};
|
|
8175
|
+
};
|
|
8176
|
+
var deduplicateTfraBoxesByOffset = (tfraBoxes) => {
|
|
8177
|
+
return tfraBoxes.filter((m, i, arr) => i === arr.findIndex((t) => t.offset === m.offset));
|
|
8178
|
+
};
|
|
8179
|
+
|
|
8180
|
+
// src/containers/iso-base-media/seeking-hints.ts
|
|
8181
|
+
var getSeekingHintsFromMp4 = ({
|
|
8095
8182
|
structureState,
|
|
8096
8183
|
isoState,
|
|
8097
8184
|
mp4HeaderSegment,
|
|
@@ -8101,37 +8188,65 @@ var getSeekingInfoFromMp4 = ({
|
|
|
8101
8188
|
const moovAtom = getMoovBoxFromState({
|
|
8102
8189
|
isoState,
|
|
8103
8190
|
mp4HeaderSegment,
|
|
8104
|
-
structureState
|
|
8191
|
+
structureState,
|
|
8192
|
+
mayUsePrecomputed: true
|
|
8105
8193
|
});
|
|
8106
|
-
const moofBoxes =
|
|
8107
|
-
|
|
8194
|
+
const moofBoxes = deduplicateMoofBoxesByOffset([
|
|
8195
|
+
...isoState.moof.getMoofBoxes(),
|
|
8196
|
+
...getMoofBoxes(structure.boxes)
|
|
8197
|
+
]);
|
|
8198
|
+
const tfraBoxes = deduplicateTfraBoxesByOffset([
|
|
8199
|
+
...isoState.tfra.getTfraBoxes(),
|
|
8200
|
+
...getTfraBoxes(structure)
|
|
8201
|
+
]);
|
|
8108
8202
|
if (!moovAtom) {
|
|
8109
8203
|
return null;
|
|
8110
8204
|
}
|
|
8111
8205
|
return {
|
|
8112
|
-
type: "iso-base-media-seeking-
|
|
8206
|
+
type: "iso-base-media-seeking-hints",
|
|
8113
8207
|
moovBox: moovAtom,
|
|
8114
8208
|
moofBoxes,
|
|
8115
8209
|
tfraBoxes,
|
|
8116
|
-
mediaSections: mediaSectionState2.getMediaSections()
|
|
8210
|
+
mediaSections: mediaSectionState2.getMediaSections(),
|
|
8211
|
+
mfraAlreadyLoaded: isoState.mfra.getIfAlreadyLoaded()
|
|
8117
8212
|
};
|
|
8118
8213
|
};
|
|
8214
|
+
var setSeekingHintsForMp4 = ({
|
|
8215
|
+
hints,
|
|
8216
|
+
state
|
|
8217
|
+
}) => {
|
|
8218
|
+
state.iso.moov.setMoovBox({
|
|
8219
|
+
moovBox: hints.moovBox,
|
|
8220
|
+
precomputed: true
|
|
8221
|
+
});
|
|
8222
|
+
};
|
|
8119
8223
|
|
|
8120
|
-
// src/containers/transport-stream/
|
|
8121
|
-
var
|
|
8224
|
+
// src/containers/transport-stream/seeking-hints.ts
|
|
8225
|
+
var getSeekingHintsFromTransportStream = (transportStream, tracksState) => {
|
|
8122
8226
|
const firstVideoTrack = tracksState.getTracks().find((t) => t.type === "video");
|
|
8123
8227
|
if (!firstVideoTrack) {
|
|
8124
|
-
|
|
8228
|
+
return null;
|
|
8125
8229
|
}
|
|
8126
8230
|
return {
|
|
8127
|
-
type: "transport-stream-seeking-
|
|
8231
|
+
type: "transport-stream-seeking-hints",
|
|
8128
8232
|
observedPesHeaders: transportStream.observedPesHeaders.getPesKeyframeHeaders(),
|
|
8129
|
-
ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId)
|
|
8233
|
+
ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId),
|
|
8234
|
+
firstVideoTrackId: firstVideoTrack.trackId
|
|
8130
8235
|
};
|
|
8131
8236
|
};
|
|
8237
|
+
var setSeekingHintsForTransportStream = ({
|
|
8238
|
+
hints,
|
|
8239
|
+
state
|
|
8240
|
+
}) => {
|
|
8241
|
+
state.transportStream.observedPesHeaders.setPesKeyframesFromSeekingHints(hints);
|
|
8242
|
+
state.transportStream.startOffset.setOffset({
|
|
8243
|
+
trackId: hints.firstVideoTrackId,
|
|
8244
|
+
newOffset: hints.ptsStartOffset
|
|
8245
|
+
});
|
|
8246
|
+
};
|
|
8132
8247
|
|
|
8133
|
-
// src/containers/wav/
|
|
8134
|
-
var
|
|
8248
|
+
// src/containers/wav/seeking-hints.ts
|
|
8249
|
+
var getSeekingHintsFromWav = ({
|
|
8135
8250
|
structure,
|
|
8136
8251
|
mediaSectionState: mediaSectionState2
|
|
8137
8252
|
}) => {
|
|
@@ -8144,41 +8259,62 @@ var getSeekingInfoFromWav = ({
|
|
|
8144
8259
|
return null;
|
|
8145
8260
|
}
|
|
8146
8261
|
return {
|
|
8147
|
-
type: "wav-seeking-
|
|
8262
|
+
type: "wav-seeking-hints",
|
|
8148
8263
|
sampleRate: fmtBox.sampleRate,
|
|
8149
8264
|
blockAlign: fmtBox.blockAlign,
|
|
8150
|
-
|
|
8265
|
+
mediaSection: mediaSection[0]
|
|
8151
8266
|
};
|
|
8152
8267
|
};
|
|
8268
|
+
var setSeekingHintsForWav = ({
|
|
8269
|
+
hints,
|
|
8270
|
+
state
|
|
8271
|
+
}) => {
|
|
8272
|
+
state.mediaSection.addMediaSection(hints.mediaSection);
|
|
8273
|
+
};
|
|
8153
8274
|
|
|
8154
|
-
// src/containers/webm/seek/
|
|
8155
|
-
var
|
|
8275
|
+
// src/containers/webm/seek/seeking-hints.ts
|
|
8276
|
+
var getSeekingHintsFromMatroska = (tracksState, keyframesState, webmState) => {
|
|
8156
8277
|
const tracks2 = tracksState.getTracks();
|
|
8157
8278
|
const firstVideoTrack = tracks2.find((track) => track.type === "video");
|
|
8279
|
+
const keyframes = keyframesState.getKeyframes();
|
|
8280
|
+
const loadedCues = webmState.cues.getIfAlreadyLoaded();
|
|
8158
8281
|
return {
|
|
8159
|
-
type: "webm-seeking-
|
|
8282
|
+
type: "webm-seeking-hints",
|
|
8160
8283
|
track: firstVideoTrack ? {
|
|
8161
8284
|
timescale: firstVideoTrack.timescale,
|
|
8162
8285
|
trackId: firstVideoTrack.trackId
|
|
8163
|
-
} : null
|
|
8286
|
+
} : null,
|
|
8287
|
+
keyframes,
|
|
8288
|
+
loadedCues,
|
|
8289
|
+
timestampMap: webmState.getTimeStampMapForSeekingHints()
|
|
8164
8290
|
};
|
|
8165
8291
|
};
|
|
8292
|
+
var setSeekingHintsForWebm = ({
|
|
8293
|
+
hints,
|
|
8294
|
+
state
|
|
8295
|
+
}) => {
|
|
8296
|
+
state.webm.cues.setFromSeekingHints(hints);
|
|
8297
|
+
state.keyframes.setFromSeekingHints(hints);
|
|
8298
|
+
state.webm.setTimeStampMapForSeekingHints(hints.timestampMap);
|
|
8299
|
+
};
|
|
8166
8300
|
|
|
8167
|
-
// src/get-seeking-
|
|
8168
|
-
var
|
|
8301
|
+
// src/get-seeking-hints.ts
|
|
8302
|
+
var getSeekingHints = ({
|
|
8169
8303
|
structureState,
|
|
8170
8304
|
mp4HeaderSegment,
|
|
8171
8305
|
mediaSectionState: mediaSectionState2,
|
|
8172
8306
|
isoState,
|
|
8173
8307
|
transportStream,
|
|
8174
|
-
tracksState
|
|
8308
|
+
tracksState,
|
|
8309
|
+
keyframesState,
|
|
8310
|
+
webmState
|
|
8175
8311
|
}) => {
|
|
8176
8312
|
const structure = structureState.getStructureOrNull();
|
|
8177
8313
|
if (!structure) {
|
|
8178
8314
|
return null;
|
|
8179
8315
|
}
|
|
8180
8316
|
if (structure.type === "iso-base-media") {
|
|
8181
|
-
return
|
|
8317
|
+
return getSeekingHintsFromMp4({
|
|
8182
8318
|
structureState,
|
|
8183
8319
|
isoState,
|
|
8184
8320
|
mp4HeaderSegment,
|
|
@@ -8186,16 +8322,16 @@ var getSeekingInfo = ({
|
|
|
8186
8322
|
});
|
|
8187
8323
|
}
|
|
8188
8324
|
if (structure.type === "wav") {
|
|
8189
|
-
return
|
|
8325
|
+
return getSeekingHintsFromWav({
|
|
8190
8326
|
structure,
|
|
8191
8327
|
mediaSectionState: mediaSectionState2
|
|
8192
8328
|
});
|
|
8193
8329
|
}
|
|
8194
8330
|
if (structure.type === "matroska") {
|
|
8195
|
-
return
|
|
8331
|
+
return getSeekingHintsFromMatroska(tracksState, keyframesState, webmState);
|
|
8196
8332
|
}
|
|
8197
8333
|
if (structure.type === "transport-stream") {
|
|
8198
|
-
return
|
|
8334
|
+
return getSeekingHintsFromTransportStream(transportStream, tracksState);
|
|
8199
8335
|
}
|
|
8200
8336
|
throw new Error(`Seeking is not supported for this format: ${structure.type}`);
|
|
8201
8337
|
};
|
|
@@ -8424,22 +8560,24 @@ var turnSeekIntoByte = async ({
|
|
|
8424
8560
|
if (seek2.timeInSeconds < 0) {
|
|
8425
8561
|
throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
|
|
8426
8562
|
}
|
|
8427
|
-
const
|
|
8563
|
+
const seekingHints = getSeekingHints({
|
|
8428
8564
|
structureState,
|
|
8429
8565
|
mp4HeaderSegment,
|
|
8430
8566
|
mediaSectionState: mediaSectionState2,
|
|
8431
8567
|
isoState,
|
|
8432
8568
|
transportStream,
|
|
8433
|
-
tracksState
|
|
8569
|
+
tracksState,
|
|
8570
|
+
keyframesState: keyframes,
|
|
8571
|
+
webmState
|
|
8434
8572
|
});
|
|
8435
|
-
if (!
|
|
8573
|
+
if (!seekingHints) {
|
|
8436
8574
|
Log.trace(logLevel, "No seeking info, cannot seek yet");
|
|
8437
8575
|
return {
|
|
8438
8576
|
type: "valid-but-must-wait"
|
|
8439
8577
|
};
|
|
8440
8578
|
}
|
|
8441
8579
|
const seekingByte = await getSeekingByte({
|
|
8442
|
-
info:
|
|
8580
|
+
info: seekingHints,
|
|
8443
8581
|
time: seek2.timeInSeconds,
|
|
8444
8582
|
logLevel,
|
|
8445
8583
|
currentPosition: iterator.counter.getOffset(),
|
|
@@ -8447,7 +8585,8 @@ var turnSeekIntoByte = async ({
|
|
|
8447
8585
|
transportStream,
|
|
8448
8586
|
webmState,
|
|
8449
8587
|
mediaSection: mediaSectionState2,
|
|
8450
|
-
|
|
8588
|
+
mp4HeaderSegment,
|
|
8589
|
+
structure: structureState
|
|
8451
8590
|
});
|
|
8452
8591
|
return seekingByte;
|
|
8453
8592
|
}
|
|
@@ -8723,7 +8862,7 @@ var emitAvailableInfo = async ({
|
|
|
8723
8862
|
}
|
|
8724
8863
|
if (key === "tracks") {
|
|
8725
8864
|
if (!emittedFields.tracks && hasInfo.tracks) {
|
|
8726
|
-
const { videoTracks, audioTracks } = getTracks(state);
|
|
8865
|
+
const { videoTracks, audioTracks } = getTracks(state, true);
|
|
8727
8866
|
await callbackFunctions.onTracks?.({ videoTracks, audioTracks });
|
|
8728
8867
|
if (fieldsInReturnValue.tracks) {
|
|
8729
8868
|
returnValue.tracks = { videoTracks, audioTracks };
|
|
@@ -8965,7 +9104,7 @@ var getAvailableInfo = ({
|
|
|
8965
9104
|
return Boolean(structure && hasAudioCodec(state));
|
|
8966
9105
|
}
|
|
8967
9106
|
if (key === "tracks") {
|
|
8968
|
-
return Boolean(structure && getHasTracks(state));
|
|
9107
|
+
return Boolean(structure && getHasTracks(state, true));
|
|
8969
9108
|
}
|
|
8970
9109
|
if (key === "keyframes") {
|
|
8971
9110
|
return Boolean(structure && hasKeyframes(state));
|
|
@@ -9600,7 +9739,7 @@ var parseFlac = ({
|
|
|
9600
9739
|
|
|
9601
9740
|
// src/state/iso-base-media/cached-sample-positions.ts
|
|
9602
9741
|
var calculateFlatSamples = (state) => {
|
|
9603
|
-
const tracks2 = getTracks(state);
|
|
9742
|
+
const tracks2 = getTracks(state, true);
|
|
9604
9743
|
const allTracks = [
|
|
9605
9744
|
...tracks2.videoTracks,
|
|
9606
9745
|
...tracks2.audioTracks,
|
|
@@ -9693,7 +9832,9 @@ var makeTracksSectionState = (canSkipTracksState, src) => {
|
|
|
9693
9832
|
addTrack: (track) => {
|
|
9694
9833
|
tracks2.push(track);
|
|
9695
9834
|
},
|
|
9696
|
-
getTracks: () =>
|
|
9835
|
+
getTracks: () => {
|
|
9836
|
+
return tracks2;
|
|
9837
|
+
},
|
|
9697
9838
|
ensureHasTracksAtEnd: (fields) => {
|
|
9698
9839
|
if (canSkipTracksState.canSkipTracks()) {
|
|
9699
9840
|
return;
|
|
@@ -9889,13 +10030,16 @@ var parseMdatSection = async (state) => {
|
|
|
9889
10030
|
if (maySkipVideoData({ state })) {
|
|
9890
10031
|
return makeSkip(endOfMdat);
|
|
9891
10032
|
}
|
|
9892
|
-
const
|
|
9893
|
-
if (!
|
|
10033
|
+
const alreadyHasMoov = getHasTracks(state, true);
|
|
10034
|
+
if (!alreadyHasMoov) {
|
|
9894
10035
|
const moov = await getMoovAtom({
|
|
9895
10036
|
endOfMdat,
|
|
9896
10037
|
state
|
|
9897
10038
|
});
|
|
9898
|
-
state.iso.moov.setMoovBox(
|
|
10039
|
+
state.iso.moov.setMoovBox({
|
|
10040
|
+
moovBox: moov,
|
|
10041
|
+
precomputed: false
|
|
10042
|
+
});
|
|
9899
10043
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
9900
10044
|
state.structure.getIsoStructure().boxes.push(moov);
|
|
9901
10045
|
return parseMdatSection(state);
|
|
@@ -10341,8 +10485,8 @@ var parseM3uManifest = ({
|
|
|
10341
10485
|
return Promise.resolve(null);
|
|
10342
10486
|
};
|
|
10343
10487
|
|
|
10344
|
-
// src/forward-controller.ts
|
|
10345
|
-
var
|
|
10488
|
+
// src/forward-controller-pause-resume-abort.ts
|
|
10489
|
+
var forwardMediaParserControllerPauseResume = ({
|
|
10346
10490
|
parentController,
|
|
10347
10491
|
childController
|
|
10348
10492
|
}) => {
|
|
@@ -10511,8 +10655,7 @@ var fetchReadContent = async ({
|
|
|
10511
10655
|
});
|
|
10512
10656
|
if (controller) {
|
|
10513
10657
|
controller._internals.signal.addEventListener("abort", () => {
|
|
10514
|
-
reader.reader.cancel().catch(() => {
|
|
10515
|
-
});
|
|
10658
|
+
reader.reader.cancel().catch(() => {});
|
|
10516
10659
|
}, { once: true });
|
|
10517
10660
|
}
|
|
10518
10661
|
return {
|
|
@@ -10660,7 +10803,8 @@ var parseMedia = (options) => {
|
|
|
10660
10803
|
onError: () => ({ action: "fail" }),
|
|
10661
10804
|
acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
|
|
10662
10805
|
apiName: "parseMedia()",
|
|
10663
|
-
makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true
|
|
10806
|
+
makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true,
|
|
10807
|
+
seekingHints: options.seekingHints ?? null
|
|
10664
10808
|
});
|
|
10665
10809
|
};
|
|
10666
10810
|
|
|
@@ -10702,28 +10846,29 @@ var iteratorOverSegmentFiles = async ({
|
|
|
10702
10846
|
const playlist = getPlaylist(structure, playlistUrl);
|
|
10703
10847
|
const chunks = getChunks(playlist);
|
|
10704
10848
|
let resolver = onInitialProgress;
|
|
10705
|
-
let rejector = (_e) => {
|
|
10706
|
-
};
|
|
10707
|
-
const childController = mediaParserController();
|
|
10708
|
-
const forwarded = forwardMediaParserController({
|
|
10709
|
-
childController,
|
|
10710
|
-
parentController
|
|
10711
|
-
});
|
|
10712
|
-
const makeContinuationFn = () => {
|
|
10713
|
-
return {
|
|
10714
|
-
continue() {
|
|
10715
|
-
const { promise, reject, resolve } = withResolvers();
|
|
10716
|
-
resolver = resolve;
|
|
10717
|
-
rejector = reject;
|
|
10718
|
-
childController.resume();
|
|
10719
|
-
return promise;
|
|
10720
|
-
},
|
|
10721
|
-
abort() {
|
|
10722
|
-
childController.abort();
|
|
10723
|
-
}
|
|
10724
|
-
};
|
|
10725
|
-
};
|
|
10849
|
+
let rejector = (_e) => {};
|
|
10726
10850
|
for (const chunk of chunks) {
|
|
10851
|
+
resolver = onInitialProgress;
|
|
10852
|
+
rejector = (_e) => {};
|
|
10853
|
+
const childController = mediaParserController();
|
|
10854
|
+
const forwarded = forwardMediaParserControllerPauseResume({
|
|
10855
|
+
childController,
|
|
10856
|
+
parentController
|
|
10857
|
+
});
|
|
10858
|
+
const makeContinuationFn = () => {
|
|
10859
|
+
return {
|
|
10860
|
+
continue() {
|
|
10861
|
+
const { promise, reject, resolve } = withResolvers();
|
|
10862
|
+
resolver = resolve;
|
|
10863
|
+
rejector = reject;
|
|
10864
|
+
childController.resume();
|
|
10865
|
+
return promise;
|
|
10866
|
+
},
|
|
10867
|
+
abort() {
|
|
10868
|
+
childController.abort();
|
|
10869
|
+
}
|
|
10870
|
+
};
|
|
10871
|
+
};
|
|
10727
10872
|
const isLastChunk = chunk === chunks[chunks.length - 1];
|
|
10728
10873
|
await childController._internals.checkForAbortAndPause();
|
|
10729
10874
|
const src = readerInterface.createAdjacentFileSource(chunk.url, playlistUrl);
|
|
@@ -11757,7 +11902,7 @@ var parseMediaSection = async (state) => {
|
|
|
11757
11902
|
await parseMovi({
|
|
11758
11903
|
state
|
|
11759
11904
|
});
|
|
11760
|
-
const tracks2 = getTracks(state);
|
|
11905
|
+
const tracks2 = getTracks(state, false);
|
|
11761
11906
|
if (!tracks2.videoTracks.some((t) => t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
|
|
11762
11907
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
11763
11908
|
}
|
|
@@ -12128,7 +12273,10 @@ var handleAacPacket = async ({
|
|
|
12128
12273
|
});
|
|
12129
12274
|
if (!isTrackRegistered) {
|
|
12130
12275
|
const startOffset = makeSamplesStartAtZero ? Math.min(streamBuffer.pesHeader.pts, streamBuffer.pesHeader.dts ?? Infinity) : 0;
|
|
12131
|
-
transportStream.startOffset.setOffset(
|
|
12276
|
+
transportStream.startOffset.setOffset({
|
|
12277
|
+
trackId: programId,
|
|
12278
|
+
newOffset: startOffset
|
|
12279
|
+
});
|
|
12132
12280
|
const track = {
|
|
12133
12281
|
type: "audio",
|
|
12134
12282
|
codecPrivate: codecPrivate2,
|
|
@@ -13315,6 +13463,30 @@ var warnIfRemotionLicenseNotAcknowledged = ({
|
|
|
13315
13463
|
Log.warn(logLevel, `Pass \`acknowledgeRemotionLicense: true\` to \`${apiName}\` function to make this message disappear.`);
|
|
13316
13464
|
};
|
|
13317
13465
|
|
|
13466
|
+
// src/set-seeking-hints.ts
|
|
13467
|
+
var setSeekingHints = ({
|
|
13468
|
+
hints,
|
|
13469
|
+
state
|
|
13470
|
+
}) => {
|
|
13471
|
+
if (hints.type === "iso-base-media-seeking-hints") {
|
|
13472
|
+
setSeekingHintsForMp4({ hints, state });
|
|
13473
|
+
return;
|
|
13474
|
+
}
|
|
13475
|
+
if (hints.type === "wav-seeking-hints") {
|
|
13476
|
+
setSeekingHintsForWav({ hints, state });
|
|
13477
|
+
return;
|
|
13478
|
+
}
|
|
13479
|
+
if (hints.type === "transport-stream-seeking-hints") {
|
|
13480
|
+
setSeekingHintsForTransportStream({ hints, state });
|
|
13481
|
+
return;
|
|
13482
|
+
}
|
|
13483
|
+
if (hints.type === "webm-seeking-hints") {
|
|
13484
|
+
setSeekingHintsForWebm({ hints, state });
|
|
13485
|
+
return;
|
|
13486
|
+
}
|
|
13487
|
+
throw new Error(`Unknown seeking hints type: ${hints}`);
|
|
13488
|
+
};
|
|
13489
|
+
|
|
13318
13490
|
// src/get-fields-from-callbacks.ts
|
|
13319
13491
|
var getFieldsFromCallback = ({
|
|
13320
13492
|
fields,
|
|
@@ -13545,6 +13717,7 @@ var lazyMfraLoad = ({
|
|
|
13545
13717
|
logLevel
|
|
13546
13718
|
}) => {
|
|
13547
13719
|
let prom = null;
|
|
13720
|
+
let result = null;
|
|
13548
13721
|
const triggerLoad = () => {
|
|
13549
13722
|
if (prom) {
|
|
13550
13723
|
return prom;
|
|
@@ -13558,12 +13731,24 @@ var lazyMfraLoad = ({
|
|
|
13558
13731
|
logLevel
|
|
13559
13732
|
}).then((boxes) => {
|
|
13560
13733
|
Log.verbose(logLevel, "Lazily found mfra atom.");
|
|
13734
|
+
result = boxes;
|
|
13561
13735
|
return boxes;
|
|
13562
13736
|
});
|
|
13563
13737
|
return prom;
|
|
13564
13738
|
};
|
|
13739
|
+
const getIfAlreadyLoaded = () => {
|
|
13740
|
+
if (result) {
|
|
13741
|
+
return result;
|
|
13742
|
+
}
|
|
13743
|
+
return null;
|
|
13744
|
+
};
|
|
13745
|
+
const setFromSeekingHints = (hints) => {
|
|
13746
|
+
result = hints.mfraAlreadyLoaded;
|
|
13747
|
+
};
|
|
13565
13748
|
return {
|
|
13566
|
-
triggerLoad
|
|
13749
|
+
triggerLoad,
|
|
13750
|
+
getIfAlreadyLoaded,
|
|
13751
|
+
setFromSeekingHints
|
|
13567
13752
|
};
|
|
13568
13753
|
};
|
|
13569
13754
|
|
|
@@ -13574,7 +13759,7 @@ var moovState = () => {
|
|
|
13574
13759
|
setMoovBox: (moov) => {
|
|
13575
13760
|
moovBox = moov;
|
|
13576
13761
|
},
|
|
13577
|
-
|
|
13762
|
+
getMoovBoxAndPrecomputed: () => moovBox
|
|
13578
13763
|
};
|
|
13579
13764
|
};
|
|
13580
13765
|
|
|
@@ -13595,24 +13780,34 @@ var isoBaseMediaState = ({
|
|
|
13595
13780
|
readerInterface,
|
|
13596
13781
|
src,
|
|
13597
13782
|
logLevel
|
|
13598
|
-
})
|
|
13783
|
+
}),
|
|
13784
|
+
moof: precomputedMoofState(),
|
|
13785
|
+
tfra: precomputedTfraState()
|
|
13599
13786
|
};
|
|
13600
13787
|
};
|
|
13601
13788
|
|
|
13602
13789
|
// src/state/keyframes.ts
|
|
13603
13790
|
var keyframesState = () => {
|
|
13604
13791
|
const keyframes = [];
|
|
13605
|
-
|
|
13606
|
-
|
|
13607
|
-
|
|
13608
|
-
|
|
13609
|
-
|
|
13610
|
-
|
|
13611
|
-
|
|
13612
|
-
|
|
13613
|
-
|
|
13792
|
+
const addKeyframe = (keyframe) => {
|
|
13793
|
+
if (keyframes.find((k) => k.positionInBytes === keyframe.positionInBytes)) {
|
|
13794
|
+
return;
|
|
13795
|
+
}
|
|
13796
|
+
keyframes.push(keyframe);
|
|
13797
|
+
};
|
|
13798
|
+
const getKeyframes2 = () => {
|
|
13799
|
+
return keyframes;
|
|
13800
|
+
};
|
|
13801
|
+
const setFromSeekingHints = (hints) => {
|
|
13802
|
+
for (const keyframe of hints.keyframes) {
|
|
13803
|
+
addKeyframe(keyframe);
|
|
13614
13804
|
}
|
|
13615
13805
|
};
|
|
13806
|
+
return {
|
|
13807
|
+
addKeyframe,
|
|
13808
|
+
getKeyframes: getKeyframes2,
|
|
13809
|
+
setFromSeekingHints
|
|
13810
|
+
};
|
|
13616
13811
|
};
|
|
13617
13812
|
|
|
13618
13813
|
// src/containers/m3u/sample-sorter.ts
|
|
@@ -13888,6 +14083,7 @@ var lazyCuesFetch = ({
|
|
|
13888
14083
|
}) => {
|
|
13889
14084
|
let prom = null;
|
|
13890
14085
|
let sOffset = null;
|
|
14086
|
+
let result = null;
|
|
13891
14087
|
const triggerLoad = (position, segmentOffset) => {
|
|
13892
14088
|
if (prom) {
|
|
13893
14089
|
return prom;
|
|
@@ -13905,6 +14101,7 @@ var lazyCuesFetch = ({
|
|
|
13905
14101
|
src
|
|
13906
14102
|
}).then((cues) => {
|
|
13907
14103
|
Log.verbose(logLevel, "Cues loaded");
|
|
14104
|
+
result = cues;
|
|
13908
14105
|
return cues;
|
|
13909
14106
|
});
|
|
13910
14107
|
return prom;
|
|
@@ -13925,9 +14122,27 @@ var lazyCuesFetch = ({
|
|
|
13925
14122
|
segmentOffset: sOffset
|
|
13926
14123
|
};
|
|
13927
14124
|
};
|
|
14125
|
+
const getIfAlreadyLoaded = () => {
|
|
14126
|
+
if (result) {
|
|
14127
|
+
if (!sOffset) {
|
|
14128
|
+
throw new Error("Segment offset not set");
|
|
14129
|
+
}
|
|
14130
|
+
return {
|
|
14131
|
+
cues: result,
|
|
14132
|
+
segmentOffset: sOffset
|
|
14133
|
+
};
|
|
14134
|
+
}
|
|
14135
|
+
return null;
|
|
14136
|
+
};
|
|
14137
|
+
const setFromSeekingHints = (hints) => {
|
|
14138
|
+
result = hints.loadedCues?.cues ?? null;
|
|
14139
|
+
sOffset = hints.loadedCues?.segmentOffset ?? null;
|
|
14140
|
+
};
|
|
13928
14141
|
return {
|
|
13929
14142
|
triggerLoad,
|
|
13930
|
-
getLoadedCues
|
|
14143
|
+
getLoadedCues,
|
|
14144
|
+
getIfAlreadyLoaded,
|
|
14145
|
+
setFromSeekingHints
|
|
13931
14146
|
};
|
|
13932
14147
|
};
|
|
13933
14148
|
|
|
@@ -13957,7 +14172,7 @@ var webmState = ({
|
|
|
13957
14172
|
trackTimescale: trackTimescale?.value ?? null
|
|
13958
14173
|
};
|
|
13959
14174
|
};
|
|
13960
|
-
|
|
14175
|
+
let timestampMap = new Map;
|
|
13961
14176
|
const getTimestampOffsetForByteOffset = (byteOffset) => {
|
|
13962
14177
|
const entries = Array.from(timestampMap.entries());
|
|
13963
14178
|
const sortedByByteOffset = entries.sort((a, b) => {
|
|
@@ -13999,12 +14214,20 @@ var webmState = ({
|
|
|
13999
14214
|
readerInterface,
|
|
14000
14215
|
src
|
|
14001
14216
|
});
|
|
14217
|
+
const getTimeStampMapForSeekingHints = () => {
|
|
14218
|
+
return timestampMap;
|
|
14219
|
+
};
|
|
14220
|
+
const setTimeStampMapForSeekingHints = (newTimestampMap) => {
|
|
14221
|
+
timestampMap = newTimestampMap;
|
|
14222
|
+
};
|
|
14002
14223
|
return {
|
|
14003
14224
|
cues,
|
|
14004
14225
|
onTrackEntrySegment,
|
|
14005
14226
|
getTrackInfoByNumber: (id) => trackEntries[id],
|
|
14006
14227
|
setTimestampOffset,
|
|
14007
14228
|
getTimestampOffsetForByteOffset,
|
|
14229
|
+
getTimeStampMapForSeekingHints,
|
|
14230
|
+
setTimeStampMapForSeekingHints,
|
|
14008
14231
|
getTimescale,
|
|
14009
14232
|
setTimescale,
|
|
14010
14233
|
addSegment: (seg) => {
|
|
@@ -14234,9 +14457,6 @@ var samplesObservedState = () => {
|
|
|
14234
14457
|
const timeBetweenSamplesAudio = startingTimestampDifferenceAudio / (audioSamples.size - 1);
|
|
14235
14458
|
audioDuration = timeBetweenSamplesAudio * audioSamples.size;
|
|
14236
14459
|
}
|
|
14237
|
-
if (videoDuration === null && audioDuration === null) {
|
|
14238
|
-
throw new Error("No samples");
|
|
14239
|
-
}
|
|
14240
14460
|
return Math.max(videoDuration ?? 0, audioDuration ?? 0);
|
|
14241
14461
|
};
|
|
14242
14462
|
const addVideoSample = (videoSample) => {
|
|
@@ -14368,7 +14588,7 @@ var ptsStartOffsetStore = () => {
|
|
|
14368
14588
|
const offsets = {};
|
|
14369
14589
|
return {
|
|
14370
14590
|
getOffset: (trackId) => offsets[trackId] || 0,
|
|
14371
|
-
setOffset: (
|
|
14591
|
+
setOffset: ({ newOffset, trackId }) => {
|
|
14372
14592
|
offsets[trackId] = newOffset;
|
|
14373
14593
|
}
|
|
14374
14594
|
};
|
|
@@ -14529,8 +14749,7 @@ var throttledStateUpdate = ({
|
|
|
14529
14749
|
return {
|
|
14530
14750
|
get: () => currentState,
|
|
14531
14751
|
update: null,
|
|
14532
|
-
stopAndGetLastProgress: () => {
|
|
14533
|
-
}
|
|
14752
|
+
stopAndGetLastProgress: () => {}
|
|
14534
14753
|
};
|
|
14535
14754
|
}
|
|
14536
14755
|
let lastUpdated = null;
|
|
@@ -14541,8 +14760,7 @@ var throttledStateUpdate = ({
|
|
|
14541
14760
|
updateFn(currentState);
|
|
14542
14761
|
lastUpdated = currentState;
|
|
14543
14762
|
};
|
|
14544
|
-
let cleanup = () => {
|
|
14545
|
-
};
|
|
14763
|
+
let cleanup = () => {};
|
|
14546
14764
|
if (everyMilliseconds > 0) {
|
|
14547
14765
|
const interval = setInterval(() => {
|
|
14548
14766
|
callUpdateIfChanged();
|
|
@@ -14593,6 +14811,7 @@ var internalParseMedia = async function({
|
|
|
14593
14811
|
selectM3uAssociatedPlaylists: selectM3uAssociatedPlaylistsFn,
|
|
14594
14812
|
mp4HeaderSegment,
|
|
14595
14813
|
makeSamplesStartAtZero,
|
|
14814
|
+
seekingHints,
|
|
14596
14815
|
...more
|
|
14597
14816
|
}) {
|
|
14598
14817
|
controller._internals.markAsReadyToEmitEvents();
|
|
@@ -14641,6 +14860,19 @@ var internalParseMedia = async function({
|
|
|
14641
14860
|
initialReaderInstance: readerInstance,
|
|
14642
14861
|
makeSamplesStartAtZero
|
|
14643
14862
|
});
|
|
14863
|
+
if (seekingHints) {
|
|
14864
|
+
setSeekingHints({ hints: seekingHints, state });
|
|
14865
|
+
}
|
|
14866
|
+
controller._internals.attachSeekingHintResolution(() => Promise.resolve(getSeekingHints({
|
|
14867
|
+
tracksState: state.callbacks.tracks,
|
|
14868
|
+
keyframesState: state.keyframes,
|
|
14869
|
+
webmState: state.webm,
|
|
14870
|
+
structureState: state.structure,
|
|
14871
|
+
mp4HeaderSegment: state.mp4HeaderSegment,
|
|
14872
|
+
mediaSectionState: state.mediaSection,
|
|
14873
|
+
isoState: state.iso,
|
|
14874
|
+
transportStream: state.transportStream
|
|
14875
|
+
})));
|
|
14644
14876
|
if (!hasAudioTrackHandlers && !hasVideoTrackHandlers && Object.values(state.fields).every((v) => !v) && mode === "query") {
|
|
14645
14877
|
Log.warn(logLevel, new Error("Warning - No `fields` and no `on*` callbacks were passed to `parseMedia()`. Specify the data you would like to retrieve."));
|
|
14646
14878
|
}
|
|
@@ -14731,13 +14963,14 @@ var downloadAndParseMedia = async (options) => {
|
|
|
14731
14963
|
},
|
|
14732
14964
|
acknowledgeRemotionLicense: Boolean(options.acknowledgeRemotionLicense),
|
|
14733
14965
|
apiName: "parseAndDownloadMedia()",
|
|
14734
|
-
makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true
|
|
14966
|
+
makeSamplesStartAtZero: options.makeSamplesStartAtZero ?? true,
|
|
14967
|
+
seekingHints: options.seekingHints ?? null
|
|
14735
14968
|
});
|
|
14736
14969
|
await content.finish();
|
|
14737
14970
|
return returnValue;
|
|
14738
14971
|
};
|
|
14739
14972
|
// src/version.ts
|
|
14740
|
-
var VERSION = "4.0.
|
|
14973
|
+
var VERSION = "4.0.287";
|
|
14741
14974
|
|
|
14742
14975
|
// src/index.ts
|
|
14743
14976
|
var MediaParserInternals = {
|