@remotion/media-parser 4.0.288 → 4.0.289

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 (123) hide show
  1. package/dist/containers/aac/get-seeking-byte.d.ts +6 -0
  2. package/dist/containers/aac/get-seeking-byte.js +30 -0
  3. package/dist/containers/aac/parse-aac.js +23 -18
  4. package/dist/containers/aac/seeking-hints.d.ts +13 -0
  5. package/dist/containers/aac/seeking-hints.js +14 -0
  6. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  7. package/dist/containers/flac/get-seeking-byte.d.ts +1 -2
  8. package/dist/containers/flac/get-seeking-byte.js +6 -2
  9. package/dist/containers/flac/parse-flac-frame.js +18 -17
  10. package/dist/containers/flac/parse-flac.js +5 -25
  11. package/dist/containers/flac/seeking-hints.d.ts +4 -1
  12. package/dist/containers/flac/seeking-hints.js +2 -1
  13. package/dist/containers/iso-base-media/get-children.d.ts +2 -1
  14. package/dist/containers/iso-base-media/get-children.js +2 -1
  15. package/dist/containers/iso-base-media/get-mfra-seeking-box.js +1 -0
  16. package/dist/containers/iso-base-media/get-moov-atom.js +2 -1
  17. package/dist/containers/iso-base-media/get-video-codec-from-iso-track.d.ts +1 -1
  18. package/dist/containers/iso-base-media/mdat/mdat.js +26 -33
  19. package/dist/containers/iso-base-media/moov/moov.d.ts +2 -1
  20. package/dist/containers/iso-base-media/moov/moov.js +2 -1
  21. package/dist/containers/iso-base-media/parse-boxes.js +1 -0
  22. package/dist/containers/iso-base-media/process-box.d.ts +2 -1
  23. package/dist/containers/iso-base-media/process-box.js +10 -4
  24. package/dist/containers/iso-base-media/stsd/mebx.d.ts +2 -1
  25. package/dist/containers/iso-base-media/stsd/mebx.js +2 -1
  26. package/dist/containers/iso-base-media/stsd/samples.d.ts +4 -2
  27. package/dist/containers/iso-base-media/stsd/samples.js +7 -2
  28. package/dist/containers/iso-base-media/stsd/stsd.d.ts +2 -1
  29. package/dist/containers/iso-base-media/stsd/stsd.js +2 -1
  30. package/dist/containers/iso-base-media/trak/trak.d.ts +2 -1
  31. package/dist/containers/iso-base-media/trak/trak.js +2 -1
  32. package/dist/containers/mp3/audio-sample-from-cbr.d.ts +11 -0
  33. package/dist/containers/mp3/audio-sample-from-cbr.js +35 -0
  34. package/dist/containers/mp3/get-duration.js +33 -6
  35. package/dist/containers/mp3/get-seeking-byte.d.ts +6 -0
  36. package/dist/containers/mp3/get-seeking-byte.js +49 -0
  37. package/dist/containers/mp3/parse-mp3.js +9 -0
  38. package/dist/containers/mp3/parse-mpeg-header.js +74 -263
  39. package/dist/containers/mp3/parse-packet-header.d.ts +30 -0
  40. package/dist/containers/mp3/parse-packet-header.js +258 -0
  41. package/dist/containers/mp3/parse-xing.d.ts +19 -0
  42. package/dist/containers/mp3/parse-xing.js +120 -0
  43. package/dist/containers/mp3/seek/audio-sample-from-cbr.d.ts +16 -0
  44. package/dist/containers/mp3/seek/audio-sample-from-cbr.js +35 -0
  45. package/dist/containers/mp3/seek/audio-sample-from-vbr.d.ts +8 -0
  46. package/dist/containers/mp3/seek/audio-sample-from-vbr.js +47 -0
  47. package/dist/containers/mp3/seek/get-approximate-byte-from-bitrate.d.ts +9 -0
  48. package/dist/containers/mp3/seek/get-approximate-byte-from-bitrate.js +28 -0
  49. package/dist/containers/mp3/seek/get-byte-from-observed-samples.d.ts +6 -0
  50. package/dist/containers/mp3/seek/get-byte-from-observed-samples.js +27 -0
  51. package/dist/containers/mp3/seek/get-seek-point-from-xing.d.ts +7 -0
  52. package/dist/containers/mp3/seek/get-seek-point-from-xing.js +29 -0
  53. package/dist/containers/mp3/seek/wait-until-syncword.d.ts +4 -0
  54. package/dist/containers/mp3/seek/wait-until-syncword.js +25 -0
  55. package/dist/containers/mp3/seeking-hints.d.ts +24 -0
  56. package/dist/containers/mp3/seeking-hints.js +21 -0
  57. package/dist/containers/riff/expect-riff-box.d.ts +6 -1
  58. package/dist/containers/riff/expect-riff-box.js +37 -27
  59. package/dist/containers/riff/get-seeking-byte.d.ts +8 -0
  60. package/dist/containers/riff/get-seeking-byte.js +56 -0
  61. package/dist/containers/riff/has-index.d.ts +2 -0
  62. package/dist/containers/riff/has-index.js +8 -0
  63. package/dist/containers/riff/parse-avih.js +3 -0
  64. package/dist/containers/riff/parse-idx1.d.ts +6 -0
  65. package/dist/containers/riff/parse-idx1.js +47 -0
  66. package/dist/containers/riff/parse-list-box.d.ts +4 -2
  67. package/dist/containers/riff/parse-list-box.js +8 -3
  68. package/dist/containers/riff/parse-movi.js +35 -40
  69. package/dist/containers/riff/parse-riff-body.js +5 -1
  70. package/dist/containers/riff/parse-riff-box.d.ts +4 -2
  71. package/dist/containers/riff/parse-riff-box.js +10 -3
  72. package/dist/containers/riff/riff-box.d.ts +14 -1
  73. package/dist/containers/riff/seek/fetch-idx1.d.ts +15 -0
  74. package/dist/containers/riff/seek/fetch-idx1.js +38 -0
  75. package/dist/containers/riff/seeking-hints.d.ts +23 -0
  76. package/dist/containers/riff/seeking-hints.js +36 -0
  77. package/dist/containers/transport-stream/handle-aac-packet.js +4 -8
  78. package/dist/containers/transport-stream/handle-avc-packet.js +4 -8
  79. package/dist/containers/wav/get-duration-from-wav.js +1 -10
  80. package/dist/containers/wav/parse-media-section.js +14 -18
  81. package/dist/containers/webm/parse-ebml.js +3 -16
  82. package/dist/containers/webm/seek/seeking-hints.js +1 -1
  83. package/dist/emit-available-info.js +8 -8
  84. package/dist/esm/index.mjs +1479 -383
  85. package/dist/esm/worker-server-entry.mjs +1475 -379
  86. package/dist/esm/worker-web-entry.mjs +1475 -379
  87. package/dist/find-last-keyframe.d.ts +5 -0
  88. package/dist/find-last-keyframe.js +18 -0
  89. package/dist/get-seeking-byte.d.ts +3 -1
  90. package/dist/get-seeking-byte.js +45 -7
  91. package/dist/get-seeking-hints.d.ts +12 -1
  92. package/dist/get-seeking-hints.js +40 -9
  93. package/dist/index.d.ts +56 -8
  94. package/dist/internal-parse-media.js +6 -0
  95. package/dist/parse-loop.js +15 -0
  96. package/dist/seeking-hints.d.ts +5 -1
  97. package/dist/set-seeking-hints.js +28 -8
  98. package/dist/state/aac-state.d.ts +6 -0
  99. package/dist/state/aac-state.js +7 -2
  100. package/dist/state/flac-state.d.ts +6 -0
  101. package/dist/state/flac-state.js +3 -0
  102. package/dist/state/keyframes.d.ts +1 -2
  103. package/dist/state/keyframes.js +2 -2
  104. package/dist/state/matroska/lazy-cues-fetch.js +13 -1
  105. package/dist/state/parser-state.d.ts +52 -6
  106. package/dist/state/parser-state.js +6 -6
  107. package/dist/state/riff/lazy-idx1-fetch.d.ts +30 -0
  108. package/dist/state/riff/lazy-idx1-fetch.js +63 -0
  109. package/dist/state/riff/riff-keyframes.d.ts +10 -0
  110. package/dist/state/riff/riff-keyframes.js +26 -0
  111. package/dist/state/riff/sample-counter.d.ts +12 -0
  112. package/dist/state/riff/sample-counter.js +52 -0
  113. package/dist/state/riff.d.ts +41 -1
  114. package/dist/state/riff.js +12 -1
  115. package/dist/state/sample-callbacks.d.ts +3 -4
  116. package/dist/state/sample-callbacks.js +3 -16
  117. package/dist/state/samples-observed/slow-duration-fps.d.ts +3 -1
  118. package/dist/state/samples-observed/slow-duration-fps.js +7 -0
  119. package/dist/version.d.ts +1 -1
  120. package/dist/version.js +1 -1
  121. package/dist/work-on-seek-request.d.ts +10 -0
  122. package/dist/work-on-seek-request.js +20 -2
  123. package/package.json +3 -3
