@remotion/media-parser 4.0.249 → 4.0.250

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.
Files changed (121) hide show
  1. package/dist/boxes/iso-base-media/continue-mdat-routine.d.ts +14 -0
  2. package/dist/boxes/iso-base-media/continue-mdat-routine.js +74 -0
  3. package/dist/boxes/iso-base-media/get-children.d.ts +2 -8
  4. package/dist/boxes/iso-base-media/get-children.js +14 -30
  5. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +3 -23
  6. package/dist/boxes/iso-base-media/mdat/mdat.js +80 -130
  7. package/dist/boxes/iso-base-media/moov/moov.d.ts +1 -6
  8. package/dist/boxes/iso-base-media/moov/moov.js +5 -14
  9. package/dist/boxes/iso-base-media/parse-all-children.d.ts +8 -0
  10. package/dist/boxes/iso-base-media/parse-all-children.js +20 -0
  11. package/dist/boxes/iso-base-media/parse-boxes.d.ts +2 -10
  12. package/dist/boxes/iso-base-media/parse-boxes.js +33 -116
  13. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +1 -4
  14. package/dist/boxes/iso-base-media/parse-mdat-partially.js +2 -11
  15. package/dist/boxes/iso-base-media/process-box.d.ts +1 -9
  16. package/dist/boxes/iso-base-media/process-box.js +49 -143
  17. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +1 -4
  18. package/dist/boxes/iso-base-media/stsd/mebx.js +5 -14
  19. package/dist/boxes/iso-base-media/stsd/samples.d.ts +4 -12
  20. package/dist/boxes/iso-base-media/stsd/samples.js +24 -66
  21. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +1 -4
  22. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -5
  23. package/dist/boxes/iso-base-media/trak/trak.d.ts +1 -6
  24. package/dist/boxes/iso-base-media/trak/trak.js +5 -14
  25. package/dist/boxes/iso-base-media/traversal.d.ts +0 -2
  26. package/dist/boxes/iso-base-media/traversal.js +1 -12
  27. package/dist/boxes/mp3/id3.d.ts +1 -3
  28. package/dist/boxes/mp3/id3.js +7 -5
  29. package/dist/boxes/mp3/parse-mp3.d.ts +2 -3
  30. package/dist/boxes/mp3/parse-mp3.js +3 -19
  31. package/dist/boxes/riff/expect-riff-box.d.ts +1 -9
  32. package/dist/boxes/riff/expect-riff-box.js +47 -25
  33. package/dist/boxes/riff/get-tracks-from-avi.d.ts +1 -1
  34. package/dist/boxes/riff/get-tracks-from-avi.js +6 -10
  35. package/dist/boxes/riff/parse-fmt-box.d.ts +3 -2
  36. package/dist/boxes/riff/parse-fmt-box.js +7 -5
  37. package/dist/boxes/riff/parse-list-box.d.ts +1 -3
  38. package/dist/boxes/riff/parse-list-box.js +16 -16
  39. package/dist/boxes/riff/parse-movi.d.ts +2 -5
  40. package/dist/boxes/riff/parse-movi.js +34 -56
  41. package/dist/boxes/riff/parse-riff-body.d.ts +2 -6
  42. package/dist/boxes/riff/parse-riff-body.js +15 -95
  43. package/dist/boxes/riff/parse-riff-box.d.ts +1 -4
  44. package/dist/boxes/riff/parse-riff-box.js +3 -7
  45. package/dist/boxes/riff/parse-riff-header.d.ts +7 -0
  46. package/dist/boxes/riff/parse-riff-header.js +23 -0
  47. package/dist/boxes/riff/parse-riff.d.ts +7 -0
  48. package/dist/boxes/riff/parse-riff.js +15 -0
  49. package/dist/boxes/riff/parse-strf.d.ts +4 -4
  50. package/dist/boxes/riff/parse-strf.js +4 -8
  51. package/dist/boxes/riff/parse-strh.js +11 -0
  52. package/dist/boxes/riff/parse-video-section.d.ts +6 -0
  53. package/dist/boxes/riff/parse-video-section.js +20 -0
  54. package/dist/boxes/riff/riff-box.d.ts +4 -5
  55. package/dist/boxes/riff/traversal.d.ts +1 -2
  56. package/dist/boxes/riff/traversal.js +1 -6
  57. package/dist/boxes/transport-stream/get-tracks.d.ts +2 -3
  58. package/dist/boxes/transport-stream/get-tracks.js +4 -3
  59. package/dist/boxes/transport-stream/parse-packet.d.ts +1 -7
  60. package/dist/boxes/transport-stream/parse-packet.js +3 -4
  61. package/dist/boxes/transport-stream/parse-stream-packet.d.ts +1 -5
  62. package/dist/boxes/transport-stream/parse-stream-packet.js +10 -12
  63. package/dist/boxes/transport-stream/parse-transport-stream.d.ts +1 -7
  64. package/dist/boxes/transport-stream/parse-transport-stream.js +7 -26
  65. package/dist/boxes/transport-stream/process-stream-buffers.d.ts +1 -2
  66. package/dist/boxes/transport-stream/process-stream-buffers.js +3 -3
  67. package/dist/boxes/webm/parse-ebml.js +3 -0
  68. package/dist/boxes/webm/parse-webm-header.d.ts +2 -4
  69. package/dist/boxes/webm/parse-webm-header.js +41 -25
  70. package/dist/boxes/webm/segments/parse-children.d.ts +2 -16
  71. package/dist/boxes/webm/segments/parse-children.js +7 -130
  72. package/dist/boxes/webm/segments.d.ts +4 -8
  73. package/dist/boxes/webm/segments.js +41 -123
  74. package/dist/buffer-iterator.d.ts +0 -3
  75. package/dist/buffer-iterator.js +6 -16
  76. package/dist/bun-reader.d.ts +1 -0
  77. package/dist/bun-reader.js +17 -0
  78. package/dist/emit-available-info.js +4 -4
  79. package/dist/esm/from-node.mjs +8 -9
  80. package/dist/esm/index.mjs +4224 -4950
  81. package/dist/file-types/detect-file-type.js +4 -2
  82. package/dist/get-audio-codec.d.ts +1 -1
  83. package/dist/get-audio-codec.js +2 -2
  84. package/dist/get-dimensions.js +1 -1
  85. package/dist/get-duration.js +1 -1
  86. package/dist/get-is-hdr.d.ts +1 -1
  87. package/dist/get-is-hdr.js +2 -2
  88. package/dist/get-tracks.d.ts +1 -1
  89. package/dist/get-tracks.js +14 -13
  90. package/dist/get-video-codec.d.ts +1 -1
  91. package/dist/get-video-codec.js +2 -2
  92. package/dist/index.d.ts +50 -24
  93. package/dist/index.js +1 -1
  94. package/dist/may-skip-video-data/may-skip-video-data.js +6 -2
  95. package/dist/parse-media.js +45 -30
  96. package/dist/parse-result.d.ts +1 -18
  97. package/dist/parse-video.d.ts +3 -17
  98. package/dist/parse-video.js +45 -32
  99. package/dist/readers/from-node.js +7 -8
  100. package/dist/state/can-skip-tracks.d.ts +8 -1
  101. package/dist/state/can-skip-tracks.js +38 -27
  102. package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -0
  103. package/dist/state/iso-base-media/cached-sample-positions.js +42 -0
  104. package/dist/state/iso-base-media/iso-state.d.ts +8 -0
  105. package/dist/state/iso-base-media/iso-state.js +15 -0
  106. package/dist/state/iso-state.d.ts +4 -0
  107. package/dist/state/iso-state.js +13 -0
  108. package/dist/state/parser-state.d.ts +49 -14
  109. package/dist/state/parser-state.js +11 -3
  110. package/dist/state/sample-callbacks.d.ts +5 -1
  111. package/dist/state/sample-callbacks.js +4 -1
  112. package/dist/state/transport-stream.d.ts +8 -0
  113. package/dist/state/transport-stream.js +11 -0
  114. package/dist/state/video-section.d.ts +16 -0
  115. package/dist/state/video-section.js +37 -0
  116. package/dist/state/webm.d.ts +15 -0
  117. package/dist/state/webm.js +32 -0
  118. package/dist/version.d.ts +1 -1
  119. package/dist/version.js +1 -1
  120. package/package.json +3 -3
  121. package/test.json +663 -0
