@remotion/media-parser 4.0.194 → 4.0.196
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-new-matroska-tracks.d.ts +8 -0
- package/dist/add-new-matroska-tracks.js +14 -0
- package/dist/av1-codec-string.d.ts +3 -0
- package/dist/av1-codec-string.js +91 -0
- package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +14 -0
- package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +38 -0
- package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +8 -0
- package/dist/boxes/iso-base-media/esds/esds-descriptors.js +22 -2
- package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
- package/dist/boxes/iso-base-media/ftype.js +31 -0
- package/dist/boxes/iso-base-media/make-track.d.ts +3 -0
- package/dist/boxes/iso-base-media/make-track.js +112 -0
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +6 -2
- package/dist/boxes/iso-base-media/mdat/mdat.js +90 -6
- package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
- package/dist/boxes/iso-base-media/moov/moov.js +4 -2
- package/dist/boxes/iso-base-media/mvhd.js +7 -1
- package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
- package/dist/boxes/iso-base-media/process-box.js +322 -34
- package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
- package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
- package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
- package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
- package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
- package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
- package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
- package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
- package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
- package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
- package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
- package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
- package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
- package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
- package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
- package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
- package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
- package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
- package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
- package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
- package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
- package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
- package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
- package/dist/boxes/iso-base-media/stsd/stsz.d.ts +9 -3
- package/dist/boxes/iso-base-media/stsd/stsz.js +14 -2
- package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
- package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
- package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
- package/dist/boxes/iso-base-media/tkhd.js +41 -14
- package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
- package/dist/boxes/iso-base-media/trak/trak.js +4 -2
- package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
- package/dist/boxes/iso-base-media/void-box.js +2 -0
- package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
- package/dist/boxes/webm/allowed-partial-segments.js +4 -0
- package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
- package/dist/boxes/webm/av1-codec-private.js +95 -0
- package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
- package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
- package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
- package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
- package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
- package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
- package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
- package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
- package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
- package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
- package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
- package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
- package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
- package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
- package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
- package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
- package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
- package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
- package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
- package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
- package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
- package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
- package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
- package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
- package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
- package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
- package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
- package/dist/boxes/webm/bitstream/av1.js +118 -0
- package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
- package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
- package/dist/boxes/webm/description.d.ts +2 -0
- package/dist/boxes/webm/description.js +83 -0
- package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
- package/dist/boxes/webm/get-ready-tracks.js +29 -0
- package/dist/boxes/webm/get-track.d.ts +6 -0
- package/dist/boxes/webm/get-track.js +183 -0
- package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
- package/dist/boxes/webm/parse-webm-header.js +2 -2
- package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
- package/dist/boxes/webm/segments/all-segments.js +277 -0
- package/dist/boxes/webm/segments/duration.d.ts +1 -1
- package/dist/boxes/webm/segments/duration.js +13 -9
- package/dist/boxes/webm/segments/info.d.ts +2 -1
- package/dist/boxes/webm/segments/info.js +12 -4
- package/dist/boxes/webm/segments/main.d.ts +0 -2
- package/dist/boxes/webm/segments/main.js +0 -11
- package/dist/boxes/webm/segments/muxing.d.ts +1 -1
- package/dist/boxes/webm/segments/muxing.js +1 -2
- package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
- package/dist/boxes/webm/segments/parse-children.js +82 -6
- package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
- package/dist/boxes/webm/segments/seek-head.js +12 -3
- package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
- package/dist/boxes/webm/segments/seek-position.js +1 -2
- package/dist/boxes/webm/segments/seek.d.ts +7 -2
- package/dist/boxes/webm/segments/seek.js +22 -9
- package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
- package/dist/boxes/webm/segments/track-entry.js +269 -57
- package/dist/boxes/webm/segments/tracks.d.ts +2 -1
- package/dist/boxes/webm/segments/tracks.js +12 -4
- package/dist/boxes/webm/segments/void.d.ts +1 -1
- package/dist/boxes/webm/segments/void.js +1 -2
- package/dist/boxes/webm/segments/writing.d.ts +1 -1
- package/dist/boxes/webm/segments/writing.js +1 -2
- package/dist/boxes/webm/segments.d.ts +8 -4
- package/dist/boxes/webm/segments.js +176 -40
- package/dist/boxes/webm/traversal.d.ts +7 -0
- package/dist/boxes/webm/traversal.js +25 -0
- package/dist/buffer-iterator.d.ts +15 -1
- package/dist/buffer-iterator.js +115 -46
- package/dist/combine-uint8array.d.ts +1 -0
- package/dist/combine-uint8array.js +13 -0
- package/dist/from-fetch.d.ts +2 -0
- package/dist/from-fetch.js +54 -0
- package/dist/from-node.js +6 -0
- package/dist/from-web-file.d.ts +2 -0
- package/dist/from-web-file.js +34 -0
- package/dist/from-web.js +6 -9
- package/dist/get-audio-codec.d.ts +19 -0
- package/dist/get-audio-codec.js +153 -60
- package/dist/get-dimensions.d.ts +8 -2
- package/dist/get-dimensions.js +13 -91
- package/dist/get-duration.js +4 -7
- package/dist/get-fps.d.ts +4 -3
- package/dist/get-fps.js +17 -116
- package/dist/get-sample-aspect-ratio.d.ts +37 -0
- package/dist/get-sample-aspect-ratio.js +137 -0
- package/dist/get-sample-positions.d.ts +11 -1
- package/dist/get-sample-positions.js +31 -2
- package/dist/get-tracks.d.ts +44 -5
- package/dist/get-tracks.js +66 -48
- package/dist/get-video-codec.d.ts +2 -0
- package/dist/get-video-codec.js +47 -31
- package/dist/get-video-metadata.d.ts +2 -0
- package/dist/get-video-metadata.js +44 -0
- package/dist/has-all-info.d.ts +2 -1
- package/dist/has-all-info.js +14 -5
- package/dist/index.d.ts +1 -0
- package/dist/make-hvc1-codec-strings.d.ts +2 -0
- package/dist/make-hvc1-codec-strings.js +47 -0
- package/dist/options.d.ts +26 -4
- package/dist/parse-media.js +62 -17
- package/dist/parse-result.d.ts +16 -5
- package/dist/parse-video.d.ts +11 -2
- package/dist/parse-video.js +14 -6
- package/dist/parser-context.d.ts +8 -0
- package/dist/parser-context.js +2 -0
- package/dist/parser-state.d.ts +23 -0
- package/dist/parser-state.js +112 -0
- package/dist/read-and-increment-offset.d.ts +28 -0
- package/dist/read-and-increment-offset.js +177 -0
- package/dist/reader.d.ts +2 -2
- package/dist/traversal.d.ts +37 -0
- package/dist/traversal.js +244 -1
- package/dist/understand-vorbis.d.ts +1 -0
- package/dist/understand-vorbis.js +12 -0
- package/dist/webcodec-sample-types.d.ts +21 -0
- package/dist/webcodec-sample-types.js +2 -0
- package/package.json +10 -2
- package/src/add-new-matroska-tracks.ts +23 -0
- package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
- package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
- package/src/boxes/iso-base-media/make-track.ts +157 -0
- package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
- package/src/boxes/iso-base-media/moov/moov.ts +8 -3
- package/src/boxes/iso-base-media/mvhd.ts +7 -1
- package/src/boxes/iso-base-media/process-box.ts +388 -38
- package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
- package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
- package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
- package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
- package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
- package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
- package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
- package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
- package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
- package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
- package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
- package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
- package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
- package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
- package/src/boxes/iso-base-media/tkhd.ts +63 -16
- package/src/boxes/iso-base-media/trak/trak.ts +8 -3
- package/src/boxes/iso-base-media/void-box.ts +4 -0
- package/src/boxes/webm/allowed-partial-segments.ts +1 -0
- package/src/boxes/webm/av1-codec-private.ts +113 -0
- package/src/boxes/webm/description.ts +101 -0
- package/src/boxes/webm/get-ready-tracks.ts +36 -0
- package/src/boxes/webm/get-track.ts +250 -0
- package/src/boxes/webm/parse-webm-header.ts +6 -2
- package/src/boxes/webm/segments/all-segments.ts +285 -0
- package/src/boxes/webm/segments/duration.ts +15 -8
- package/src/boxes/webm/segments/info.ts +18 -4
- package/src/boxes/webm/segments/main.ts +0 -13
- package/src/boxes/webm/segments/muxing.ts +1 -1
- package/src/boxes/webm/segments/parse-children.ts +132 -9
- package/src/boxes/webm/segments/seek-head.ts +17 -4
- package/src/boxes/webm/segments/seek-position.ts +1 -2
- package/src/boxes/webm/segments/seek.ts +31 -9
- package/src/boxes/webm/segments/track-entry.ts +475 -65
- package/src/boxes/webm/segments/tracks.ts +17 -7
- package/src/boxes/webm/segments/void.ts +4 -2
- package/src/boxes/webm/segments/writing.ts +1 -1
- package/src/boxes/webm/segments.ts +266 -42
- package/src/boxes/webm/traversal.ts +32 -0
- package/src/buffer-iterator.ts +140 -45
- package/src/combine-uint8array.ts +13 -0
- package/src/{from-web.ts → from-fetch.ts} +9 -1
- package/src/from-node.ts +8 -0
- package/src/from-web-file.ts +39 -0
- package/src/get-audio-codec.ts +213 -84
- package/src/get-dimensions.ts +25 -132
- package/src/get-duration.ts +4 -8
- package/src/get-fps.ts +27 -172
- package/src/get-sample-aspect-ratio.ts +204 -0
- package/src/get-sample-positions.ts +93 -0
- package/src/get-tracks.ts +147 -0
- package/src/get-video-codec.ts +62 -47
- package/src/has-all-info.ts +35 -5
- package/src/index.ts +8 -0
- package/src/make-hvc1-codec-strings.ts +55 -0
- package/src/options.ts +48 -9
- package/src/parse-media.ts +90 -21
- package/src/parse-result.ts +28 -4
- package/src/parse-video.ts +30 -7
- package/src/parser-context.ts +9 -0
- package/src/parser-state.ts +151 -0
- package/src/reader.ts +2 -2
- package/src/test/aspect-ratio.test.ts +42 -0
- package/src/test/av1.test.ts +108 -0
- package/src/test/duration.test.ts +5 -21
- package/src/test/matroska.test.ts +350 -31
- package/src/test/mvhd.test.ts +6 -1
- package/src/test/parse-esds.test.ts +29 -6
- package/src/test/parse-stco.test.ts +59 -0
- package/src/test/parse-stsc.test.ts +104 -0
- package/src/test/parse-stsz.test.ts +57 -0
- package/src/test/parse-stts.test.ts +1 -1
- package/src/test/parse-video.test.ts +23 -35
- package/src/test/parse-webm.test.ts +5 -5
- package/src/test/stream-local.test.ts +542 -46
- package/src/test/stream-remote.test.ts +15 -13
- package/src/test/stream-samples.test.ts +259 -0
- package/src/test/stsd.test.ts +60 -8
- package/src/test/tkhd.test.ts +4 -1
- package/src/traversal.ts +496 -0
- package/src/webcodec-sample-types.ts +30 -0
- package/tsconfig.json +5 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/boxes.json +0 -1
- package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
- package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
- package/dist/boxes/iso-base-media/esds.d.ts +0 -15
- package/dist/boxes/iso-base-media/esds.js +0 -27
- package/dist/get-codec.d.ts +0 -4
- package/dist/get-codec.js +0 -22
- /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
- /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
- /package/src/boxes/iso-base-media/{stts → stsd}/stts.ts +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
type CttsEntry = {
|
|
5
|
+
sampleCount: number;
|
|
6
|
+
sampleOffset: number;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export interface CttsBox extends BaseBox {
|
|
10
|
+
type: 'ctts-box';
|
|
11
|
+
version: number;
|
|
12
|
+
flags: number[];
|
|
13
|
+
entryCount: number;
|
|
14
|
+
entries: CttsEntry[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const parseCtts = ({
|
|
18
|
+
iterator,
|
|
19
|
+
offset,
|
|
20
|
+
size,
|
|
21
|
+
}: {
|
|
22
|
+
iterator: BufferIterator;
|
|
23
|
+
offset: number;
|
|
24
|
+
size: number;
|
|
25
|
+
}): CttsBox => {
|
|
26
|
+
const version = iterator.getUint8();
|
|
27
|
+
if (version !== 0) {
|
|
28
|
+
throw new Error(`Unsupported CTTS version ${version}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const flags = iterator.getSlice(3);
|
|
32
|
+
const entryCount = iterator.getUint32();
|
|
33
|
+
|
|
34
|
+
const entries: CttsEntry[] = [];
|
|
35
|
+
|
|
36
|
+
for (let i = 0; i < entryCount; i++) {
|
|
37
|
+
const sampleCount = iterator.getUint32();
|
|
38
|
+
const sampleOffset = iterator.getUint32();
|
|
39
|
+
|
|
40
|
+
entries.push({
|
|
41
|
+
sampleCount,
|
|
42
|
+
sampleOffset,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
type: 'ctts-box',
|
|
48
|
+
boxSize: size,
|
|
49
|
+
offset,
|
|
50
|
+
version,
|
|
51
|
+
flags: [...flags],
|
|
52
|
+
entryCount,
|
|
53
|
+
entries,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import {getHvc1CodecString} from '../../../make-hvc1-codec-strings';
|
|
3
|
+
|
|
4
|
+
export interface HvccBox {
|
|
5
|
+
type: 'hvcc-box';
|
|
6
|
+
data: Uint8Array;
|
|
7
|
+
configurationString: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const parseHvcc = ({
|
|
11
|
+
data,
|
|
12
|
+
size,
|
|
13
|
+
offset,
|
|
14
|
+
}: {
|
|
15
|
+
data: BufferIterator;
|
|
16
|
+
size: number;
|
|
17
|
+
offset: number;
|
|
18
|
+
}): HvccBox => {
|
|
19
|
+
const raw = data.getSlice(size - 8);
|
|
20
|
+
data.counter.decrement(size - 8);
|
|
21
|
+
|
|
22
|
+
const constraintString = getHvc1CodecString(data);
|
|
23
|
+
|
|
24
|
+
const remaining = size - (data.counter.getOffset() - offset);
|
|
25
|
+
data.discard(remaining);
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
type: 'hvcc-box',
|
|
29
|
+
data: raw,
|
|
30
|
+
configurationString: constraintString,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
2
|
import type {AnySegment} from '../../../parse-result';
|
|
3
|
+
import type {ParserContext} from '../../../parser-context';
|
|
3
4
|
import type {BaseBox} from '../base-type';
|
|
4
5
|
import {parseBoxes} from '../process-box';
|
|
5
6
|
|
|
@@ -10,25 +11,29 @@ export interface MebxBox extends BaseBox {
|
|
|
10
11
|
children: AnySegment[];
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
export const parseMebx = ({
|
|
14
|
+
export const parseMebx = async ({
|
|
14
15
|
iterator,
|
|
15
16
|
offset,
|
|
16
17
|
size,
|
|
18
|
+
options,
|
|
17
19
|
}: {
|
|
18
20
|
iterator: BufferIterator;
|
|
19
21
|
offset: number;
|
|
20
22
|
size: number;
|
|
21
|
-
|
|
23
|
+
options: ParserContext;
|
|
24
|
+
}): Promise<MebxBox> => {
|
|
22
25
|
// reserved, 6 bit
|
|
23
26
|
iterator.discard(6);
|
|
24
27
|
|
|
25
28
|
const dataReferenceIndex = iterator.getUint16();
|
|
26
29
|
|
|
27
|
-
const children = parseBoxes({
|
|
30
|
+
const children = await parseBoxes({
|
|
28
31
|
iterator,
|
|
29
32
|
maxBytes: iterator.counter.getOffset() - offset,
|
|
30
33
|
allowIncompleteBoxes: false,
|
|
31
34
|
initialBoxes: [],
|
|
35
|
+
options,
|
|
36
|
+
continueMdat: false,
|
|
32
37
|
});
|
|
33
38
|
|
|
34
39
|
if (children.status === 'incomplete') {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
export interface PaspBox extends BaseBox {
|
|
5
|
+
type: 'pasp-box';
|
|
6
|
+
hSpacing: number;
|
|
7
|
+
vSpacing: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const parsePasp = ({
|
|
11
|
+
iterator,
|
|
12
|
+
offset,
|
|
13
|
+
size,
|
|
14
|
+
}: {
|
|
15
|
+
iterator: BufferIterator;
|
|
16
|
+
offset: number;
|
|
17
|
+
size: number;
|
|
18
|
+
}): PaspBox => {
|
|
19
|
+
const hSpacing = iterator.getUint32();
|
|
20
|
+
const vSpacing = iterator.getUint32();
|
|
21
|
+
|
|
22
|
+
const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset);
|
|
23
|
+
iterator.discard(bytesRemainingInBox);
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
type: 'pasp-box',
|
|
27
|
+
boxSize: size,
|
|
28
|
+
offset,
|
|
29
|
+
hSpacing,
|
|
30
|
+
vSpacing,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
2
|
import type {AnySegment} from '../../../parse-result';
|
|
3
|
+
import type {ParserContext} from '../../../parser-context';
|
|
3
4
|
import {parseBoxes} from '../process-box';
|
|
4
5
|
|
|
5
6
|
type SampleBase = {
|
|
@@ -12,7 +13,7 @@ type SampleBase = {
|
|
|
12
13
|
size: number;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
type AudioSample = SampleBase & {
|
|
16
|
+
export type AudioSample = SampleBase & {
|
|
16
17
|
type: 'audio';
|
|
17
18
|
numberOfChannels: number;
|
|
18
19
|
sampleSize: number;
|
|
@@ -26,7 +27,7 @@ type AudioSample = SampleBase & {
|
|
|
26
27
|
children: AnySegment[];
|
|
27
28
|
};
|
|
28
29
|
|
|
29
|
-
type VideoSample = SampleBase & {
|
|
30
|
+
export type VideoSample = SampleBase & {
|
|
30
31
|
type: 'video';
|
|
31
32
|
temporalQuality: number;
|
|
32
33
|
spacialQuality: number;
|
|
@@ -39,6 +40,7 @@ type VideoSample = SampleBase & {
|
|
|
39
40
|
frameCountPerSample: number;
|
|
40
41
|
depth: number;
|
|
41
42
|
colorTableId: number;
|
|
43
|
+
descriptors: AnySegment[];
|
|
42
44
|
};
|
|
43
45
|
|
|
44
46
|
type UnknownSample = SampleBase & {
|
|
@@ -81,6 +83,7 @@ const videoTags = [
|
|
|
81
83
|
'v210',
|
|
82
84
|
'hvc1',
|
|
83
85
|
'ap4h',
|
|
86
|
+
'av01',
|
|
84
87
|
];
|
|
85
88
|
|
|
86
89
|
// https://developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions
|
|
@@ -111,11 +114,13 @@ const audioTags = [
|
|
|
111
114
|
'ac-3',
|
|
112
115
|
];
|
|
113
116
|
|
|
114
|
-
export const processSample = ({
|
|
117
|
+
export const processSample = async ({
|
|
115
118
|
iterator,
|
|
119
|
+
options,
|
|
116
120
|
}: {
|
|
117
121
|
iterator: BufferIterator;
|
|
118
|
-
|
|
122
|
+
options: ParserContext;
|
|
123
|
+
}): Promise<SampleAndNext> => {
|
|
119
124
|
const fileOffset = iterator.counter.getOffset();
|
|
120
125
|
const bytesRemaining = iterator.bytesRemaining();
|
|
121
126
|
const boxSize = iterator.getUint32();
|
|
@@ -163,15 +168,17 @@ export const processSample = ({
|
|
|
163
168
|
const sampleSize = iterator.getUint16();
|
|
164
169
|
const compressionId = iterator.getUint16();
|
|
165
170
|
const packetSize = iterator.getUint16();
|
|
166
|
-
const sampleRate = iterator.
|
|
171
|
+
const sampleRate = iterator.getFixedPointUnsigned1616Number();
|
|
167
172
|
|
|
168
173
|
const bytesRemainingInBox =
|
|
169
174
|
boxSize - (iterator.counter.getOffset() - fileOffset);
|
|
170
|
-
const children = parseBoxes({
|
|
175
|
+
const children = await parseBoxes({
|
|
171
176
|
iterator,
|
|
172
177
|
allowIncompleteBoxes: false,
|
|
173
178
|
maxBytes: bytesRemainingInBox,
|
|
174
179
|
initialBoxes: [],
|
|
180
|
+
options,
|
|
181
|
+
continueMdat: false,
|
|
175
182
|
});
|
|
176
183
|
|
|
177
184
|
if (children.status === 'incomplete') {
|
|
@@ -207,7 +214,7 @@ export const processSample = ({
|
|
|
207
214
|
const sampleSize = iterator.getUint16();
|
|
208
215
|
const compressionId = iterator.getInt16();
|
|
209
216
|
const packetSize = iterator.getUint16();
|
|
210
|
-
const sampleRate = iterator.
|
|
217
|
+
const sampleRate = iterator.getFixedPointUnsigned1616Number();
|
|
211
218
|
|
|
212
219
|
const samplesPerPacket = iterator.getUint32();
|
|
213
220
|
|
|
@@ -218,11 +225,13 @@ export const processSample = ({
|
|
|
218
225
|
const bytesRemainingInBox =
|
|
219
226
|
boxSize - (iterator.counter.getOffset() - fileOffset);
|
|
220
227
|
|
|
221
|
-
const children = parseBoxes({
|
|
228
|
+
const children = await parseBoxes({
|
|
222
229
|
iterator,
|
|
223
230
|
allowIncompleteBoxes: false,
|
|
224
231
|
maxBytes: bytesRemainingInBox,
|
|
225
232
|
initialBoxes: [],
|
|
233
|
+
options,
|
|
234
|
+
continueMdat: false,
|
|
226
235
|
});
|
|
227
236
|
|
|
228
237
|
if (children.status === 'incomplete') {
|
|
@@ -261,8 +270,8 @@ export const processSample = ({
|
|
|
261
270
|
const spacialQuality = iterator.getUint32();
|
|
262
271
|
const width = iterator.getUint16();
|
|
263
272
|
const height = iterator.getUint16();
|
|
264
|
-
const horizontalResolution = iterator.
|
|
265
|
-
const verticalResolution = iterator.
|
|
273
|
+
const horizontalResolution = iterator.getFixedPointUnsigned1616Number();
|
|
274
|
+
const verticalResolution = iterator.getFixedPointUnsigned1616Number();
|
|
266
275
|
const dataSize = iterator.getUint32();
|
|
267
276
|
const frameCountPerSample = iterator.getUint16();
|
|
268
277
|
const compressorName = iterator.getPascalString();
|
|
@@ -272,7 +281,18 @@ export const processSample = ({
|
|
|
272
281
|
const bytesRemainingInBox =
|
|
273
282
|
boxSize - (iterator.counter.getOffset() - fileOffset);
|
|
274
283
|
|
|
275
|
-
|
|
284
|
+
const children = await parseBoxes({
|
|
285
|
+
iterator,
|
|
286
|
+
allowIncompleteBoxes: false,
|
|
287
|
+
maxBytes: bytesRemainingInBox,
|
|
288
|
+
initialBoxes: [],
|
|
289
|
+
options,
|
|
290
|
+
continueMdat: false,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (children.status === 'incomplete') {
|
|
294
|
+
throw new Error('Incomplete boxes are not allowed');
|
|
295
|
+
}
|
|
276
296
|
|
|
277
297
|
return {
|
|
278
298
|
sample: {
|
|
@@ -295,6 +315,7 @@ export const processSample = ({
|
|
|
295
315
|
compressorName,
|
|
296
316
|
depth,
|
|
297
317
|
colorTableId,
|
|
318
|
+
descriptors: children.segments,
|
|
298
319
|
},
|
|
299
320
|
};
|
|
300
321
|
}
|
|
@@ -302,10 +323,15 @@ export const processSample = ({
|
|
|
302
323
|
throw new Error(`Unknown sample format ${boxFormat}`);
|
|
303
324
|
};
|
|
304
325
|
|
|
305
|
-
export const parseSamples = (
|
|
306
|
-
iterator
|
|
307
|
-
maxBytes
|
|
308
|
-
|
|
326
|
+
export const parseSamples = async ({
|
|
327
|
+
iterator,
|
|
328
|
+
maxBytes,
|
|
329
|
+
options,
|
|
330
|
+
}: {
|
|
331
|
+
iterator: BufferIterator;
|
|
332
|
+
maxBytes: number;
|
|
333
|
+
options: ParserContext;
|
|
334
|
+
}): Promise<Sample[]> => {
|
|
309
335
|
const samples: Sample[] = [];
|
|
310
336
|
const initialOffset = iterator.counter.getOffset();
|
|
311
337
|
|
|
@@ -313,8 +339,9 @@ export const parseSamples = (
|
|
|
313
339
|
iterator.bytesRemaining() > 0 &&
|
|
314
340
|
iterator.counter.getOffset() - initialOffset < maxBytes
|
|
315
341
|
) {
|
|
316
|
-
const {sample} = processSample({
|
|
342
|
+
const {sample} = await processSample({
|
|
317
343
|
iterator,
|
|
344
|
+
options,
|
|
318
345
|
});
|
|
319
346
|
|
|
320
347
|
if (sample) {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
export interface StcoBox extends BaseBox {
|
|
5
|
+
type: 'stco-box';
|
|
6
|
+
version: number;
|
|
7
|
+
flags: number[];
|
|
8
|
+
entryCount: number;
|
|
9
|
+
entries: number[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const parseStco = ({
|
|
13
|
+
iterator,
|
|
14
|
+
offset,
|
|
15
|
+
size,
|
|
16
|
+
}: {
|
|
17
|
+
iterator: BufferIterator;
|
|
18
|
+
offset: number;
|
|
19
|
+
size: number;
|
|
20
|
+
}): StcoBox => {
|
|
21
|
+
const version = iterator.getUint8();
|
|
22
|
+
if (version !== 0) {
|
|
23
|
+
throw new Error(`Unsupported STSD version ${version}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const flags = iterator.getSlice(3);
|
|
27
|
+
const entryCount = iterator.getUint32();
|
|
28
|
+
|
|
29
|
+
const entries: number[] = [];
|
|
30
|
+
for (let i = 0; i < entryCount; i++) {
|
|
31
|
+
const bytesRemaining = size - (iterator.counter.getOffset() - offset);
|
|
32
|
+
if (bytesRemaining < 4) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
entries.push(iterator.getUint32());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
iterator.discard(size - (iterator.counter.getOffset() - offset));
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
type: 'stco-box',
|
|
43
|
+
boxSize: size,
|
|
44
|
+
offset,
|
|
45
|
+
version,
|
|
46
|
+
flags: [...flags],
|
|
47
|
+
entries,
|
|
48
|
+
entryCount,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
type StscEntry = {
|
|
5
|
+
firstChunk: number;
|
|
6
|
+
samplesPerChunk: number;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export interface StscBox extends BaseBox {
|
|
10
|
+
type: 'stsc-box';
|
|
11
|
+
version: number;
|
|
12
|
+
flags: number[];
|
|
13
|
+
entryCount: number;
|
|
14
|
+
entries: StscEntry[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const parseStsc = ({
|
|
18
|
+
iterator,
|
|
19
|
+
offset,
|
|
20
|
+
size,
|
|
21
|
+
}: {
|
|
22
|
+
iterator: BufferIterator;
|
|
23
|
+
offset: number;
|
|
24
|
+
size: number;
|
|
25
|
+
}): StscBox => {
|
|
26
|
+
const version = iterator.getUint8();
|
|
27
|
+
if (version !== 0) {
|
|
28
|
+
throw new Error(`Unsupported STSD version ${version}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const flags = iterator.getSlice(3);
|
|
32
|
+
const entryCount = iterator.getUint32();
|
|
33
|
+
|
|
34
|
+
const entries: StscEntry[] = [];
|
|
35
|
+
|
|
36
|
+
for (let i = 0; i < entryCount; i++) {
|
|
37
|
+
const firstChunk = iterator.getUint32();
|
|
38
|
+
const samplesPerChunk = iterator.getUint32();
|
|
39
|
+
const sampleDescriptionIndex = iterator.getUint32();
|
|
40
|
+
if (sampleDescriptionIndex !== 1) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`Expected sampleDescriptionIndex to be 1, but got ${sampleDescriptionIndex}`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
entries.push({
|
|
47
|
+
firstChunk,
|
|
48
|
+
samplesPerChunk,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
type: 'stsc-box',
|
|
54
|
+
boxSize: size,
|
|
55
|
+
offset,
|
|
56
|
+
version,
|
|
57
|
+
flags: [...flags],
|
|
58
|
+
entryCount,
|
|
59
|
+
entries,
|
|
60
|
+
};
|
|
61
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {ParserContext} from '../../../parser-context';
|
|
2
3
|
import type {BaseBox} from '../base-type';
|
|
3
4
|
import type {Sample} from './samples';
|
|
4
5
|
import {parseSamples} from './samples';
|
|
@@ -9,15 +10,17 @@ export interface StsdBox extends BaseBox {
|
|
|
9
10
|
samples: Sample[];
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
export const parseStsd = ({
|
|
13
|
+
export const parseStsd = async ({
|
|
13
14
|
iterator,
|
|
14
15
|
offset,
|
|
15
16
|
size,
|
|
17
|
+
options,
|
|
16
18
|
}: {
|
|
17
19
|
iterator: BufferIterator;
|
|
18
20
|
offset: number;
|
|
19
21
|
size: number;
|
|
20
|
-
|
|
22
|
+
options: ParserContext;
|
|
23
|
+
}): Promise<StsdBox> => {
|
|
21
24
|
const version = iterator.getUint8();
|
|
22
25
|
if (version !== 0) {
|
|
23
26
|
throw new Error(`Unsupported STSD version ${version}`);
|
|
@@ -30,7 +33,11 @@ export const parseStsd = ({
|
|
|
30
33
|
|
|
31
34
|
const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset);
|
|
32
35
|
|
|
33
|
-
const boxes = parseSamples(
|
|
36
|
+
const boxes = await parseSamples({
|
|
37
|
+
iterator,
|
|
38
|
+
maxBytes: bytesRemainingInBox,
|
|
39
|
+
options,
|
|
40
|
+
});
|
|
34
41
|
|
|
35
42
|
if (boxes.length !== numberOfEntries) {
|
|
36
43
|
throw new Error(
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
export interface StssBox extends BaseBox {
|
|
5
|
+
type: 'stss-box';
|
|
6
|
+
version: number;
|
|
7
|
+
flags: number[];
|
|
8
|
+
sampleNumber: number[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const parseStss = ({
|
|
12
|
+
iterator,
|
|
13
|
+
offset,
|
|
14
|
+
boxSize,
|
|
15
|
+
}: {
|
|
16
|
+
iterator: BufferIterator;
|
|
17
|
+
offset: number;
|
|
18
|
+
boxSize: number;
|
|
19
|
+
}): StssBox => {
|
|
20
|
+
const version = iterator.getUint8();
|
|
21
|
+
if (version !== 0) {
|
|
22
|
+
throw new Error(`Unsupported STSS version ${version}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const flags = iterator.getSlice(3);
|
|
26
|
+
const sampleCount = iterator.getUint32();
|
|
27
|
+
|
|
28
|
+
const sampleNumber: number[] = [];
|
|
29
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
30
|
+
sampleNumber.push(iterator.getUint32());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - offset);
|
|
34
|
+
|
|
35
|
+
if (bytesRemainingInBox > 0) {
|
|
36
|
+
throw new Error(`Unexpected bytes remaining in box stss`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
type: 'stss-box',
|
|
41
|
+
version,
|
|
42
|
+
flags: [...flags],
|
|
43
|
+
sampleNumber,
|
|
44
|
+
boxSize,
|
|
45
|
+
offset,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type {BufferIterator} from '../../../buffer-iterator';
|
|
2
|
+
import type {BaseBox} from '../base-type';
|
|
3
|
+
|
|
4
|
+
type Discriminated =
|
|
5
|
+
| {
|
|
6
|
+
countType: 'fixed';
|
|
7
|
+
sampleSize: number;
|
|
8
|
+
}
|
|
9
|
+
| {
|
|
10
|
+
countType: 'variable';
|
|
11
|
+
entries: number[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type StszBox = BaseBox & {
|
|
15
|
+
type: 'stsz-box';
|
|
16
|
+
version: number;
|
|
17
|
+
flags: number[];
|
|
18
|
+
sampleCount: number;
|
|
19
|
+
} & Discriminated;
|
|
20
|
+
|
|
21
|
+
export const parseStsz = ({
|
|
22
|
+
iterator,
|
|
23
|
+
offset,
|
|
24
|
+
size,
|
|
25
|
+
}: {
|
|
26
|
+
iterator: BufferIterator;
|
|
27
|
+
offset: number;
|
|
28
|
+
size: number;
|
|
29
|
+
}): StszBox => {
|
|
30
|
+
const version = iterator.getUint8();
|
|
31
|
+
if (version !== 0) {
|
|
32
|
+
throw new Error(`Unsupported STSD version ${version}`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const flags = iterator.getSlice(3);
|
|
36
|
+
|
|
37
|
+
const sampleSize = iterator.getUint32();
|
|
38
|
+
const sampleCount = iterator.getUint32();
|
|
39
|
+
|
|
40
|
+
if (sampleSize !== 0) {
|
|
41
|
+
return {
|
|
42
|
+
type: 'stsz-box',
|
|
43
|
+
boxSize: size,
|
|
44
|
+
offset,
|
|
45
|
+
version,
|
|
46
|
+
flags: [...flags],
|
|
47
|
+
sampleCount,
|
|
48
|
+
countType: 'fixed',
|
|
49
|
+
sampleSize,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const samples: number[] = [];
|
|
54
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
55
|
+
const bytesRemaining = size - (iterator.counter.getOffset() - offset);
|
|
56
|
+
if (bytesRemaining < 4) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
samples.push(iterator.getUint32());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
iterator.discard(size - (iterator.counter.getOffset() - offset));
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
type: 'stsz-box',
|
|
67
|
+
boxSize: size,
|
|
68
|
+
offset,
|
|
69
|
+
version,
|
|
70
|
+
flags: [...flags],
|
|
71
|
+
sampleCount,
|
|
72
|
+
countType: 'variable',
|
|
73
|
+
entries: samples,
|
|
74
|
+
};
|
|
75
|
+
};
|