@@ -0,0 +1,6 @@
1
+ import type { SeekResolution } from '../../work-on-seek-request';
2
+ import type { AacSeekingHints } from './seeking-hints';
3
+ export declare const getSeekingByteForAac: ({ time, seekingHints, }: {
4
+ time: number;
5
+ seekingHints: AacSeekingHints;
6
+ }) => SeekResolution;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSeekingByteForAac = void 0;
4
+ const getSeekingByteForAac = ({ time, seekingHints, }) => {
5
+ let bestAudioSample;
6
+ for (const hint of seekingHints.audioSampleMap) {
7
+ if (hint.timeInSeconds > time) {
8
+ continue;
9
+ }
10
+ // Everything is a keyframe in flac, so if this sample does not cover the time, it's not a good candidate.
11
+ // Let's go to the next one. Exception: If we already saw the last sample, we use it so we find can at least
12
+ // find the closest one.
13
+ if (hint.timeInSeconds + hint.durationInSeconds < time &&
14
+ !seekingHints.lastSampleObserved) {
15
+ continue;
16
+ }
17
+ if (!bestAudioSample) {
18
+ bestAudioSample = hint;
19
+ continue;
20
+ }
21
+ if (bestAudioSample.timeInSeconds < hint.timeInSeconds) {
22
+ bestAudioSample = hint;
23
+ }
24
+ }
25
+ if (bestAudioSample) {
26
+ return { type: 'do-seek', byte: bestAudioSample.offset };
27
+ }
28
+ return { type: 'valid-but-must-wait' };
29
+ };
30
+ exports.getSeekingByteForAac = getSeekingByteForAac;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseAac = void 0;
4
4
  const aac_codecprivate_1 = require("../../aac-codecprivate");