@@ -2,11 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.nodeReader = void 0;
4
4
  const fs_1 = require("fs");
5
- const promises_1 = require("node:fs/promises");
6
5
  const path_1 = require("path");
7
6
  const stream_1 = require("stream");
8
7
  exports.nodeReader = {
9
- read: async (src, range, signal) => {
8
+ read: (src, range, signal) => {
10
9
  if (typeof src !== 'string') {
11
10
  throw new Error('src must be a string when using `nodeReader`');
12
11
  }
@@ -23,14 +22,14 @@ exports.nodeReader = {
23
22
  signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', () => {
24
23
  controller.abort();
25
24
  }, { once: true });
26
- const stats = await (0, promises_1.stat)(src);
25
+ const stats = (0, fs_1.statSync)(src);
27
26
  const reader = stream_1.Readable.toWeb(stream).getReader();
28
27
  if (signal) {
29
28
  signal.addEventListener('abort', () => {
30
29
  reader.cancel().catch(() => { });
31
30
  }, { once: true });
32
31
  }
33
- return {
32
+ return Promise.resolve({
34
33
  reader: {
35
34
  reader,
36
35
  abort: () => {
@@ -41,13 +40,13 @@ exports.nodeReader = {
41
40
  contentType: null,
42
41
  name: src.split(path_1.sep).pop(),
43
42
  supportsContentRange: true,
44
- };
43
+ });
45
44
  },
46
- getLength: async (src) => {
45
+ getLength: (src) => {
47
46
  if (typeof src !== 'string') {
48
47
  throw new Error('src must be a string when using `nodeReader`');
49
48
  }
50
- const stats = await (0, promises_1.stat)(src);
51
- return stats.size;
49
+ const stats = (0, fs_1.statSync)(src);
50
+ return Promise.resolve(stats.size);
52
51
  },
53
52
  };
@@ -1,8 +1,15 @@
1
1
  import type { Options, ParseMediaFields } from '../options';
2
- export declare const makeCanSkipTracksState: ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, }: {
2
+ import type { Structure } from '../parse-result';
3
+ import type { StructureState } from './structure';
4
+ export declare const needsTracksForField: ({ field, structure, }: {
5
+ field: keyof Options<ParseMediaFields>;
6
+ structure: Structure;
7
+ }) => boolean;
8
+ export declare const makeCanSkipTracksState: ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, structure, }: {
3
9
  hasAudioTrackHandlers: boolean;
4
10
  hasVideoTrackHandlers: boolean;
5
11
  fields: Options<ParseMediaFields>;
12
+ structure: StructureState;
6
13
  }) => {
7
14
  canSkipTracks: () => boolean;
8
15
  };
@@ -1,32 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeCanSkipTracksState = void 0;
4
- const needsTracksField = {
5
- audioCodec: true,
6
- container: false,
7
- dimensions: true,
8
- durationInSeconds: true,
9
- slowDurationInSeconds: true,
10
- slowFps: true,
11
- fps: true,
12
- internalStats: false,
13
- isHdr: true,
14
- name: false,
15
- rotation: true,
16
- size: false,
17
- structure: true,
18
- tracks: true,
19
- unrotatedDimensions: true,
20
- videoCodec: true,
21
- metadata: true,
22
- location: true,
23
- mimeType: false,
24
- slowKeyframes: true,
25
- slowNumberOfFrames: true,
26
- keyframes: true,
27
- images: true,
3
+ exports.makeCanSkipTracksState = exports.needsTracksForField = void 0;
4
+ const needsTracksForField = ({ field, structure, }) => {
5
+ if (field === 'dimensions') {
6
+ if (structure.type === 'riff') {
7
+ return false;
8
+ }
9
+ return true;
10
+ }
11
+ if (field === 'audioCodec' ||
12
+ field === 'durationInSeconds' ||
13
+ field === 'slowDurationInSeconds' ||
14
+ field === 'slowFps' ||
15
+ field === 'fps' ||
16
+ field === 'isHdr' ||
17
+ field === 'rotation' ||
18
+ field === 'structure' ||
19
+ field === 'tracks' ||
20
+ field === 'unrotatedDimensions' ||
21
+ field === 'videoCodec' ||
22
+ field === 'metadata' ||
23
+ field === 'location' ||
24
+ field === 'slowKeyframes' ||
25
+ field === 'slowNumberOfFrames' ||
26
+ field === 'keyframes' ||
27
+ field === 'images') {
28
+ return true;
29
+ }
30
+ if (field === 'container' ||
31
+ field === 'internalStats' ||
32
+ field === 'mimeType' ||
33
+ field === 'name' ||
34
+ field === 'size') {
35
+ return false;
36
+ }
37
+ throw new Error(`field not implemeted ${field}`);
28
38
  };
29
- const makeCanSkipTracksState = ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, }) => {
39
+ exports.needsTracksForField = needsTracksForField;
40
+ const makeCanSkipTracksState = ({ hasAudioTrackHandlers, fields, hasVideoTrackHandlers, structure, }) => {
30
41
  return {
31
42
  canSkipTracks: () => {
32
43
  if (hasAudioTrackHandlers || hasVideoTrackHandlers) {
@@ -34,7 +45,7 @@ const makeCanSkipTracksState = ({ hasAudioTrackHandlers, fields, hasVideoTrackHa
34
45
  }
35
46
  const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
36
47
  const selectedKeys = keys.filter((k) => fields[k]);
37
- return !selectedKeys.some((k) => needsTracksField[k]);
48
+ return !selectedKeys.some((k) => (0, exports.needsTracksForField)({ field: k, structure: structure.getStructure() }));
38
49
  },
39
50
  };
40
51
  };
@@ -0,0 +1,15 @@
1
+ import type { SamplePosition } from '../../get-sample-positions';
2
+ import type { AudioTrack, OtherTrack, VideoTrack } from '../../get-tracks';
3
+ import type { ParserState } from '../parser-state';
4
+ export type FlatSample = {
5
+ track: VideoTrack | AudioTrack | OtherTrack;
6
+ samplePosition: SamplePosition;
7
+ };
8
+ export declare const calculateFlatSamples: (state: ParserState) => {
9
+ track: VideoTrack | AudioTrack | OtherTrack;
10
+ samplePosition: SamplePosition;
11
+ }[];
12
+ export declare const cachedSamplePositionsState: () => {
13
+ getSamples: () => FlatSample[] | null;
14
+ setSamples: (samples: FlatSample[]) => void;
15
+ };
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cachedSamplePositionsState = exports.calculateFlatSamples = void 0;
4
+ const get_sample_positions_from_track_1 = require("../../boxes/iso-base-media/get-sample-positions-from-track");
5
+ const traversal_1 = require("../../boxes/iso-base-media/traversal");
6
+ const get_tracks_1 = require("../../get-tracks");
7
+ const calculateFlatSamples = (state) => {
8
+ const tracks = (0, get_tracks_1.getTracks)(state);
9
+ const allTracks = [
10
+ ...tracks.videoTracks,
11
+ ...tracks.audioTracks,
12
+ ...tracks.otherTracks,
13
+ ];
14
+ const flatSamples = allTracks
15
+ .map((track) => {
16
+ const samplePositions = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)(track.trakBox, (0, traversal_1.getMoofBox)(state.structure.getStructure().boxes));
17
+ if (!samplePositions) {
18
+ throw new Error('No sample positions');
19
+ }
20
+ return samplePositions.map((samplePosition) => {
21
+ return {
22
+ track,
23
+ samplePosition,
24
+ };
25
+ });
26
+ })
27
+ .flat(1);
28
+ return flatSamples;
29
+ };
30
+ exports.calculateFlatSamples = calculateFlatSamples;
31
+ const cachedSamplePositionsState = () => {
32
+ let cached = null;
33
+ return {
34
+ getSamples: () => {
35
+ return cached;
36
+ },
37
+ setSamples: (samples) => {
38
+ cached = samples;
39
+ },
40
+ };
41
+ };
42
+ exports.cachedSamplePositionsState = cachedSamplePositionsState;
@@ -0,0 +1,8 @@
1
+ export declare const isoBaseMediaState: () => {
2
+ getShouldReturnToVideoSectionAfterEnd: () => boolean;
3
+ setShouldReturnToVideoSectionAfterEnd: (value: boolean) => void;
4
+ flatSamples: {
5
+ getSamples: () => import("./cached-sample-positions").FlatSample[] | null;
6
+ setSamples: (samples: import("./cached-sample-positions").FlatSample[]) => void;
7
+ };
8
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isoBaseMediaState = void 0;
4
+ const cached_sample_positions_1 = require("./cached-sample-positions");
5
+ const isoBaseMediaState = () => {
6
+ let shouldReturnToVideoSectionAfterEnd = false;
7
+ return {
8
+ getShouldReturnToVideoSectionAfterEnd: () => shouldReturnToVideoSectionAfterEnd,
9
+ setShouldReturnToVideoSectionAfterEnd: (value) => {
10
+ shouldReturnToVideoSectionAfterEnd = value;
11
+ },
12
+ flatSamples: (0, cached_sample_positions_1.cachedSamplePositionsState)(),
13
+ };
14
+ };
15
+ exports.isoBaseMediaState = isoBaseMediaState;
@@ -0,0 +1,4 @@
1
+ export declare const isoBaseMediaState: () => {
2
+ getShouldReturnToVideoSectionAfterEnd: () => boolean;
3
+ setShouldReturnToVideoSectionAfterEnd: (value: boolean) => void;
4
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isoBaseMediaState = void 0;
4
+ const isoBaseMediaState = () => {
5
+ let shouldReturnToVideoSectionAfterEnd = false;
6
+ return {
7
+ getShouldReturnToVideoSectionAfterEnd: () => shouldReturnToVideoSectionAfterEnd,
8
+ setShouldReturnToVideoSectionAfterEnd: (value) => {
9
+ shouldReturnToVideoSectionAfterEnd = value;
10
+ },
11
+ };
12
+ };
13
+ exports.isoBaseMediaState = isoBaseMediaState;
@@ -1,5 +1,6 @@
1
1
  import type { AvcPPs, AvcProfileInfo } from '../boxes/avc/parse-avc';
2
2
  import type { BufferIterator } from '../buffer-iterator';
3
+ import type { LogLevel } from '../log';
3
4
  import type { Options, ParseMediaFields } from '../options';
4
5
  import type { OnAudioTrack, OnVideoTrack } from '../webcodec-sample-types';
5
6
  export type InternalStats = {
@@ -10,7 +11,7 @@ export type SpsAndPps = {
10
11
  sps: AvcProfileInfo;
11
12
  pps: AvcPPs;
12
13
  };
13
- export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, }: {
14
+ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, logLevel, }: {
14
15
  hasAudioTrackHandlers: boolean;
15
16
  hasVideoTrackHandlers: boolean;
16
17
  signal: AbortSignal | undefined;
@@ -20,6 +21,7 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
20
21
  onAudioTrack: OnAudioTrack | null;
21
22
  onVideoTrack: OnVideoTrack | null;
22
23
  contentLength: number | null;
24
+ logLevel: LogLevel;
23
25
  }) => {
24
26
  riff: {
25
27
  getAvcProfile: () => SpsAndPps | null;
@@ -28,6 +30,38 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
28
30
  getNextTrackIndex: () => number;
29
31
  incrementNextTrackIndex: () => void;
30
32
  };
33
+ transportStream: {
34
+ nextPesHeaderStore: {
35
+ setNextPesHeader: (pesHeader: import("../boxes/transport-stream/parse-pes").PacketPes) => void;
36
+ getNextPesHeader: () => import("../boxes/transport-stream/parse-pes").PacketPes;
37
+ };
38
+ streamBuffers: Map<number, import("../boxes/transport-stream/process-stream-buffers").TransportStreamPacketBuffer>;
39
+ };
40
+ webm: {
41
+ onTrackEntrySegment: import("../boxes/webm/segments").OnTrackEntrySegment;
42
+ getTrackInfoByNumber: (id: number) => import("../boxes/webm/segments/track-entry").TrackInfo;
43
+ setTimestampOffset: (byteOffset: number, timestamp: number) => void;
44
+ getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
45
+ timescale: null;
46
+ getTimescale: () => number;
47
+ setTimescale: (newTimescale: number) => void;
48
+ addSegment: (seg: Omit<import("./webm").SegmentSection, "index">) => void;
49
+ addCluster: (cluster: import("./webm").ClusterSection) => void;
50
+ isInsideSegment: (iterator: BufferIterator) => import("./webm").SegmentSection | null;
51
+ isInsideCluster: (iterator: BufferIterator) => import("./webm").ClusterSection | null;
52
+ };
53
+ iso: {
54
+ getShouldReturnToVideoSectionAfterEnd: () => boolean;
55
+ setShouldReturnToVideoSectionAfterEnd: (value: boolean) => void;
56
+ flatSamples: {
57
+ getSamples: () => import("./iso-base-media/cached-sample-positions").FlatSample[] | null;
58
+ setSamples: (samples: import("./iso-base-media/cached-sample-positions").FlatSample[]) => void;
59
+ };
60
+ };
61
+ mp3Info: {
62
+ getMp3Info: () => import("./mp3").Mp3Info | null;
63
+ setMp3Info: (info: import("./mp3").Mp3Info) => void;
64
+ };
31
65
  callbacks: {
32
66
  registerVideoSampleCallback: (id: number, callback: import("../webcodec-sample-types").OnVideoSample | null) => Promise<void>;
33
67
  onAudioSample: (trackId: number, audioSample: import("../webcodec-sample-types").AudioOrVideoSample) => Promise<void>;
@@ -46,6 +80,8 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
46
80
  };
47
81
  audioSampleCallbacks: Record<number, import("../webcodec-sample-types").OnAudioSample>;
48
82
  videoSampleCallbacks: Record<number, import("../webcodec-sample-types").OnVideoSample>;
83
+ hasAudioTrackHandlers: boolean;
84
+ hasVideoTrackHandlers: boolean;
49
85
  };
50
86
  getInternalStats: () => InternalStats;
51
87
  getSkipBytes: () => number;
@@ -62,15 +98,6 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
62
98
  onAudioTrack: OnAudioTrack | null;
63
99
  onVideoTrack: OnVideoTrack | null;
64
100
  supportsContentRange: boolean;
65
- webm: {
66
- onTrackEntrySegment: import("../boxes/webm/segments").OnTrackEntrySegment;
67
- getTrackInfoByNumber: (id: number) => import("../boxes/webm/segments/track-entry").TrackInfo;
68
- setTimestampOffset: (byteOffset: number, timestamp: number) => void;
69
- getTimestampOffsetForByteOffset: (byteOffset: number) => number | undefined;
70
- timescale: null;
71
- getTimescale: () => number;
72
- setTimescale: (newTimescale: number) => void;
73
- };
74
101
  emittedFields: import("../options").AllOptions<ParseMediaFields>;
75
102
  fields: Partial<import("../options").AllOptions<ParseMediaFields>>;
76
103
  slowDurationAndFps: {
@@ -80,14 +107,22 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
80
107
  getFps: () => number;
81
108
  getSlowNumberOfFrames: () => number;
82
109
  };
83
- mp3Info: {
84
- getMp3Info: () => import("./mp3").Mp3Info | null;
85
- setMp3Info: (info: import("./mp3").Mp3Info) => void;
86
- };
87
110
  contentLength: number | null;
88
111
  images: {
89
112
  images: import("./images").MediaParserEmbeddedImage[];
90
113
  addImage: (image: import("./images").MediaParserEmbeddedImage) => void;
91
114
  };
115
+ videoSection: {
116
+ setVideoSection: (section: {
117
+ start: number;
118
+ size: number;
119
+ }) => void;
120
+ getVideoSection: () => {
121
+ start: number;
122
+ size: number;
123
+ };
124
+ isInVideoSectionState: (iterator: BufferIterator) => "no-section-defined" | "in-section" | "outside-section";
125
+ };
126
+ logLevel: "trace" | "verbose" | "info" | "warn" | "error";
92
127
  };
93
128
  export type ParserState = ReturnType<typeof makeParserState>;
@@ -3,14 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeParserState = void 0;
4
4
  const emitted_fields_1 = require("./emitted-fields");
5
5
  const images_1 = require("./images");
6
+ const iso_state_1 = require("./iso-base-media/iso-state");
6
7
  const keyframes_1 = require("./keyframes");
7
8
  const mp3_1 = require("./mp3");
8
9
  const riff_1 = require("./riff");
9
10
  const sample_callbacks_1 = require("./sample-callbacks");
10
11
  const slow_duration_fps_1 = require("./slow-duration-fps");
11
12
  const structure_1 = require("./structure");
13
+ const transport_stream_1 = require("./transport-stream");
14
+ const video_section_1 = require("./video-section");
12
15
  const webm_1 = require("./webm");
13
- const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, }) => {
16
+ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal, getIterator, fields, onAudioTrack, onVideoTrack, supportsContentRange, contentLength, logLevel, }) => {
14
17
  let skippedBytes = 0;
15
18
  const increaseSkippedBytes = (bytes) => {
16
19
  skippedBytes += bytes;
@@ -23,6 +26,10 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
23
26
  const images = (0, images_1.imagesState)();
24
27
  return {
25
28
  riff: (0, riff_1.riffSpecificState)(),
29
+ transportStream: (0, transport_stream_1.transportStreamState)(),
30
+ webm: (0, webm_1.webmState)(),
31
+ iso: (0, iso_state_1.isoBaseMediaState)(),
32
+ mp3Info,
26
33
  callbacks: (0, sample_callbacks_1.sampleCallback)({
27
34
  signal,
28
35
  hasAudioTrackHandlers,
@@ -31,6 +38,7 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
31
38
  keyframes,
32
39
  emittedFields,
33
40
  slowDurationAndFpsState: slowDurationAndFps,
41
+ structure,
34
42
  }),
35
43
  getInternalStats: () => {
36
44
  var _a, _b;
@@ -46,13 +54,13 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, signal,
46
54
  onAudioTrack,
47
55
  onVideoTrack,
48
56
  supportsContentRange,
49
- webm: (0, webm_1.webmState)(),
50
57
  emittedFields,
51
58
  fields,
52
59
  slowDurationAndFps,
53
- mp3Info,
54
60
  contentLength,
55
61
  images,
62
+ videoSection: (0, video_section_1.videoSectionState)(),
63
+ logLevel,
56
64
  };
57
65
  };
58
66
  exports.makeParserState = makeParserState;
@@ -2,7 +2,8 @@ import type { AllOptions, Options, ParseMediaFields } from '../options';
2
2
  import type { AudioOrVideoSample, OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
3
3
  import { type KeyframesState } from './keyframes';
4
4
  import type { SlowDurationAndFpsState } from './slow-duration-fps';
5
- export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }: {
5
+ import type { StructureState } from './structure';
6
+ export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }: {
6
7
  signal: AbortSignal | undefined;
7
8
  hasAudioTrackHandlers: boolean;
8
9
  hasVideoTrackHandlers: boolean;
@@ -10,6 +11,7 @@ export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoT
10
11
  keyframes: KeyframesState;
11
12
  emittedFields: AllOptions<ParseMediaFields>;
12
13
  slowDurationAndFpsState: SlowDurationAndFpsState;
14
+ structure: StructureState;
13
15
  }) => {
14
16
  registerVideoSampleCallback: (id: number, callback: OnVideoSample | null) => Promise<void>;
15
17
  onAudioSample: (trackId: number, audioSample: AudioOrVideoSample) => Promise<void>;
@@ -28,4 +30,6 @@ export declare const sampleCallback: ({ signal, hasAudioTrackHandlers, hasVideoT
28
30
  };
29
31
  audioSampleCallbacks: Record<number, OnAudioSample>;
30
32
  videoSampleCallbacks: Record<number, OnVideoSample>;
33
+ hasAudioTrackHandlers: boolean;
34
+ hasVideoTrackHandlers: boolean;
31
35
  };
@@ -4,7 +4,7 @@ exports.sampleCallback = void 0;
4
4
  const need_samples_for_fields_1 = require("../may-skip-video-data/need-samples-for-fields");
5
5
  const can_skip_tracks_1 = require("./can-skip-tracks");
6
6
  const has_tracks_section_1 = require("./has-tracks-section");
7
- const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, }) => {
7
+ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers, fields, keyframes, emittedFields, slowDurationAndFpsState, structure, }) => {
8
8
  const videoSampleCallbacks = {};
9
9
  const audioSampleCallbacks = {};
10
10
  const queuedAudioSamples = {};
@@ -13,6 +13,7 @@ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers,
13
13
  hasAudioTrackHandlers,
14
14
  fields,
15
15
  hasVideoTrackHandlers,
16
+ structure,
16
17
  });
