@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,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MediaParserVideoTrack } from './get-tracks';
|
|
2
2
|
import type { SpsAndPps } from './state/parser-state';
|
|
3
|
-
export declare const addAvcProfileToTrack: (track:
|
|
3
|
+
export declare const addAvcProfileToTrack: (track: MediaParserVideoTrack, avc1Profile: SpsAndPps | null) => MediaParserVideoTrack;
|
|
@@ -10,7 +10,13 @@ const addAvcProfileToTrack = (track, avc1Profile) => {
|
|
|
10
10
|
return {
|
|
11
11
|
...track,
|
|
12
12
|
codec: (0, codec_string_1.getCodecStringFromSpsAndPps)(avc1Profile.sps),
|
|
13
|
-
|
|
13
|
+
codecData: { type: 'avc-sps-pps', data: (0, create_sps_pps_data_1.createSpsPpsData)(avc1Profile) },
|
|
14
|
+
// description should be undefined, since this signals to WebCodecs that
|
|
15
|
+
// the codec is in Annex B format, which is the case for AVI files
|
|
16
|
+
// https://www.w3.org/TR/webcodecs-avc-codec-registration/#videodecoderconfig-description
|
|
17
|
+
// ChatGPT 4.1: "Great question! The format of the H.264/AVC bitstream inside a .avi file is almost always in the "Annex B" format"
|
|
18
|
+
// (description is probably already undefined at this point, just writing this to be explicit)
|
|
19
|
+
description: undefined,
|
|
14
20
|
};
|
|
15
21
|
};
|
|
16
22
|
exports.addAvcProfileToTrack = addAvcProfileToTrack;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type MediaParserAvcSppData = {
|
|
2
|
+
type: 'avc-sps-pps';
|
|
3
|
+
data: Uint8Array;
|
|
4
|
+
};
|
|
5
|
+
export type MediaParserHvccData = {
|
|
6
|
+
type: 'hvcc-data';
|
|
7
|
+
data: Uint8Array;
|
|
8
|
+
};
|
|
9
|
+
export type MediaParserAv1cData = {
|
|
10
|
+
type: 'av1c-data';
|
|
11
|
+
data: Uint8Array;
|
|
12
|
+
};
|
|
13
|
+
export type MediaParserAacConfig = {
|
|
14
|
+
type: 'aac-config';
|
|
15
|
+
data: Uint8Array;
|
|
16
|
+
};
|
|
17
|
+
export type MediaParserFlacDescription = {
|
|
18
|
+
type: 'flac-description';
|
|
19
|
+
data: Uint8Array;
|
|
20
|
+
};
|
|
21
|
+
export type UnknownCodecData = {
|
|
22
|
+
type: 'unknown-data';
|
|
23
|
+
data: Uint8Array;
|
|
24
|
+
};
|
|
25
|
+
export type MediaParserOggIdentification = {
|
|
26
|
+
type: 'ogg-identification';
|
|
27
|
+
data: Uint8Array;
|
|
28
|
+
};
|
|
29
|
+
export type MediaParserCodecData = MediaParserAvcSppData | MediaParserHvccData | MediaParserAv1cData | MediaParserAacConfig | MediaParserFlacDescription | MediaParserOggIdentification | UnknownCodecData;
|
|
@@ -54,14 +54,13 @@ const parseAac = async (state) => {
|
|
|
54
54
|
container: 'aac',
|
|
55
55
|
track: {
|
|
56
56
|
codec: (0, aac_codecprivate_1.mapAudioObjectTypeToCodecString)(audioObjectType),
|
|
57
|
-
|
|
58
|
-
codecPrivate,
|
|
57
|
+
codecEnum: 'aac',
|
|
58
|
+
codecData: { type: 'aac-config', data: codecPrivate },
|
|
59
59
|
description: codecPrivate,
|
|
60
60
|
numberOfChannels: channelConfiguration,
|
|
61
61
|
sampleRate,
|
|
62
62
|
timescale: 1000000,
|
|
63
63
|
trackId: 0,
|
|
64
|
-
trakBox: null,
|
|
65
64
|
type: 'audio',
|
|
66
65
|
},
|
|
67
66
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export type
|
|
2
|
-
export declare const getMatrixCoefficientsFromIndex: (index: number) =>
|
|
3
|
-
export type
|
|
4
|
-
export declare const getTransferCharacteristicsFromIndex: (index: number) =>
|
|
5
|
-
export type
|
|
6
|
-
export declare const getPrimariesFromIndex: (index: number) =>
|
|
1
|
+
export type MediaParserMatrixCoefficients = 'rgb' | 'bt709' | 'bt470bg' | 'smpte170m' | 'bt2020-ncl';
|
|
2
|
+
export declare const getMatrixCoefficientsFromIndex: (index: number) => MediaParserMatrixCoefficients | null;
|
|
3
|
+
export type MediaParserTransferCharacteristics = 'bt709' | 'smpte170m' | 'iec61966-2-1' | 'linear' | 'pq' | 'hlg';
|
|
4
|
+
export declare const getTransferCharacteristicsFromIndex: (index: number) => MediaParserTransferCharacteristics | null;
|
|
5
|
+
export type MediaParserPrimaries = 'bt709' | 'bt470bg' | 'smpte170m' | 'bt2020' | 'smpte432' | null;
|
|
6
|
+
export declare const getPrimariesFromIndex: (index: number) => MediaParserPrimaries | null;
|
|
@@ -2,38 +2,64 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPrimariesFromIndex = exports.getTransferCharacteristicsFromIndex = exports.getMatrixCoefficientsFromIndex = void 0;
|
|
4
4
|
const getMatrixCoefficientsFromIndex = (index) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
if (index === 0) {
|
|
6
|
+
return 'rgb';
|
|
7
|
+
}
|
|
8
|
+
if (index === 1) {
|
|
9
|
+
return 'bt709';
|
|
10
|
+
}
|
|
11
|
+
if (index === 5) {
|
|
12
|
+
return 'bt470bg';
|
|
13
|
+
}
|
|
14
|
+
if (index === 6) {
|
|
15
|
+
return 'smpte170m';
|
|
16
|
+
}
|
|
17
|
+
if (index === 9) {
|
|
18
|
+
return 'bt2020-ncl';
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
14
21
|
};
|
|
15
22
|
exports.getMatrixCoefficientsFromIndex = getMatrixCoefficientsFromIndex;
|
|
23
|
+
// https://w3c.github.io/webcodecs/#videotransfercharacteristics
|
|
24
|
+
// But we may support more than that
|
|
16
25
|
const getTransferCharacteristicsFromIndex = (index) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
if (index === 1) {
|
|
27
|
+
return 'bt709';
|
|
28
|
+
}
|
|
29
|
+
if (index === 6) {
|
|
30
|
+
return 'smpte170m';
|
|
31
|
+
}
|
|
32
|
+
if (index === 8) {
|
|
33
|
+
return 'linear';
|
|
34
|
+
}
|
|
35
|
+
if (index === 13) {
|
|
36
|
+
return 'iec61966-2-1';
|
|
37
|
+
}
|
|
38
|
+
if (index === 16) {
|
|
39
|
+
return 'pq';
|
|
40
|
+
}
|
|
41
|
+
if (index === 18) {
|
|
42
|
+
return 'hlg';
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
26
45
|
};
|
|
27
46
|
exports.getTransferCharacteristicsFromIndex = getTransferCharacteristicsFromIndex;
|
|
28
47
|
const getPrimariesFromIndex = (index) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
48
|
+
if (index === 1) {
|
|
49
|
+
return 'bt709';
|
|
50
|
+
}
|
|
51
|
+
if (index === 5) {
|
|
52
|
+
return 'bt470bg';
|
|
53
|
+
}
|
|
54
|
+
if (index === 6) {
|
|
55
|
+
return 'smpte170m';
|
|
56
|
+
}
|
|
57
|
+
if (index === 9) {
|
|
58
|
+
return 'bt2020';
|
|
59
|
+
}
|
|
60
|
+
if (index === 12) {
|
|
61
|
+
return 'smpte432';
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
38
64
|
};
|
|
39
65
|
exports.getPrimariesFromIndex = getPrimariesFromIndex;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAVCDecoderConfigurationRecord = void 0;
|
|
4
|
+
const combine_uint8_arrays_1 = require("../../combine-uint8-arrays");
|
|
5
|
+
const truthy_1 = require("../../truthy");
|
|
6
|
+
function serializeUint16(value) {
|
|
7
|
+
const buffer = new ArrayBuffer(2);
|
|
8
|
+
const view = new DataView(buffer);
|
|
9
|
+
view.setUint16(0, value);
|
|
10
|
+
return new Uint8Array(buffer);
|
|
11
|
+
}
|
|
12
|
+
const createAVCDecoderConfigurationRecord = (avc1Profile) => {
|
|
13
|
+
return (0, combine_uint8_arrays_1.combineUint8Arrays)([
|
|
14
|
+
new Uint8Array([
|
|
15
|
+
// https://gist.github.com/uupaa/8493378ec15f644a3d2b
|
|
16
|
+
1, // version
|
|
17
|
+
avc1Profile.sps.spsData.profile,
|
|
18
|
+
avc1Profile.sps.spsData.compatibility,
|
|
19
|
+
avc1Profile.sps.spsData.level,
|
|
20
|
+
0xff,
|
|
21
|
+
0xe1,
|
|
22
|
+
]),
|
|
23
|
+
// sequence parameter set length
|
|
24
|
+
serializeUint16(avc1Profile.sps.sps.length),
|
|
25
|
+
// sequence parameter set
|
|
26
|
+
avc1Profile.sps.sps,
|
|
27
|
+
// num of PPS
|
|
28
|
+
new Uint8Array([0x01]),
|
|
29
|
+
// picture parameter set length
|
|
30
|
+
serializeUint16(avc1Profile.pps.pps.length),
|
|
31
|
+
// PPS
|
|
32
|
+
avc1Profile.pps.pps,
|
|
33
|
+
].filter(truthy_1.truthy));
|
|
34
|
+
};
|
|
35
|
+
exports.createAVCDecoderConfigurationRecord = createAVCDecoderConfigurationRecord;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MediaParserAdvancedColor } from '../../get-tracks';
|
|
2
2
|
import type { SpsInfo } from './parse-avc';
|
|
3
3
|
export declare const getDimensionsFromSps: (sps: SpsInfo) => {
|
|
4
4
|
height: number;
|
|
@@ -8,4 +8,4 @@ export declare const getSampleAspectRatioFromSps: (sps: SpsInfo) => {
|
|
|
8
8
|
width: number;
|
|
9
9
|
height: number;
|
|
10
10
|
};
|
|
11
|
-
export declare const getVideoColorFromSps: (sps: SpsInfo) =>
|
|
11
|
+
export declare const getVideoColorFromSps: (sps: SpsInfo) => MediaParserAdvancedColor;
|
|
@@ -37,10 +37,10 @@ const getVideoColorFromSps = (sps) => {
|
|
|
37
37
|
const transferCharacteristics = (_b = sps.vui_parameters) === null || _b === void 0 ? void 0 : _b.transfer_characteristics;
|
|
38
38
|
const colorPrimaries = (_c = sps.vui_parameters) === null || _c === void 0 ? void 0 : _c.colour_primaries;
|
|
39
39
|
return {
|
|
40
|
-
|
|
40
|
+
matrix: matrixCoefficients
|
|
41
41
|
? (0, color_1.getMatrixCoefficientsFromIndex)(matrixCoefficients)
|
|
42
42
|
: null,
|
|
43
|
-
|
|
43
|
+
transfer: transferCharacteristics
|
|
44
44
|
? (0, color_1.getTransferCharacteristicsFromIndex)(transferCharacteristics)
|
|
45
45
|
: null,
|
|
46
46
|
primaries: colorPrimaries ? (0, color_1.getPrimariesFromIndex)(colorPrimaries) : null,
|
|
@@ -37,13 +37,12 @@ const parseStreamInfo = async ({ iterator, state, }) => {
|
|
|
37
37
|
codec: 'flac',
|
|
38
38
|
type: 'audio',
|
|
39
39
|
description: asUint8Array,
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
codecData: { type: 'flac-description', data: asUint8Array },
|
|
41
|
+
codecEnum: 'flac',
|
|
42
42
|
numberOfChannels: channels,
|
|
43
43
|
sampleRate,
|
|
44
44
|
timescale: 1000000,
|
|
45
45
|
trackId: 0,
|
|
46
|
-
trakBox: null,
|
|
47
46
|
},
|
|
48
47
|
registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
|
|
49
48
|
tracks: state.callbacks.tracks,
|
|
@@ -7,7 +7,7 @@ export declare const collectSamplePositionsFromMoofBoxes: ({ moofBoxes, tkhdBox,
|
|
|
7
7
|
}) => {
|
|
8
8
|
samplePositions: {
|
|
9
9
|
isLastFragment: boolean;
|
|
10
|
-
samples: import("
|
|
10
|
+
samples: import("../../get-sample-positions").SamplePosition[];
|
|
11
11
|
}[];
|
|
12
12
|
isComplete: boolean;
|
|
13
13
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mediaParserAdvancedColorToWebCodecsColor = void 0;
|
|
4
|
+
const mediaParserAdvancedColorToWebCodecsColor = (color) => {
|
|
5
|
+
return {
|
|
6
|
+
transfer: color.transfer,
|
|
7
|
+
matrix: color.matrix,
|
|
8
|
+
primaries: color.primaries,
|
|
9
|
+
fullRange: color.fullRange,
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
exports.mediaParserAdvancedColorToWebCodecsColor = mediaParserAdvancedColorToWebCodecsColor;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { SamplePosition } from '../../get-sample-positions';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MediaParserLogLevel } from '../../log';
|
|
3
3
|
import type { MediaSection } from '../../state/video-section';
|
|
4
4
|
export declare const findKeyframeBeforeTime: ({ samplePositions, time, timescale, mediaSections, logLevel, }: {
|
|
5
5
|
samplePositions: SamplePosition[];
|
|
6
6
|
time: number;
|
|
7
7
|
timescale: number;
|
|
8
8
|
mediaSections: MediaSection[];
|
|
9
|
-
logLevel:
|
|
9
|
+
logLevel: MediaParserLogLevel;
|
|
10
10
|
}) => number | null;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { SamplePosition } from '../../get-sample-positions';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MediaParserAudioTrack, MediaParserOtherTrack, MediaParserVideoTrack } from '../../get-tracks';
|
|
3
3
|
import type { IsoBaseMediaStructure } from '../../parse-result';
|
|
4
4
|
import type { StructureState } from '../../state/structure';
|
|
5
|
-
export declare const findAnyTrackWithSamplePositions: (allTracks: (
|
|
6
|
-
track:
|
|
5
|
+
export declare const findAnyTrackWithSamplePositions: (allTracks: (MediaParserVideoTrack | MediaParserAudioTrack | MediaParserOtherTrack)[], struc: IsoBaseMediaStructure) => {
|
|
6
|
+
track: MediaParserVideoTrack | MediaParserAudioTrack;
|
|
7
7
|
samplePositions: SamplePosition[];
|
|
8
8
|
} | null;
|
|
9
9
|
type TrackWithSamplePositions = {
|
|
10
|
-
track:
|
|
10
|
+
track: MediaParserVideoTrack | MediaParserAudioTrack;
|
|
11
11
|
samplePositions: SamplePosition[];
|
|
12
12
|
};
|
|
13
|
-
export declare const findTrackToSeek: (allTracks: (
|
|
13
|
+
export declare const findTrackToSeek: (allTracks: (MediaParserVideoTrack | MediaParserAudioTrack | MediaParserOtherTrack)[], structure: StructureState) => TrackWithSamplePositions | null;
|
|
14
14
|
export {};
|
|
@@ -5,10 +5,18 @@ const are_samples_complete_1 = require("./are-samples-complete");
|
|
|
5
5
|
const get_sample_positions_from_track_1 = require("./get-sample-positions-from-track");
|
|
6
6
|
const traversal_1 = require("./traversal");
|
|
7
7
|
const findAnyTrackWithSamplePositions = (allTracks, struc) => {
|
|
8
|
+
const moov = (0, traversal_1.getMoovFromFromIsoStructure)(struc);
|
|
9
|
+
if (!moov) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
8
12
|
for (const track of allTracks) {
|
|
9
13
|
if (track.type === 'video' || track.type === 'audio') {
|
|
14
|
+
const trakBox = (0, traversal_1.getTrakBoxByTrackId)(moov, track.trackId);
|
|
15
|
+
if (!trakBox) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
10
18
|
const { samplePositions } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
11
|
-
trakBox
|
|
19
|
+
trakBox,
|
|
12
20
|
moofBoxes: (0, traversal_1.getMoofBoxes)(struc.boxes),
|
|
13
21
|
moofComplete: (0, are_samples_complete_1.areSamplesComplete)({
|
|
14
22
|
moofBoxes: (0, traversal_1.getMoofBoxes)(struc.boxes),
|
|
@@ -30,8 +38,16 @@ const findTrackToSeek = (allTracks, structure) => {
|
|
|
30
38
|
if (!firstVideoTrack) {
|
|
31
39
|
return (0, exports.findAnyTrackWithSamplePositions)(allTracks, struc);
|
|
32
40
|
}
|
|
41
|
+
const moov = (0, traversal_1.getMoovFromFromIsoStructure)(struc);
|
|
42
|
+
if (!moov) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const trakBox = (0, traversal_1.getTrakBoxByTrackId)(moov, firstVideoTrack.trackId);
|
|
46
|
+
if (!trakBox) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
33
49
|
const { samplePositions } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
34
|
-
trakBox
|
|
50
|
+
trakBox,
|
|
35
51
|
moofBoxes: (0, traversal_1.getMoofBoxes)(struc.boxes),
|
|
36
52
|
moofComplete: (0, are_samples_complete_1.areSamplesComplete)({
|
|
37
53
|
moofBoxes: (0, traversal_1.getMoofBoxes)(struc.boxes),
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import type { MediaParserCodecData } from '../../codec-data';
|
|
1
2
|
import type { MediaParserAudioCodec } from '../../get-tracks';
|
|
2
3
|
type AudioDecoderConfig = {
|
|
3
4
|
numberOfChannels: number;
|
|
4
5
|
sampleRate: number;
|
|
5
|
-
codecPrivate:
|
|
6
|
+
codecPrivate: MediaParserCodecData | null;
|
|
6
7
|
};
|
|
7
8
|
export declare const getActualDecoderParameters: ({ audioCodec, codecPrivate, numberOfChannels, sampleRate, }: {
|
|
8
9
|
audioCodec: MediaParserAudioCodec;
|
|
9
|
-
codecPrivate:
|
|
10
|
+
codecPrivate: MediaParserCodecData | null;
|
|
10
11
|
numberOfChannels: number;
|
|
11
12
|
sampleRate: number;
|
|
12
13
|
}) => AudioDecoderConfig;
|
|
@@ -7,16 +7,27 @@ const aac_codecprivate_1 = require("../../aac-codecprivate");
|
|
|
7
7
|
// Therefore, prioritizing Codec Private over `numberOfChannels`.
|
|
8
8
|
const getActualDecoderParameters = ({ audioCodec, codecPrivate, numberOfChannels, sampleRate, }) => {
|
|
9
9
|
if (audioCodec !== 'aac') {
|
|
10
|
-
return {
|
|
10
|
+
return {
|
|
11
|
+
numberOfChannels,
|
|
12
|
+
sampleRate,
|
|
13
|
+
codecPrivate,
|
|
14
|
+
};
|
|
11
15
|
}
|
|
12
16
|
if (codecPrivate === null) {
|
|
13
17
|
return { numberOfChannels, sampleRate, codecPrivate };
|
|
14
18
|
}
|
|
15
|
-
|
|
19
|
+
if (codecPrivate.type !== 'aac-config') {
|
|
20
|
+
throw new Error('Expected AAC codec private data');
|
|
21
|
+
}
|
|
22
|
+
const parsed = (0, aac_codecprivate_1.parseAacCodecPrivate)(codecPrivate.data);
|
|
23
|
+
const actual = (0, aac_codecprivate_1.createAacCodecPrivate)({
|
|
24
|
+
...parsed,
|
|
25
|
+
codecPrivate: codecPrivate.data,
|
|
26
|
+
});
|
|
16
27
|
return {
|
|
17
28
|
numberOfChannels: parsed.channelConfiguration,
|
|
18
29
|
sampleRate: parsed.sampleRate,
|
|
19
|
-
codecPrivate:
|
|
30
|
+
codecPrivate: { type: 'aac-config', data: actual },
|
|
20
31
|
};
|
|
21
32
|
};
|
|
22
33
|
exports.getActualDecoderParameters = getActualDecoderParameters;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MediaParserLogLevel } from '../../log';
|
|
3
3
|
import type { IsoBaseMediaBox } from './base-media-box';
|
|
4
4
|
import type { OnlyIfMoovAtomExpected } from './process-box';
|
|
5
5
|
export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, contentLength, }: {
|
|
6
6
|
size: number;
|
|
7
7
|
iterator: BufferIterator;
|
|
8
|
-
logLevel:
|
|
8
|
+
logLevel: MediaParserLogLevel;
|
|
9
9
|
onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
|
|
10
10
|
contentLength: number;
|
|
11
11
|
}) => Promise<IsoBaseMediaBox[]>;
|
|
@@ -6,19 +6,28 @@ const are_samples_complete_1 = require("./are-samples-complete");
|
|
|
6
6
|
const get_sample_positions_from_track_1 = require("./get-sample-positions-from-track");
|
|
7
7
|
const traversal_1 = require("./traversal");
|
|
8
8
|
const getKeyframesFromIsoBaseMedia = (state) => {
|
|
9
|
-
const
|
|
9
|
+
const tracks = (0, get_tracks_1.getTracksFromIsoBaseMedia)({
|
|
10
10
|
isoState: state.iso,
|
|
11
11
|
m3uPlaylistContext: state.m3uPlaylistContext,
|
|
12
12
|
structure: state.structure,
|
|
13
13
|
mayUsePrecomputed: true,
|
|
14
14
|
});
|
|
15
|
+
const videoTracks = tracks.filter((t) => t.type === 'video');
|
|
15
16
|
const structure = state.structure.getIsoStructure();
|
|
16
17
|
const moofBoxes = (0, traversal_1.getMoofBoxes)(structure.boxes);
|
|
17
18
|
const tfraBoxes = (0, traversal_1.getTfraBoxes)(structure.boxes);
|
|
19
|
+
const moov = (0, traversal_1.getMoovFromFromIsoStructure)(structure);
|
|
20
|
+
if (!moov) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
18
23
|
const allSamples = videoTracks.map((t) => {
|
|
19
24
|
const { timescale: ts } = t;
|
|
25
|
+
const trakBox = (0, traversal_1.getTrakBoxByTrackId)(moov, t.trackId);
|
|
26
|
+
if (!trakBox) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
20
29
|
const { samplePositions, isComplete } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
|
|
21
|
-
trakBox
|
|
30
|
+
trakBox,
|
|
22
31
|
moofBoxes,
|
|
23
32
|
moofComplete: (0, are_samples_complete_1.areSamplesComplete)({
|
|
24
33
|
moofBoxes,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { MediaParserController } from '../../controller/media-parser-controller';
|
|
2
2
|
import type { PrefetchCache } from '../../fetch';
|
|
3
|
-
import type {
|
|
3
|
+
import type { MediaParserLogLevel } from '../../log';
|
|
4
4
|
import type { ParseMediaSrc } from '../../options';
|
|
5
|
-
import type {
|
|
5
|
+
import type { MediaParserReaderInterface } from '../../readers/reader';
|
|
6
6
|
import type { IsoBaseMediaBox } from './base-media-box';
|
|
7
7
|
export type MfraSeekingBoxOptions = {
|
|
8
8
|
contentLength: number;
|
|
9
9
|
controller: MediaParserController;
|
|
10
|
-
readerInterface:
|
|
10
|
+
readerInterface: MediaParserReaderInterface;
|
|
11
11
|
src: ParseMediaSrc;
|
|
12
|
-
logLevel:
|
|
12
|
+
logLevel: MediaParserLogLevel;
|
|
13
13
|
prefetchCache: PrefetchCache;
|
|
14
14
|
};
|
|
15
15
|
export declare const getMfraSeekingBox: ({ contentLength, controller, readerInterface, src, logLevel, prefetchCache, }: MfraSeekingBoxOptions) => Promise<IsoBaseMediaBox[] | null>;
|
|
@@ -67,7 +67,7 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
|
|
|
67
67
|
const boxes = [];
|
|
68
68
|
const canSkipTracksState = (0, can_skip_tracks_1.makeCanSkipTracksState)({
|
|
69
69
|
hasAudioTrackHandlers: false,
|
|
70
|
-
fields: {
|
|
70
|
+
fields: { slowStructure: true },
|
|
71
71
|
hasVideoTrackHandlers: false,
|
|
72
72
|
structure: (0, structure_1.structureState)(),
|
|
73
73
|
});
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { MediaParserTrack } from '../../get-tracks';
|
|
2
|
+
import type { MediaParserLogLevel } from '../../log';
|
|
3
|
+
import type { IsoBaseMediaStructure } from '../../parse-result';
|
|
3
4
|
import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
|
|
4
5
|
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
6
|
+
import type { StructureState } from '../../state/structure';
|
|
5
7
|
import type { SeekResolution } from '../../work-on-seek-request';
|
|
6
|
-
export declare const getSeekingByteFromFragmentedMp4: ({ info, time, logLevel, currentPosition, isoState,
|
|
8
|
+
export declare const getSeekingByteFromFragmentedMp4: ({ info, time, logLevel, currentPosition, isoState, tracks, isLastChunkInPlaylist, structure, mp4HeaderSegment, }: {
|
|
7
9
|
info: IsoBaseMediaSeekingHints;
|
|
8
10
|
time: number;
|
|
9
|
-
logLevel:
|
|
11
|
+
logLevel: MediaParserLogLevel;
|
|
10
12
|
currentPosition: number;
|
|
11
13
|
isoState: IsoBaseMediaState;
|
|
12
|
-
|
|
14
|
+
structure: StructureState;
|
|
15
|
+
tracks: MediaParserTrack[];
|
|
13
16
|
isLastChunkInPlaylist: boolean;
|
|
17
|
+
mp4HeaderSegment: IsoBaseMediaStructure | null;
|
|
14
18
|
}) => Promise<SeekResolution>;
|
|
@@ -9,14 +9,27 @@ const find_keyframe_before_time_1 = require("./find-keyframe-before-time");
|
|
|
9
9
|
const get_sample_position_bounds_1 = require("./get-sample-position-bounds");
|
|
10
10
|
const find_best_segment_from_tfra_1 = require("./mfra/find-best-segment-from-tfra");
|
|
11
11
|
const traversal_1 = require("./traversal");
|
|
12
|
-
const getSeekingByteFromFragmentedMp4 = async ({ info, time, logLevel, currentPosition, isoState,
|
|
13
|
-
const firstVideoTrack =
|
|
12
|
+
const getSeekingByteFromFragmentedMp4 = async ({ info, time, logLevel, currentPosition, isoState, tracks, isLastChunkInPlaylist, structure, mp4HeaderSegment, }) => {
|
|
13
|
+
const firstVideoTrack = tracks.find((t) => t.type === 'video');
|
|
14
14
|
// If there is both video and audio, seek based on video, but if not then audio is also okay
|
|
15
|
-
const firstTrack = firstVideoTrack !== null && firstVideoTrack !== void 0 ? firstVideoTrack :
|
|
15
|
+
const firstTrack = firstVideoTrack !== null && firstVideoTrack !== void 0 ? firstVideoTrack : tracks.find((t) => t.type === 'audio');
|
|
16
16
|
if (!firstTrack) {
|
|
17
17
|
throw new Error('no video and no audio tracks');
|
|
18
18
|
}
|
|
19
|
-
const
|
|
19
|
+
const moov = (0, traversal_1.getMoovBoxFromState)({
|
|
20
|
+
structureState: structure,
|
|
21
|
+
isoState,
|
|
22
|
+
mp4HeaderSegment,
|
|
23
|
+
mayUsePrecomputed: true,
|
|
24
|
+
});
|
|
25
|
+
if (!moov) {
|
|
26
|
+
throw new Error('No moov atom found');
|
|
27
|
+
}
|
|
28
|
+
const trakBox = (0, traversal_1.getTrakBoxByTrackId)(moov, firstTrack.trackId);
|
|
29
|
+
if (!trakBox) {
|
|
30
|
+
throw new Error('No trak box found');
|
|
31
|
+
}
|
|
32
|
+
const tkhdBox = (0, traversal_1.getTkhdBox)(trakBox);
|
|
20
33
|
if (!tkhdBox) {
|
|
21
34
|
throw new Error('Expected tkhd box in trak box');
|
|
22
35
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MediaParserLogLevel } from '../../log';
|
|
2
2
|
import type { M3uPlaylistContext } from '../../options';
|
|
3
3
|
import type { IsoBaseMediaSeekingHints } from '../../seeking-hints';
|
|
4
4
|
import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
|
|
@@ -7,7 +7,7 @@ import type { SeekResolution } from '../../work-on-seek-request';
|
|
|
7
7
|
export declare const getSeekingByteFromIsoBaseMedia: ({ info, time, logLevel, currentPosition, isoState, m3uPlaylistContext, structure, }: {
|
|
8
8
|
info: IsoBaseMediaSeekingHints;
|
|
9
9
|
time: number;
|
|
10
|
-
logLevel:
|
|
10
|
+
logLevel: MediaParserLogLevel;
|
|
11
11
|
currentPosition: number;
|
|
12
12
|
isoState: IsoBaseMediaState;
|
|
13
13
|
m3uPlaylistContext: M3uPlaylistContext | null;
|
|
@@ -8,18 +8,13 @@ const find_track_to_seek_1 = require("./find-track-to-seek");
|
|
|
8
8
|
const get_seeking_byte_from_fragmented_mp4_1 = require("./get-seeking-byte-from-fragmented-mp4");
|
|
9
9
|
const traversal_1 = require("./traversal");
|
|
10
10
|
const getSeekingByteFromIsoBaseMedia = ({ info, time, logLevel, currentPosition, isoState, m3uPlaylistContext, structure, }) => {
|
|
11
|
-
var _a, _b;
|
|
11
|
+
var _a, _b, _c;
|
|
12
12
|
const tracks = (0, get_tracks_1.getTracksFromIsoBaseMedia)({
|
|
13
13
|
isoState,
|
|
14
14
|
m3uPlaylistContext,
|
|
15
15
|
structure,
|
|
16
16
|
mayUsePrecomputed: false,
|
|
17
17
|
});
|
|
18
|
-
const allTracks = [
|
|
19
|
-
...tracks.videoTracks,
|
|
20
|
-
...tracks.audioTracks,
|
|
21
|
-
...tracks.otherTracks,
|
|
22
|
-
];
|
|
23
18
|
const hasMoov = Boolean((0, traversal_1.getMoovBoxFromState)({
|
|
24
19
|
structureState: structure,
|
|
25
20
|
isoState,
|
|
@@ -39,11 +34,13 @@ const getSeekingByteFromIsoBaseMedia = ({ info, time, logLevel, currentPosition,
|
|
|
39
34
|
logLevel,
|
|
40
35
|
currentPosition,
|
|
41
36
|
isoState,
|
|
42
|
-
|
|
37
|
+
tracks,
|
|
43
38
|
isLastChunkInPlaylist: (_b = m3uPlaylistContext === null || m3uPlaylistContext === void 0 ? void 0 : m3uPlaylistContext.isLastChunkInPlaylist) !== null && _b !== void 0 ? _b : false,
|
|
39
|
+
structure,
|
|
40
|
+
mp4HeaderSegment: (_c = m3uPlaylistContext === null || m3uPlaylistContext === void 0 ? void 0 : m3uPlaylistContext.mp4HeaderSegment) !== null && _c !== void 0 ? _c : null,
|
|
44
41
|
});
|
|
45
42
|
}
|
|
46
|
-
const trackWithSamplePositions = (0, find_track_to_seek_1.findTrackToSeek)(
|
|
43
|
+
const trackWithSamplePositions = (0, find_track_to_seek_1.findTrackToSeek)(tracks, structure);
|
|
47
44
|
if (!trackWithSamplePositions) {
|
|
48
45
|
return Promise.resolve({
|
|
49
46
|
type: 'valid-but-must-wait',
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MediaParserAudioTrack, MediaParserOtherTrack, MediaParserVideoTrack } from '../../get-tracks';
|
|
2
2
|
import type { TrakBox } from './trak/trak';
|
|
3
|
-
export declare const makeBaseMediaTrack: (trakBox: TrakBox) =>
|
|
3
|
+
export declare const makeBaseMediaTrack: (trakBox: TrakBox) => MediaParserVideoTrack | MediaParserAudioTrack | MediaParserOtherTrack | null;
|