5
5
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
6
- const emit_audio_sample_1 = require("../../emit-audio-sample");
7
6
  const register_track_1 = require("../../register-track");
8
7
  const parseAac = async (state) => {
9
8
  const { iterator } = state;
@@ -47,6 +46,10 @@ const parseAac = async (state) => {
47
46
  iterator.counter.decrement(iterator.counter.getOffset() - startOffset);
48
47
  const data = iterator.getSlice(frameLength);
49
48
  if (state.callbacks.tracks.getTracks().length === 0) {
49
+ state.mediaSection.addMediaSection({
50
+ start: startOffset,
51
+ size: state.contentLength - startOffset,
52
+ });
50
53
  await (0, register_track_1.registerAudioTrack)({
51
54
  container: 'aac',
52
55
  track: {
@@ -71,25 +74,27 @@ const parseAac = async (state) => {
71
74
  const duration = 1024 / sampleRate;
72
75
  const { index } = state.aac.addSample({ offset: startOffset, size: frameLength });
73
76
  const timestamp = (1024 / sampleRate) * index;
77
+ state.aac.audioSamples.addSample({
78
+ timeInSeconds: timestamp,
79
+ offset: startOffset,
80
+ durationInSeconds: duration,
81
+ });
74
82
  // One ADTS frame contains 1024 samples
75
- await (0, emit_audio_sample_1.emitAudioSample)({
76
- trackId: 0,
77
- audioSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
78
- sample: {
79
- duration,
80
- type: 'key',
81
- data,
82
- offset: startOffset,
83
- timescale: 1000000,
84
- trackId: 0,
85
- cts: timestamp,
86
- dts: timestamp,
87
- timestamp,
88
- },
89
- timescale: 1,
90
- }),
91
- callbacks: state.callbacks,
83
+ const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
84
+ sample: {
85
+ duration,
86
+ type: 'key',
87
+ data,
88
+ offset: startOffset,
89
+ timescale: 1000000,
90
+ trackId: 0,
91
+ cts: timestamp,
92
+ dts: timestamp,
93
+ timestamp,
94
+ },
95
+ timescale: 1,
92
96
  });
97
+ await state.callbacks.onAudioSample(0, audioSample);
93
98
  return Promise.resolve(null);
94
99
  };
95
100
  exports.parseAac = parseAac;
@@ -0,0 +1,13 @@
1
+ import type { AacState } from '../../state/aac-state';
2
+ import type { AudioSampleOffset } from '../../state/audio-sample-map';
3
+ import type { SamplesObservedState } from '../../state/samples-observed/slow-duration-fps';
4
+ export type AacSeekingHints = {
5
+ type: 'aac-seeking-hints';
6
+ audioSampleMap: AudioSampleOffset[];
7
+ lastSampleObserved: boolean;
8
+ };
9
+ export declare const getSeekingHintsForAac: ({ aacState, samplesObserved, }: {
10
+ aacState: AacState;
11
+ samplesObserved: SamplesObservedState;
12
+ }) => AacSeekingHints;
13
+ export declare const setSeekingHintsForAac: () => void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSeekingHintsForAac = exports.getSeekingHintsForAac = void 0;
4
+ const getSeekingHintsForAac = ({ aacState, samplesObserved, }) => {
5
+ return {
6
+ type: 'aac-seeking-hints',
7
+ audioSampleMap: aacState.audioSamples.getSamples(),
8
+ lastSampleObserved: samplesObserved.getLastSampleObserved(),
9
+ };
10
+ };
11
+ exports.getSeekingHintsForAac = getSeekingHintsForAac;
12
+ // TODO: Implement this and maintain index
13
+ const setSeekingHintsForAac = () => { };
14
+ exports.setSeekingHintsForAac = setSeekingHintsForAac;
@@ -1,2 +1,2 @@
1
1
  import type { BufferIterator } from '../../iterator/buffer-iterator';
2
- export declare const getChannelCount: (iterator: BufferIterator) => 2 | 8 | 1 | 7 | 3 | 4 | 5 | 6;
2
+ export declare const getChannelCount: (iterator: BufferIterator) => 2 | 1 | 4 | 3 | 5 | 6 | 8 | 7;
@@ -1,6 +1,5 @@
1
1
  import type { FlacSeekingHints } from './seeking-hints';
2
- export declare const getSeekingByteForFlac: ({ time, seekingHints, endOfFile, }: {
2
+ export declare const getSeekingByteForFlac: ({ time, seekingHints, }: {
3
3
  time: number;
4
4
  seekingHints: FlacSeekingHints;
5
- endOfFile: boolean;
6
5
  }) => number | null;
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSeekingByteForFlac = void 0;
4
- const getSeekingByteForFlac = ({ time, seekingHints, endOfFile, }) => {
4
+ const getSeekingByteForFlac = ({ time, seekingHints, }) => {
5
5
  let bestAudioSample;
6
6
  for (const hint of seekingHints.audioSampleMap) {
7
7
  if (hint.timeInSeconds > time) {
8
8
  continue;
9
9
  }
10
- if (hint.timeInSeconds + hint.durationInSeconds < time && !endOfFile) {
10
+ // Everything is a keyframe in flac, so if this sample does not cover the time, it's not a good candidate.
11
+ // Let's go to the next one. Exception: If we already saw the last sample, we use it so we find can at least
12
+ // find the closest one.
13
+ if (hint.timeInSeconds + hint.durationInSeconds < time &&
14
+ !seekingHints.lastSampleObserved) {
11
15
  continue;
12
16
  }
13
17
  if (!bestAudioSample) {
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseFlacFrame = exports.parseFrameHeader = void 0;
4
4
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
5
- const emit_audio_sample_1 = require("../../emit-audio-sample");
6
5
  const buffer_iterator_1 = require("../../iterator/buffer-iterator");
7
6
  const get_block_size_1 = require("./get-block-size");
8
7
  const get_channel_count_1 = require("./get-channel-count");
@@ -81,24 +80,26 @@ const emitSample = async ({ state, data, offset, }) => {
81
80
  throw new Error('Cannot determine timestamp');
82
81
  }
83
82
  const timestamp = (num * streamInfo.maximumBlockSize) / streamInfo.sampleRate;
84
- await (0, emit_audio_sample_1.emitAudioSample)({
85
- trackId: 0,
86
- audioSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
87
- sample: {
88
- data,
89
- duration,
90
- cts: timestamp,
91
- dts: timestamp,
92
- timestamp,
93
- type: 'key',
94
- offset,
95
- timescale: 1000000,
96
- trackId: 0,
97
- },
83
+ state.flac.audioSamples.addSample({
84
+ timeInSeconds: timestamp,
85
+ offset,
86
+ durationInSeconds: duration,
87
+ });
88
+ const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
89
+ sample: {
90
+ data,
91
+ duration,
92
+ cts: timestamp,
93
+ dts: timestamp,
94
+ timestamp,
95
+ type: 'key',
96
+ offset,
98
97
  timescale: 1,
99
- }),
100
- callbacks: state.callbacks,
98
+ trackId: 0,
99
+ },
100
+ timescale: 1,
101
101
  });
102
+ await state.callbacks.onAudioSample(0, audioSample);
102
103
  iterator.destroy();
103
104
  };
104
105
  const parseFlacFrame = async ({ state, iterator, }) => {
@@ -5,13 +5,7 @@ const skip_1 = require("../../skip");
5
5
  const may_skip_video_data_1 = require("../../state/may-skip-video-data");
6
6
  const parse_flac_frame_1 = require("./parse-flac-frame");
7
7
  const parse_header_1 = require("./parse-header");
8
- const parse_metadata_1 = require("./parse-metadata");
9
- const parse_streaminfo_1 = require("./parse-streaminfo");
10
- const parse_unknown_block_1 = require("./parse-unknown-block");
11
- const flacTypes = {
12
- streaminfo: 0,
13
- vorbisComment: 4,
14
- };
8
+ const parse_meta_1 = require("./parse-meta");
15
9
  const parseFlac = ({ iterator, state, }) => {
16
10
  const mediaSectionState = state.mediaSection.isCurrentByteInMediaSection(iterator);
17
11
  if (mediaSectionState === 'in-section') {
@@ -27,23 +21,9 @@ const parseFlac = ({ iterator, state, }) => {
27
21
  iterator.counter.decrement(4);
28
22
  // https://www.rfc-editor.org/rfc/rfc9639.html#name-streaminfo
29
23
  // section 8.1
30
- iterator.startReadingBits();
31
- const isLastMetadata = iterator.getBits(1);
32
- const metaBlockType = iterator.getBits(7);
33
- iterator.stopReadingBits();
34
- const size = iterator.getUint24();
35
- if (isLastMetadata) {
36
- state.mediaSection.addMediaSection({
37
- start: iterator.counter.getOffset() + size,
38
- size: state.contentLength - iterator.counter.getOffset() - size,
39
- });
40
- }
41
- if (metaBlockType === flacTypes.streaminfo) {
42
- return (0, parse_streaminfo_1.parseStreamInfo)({ iterator, state });
43
- }
44
- if (metaBlockType === flacTypes.vorbisComment) {
45
- return (0, parse_metadata_1.parseVorbisComment)({ iterator, state, size });
46
- }
47
- return (0, parse_unknown_block_1.parseFlacUnkownBlock)({ iterator, state, size });
24
+ return (0, parse_meta_1.parseMetaBlock)({
25
+ iterator,
26
+ state,
27
+ });
48
28
  };
49
29
  exports.parseFlac = parseFlac;
@@ -1,13 +1,16 @@
1
1
  import type { AudioSampleOffset } from '../../state/audio-sample-map';
2
2
  import type { FlacState } from '../../state/flac-state';
3
3
  import type { ParserState } from '../../state/parser-state';
4
+ import type { SamplesObservedState } from '../../state/samples-observed/slow-duration-fps';
4
5
  export type FlacSeekingHints = {
5
6
  type: 'flac-seeking-hints';
6
7
  audioSampleMap: AudioSampleOffset[];
7
8
  blockingBitStrategy: number | null;
9
+ lastSampleObserved: boolean;
8
10
  };
9
- export declare const getSeekingHintsForFlac: ({ flacState, }: {
11
+ export declare const getSeekingHintsForFlac: ({ flacState, samplesObserved, }: {
10
12
  flacState: FlacState;
13
+ samplesObserved: SamplesObservedState;
11
14
  }) => FlacSeekingHints;
12
15
  export declare const setSeekingHintsForFlac: ({ hints, state, }: {
13
16
  hints: FlacSeekingHints;
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setSeekingHintsForFlac = exports.getSeekingHintsForFlac = void 0;
4
- const getSeekingHintsForFlac = ({ flacState, }) => {
4
+ const getSeekingHintsForFlac = ({ flacState, samplesObserved, }) => {
5
5
  var _a;
6
6
  return {
7
7
  type: 'flac-seeking-hints',
8
8
  audioSampleMap: flacState.audioSamples.getSamples(),
9
9
  blockingBitStrategy: (_a = flacState.getBlockingBitStrategy()) !== null && _a !== void 0 ? _a : null,
10
+ lastSampleObserved: samplesObserved.getLastSampleObserved(),
10
11
  };
11
12
  };
12
13
  exports.getSeekingHintsForFlac = getSeekingHintsForFlac;
@@ -2,9 +2,10 @@ import type { BufferIterator } from '../../iterator/buffer-iterator';
2
2
  import type { LogLevel } from '../../log';
3
3
  import type { IsoBaseMediaBox } from './base-media-box';
4
4
  import type { OnlyIfMoovAtomExpected } from './process-box';
5
- export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }: {
5
+ export declare const getIsoBaseMediaChildren: ({ size, iterator, logLevel, onlyIfMoovAtomExpected, contentLength, }: {
6
6
  size: number;
7
7
  iterator: BufferIterator;
8
8
  logLevel: LogLevel;
9
9
  onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
10
+ contentLength: number;
10
11
  }) => Promise<IsoBaseMediaBox[]>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getIsoBaseMediaChildren = void 0;
4
4
  const process_box_1 = require("./process-box");
5
- const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAtomExpected, }) => {
5
+ const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAtomExpected, contentLength, }) => {
6
6
  const boxes = [];
7
7
  const initial = iterator.counter.getOffset();
8
8
  while (iterator.counter.getOffset() < size + initial) {
@@ -11,6 +11,7 @@ const getIsoBaseMediaChildren = async ({ size, iterator, logLevel, onlyIfMoovAto
11
11
  logLevel,
12
12
  onlyIfMoovAtomExpected,
13
13
  onlyIfMdatAtomExpected: null,
14
+ contentLength,
14
15
  });
15
16
  if (!parsed) {
16
17
  throw new Error('Expected box');
@@ -27,6 +27,7 @@ const getMfraSeekingBox = async ({ contentLength, controller, readerInterface, s
27
27
  logLevel,
28
28
  size: parentSize - 8,
29
29
  onlyIfMoovAtomExpected: null,
30
+ contentLength,
30
31
  });
31
32
  };
32
33
  exports.getMfraSeekingBox = getMfraSeekingBox;
@@ -51,7 +51,7 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
51
51
  return null;
52
52
  }
53
53
  : null;
54
- const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), state.contentLength);
54
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array([]), state.contentLength - endOfMdat);
55
55
  while (true) {
56
56
  const result = await reader.reader.read();
57
57
  if (result.value) {
@@ -82,6 +82,7 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
82
82
  registerAudioSampleCallback: () => Promise.resolve(),
83
83
  },
84
84
  onlyIfMdatAtomExpected: null,
85
+ contentLength: state.contentLength - endOfMdat,
85
86
  });
86
87
  if (box) {
87
88
  boxes.push(box);
@@ -1,2 +1,2 @@
1
1
  import type { TrakBox } from './trak/trak';
2
- export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h264" | "av1" | "h265" | "prores";
2
+ export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h265" | "h264" | "av1" | "prores";
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMdatSection = void 0;
4
4
  const convert_audio_or_video_sample_1 = require("../../../convert-audio-or-video-sample");
5
- const emit_audio_sample_1 = require("../../../emit-audio-sample");
6
5
  const get_tracks_1 = require("../../../get-tracks");
7
6
  const skip_1 = require("../../../skip");
8
7
  const cached_sample_positions_1 = require("../../../state/iso-base-media/cached-sample-positions");
@@ -70,24 +69,21 @@ const parseMdatSection = async (state) => {
70
69
  chunkSize,
71
70
  });
72
71
  if (samplesWithIndex.track.type === 'audio') {
73
- await (0, emit_audio_sample_1.emitAudioSample)({
74
- trackId: samplesWithIndex.track.trackId,
75
- audioSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
76
- sample: {
77
- data: bytes,
78
- timestamp: cts,
79
- duration,
80
- cts,
81
- dts,
82
- trackId: samplesWithIndex.track.trackId,
83
- type: isKeyframe ? 'key' : 'delta',
84
- offset,
85
- timescale: samplesWithIndex.track.timescale,
86
- },
72
+ const audioSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
73
+ sample: {
74
+ data: bytes,
75
+ timestamp: cts,
76
+ duration,
77
+ cts,
78
+ dts,
79
+ trackId: samplesWithIndex.track.trackId,
80
+ type: isKeyframe ? 'key' : 'delta',
81
+ offset,
87
82
  timescale: samplesWithIndex.track.timescale,
88
- }),
89
- callbacks: state.callbacks,
83
+ },
84
+ timescale: samplesWithIndex.track.timescale,
90
85
  });
86
+ await state.callbacks.onAudioSample(samplesWithIndex.track.trackId, audioSample);
91
87
  }
92
88
  if (samplesWithIndex.track.type === 'video') {
93
89
  // https://remotion-assets.s3.eu-central-1.amazonaws.com/example-videos/sei_checkpoint.mp4
@@ -102,24 +98,21 @@ const parseMdatSection = async (state) => {
102
98
  const seiType = bytes[5];
103
99
  isRecoveryPoint = seiType === 6;
104
100
  }
105
- await (0, emit_audio_sample_1.emitVideoSample)({
106
- trackId: samplesWithIndex.track.trackId,
107
- videoSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
108
- sample: {
109
- data: bytes,
110
- timestamp: cts,
111
- duration,
112
- cts,
113
- dts,
114
- trackId: samplesWithIndex.track.trackId,
115
- type: isKeyframe && !isRecoveryPoint ? 'key' : 'delta',
116
- offset,
117
- timescale: samplesWithIndex.track.timescale,
118
- },
101
+ const videoSample = (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
102
+ sample: {
103
+ data: bytes,
104
+ timestamp: cts,
105
+ duration,
106
+ cts,
107
+ dts,
108
+ trackId: samplesWithIndex.track.trackId,
109
+ type: isKeyframe && !isRecoveryPoint ? 'key' : 'delta',
110
+ offset,
119
111
  timescale: samplesWithIndex.track.timescale,
120
- }),
121
- callbacks: state.callbacks,
112
+ },
113
+ timescale: samplesWithIndex.track.timescale,
122
114
  });
115
+ await state.callbacks.onVideoSample(samplesWithIndex.track.trackId, videoSample);
123
116
  }
124
117
  return null;
125
118
  };
@@ -7,10 +7,11 @@ export interface MoovBox extends BaseBox {
7
7
  type: 'moov-box';
8
8
  children: AnySegment[];
9
9
  }
10
- export declare const parseMoov: ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, }: {
10
+ export declare const parseMoov: ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, contentLength, }: {
11
11
  offset: number;
12
12
  size: number;
13
13
  onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected;
14
14
  iterator: BufferIterator;
15
15
  logLevel: LogLevel;
16
+ contentLength: number;
16
17
  }) => Promise<MoovBox>;
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMoov = void 0;
4
4
  const get_children_1 = require("../get-children");
5
- const parseMoov = async ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, }) => {
5
+ const parseMoov = async ({ offset, size, onlyIfMoovAtomExpected, iterator, logLevel, contentLength, }) => {
6
6
  const children = await (0, get_children_1.getIsoBaseMediaChildren)({
7
7
  onlyIfMoovAtomExpected,
8
8
  size: size - 8,
9
9
  iterator,
10
10
  logLevel,
11
+ contentLength,
11
12
  });
12
13
  return {
13
14
  offset,
@@ -23,6 +23,7 @@ const parseIsoBaseMedia = async (state) => {
23
23
  onlyIfMdatAtomExpected: {
24
24
  mediaSectionState: state.mediaSection,
25
25
  },
26
+ contentLength: state.contentLength,
26
27
  });
27
28
  if (result) {
28
29
  state.structure.getIsoStructure().boxes.push(result);
@@ -17,9 +17,10 @@ export type OnlyIfMoovAtomExpected = {
17
17
  export type OnlyIfMdatAtomExpected = {
18
18
  mediaSectionState: MediaSectionState;
19
19
  };
20
- export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, }: {
20
+ export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }: {
21
21
  iterator: BufferIterator;
22
22
  logLevel: LogLevel;
23
23
  onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
24
24
  onlyIfMdatAtomExpected: OnlyIfMdatAtomExpected | null;
25
+ contentLength: number;
25
26
  }) => Promise<BoxAndNext>;
@@ -32,7 +32,7 @@ const tfhd_1 = require("./tfhd");
32
32
  const tkhd_1 = require("./tkhd");
33
33
  const trak_1 = require("./trak/trak");
34
34
  const trun_1 = require("./trun");
35
- const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, }) => {
35
+ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }) => {
36
36
  var _a, _b;
37
37
  const fileOffset = iterator.counter.getOffset();
38
38
  const { returnToCheckpoint } = iterator.startCheckpoint();
@@ -51,13 +51,14 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
51
51
  iterator.counter.decrement(iterator.counter.getOffset() - fileOffset);
52
52
  throw new Error(`Expected box size of ${bytesRemaining}, got ${boxSizeRaw}. Incomplete boxes are not allowed.`);
53
53
  }
54
+ const maxSize = contentLength - startOff;
54
55
  const boxType = iterator.getByteString(4, false);
55
- const boxSize = boxSizeRaw === 1 ? iterator.getEightByteNumber() : boxSizeRaw;
56
- log_1.Log.trace(logLevel, 'Found box', boxType, boxSize);
56
+ const boxSizeUnlimited = boxSizeRaw === 1 ? iterator.getEightByteNumber() : boxSizeRaw;
57
+ const boxSize = Math.min(boxSizeUnlimited, maxSize);
57
58
  const headerLength = iterator.counter.getOffset() - startOff;
58
59
  if (boxType === 'mdat') {
59
60
  if (!onlyIfMdatAtomExpected) {
60
- throw new Error('State is required');
61
+ return null;
61
62
  }
62
63
  const { mediaSectionState } = onlyIfMdatAtomExpected;
63
64
  mediaSectionState.addMediaSection({
@@ -97,6 +98,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
97
98
  size: boxSize,
98
99
  iterator,
99
100
  logLevel,
101
+ contentLength,
100
102
  });
101
103
  }
102
104
  if (boxType === 'stsz') {
@@ -148,6 +150,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
148
150
  size: boxSize,
149
151
  iterator,
150
152
  logLevel,
153
+ contentLength,
151
154
  });
