@remotion/media-parser 4.0.298 → 4.0.301
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/add-avc-profile-to-track.d.ts +2 -2
- package/dist/add-avc-profile-to-track.js +7 -1
- package/dist/codec-data.d.ts +29 -0
- package/dist/codec-data.js +2 -0
- package/dist/containers/aac/parse-aac.js +2 -3
- package/dist/containers/avc/color.d.ts +6 -6
- package/dist/containers/avc/color.js +53 -27
- package/dist/containers/avc/interpret-sps.d.ts +2 -2
- package/dist/containers/avc/interpret-sps.js +2 -2
- package/dist/containers/flac/parse-streaminfo.js +2 -3
- package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +1 -1
- package/dist/containers/iso-base-media/color-to-webcodecs-colors.d.ts +2 -0
- package/dist/containers/iso-base-media/color-to-webcodecs-colors.js +12 -0
- package/dist/containers/iso-base-media/find-keyframe-before-time.d.ts +2 -2
- package/dist/containers/iso-base-media/find-track-to-seek.d.ts +5 -5
- package/dist/containers/iso-base-media/find-track-to-seek.js +18 -2
- package/dist/containers/iso-base-media/get-actual-number-of-channels.d.ts +3 -2
- package/dist/containers/iso-base-media/get-actual-number-of-channels.js +14 -3
- package/dist/containers/iso-base-media/get-children.d.ts +2 -2
- package/dist/containers/iso-base-media/get-keyframes.js +11 -2
- package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +4 -4
- package/dist/containers/iso-base-media/get-moov-atom.js +1 -1
- package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.d.ts +9 -5
- package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +17 -4
- package/dist/containers/iso-base-media/get-seeking-byte.d.ts +2 -2
- package/dist/containers/iso-base-media/get-seeking-byte.js +5 -8
- package/dist/containers/iso-base-media/make-track.d.ts +2 -2
- package/dist/containers/iso-base-media/make-track.js +18 -17
- package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +2 -2
- package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +4 -4
- package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +4 -4
- package/dist/containers/iso-base-media/moov/moov.d.ts +2 -2
- package/dist/containers/iso-base-media/process-box.d.ts +5 -5
- package/dist/containers/iso-base-media/stsd/mebx.d.ts +2 -2
- package/dist/containers/iso-base-media/stsd/samples.d.ts +3 -3
- package/dist/containers/iso-base-media/stsd/stsd.d.ts +2 -2
- package/dist/containers/iso-base-media/trak/trak.d.ts +2 -2
- package/dist/containers/iso-base-media/traversal.d.ts +1 -0
- package/dist/containers/iso-base-media/traversal.js +13 -1
- package/dist/containers/m3u/after-manifest-fetch.d.ts +6 -6
- package/dist/containers/m3u/after-manifest-fetch.js +1 -1
- package/dist/containers/m3u/fetch-m3u8-stream.d.ts +2 -2
- package/dist/containers/m3u/first-sample-in-m3u-chunk.d.ts +3 -3
- package/dist/containers/m3u/first-sample-in-m3u-chunk.js +2 -8
- package/dist/containers/m3u/get-seeking-byte.d.ts +3 -3
- package/dist/containers/m3u/get-streams.d.ts +6 -6
- package/dist/containers/m3u/get-streams.js +9 -9
- package/dist/containers/m3u/parse-stream-inf.js +3 -3
- package/dist/containers/m3u/process-m3u-chunk.js +3 -3
- package/dist/containers/m3u/run-over-m3u.d.ts +2 -2
- package/dist/containers/m3u/sample-sorter.d.ts +7 -7
- package/dist/containers/m3u/types.d.ts +3 -3
- package/dist/containers/mp3/parse-mpeg-header.js +2 -3
- package/dist/containers/mp3/seek/audio-sample-from-cbr.d.ts +2 -2
- package/dist/containers/riff/get-tracks-from-avi.d.ts +4 -9
- package/dist/containers/riff/get-tracks-from-avi.js +19 -20
- package/dist/containers/riff/parse-video-section.js +1 -1
- package/dist/containers/riff/seek/fetch-idx1.d.ts +4 -4
- package/dist/containers/transport-stream/get-tracks.d.ts +2 -2
- package/dist/containers/transport-stream/get-tracks.js +1 -5
- package/dist/containers/transport-stream/handle-aac-packet.d.ts +4 -4
- package/dist/containers/transport-stream/handle-aac-packet.js +5 -4
- package/dist/containers/transport-stream/handle-avc-packet.d.ts +4 -4
- package/dist/containers/transport-stream/handle-avc-packet.js +10 -4
- package/dist/containers/transport-stream/process-audio.d.ts +5 -5
- package/dist/containers/transport-stream/process-stream-buffers.d.ts +8 -8
- package/dist/containers/transport-stream/process-video.d.ts +5 -5
- package/dist/containers/wav/parse-fmt.js +2 -3
- package/dist/containers/webm/color.d.ts +2 -2
- package/dist/containers/webm/color.js +6 -25
- package/dist/containers/webm/get-ready-tracks.d.ts +3 -3
- package/dist/containers/webm/get-sample-from-block.d.ts +7 -7
- package/dist/containers/webm/make-track.d.ts +3 -3
- package/dist/containers/webm/make-track.js +53 -21
- package/dist/containers/webm/parse-webm-header.js +5 -0
- package/dist/containers/webm/seek/fetch-web-cues.d.ts +4 -4
- package/dist/containers/webm/seek/get-seeking-byte.d.ts +2 -2
- package/dist/containers/webm/segments.d.ts +2 -2
- package/dist/containers/webm/segments.js +1 -1
- package/dist/containers/webm/state-for-processing.d.ts +5 -5
- package/dist/containers/webm/traversal.js +2 -1
- package/dist/controller/emitter.d.ts +2 -3
- package/dist/controller/seek-signal.d.ts +3 -9
- package/dist/controller/seek-signal.js +2 -2
- package/dist/convert-audio-or-video-sample.d.ts +4 -4
- package/dist/download-and-parse-media.js +1 -1
- package/dist/emit-available-info.js +9 -9
- package/dist/errors.d.ts +4 -18
- package/dist/errors.js +1 -15
- package/dist/esm/index.mjs +654 -544
- package/dist/esm/node.mjs +63 -51
- package/dist/esm/server-worker.mjs +13 -34
- package/dist/esm/universal.mjs +63 -51
- package/dist/esm/worker-server-entry.mjs +500 -388
- package/dist/esm/worker-web-entry.mjs +437 -337
- package/dist/esm/worker.mjs +14 -35
- package/dist/fields.d.ts +2 -2
- package/dist/file-types/bmp.d.ts +2 -2
- package/dist/file-types/detect-file-type.d.ts +2 -1
- package/dist/file-types/detect-file-type.js +1 -6
- package/dist/file-types/gif.d.ts +2 -0
- package/dist/file-types/gif.js +18 -0
- package/dist/file-types/index.js +4 -2
- package/dist/file-types/png.d.ts +2 -2
- package/dist/file-types/webp.d.ts +2 -2
- package/dist/get-audio-codec.d.ts +3 -4
- package/dist/get-audio-codec.js +44 -23
- package/dist/get-dimensions.d.ts +2 -2
- package/dist/get-dimensions.js +6 -3
- package/dist/get-duration.js +6 -7
- package/dist/get-fields-from-callbacks.js +1 -1
- package/dist/get-is-hdr.js +6 -5
- package/dist/get-sample-aspect-ratio.d.ts +5 -5
- package/dist/get-seeking-byte.d.ts +2 -2
- package/dist/get-tracks.d.ts +34 -44
- package/dist/get-tracks.js +6 -46
- package/dist/get-video-codec.d.ts +4 -3
- package/dist/get-video-codec.js +6 -6
- package/dist/has-all-info.js +1 -1
- package/dist/index.d.ts +114 -55
- package/dist/index.js +6 -4
- package/dist/init-video.js +4 -11
- package/dist/internal-parse-media.js +1 -1
- package/dist/log.d.ts +6 -6
- package/dist/metadata/get-metadata.js +6 -4
- package/dist/options.d.ts +19 -23
- package/dist/parse-loop.js +2 -2
- package/dist/parse-media-on-worker-entry.js +13 -5
- package/dist/parse-media.js +1 -1
- package/dist/perform-seek.d.ts +4 -4
- package/dist/readers/from-fetch.d.ts +2 -2
- package/dist/readers/from-node.d.ts +2 -2
- package/dist/readers/from-node.js +64 -55
- package/dist/readers/from-web-file.d.ts +2 -2
- package/dist/readers/reader.d.ts +5 -5
- package/dist/readers/universal.d.ts +2 -2
- package/dist/readers/web.d.ts +2 -2
- package/dist/register-track.d.ts +12 -12
- package/dist/remotion-license-acknowledge.d.ts +2 -2
- package/dist/seek-backwards.d.ts +4 -4
- package/dist/seek-forwards.d.ts +4 -4
- package/dist/state/can-skip-tracks.js +1 -1
- package/dist/state/emitted-fields.js +1 -1
- package/dist/state/has-tracks-section.d.ts +5 -5
- package/dist/state/iso-base-media/cached-sample-positions.d.ts +3 -3
- package/dist/state/iso-base-media/cached-sample-positions.js +16 -7
- package/dist/state/iso-base-media/iso-state.d.ts +4 -4
- package/dist/state/iso-base-media/lazy-mfra-load.d.ts +4 -4
- package/dist/state/m3u-state.d.ts +11 -11
- package/dist/state/matroska/lazy-cues-fetch.d.ts +4 -4
- package/dist/state/matroska/webm.d.ts +4 -4
- package/dist/state/matroska/webm.js +1 -1
- package/dist/state/may-skip-video-data.d.ts +1 -0
- package/dist/state/may-skip-video-data.js +23 -2
- package/dist/state/need-samples-for-fields.js +1 -1
- package/dist/state/parser-state.d.ts +67 -38
- package/dist/state/riff/lazy-idx1-fetch.d.ts +4 -4
- package/dist/state/riff/sample-counter.d.ts +3 -3
- package/dist/state/riff.d.ts +6 -6
- package/dist/state/sample-callbacks.d.ts +12 -12
- package/dist/state/sample-callbacks.js +2 -2
- package/dist/state/samples-observed/slow-duration-fps.d.ts +3 -3
- package/dist/state/transport-stream/last-emitted-sample.d.ts +3 -3
- package/dist/state/transport-stream/transport-stream.d.ts +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webcodec-sample-types.d.ts +21 -10
- package/dist/work-on-seek-request.d.ts +4 -4
- package/dist/work-on-seek-request.js +40 -43
- package/dist/worker/serialize-error.d.ts +2 -2
- package/dist/worker/serialize-error.js +7 -25
- package/dist/worker/worker-types.d.ts +22 -24
- package/dist/worker-server.d.ts +2 -2
- package/dist/worker-server.js +5 -5
- package/dist/writers/writer.d.ts +2 -2
- package/package.json +3 -3
- package/dist/containers/iso-base-media/sample-positions.d.ts +0 -25
- package/dist/containers/iso-base-media/sample-positions.js +0 -37
- package/dist/containers/iso-base-media/turn-sample-positions-into-array.d.ts +0 -19
- package/dist/containers/iso-base-media/turn-sample-positions-into-array.js +0 -73
- package/dist/containers/m3u/iterate-over-segment-files.d.ts +0 -21
- package/dist/containers/m3u/iterate-over-segment-files.js +0 -132
- package/dist/containers/mp3/audio-sample-from-cbr.d.ts +0 -11
- package/dist/containers/mp3/audio-sample-from-cbr.js +0 -35
- package/dist/emit-audio-sample.d.ts +0 -12
- package/dist/emit-audio-sample.js +0 -11
|
@@ -1,26 +1,4 @@
|
|
|
1
1
|
// src/errors.ts
|
|
2
|
-
class IsAGifError extends Error {
|
|
3
|
-
mimeType;
|
|
4
|
-
sizeInBytes;
|
|
5
|
-
fileName;
|
|
6
|
-
constructor({
|
|
7
|
-
message,
|
|
8
|
-
mimeType,
|
|
9
|
-
sizeInBytes,
|
|
10
|
-
fileName
|
|
11
|
-
}) {
|
|
12
|
-
super(message);
|
|
13
|
-
this.name = "IsAGifError";
|
|
14
|
-
this.fileName = "IsAGifError";
|
|
15
|
-
this.mimeType = mimeType;
|
|
16
|
-
this.sizeInBytes = sizeInBytes;
|
|
17
|
-
this.fileName = fileName;
|
|
18
|
-
if (Error.captureStackTrace) {
|
|
19
|
-
Error.captureStackTrace(this, IsAGifError);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
2
|
class IsAnImageError extends Error {
|
|
25
3
|
imageType;
|
|
26
4
|
dimensions;
|
|
@@ -631,7 +609,7 @@ var performedSeeksStats = () => {
|
|
|
631
609
|
|
|
632
610
|
// src/controller/seek-signal.ts
|
|
633
611
|
var makeSeekSignal = (emitter) => {
|
|
634
|
-
let seek;
|
|
612
|
+
let seek = null;
|
|
635
613
|
return {
|
|
636
614
|
seek: (seekRequest) => {
|
|
637
615
|
seek = seekRequest;
|
|
@@ -642,7 +620,7 @@ var makeSeekSignal = (emitter) => {
|
|
|
642
620
|
},
|
|
643
621
|
clearSeekIfStillSame(previousSeek) {
|
|
644
622
|
if (seek === previousSeek) {
|
|
645
|
-
seek =
|
|
623
|
+
seek = null;
|
|
646
624
|
return { hasChanged: false };
|
|
647
625
|
}
|
|
648
626
|
return { hasChanged: true };
|
|
@@ -746,10 +724,10 @@ var getM3uStreams = ({
|
|
|
746
724
|
}
|
|
747
725
|
boxes.push({
|
|
748
726
|
src: readerInterface.createAdjacentFileSource(next.value, originalSrc),
|
|
749
|
-
|
|
750
|
-
|
|
727
|
+
averageBandwidthInBitsPerSec: str.averageBandwidthInBitsPerSec,
|
|
728
|
+
bandwidthInBitsPerSec: str.bandwidthInBitsPerSec,
|
|
751
729
|
codecs: str.codecs,
|
|
752
|
-
|
|
730
|
+
dimensions: str.dimensions,
|
|
753
731
|
associatedPlaylists
|
|
754
732
|
});
|
|
755
733
|
}
|
|
@@ -758,11 +736,11 @@ var getM3uStreams = ({
|
|
|
758
736
|
return null;
|
|
759
737
|
}
|
|
760
738
|
const sorted = boxes.slice().sort((a, b) => {
|
|
761
|
-
const aResolution = a.
|
|
762
|
-
const bResolution = b.
|
|
739
|
+
const aResolution = a.dimensions ? a.dimensions.width * a.dimensions.height : 0;
|
|
740
|
+
const bResolution = b.dimensions ? b.dimensions.width * b.dimensions.height : 0;
|
|
763
741
|
if (aResolution === bResolution) {
|
|
764
|
-
const bandwidthA = a.
|
|
765
|
-
const bandwidthB = b.
|
|
742
|
+
const bandwidthA = a.averageBandwidthInBitsPerSec ?? a.bandwidthInBitsPerSec ?? 0;
|
|
743
|
+
const bandwidthB = b.averageBandwidthInBitsPerSec ?? b.bandwidthInBitsPerSec ?? 0;
|
|
766
744
|
return bandwidthB - bandwidthA;
|
|
767
745
|
}
|
|
768
746
|
return bResolution - aResolution;
|
|
@@ -982,6 +960,16 @@ var getTfraBoxes = (structure) => {
|
|
|
982
960
|
}
|
|
983
961
|
return getTfraBoxesFromMfraBoxChildren(mfraBox.children);
|
|
984
962
|
};
|
|
963
|
+
var getTrakBoxByTrackId = (moovBox, trackId) => {
|
|
964
|
+
const trakBoxes = getTraks(moovBox);
|
|
965
|
+
return trakBoxes.find((t) => {
|
|
966
|
+
const tkhd = getTkhdBox(t);
|
|
967
|
+
if (!tkhd) {
|
|
968
|
+
return false;
|
|
969
|
+
}
|
|
970
|
+
return tkhd.trackId === trackId;
|
|
971
|
+
}) ?? null;
|
|
972
|
+
};
|
|
985
973
|
|
|
986
974
|
// src/containers/riff/traversal.ts
|
|
987
975
|
var isRiffAvi = (structure) => {
|
|
@@ -1311,13 +1299,61 @@ var getDisplayAspectRatio = ({
|
|
|
1311
1299
|
|
|
1312
1300
|
// src/containers/avc/color.ts
|
|
1313
1301
|
var getMatrixCoefficientsFromIndex = (index) => {
|
|
1314
|
-
|
|
1302
|
+
if (index === 0) {
|
|
1303
|
+
return "rgb";
|
|
1304
|
+
}
|
|
1305
|
+
if (index === 1) {
|
|
1306
|
+
return "bt709";
|
|
1307
|
+
}
|
|
1308
|
+
if (index === 5) {
|
|
1309
|
+
return "bt470bg";
|
|
1310
|
+
}
|
|
1311
|
+
if (index === 6) {
|
|
1312
|
+
return "smpte170m";
|
|
1313
|
+
}
|
|
1314
|
+
if (index === 9) {
|
|
1315
|
+
return "bt2020-ncl";
|
|
1316
|
+
}
|
|
1317
|
+
return null;
|
|
1315
1318
|
};
|
|
1316
1319
|
var getTransferCharacteristicsFromIndex = (index) => {
|
|
1317
|
-
|
|
1320
|
+
if (index === 1) {
|
|
1321
|
+
return "bt709";
|
|
1322
|
+
}
|
|
1323
|
+
if (index === 6) {
|
|
1324
|
+
return "smpte170m";
|
|
1325
|
+
}
|
|
1326
|
+
if (index === 8) {
|
|
1327
|
+
return "linear";
|
|
1328
|
+
}
|
|
1329
|
+
if (index === 13) {
|
|
1330
|
+
return "iec61966-2-1";
|
|
1331
|
+
}
|
|
1332
|
+
if (index === 16) {
|
|
1333
|
+
return "pq";
|
|
1334
|
+
}
|
|
1335
|
+
if (index === 18) {
|
|
1336
|
+
return "hlg";
|
|
1337
|
+
}
|
|
1338
|
+
return null;
|
|
1318
1339
|
};
|
|
1319
1340
|
var getPrimariesFromIndex = (index) => {
|
|
1320
|
-
|
|
1341
|
+
if (index === 1) {
|
|
1342
|
+
return "bt709";
|
|
1343
|
+
}
|
|
1344
|
+
if (index === 5) {
|
|
1345
|
+
return "bt470bg";
|
|
1346
|
+
}
|
|
1347
|
+
if (index === 6) {
|
|
1348
|
+
return "smpte170m";
|
|
1349
|
+
}
|
|
1350
|
+
if (index === 9) {
|
|
1351
|
+
return "bt2020";
|
|
1352
|
+
}
|
|
1353
|
+
if (index === 12) {
|
|
1354
|
+
return "smpte432";
|
|
1355
|
+
}
|
|
1356
|
+
return null;
|
|
1321
1357
|
};
|
|
1322
1358
|
|
|
1323
1359
|
// src/containers/webm/segments/all-segments.ts
|
|
@@ -2061,10 +2097,6 @@ var isMp3 = (data) => {
|
|
|
2061
2097
|
const subarray = data.subarray(0, 4);
|
|
2062
2098
|
return matchesPattern(mpegPattern)(subarray) || matchesPattern(mpegPattern2)(subarray) || matchesPattern(id3v4Pattern)(subarray) || matchesPattern(id3v3Pattern)(subarray) || matchesPattern(id3v2Pattern)(subarray);
|
|
2063
2099
|
};
|
|
2064
|
-
var isGif = (data) => {
|
|
2065
|
-
const gifPattern = new Uint8Array([71, 73, 70, 56]);
|
|
2066
|
-
return matchesPattern(gifPattern)(data.subarray(0, 4));
|
|
2067
|
-
};
|
|
2068
2100
|
var isAac = (data) => {
|
|
2069
2101
|
const aacPattern = new Uint8Array([255, 241]);
|
|
2070
2102
|
return matchesPattern(aacPattern)(data.subarray(0, 2));
|
|
@@ -2097,6 +2129,21 @@ var isBmp = (data) => {
|
|
|
2097
2129
|
return null;
|
|
2098
2130
|
};
|
|
2099
2131
|
|
|
2132
|
+
// src/file-types/gif.ts
|
|
2133
|
+
var getGifDimensions = (data) => {
|
|
2134
|
+
const view = new DataView(data.buffer, data.byteOffset);
|
|
2135
|
+
const width = view.getUint16(6, true);
|
|
2136
|
+
const height = view.getUint16(8, true);
|
|
2137
|
+
return { width, height };
|
|
2138
|
+
};
|
|
2139
|
+
var isGif = (data) => {
|
|
2140
|
+
const gifPattern = new Uint8Array([71, 73, 70, 56]);
|
|
2141
|
+
if (matchesPattern(gifPattern)(data.subarray(0, 4))) {
|
|
2142
|
+
return { type: "gif", dimensions: getGifDimensions(data) };
|
|
2143
|
+
}
|
|
2144
|
+
return null;
|
|
2145
|
+
};
|
|
2146
|
+
|
|
2100
2147
|
// src/file-types/jpeg.ts
|
|
2101
2148
|
function getJpegDimensions(data) {
|
|
2102
2149
|
let offset = 0;
|
|
@@ -2242,8 +2289,9 @@ var detectFileType = (data) => {
|
|
|
2242
2289
|
if (isMp3(data)) {
|
|
2243
2290
|
return { type: "mp3" };
|
|
2244
2291
|
}
|
|
2245
|
-
|
|
2246
|
-
|
|
2292
|
+
const gif = isGif(data);
|
|
2293
|
+
if (gif) {
|
|
2294
|
+
return gif;
|
|
2247
2295
|
}
|
|
2248
2296
|
const png = isPng(data);
|
|
2249
2297
|
if (png) {
|
|
@@ -2878,7 +2926,7 @@ var parseAv1PrivateData = (data, colrAtom) => {
|
|
|
2878
2926
|
// src/get-video-codec.ts
|
|
2879
2927
|
var getVideoCodec = (state) => {
|
|
2880
2928
|
const track = getTracks(state, true);
|
|
2881
|
-
return track.
|
|
2929
|
+
return track.find((t) => t.type === "video")?.codecEnum ?? null;
|
|
2882
2930
|
};
|
|
2883
2931
|
var hasVideoCodec = (state) => {
|
|
2884
2932
|
return getHasTracks(state, true);
|
|
@@ -2892,13 +2940,13 @@ var getVideoPrivateData = (trakBox) => {
|
|
|
2892
2940
|
return null;
|
|
2893
2941
|
}
|
|
2894
2942
|
if (avccBox) {
|
|
2895
|
-
return avccBox.privateData;
|
|
2943
|
+
return { type: "avc-sps-pps", data: avccBox.privateData };
|
|
2896
2944
|
}
|
|
2897
2945
|
if (hvccBox) {
|
|
2898
|
-
return hvccBox.privateData;
|
|
2946
|
+
return { type: "hvcc-data", data: hvccBox.privateData };
|
|
2899
2947
|
}
|
|
2900
2948
|
if (av1cBox) {
|
|
2901
|
-
return av1cBox.privateData;
|
|
2949
|
+
return { type: "av1c-data", data: av1cBox.privateData };
|
|
2902
2950
|
}
|
|
2903
2951
|
return null;
|
|
2904
2952
|
};
|
|
@@ -2916,9 +2964,9 @@ var getIsoBmColrConfig = (trakBox) => {
|
|
|
2916
2964
|
}
|
|
2917
2965
|
return {
|
|
2918
2966
|
fullRange: colrAtom.fullRangeFlag,
|
|
2919
|
-
|
|
2967
|
+
matrix: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
|
|
2920
2968
|
primaries: getPrimariesFromIndex(colrAtom.primaries),
|
|
2921
|
-
|
|
2969
|
+
transfer: getTransferCharacteristicsFromIndex(colrAtom.transfer)
|
|
2922
2970
|
};
|
|
2923
2971
|
};
|
|
2924
2972
|
var getVideoCodecString = (trakBox) => {
|
|
@@ -2942,6 +2990,16 @@ var getVideoCodecString = (trakBox) => {
|
|
|
2942
2990
|
return videoSample.format;
|
|
2943
2991
|
};
|
|
2944
2992
|
|
|
2993
|
+
// src/containers/iso-base-media/color-to-webcodecs-colors.ts
|
|
2994
|
+
var mediaParserAdvancedColorToWebCodecsColor = (color2) => {
|
|
2995
|
+
return {
|
|
2996
|
+
transfer: color2.transfer,
|
|
2997
|
+
matrix: color2.matrix,
|
|
2998
|
+
primaries: color2.primaries,
|
|
2999
|
+
fullRange: color2.fullRange
|
|
3000
|
+
};
|
|
3001
|
+
};
|
|
3002
|
+
|
|
2945
3003
|
// src/aac-codecprivate.ts
|
|
2946
3004
|
var getSampleRateFromSampleFrequencyIndex = (samplingFrequencyIndex) => {
|
|
2947
3005
|
switch (samplingFrequencyIndex) {
|
|
@@ -3101,16 +3159,27 @@ var getActualDecoderParameters = ({
|
|
|
3101
3159
|
sampleRate
|
|
3102
3160
|
}) => {
|
|
3103
3161
|
if (audioCodec !== "aac") {
|
|
3104
|
-
return {
|
|
3162
|
+
return {
|
|
3163
|
+
numberOfChannels,
|
|
3164
|
+
sampleRate,
|
|
3165
|
+
codecPrivate: codecPrivate2
|
|
3166
|
+
};
|
|
3105
3167
|
}
|
|
3106
3168
|
if (codecPrivate2 === null) {
|
|
3107
3169
|
return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
|
|
3108
3170
|
}
|
|
3109
|
-
|
|
3171
|
+
if (codecPrivate2.type !== "aac-config") {
|
|
3172
|
+
throw new Error("Expected AAC codec private data");
|
|
3173
|
+
}
|
|
3174
|
+
const parsed = parseAacCodecPrivate(codecPrivate2.data);
|
|
3175
|
+
const actual = createAacCodecPrivate({
|
|
3176
|
+
...parsed,
|
|
3177
|
+
codecPrivate: codecPrivate2.data
|
|
3178
|
+
});
|
|
3110
3179
|
return {
|
|
3111
3180
|
numberOfChannels: parsed.channelConfiguration,
|
|
3112
3181
|
sampleRate: parsed.sampleRate,
|
|
3113
|
-
codecPrivate:
|
|
3182
|
+
codecPrivate: { type: "aac-config", data: actual }
|
|
3114
3183
|
};
|
|
3115
3184
|
};
|
|
3116
3185
|
|
|
@@ -3180,10 +3249,10 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3180
3249
|
}
|
|
3181
3250
|
const { codecString, description } = getAudioCodecStringFromTrak(trakBox);
|
|
3182
3251
|
const codecPrivate2 = getCodecPrivateFromTrak(trakBox) ?? description ?? null;
|
|
3183
|
-
const
|
|
3252
|
+
const codecEnum = getAudioCodecFromTrack(trakBox);
|
|
3184
3253
|
const actual = getActualDecoderParameters({
|
|
3185
|
-
audioCodec:
|
|
3186
|
-
codecPrivate: codecPrivate2,
|
|
3254
|
+
audioCodec: codecEnum,
|
|
3255
|
+
codecPrivate: codecPrivate2 ?? null,
|
|
3187
3256
|
numberOfChannels,
|
|
3188
3257
|
sampleRate
|
|
3189
3258
|
});
|
|
@@ -3194,10 +3263,9 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3194
3263
|
codec: codecString,
|
|
3195
3264
|
numberOfChannels: actual.numberOfChannels,
|
|
3196
3265
|
sampleRate: actual.sampleRate,
|
|
3197
|
-
description: actual.codecPrivate ?? undefined,
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
codecWithoutConfig
|
|
3266
|
+
description: actual.codecPrivate?.data ?? undefined,
|
|
3267
|
+
codecData: actual.codecPrivate,
|
|
3268
|
+
codecEnum
|
|
3201
3269
|
};
|
|
3202
3270
|
}
|
|
3203
3271
|
if (!trakBoxContainsVideo(trakBox)) {
|
|
@@ -3227,6 +3295,12 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3227
3295
|
throw new Error("Could not find video codec");
|
|
3228
3296
|
}
|
|
3229
3297
|
const privateData = getVideoPrivateData(trakBox);
|
|
3298
|
+
const advancedColor = getIsoBmColrConfig(trakBox) ?? {
|
|
3299
|
+
fullRange: null,
|
|
3300
|
+
matrix: null,
|
|
3301
|
+
primaries: null,
|
|
3302
|
+
transfer: null
|
|
3303
|
+
};
|
|
3230
3304
|
const track = {
|
|
3231
3305
|
m3uStreamFormat: null,
|
|
3232
3306
|
type: "video",
|
|
@@ -3242,15 +3316,10 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3242
3316
|
displayAspectWidth,
|
|
3243
3317
|
displayAspectHeight,
|
|
3244
3318
|
rotation,
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
matrixCoefficients: null,
|
|
3250
|
-
primaries: null,
|
|
3251
|
-
transferCharacteristics: null
|
|
3252
|
-
},
|
|
3253
|
-
codecWithoutConfig: getVideoCodecFromIsoTrak(trakBox),
|
|
3319
|
+
codecData: privateData,
|
|
3320
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
3321
|
+
advancedColor,
|
|
3322
|
+
codecEnum: getVideoCodecFromIsoTrak(trakBox),
|
|
3254
3323
|
fps: getFpsFromMp4TrakBox(trakBox)
|
|
3255
3324
|
};
|
|
3256
3325
|
return track;
|
|
@@ -3321,7 +3390,8 @@ var addAvcProfileToTrack = (track, avc1Profile) => {
|
|
|
3321
3390
|
return {
|
|
3322
3391
|
...track,
|
|
3323
3392
|
codec: getCodecStringFromSpsAndPps(avc1Profile.sps),
|
|
3324
|
-
|
|
3393
|
+
codecData: { type: "avc-sps-pps", data: createSpsPpsData(avc1Profile) },
|
|
3394
|
+
description: undefined
|
|
3325
3395
|
};
|
|
3326
3396
|
};
|
|
3327
3397
|
|
|
@@ -3347,14 +3417,13 @@ var makeAviAudioTrack = ({
|
|
|
3347
3417
|
return {
|
|
3348
3418
|
type: "audio",
|
|
3349
3419
|
codec: "mp4a.40.2",
|
|
3350
|
-
|
|
3351
|
-
|
|
3420
|
+
codecData: { type: "aac-config", data: new Uint8Array([18, 16]) },
|
|
3421
|
+
codecEnum: "aac",
|
|
3352
3422
|
description: new Uint8Array([18, 16]),
|
|
3353
3423
|
numberOfChannels: strf.numberOfChannels,
|
|
3354
3424
|
sampleRate: strf.sampleRate,
|
|
3355
3425
|
timescale: MEDIA_PARSER_RIFF_TIMESCALE,
|
|
3356
|
-
trackId: index
|
|
3357
|
-
trakBox: null
|
|
3426
|
+
trackId: index
|
|
3358
3427
|
};
|
|
3359
3428
|
};
|
|
3360
3429
|
var makeAviVideoTrack = ({
|
|
@@ -3366,9 +3435,9 @@ var makeAviVideoTrack = ({
|
|
|
3366
3435
|
throw new Error(`Unsupported video codec ${strh.handler}`);
|
|
3367
3436
|
}
|
|
3368
3437
|
return {
|
|
3369
|
-
|
|
3438
|
+
codecData: null,
|
|
3370
3439
|
codec: TO_BE_OVERRIDDEN_LATER,
|
|
3371
|
-
|
|
3440
|
+
codecEnum: "h264",
|
|
3372
3441
|
codedHeight: strf.height,
|
|
3373
3442
|
codedWidth: strf.width,
|
|
3374
3443
|
width: strf.width,
|
|
@@ -3379,14 +3448,19 @@ var makeAviVideoTrack = ({
|
|
|
3379
3448
|
description: undefined,
|
|
3380
3449
|
m3uStreamFormat: null,
|
|
3381
3450
|
trackId: index,
|
|
3382
|
-
|
|
3451
|
+
colorSpace: {
|
|
3383
3452
|
fullRange: null,
|
|
3384
|
-
|
|
3453
|
+
matrix: null,
|
|
3385
3454
|
primaries: null,
|
|
3386
|
-
|
|
3455
|
+
transfer: null
|
|
3456
|
+
},
|
|
3457
|
+
advancedColor: {
|
|
3458
|
+
fullRange: null,
|
|
3459
|
+
matrix: null,
|
|
3460
|
+
primaries: null,
|
|
3461
|
+
transfer: null
|
|
3387
3462
|
},
|
|
3388
3463
|
displayAspectWidth: strf.width,
|
|
3389
|
-
trakBox: null,
|
|
3390
3464
|
rotation: 0,
|
|
3391
3465
|
sampleAspectRatio: {
|
|
3392
3466
|
numerator: 1,
|
|
@@ -3396,9 +3470,7 @@ var makeAviVideoTrack = ({
|
|
|
3396
3470
|
};
|
|
3397
3471
|
};
|
|
3398
3472
|
var getTracksFromAvi = (structure, state) => {
|
|
3399
|
-
const
|
|
3400
|
-
const audioTracks = [];
|
|
3401
|
-
const otherTracks = [];
|
|
3473
|
+
const tracks2 = [];
|
|
3402
3474
|
const boxes = getStrlBoxes(structure);
|
|
3403
3475
|
let i = 0;
|
|
3404
3476
|
for (const box of boxes) {
|
|
@@ -3408,22 +3480,22 @@ var getTracksFromAvi = (structure, state) => {
|
|
|
3408
3480
|
}
|
|
3409
3481
|
const { strf } = strh;
|
|
3410
3482
|
if (strf.type === "strf-box-video") {
|
|
3411
|
-
|
|
3483
|
+
tracks2.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
|
|
3412
3484
|
} else if (strh.fccType === "auds") {
|
|
3413
|
-
|
|
3485
|
+
tracks2.push(makeAviAudioTrack({ strf, index: i }));
|
|
3414
3486
|
} else {
|
|
3415
3487
|
throw new Error(`Unsupported track type ${strh.fccType}`);
|
|
3416
3488
|
}
|
|
3417
3489
|
i++;
|
|
3418
3490
|
}
|
|
3419
|
-
return
|
|
3491
|
+
return tracks2;
|
|
3420
3492
|
};
|
|
3421
3493
|
var hasAllTracksFromAvi = (state) => {
|
|
3422
3494
|
try {
|
|
3423
3495
|
const structure = state.structure.getRiffStructure();
|
|
3424
3496
|
const numberOfTracks = getNumberOfTracks(structure);
|
|
3425
3497
|
const tracks2 = getTracksFromAvi(structure, state);
|
|
3426
|
-
return tracks2.
|
|
3498
|
+
return tracks2.length === numberOfTracks && !tracks2.find((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER);
|
|
3427
3499
|
} catch {
|
|
3428
3500
|
return false;
|
|
3429
3501
|
}
|
|
@@ -3476,11 +3548,7 @@ var getTracksFromTransportStream = (parserState) => {
|
|
|
3476
3548
|
if (mapped.length !== filterStreamsBySupportedTypes(programMapTable.streams).length) {
|
|
3477
3549
|
throw new Error("Not all tracks found");
|
|
3478
3550
|
}
|
|
3479
|
-
return
|
|
3480
|
-
videoTracks: mapped.filter((track) => track.type === "video"),
|
|
3481
|
-
audioTracks: mapped.filter((track) => track.type === "audio"),
|
|
3482
|
-
otherTracks: []
|
|
3483
|
-
};
|
|
3551
|
+
return mapped;
|
|
3484
3552
|
};
|
|
3485
3553
|
var hasAllTracksFromTransportStream = (parserState) => {
|
|
3486
3554
|
try {
|
|
@@ -3527,7 +3595,7 @@ var getHvc1CodecString = (data) => {
|
|
|
3527
3595
|
|
|
3528
3596
|
// src/containers/webm/traversal.ts
|
|
3529
3597
|
var getMainSegment = (segments) => {
|
|
3530
|
-
return segments.find((s) => s.type === "Segment");
|
|
3598
|
+
return segments.find((s) => s.type === "Segment") ?? null;
|
|
3531
3599
|
};
|
|
3532
3600
|
var getTrackCodec = (track) => {
|
|
3533
3601
|
const child = track.value.find((b) => b.type === "CodecID");
|
|
@@ -3742,9 +3810,9 @@ var parseColorSegment = (colourSegment) => {
|
|
|
3742
3810
|
const primaries2 = getPrimariesSegment(colourSegment);
|
|
3743
3811
|
const range2 = getRangeSegment(colourSegment);
|
|
3744
3812
|
return {
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
primaries: primaries2 ? primaries2.value.value
|
|
3813
|
+
transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2.value.value) : null,
|
|
3814
|
+
matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2.value.value) : null,
|
|
3815
|
+
primaries: primaries2 ? getPrimariesFromIndex(primaries2.value.value) : null,
|
|
3748
3816
|
fullRange: transferCharacteristics2?.value.value && matrixCoefficients2?.value.value ? null : range2 ? Boolean(range2?.value.value) : null
|
|
3749
3817
|
};
|
|
3750
3818
|
};
|
|
@@ -3847,7 +3915,7 @@ var getDescription = (track) => {
|
|
|
3847
3915
|
}
|
|
3848
3916
|
return;
|
|
3849
3917
|
};
|
|
3850
|
-
var
|
|
3918
|
+
var getMatroskaVideoCodecEnum = ({
|
|
3851
3919
|
codecSegment: codec
|
|
3852
3920
|
}) => {
|
|
3853
3921
|
if (codec.value === "V_VP8") {
|
|
@@ -3902,7 +3970,7 @@ var getMatroskaVideoCodecString = ({
|
|
|
3902
3970
|
}
|
|
3903
3971
|
throw new Error(`Unknown codec: ${codec.value}`);
|
|
3904
3972
|
};
|
|
3905
|
-
var
|
|
3973
|
+
var getMatroskaAudioCodecEnum = ({
|
|
3906
3974
|
track
|
|
3907
3975
|
}) => {
|
|
3908
3976
|
const codec = getCodecSegment(track);
|
|
@@ -4007,6 +4075,28 @@ var getTrack = ({
|
|
|
4007
4075
|
if (!codecString) {
|
|
4008
4076
|
return null;
|
|
4009
4077
|
}
|
|
4078
|
+
const codecEnum = getMatroskaVideoCodecEnum({
|
|
4079
|
+
codecSegment: codec
|
|
4080
|
+
});
|
|
4081
|
+
const codecData = codecPrivate2 === null ? null : codecEnum === "h264" ? { type: "avc-sps-pps", data: codecPrivate2 } : codecEnum === "av1" ? {
|
|
4082
|
+
type: "av1c-data",
|
|
4083
|
+
data: codecPrivate2
|
|
4084
|
+
} : codecEnum === "h265" ? {
|
|
4085
|
+
type: "hvcc-data",
|
|
4086
|
+
data: codecPrivate2
|
|
4087
|
+
} : codecEnum === "vp8" ? {
|
|
4088
|
+
type: "unknown-data",
|
|
4089
|
+
data: codecPrivate2
|
|
4090
|
+
} : codecEnum === "vp9" ? {
|
|
4091
|
+
type: "unknown-data",
|
|
4092
|
+
data: codecPrivate2
|
|
4093
|
+
} : null;
|
|
4094
|
+
const advancedColor = colour ? parseColorSegment(colour) : {
|
|
4095
|
+
fullRange: null,
|
|
4096
|
+
matrix: null,
|
|
4097
|
+
primaries: null,
|
|
4098
|
+
transfer: null
|
|
4099
|
+
};
|
|
4010
4100
|
return {
|
|
4011
4101
|
m3uStreamFormat: null,
|
|
4012
4102
|
type: "video",
|
|
@@ -4025,17 +4115,10 @@ var getTrack = ({
|
|
|
4025
4115
|
displayAspectHeight: displayHeight2 ? displayHeight2.value.value : height.value.value,
|
|
4026
4116
|
displayAspectWidth: displayWidth2 ? displayWidth2.value.value : width.value.value,
|
|
4027
4117
|
rotation: 0,
|
|
4028
|
-
|
|
4029
|
-
|
|
4030
|
-
|
|
4031
|
-
|
|
4032
|
-
matrixCoefficients: null,
|
|
4033
|
-
primaries: null,
|
|
4034
|
-
transferCharacteristics: null
|
|
4035
|
-
},
|
|
4036
|
-
codecWithoutConfig: getMatroskaVideoCodecWithoutConfigString({
|
|
4037
|
-
codecSegment: codec
|
|
4038
|
-
}),
|
|
4118
|
+
codecData,
|
|
4119
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
4120
|
+
advancedColor,
|
|
4121
|
+
codecEnum,
|
|
4039
4122
|
fps: null
|
|
4040
4123
|
};
|
|
4041
4124
|
}
|
|
@@ -4046,17 +4129,17 @@ var getTrack = ({
|
|
|
4046
4129
|
if (sampleRate === null) {
|
|
4047
4130
|
throw new Error("Could not find sample rate or number of channels");
|
|
4048
4131
|
}
|
|
4132
|
+
const codecString = getMatroskaAudioCodecString(track);
|
|
4049
4133
|
return {
|
|
4050
4134
|
type: "audio",
|
|
4051
4135
|
trackId,
|
|
4052
|
-
codec:
|
|
4136
|
+
codec: codecString,
|
|
4053
4137
|
timescale,
|
|
4054
4138
|
numberOfChannels,
|
|
4055
4139
|
sampleRate,
|
|
4056
4140
|
description: getAudioDescription(track),
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
codecWithoutConfig: getMatroskaAudioCodecWithoutConfigString({
|
|
4141
|
+
codecData: codecPrivate2 ? codecString === "opus" ? { type: "ogg-identification", data: codecPrivate2 } : { type: "unknown-data", data: codecPrivate2 } : null,
|
|
4142
|
+
codecEnum: getMatroskaAudioCodecEnum({
|
|
4060
4143
|
track
|
|
4061
4144
|
})
|
|
4062
4145
|
};
|
|
@@ -4169,51 +4252,23 @@ var getHasTracks = (state, mayUsePrecomputed) => {
|
|
|
4169
4252
|
throw new Error("Unknown container " + structure);
|
|
4170
4253
|
};
|
|
4171
4254
|
var getCategorizedTracksFromMatroska = (state) => {
|
|
4172
|
-
const videoTracks = [];
|
|
4173
|
-
const audioTracks = [];
|
|
4174
|
-
const otherTracks = [];
|
|
4175
4255
|
const { resolved } = getTracksFromMatroska({
|
|
4176
4256
|
structureState: state.structure,
|
|
4177
4257
|
webmState: state.webm
|
|
4178
4258
|
});
|
|
4179
|
-
|
|
4180
|
-
if (track.type === "video") {
|
|
4181
|
-
videoTracks.push(track);
|
|
4182
|
-
} else if (track.type === "audio") {
|
|
4183
|
-
audioTracks.push(track);
|
|
4184
|
-
} else if (track.type === "other") {
|
|
4185
|
-
otherTracks.push(track);
|
|
4186
|
-
}
|
|
4187
|
-
}
|
|
4188
|
-
return {
|
|
4189
|
-
videoTracks,
|
|
4190
|
-
audioTracks,
|
|
4191
|
-
otherTracks
|
|
4192
|
-
};
|
|
4259
|
+
return resolved;
|
|
4193
4260
|
};
|
|
4194
4261
|
var getTracksFromMoovBox = (moovBox) => {
|
|
4195
|
-
const
|
|
4196
|
-
const audioTracks = [];
|
|
4197
|
-
const otherTracks = [];
|
|
4262
|
+
const mediaParserTracks = [];
|
|
4198
4263
|
const tracks2 = getTraks(moovBox);
|
|
4199
4264
|
for (const trakBox of tracks2) {
|
|
4200
4265
|
const track = makeBaseMediaTrack(trakBox);
|
|
4201
4266
|
if (!track) {
|
|
4202
4267
|
continue;
|
|
4203
4268
|
}
|
|
4204
|
-
|
|
4205
|
-
videoTracks.push(track);
|
|
4206
|
-
} else if (track.type === "audio") {
|
|
4207
|
-
audioTracks.push(track);
|
|
4208
|
-
} else if (track.type === "other") {
|
|
4209
|
-
otherTracks.push(track);
|
|
4210
|
-
}
|
|
4269
|
+
mediaParserTracks.push(track);
|
|
4211
4270
|
}
|
|
4212
|
-
return
|
|
4213
|
-
videoTracks,
|
|
4214
|
-
audioTracks,
|
|
4215
|
-
otherTracks
|
|
4216
|
-
};
|
|
4271
|
+
return mediaParserTracks;
|
|
4217
4272
|
};
|
|
4218
4273
|
var getTracksFromIsoBaseMedia = ({
|
|
4219
4274
|
mayUsePrecomputed,
|
|
@@ -4228,11 +4283,7 @@ var getTracksFromIsoBaseMedia = ({
|
|
|
4228
4283
|
mayUsePrecomputed
|
|
4229
4284
|
});
|
|
4230
4285
|
if (!moovBox) {
|
|
4231
|
-
return
|
|
4232
|
-
videoTracks: [],
|
|
4233
|
-
audioTracks: [],
|
|
4234
|
-
otherTracks: []
|
|
4235
|
-
};
|
|
4286
|
+
return [];
|
|
4236
4287
|
}
|
|
4237
4288
|
return getTracksFromMoovBox(moovBox);
|
|
4238
4289
|
};
|
|
@@ -4241,11 +4292,7 @@ var defaultGetTracks = (parserState) => {
|
|
|
4241
4292
|
if (tracks2.length === 0) {
|
|
4242
4293
|
throw new Error("No tracks found");
|
|
4243
4294
|
}
|
|
4244
|
-
return
|
|
4245
|
-
audioTracks: tracks2.filter((t) => t.type === "audio"),
|
|
4246
|
-
otherTracks: [],
|
|
4247
|
-
videoTracks: tracks2.filter((t) => t.type === "video")
|
|
4248
|
-
};
|
|
4295
|
+
return tracks2;
|
|
4249
4296
|
};
|
|
4250
4297
|
var getTracks = (state, mayUsePrecomputed) => {
|
|
4251
4298
|
const structure = state.structure.getStructure();
|
|
@@ -4275,16 +4322,15 @@ var getTracks = (state, mayUsePrecomputed) => {
|
|
|
4275
4322
|
// src/get-audio-codec.ts
|
|
4276
4323
|
var getAudioCodec = (parserState) => {
|
|
4277
4324
|
const tracks2 = getTracks(parserState, true);
|
|
4278
|
-
|
|
4279
|
-
if (allTracks === 0) {
|
|
4325
|
+
if (tracks2.length === 0) {
|
|
4280
4326
|
throw new Error("No tracks yet");
|
|
4281
4327
|
}
|
|
4282
|
-
const audioTrack = tracks2.
|
|
4328
|
+
const audioTrack = tracks2.find((t) => t.type === "audio");
|
|
4283
4329
|
if (!audioTrack) {
|
|
4284
4330
|
return null;
|
|
4285
4331
|
}
|
|
4286
4332
|
if (audioTrack.type === "audio") {
|
|
4287
|
-
return audioTrack.
|
|
4333
|
+
return audioTrack.codecEnum;
|
|
4288
4334
|
}
|
|
4289
4335
|
return null;
|
|
4290
4336
|
};
|
|
@@ -4341,7 +4387,7 @@ var getCodecPrivateFromTrak = (trakBox) => {
|
|
|
4341
4387
|
if (!mp4a) {
|
|
4342
4388
|
return null;
|
|
4343
4389
|
}
|
|
4344
|
-
return mp4a.asBytes;
|
|
4390
|
+
return { type: "aac-config", data: mp4a.asBytes };
|
|
4345
4391
|
};
|
|
4346
4392
|
var onSample = (sample, children) => {
|
|
4347
4393
|
const child = children.find((c) => c.type === "esds-box");
|
|
@@ -4422,19 +4468,19 @@ var getAudioCodecStringFromTrak = (trak) => {
|
|
|
4422
4468
|
if (codec.format === "lpcm") {
|
|
4423
4469
|
return {
|
|
4424
4470
|
codecString: "pcm-s16",
|
|
4425
|
-
description: codec.description
|
|
4471
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4426
4472
|
};
|
|
4427
4473
|
}
|
|
4428
4474
|
if (codec.format === "twos") {
|
|
4429
4475
|
return {
|
|
4430
4476
|
codecString: "pcm-s16",
|
|
4431
|
-
description: codec.description
|
|
4477
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4432
4478
|
};
|
|
4433
4479
|
}
|
|
4434
4480
|
if (codec.format === "in24") {
|
|
4435
4481
|
return {
|
|
4436
4482
|
codecString: "pcm-s24",
|
|
4437
|
-
description: codec.description
|
|
4483
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4438
4484
|
};
|
|
4439
4485
|
}
|
|
4440
4486
|
const codecStringWithoutMp3Exception = [
|
|
@@ -4442,10 +4488,31 @@ var getAudioCodecStringFromTrak = (trak) => {
|
|
|
4442
4488
|
codec.primarySpecificator ? codec.primarySpecificator.toString(16) : null,
|
|
4443
4489
|
codec.secondarySpecificator ? codec.secondarySpecificator.toString().padStart(2, "0") : null
|
|
4444
4490
|
].filter(Boolean).join(".");
|
|
4445
|
-
const codecString = codecStringWithoutMp3Exception === "mp4a.6b" ? "mp3" : codecStringWithoutMp3Exception;
|
|
4491
|
+
const codecString = codecStringWithoutMp3Exception.toLowerCase() === "mp4a.6b" || codecStringWithoutMp3Exception.toLowerCase() === "mp4a.69" ? "mp3" : codecStringWithoutMp3Exception;
|
|
4492
|
+
if (codecString === "mp3") {
|
|
4493
|
+
return {
|
|
4494
|
+
codecString,
|
|
4495
|
+
description: codec.description ? {
|
|
4496
|
+
type: "unknown-data",
|
|
4497
|
+
data: codec.description
|
|
4498
|
+
} : undefined
|
|
4499
|
+
};
|
|
4500
|
+
}
|
|
4501
|
+
if (codecString.startsWith("mp4a.")) {
|
|
4502
|
+
return {
|
|
4503
|
+
codecString,
|
|
4504
|
+
description: codec.description ? {
|
|
4505
|
+
type: "aac-config",
|
|
4506
|
+
data: codec.description
|
|
4507
|
+
} : undefined
|
|
4508
|
+
};
|
|
4509
|
+
}
|
|
4446
4510
|
return {
|
|
4447
4511
|
codecString,
|
|
4448
|
-
description: codec.description
|
|
4512
|
+
description: codec.description ? {
|
|
4513
|
+
type: "unknown-data",
|
|
4514
|
+
data: codec.description
|
|
4515
|
+
} : undefined
|
|
4449
4516
|
};
|
|
4450
4517
|
};
|
|
4451
4518
|
var getAudioCodecFromAudioCodecInfo = (codec) => {
|
|
@@ -4537,11 +4604,14 @@ var getDimensions = (state) => {
|
|
|
4537
4604
|
if (structure && isAudioStructure(structure)) {
|
|
4538
4605
|
return null;
|
|
4539
4606
|
}
|
|
4540
|
-
const
|
|
4541
|
-
if (!
|
|
4607
|
+
const tracks2 = getTracks(state, true);
|
|
4608
|
+
if (!tracks2.length) {
|
|
4609
|
+
return null;
|
|
4610
|
+
}
|
|
4611
|
+
const firstVideoTrack = tracks2.find((t) => t.type === "video");
|
|
4612
|
+
if (!firstVideoTrack) {
|
|
4542
4613
|
return null;
|
|
4543
4614
|
}
|
|
4544
|
-
const firstVideoTrack = videoTracks[0];
|
|
4545
4615
|
return {
|
|
4546
4616
|
width: firstVideoTrack.width,
|
|
4547
4617
|
height: firstVideoTrack.height,
|
|
@@ -5125,15 +5195,14 @@ var getDurationFromIsoBaseMedia = (parserState) => {
|
|
|
5125
5195
|
return mvhdBox.durationInSeconds;
|
|
5126
5196
|
}
|
|
5127
5197
|
const tracks2 = getTracks(parserState, true);
|
|
5128
|
-
const
|
|
5129
|
-
...tracks2.videoTracks,
|
|
5130
|
-
...tracks2.audioTracks,
|
|
5131
|
-
...tracks2.otherTracks
|
|
5132
|
-
];
|
|
5133
|
-
const allSamples = allTracks.map((t) => {
|
|
5198
|
+
const allSamples = tracks2.map((t) => {
|
|
5134
5199
|
const { timescale: ts } = t;
|
|
5200
|
+
const trakBox = getTrakBoxByTrackId(moovBox, t.trackId);
|
|
5201
|
+
if (!trakBox) {
|
|
5202
|
+
return null;
|
|
5203
|
+
}
|
|
5135
5204
|
const { samplePositions, isComplete } = getSamplePositionsFromTrack({
|
|
5136
|
-
trakBox
|
|
5205
|
+
trakBox,
|
|
5137
5206
|
moofBoxes,
|
|
5138
5207
|
moofComplete: areSamplesComplete({ moofBoxes, tfraBoxes })
|
|
5139
5208
|
});
|
|
@@ -5203,11 +5272,11 @@ var hasSlowDuration = (parserState) => {
|
|
|
5203
5272
|
|
|
5204
5273
|
// src/get-is-hdr.ts
|
|
5205
5274
|
var isVideoTrackHdr = (track) => {
|
|
5206
|
-
return track.
|
|
5275
|
+
return track.advancedColor.matrix === "bt2020-ncl" && (track.advancedColor.transfer === "hlg" || track.advancedColor.transfer === "pq") && track.advancedColor.primaries === "bt2020";
|
|
5207
5276
|
};
|
|
5208
5277
|
var getIsHdr = (state) => {
|
|
5209
|
-
const
|
|
5210
|
-
return
|
|
5278
|
+
const tracks2 = getTracks(state, true);
|
|
5279
|
+
return tracks2.some((track) => track.type === "video" && isVideoTrackHdr(track));
|
|
5211
5280
|
};
|
|
5212
5281
|
var hasHdr = (state) => {
|
|
5213
5282
|
return getHasTracks(state, true);
|
|
@@ -5215,19 +5284,28 @@ var hasHdr = (state) => {
|
|
|
5215
5284
|
|
|
5216
5285
|
// src/containers/iso-base-media/get-keyframes.ts
|
|
5217
5286
|
var getKeyframesFromIsoBaseMedia = (state) => {
|
|
5218
|
-
const
|
|
5287
|
+
const tracks2 = getTracksFromIsoBaseMedia({
|
|
5219
5288
|
isoState: state.iso,
|
|
5220
5289
|
m3uPlaylistContext: state.m3uPlaylistContext,
|
|
5221
5290
|
structure: state.structure,
|
|
5222
5291
|
mayUsePrecomputed: true
|
|
5223
5292
|
});
|
|
5293
|
+
const videoTracks = tracks2.filter((t) => t.type === "video");
|
|
5224
5294
|
const structure = state.structure.getIsoStructure();
|
|
5225
5295
|
const moofBoxes = getMoofBoxes(structure.boxes);
|
|
5226
5296
|
const tfraBoxes = getTfraBoxes(structure.boxes);
|
|
5297
|
+
const moov = getMoovFromFromIsoStructure(structure);
|
|
5298
|
+
if (!moov) {
|
|
5299
|
+
return [];
|
|
5300
|
+
}
|
|
5227
5301
|
const allSamples = videoTracks.map((t) => {
|
|
5228
5302
|
const { timescale: ts } = t;
|
|
5303
|
+
const trakBox = getTrakBoxByTrackId(moov, t.trackId);
|
|
5304
|
+
if (!trakBox) {
|
|
5305
|
+
return [];
|
|
5306
|
+
}
|
|
5229
5307
|
const { samplePositions, isComplete } = getSamplePositionsFromTrack({
|
|
5230
|
-
trakBox
|
|
5308
|
+
trakBox,
|
|
5231
5309
|
moofBoxes,
|
|
5232
5310
|
moofComplete: areSamplesComplete({
|
|
5233
5311
|
moofBoxes,
|
|
@@ -5515,7 +5593,7 @@ var hasMetadata = (structure) => {
|
|
|
5515
5593
|
if (structure.type === "wav") {
|
|
5516
5594
|
return getMetadataFromWav(structure) !== null;
|
|
5517
5595
|
}
|
|
5518
|
-
if (structure.type === "m3u" || structure.type === "transport-stream") {
|
|
5596
|
+
if (structure.type === "m3u" || structure.type === "transport-stream" || structure.type === "aac") {
|
|
5519
5597
|
return true;
|
|
5520
5598
|
}
|
|
5521
5599
|
if (structure.type === "flac") {
|
|
@@ -5530,9 +5608,6 @@ var hasMetadata = (structure) => {
|
|
|
5530
5608
|
if (structure.type === "riff") {
|
|
5531
5609
|
return false;
|
|
5532
5610
|
}
|
|
5533
|
-
if (structure.type === "aac") {
|
|
5534
|
-
return true;
|
|
5535
|
-
}
|
|
5536
5611
|
throw new Error("Unknown container " + structure);
|
|
5537
5612
|
};
|
|
5538
5613
|
|
|
@@ -5680,10 +5755,18 @@ var findKeyframeBeforeTime = ({
|
|
|
5680
5755
|
|
|
5681
5756
|
// src/containers/iso-base-media/find-track-to-seek.ts
|
|
5682
5757
|
var findAnyTrackWithSamplePositions = (allTracks, struc) => {
|
|
5758
|
+
const moov = getMoovFromFromIsoStructure(struc);
|
|
5759
|
+
if (!moov) {
|
|
5760
|
+
return null;
|
|
5761
|
+
}
|
|
5683
5762
|
for (const track of allTracks) {
|
|
5684
5763
|
if (track.type === "video" || track.type === "audio") {
|
|
5764
|
+
const trakBox = getTrakBoxByTrackId(moov, track.trackId);
|
|
5765
|
+
if (!trakBox) {
|
|
5766
|
+
continue;
|
|
5767
|
+
}
|
|
5685
5768
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
5686
|
-
trakBox
|
|
5769
|
+
trakBox,
|
|
5687
5770
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
5688
5771
|
moofComplete: areSamplesComplete({
|
|
5689
5772
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
@@ -5704,8 +5787,16 @@ var findTrackToSeek = (allTracks, structure) => {
|
|
|
5704
5787
|
if (!firstVideoTrack) {
|
|
5705
5788
|
return findAnyTrackWithSamplePositions(allTracks, struc);
|
|
5706
5789
|
}
|
|
5790
|
+
const moov = getMoovFromFromIsoStructure(struc);
|
|
5791
|
+
if (!moov) {
|
|
5792
|
+
return null;
|
|
5793
|
+
}
|
|
5794
|
+
const trakBox = getTrakBoxByTrackId(moov, firstVideoTrack.trackId);
|
|
5795
|
+
if (!trakBox) {
|
|
5796
|
+
return null;
|
|
5797
|
+
}
|
|
5707
5798
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
5708
|
-
trakBox
|
|
5799
|
+
trakBox,
|
|
5709
5800
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
5710
5801
|
moofComplete: areSamplesComplete({
|
|
5711
5802
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
@@ -5838,15 +5929,30 @@ var getSeekingByteFromFragmentedMp4 = async ({
|
|
|
5838
5929
|
logLevel,
|
|
5839
5930
|
currentPosition,
|
|
5840
5931
|
isoState,
|
|
5841
|
-
|
|
5842
|
-
isLastChunkInPlaylist
|
|
5932
|
+
tracks: tracks2,
|
|
5933
|
+
isLastChunkInPlaylist,
|
|
5934
|
+
structure,
|
|
5935
|
+
mp4HeaderSegment
|
|
5843
5936
|
}) => {
|
|
5844
|
-
const firstVideoTrack =
|
|
5845
|
-
const firstTrack = firstVideoTrack ??
|
|
5937
|
+
const firstVideoTrack = tracks2.find((t) => t.type === "video");
|
|
5938
|
+
const firstTrack = firstVideoTrack ?? tracks2.find((t) => t.type === "audio");
|
|
5846
5939
|
if (!firstTrack) {
|
|
5847
5940
|
throw new Error("no video and no audio tracks");
|
|
5848
5941
|
}
|
|
5849
|
-
const
|
|
5942
|
+
const moov = getMoovBoxFromState({
|
|
5943
|
+
structureState: structure,
|
|
5944
|
+
isoState,
|
|
5945
|
+
mp4HeaderSegment,
|
|
5946
|
+
mayUsePrecomputed: true
|
|
5947
|
+
});
|
|
5948
|
+
if (!moov) {
|
|
5949
|
+
throw new Error("No moov atom found");
|
|
5950
|
+
}
|
|
5951
|
+
const trakBox = getTrakBoxByTrackId(moov, firstTrack.trackId);
|
|
5952
|
+
if (!trakBox) {
|
|
5953
|
+
throw new Error("No trak box found");
|
|
5954
|
+
}
|
|
5955
|
+
const tkhdBox = getTkhdBox(trakBox);
|
|
5850
5956
|
if (!tkhdBox) {
|
|
5851
5957
|
throw new Error("Expected tkhd box in trak box");
|
|
5852
5958
|
}
|
|
@@ -5934,11 +6040,6 @@ var getSeekingByteFromIsoBaseMedia = ({
|
|
|
5934
6040
|
structure,
|
|
5935
6041
|
mayUsePrecomputed: false
|
|
5936
6042
|
});
|
|
5937
|
-
const allTracks = [
|
|
5938
|
-
...tracks2.videoTracks,
|
|
5939
|
-
...tracks2.audioTracks,
|
|
5940
|
-
...tracks2.otherTracks
|
|
5941
|
-
];
|
|
5942
6043
|
const hasMoov = Boolean(getMoovBoxFromState({
|
|
5943
6044
|
structureState: structure,
|
|
5944
6045
|
isoState,
|
|
@@ -5958,11 +6059,13 @@ var getSeekingByteFromIsoBaseMedia = ({
|
|
|
5958
6059
|
logLevel,
|
|
5959
6060
|
currentPosition,
|
|
5960
6061
|
isoState,
|
|
5961
|
-
|
|
5962
|
-
isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false
|
|
6062
|
+
tracks: tracks2,
|
|
6063
|
+
isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false,
|
|
6064
|
+
structure,
|
|
6065
|
+
mp4HeaderSegment: m3uPlaylistContext?.mp4HeaderSegment ?? null
|
|
5963
6066
|
});
|
|
5964
6067
|
}
|
|
5965
|
-
const trackWithSamplePositions = findTrackToSeek(
|
|
6068
|
+
const trackWithSamplePositions = findTrackToSeek(tracks2, structure);
|
|
5966
6069
|
if (!trackWithSamplePositions) {
|
|
5967
6070
|
return Promise.resolve({
|
|
5968
6071
|
type: "valid-but-must-wait"
|
|
@@ -6571,8 +6674,8 @@ var getVideoColorFromSps = (sps) => {
|
|
|
6571
6674
|
const transferCharacteristics2 = sps.vui_parameters?.transfer_characteristics;
|
|
6572
6675
|
const colorPrimaries = sps.vui_parameters?.colour_primaries;
|
|
6573
6676
|
return {
|
|
6574
|
-
|
|
6575
|
-
|
|
6677
|
+
matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
|
|
6678
|
+
transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
|
|
6576
6679
|
primaries: colorPrimaries ? getPrimariesFromIndex(colorPrimaries) : null,
|
|
6577
6680
|
fullRange: sps.vui_parameters?.video_full_range_flag ?? null
|
|
6578
6681
|
};
|
|
@@ -6851,6 +6954,8 @@ var handleAvcPacket = async ({
|
|
|
6851
6954
|
trackId: programId,
|
|
6852
6955
|
newOffset: startOffset
|
|
6853
6956
|
});
|
|
6957
|
+
const codecPrivate2 = createSpsPpsData(spsAndPps);
|
|
6958
|
+
const advancedColor = getVideoColorFromSps(spsAndPps.sps.spsData);
|
|
6854
6959
|
const track = {
|
|
6855
6960
|
m3uStreamFormat: null,
|
|
6856
6961
|
rotation: 0,
|
|
@@ -6858,7 +6963,7 @@ var handleAvcPacket = async ({
|
|
|
6858
6963
|
type: "video",
|
|
6859
6964
|
timescale: MPEG_TIMESCALE,
|
|
6860
6965
|
codec: getCodecStringFromSpsAndPps(spsAndPps.sps),
|
|
6861
|
-
|
|
6966
|
+
codecData: { type: "avc-sps-pps", data: codecPrivate2 },
|
|
6862
6967
|
fps: null,
|
|
6863
6968
|
codedWidth: dimensions.width,
|
|
6864
6969
|
codedHeight: dimensions.height,
|
|
@@ -6866,14 +6971,14 @@ var handleAvcPacket = async ({
|
|
|
6866
6971
|
width: dimensions.width,
|
|
6867
6972
|
displayAspectWidth: dimensions.width,
|
|
6868
6973
|
displayAspectHeight: dimensions.height,
|
|
6869
|
-
|
|
6870
|
-
codecWithoutConfig: "h264",
|
|
6974
|
+
codecEnum: "h264",
|
|
6871
6975
|
description: undefined,
|
|
6872
6976
|
sampleAspectRatio: {
|
|
6873
6977
|
denominator: sampleAspectRatio.height,
|
|
6874
6978
|
numerator: sampleAspectRatio.width
|
|
6875
6979
|
},
|
|
6876
|
-
|
|
6980
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
6981
|
+
advancedColor
|
|
6877
6982
|
};
|
|
6878
6983
|
await registerVideoTrack({
|
|
6879
6984
|
track,
|
|
@@ -7388,7 +7493,7 @@ var fieldsNeedSamplesMap = {
|
|
|
7388
7493
|
name: false,
|
|
7389
7494
|
rotation: false,
|
|
7390
7495
|
size: false,
|
|
7391
|
-
|
|
7496
|
+
slowStructure: false,
|
|
7392
7497
|
tracks: false,
|
|
7393
7498
|
unrotatedDimensions: false,
|
|
7394
7499
|
videoCodec: false,
|
|
@@ -7591,49 +7696,46 @@ var turnSeekIntoByte = async ({
|
|
|
7591
7696
|
type: "valid-but-must-wait"
|
|
7592
7697
|
};
|
|
7593
7698
|
}
|
|
7594
|
-
if (seek2
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7598
|
-
|
|
7599
|
-
|
|
7600
|
-
|
|
7601
|
-
|
|
7602
|
-
|
|
7603
|
-
|
|
7604
|
-
|
|
7605
|
-
|
|
7606
|
-
|
|
7607
|
-
|
|
7608
|
-
|
|
7609
|
-
|
|
7610
|
-
|
|
7611
|
-
|
|
7612
|
-
|
|
7613
|
-
|
|
7614
|
-
|
|
7615
|
-
|
|
7616
|
-
|
|
7617
|
-
|
|
7618
|
-
};
|
|
7619
|
-
}
|
|
7620
|
-
const seekingByte = await getSeekingByte({
|
|
7621
|
-
info: seekingHints,
|
|
7622
|
-
time: seek2.timeInSeconds,
|
|
7623
|
-
logLevel,
|
|
7624
|
-
currentPosition: iterator.counter.getOffset(),
|
|
7625
|
-
isoState,
|
|
7626
|
-
transportStream,
|
|
7627
|
-
webmState,
|
|
7628
|
-
mediaSection: mediaSectionState2,
|
|
7629
|
-
m3uPlaylistContext,
|
|
7630
|
-
structure: structureState,
|
|
7631
|
-
riffState,
|
|
7632
|
-
m3uState
|
|
7633
|
-
});
|
|
7634
|
-
return seekingByte;
|
|
7699
|
+
if (seek2 < 0) {
|
|
7700
|
+
throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
|
|
7701
|
+
}
|
|
7702
|
+
const seekingHints = getSeekingHints({
|
|
7703
|
+
riffState,
|
|
7704
|
+
samplesObserved,
|
|
7705
|
+
structureState,
|
|
7706
|
+
mediaSectionState: mediaSectionState2,
|
|
7707
|
+
isoState,
|
|
7708
|
+
transportStream,
|
|
7709
|
+
tracksState,
|
|
7710
|
+
keyframesState: keyframes,
|
|
7711
|
+
webmState,
|
|
7712
|
+
flacState,
|
|
7713
|
+
mp3State,
|
|
7714
|
+
contentLength,
|
|
7715
|
+
aacState,
|
|
7716
|
+
m3uPlaylistContext
|
|
7717
|
+
});
|
|
7718
|
+
if (!seekingHints) {
|
|
7719
|
+
Log.trace(logLevel, "No seeking info, cannot seek yet");
|
|
7720
|
+
return {
|
|
7721
|
+
type: "valid-but-must-wait"
|
|
7722
|
+
};
|
|
7635
7723
|
}
|
|
7636
|
-
|
|
7724
|
+
const seekingByte = await getSeekingByte({
|
|
7725
|
+
info: seekingHints,
|
|
7726
|
+
time: seek2,
|
|
7727
|
+
logLevel,
|
|
7728
|
+
currentPosition: iterator.counter.getOffset(),
|
|
7729
|
+
isoState,
|
|
7730
|
+
transportStream,
|
|
7731
|
+
webmState,
|
|
7732
|
+
mediaSection: mediaSectionState2,
|
|
7733
|
+
m3uPlaylistContext,
|
|
7734
|
+
structure: structureState,
|
|
7735
|
+
riffState,
|
|
7736
|
+
m3uState
|
|
7737
|
+
});
|
|
7738
|
+
return seekingByte;
|
|
7637
7739
|
};
|
|
7638
7740
|
var getWorkOnSeekRequestOptions = (state) => {
|
|
7639
7741
|
return {
|
|
@@ -7695,7 +7797,7 @@ var workOnSeekRequest = async (options) => {
|
|
|
7695
7797
|
m3uState
|
|
7696
7798
|
} = options;
|
|
7697
7799
|
const seek2 = controller._internals.seekSignal.getSeek();
|
|
7698
|
-
if (
|
|
7800
|
+
if (seek2 === null) {
|
|
7699
7801
|
return;
|
|
7700
7802
|
}
|
|
7701
7803
|
Log.trace(logLevel, `Has seek request for ${src}: ${JSON.stringify(seek2)}`);
|
|
@@ -7788,13 +7890,13 @@ var emitAvailableInfo = async ({
|
|
|
7788
7890
|
} = state;
|
|
7789
7891
|
for (const key of keys) {
|
|
7790
7892
|
await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
|
|
7791
|
-
if (key === "
|
|
7792
|
-
if (hasInfo.
|
|
7793
|
-
await callbackFunctions.
|
|
7794
|
-
if (fieldsInReturnValue.
|
|
7795
|
-
returnValue.
|
|
7893
|
+
if (key === "slowStructure") {
|
|
7894
|
+
if (hasInfo.slowStructure && !emittedFields.slowStructure) {
|
|
7895
|
+
await callbackFunctions.onSlowStructure?.(state.structure.getStructure());
|
|
7896
|
+
if (fieldsInReturnValue.slowStructure) {
|
|
7897
|
+
returnValue.slowStructure = state.structure.getStructure();
|
|
7796
7898
|
}
|
|
7797
|
-
emittedFields.
|
|
7899
|
+
emittedFields.slowStructure = true;
|
|
7798
7900
|
}
|
|
7799
7901
|
continue;
|
|
7800
7902
|
}
|
|
@@ -7922,10 +8024,10 @@ var emitAvailableInfo = async ({
|
|
|
7922
8024
|
}
|
|
7923
8025
|
if (key === "tracks") {
|
|
7924
8026
|
if (!emittedFields.tracks && hasInfo.tracks) {
|
|
7925
|
-
const
|
|
7926
|
-
await callbackFunctions.onTracks?.(
|
|
8027
|
+
const tracks2 = getTracks(state, true);
|
|
8028
|
+
await callbackFunctions.onTracks?.(tracks2);
|
|
7927
8029
|
if (fieldsInReturnValue.tracks) {
|
|
7928
|
-
returnValue.tracks =
|
|
8030
|
+
returnValue.tracks = tracks2;
|
|
7929
8031
|
}
|
|
7930
8032
|
emittedFields.tracks = true;
|
|
7931
8033
|
}
|
|
@@ -8126,12 +8228,29 @@ var getHasCallbacks = (state) => {
|
|
|
8126
8228
|
const hasAllTracksAndNoCallbacks = !state.callbacks.tracks.hasAllTracks() || Object.values(state.callbacks.videoSampleCallbacks).length > 0 || Object.values(state.callbacks.audioSampleCallbacks).length > 0;
|
|
8127
8229
|
return hasAllTracksAndNoCallbacks;
|
|
8128
8230
|
};
|
|
8231
|
+
var missesMatroskaTracks = (state) => {
|
|
8232
|
+
const struct = state.structure.getStructureOrNull();
|
|
8233
|
+
if (struct === null) {
|
|
8234
|
+
return false;
|
|
8235
|
+
}
|
|
8236
|
+
if (struct.type !== "matroska") {
|
|
8237
|
+
return false;
|
|
8238
|
+
}
|
|
8239
|
+
const mainSegment = getMainSegment(struct.boxes);
|
|
8240
|
+
if (mainSegment === null) {
|
|
8241
|
+
return false;
|
|
8242
|
+
}
|
|
8243
|
+
return getTracksFromMatroska({
|
|
8244
|
+
structureState: state.structure,
|
|
8245
|
+
webmState: state.webm
|
|
8246
|
+
}).missingInfo.length > 0;
|
|
8247
|
+
};
|
|
8129
8248
|
var maySkipVideoData = ({ state }) => {
|
|
8130
8249
|
const hasCallbacks = getHasCallbacks(state);
|
|
8131
8250
|
return !hasCallbacks && !needsToIterateOverSamples({
|
|
8132
8251
|
emittedFields: state.emittedFields,
|
|
8133
8252
|
fields: state.fields
|
|
8134
|
-
});
|
|
8253
|
+
}) && !missesMatroskaTracks(state);
|
|
8135
8254
|
};
|
|
8136
8255
|
var maySkipOverSamplesInTheMiddle = ({
|
|
8137
8256
|
state
|
|
@@ -8151,7 +8270,7 @@ var getAvailableInfo = ({
|
|
|
8151
8270
|
const structure = state.structure.getStructureOrNull();
|
|
8152
8271
|
const infos = keys.map(([_key]) => {
|
|
8153
8272
|
const key = _key;
|
|
8154
|
-
if (key === "
|
|
8273
|
+
if (key === "slowStructure") {
|
|
8155
8274
|
return false;
|
|
8156
8275
|
}
|
|
8157
8276
|
if (key === "durationInSeconds") {
|
|
@@ -8350,14 +8469,13 @@ var parseAac = async (state) => {
|
|
|
8350
8469
|
container: "aac",
|
|
8351
8470
|
track: {
|
|
8352
8471
|
codec: mapAudioObjectTypeToCodecString(audioObjectType),
|
|
8353
|
-
|
|
8354
|
-
|
|
8472
|
+
codecEnum: "aac",
|
|
8473
|
+
codecData: { type: "aac-config", data: codecPrivate2 },
|
|
8355
8474
|
description: codecPrivate2,
|
|
8356
8475
|
numberOfChannels: channelConfiguration,
|
|
8357
8476
|
sampleRate,
|
|
8358
8477
|
timescale: 1e6,
|
|
8359
8478
|
trackId: 0,
|
|
8360
|
-
trakBox: null,
|
|
8361
8479
|
type: "audio"
|
|
8362
8480
|
},
|
|
8363
8481
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
@@ -8754,13 +8872,12 @@ var parseStreamInfo = async ({
|
|
|
8754
8872
|
codec: "flac",
|
|
8755
8873
|
type: "audio",
|
|
8756
8874
|
description: asUint8Array,
|
|
8757
|
-
|
|
8758
|
-
|
|
8875
|
+
codecData: { type: "flac-description", data: asUint8Array },
|
|
8876
|
+
codecEnum: "flac",
|
|
8759
8877
|
numberOfChannels: channels2,
|
|
8760
8878
|
sampleRate,
|
|
8761
8879
|
timescale: 1e6,
|
|
8762
|
-
trackId: 0
|
|
8763
|
-
trakBox: null
|
|
8880
|
+
trackId: 0
|
|
8764
8881
|
},
|
|
8765
8882
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
8766
8883
|
tracks: state.callbacks.tracks,
|
|
@@ -8842,11 +8959,6 @@ var calculateFlatSamples = ({
|
|
|
8842
8959
|
mediaSectionStart
|
|
8843
8960
|
}) => {
|
|
8844
8961
|
const tracks2 = getTracks(state, true);
|
|
8845
|
-
const allTracks = [
|
|
8846
|
-
...tracks2.videoTracks,
|
|
8847
|
-
...tracks2.audioTracks,
|
|
8848
|
-
...tracks2.otherTracks
|
|
8849
|
-
];
|
|
8850
8962
|
const moofBoxes = getMoofBoxes(state.structure.getIsoStructure().boxes);
|
|
8851
8963
|
const tfraBoxes = deduplicateTfraBoxesByOffset([
|
|
8852
8964
|
...state.iso.tfra.getTfraBoxes(),
|
|
@@ -8857,9 +8969,22 @@ var calculateFlatSamples = ({
|
|
|
8857
8969
|
if (moofBoxes.length > 0 && !relevantMoofBox) {
|
|
8858
8970
|
throw new Error("No relevant moof box found");
|
|
8859
8971
|
}
|
|
8860
|
-
const
|
|
8972
|
+
const moov = getMoovBoxFromState({
|
|
8973
|
+
structureState: state.structure,
|
|
8974
|
+
isoState: state.iso,
|
|
8975
|
+
mp4HeaderSegment: state.m3uPlaylistContext?.mp4HeaderSegment ?? null,
|
|
8976
|
+
mayUsePrecomputed: true
|
|
8977
|
+
});
|
|
8978
|
+
if (!moov) {
|
|
8979
|
+
throw new Error("No moov box found");
|
|
8980
|
+
}
|
|
8981
|
+
const flatSamples = tracks2.map((track) => {
|
|
8982
|
+
const trakBox = getTrakBoxByTrackId(moov, track.trackId);
|
|
8983
|
+
if (!trakBox) {
|
|
8984
|
+
throw new Error("No trak box found");
|
|
8985
|
+
}
|
|
8861
8986
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
8862
|
-
trakBox
|
|
8987
|
+
trakBox,
|
|
8863
8988
|
moofBoxes: relevantMoofBox ? [relevantMoofBox] : [],
|
|
8864
8989
|
moofComplete
|
|
8865
8990
|
});
|
|
@@ -8927,7 +9052,7 @@ var needsTracksForField = ({
|
|
|
8927
9052
|
}
|
|
8928
9053
|
return true;
|
|
8929
9054
|
}
|
|
8930
|
-
if (field === "audioCodec" || field === "durationInSeconds" || field === "slowDurationInSeconds" || field === "slowFps" || field === "fps" || field === "isHdr" || field === "rotation" || field === "
|
|
9055
|
+
if (field === "audioCodec" || field === "durationInSeconds" || field === "slowDurationInSeconds" || field === "slowFps" || field === "fps" || field === "isHdr" || field === "rotation" || field === "slowStructure" || field === "tracks" || field === "unrotatedDimensions" || field === "videoCodec" || field === "metadata" || field === "location" || field === "slowKeyframes" || field === "slowNumberOfFrames" || field === "keyframes" || field === "images" || field === "sampleRate" || field === "numberOfAudioChannels" || field === "slowAudioBitrate" || field === "slowVideoBitrate" || field === "m3uStreams") {
|
|
8931
9056
|
return true;
|
|
8932
9057
|
}
|
|
8933
9058
|
if (field === "container" || field === "internalStats" || field === "mimeType" || field === "name" || field === "size") {
|
|
@@ -11038,7 +11163,7 @@ var getMoovAtom = async ({
|
|
|
11038
11163
|
const boxes = [];
|
|
11039
11164
|
const canSkipTracksState = makeCanSkipTracksState({
|
|
11040
11165
|
hasAudioTrackHandlers: false,
|
|
11041
|
-
fields: {
|
|
11166
|
+
fields: { slowStructure: true },
|
|
11042
11167
|
hasVideoTrackHandlers: false,
|
|
11043
11168
|
structure: structureState()
|
|
11044
11169
|
});
|
|
@@ -11413,10 +11538,10 @@ var parseStreamInf = (str) => {
|
|
|
11413
11538
|
}
|
|
11414
11539
|
return {
|
|
11415
11540
|
type: "m3u-stream-info",
|
|
11416
|
-
|
|
11417
|
-
|
|
11541
|
+
averageBandwidthInBitsPerSec: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
|
|
11542
|
+
bandwidthInBitsPerSec: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
|
|
11418
11543
|
codecs: map.CODECS ? map.CODECS.split(",") : null,
|
|
11419
|
-
|
|
11544
|
+
dimensions: map.RESOLUTION ? {
|
|
11420
11545
|
width: parseInt(map.RESOLUTION.split("x")[0], 10),
|
|
11421
11546
|
height: parseInt(map.RESOLUTION.split("x")[1], 10)
|
|
11422
11547
|
} : null,
|
|
@@ -11631,7 +11756,7 @@ var afterManifestFetch = async ({
|
|
|
11631
11756
|
throw new Error("No streams found");
|
|
11632
11757
|
}
|
|
11633
11758
|
const selectedPlaylist = await selectStream({ streams, fn: selectM3uStreamFn });
|
|
11634
|
-
if (!selectedPlaylist.
|
|
11759
|
+
if (!selectedPlaylist.dimensions) {
|
|
11635
11760
|
throw new Error("Stream does not have a resolution");
|
|
11636
11761
|
}
|
|
11637
11762
|
m3uState.setSelectedMainPlaylist({
|
|
@@ -11736,7 +11861,7 @@ var parseMedia = (options) => {
|
|
|
11736
11861
|
onSlowKeyframes: options.onSlowKeyframes ?? null,
|
|
11737
11862
|
onSlowNumberOfFrames: options.onSlowNumberOfFrames ?? null,
|
|
11738
11863
|
onSlowVideoBitrate: options.onSlowVideoBitrate ?? null,
|
|
11739
|
-
|
|
11864
|
+
onSlowStructure: options.onSlowStructure ?? null,
|
|
11740
11865
|
onM3uStreams: options.onM3uStreams ?? null,
|
|
11741
11866
|
onTracks: options.onTracks ?? null,
|
|
11742
11867
|
onUnrotatedDimensions: options.onUnrotatedDimensions ?? null,
|
|
@@ -11778,16 +11903,10 @@ var considerSeekBasedOnChunk = async ({
|
|
|
11778
11903
|
const timestamp = Math.min(sample.dts / sample.timescale, sample.cts / sample.timescale);
|
|
11779
11904
|
if (timestamp > pendingSeek.targetTime && chunkIndex !== null && chunkIndex > 0) {
|
|
11780
11905
|
m3uState.setNextSeekShouldSubtractChunks(playlistUrl, subtractChunks + 1);
|
|
11781
|
-
parentController.seek(
|
|
11782
|
-
type: "keyframe-before-time",
|
|
11783
|
-
timeInSeconds: pendingSeek.targetTime
|
|
11784
|
-
});
|
|
11906
|
+
parentController.seek(pendingSeek.targetTime);
|
|
11785
11907
|
return;
|
|
11786
11908
|
}
|
|
11787
|
-
childController.seek(
|
|
11788
|
-
type: "keyframe-before-time",
|
|
11789
|
-
timeInSeconds: pendingSeek.targetTime
|
|
11790
|
-
});
|
|
11909
|
+
childController.seek(pendingSeek.targetTime);
|
|
11791
11910
|
m3uState.setNextSeekShouldSubtractChunks(playlistUrl, 0);
|
|
11792
11911
|
m3uState.setSeekToSecondsToProcess(playlistUrl, null);
|
|
11793
11912
|
};
|
|
@@ -11965,7 +12084,7 @@ var processM3uChunk = ({
|
|
|
11965
12084
|
childController.pause();
|
|
11966
12085
|
currentPromise.resolver(makeContinuationFn());
|
|
11967
12086
|
},
|
|
11968
|
-
fields: chunk.isHeader ? {
|
|
12087
|
+
fields: chunk.isHeader ? { slowStructure: true } : undefined,
|
|
11969
12088
|
onTracks: () => {
|
|
11970
12089
|
if (!state.m3u.hasEmittedDoneWithTracks(playlistUrl)) {
|
|
11971
12090
|
state.m3u.setHasEmittedDoneWithTracks(playlistUrl);
|
|
@@ -12063,10 +12182,10 @@ var processM3uChunk = ({
|
|
|
12063
12182
|
}
|
|
12064
12183
|
});
|
|
12065
12184
|
if (chunk.isHeader) {
|
|
12066
|
-
if (data.
|
|
12185
|
+
if (data.slowStructure.type !== "iso-base-media") {
|
|
12067
12186
|
throw new Error("Expected an mp4 file");
|
|
12068
12187
|
}
|
|
12069
|
-
state.m3u.setMp4HeaderSegment(playlistUrl, data.
|
|
12188
|
+
state.m3u.setMp4HeaderSegment(playlistUrl, data.slowStructure);
|
|
12070
12189
|
}
|
|
12071
12190
|
} catch (e) {
|
|
12072
12191
|
currentPromise.rejector(e);
|
|
@@ -12640,14 +12759,13 @@ var parseMpegHeader = async ({
|
|
|
12640
12759
|
track: {
|
|
12641
12760
|
type: "audio",
|
|
12642
12761
|
codec: "mp3",
|
|
12643
|
-
|
|
12644
|
-
|
|
12762
|
+
codecData: null,
|
|
12763
|
+
codecEnum: "mp3",
|
|
12645
12764
|
description: undefined,
|
|
12646
12765
|
numberOfChannels,
|
|
12647
12766
|
sampleRate,
|
|
12648
12767
|
timescale: 1e6,
|
|
12649
|
-
trackId: 0
|
|
12650
|
-
trakBox: null
|
|
12768
|
+
trackId: 0
|
|
12651
12769
|
},
|
|
12652
12770
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
12653
12771
|
tracks: state.callbacks.tracks,
|
|
@@ -13233,7 +13351,7 @@ var parseMediaSection = async (state) => {
|
|
|
13233
13351
|
state
|
|
13234
13352
|
});
|
|
13235
13353
|
const tracks2 = getTracks(state, false);
|
|
13236
|
-
if (!tracks2.
|
|
13354
|
+
if (!tracks2.some((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
|
|
13237
13355
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
13238
13356
|
}
|
|
13239
13357
|
};
|
|
@@ -13613,13 +13731,12 @@ var handleAacPacket = async ({
|
|
|
13613
13731
|
});
|
|
13614
13732
|
const track = {
|
|
13615
13733
|
type: "audio",
|
|
13616
|
-
|
|
13734
|
+
codecData: { type: "aac-config", data: codecPrivate2 },
|
|
13617
13735
|
trackId: programId,
|
|
13618
|
-
trakBox: null,
|
|
13619
13736
|
timescale: MPEG_TIMESCALE,
|
|
13620
|
-
|
|
13737
|
+
codecEnum: "aac",
|
|
13621
13738
|
codec: mapAudioObjectTypeToCodecString(audioObjectType),
|
|
13622
|
-
description:
|
|
13739
|
+
description: codecPrivate2,
|
|
13623
13740
|
numberOfChannels: channelConfiguration,
|
|
13624
13741
|
sampleRate
|
|
13625
13742
|
};
|
|
@@ -14122,14 +14239,13 @@ var parseFmt = async ({
|
|
|
14122
14239
|
track: {
|
|
14123
14240
|
type: "audio",
|
|
14124
14241
|
codec: format,
|
|
14125
|
-
|
|
14242
|
+
codecData: null,
|
|
14126
14243
|
description: undefined,
|
|
14127
|
-
|
|
14244
|
+
codecEnum: format,
|
|
14128
14245
|
numberOfChannels,
|
|
14129
14246
|
sampleRate,
|
|
14130
14247
|
timescale: 1e6,
|
|
14131
|
-
trackId: 0
|
|
14132
|
-
trakBox: null
|
|
14248
|
+
trackId: 0
|
|
14133
14249
|
},
|
|
14134
14250
|
container: "wav",
|
|
14135
14251
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
@@ -14732,7 +14848,7 @@ var expectSegment = async ({
|
|
|
14732
14848
|
}
|
|
14733
14849
|
statesForProcessing.webmState.addCluster({
|
|
14734
14850
|
start: offset,
|
|
14735
|
-
size,
|
|
14851
|
+
size: size + (offsetAfterVInt - offset),
|
|
14736
14852
|
segment: isInsideSegment.index
|
|
14737
14853
|
});
|
|
14738
14854
|
const newSegment = {
|
|
@@ -14822,6 +14938,9 @@ var parseWebm = async (state) => {
|
|
|
14822
14938
|
return null;
|
|
14823
14939
|
}
|
|
14824
14940
|
if (isInsideCluster) {
|
|
14941
|
+
if (maySkipVideoData({ state })) {
|
|
14942
|
+
return makeSkip(Math.min(state.contentLength, isInsideCluster.size + isInsideCluster.start));
|
|
14943
|
+
}
|
|
14825
14944
|
const segments = structure.boxes.filter((box) => box.type === "Segment");
|
|
14826
14945
|
const segment = segments[isInsideCluster.segment];
|
|
14827
14946
|
if (!segment) {
|
|
@@ -14866,7 +14985,7 @@ var initVideo = async ({ state }) => {
|
|
|
14866
14985
|
throw new Error("No moov box found");
|
|
14867
14986
|
}
|
|
14868
14987
|
const tracks2 = getTracksFromMoovBox(moovAtom);
|
|
14869
|
-
for (const track of tracks2.
|
|
14988
|
+
for (const track of tracks2.filter((t) => t.type === "video")) {
|
|
14870
14989
|
await registerVideoTrack({
|
|
14871
14990
|
track,
|
|
14872
14991
|
container: "mp4",
|
|
@@ -14876,7 +14995,7 @@ var initVideo = async ({ state }) => {
|
|
|
14876
14995
|
tracks: state.callbacks.tracks
|
|
14877
14996
|
});
|
|
14878
14997
|
}
|
|
14879
|
-
for (const track of tracks2.
|
|
14998
|
+
for (const track of tracks2.filter((t) => t.type === "audio")) {
|
|
14880
14999
|
await registerAudioTrack({
|
|
14881
15000
|
track,
|
|
14882
15001
|
container: "mp4",
|
|
@@ -14964,14 +15083,6 @@ var initVideo = async ({ state }) => {
|
|
|
14964
15083
|
});
|
|
14965
15084
|
return;
|
|
14966
15085
|
}
|
|
14967
|
-
if (fileType.type === "gif") {
|
|
14968
|
-
return Promise.reject(new IsAGifError({
|
|
14969
|
-
message: "GIF files are not yet supported",
|
|
14970
|
-
mimeType,
|
|
14971
|
-
sizeInBytes: contentLength,
|
|
14972
|
-
fileName: name
|
|
14973
|
-
}));
|
|
14974
|
-
}
|
|
14975
15086
|
if (fileType.type === "pdf") {
|
|
14976
15087
|
return Promise.reject(new IsAPdfError({
|
|
14977
15088
|
message: "GIF files are not supported",
|
|
@@ -14980,7 +15091,7 @@ var initVideo = async ({ state }) => {
|
|
|
14980
15091
|
fileName: name
|
|
14981
15092
|
}));
|
|
14982
15093
|
}
|
|
14983
|
-
if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp") {
|
|
15094
|
+
if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp" || fileType.type === "gif") {
|
|
14984
15095
|
return Promise.reject(new IsAnImageError({
|
|
14985
15096
|
message: "Image files are not supported",
|
|
14986
15097
|
imageType: fileType.type,
|
|
@@ -15153,10 +15264,10 @@ var parseLoop = async ({
|
|
|
15153
15264
|
}
|
|
15154
15265
|
}
|
|
15155
15266
|
state.samplesObserved.setLastSampleObserved();
|
|
15156
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
15267
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
15157
15268
|
Log.verbose(state.logLevel, "Reached end of samples, but there is a pending seek. Trying to seek...");
|
|
15158
15269
|
await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
|
|
15159
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
15270
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
15160
15271
|
throw new Error("Reached the end of the file even though a seek was requested. This is likely a bug in the parser. You can report this at https://remotion.dev/report and we will fix it as soon as possible.");
|
|
15161
15272
|
}
|
|
15162
15273
|
await parseLoop({
|
|
@@ -15256,7 +15367,7 @@ var getFieldsFromCallback = ({
|
|
|
15256
15367
|
name: Boolean(callbacks.onName),
|
|
15257
15368
|
rotation: Boolean(callbacks.onRotation),
|
|
15258
15369
|
size: Boolean(callbacks.onSize),
|
|
15259
|
-
|
|
15370
|
+
slowStructure: Boolean(callbacks.onSlowStructure),
|
|
15260
15371
|
tracks: Boolean(callbacks.onTracks),
|
|
15261
15372
|
unrotatedDimensions: Boolean(callbacks.onUnrotatedDimensions),
|
|
15262
15373
|
videoCodec: Boolean(callbacks.onVideoCodec),
|
|
@@ -15339,7 +15450,7 @@ var emittedState = () => {
|
|
|
15339
15450
|
name: false,
|
|
15340
15451
|
rotation: false,
|
|
15341
15452
|
size: false,
|
|
15342
|
-
|
|
15453
|
+
slowStructure: false,
|
|
15343
15454
|
tracks: false,
|
|
15344
15455
|
videoCodec: false,
|
|
15345
15456
|
unrotatedDimensions: false,
|
|
@@ -16092,7 +16203,7 @@ var webmState = ({
|
|
|
16092
16203
|
},
|
|
16093
16204
|
isInsideCluster: (offset) => {
|
|
16094
16205
|
for (const cluster of clusters) {
|
|
16095
|
-
if (offset >= cluster.start && offset
|
|
16206
|
+
if (offset >= cluster.start && offset < cluster.start + cluster.size) {
|
|
16096
16207
|
return cluster;
|
|
16097
16208
|
}
|
|
16098
16209
|
}
|
|
@@ -16391,7 +16502,7 @@ var callbacksState = ({
|
|
|
16391
16502
|
const callback = audioSampleCallbacks[trackId];
|
|
16392
16503
|
if (audioSample.data.length > 0) {
|
|
16393
16504
|
if (callback) {
|
|
16394
|
-
if (seekSignal.getSeek()) {
|
|
16505
|
+
if (seekSignal.getSeek() !== null) {
|
|
16395
16506
|
Log.trace(logLevel, "Not emitting sample because seek is processing");
|
|
16396
16507
|
} else {
|
|
16397
16508
|
await callback(audioSample);
|
|
@@ -16409,7 +16520,7 @@ var callbacksState = ({
|
|
|
16409
16520
|
if (videoSample.data.length > 0) {
|
|
16410
16521
|
const callback = videoSampleCallbacks[trackId];
|
|
16411
16522
|
if (callback) {
|
|
16412
|
-
if (seekSignal.getSeek()) {
|
|
16523
|
+
if (seekSignal.getSeek() !== null) {
|
|
16413
16524
|
Log.trace(logLevel, "Not emitting sample because seek is processing");
|
|
16414
16525
|
} else {
|
|
16415
16526
|
await callback(videoSample);
|
|
@@ -16950,7 +17061,7 @@ var internalParseMedia = async function({
|
|
|
16950
17061
|
if (state.errored) {
|
|
16951
17062
|
throw state.errored;
|
|
16952
17063
|
}
|
|
16953
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
17064
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
16954
17065
|
throw new Error("Should not finish while a seek is pending");
|
|
16955
17066
|
}
|
|
16956
17067
|
return state.returnValue;
|
|
@@ -17001,17 +17112,6 @@ var serializeError = ({
|
|
|
17001
17112
|
logLevel,
|
|
17002
17113
|
seekingHints
|
|
17003
17114
|
}) => {
|
|
17004
|
-
if (error instanceof IsAGifError) {
|
|
17005
|
-
return {
|
|
17006
|
-
type: "response-error",
|
|
17007
|
-
errorName: "IsAGifError",
|
|
17008
|
-
errorMessage: error.message,
|
|
17009
|
-
errorStack: error.stack ?? "",
|
|
17010
|
-
mimeType: error.mimeType,
|
|
17011
|
-
sizeInBytes: error.sizeInBytes,
|
|
17012
|
-
fileName: error.fileName
|
|
17013
|
-
};
|
|
17014
|
-
}
|
|
17015
17115
|
if (error instanceof IsAnImageError) {
|
|
17016
17116
|
return {
|
|
17017
17117
|
type: "response-error",
|
|
@@ -17136,7 +17236,7 @@ var startParsing = async (message, reader) => {
|
|
|
17136
17236
|
postSlowFps,
|
|
17137
17237
|
postSlowDurationInSeconds,
|
|
17138
17238
|
postSlowVideoBitrate,
|
|
17139
|
-
|
|
17239
|
+
postSlowStructure,
|
|
17140
17240
|
postTracks,
|
|
17141
17241
|
postUnrotatedDimensions,
|
|
17142
17242
|
postVideoCodec,
|
|
@@ -17299,9 +17399,9 @@ var startParsing = async (message, reader) => {
|
|
|
17299
17399
|
value: videoBitrate
|
|
17300
17400
|
});
|
|
17301
17401
|
} : null,
|
|
17302
|
-
|
|
17402
|
+
onSlowStructure: postSlowStructure ? async (structure) => {
|
|
17303
17403
|
await executeCallback({
|
|
17304
|
-
callbackType: "structure",
|
|
17404
|
+
callbackType: "slow-structure",
|
|
17305
17405
|
value: structure
|
|
17306
17406
|
});
|
|
17307
17407
|
} : null,
|
|
@@ -17370,7 +17470,7 @@ var startParsing = async (message, reader) => {
|
|
|
17370
17470
|
}
|
|
17371
17471
|
return async (sample) => {
|
|
17372
17472
|
await executeCallback({
|
|
17373
|
-
callbackType: "on-audio-
|
|
17473
|
+
callbackType: "on-audio-sample",
|
|
17374
17474
|
value: sample,
|
|
17375
17475
|
trackId: params.track.trackId
|
|
17376
17476
|
});
|
|
@@ -17389,7 +17489,7 @@ var startParsing = async (message, reader) => {
|
|
|
17389
17489
|
}
|
|
17390
17490
|
return async (sample) => {
|
|
17391
17491
|
await executeCallback({
|
|
17392
|
-
callbackType: "on-
|
|
17492
|
+
callbackType: "on-video-sample",
|
|
17393
17493
|
value: sample,
|
|
17394
17494
|
trackId: params.track.trackId
|
|
17395
17495
|
});
|