@remotion/media-parser 4.0.298 → 4.0.300
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/create-avc-decoder-configuration-record.d.ts +2 -0
- package/dist/containers/avc/create-avc-decoder-configuration-record.js +35 -0
- 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/server-worker.module.d.ts +2 -0
- package/dist/server-worker.module.js +12 -0
- 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
|
@@ -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;
|
|
@@ -400,67 +378,79 @@ var fetchCreateAdjacentFileSource = (relativePath, src) => {
|
|
|
400
378
|
};
|
|
401
379
|
|
|
402
380
|
// src/readers/from-node.ts
|
|
403
|
-
import { createReadStream, promises, statSync } from "fs";
|
|
381
|
+
import { createReadStream, existsSync, promises, statSync } from "fs";
|
|
404
382
|
import { dirname, join, relative, sep } from "path";
|
|
405
|
-
var nodeReadContent = ({
|
|
383
|
+
var nodeReadContent = async ({
|
|
384
|
+
src,
|
|
385
|
+
range,
|
|
386
|
+
controller
|
|
387
|
+
}) => {
|
|
406
388
|
if (typeof src !== "string") {
|
|
407
389
|
throw new Error("src must be a string when using `nodeReader`");
|
|
408
390
|
}
|
|
391
|
+
await Promise.resolve();
|
|
409
392
|
const ownController = new AbortController;
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
c.enqueue(chunk);
|
|
426
|
-
});
|
|
427
|
-
stream.on("end", () => {
|
|
393
|
+
try {
|
|
394
|
+
if (!existsSync(src)) {
|
|
395
|
+
throw new Error(`File does not exist: ${src}`);
|
|
396
|
+
}
|
|
397
|
+
const stream = createReadStream(src, {
|
|
398
|
+
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
399
|
+
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1]
|
|
400
|
+
});
|
|
401
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
402
|
+
ownController.abort();
|
|
403
|
+
}, { once: true });
|
|
404
|
+
const stats = statSync(src);
|
|
405
|
+
let readerCancelled = false;
|
|
406
|
+
const reader = new ReadableStream({
|
|
407
|
+
start(c) {
|
|
428
408
|
if (readerCancelled) {
|
|
429
409
|
return;
|
|
430
410
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
411
|
+
stream.on("data", (chunk) => {
|
|
412
|
+
c.enqueue(chunk);
|
|
413
|
+
});
|
|
414
|
+
stream.on("end", () => {
|
|
415
|
+
if (readerCancelled) {
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
c.close();
|
|
419
|
+
});
|
|
420
|
+
stream.on("error", (err) => {
|
|
421
|
+
c.error(err);
|
|
422
|
+
});
|
|
423
|
+
},
|
|
424
|
+
cancel() {
|
|
425
|
+
readerCancelled = true;
|
|
426
|
+
stream.destroy();
|
|
427
|
+
}
|
|
428
|
+
}).getReader();
|
|
429
|
+
if (controller) {
|
|
430
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
431
|
+
reader.cancel().catch(() => {});
|
|
432
|
+
}, { once: true });
|
|
440
433
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
434
|
+
return Promise.resolve({
|
|
435
|
+
reader: {
|
|
436
|
+
reader,
|
|
437
|
+
abort: async () => {
|
|
438
|
+
try {
|
|
439
|
+
stream.destroy();
|
|
440
|
+
ownController.abort();
|
|
441
|
+
await reader.cancel();
|
|
442
|
+
} catch {}
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
contentLength: stats.size,
|
|
446
|
+
contentType: null,
|
|
447
|
+
name: src.split(sep).pop(),
|
|
448
|
+
supportsContentRange: true,
|
|
449
|
+
needsContentRange: true
|
|
450
|
+
});
|
|
451
|
+
} catch (err) {
|
|
452
|
+
return Promise.reject(err);
|
|
446
453
|
}
|
|
447
|
-
return Promise.resolve({
|
|
448
|
-
reader: {
|
|
449
|
-
reader,
|
|
450
|
-
abort: async () => {
|
|
451
|
-
try {
|
|
452
|
-
stream.destroy();
|
|
453
|
-
ownController.abort();
|
|
454
|
-
await reader.cancel();
|
|
455
|
-
} catch {}
|
|
456
|
-
}
|
|
457
|
-
},
|
|
458
|
-
contentLength: stats.size,
|
|
459
|
-
contentType: null,
|
|
460
|
-
name: src.split(sep).pop(),
|
|
461
|
-
supportsContentRange: true,
|
|
462
|
-
needsContentRange: true
|
|
463
|
-
});
|
|
464
454
|
};
|
|
465
455
|
var nodeReadWholeAsText = (src) => {
|
|
466
456
|
if (typeof src !== "string") {
|
|
@@ -722,7 +712,7 @@ var performedSeeksStats = () => {
|
|
|
722
712
|
|
|
723
713
|
// src/controller/seek-signal.ts
|
|
724
714
|
var makeSeekSignal = (emitter) => {
|
|
725
|
-
let seek;
|
|
715
|
+
let seek = null;
|
|
726
716
|
return {
|
|
727
717
|
seek: (seekRequest) => {
|
|
728
718
|
seek = seekRequest;
|
|
@@ -733,7 +723,7 @@ var makeSeekSignal = (emitter) => {
|
|
|
733
723
|
},
|
|
734
724
|
clearSeekIfStillSame(previousSeek) {
|
|
735
725
|
if (seek === previousSeek) {
|
|
736
|
-
seek =
|
|
726
|
+
seek = null;
|
|
737
727
|
return { hasChanged: false };
|
|
738
728
|
}
|
|
739
729
|
return { hasChanged: true };
|
|
@@ -837,10 +827,10 @@ var getM3uStreams = ({
|
|
|
837
827
|
}
|
|
838
828
|
boxes.push({
|
|
839
829
|
src: readerInterface.createAdjacentFileSource(next.value, originalSrc),
|
|
840
|
-
|
|
841
|
-
|
|
830
|
+
averageBandwidthInBitsPerSec: str.averageBandwidthInBitsPerSec,
|
|
831
|
+
bandwidthInBitsPerSec: str.bandwidthInBitsPerSec,
|
|
842
832
|
codecs: str.codecs,
|
|
843
|
-
|
|
833
|
+
dimensions: str.dimensions,
|
|
844
834
|
associatedPlaylists
|
|
845
835
|
});
|
|
846
836
|
}
|
|
@@ -849,11 +839,11 @@ var getM3uStreams = ({
|
|
|
849
839
|
return null;
|
|
850
840
|
}
|
|
851
841
|
const sorted = boxes.slice().sort((a, b) => {
|
|
852
|
-
const aResolution = a.
|
|
853
|
-
const bResolution = b.
|
|
842
|
+
const aResolution = a.dimensions ? a.dimensions.width * a.dimensions.height : 0;
|
|
843
|
+
const bResolution = b.dimensions ? b.dimensions.width * b.dimensions.height : 0;
|
|
854
844
|
if (aResolution === bResolution) {
|
|
855
|
-
const bandwidthA = a.
|
|
856
|
-
const bandwidthB = b.
|
|
845
|
+
const bandwidthA = a.averageBandwidthInBitsPerSec ?? a.bandwidthInBitsPerSec ?? 0;
|
|
846
|
+
const bandwidthB = b.averageBandwidthInBitsPerSec ?? b.bandwidthInBitsPerSec ?? 0;
|
|
857
847
|
return bandwidthB - bandwidthA;
|
|
858
848
|
}
|
|
859
849
|
return bResolution - aResolution;
|
|
@@ -1073,6 +1063,16 @@ var getTfraBoxes = (structure) => {
|
|
|
1073
1063
|
}
|
|
1074
1064
|
return getTfraBoxesFromMfraBoxChildren(mfraBox.children);
|
|
1075
1065
|
};
|
|
1066
|
+
var getTrakBoxByTrackId = (moovBox, trackId) => {
|
|
1067
|
+
const trakBoxes = getTraks(moovBox);
|
|
1068
|
+
return trakBoxes.find((t) => {
|
|
1069
|
+
const tkhd = getTkhdBox(t);
|
|
1070
|
+
if (!tkhd) {
|
|
1071
|
+
return false;
|
|
1072
|
+
}
|
|
1073
|
+
return tkhd.trackId === trackId;
|
|
1074
|
+
}) ?? null;
|
|
1075
|
+
};
|
|
1076
1076
|
|
|
1077
1077
|
// src/containers/riff/traversal.ts
|
|
1078
1078
|
var isRiffAvi = (structure) => {
|
|
@@ -1402,13 +1402,61 @@ var getDisplayAspectRatio = ({
|
|
|
1402
1402
|
|
|
1403
1403
|
// src/containers/avc/color.ts
|
|
1404
1404
|
var getMatrixCoefficientsFromIndex = (index) => {
|
|
1405
|
-
|
|
1405
|
+
if (index === 0) {
|
|
1406
|
+
return "rgb";
|
|
1407
|
+
}
|
|
1408
|
+
if (index === 1) {
|
|
1409
|
+
return "bt709";
|
|
1410
|
+
}
|
|
1411
|
+
if (index === 5) {
|
|
1412
|
+
return "bt470bg";
|
|
1413
|
+
}
|
|
1414
|
+
if (index === 6) {
|
|
1415
|
+
return "smpte170m";
|
|
1416
|
+
}
|
|
1417
|
+
if (index === 9) {
|
|
1418
|
+
return "bt2020-ncl";
|
|
1419
|
+
}
|
|
1420
|
+
return null;
|
|
1406
1421
|
};
|
|
1407
1422
|
var getTransferCharacteristicsFromIndex = (index) => {
|
|
1408
|
-
|
|
1423
|
+
if (index === 1) {
|
|
1424
|
+
return "bt709";
|
|
1425
|
+
}
|
|
1426
|
+
if (index === 6) {
|
|
1427
|
+
return "smpte170m";
|
|
1428
|
+
}
|
|
1429
|
+
if (index === 8) {
|
|
1430
|
+
return "linear";
|
|
1431
|
+
}
|
|
1432
|
+
if (index === 13) {
|
|
1433
|
+
return "iec61966-2-1";
|
|
1434
|
+
}
|
|
1435
|
+
if (index === 16) {
|
|
1436
|
+
return "pq";
|
|
1437
|
+
}
|
|
1438
|
+
if (index === 18) {
|
|
1439
|
+
return "hlg";
|
|
1440
|
+
}
|
|
1441
|
+
return null;
|
|
1409
1442
|
};
|
|
1410
1443
|
var getPrimariesFromIndex = (index) => {
|
|
1411
|
-
|
|
1444
|
+
if (index === 1) {
|
|
1445
|
+
return "bt709";
|
|
1446
|
+
}
|
|
1447
|
+
if (index === 5) {
|
|
1448
|
+
return "bt470bg";
|
|
1449
|
+
}
|
|
1450
|
+
if (index === 6) {
|
|
1451
|
+
return "smpte170m";
|
|
1452
|
+
}
|
|
1453
|
+
if (index === 9) {
|
|
1454
|
+
return "bt2020";
|
|
1455
|
+
}
|
|
1456
|
+
if (index === 12) {
|
|
1457
|
+
return "smpte432";
|
|
1458
|
+
}
|
|
1459
|
+
return null;
|
|
1412
1460
|
};
|
|
1413
1461
|
|
|
1414
1462
|
// src/containers/webm/segments/all-segments.ts
|
|
@@ -2152,10 +2200,6 @@ var isMp3 = (data) => {
|
|
|
2152
2200
|
const subarray = data.subarray(0, 4);
|
|
2153
2201
|
return matchesPattern(mpegPattern)(subarray) || matchesPattern(mpegPattern2)(subarray) || matchesPattern(id3v4Pattern)(subarray) || matchesPattern(id3v3Pattern)(subarray) || matchesPattern(id3v2Pattern)(subarray);
|
|
2154
2202
|
};
|
|
2155
|
-
var isGif = (data) => {
|
|
2156
|
-
const gifPattern = new Uint8Array([71, 73, 70, 56]);
|
|
2157
|
-
return matchesPattern(gifPattern)(data.subarray(0, 4));
|
|
2158
|
-
};
|
|
2159
2203
|
var isAac = (data) => {
|
|
2160
2204
|
const aacPattern = new Uint8Array([255, 241]);
|
|
2161
2205
|
return matchesPattern(aacPattern)(data.subarray(0, 2));
|
|
@@ -2188,6 +2232,21 @@ var isBmp = (data) => {
|
|
|
2188
2232
|
return null;
|
|
2189
2233
|
};
|
|
2190
2234
|
|
|
2235
|
+
// src/file-types/gif.ts
|
|
2236
|
+
var getGifDimensions = (data) => {
|
|
2237
|
+
const view = new DataView(data.buffer, data.byteOffset);
|
|
2238
|
+
const width = view.getUint16(6, true);
|
|
2239
|
+
const height = view.getUint16(8, true);
|
|
2240
|
+
return { width, height };
|
|
2241
|
+
};
|
|
2242
|
+
var isGif = (data) => {
|
|
2243
|
+
const gifPattern = new Uint8Array([71, 73, 70, 56]);
|
|
2244
|
+
if (matchesPattern(gifPattern)(data.subarray(0, 4))) {
|
|
2245
|
+
return { type: "gif", dimensions: getGifDimensions(data) };
|
|
2246
|
+
}
|
|
2247
|
+
return null;
|
|
2248
|
+
};
|
|
2249
|
+
|
|
2191
2250
|
// src/file-types/jpeg.ts
|
|
2192
2251
|
function getJpegDimensions(data) {
|
|
2193
2252
|
let offset = 0;
|
|
@@ -2333,8 +2392,9 @@ var detectFileType = (data) => {
|
|
|
2333
2392
|
if (isMp3(data)) {
|
|
2334
2393
|
return { type: "mp3" };
|
|
2335
2394
|
}
|
|
2336
|
-
|
|
2337
|
-
|
|
2395
|
+
const gif = isGif(data);
|
|
2396
|
+
if (gif) {
|
|
2397
|
+
return gif;
|
|
2338
2398
|
}
|
|
2339
2399
|
const png = isPng(data);
|
|
2340
2400
|
if (png) {
|
|
@@ -2969,7 +3029,7 @@ var parseAv1PrivateData = (data, colrAtom) => {
|
|
|
2969
3029
|
// src/get-video-codec.ts
|
|
2970
3030
|
var getVideoCodec = (state) => {
|
|
2971
3031
|
const track = getTracks(state, true);
|
|
2972
|
-
return track.
|
|
3032
|
+
return track.find((t) => t.type === "video")?.codecEnum ?? null;
|
|
2973
3033
|
};
|
|
2974
3034
|
var hasVideoCodec = (state) => {
|
|
2975
3035
|
return getHasTracks(state, true);
|
|
@@ -2983,13 +3043,13 @@ var getVideoPrivateData = (trakBox) => {
|
|
|
2983
3043
|
return null;
|
|
2984
3044
|
}
|
|
2985
3045
|
if (avccBox) {
|
|
2986
|
-
return avccBox.privateData;
|
|
3046
|
+
return { type: "avc-sps-pps", data: avccBox.privateData };
|
|
2987
3047
|
}
|
|
2988
3048
|
if (hvccBox) {
|
|
2989
|
-
return hvccBox.privateData;
|
|
3049
|
+
return { type: "hvcc-data", data: hvccBox.privateData };
|
|
2990
3050
|
}
|
|
2991
3051
|
if (av1cBox) {
|
|
2992
|
-
return av1cBox.privateData;
|
|
3052
|
+
return { type: "av1c-data", data: av1cBox.privateData };
|
|
2993
3053
|
}
|
|
2994
3054
|
return null;
|
|
2995
3055
|
};
|
|
@@ -3007,9 +3067,9 @@ var getIsoBmColrConfig = (trakBox) => {
|
|
|
3007
3067
|
}
|
|
3008
3068
|
return {
|
|
3009
3069
|
fullRange: colrAtom.fullRangeFlag,
|
|
3010
|
-
|
|
3070
|
+
matrix: getMatrixCoefficientsFromIndex(colrAtom.matrixIndex),
|
|
3011
3071
|
primaries: getPrimariesFromIndex(colrAtom.primaries),
|
|
3012
|
-
|
|
3072
|
+
transfer: getTransferCharacteristicsFromIndex(colrAtom.transfer)
|
|
3013
3073
|
};
|
|
3014
3074
|
};
|
|
3015
3075
|
var getVideoCodecString = (trakBox) => {
|
|
@@ -3033,6 +3093,16 @@ var getVideoCodecString = (trakBox) => {
|
|
|
3033
3093
|
return videoSample.format;
|
|
3034
3094
|
};
|
|
3035
3095
|
|
|
3096
|
+
// src/containers/iso-base-media/color-to-webcodecs-colors.ts
|
|
3097
|
+
var mediaParserAdvancedColorToWebCodecsColor = (color2) => {
|
|
3098
|
+
return {
|
|
3099
|
+
transfer: color2.transfer,
|
|
3100
|
+
matrix: color2.matrix,
|
|
3101
|
+
primaries: color2.primaries,
|
|
3102
|
+
fullRange: color2.fullRange
|
|
3103
|
+
};
|
|
3104
|
+
};
|
|
3105
|
+
|
|
3036
3106
|
// src/aac-codecprivate.ts
|
|
3037
3107
|
var getSampleRateFromSampleFrequencyIndex = (samplingFrequencyIndex) => {
|
|
3038
3108
|
switch (samplingFrequencyIndex) {
|
|
@@ -3192,16 +3262,27 @@ var getActualDecoderParameters = ({
|
|
|
3192
3262
|
sampleRate
|
|
3193
3263
|
}) => {
|
|
3194
3264
|
if (audioCodec !== "aac") {
|
|
3195
|
-
return {
|
|
3265
|
+
return {
|
|
3266
|
+
numberOfChannels,
|
|
3267
|
+
sampleRate,
|
|
3268
|
+
codecPrivate: codecPrivate2
|
|
3269
|
+
};
|
|
3196
3270
|
}
|
|
3197
3271
|
if (codecPrivate2 === null) {
|
|
3198
3272
|
return { numberOfChannels, sampleRate, codecPrivate: codecPrivate2 };
|
|
3199
3273
|
}
|
|
3200
|
-
|
|
3274
|
+
if (codecPrivate2.type !== "aac-config") {
|
|
3275
|
+
throw new Error("Expected AAC codec private data");
|
|
3276
|
+
}
|
|
3277
|
+
const parsed = parseAacCodecPrivate(codecPrivate2.data);
|
|
3278
|
+
const actual = createAacCodecPrivate({
|
|
3279
|
+
...parsed,
|
|
3280
|
+
codecPrivate: codecPrivate2.data
|
|
3281
|
+
});
|
|
3201
3282
|
return {
|
|
3202
3283
|
numberOfChannels: parsed.channelConfiguration,
|
|
3203
3284
|
sampleRate: parsed.sampleRate,
|
|
3204
|
-
codecPrivate:
|
|
3285
|
+
codecPrivate: { type: "aac-config", data: actual }
|
|
3205
3286
|
};
|
|
3206
3287
|
};
|
|
3207
3288
|
|
|
@@ -3271,10 +3352,10 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3271
3352
|
}
|
|
3272
3353
|
const { codecString, description } = getAudioCodecStringFromTrak(trakBox);
|
|
3273
3354
|
const codecPrivate2 = getCodecPrivateFromTrak(trakBox) ?? description ?? null;
|
|
3274
|
-
const
|
|
3355
|
+
const codecEnum = getAudioCodecFromTrack(trakBox);
|
|
3275
3356
|
const actual = getActualDecoderParameters({
|
|
3276
|
-
audioCodec:
|
|
3277
|
-
codecPrivate: codecPrivate2,
|
|
3357
|
+
audioCodec: codecEnum,
|
|
3358
|
+
codecPrivate: codecPrivate2 ?? null,
|
|
3278
3359
|
numberOfChannels,
|
|
3279
3360
|
sampleRate
|
|
3280
3361
|
});
|
|
@@ -3285,10 +3366,9 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3285
3366
|
codec: codecString,
|
|
3286
3367
|
numberOfChannels: actual.numberOfChannels,
|
|
3287
3368
|
sampleRate: actual.sampleRate,
|
|
3288
|
-
description: actual.codecPrivate ?? undefined,
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
codecWithoutConfig
|
|
3369
|
+
description: actual.codecPrivate?.data ?? undefined,
|
|
3370
|
+
codecData: actual.codecPrivate,
|
|
3371
|
+
codecEnum
|
|
3292
3372
|
};
|
|
3293
3373
|
}
|
|
3294
3374
|
if (!trakBoxContainsVideo(trakBox)) {
|
|
@@ -3318,6 +3398,12 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3318
3398
|
throw new Error("Could not find video codec");
|
|
3319
3399
|
}
|
|
3320
3400
|
const privateData = getVideoPrivateData(trakBox);
|
|
3401
|
+
const advancedColor = getIsoBmColrConfig(trakBox) ?? {
|
|
3402
|
+
fullRange: null,
|
|
3403
|
+
matrix: null,
|
|
3404
|
+
primaries: null,
|
|
3405
|
+
transfer: null
|
|
3406
|
+
};
|
|
3321
3407
|
const track = {
|
|
3322
3408
|
m3uStreamFormat: null,
|
|
3323
3409
|
type: "video",
|
|
@@ -3333,15 +3419,10 @@ var makeBaseMediaTrack = (trakBox) => {
|
|
|
3333
3419
|
displayAspectWidth,
|
|
3334
3420
|
displayAspectHeight,
|
|
3335
3421
|
rotation,
|
|
3336
|
-
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
|
|
3340
|
-
matrixCoefficients: null,
|
|
3341
|
-
primaries: null,
|
|
3342
|
-
transferCharacteristics: null
|
|
3343
|
-
},
|
|
3344
|
-
codecWithoutConfig: getVideoCodecFromIsoTrak(trakBox),
|
|
3422
|
+
codecData: privateData,
|
|
3423
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
3424
|
+
advancedColor,
|
|
3425
|
+
codecEnum: getVideoCodecFromIsoTrak(trakBox),
|
|
3345
3426
|
fps: getFpsFromMp4TrakBox(trakBox)
|
|
3346
3427
|
};
|
|
3347
3428
|
return track;
|
|
@@ -3412,7 +3493,8 @@ var addAvcProfileToTrack = (track, avc1Profile) => {
|
|
|
3412
3493
|
return {
|
|
3413
3494
|
...track,
|
|
3414
3495
|
codec: getCodecStringFromSpsAndPps(avc1Profile.sps),
|
|
3415
|
-
|
|
3496
|
+
codecData: { type: "avc-sps-pps", data: createSpsPpsData(avc1Profile) },
|
|
3497
|
+
description: undefined
|
|
3416
3498
|
};
|
|
3417
3499
|
};
|
|
3418
3500
|
|
|
@@ -3438,14 +3520,13 @@ var makeAviAudioTrack = ({
|
|
|
3438
3520
|
return {
|
|
3439
3521
|
type: "audio",
|
|
3440
3522
|
codec: "mp4a.40.2",
|
|
3441
|
-
|
|
3442
|
-
|
|
3523
|
+
codecData: { type: "aac-config", data: new Uint8Array([18, 16]) },
|
|
3524
|
+
codecEnum: "aac",
|
|
3443
3525
|
description: new Uint8Array([18, 16]),
|
|
3444
3526
|
numberOfChannels: strf.numberOfChannels,
|
|
3445
3527
|
sampleRate: strf.sampleRate,
|
|
3446
3528
|
timescale: MEDIA_PARSER_RIFF_TIMESCALE,
|
|
3447
|
-
trackId: index
|
|
3448
|
-
trakBox: null
|
|
3529
|
+
trackId: index
|
|
3449
3530
|
};
|
|
3450
3531
|
};
|
|
3451
3532
|
var makeAviVideoTrack = ({
|
|
@@ -3457,9 +3538,9 @@ var makeAviVideoTrack = ({
|
|
|
3457
3538
|
throw new Error(`Unsupported video codec ${strh.handler}`);
|
|
3458
3539
|
}
|
|
3459
3540
|
return {
|
|
3460
|
-
|
|
3541
|
+
codecData: null,
|
|
3461
3542
|
codec: TO_BE_OVERRIDDEN_LATER,
|
|
3462
|
-
|
|
3543
|
+
codecEnum: "h264",
|
|
3463
3544
|
codedHeight: strf.height,
|
|
3464
3545
|
codedWidth: strf.width,
|
|
3465
3546
|
width: strf.width,
|
|
@@ -3470,14 +3551,19 @@ var makeAviVideoTrack = ({
|
|
|
3470
3551
|
description: undefined,
|
|
3471
3552
|
m3uStreamFormat: null,
|
|
3472
3553
|
trackId: index,
|
|
3473
|
-
|
|
3554
|
+
colorSpace: {
|
|
3474
3555
|
fullRange: null,
|
|
3475
|
-
|
|
3556
|
+
matrix: null,
|
|
3476
3557
|
primaries: null,
|
|
3477
|
-
|
|
3558
|
+
transfer: null
|
|
3559
|
+
},
|
|
3560
|
+
advancedColor: {
|
|
3561
|
+
fullRange: null,
|
|
3562
|
+
matrix: null,
|
|
3563
|
+
primaries: null,
|
|
3564
|
+
transfer: null
|
|
3478
3565
|
},
|
|
3479
3566
|
displayAspectWidth: strf.width,
|
|
3480
|
-
trakBox: null,
|
|
3481
3567
|
rotation: 0,
|
|
3482
3568
|
sampleAspectRatio: {
|
|
3483
3569
|
numerator: 1,
|
|
@@ -3487,9 +3573,7 @@ var makeAviVideoTrack = ({
|
|
|
3487
3573
|
};
|
|
3488
3574
|
};
|
|
3489
3575
|
var getTracksFromAvi = (structure, state) => {
|
|
3490
|
-
const
|
|
3491
|
-
const audioTracks = [];
|
|
3492
|
-
const otherTracks = [];
|
|
3576
|
+
const tracks2 = [];
|
|
3493
3577
|
const boxes = getStrlBoxes(structure);
|
|
3494
3578
|
let i = 0;
|
|
3495
3579
|
for (const box of boxes) {
|
|
@@ -3499,22 +3583,22 @@ var getTracksFromAvi = (structure, state) => {
|
|
|
3499
3583
|
}
|
|
3500
3584
|
const { strf } = strh;
|
|
3501
3585
|
if (strf.type === "strf-box-video") {
|
|
3502
|
-
|
|
3586
|
+
tracks2.push(addAvcProfileToTrack(makeAviVideoTrack({ strh, strf, index: i }), state.riff.getAvcProfile()));
|
|
3503
3587
|
} else if (strh.fccType === "auds") {
|
|
3504
|
-
|
|
3588
|
+
tracks2.push(makeAviAudioTrack({ strf, index: i }));
|
|
3505
3589
|
} else {
|
|
3506
3590
|
throw new Error(`Unsupported track type ${strh.fccType}`);
|
|
3507
3591
|
}
|
|
3508
3592
|
i++;
|
|
3509
3593
|
}
|
|
3510
|
-
return
|
|
3594
|
+
return tracks2;
|
|
3511
3595
|
};
|
|
3512
3596
|
var hasAllTracksFromAvi = (state) => {
|
|
3513
3597
|
try {
|
|
3514
3598
|
const structure = state.structure.getRiffStructure();
|
|
3515
3599
|
const numberOfTracks = getNumberOfTracks(structure);
|
|
3516
3600
|
const tracks2 = getTracksFromAvi(structure, state);
|
|
3517
|
-
return tracks2.
|
|
3601
|
+
return tracks2.length === numberOfTracks && !tracks2.find((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER);
|
|
3518
3602
|
} catch {
|
|
3519
3603
|
return false;
|
|
3520
3604
|
}
|
|
@@ -3567,11 +3651,7 @@ var getTracksFromTransportStream = (parserState) => {
|
|
|
3567
3651
|
if (mapped.length !== filterStreamsBySupportedTypes(programMapTable.streams).length) {
|
|
3568
3652
|
throw new Error("Not all tracks found");
|
|
3569
3653
|
}
|
|
3570
|
-
return
|
|
3571
|
-
videoTracks: mapped.filter((track) => track.type === "video"),
|
|
3572
|
-
audioTracks: mapped.filter((track) => track.type === "audio"),
|
|
3573
|
-
otherTracks: []
|
|
3574
|
-
};
|
|
3654
|
+
return mapped;
|
|
3575
3655
|
};
|
|
3576
3656
|
var hasAllTracksFromTransportStream = (parserState) => {
|
|
3577
3657
|
try {
|
|
@@ -3618,7 +3698,7 @@ var getHvc1CodecString = (data) => {
|
|
|
3618
3698
|
|
|
3619
3699
|
// src/containers/webm/traversal.ts
|
|
3620
3700
|
var getMainSegment = (segments) => {
|
|
3621
|
-
return segments.find((s) => s.type === "Segment");
|
|
3701
|
+
return segments.find((s) => s.type === "Segment") ?? null;
|
|
3622
3702
|
};
|
|
3623
3703
|
var getTrackCodec = (track) => {
|
|
3624
3704
|
const child = track.value.find((b) => b.type === "CodecID");
|
|
@@ -3833,9 +3913,9 @@ var parseColorSegment = (colourSegment) => {
|
|
|
3833
3913
|
const primaries2 = getPrimariesSegment(colourSegment);
|
|
3834
3914
|
const range2 = getRangeSegment(colourSegment);
|
|
3835
3915
|
return {
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
primaries: primaries2 ? primaries2.value.value
|
|
3916
|
+
transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2.value.value) : null,
|
|
3917
|
+
matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2.value.value) : null,
|
|
3918
|
+
primaries: primaries2 ? getPrimariesFromIndex(primaries2.value.value) : null,
|
|
3839
3919
|
fullRange: transferCharacteristics2?.value.value && matrixCoefficients2?.value.value ? null : range2 ? Boolean(range2?.value.value) : null
|
|
3840
3920
|
};
|
|
3841
3921
|
};
|
|
@@ -3938,7 +4018,7 @@ var getDescription = (track) => {
|
|
|
3938
4018
|
}
|
|
3939
4019
|
return;
|
|
3940
4020
|
};
|
|
3941
|
-
var
|
|
4021
|
+
var getMatroskaVideoCodecEnum = ({
|
|
3942
4022
|
codecSegment: codec
|
|
3943
4023
|
}) => {
|
|
3944
4024
|
if (codec.value === "V_VP8") {
|
|
@@ -3993,7 +4073,7 @@ var getMatroskaVideoCodecString = ({
|
|
|
3993
4073
|
}
|
|
3994
4074
|
throw new Error(`Unknown codec: ${codec.value}`);
|
|
3995
4075
|
};
|
|
3996
|
-
var
|
|
4076
|
+
var getMatroskaAudioCodecEnum = ({
|
|
3997
4077
|
track
|
|
3998
4078
|
}) => {
|
|
3999
4079
|
const codec = getCodecSegment(track);
|
|
@@ -4098,6 +4178,28 @@ var getTrack = ({
|
|
|
4098
4178
|
if (!codecString) {
|
|
4099
4179
|
return null;
|
|
4100
4180
|
}
|
|
4181
|
+
const codecEnum = getMatroskaVideoCodecEnum({
|
|
4182
|
+
codecSegment: codec
|
|
4183
|
+
});
|
|
4184
|
+
const codecData = codecPrivate2 === null ? null : codecEnum === "h264" ? { type: "avc-sps-pps", data: codecPrivate2 } : codecEnum === "av1" ? {
|
|
4185
|
+
type: "av1c-data",
|
|
4186
|
+
data: codecPrivate2
|
|
4187
|
+
} : codecEnum === "h265" ? {
|
|
4188
|
+
type: "hvcc-data",
|
|
4189
|
+
data: codecPrivate2
|
|
4190
|
+
} : codecEnum === "vp8" ? {
|
|
4191
|
+
type: "unknown-data",
|
|
4192
|
+
data: codecPrivate2
|
|
4193
|
+
} : codecEnum === "vp9" ? {
|
|
4194
|
+
type: "unknown-data",
|
|
4195
|
+
data: codecPrivate2
|
|
4196
|
+
} : null;
|
|
4197
|
+
const advancedColor = colour ? parseColorSegment(colour) : {
|
|
4198
|
+
fullRange: null,
|
|
4199
|
+
matrix: null,
|
|
4200
|
+
primaries: null,
|
|
4201
|
+
transfer: null
|
|
4202
|
+
};
|
|
4101
4203
|
return {
|
|
4102
4204
|
m3uStreamFormat: null,
|
|
4103
4205
|
type: "video",
|
|
@@ -4116,17 +4218,10 @@ var getTrack = ({
|
|
|
4116
4218
|
displayAspectHeight: displayHeight2 ? displayHeight2.value.value : height.value.value,
|
|
4117
4219
|
displayAspectWidth: displayWidth2 ? displayWidth2.value.value : width.value.value,
|
|
4118
4220
|
rotation: 0,
|
|
4119
|
-
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
matrixCoefficients: null,
|
|
4124
|
-
primaries: null,
|
|
4125
|
-
transferCharacteristics: null
|
|
4126
|
-
},
|
|
4127
|
-
codecWithoutConfig: getMatroskaVideoCodecWithoutConfigString({
|
|
4128
|
-
codecSegment: codec
|
|
4129
|
-
}),
|
|
4221
|
+
codecData,
|
|
4222
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
4223
|
+
advancedColor,
|
|
4224
|
+
codecEnum,
|
|
4130
4225
|
fps: null
|
|
4131
4226
|
};
|
|
4132
4227
|
}
|
|
@@ -4137,17 +4232,17 @@ var getTrack = ({
|
|
|
4137
4232
|
if (sampleRate === null) {
|
|
4138
4233
|
throw new Error("Could not find sample rate or number of channels");
|
|
4139
4234
|
}
|
|
4235
|
+
const codecString = getMatroskaAudioCodecString(track);
|
|
4140
4236
|
return {
|
|
4141
4237
|
type: "audio",
|
|
4142
4238
|
trackId,
|
|
4143
|
-
codec:
|
|
4239
|
+
codec: codecString,
|
|
4144
4240
|
timescale,
|
|
4145
4241
|
numberOfChannels,
|
|
4146
4242
|
sampleRate,
|
|
4147
4243
|
description: getAudioDescription(track),
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
codecWithoutConfig: getMatroskaAudioCodecWithoutConfigString({
|
|
4244
|
+
codecData: codecPrivate2 ? codecString === "opus" ? { type: "ogg-identification", data: codecPrivate2 } : { type: "unknown-data", data: codecPrivate2 } : null,
|
|
4245
|
+
codecEnum: getMatroskaAudioCodecEnum({
|
|
4151
4246
|
track
|
|
4152
4247
|
})
|
|
4153
4248
|
};
|
|
@@ -4260,51 +4355,23 @@ var getHasTracks = (state, mayUsePrecomputed) => {
|
|
|
4260
4355
|
throw new Error("Unknown container " + structure);
|
|
4261
4356
|
};
|
|
4262
4357
|
var getCategorizedTracksFromMatroska = (state) => {
|
|
4263
|
-
const videoTracks = [];
|
|
4264
|
-
const audioTracks = [];
|
|
4265
|
-
const otherTracks = [];
|
|
4266
4358
|
const { resolved } = getTracksFromMatroska({
|
|
4267
4359
|
structureState: state.structure,
|
|
4268
4360
|
webmState: state.webm
|
|
4269
4361
|
});
|
|
4270
|
-
|
|
4271
|
-
if (track.type === "video") {
|
|
4272
|
-
videoTracks.push(track);
|
|
4273
|
-
} else if (track.type === "audio") {
|
|
4274
|
-
audioTracks.push(track);
|
|
4275
|
-
} else if (track.type === "other") {
|
|
4276
|
-
otherTracks.push(track);
|
|
4277
|
-
}
|
|
4278
|
-
}
|
|
4279
|
-
return {
|
|
4280
|
-
videoTracks,
|
|
4281
|
-
audioTracks,
|
|
4282
|
-
otherTracks
|
|
4283
|
-
};
|
|
4362
|
+
return resolved;
|
|
4284
4363
|
};
|
|
4285
4364
|
var getTracksFromMoovBox = (moovBox) => {
|
|
4286
|
-
const
|
|
4287
|
-
const audioTracks = [];
|
|
4288
|
-
const otherTracks = [];
|
|
4365
|
+
const mediaParserTracks = [];
|
|
4289
4366
|
const tracks2 = getTraks(moovBox);
|
|
4290
4367
|
for (const trakBox of tracks2) {
|
|
4291
4368
|
const track = makeBaseMediaTrack(trakBox);
|
|
4292
4369
|
if (!track) {
|
|
4293
4370
|
continue;
|
|
4294
4371
|
}
|
|
4295
|
-
|
|
4296
|
-
videoTracks.push(track);
|
|
4297
|
-
} else if (track.type === "audio") {
|
|
4298
|
-
audioTracks.push(track);
|
|
4299
|
-
} else if (track.type === "other") {
|
|
4300
|
-
otherTracks.push(track);
|
|
4301
|
-
}
|
|
4372
|
+
mediaParserTracks.push(track);
|
|
4302
4373
|
}
|
|
4303
|
-
return
|
|
4304
|
-
videoTracks,
|
|
4305
|
-
audioTracks,
|
|
4306
|
-
otherTracks
|
|
4307
|
-
};
|
|
4374
|
+
return mediaParserTracks;
|
|
4308
4375
|
};
|
|
4309
4376
|
var getTracksFromIsoBaseMedia = ({
|
|
4310
4377
|
mayUsePrecomputed,
|
|
@@ -4319,11 +4386,7 @@ var getTracksFromIsoBaseMedia = ({
|
|
|
4319
4386
|
mayUsePrecomputed
|
|
4320
4387
|
});
|
|
4321
4388
|
if (!moovBox) {
|
|
4322
|
-
return
|
|
4323
|
-
videoTracks: [],
|
|
4324
|
-
audioTracks: [],
|
|
4325
|
-
otherTracks: []
|
|
4326
|
-
};
|
|
4389
|
+
return [];
|
|
4327
4390
|
}
|
|
4328
4391
|
return getTracksFromMoovBox(moovBox);
|
|
4329
4392
|
};
|
|
@@ -4332,11 +4395,7 @@ var defaultGetTracks = (parserState) => {
|
|
|
4332
4395
|
if (tracks2.length === 0) {
|
|
4333
4396
|
throw new Error("No tracks found");
|
|
4334
4397
|
}
|
|
4335
|
-
return
|
|
4336
|
-
audioTracks: tracks2.filter((t) => t.type === "audio"),
|
|
4337
|
-
otherTracks: [],
|
|
4338
|
-
videoTracks: tracks2.filter((t) => t.type === "video")
|
|
4339
|
-
};
|
|
4398
|
+
return tracks2;
|
|
4340
4399
|
};
|
|
4341
4400
|
var getTracks = (state, mayUsePrecomputed) => {
|
|
4342
4401
|
const structure = state.structure.getStructure();
|
|
@@ -4366,16 +4425,15 @@ var getTracks = (state, mayUsePrecomputed) => {
|
|
|
4366
4425
|
// src/get-audio-codec.ts
|
|
4367
4426
|
var getAudioCodec = (parserState) => {
|
|
4368
4427
|
const tracks2 = getTracks(parserState, true);
|
|
4369
|
-
|
|
4370
|
-
if (allTracks === 0) {
|
|
4428
|
+
if (tracks2.length === 0) {
|
|
4371
4429
|
throw new Error("No tracks yet");
|
|
4372
4430
|
}
|
|
4373
|
-
const audioTrack = tracks2.
|
|
4431
|
+
const audioTrack = tracks2.find((t) => t.type === "audio");
|
|
4374
4432
|
if (!audioTrack) {
|
|
4375
4433
|
return null;
|
|
4376
4434
|
}
|
|
4377
4435
|
if (audioTrack.type === "audio") {
|
|
4378
|
-
return audioTrack.
|
|
4436
|
+
return audioTrack.codecEnum;
|
|
4379
4437
|
}
|
|
4380
4438
|
return null;
|
|
4381
4439
|
};
|
|
@@ -4432,7 +4490,7 @@ var getCodecPrivateFromTrak = (trakBox) => {
|
|
|
4432
4490
|
if (!mp4a) {
|
|
4433
4491
|
return null;
|
|
4434
4492
|
}
|
|
4435
|
-
return mp4a.asBytes;
|
|
4493
|
+
return { type: "aac-config", data: mp4a.asBytes };
|
|
4436
4494
|
};
|
|
4437
4495
|
var onSample = (sample, children) => {
|
|
4438
4496
|
const child = children.find((c) => c.type === "esds-box");
|
|
@@ -4513,19 +4571,19 @@ var getAudioCodecStringFromTrak = (trak) => {
|
|
|
4513
4571
|
if (codec.format === "lpcm") {
|
|
4514
4572
|
return {
|
|
4515
4573
|
codecString: "pcm-s16",
|
|
4516
|
-
description: codec.description
|
|
4574
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4517
4575
|
};
|
|
4518
4576
|
}
|
|
4519
4577
|
if (codec.format === "twos") {
|
|
4520
4578
|
return {
|
|
4521
4579
|
codecString: "pcm-s16",
|
|
4522
|
-
description: codec.description
|
|
4580
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4523
4581
|
};
|
|
4524
4582
|
}
|
|
4525
4583
|
if (codec.format === "in24") {
|
|
4526
4584
|
return {
|
|
4527
4585
|
codecString: "pcm-s24",
|
|
4528
|
-
description: codec.description
|
|
4586
|
+
description: codec.description ? { type: "unknown-data", data: codec.description } : undefined
|
|
4529
4587
|
};
|
|
4530
4588
|
}
|
|
4531
4589
|
const codecStringWithoutMp3Exception = [
|
|
@@ -4533,10 +4591,31 @@ var getAudioCodecStringFromTrak = (trak) => {
|
|
|
4533
4591
|
codec.primarySpecificator ? codec.primarySpecificator.toString(16) : null,
|
|
4534
4592
|
codec.secondarySpecificator ? codec.secondarySpecificator.toString().padStart(2, "0") : null
|
|
4535
4593
|
].filter(Boolean).join(".");
|
|
4536
|
-
const codecString = codecStringWithoutMp3Exception === "mp4a.6b" ? "mp3" : codecStringWithoutMp3Exception;
|
|
4594
|
+
const codecString = codecStringWithoutMp3Exception.toLowerCase() === "mp4a.6b" || codecStringWithoutMp3Exception.toLowerCase() === "mp4a.69" ? "mp3" : codecStringWithoutMp3Exception;
|
|
4595
|
+
if (codecString === "mp3") {
|
|
4596
|
+
return {
|
|
4597
|
+
codecString,
|
|
4598
|
+
description: codec.description ? {
|
|
4599
|
+
type: "unknown-data",
|
|
4600
|
+
data: codec.description
|
|
4601
|
+
} : undefined
|
|
4602
|
+
};
|
|
4603
|
+
}
|
|
4604
|
+
if (codecString.startsWith("mp4a.")) {
|
|
4605
|
+
return {
|
|
4606
|
+
codecString,
|
|
4607
|
+
description: codec.description ? {
|
|
4608
|
+
type: "aac-config",
|
|
4609
|
+
data: codec.description
|
|
4610
|
+
} : undefined
|
|
4611
|
+
};
|
|
4612
|
+
}
|
|
4537
4613
|
return {
|
|
4538
4614
|
codecString,
|
|
4539
|
-
description: codec.description
|
|
4615
|
+
description: codec.description ? {
|
|
4616
|
+
type: "unknown-data",
|
|
4617
|
+
data: codec.description
|
|
4618
|
+
} : undefined
|
|
4540
4619
|
};
|
|
4541
4620
|
};
|
|
4542
4621
|
var getAudioCodecFromAudioCodecInfo = (codec) => {
|
|
@@ -4628,11 +4707,14 @@ var getDimensions = (state) => {
|
|
|
4628
4707
|
if (structure && isAudioStructure(structure)) {
|
|
4629
4708
|
return null;
|
|
4630
4709
|
}
|
|
4631
|
-
const
|
|
4632
|
-
if (!
|
|
4710
|
+
const tracks2 = getTracks(state, true);
|
|
4711
|
+
if (!tracks2.length) {
|
|
4712
|
+
return null;
|
|
4713
|
+
}
|
|
4714
|
+
const firstVideoTrack = tracks2.find((t) => t.type === "video");
|
|
4715
|
+
if (!firstVideoTrack) {
|
|
4633
4716
|
return null;
|
|
4634
4717
|
}
|
|
4635
|
-
const firstVideoTrack = videoTracks[0];
|
|
4636
4718
|
return {
|
|
4637
4719
|
width: firstVideoTrack.width,
|
|
4638
4720
|
height: firstVideoTrack.height,
|
|
@@ -5216,15 +5298,14 @@ var getDurationFromIsoBaseMedia = (parserState) => {
|
|
|
5216
5298
|
return mvhdBox.durationInSeconds;
|
|
5217
5299
|
}
|
|
5218
5300
|
const tracks2 = getTracks(parserState, true);
|
|
5219
|
-
const
|
|
5220
|
-
...tracks2.videoTracks,
|
|
5221
|
-
...tracks2.audioTracks,
|
|
5222
|
-
...tracks2.otherTracks
|
|
5223
|
-
];
|
|
5224
|
-
const allSamples = allTracks.map((t) => {
|
|
5301
|
+
const allSamples = tracks2.map((t) => {
|
|
5225
5302
|
const { timescale: ts } = t;
|
|
5303
|
+
const trakBox = getTrakBoxByTrackId(moovBox, t.trackId);
|
|
5304
|
+
if (!trakBox) {
|
|
5305
|
+
return null;
|
|
5306
|
+
}
|
|
5226
5307
|
const { samplePositions, isComplete } = getSamplePositionsFromTrack({
|
|
5227
|
-
trakBox
|
|
5308
|
+
trakBox,
|
|
5228
5309
|
moofBoxes,
|
|
5229
5310
|
moofComplete: areSamplesComplete({ moofBoxes, tfraBoxes })
|
|
5230
5311
|
});
|
|
@@ -5294,11 +5375,11 @@ var hasSlowDuration = (parserState) => {
|
|
|
5294
5375
|
|
|
5295
5376
|
// src/get-is-hdr.ts
|
|
5296
5377
|
var isVideoTrackHdr = (track) => {
|
|
5297
|
-
return track.
|
|
5378
|
+
return track.advancedColor.matrix === "bt2020-ncl" && (track.advancedColor.transfer === "hlg" || track.advancedColor.transfer === "pq") && track.advancedColor.primaries === "bt2020";
|
|
5298
5379
|
};
|
|
5299
5380
|
var getIsHdr = (state) => {
|
|
5300
|
-
const
|
|
5301
|
-
return
|
|
5381
|
+
const tracks2 = getTracks(state, true);
|
|
5382
|
+
return tracks2.some((track) => track.type === "video" && isVideoTrackHdr(track));
|
|
5302
5383
|
};
|
|
5303
5384
|
var hasHdr = (state) => {
|
|
5304
5385
|
return getHasTracks(state, true);
|
|
@@ -5306,19 +5387,28 @@ var hasHdr = (state) => {
|
|
|
5306
5387
|
|
|
5307
5388
|
// src/containers/iso-base-media/get-keyframes.ts
|
|
5308
5389
|
var getKeyframesFromIsoBaseMedia = (state) => {
|
|
5309
|
-
const
|
|
5390
|
+
const tracks2 = getTracksFromIsoBaseMedia({
|
|
5310
5391
|
isoState: state.iso,
|
|
5311
5392
|
m3uPlaylistContext: state.m3uPlaylistContext,
|
|
5312
5393
|
structure: state.structure,
|
|
5313
5394
|
mayUsePrecomputed: true
|
|
5314
5395
|
});
|
|
5396
|
+
const videoTracks = tracks2.filter((t) => t.type === "video");
|
|
5315
5397
|
const structure = state.structure.getIsoStructure();
|
|
5316
5398
|
const moofBoxes = getMoofBoxes(structure.boxes);
|
|
5317
5399
|
const tfraBoxes = getTfraBoxes(structure.boxes);
|
|
5400
|
+
const moov = getMoovFromFromIsoStructure(structure);
|
|
5401
|
+
if (!moov) {
|
|
5402
|
+
return [];
|
|
5403
|
+
}
|
|
5318
5404
|
const allSamples = videoTracks.map((t) => {
|
|
5319
5405
|
const { timescale: ts } = t;
|
|
5406
|
+
const trakBox = getTrakBoxByTrackId(moov, t.trackId);
|
|
5407
|
+
if (!trakBox) {
|
|
5408
|
+
return [];
|
|
5409
|
+
}
|
|
5320
5410
|
const { samplePositions, isComplete } = getSamplePositionsFromTrack({
|
|
5321
|
-
trakBox
|
|
5411
|
+
trakBox,
|
|
5322
5412
|
moofBoxes,
|
|
5323
5413
|
moofComplete: areSamplesComplete({
|
|
5324
5414
|
moofBoxes,
|
|
@@ -5606,7 +5696,7 @@ var hasMetadata = (structure) => {
|
|
|
5606
5696
|
if (structure.type === "wav") {
|
|
5607
5697
|
return getMetadataFromWav(structure) !== null;
|
|
5608
5698
|
}
|
|
5609
|
-
if (structure.type === "m3u" || structure.type === "transport-stream") {
|
|
5699
|
+
if (structure.type === "m3u" || structure.type === "transport-stream" || structure.type === "aac") {
|
|
5610
5700
|
return true;
|
|
5611
5701
|
}
|
|
5612
5702
|
if (structure.type === "flac") {
|
|
@@ -5621,9 +5711,6 @@ var hasMetadata = (structure) => {
|
|
|
5621
5711
|
if (structure.type === "riff") {
|
|
5622
5712
|
return false;
|
|
5623
5713
|
}
|
|
5624
|
-
if (structure.type === "aac") {
|
|
5625
|
-
return true;
|
|
5626
|
-
}
|
|
5627
5714
|
throw new Error("Unknown container " + structure);
|
|
5628
5715
|
};
|
|
5629
5716
|
|
|
@@ -5771,10 +5858,18 @@ var findKeyframeBeforeTime = ({
|
|
|
5771
5858
|
|
|
5772
5859
|
// src/containers/iso-base-media/find-track-to-seek.ts
|
|
5773
5860
|
var findAnyTrackWithSamplePositions = (allTracks, struc) => {
|
|
5861
|
+
const moov = getMoovFromFromIsoStructure(struc);
|
|
5862
|
+
if (!moov) {
|
|
5863
|
+
return null;
|
|
5864
|
+
}
|
|
5774
5865
|
for (const track of allTracks) {
|
|
5775
5866
|
if (track.type === "video" || track.type === "audio") {
|
|
5867
|
+
const trakBox = getTrakBoxByTrackId(moov, track.trackId);
|
|
5868
|
+
if (!trakBox) {
|
|
5869
|
+
continue;
|
|
5870
|
+
}
|
|
5776
5871
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
5777
|
-
trakBox
|
|
5872
|
+
trakBox,
|
|
5778
5873
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
5779
5874
|
moofComplete: areSamplesComplete({
|
|
5780
5875
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
@@ -5795,8 +5890,16 @@ var findTrackToSeek = (allTracks, structure) => {
|
|
|
5795
5890
|
if (!firstVideoTrack) {
|
|
5796
5891
|
return findAnyTrackWithSamplePositions(allTracks, struc);
|
|
5797
5892
|
}
|
|
5893
|
+
const moov = getMoovFromFromIsoStructure(struc);
|
|
5894
|
+
if (!moov) {
|
|
5895
|
+
return null;
|
|
5896
|
+
}
|
|
5897
|
+
const trakBox = getTrakBoxByTrackId(moov, firstVideoTrack.trackId);
|
|
5898
|
+
if (!trakBox) {
|
|
5899
|
+
return null;
|
|
5900
|
+
}
|
|
5798
5901
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
5799
|
-
trakBox
|
|
5902
|
+
trakBox,
|
|
5800
5903
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
5801
5904
|
moofComplete: areSamplesComplete({
|
|
5802
5905
|
moofBoxes: getMoofBoxes(struc.boxes),
|
|
@@ -5929,15 +6032,30 @@ var getSeekingByteFromFragmentedMp4 = async ({
|
|
|
5929
6032
|
logLevel,
|
|
5930
6033
|
currentPosition,
|
|
5931
6034
|
isoState,
|
|
5932
|
-
|
|
5933
|
-
isLastChunkInPlaylist
|
|
6035
|
+
tracks: tracks2,
|
|
6036
|
+
isLastChunkInPlaylist,
|
|
6037
|
+
structure,
|
|
6038
|
+
mp4HeaderSegment
|
|
5934
6039
|
}) => {
|
|
5935
|
-
const firstVideoTrack =
|
|
5936
|
-
const firstTrack = firstVideoTrack ??
|
|
6040
|
+
const firstVideoTrack = tracks2.find((t) => t.type === "video");
|
|
6041
|
+
const firstTrack = firstVideoTrack ?? tracks2.find((t) => t.type === "audio");
|
|
5937
6042
|
if (!firstTrack) {
|
|
5938
6043
|
throw new Error("no video and no audio tracks");
|
|
5939
6044
|
}
|
|
5940
|
-
const
|
|
6045
|
+
const moov = getMoovBoxFromState({
|
|
6046
|
+
structureState: structure,
|
|
6047
|
+
isoState,
|
|
6048
|
+
mp4HeaderSegment,
|
|
6049
|
+
mayUsePrecomputed: true
|
|
6050
|
+
});
|
|
6051
|
+
if (!moov) {
|
|
6052
|
+
throw new Error("No moov atom found");
|
|
6053
|
+
}
|
|
6054
|
+
const trakBox = getTrakBoxByTrackId(moov, firstTrack.trackId);
|
|
6055
|
+
if (!trakBox) {
|
|
6056
|
+
throw new Error("No trak box found");
|
|
6057
|
+
}
|
|
6058
|
+
const tkhdBox = getTkhdBox(trakBox);
|
|
5941
6059
|
if (!tkhdBox) {
|
|
5942
6060
|
throw new Error("Expected tkhd box in trak box");
|
|
5943
6061
|
}
|
|
@@ -6025,11 +6143,6 @@ var getSeekingByteFromIsoBaseMedia = ({
|
|
|
6025
6143
|
structure,
|
|
6026
6144
|
mayUsePrecomputed: false
|
|
6027
6145
|
});
|
|
6028
|
-
const allTracks = [
|
|
6029
|
-
...tracks2.videoTracks,
|
|
6030
|
-
...tracks2.audioTracks,
|
|
6031
|
-
...tracks2.otherTracks
|
|
6032
|
-
];
|
|
6033
6146
|
const hasMoov = Boolean(getMoovBoxFromState({
|
|
6034
6147
|
structureState: structure,
|
|
6035
6148
|
isoState,
|
|
@@ -6049,11 +6162,13 @@ var getSeekingByteFromIsoBaseMedia = ({
|
|
|
6049
6162
|
logLevel,
|
|
6050
6163
|
currentPosition,
|
|
6051
6164
|
isoState,
|
|
6052
|
-
|
|
6053
|
-
isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false
|
|
6165
|
+
tracks: tracks2,
|
|
6166
|
+
isLastChunkInPlaylist: m3uPlaylistContext?.isLastChunkInPlaylist ?? false,
|
|
6167
|
+
structure,
|
|
6168
|
+
mp4HeaderSegment: m3uPlaylistContext?.mp4HeaderSegment ?? null
|
|
6054
6169
|
});
|
|
6055
6170
|
}
|
|
6056
|
-
const trackWithSamplePositions = findTrackToSeek(
|
|
6171
|
+
const trackWithSamplePositions = findTrackToSeek(tracks2, structure);
|
|
6057
6172
|
if (!trackWithSamplePositions) {
|
|
6058
6173
|
return Promise.resolve({
|
|
6059
6174
|
type: "valid-but-must-wait"
|
|
@@ -6662,8 +6777,8 @@ var getVideoColorFromSps = (sps) => {
|
|
|
6662
6777
|
const transferCharacteristics2 = sps.vui_parameters?.transfer_characteristics;
|
|
6663
6778
|
const colorPrimaries = sps.vui_parameters?.colour_primaries;
|
|
6664
6779
|
return {
|
|
6665
|
-
|
|
6666
|
-
|
|
6780
|
+
matrix: matrixCoefficients2 ? getMatrixCoefficientsFromIndex(matrixCoefficients2) : null,
|
|
6781
|
+
transfer: transferCharacteristics2 ? getTransferCharacteristicsFromIndex(transferCharacteristics2) : null,
|
|
6667
6782
|
primaries: colorPrimaries ? getPrimariesFromIndex(colorPrimaries) : null,
|
|
6668
6783
|
fullRange: sps.vui_parameters?.video_full_range_flag ?? null
|
|
6669
6784
|
};
|
|
@@ -6942,6 +7057,8 @@ var handleAvcPacket = async ({
|
|
|
6942
7057
|
trackId: programId,
|
|
6943
7058
|
newOffset: startOffset
|
|
6944
7059
|
});
|
|
7060
|
+
const codecPrivate2 = createSpsPpsData(spsAndPps);
|
|
7061
|
+
const advancedColor = getVideoColorFromSps(spsAndPps.sps.spsData);
|
|
6945
7062
|
const track = {
|
|
6946
7063
|
m3uStreamFormat: null,
|
|
6947
7064
|
rotation: 0,
|
|
@@ -6949,7 +7066,7 @@ var handleAvcPacket = async ({
|
|
|
6949
7066
|
type: "video",
|
|
6950
7067
|
timescale: MPEG_TIMESCALE,
|
|
6951
7068
|
codec: getCodecStringFromSpsAndPps(spsAndPps.sps),
|
|
6952
|
-
|
|
7069
|
+
codecData: { type: "avc-sps-pps", data: codecPrivate2 },
|
|
6953
7070
|
fps: null,
|
|
6954
7071
|
codedWidth: dimensions.width,
|
|
6955
7072
|
codedHeight: dimensions.height,
|
|
@@ -6957,14 +7074,14 @@ var handleAvcPacket = async ({
|
|
|
6957
7074
|
width: dimensions.width,
|
|
6958
7075
|
displayAspectWidth: dimensions.width,
|
|
6959
7076
|
displayAspectHeight: dimensions.height,
|
|
6960
|
-
|
|
6961
|
-
codecWithoutConfig: "h264",
|
|
7077
|
+
codecEnum: "h264",
|
|
6962
7078
|
description: undefined,
|
|
6963
7079
|
sampleAspectRatio: {
|
|
6964
7080
|
denominator: sampleAspectRatio.height,
|
|
6965
7081
|
numerator: sampleAspectRatio.width
|
|
6966
7082
|
},
|
|
6967
|
-
|
|
7083
|
+
colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
|
|
7084
|
+
advancedColor
|
|
6968
7085
|
};
|
|
6969
7086
|
await registerVideoTrack({
|
|
6970
7087
|
track,
|
|
@@ -7479,7 +7596,7 @@ var fieldsNeedSamplesMap = {
|
|
|
7479
7596
|
name: false,
|
|
7480
7597
|
rotation: false,
|
|
7481
7598
|
size: false,
|
|
7482
|
-
|
|
7599
|
+
slowStructure: false,
|
|
7483
7600
|
tracks: false,
|
|
7484
7601
|
unrotatedDimensions: false,
|
|
7485
7602
|
videoCodec: false,
|
|
@@ -7682,49 +7799,46 @@ var turnSeekIntoByte = async ({
|
|
|
7682
7799
|
type: "valid-but-must-wait"
|
|
7683
7800
|
};
|
|
7684
7801
|
}
|
|
7685
|
-
if (seek2
|
|
7686
|
-
|
|
7687
|
-
throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
|
|
7688
|
-
}
|
|
7689
|
-
const seekingHints = getSeekingHints({
|
|
7690
|
-
riffState,
|
|
7691
|
-
samplesObserved,
|
|
7692
|
-
structureState,
|
|
7693
|
-
mediaSectionState: mediaSectionState2,
|
|
7694
|
-
isoState,
|
|
7695
|
-
transportStream,
|
|
7696
|
-
tracksState,
|
|
7697
|
-
keyframesState: keyframes,
|
|
7698
|
-
webmState,
|
|
7699
|
-
flacState,
|
|
7700
|
-
mp3State,
|
|
7701
|
-
contentLength,
|
|
7702
|
-
aacState,
|
|
7703
|
-
m3uPlaylistContext
|
|
7704
|
-
});
|
|
7705
|
-
if (!seekingHints) {
|
|
7706
|
-
Log.trace(logLevel, "No seeking info, cannot seek yet");
|
|
7707
|
-
return {
|
|
7708
|
-
type: "valid-but-must-wait"
|
|
7709
|
-
};
|
|
7710
|
-
}
|
|
7711
|
-
const seekingByte = await getSeekingByte({
|
|
7712
|
-
info: seekingHints,
|
|
7713
|
-
time: seek2.timeInSeconds,
|
|
7714
|
-
logLevel,
|
|
7715
|
-
currentPosition: iterator.counter.getOffset(),
|
|
7716
|
-
isoState,
|
|
7717
|
-
transportStream,
|
|
7718
|
-
webmState,
|
|
7719
|
-
mediaSection: mediaSectionState2,
|
|
7720
|
-
m3uPlaylistContext,
|
|
7721
|
-
structure: structureState,
|
|
7722
|
-
riffState,
|
|
7723
|
-
m3uState
|
|
7724
|
-
});
|
|
7725
|
-
return seekingByte;
|
|
7802
|
+
if (seek2 < 0) {
|
|
7803
|
+
throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek2)}`);
|
|
7726
7804
|
}
|
|
7727
|
-
|
|
7805
|
+
const seekingHints = getSeekingHints({
|
|
7806
|
+
riffState,
|
|
7807
|
+
samplesObserved,
|
|
7808
|
+
structureState,
|
|
7809
|
+
mediaSectionState: mediaSectionState2,
|
|
7810
|
+
isoState,
|
|
7811
|
+
transportStream,
|
|
7812
|
+
tracksState,
|
|
7813
|
+
keyframesState: keyframes,
|
|
7814
|
+
webmState,
|
|
7815
|
+
flacState,
|
|
7816
|
+
mp3State,
|
|
7817
|
+
contentLength,
|
|
7818
|
+
aacState,
|
|
7819
|
+
m3uPlaylistContext
|
|
7820
|
+
});
|
|
7821
|
+
if (!seekingHints) {
|
|
7822
|
+
Log.trace(logLevel, "No seeking info, cannot seek yet");
|
|
7823
|
+
return {
|
|
7824
|
+
type: "valid-but-must-wait"
|
|
7825
|
+
};
|
|
7826
|
+
}
|
|
7827
|
+
const seekingByte = await getSeekingByte({
|
|
7828
|
+
info: seekingHints,
|
|
7829
|
+
time: seek2,
|
|
7830
|
+
logLevel,
|
|
7831
|
+
currentPosition: iterator.counter.getOffset(),
|
|
7832
|
+
isoState,
|
|
7833
|
+
transportStream,
|
|
7834
|
+
webmState,
|
|
7835
|
+
mediaSection: mediaSectionState2,
|
|
7836
|
+
m3uPlaylistContext,
|
|
7837
|
+
structure: structureState,
|
|
7838
|
+
riffState,
|
|
7839
|
+
m3uState
|
|
7840
|
+
});
|
|
7841
|
+
return seekingByte;
|
|
7728
7842
|
};
|
|
7729
7843
|
var getWorkOnSeekRequestOptions = (state) => {
|
|
7730
7844
|
return {
|
|
@@ -7786,7 +7900,7 @@ var workOnSeekRequest = async (options) => {
|
|
|
7786
7900
|
m3uState
|
|
7787
7901
|
} = options;
|
|
7788
7902
|
const seek2 = controller._internals.seekSignal.getSeek();
|
|
7789
|
-
if (
|
|
7903
|
+
if (seek2 === null) {
|
|
7790
7904
|
return;
|
|
7791
7905
|
}
|
|
7792
7906
|
Log.trace(logLevel, `Has seek request for ${src}: ${JSON.stringify(seek2)}`);
|
|
@@ -7879,13 +7993,13 @@ var emitAvailableInfo = async ({
|
|
|
7879
7993
|
} = state;
|
|
7880
7994
|
for (const key of keys) {
|
|
7881
7995
|
await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
|
|
7882
|
-
if (key === "
|
|
7883
|
-
if (hasInfo.
|
|
7884
|
-
await callbackFunctions.
|
|
7885
|
-
if (fieldsInReturnValue.
|
|
7886
|
-
returnValue.
|
|
7996
|
+
if (key === "slowStructure") {
|
|
7997
|
+
if (hasInfo.slowStructure && !emittedFields.slowStructure) {
|
|
7998
|
+
await callbackFunctions.onSlowStructure?.(state.structure.getStructure());
|
|
7999
|
+
if (fieldsInReturnValue.slowStructure) {
|
|
8000
|
+
returnValue.slowStructure = state.structure.getStructure();
|
|
7887
8001
|
}
|
|
7888
|
-
emittedFields.
|
|
8002
|
+
emittedFields.slowStructure = true;
|
|
7889
8003
|
}
|
|
7890
8004
|
continue;
|
|
7891
8005
|
}
|
|
@@ -8013,10 +8127,10 @@ var emitAvailableInfo = async ({
|
|
|
8013
8127
|
}
|
|
8014
8128
|
if (key === "tracks") {
|
|
8015
8129
|
if (!emittedFields.tracks && hasInfo.tracks) {
|
|
8016
|
-
const
|
|
8017
|
-
await callbackFunctions.onTracks?.(
|
|
8130
|
+
const tracks2 = getTracks(state, true);
|
|
8131
|
+
await callbackFunctions.onTracks?.(tracks2);
|
|
8018
8132
|
if (fieldsInReturnValue.tracks) {
|
|
8019
|
-
returnValue.tracks =
|
|
8133
|
+
returnValue.tracks = tracks2;
|
|
8020
8134
|
}
|
|
8021
8135
|
emittedFields.tracks = true;
|
|
8022
8136
|
}
|
|
@@ -8217,12 +8331,29 @@ var getHasCallbacks = (state) => {
|
|
|
8217
8331
|
const hasAllTracksAndNoCallbacks = !state.callbacks.tracks.hasAllTracks() || Object.values(state.callbacks.videoSampleCallbacks).length > 0 || Object.values(state.callbacks.audioSampleCallbacks).length > 0;
|
|
8218
8332
|
return hasAllTracksAndNoCallbacks;
|
|
8219
8333
|
};
|
|
8334
|
+
var missesMatroskaTracks = (state) => {
|
|
8335
|
+
const struct = state.structure.getStructureOrNull();
|
|
8336
|
+
if (struct === null) {
|
|
8337
|
+
return false;
|
|
8338
|
+
}
|
|
8339
|
+
if (struct.type !== "matroska") {
|
|
8340
|
+
return false;
|
|
8341
|
+
}
|
|
8342
|
+
const mainSegment = getMainSegment(struct.boxes);
|
|
8343
|
+
if (mainSegment === null) {
|
|
8344
|
+
return false;
|
|
8345
|
+
}
|
|
8346
|
+
return getTracksFromMatroska({
|
|
8347
|
+
structureState: state.structure,
|
|
8348
|
+
webmState: state.webm
|
|
8349
|
+
}).missingInfo.length > 0;
|
|
8350
|
+
};
|
|
8220
8351
|
var maySkipVideoData = ({ state }) => {
|
|
8221
8352
|
const hasCallbacks = getHasCallbacks(state);
|
|
8222
8353
|
return !hasCallbacks && !needsToIterateOverSamples({
|
|
8223
8354
|
emittedFields: state.emittedFields,
|
|
8224
8355
|
fields: state.fields
|
|
8225
|
-
});
|
|
8356
|
+
}) && !missesMatroskaTracks(state);
|
|
8226
8357
|
};
|
|
8227
8358
|
var maySkipOverSamplesInTheMiddle = ({
|
|
8228
8359
|
state
|
|
@@ -8242,7 +8373,7 @@ var getAvailableInfo = ({
|
|
|
8242
8373
|
const structure = state.structure.getStructureOrNull();
|
|
8243
8374
|
const infos = keys.map(([_key]) => {
|
|
8244
8375
|
const key = _key;
|
|
8245
|
-
if (key === "
|
|
8376
|
+
if (key === "slowStructure") {
|
|
8246
8377
|
return false;
|
|
8247
8378
|
}
|
|
8248
8379
|
if (key === "durationInSeconds") {
|
|
@@ -8441,14 +8572,13 @@ var parseAac = async (state) => {
|
|
|
8441
8572
|
container: "aac",
|
|
8442
8573
|
track: {
|
|
8443
8574
|
codec: mapAudioObjectTypeToCodecString(audioObjectType),
|
|
8444
|
-
|
|
8445
|
-
|
|
8575
|
+
codecEnum: "aac",
|
|
8576
|
+
codecData: { type: "aac-config", data: codecPrivate2 },
|
|
8446
8577
|
description: codecPrivate2,
|
|
8447
8578
|
numberOfChannels: channelConfiguration,
|
|
8448
8579
|
sampleRate,
|
|
8449
8580
|
timescale: 1e6,
|
|
8450
8581
|
trackId: 0,
|
|
8451
|
-
trakBox: null,
|
|
8452
8582
|
type: "audio"
|
|
8453
8583
|
},
|
|
8454
8584
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
@@ -8845,13 +8975,12 @@ var parseStreamInfo = async ({
|
|
|
8845
8975
|
codec: "flac",
|
|
8846
8976
|
type: "audio",
|
|
8847
8977
|
description: asUint8Array,
|
|
8848
|
-
|
|
8849
|
-
|
|
8978
|
+
codecData: { type: "flac-description", data: asUint8Array },
|
|
8979
|
+
codecEnum: "flac",
|
|
8850
8980
|
numberOfChannels: channels2,
|
|
8851
8981
|
sampleRate,
|
|
8852
8982
|
timescale: 1e6,
|
|
8853
|
-
trackId: 0
|
|
8854
|
-
trakBox: null
|
|
8983
|
+
trackId: 0
|
|
8855
8984
|
},
|
|
8856
8985
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
8857
8986
|
tracks: state.callbacks.tracks,
|
|
@@ -8933,11 +9062,6 @@ var calculateFlatSamples = ({
|
|
|
8933
9062
|
mediaSectionStart
|
|
8934
9063
|
}) => {
|
|
8935
9064
|
const tracks2 = getTracks(state, true);
|
|
8936
|
-
const allTracks = [
|
|
8937
|
-
...tracks2.videoTracks,
|
|
8938
|
-
...tracks2.audioTracks,
|
|
8939
|
-
...tracks2.otherTracks
|
|
8940
|
-
];
|
|
8941
9065
|
const moofBoxes = getMoofBoxes(state.structure.getIsoStructure().boxes);
|
|
8942
9066
|
const tfraBoxes = deduplicateTfraBoxesByOffset([
|
|
8943
9067
|
...state.iso.tfra.getTfraBoxes(),
|
|
@@ -8948,9 +9072,22 @@ var calculateFlatSamples = ({
|
|
|
8948
9072
|
if (moofBoxes.length > 0 && !relevantMoofBox) {
|
|
8949
9073
|
throw new Error("No relevant moof box found");
|
|
8950
9074
|
}
|
|
8951
|
-
const
|
|
9075
|
+
const moov = getMoovBoxFromState({
|
|
9076
|
+
structureState: state.structure,
|
|
9077
|
+
isoState: state.iso,
|
|
9078
|
+
mp4HeaderSegment: state.m3uPlaylistContext?.mp4HeaderSegment ?? null,
|
|
9079
|
+
mayUsePrecomputed: true
|
|
9080
|
+
});
|
|
9081
|
+
if (!moov) {
|
|
9082
|
+
throw new Error("No moov box found");
|
|
9083
|
+
}
|
|
9084
|
+
const flatSamples = tracks2.map((track) => {
|
|
9085
|
+
const trakBox = getTrakBoxByTrackId(moov, track.trackId);
|
|
9086
|
+
if (!trakBox) {
|
|
9087
|
+
throw new Error("No trak box found");
|
|
9088
|
+
}
|
|
8952
9089
|
const { samplePositions } = getSamplePositionsFromTrack({
|
|
8953
|
-
trakBox
|
|
9090
|
+
trakBox,
|
|
8954
9091
|
moofBoxes: relevantMoofBox ? [relevantMoofBox] : [],
|
|
8955
9092
|
moofComplete
|
|
8956
9093
|
});
|
|
@@ -9018,7 +9155,7 @@ var needsTracksForField = ({
|
|
|
9018
9155
|
}
|
|
9019
9156
|
return true;
|
|
9020
9157
|
}
|
|
9021
|
-
if (field === "audioCodec" || field === "durationInSeconds" || field === "slowDurationInSeconds" || field === "slowFps" || field === "fps" || field === "isHdr" || field === "rotation" || field === "
|
|
9158
|
+
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") {
|
|
9022
9159
|
return true;
|
|
9023
9160
|
}
|
|
9024
9161
|
if (field === "container" || field === "internalStats" || field === "mimeType" || field === "name" || field === "size") {
|
|
@@ -11129,7 +11266,7 @@ var getMoovAtom = async ({
|
|
|
11129
11266
|
const boxes = [];
|
|
11130
11267
|
const canSkipTracksState = makeCanSkipTracksState({
|
|
11131
11268
|
hasAudioTrackHandlers: false,
|
|
11132
|
-
fields: {
|
|
11269
|
+
fields: { slowStructure: true },
|
|
11133
11270
|
hasVideoTrackHandlers: false,
|
|
11134
11271
|
structure: structureState()
|
|
11135
11272
|
});
|
|
@@ -11504,10 +11641,10 @@ var parseStreamInf = (str) => {
|
|
|
11504
11641
|
}
|
|
11505
11642
|
return {
|
|
11506
11643
|
type: "m3u-stream-info",
|
|
11507
|
-
|
|
11508
|
-
|
|
11644
|
+
averageBandwidthInBitsPerSec: map["AVERAGE-BANDWIDTH"] ? parseInt(map["AVERAGE-BANDWIDTH"], 10) : null,
|
|
11645
|
+
bandwidthInBitsPerSec: map.BANDWIDTH ? parseInt(map.BANDWIDTH, 10) : null,
|
|
11509
11646
|
codecs: map.CODECS ? map.CODECS.split(",") : null,
|
|
11510
|
-
|
|
11647
|
+
dimensions: map.RESOLUTION ? {
|
|
11511
11648
|
width: parseInt(map.RESOLUTION.split("x")[0], 10),
|
|
11512
11649
|
height: parseInt(map.RESOLUTION.split("x")[1], 10)
|
|
11513
11650
|
} : null,
|
|
@@ -11722,7 +11859,7 @@ var afterManifestFetch = async ({
|
|
|
11722
11859
|
throw new Error("No streams found");
|
|
11723
11860
|
}
|
|
11724
11861
|
const selectedPlaylist = await selectStream({ streams, fn: selectM3uStreamFn });
|
|
11725
|
-
if (!selectedPlaylist.
|
|
11862
|
+
if (!selectedPlaylist.dimensions) {
|
|
11726
11863
|
throw new Error("Stream does not have a resolution");
|
|
11727
11864
|
}
|
|
11728
11865
|
m3uState.setSelectedMainPlaylist({
|
|
@@ -11855,7 +11992,7 @@ var parseMedia = (options) => {
|
|
|
11855
11992
|
onSlowKeyframes: options.onSlowKeyframes ?? null,
|
|
11856
11993
|
onSlowNumberOfFrames: options.onSlowNumberOfFrames ?? null,
|
|
11857
11994
|
onSlowVideoBitrate: options.onSlowVideoBitrate ?? null,
|
|
11858
|
-
|
|
11995
|
+
onSlowStructure: options.onSlowStructure ?? null,
|
|
11859
11996
|
onM3uStreams: options.onM3uStreams ?? null,
|
|
11860
11997
|
onTracks: options.onTracks ?? null,
|
|
11861
11998
|
onUnrotatedDimensions: options.onUnrotatedDimensions ?? null,
|
|
@@ -11897,16 +12034,10 @@ var considerSeekBasedOnChunk = async ({
|
|
|
11897
12034
|
const timestamp = Math.min(sample.dts / sample.timescale, sample.cts / sample.timescale);
|
|
11898
12035
|
if (timestamp > pendingSeek.targetTime && chunkIndex !== null && chunkIndex > 0) {
|
|
11899
12036
|
m3uState.setNextSeekShouldSubtractChunks(playlistUrl, subtractChunks + 1);
|
|
11900
|
-
parentController.seek(
|
|
11901
|
-
type: "keyframe-before-time",
|
|
11902
|
-
timeInSeconds: pendingSeek.targetTime
|
|
11903
|
-
});
|
|
12037
|
+
parentController.seek(pendingSeek.targetTime);
|
|
11904
12038
|
return;
|
|
11905
12039
|
}
|
|
11906
|
-
childController.seek(
|
|
11907
|
-
type: "keyframe-before-time",
|
|
11908
|
-
timeInSeconds: pendingSeek.targetTime
|
|
11909
|
-
});
|
|
12040
|
+
childController.seek(pendingSeek.targetTime);
|
|
11910
12041
|
m3uState.setNextSeekShouldSubtractChunks(playlistUrl, 0);
|
|
11911
12042
|
m3uState.setSeekToSecondsToProcess(playlistUrl, null);
|
|
11912
12043
|
};
|
|
@@ -12084,7 +12215,7 @@ var processM3uChunk = ({
|
|
|
12084
12215
|
childController.pause();
|
|
12085
12216
|
currentPromise.resolver(makeContinuationFn());
|
|
12086
12217
|
},
|
|
12087
|
-
fields: chunk.isHeader ? {
|
|
12218
|
+
fields: chunk.isHeader ? { slowStructure: true } : undefined,
|
|
12088
12219
|
onTracks: () => {
|
|
12089
12220
|
if (!state.m3u.hasEmittedDoneWithTracks(playlistUrl)) {
|
|
12090
12221
|
state.m3u.setHasEmittedDoneWithTracks(playlistUrl);
|
|
@@ -12182,10 +12313,10 @@ var processM3uChunk = ({
|
|
|
12182
12313
|
}
|
|
12183
12314
|
});
|
|
12184
12315
|
if (chunk.isHeader) {
|
|
12185
|
-
if (data.
|
|
12316
|
+
if (data.slowStructure.type !== "iso-base-media") {
|
|
12186
12317
|
throw new Error("Expected an mp4 file");
|
|
12187
12318
|
}
|
|
12188
|
-
state.m3u.setMp4HeaderSegment(playlistUrl, data.
|
|
12319
|
+
state.m3u.setMp4HeaderSegment(playlistUrl, data.slowStructure);
|
|
12189
12320
|
}
|
|
12190
12321
|
} catch (e) {
|
|
12191
12322
|
currentPromise.rejector(e);
|
|
@@ -12759,14 +12890,13 @@ var parseMpegHeader = async ({
|
|
|
12759
12890
|
track: {
|
|
12760
12891
|
type: "audio",
|
|
12761
12892
|
codec: "mp3",
|
|
12762
|
-
|
|
12763
|
-
|
|
12893
|
+
codecData: null,
|
|
12894
|
+
codecEnum: "mp3",
|
|
12764
12895
|
description: undefined,
|
|
12765
12896
|
numberOfChannels,
|
|
12766
12897
|
sampleRate,
|
|
12767
12898
|
timescale: 1e6,
|
|
12768
|
-
trackId: 0
|
|
12769
|
-
trakBox: null
|
|
12899
|
+
trackId: 0
|
|
12770
12900
|
},
|
|
12771
12901
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
12772
12902
|
tracks: state.callbacks.tracks,
|
|
@@ -13352,7 +13482,7 @@ var parseMediaSection = async (state) => {
|
|
|
13352
13482
|
state
|
|
13353
13483
|
});
|
|
13354
13484
|
const tracks2 = getTracks(state, false);
|
|
13355
|
-
if (!tracks2.
|
|
13485
|
+
if (!tracks2.some((t) => t.type === "video" && t.codec === TO_BE_OVERRIDDEN_LATER) && !state.callbacks.tracks.getIsDone()) {
|
|
13356
13486
|
state.callbacks.tracks.setIsDone(state.logLevel);
|
|
13357
13487
|
}
|
|
13358
13488
|
};
|
|
@@ -13732,13 +13862,12 @@ var handleAacPacket = async ({
|
|
|
13732
13862
|
});
|
|
13733
13863
|
const track = {
|
|
13734
13864
|
type: "audio",
|
|
13735
|
-
|
|
13865
|
+
codecData: { type: "aac-config", data: codecPrivate2 },
|
|
13736
13866
|
trackId: programId,
|
|
13737
|
-
trakBox: null,
|
|
13738
13867
|
timescale: MPEG_TIMESCALE,
|
|
13739
|
-
|
|
13868
|
+
codecEnum: "aac",
|
|
13740
13869
|
codec: mapAudioObjectTypeToCodecString(audioObjectType),
|
|
13741
|
-
description:
|
|
13870
|
+
description: codecPrivate2,
|
|
13742
13871
|
numberOfChannels: channelConfiguration,
|
|
13743
13872
|
sampleRate
|
|
13744
13873
|
};
|
|
@@ -14241,14 +14370,13 @@ var parseFmt = async ({
|
|
|
14241
14370
|
track: {
|
|
14242
14371
|
type: "audio",
|
|
14243
14372
|
codec: format,
|
|
14244
|
-
|
|
14373
|
+
codecData: null,
|
|
14245
14374
|
description: undefined,
|
|
14246
|
-
|
|
14375
|
+
codecEnum: format,
|
|
14247
14376
|
numberOfChannels,
|
|
14248
14377
|
sampleRate,
|
|
14249
14378
|
timescale: 1e6,
|
|
14250
|
-
trackId: 0
|
|
14251
|
-
trakBox: null
|
|
14379
|
+
trackId: 0
|
|
14252
14380
|
},
|
|
14253
14381
|
container: "wav",
|
|
14254
14382
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
@@ -14851,7 +14979,7 @@ var expectSegment = async ({
|
|
|
14851
14979
|
}
|
|
14852
14980
|
statesForProcessing.webmState.addCluster({
|
|
14853
14981
|
start: offset,
|
|
14854
|
-
size,
|
|
14982
|
+
size: size + (offsetAfterVInt - offset),
|
|
14855
14983
|
segment: isInsideSegment.index
|
|
14856
14984
|
});
|
|
14857
14985
|
const newSegment = {
|
|
@@ -14941,6 +15069,9 @@ var parseWebm = async (state) => {
|
|
|
14941
15069
|
return null;
|
|
14942
15070
|
}
|
|
14943
15071
|
if (isInsideCluster) {
|
|
15072
|
+
if (maySkipVideoData({ state })) {
|
|
15073
|
+
return makeSkip(Math.min(state.contentLength, isInsideCluster.size + isInsideCluster.start));
|
|
15074
|
+
}
|
|
14944
15075
|
const segments = structure.boxes.filter((box) => box.type === "Segment");
|
|
14945
15076
|
const segment = segments[isInsideCluster.segment];
|
|
14946
15077
|
if (!segment) {
|
|
@@ -14985,7 +15116,7 @@ var initVideo = async ({ state }) => {
|
|
|
14985
15116
|
throw new Error("No moov box found");
|
|
14986
15117
|
}
|
|
14987
15118
|
const tracks2 = getTracksFromMoovBox(moovAtom);
|
|
14988
|
-
for (const track of tracks2.
|
|
15119
|
+
for (const track of tracks2.filter((t) => t.type === "video")) {
|
|
14989
15120
|
await registerVideoTrack({
|
|
14990
15121
|
track,
|
|
14991
15122
|
container: "mp4",
|
|
@@ -14995,7 +15126,7 @@ var initVideo = async ({ state }) => {
|
|
|
14995
15126
|
tracks: state.callbacks.tracks
|
|
14996
15127
|
});
|
|
14997
15128
|
}
|
|
14998
|
-
for (const track of tracks2.
|
|
15129
|
+
for (const track of tracks2.filter((t) => t.type === "audio")) {
|
|
14999
15130
|
await registerAudioTrack({
|
|
15000
15131
|
track,
|
|
15001
15132
|
container: "mp4",
|
|
@@ -15083,14 +15214,6 @@ var initVideo = async ({ state }) => {
|
|
|
15083
15214
|
});
|
|
15084
15215
|
return;
|
|
15085
15216
|
}
|
|
15086
|
-
if (fileType.type === "gif") {
|
|
15087
|
-
return Promise.reject(new IsAGifError({
|
|
15088
|
-
message: "GIF files are not yet supported",
|
|
15089
|
-
mimeType,
|
|
15090
|
-
sizeInBytes: contentLength,
|
|
15091
|
-
fileName: name
|
|
15092
|
-
}));
|
|
15093
|
-
}
|
|
15094
15217
|
if (fileType.type === "pdf") {
|
|
15095
15218
|
return Promise.reject(new IsAPdfError({
|
|
15096
15219
|
message: "GIF files are not supported",
|
|
@@ -15099,7 +15222,7 @@ var initVideo = async ({ state }) => {
|
|
|
15099
15222
|
fileName: name
|
|
15100
15223
|
}));
|
|
15101
15224
|
}
|
|
15102
|
-
if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp") {
|
|
15225
|
+
if (fileType.type === "bmp" || fileType.type === "jpeg" || fileType.type === "png" || fileType.type === "webp" || fileType.type === "gif") {
|
|
15103
15226
|
return Promise.reject(new IsAnImageError({
|
|
15104
15227
|
message: "Image files are not supported",
|
|
15105
15228
|
imageType: fileType.type,
|
|
@@ -15272,10 +15395,10 @@ var parseLoop = async ({
|
|
|
15272
15395
|
}
|
|
15273
15396
|
}
|
|
15274
15397
|
state.samplesObserved.setLastSampleObserved();
|
|
15275
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
15398
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
15276
15399
|
Log.verbose(state.logLevel, "Reached end of samples, but there is a pending seek. Trying to seek...");
|
|
15277
15400
|
await workOnSeekRequest(getWorkOnSeekRequestOptions(state));
|
|
15278
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
15401
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
15279
15402
|
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.");
|
|
15280
15403
|
}
|
|
15281
15404
|
await parseLoop({
|
|
@@ -15375,7 +15498,7 @@ var getFieldsFromCallback = ({
|
|
|
15375
15498
|
name: Boolean(callbacks.onName),
|
|
15376
15499
|
rotation: Boolean(callbacks.onRotation),
|
|
15377
15500
|
size: Boolean(callbacks.onSize),
|
|
15378
|
-
|
|
15501
|
+
slowStructure: Boolean(callbacks.onSlowStructure),
|
|
15379
15502
|
tracks: Boolean(callbacks.onTracks),
|
|
15380
15503
|
unrotatedDimensions: Boolean(callbacks.onUnrotatedDimensions),
|
|
15381
15504
|
videoCodec: Boolean(callbacks.onVideoCodec),
|
|
@@ -15458,7 +15581,7 @@ var emittedState = () => {
|
|
|
15458
15581
|
name: false,
|
|
15459
15582
|
rotation: false,
|
|
15460
15583
|
size: false,
|
|
15461
|
-
|
|
15584
|
+
slowStructure: false,
|
|
15462
15585
|
tracks: false,
|
|
15463
15586
|
videoCodec: false,
|
|
15464
15587
|
unrotatedDimensions: false,
|
|
@@ -16211,7 +16334,7 @@ var webmState = ({
|
|
|
16211
16334
|
},
|
|
16212
16335
|
isInsideCluster: (offset) => {
|
|
16213
16336
|
for (const cluster of clusters) {
|
|
16214
|
-
if (offset >= cluster.start && offset
|
|
16337
|
+
if (offset >= cluster.start && offset < cluster.start + cluster.size) {
|
|
16215
16338
|
return cluster;
|
|
16216
16339
|
}
|
|
16217
16340
|
}
|
|
@@ -16510,7 +16633,7 @@ var callbacksState = ({
|
|
|
16510
16633
|
const callback = audioSampleCallbacks[trackId];
|
|
16511
16634
|
if (audioSample.data.length > 0) {
|
|
16512
16635
|
if (callback) {
|
|
16513
|
-
if (seekSignal.getSeek()) {
|
|
16636
|
+
if (seekSignal.getSeek() !== null) {
|
|
16514
16637
|
Log.trace(logLevel, "Not emitting sample because seek is processing");
|
|
16515
16638
|
} else {
|
|
16516
16639
|
await callback(audioSample);
|
|
@@ -16528,7 +16651,7 @@ var callbacksState = ({
|
|
|
16528
16651
|
if (videoSample.data.length > 0) {
|
|
16529
16652
|
const callback = videoSampleCallbacks[trackId];
|
|
16530
16653
|
if (callback) {
|
|
16531
|
-
if (seekSignal.getSeek()) {
|
|
16654
|
+
if (seekSignal.getSeek() !== null) {
|
|
16532
16655
|
Log.trace(logLevel, "Not emitting sample because seek is processing");
|
|
16533
16656
|
} else {
|
|
16534
16657
|
await callback(videoSample);
|
|
@@ -17069,7 +17192,7 @@ var internalParseMedia = async function({
|
|
|
17069
17192
|
if (state.errored) {
|
|
17070
17193
|
throw state.errored;
|
|
17071
17194
|
}
|
|
17072
|
-
if (state.controller._internals.seekSignal.getSeek()) {
|
|
17195
|
+
if (state.controller._internals.seekSignal.getSeek() !== null) {
|
|
17073
17196
|
throw new Error("Should not finish while a seek is pending");
|
|
17074
17197
|
}
|
|
17075
17198
|
return state.returnValue;
|
|
@@ -17120,17 +17243,6 @@ var serializeError = ({
|
|
|
17120
17243
|
logLevel,
|
|
17121
17244
|
seekingHints
|
|
17122
17245
|
}) => {
|
|
17123
|
-
if (error instanceof IsAGifError) {
|
|
17124
|
-
return {
|
|
17125
|
-
type: "response-error",
|
|
17126
|
-
errorName: "IsAGifError",
|
|
17127
|
-
errorMessage: error.message,
|
|
17128
|
-
errorStack: error.stack ?? "",
|
|
17129
|
-
mimeType: error.mimeType,
|
|
17130
|
-
sizeInBytes: error.sizeInBytes,
|
|
17131
|
-
fileName: error.fileName
|
|
17132
|
-
};
|
|
17133
|
-
}
|
|
17134
17246
|
if (error instanceof IsAnImageError) {
|
|
17135
17247
|
return {
|
|
17136
17248
|
type: "response-error",
|
|
@@ -17255,7 +17367,7 @@ var startParsing = async (message, reader) => {
|
|
|
17255
17367
|
postSlowFps,
|
|
17256
17368
|
postSlowDurationInSeconds,
|
|
17257
17369
|
postSlowVideoBitrate,
|
|
17258
|
-
|
|
17370
|
+
postSlowStructure,
|
|
17259
17371
|
postTracks,
|
|
17260
17372
|
postUnrotatedDimensions,
|
|
17261
17373
|
postVideoCodec,
|
|
@@ -17418,9 +17530,9 @@ var startParsing = async (message, reader) => {
|
|
|
17418
17530
|
value: videoBitrate
|
|
17419
17531
|
});
|
|
17420
17532
|
} : null,
|
|
17421
|
-
|
|
17533
|
+
onSlowStructure: postSlowStructure ? async (structure) => {
|
|
17422
17534
|
await executeCallback({
|
|
17423
|
-
callbackType: "structure",
|
|
17535
|
+
callbackType: "slow-structure",
|
|
17424
17536
|
value: structure
|
|
17425
17537
|
});
|
|
17426
17538
|
} : null,
|
|
@@ -17489,7 +17601,7 @@ var startParsing = async (message, reader) => {
|
|
|
17489
17601
|
}
|
|
17490
17602
|
return async (sample) => {
|
|
17491
17603
|
await executeCallback({
|
|
17492
|
-
callbackType: "on-audio-
|
|
17604
|
+
callbackType: "on-audio-sample",
|
|
17493
17605
|
value: sample,
|
|
17494
17606
|
trackId: params.track.trackId
|
|
17495
17607
|
});
|
|
@@ -17508,7 +17620,7 @@ var startParsing = async (message, reader) => {
|
|
|
17508
17620
|
}
|
|
17509
17621
|
return async (sample) => {
|
|
17510
17622
|
await executeCallback({
|
|
17511
|
-
callbackType: "on-
|
|
17623
|
+
callbackType: "on-video-sample",
|
|
17512
17624
|
value: sample,
|
|
17513
17625
|
trackId: params.track.trackId
|
|
17514
17626
|
});
|