17
18
  const tracksState = (0, has_tracks_section_1.makeTracksSectionState)(canSkipTracksState);
18
19
  const samplesForTrack = {};
@@ -99,6 +100,8 @@ const sampleCallback = ({ signal, hasAudioTrackHandlers, hasVideoTrackHandlers,
99
100
  tracks: tracksState,
100
101
  audioSampleCallbacks,
101
102
  videoSampleCallbacks,
103
+ hasAudioTrackHandlers,
104
+ hasVideoTrackHandlers,
102
105
  };
103
106
  };
104
107
  exports.sampleCallback = sampleCallback;
@@ -0,0 +1,8 @@
1
+ import type { TransportStreamPacketBuffer } from '../boxes/transport-stream/process-stream-buffers';
2
+ export declare const transportStreamState: () => {
3
+ nextPesHeaderStore: {
4
+ setNextPesHeader: (pesHeader: import("../boxes/transport-stream/parse-pes").PacketPes) => void;
5
+ getNextPesHeader: () => import("../boxes/transport-stream/parse-pes").PacketPes;
6
+ };
7
+ streamBuffers: Map<number, TransportStreamPacketBuffer>;
8
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transportStreamState = void 0;
4
+ const next_pes_header_store_1 = require("../boxes/transport-stream/next-pes-header-store");
5
+ const transportStreamState = () => {
6
+ return {
7
+ nextPesHeaderStore: (0, next_pes_header_store_1.makeNextPesHeaderStore)(),
8
+ streamBuffers: new Map(),
9
+ };
10
+ };
11
+ exports.transportStreamState = transportStreamState;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Keeps track of in which section of the file the video is playing
3
+ * Usually this section is in a different format and it is the only section
4
+ * that can be read partially
5
+ */
6
+ import type { BufferIterator } from '../buffer-iterator';
7
+ type VideoSection = {
8
+ start: number;
9
+ size: number;
10
+ };
11
+ export declare const videoSectionState: () => {
12
+ setVideoSection: (section: VideoSection) => void;
13
+ getVideoSection: () => VideoSection;
14
+ isInVideoSectionState: (iterator: BufferIterator) => "no-section-defined" | "in-section" | "outside-section";
15
+ };
16
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * Keeps track of in which section of the file the video is playing
4
+ * Usually this section is in a different format and it is the only section
5
+ * that can be read partially
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.videoSectionState = void 0;
9
+ const videoSectionState = () => {
10
+ let videoSection = null;
11
+ const setVideoSection = (section) => {
12
+ videoSection = section;
13
+ };
14
+ const getVideoSection = () => {
15
+ if (!videoSection) {
16
+ throw new Error('No video section defined');
17
+ }
18
+ return videoSection;
19
+ };
20
+ const isInVideoSectionState = (iterator) => {
21
+ if (!videoSection) {
22
+ return 'no-section-defined';
23
+ }
24
+ const offset = iterator.counter.getOffset();
25
+ if (offset >= videoSection.start &&
26
+ offset < videoSection.start + videoSection.size) {
27
+ return 'in-section';
28
+ }
29
+ return 'outside-section';
30
+ };
31
+ return {
32
+ setVideoSection,
33
+ getVideoSection,
34
+ isInVideoSectionState,
35
+ };
36
+ };
37
+ exports.videoSectionState = videoSectionState;
@@ -1,5 +1,16 @@
1
1
  import type { OnTrackEntrySegment } from '../boxes/webm/segments';
2
2
  import type { TrackInfo } from '../boxes/webm/segments/track-entry';
3
+ import type { BufferIterator } from '../buffer-iterator';
4
+ export type SegmentSection = {
5
+ start: number;
6
+ size: number;
7
+ index: number;
8
+ };
9
+ export type ClusterSection = {
10
+ start: number;
11
+ size: number;
12
+ segment: number;
13
+ };
3
14
  export declare const webmState: () => {
4
15
  onTrackEntrySegment: OnTrackEntrySegment;
5
16
  getTrackInfoByNumber: (id: number) => TrackInfo;
@@ -8,4 +19,8 @@ export declare const webmState: () => {
8
19
  timescale: null;
9
20
  getTimescale: () => number;
10
21
  setTimescale: (newTimescale: number) => void;
22
+ addSegment: (seg: Omit<SegmentSection, "index">) => void;
23
+ addCluster: (cluster: ClusterSection) => void;
24
+ isInsideSegment: (iterator: BufferIterator) => SegmentSection | null;
25
+ isInsideCluster: (iterator: BufferIterator) => ClusterSection | null;
11
26
  };
@@ -54,6 +54,8 @@ const webmState = () => {
54
54
  }
55
55
  return timescale;
56
56
  };
57
+ const segments = [];
58
+ const clusters = [];
57
59
  return {
58
60
  onTrackEntrySegment,
59
61
  getTrackInfoByNumber: (id) => trackEntries[id],
@@ -62,6 +64,36 @@ const webmState = () => {
62
64
  timescale,
63
65
  getTimescale,
64
66
  setTimescale,
67
+ addSegment: (seg) => {
68
+ const segment = {
69
+ ...seg,
70
+ index: segments.length,
71
+ };
72
+ segments.push(segment);
73
+ },
74
+ addCluster: (cluster) => {
75
+ clusters.push(cluster);
76
+ },
77
+ isInsideSegment: (iterator) => {
78
+ var _a;
79
+ const offset = iterator.counter.getOffset();
80
+ const insideClusters = segments.filter((cluster) => {
81
+ return (offset >= cluster.start && offset <= cluster.start + cluster.size);
82
+ });
83
+ if (insideClusters.length > 1) {
84
+ throw new Error('Expected to only be inside 1 cluster');
85
+ }
86
+ return (_a = insideClusters[0]) !== null && _a !== void 0 ? _a : null;
87
+ },
88
+ isInsideCluster: (iterator) => {
89
+ for (const cluster of clusters) {
90
+ const offset = iterator.counter.getOffset();
91
+ if (offset >= cluster.start && offset <= cluster.start + cluster.size) {
92
+ return cluster;
93
+ }
94
+ }
95
+ return null;
96
+ },
65
97
  };
66
98
  };
67
99
  exports.webmState = webmState;
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.249";
1
+ export declare const VERSION = "4.0.250";
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.249';
5
+ exports.VERSION = '4.0.250';
package/package.json CHANGED
@@ -3,14 +3,14 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.249",
6
+ "version": "4.0.250",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.14.0",
12
- "@remotion/example-videos": "4.0.249",
13
- "@remotion/eslint-config-internal": "4.0.249"
12
+ "@remotion/eslint-config-internal": "4.0.250",
13
+ "@remotion/example-videos": "4.0.250"
14
14
  },
15
15
  "publishConfig": {
16
16
  "access": "public"