152
155
  }
153
156
  if (boxType === 'hdlr') {
@@ -192,6 +195,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
192
195
  onlyIfMoovAtomExpected,
193
196
  iterator,
194
197
  logLevel,
198
+ contentLength,
195
199
  });
196
200
  tracks.setIsDone(logLevel);
197
201
  return box;
@@ -206,6 +210,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
206
210
  offsetAtStart: fileOffset,
207
211
  iterator,
208
212
  logLevel,
213
+ contentLength,
209
214
  });
210
215
  const transformedTrack = (0, make_track_1.makeBaseMediaTrack)(box);
211
216
  if (transformedTrack && transformedTrack.type === 'video') {
@@ -296,6 +301,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
296
301
  size: boxSize - 8,
297
302
  logLevel,
298
303
  onlyIfMoovAtomExpected,
304
+ contentLength,
299
305
  });
300
306
  return {
301
307
  type: 'regular-box',
@@ -8,9 +8,10 @@ export interface MebxBox extends BaseBox {
8
8
  format: string;
9
9
  children: AnySegment[];
10
10
  }
11
- export declare const parseMebx: ({ offset, size, iterator, logLevel, }: {
11
+ export declare const parseMebx: ({ offset, size, iterator, logLevel, contentLength, }: {
12
12
  offset: number;
13
13
  size: number;
14
14
  iterator: BufferIterator;
15
15
  logLevel: LogLevel;
16
+ contentLength: number;
16
17
  }) => Promise<MebxBox>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMebx = void 0;
4
4
  const get_children_1 = require("../get-children");
5
- const parseMebx = async ({ offset, size, iterator, logLevel, }) => {
5
+ const parseMebx = async ({ offset, size, iterator, logLevel, contentLength, }) => {
6
6
  // reserved, 6 bit
7
7
  iterator.discard(6);
8
8
  const dataReferenceIndex = iterator.getUint16();
@@ -11,6 +11,7 @@ const parseMebx = async ({ offset, size, iterator, logLevel, }) => {
11
11
  size: size - 8,
12
12
  logLevel,
13
13
  onlyIfMoovAtomExpected: null,
14
+ contentLength,
14
15
  });
15
16
  return {
16
17
  type: 'mebx-box',
@@ -49,13 +49,15 @@ export type Sample = AudioSample | VideoSample | UnknownSample;
49
49
  type FormatBoxAndNext = {
50
50
  sample: Sample | null;
51
51
  };
52
- export declare const processIsoFormatBox: ({ iterator, logLevel, }: {
52
+ export declare const processIsoFormatBox: ({ iterator, logLevel, contentLength, }: {
53
53
  iterator: BufferIterator;
54
54
  logLevel: LogLevel;
55
+ contentLength: number;
55
56
  }) => Promise<FormatBoxAndNext>;
56
- export declare const parseIsoFormatBoxes: ({ maxBytes, logLevel, iterator, }: {
57
+ export declare const parseIsoFormatBoxes: ({ maxBytes, logLevel, iterator, contentLength, }: {
57
58
  maxBytes: number;
58
59
  logLevel: LogLevel;
59
60
  iterator: BufferIterator;
61
+ contentLength: number;
60
62
  }) => Promise<Sample[]>;
61
63
  export {};