@remotion/media-parser 4.0.290 → 4.0.291

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 (160) hide show
  1. package/dist/containers/iso-base-media/base-media-box.d.ts +0 -1
  2. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +4 -1
  3. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +9 -5
  4. package/dist/containers/iso-base-media/find-keyframe-before-time.js +16 -11
  5. package/dist/containers/iso-base-media/find-track-to-seek.d.ts +14 -0
  6. package/dist/containers/iso-base-media/find-track-to-seek.js +39 -0
  7. package/dist/containers/iso-base-media/get-children.js +2 -2
  8. package/dist/containers/iso-base-media/get-keyframes.js +6 -1
  9. package/dist/containers/iso-base-media/get-mfra-seeking-box.d.ts +3 -1
  10. package/dist/containers/iso-base-media/get-mfra-seeking-box.js +5 -1
  11. package/dist/containers/iso-base-media/get-moov-atom.js +6 -3
  12. package/dist/containers/iso-base-media/get-sample-position-bounds.js +3 -1
  13. package/dist/containers/iso-base-media/get-sample-positions-from-track.js +1 -1
  14. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.d.ts +14 -0
  15. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +89 -0
  16. package/dist/containers/iso-base-media/get-seeking-byte.d.ts +3 -3
  17. package/dist/containers/iso-base-media/get-seeking-byte.js +32 -96
  18. package/dist/containers/iso-base-media/mdat/calculate-jump-marks.d.ts +6 -0
  19. package/dist/containers/iso-base-media/mdat/calculate-jump-marks.js +131 -0
  20. package/dist/containers/iso-base-media/mdat/mdat.d.ts +2 -2
  21. package/dist/containers/iso-base-media/mdat/mdat.js +18 -2
  22. package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.d.ts +3 -3
  23. package/dist/containers/iso-base-media/mfra/find-best-segment-from-tfra.js +2 -2
  24. package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +5 -1
  25. package/dist/containers/iso-base-media/mfra/get-mfra-atom.js +3 -1
  26. package/dist/containers/iso-base-media/mfra/get-mfro-atom.d.ts +5 -1
  27. package/dist/containers/iso-base-media/mfra/get-mfro-atom.js +3 -1
  28. package/dist/containers/iso-base-media/parse-boxes.js +5 -2
  29. package/dist/containers/iso-base-media/process-box.d.ts +16 -5
  30. package/dist/containers/iso-base-media/process-box.js +206 -118
  31. package/dist/containers/iso-base-media/sample-positions.d.ts +25 -0
  32. package/dist/containers/iso-base-media/sample-positions.js +37 -0
  33. package/dist/containers/iso-base-media/stsd/samples.js +1 -0
  34. package/dist/containers/iso-base-media/stsd/stsc.d.ts +1 -6
  35. package/dist/containers/iso-base-media/stsd/stsc.js +2 -5
  36. package/dist/containers/iso-base-media/stsd/stss.d.ts +1 -1
  37. package/dist/containers/iso-base-media/stsd/stss.js +2 -2
  38. package/dist/containers/iso-base-media/turn-sample-positions-into-array.d.ts +19 -0
  39. package/dist/containers/iso-base-media/turn-sample-positions-into-array.js +73 -0
  40. package/dist/containers/m3u/after-manifest-fetch.d.ts +5 -1
  41. package/dist/containers/m3u/after-manifest-fetch.js +3 -1
  42. package/dist/containers/m3u/first-sample-in-m3u-chunk.d.ts +13 -0
  43. package/dist/containers/m3u/first-sample-in-m3u-chunk.js +31 -0
  44. package/dist/containers/m3u/get-seeking-byte.d.ts +13 -0
  45. package/dist/containers/m3u/get-seeking-byte.js +32 -0
  46. package/dist/containers/m3u/get-streams.d.ts +1 -0
  47. package/dist/containers/m3u/get-streams.js +1 -0
  48. package/dist/containers/m3u/iterate-over-segment-files.d.ts +5 -3
  49. package/dist/containers/m3u/iterate-over-segment-files.js +11 -1
  50. package/dist/containers/m3u/parse-m3u-media-directive.js +1 -0
  51. package/dist/containers/m3u/parse-m3u.js +8 -0
  52. package/dist/containers/m3u/process-m3u-chunk.d.ts +12 -0
  53. package/dist/containers/m3u/process-m3u-chunk.js +274 -0
  54. package/dist/containers/m3u/run-over-m3u.js +7 -80
  55. package/dist/containers/m3u/sample-sorter.d.ts +1 -0
  56. package/dist/containers/m3u/sample-sorter.js +4 -1
  57. package/dist/containers/m3u/seek/get-chunk-to-seek-to.d.ts +5 -0
  58. package/dist/containers/m3u/seek/get-chunk-to-seek-to.js +14 -0
  59. package/dist/containers/m3u/seeking-hints.d.ts +2 -0
  60. package/dist/containers/m3u/seeking-hints.js +9 -0
  61. package/dist/containers/m3u/select-stream.d.ts +2 -1
  62. package/dist/containers/m3u/select-stream.js +7 -2
  63. package/dist/containers/m3u/types.d.ts +1 -0
  64. package/dist/containers/riff/seek/fetch-idx1.d.ts +3 -1
  65. package/dist/containers/riff/seek/fetch-idx1.js +3 -1
  66. package/dist/containers/transport-stream/handle-aac-packet.d.ts +2 -2
  67. package/dist/containers/transport-stream/handle-avc-packet.d.ts +2 -2
  68. package/dist/containers/transport-stream/process-audio.d.ts +2 -2
  69. package/dist/containers/transport-stream/process-stream-buffers.d.ts +3 -3
  70. package/dist/containers/transport-stream/process-video.d.ts +2 -2
  71. package/dist/containers/webm/get-sample-from-block.d.ts +12 -2
  72. package/dist/containers/webm/get-sample-from-block.js +40 -9
  73. package/dist/containers/webm/parse-ebml.js +28 -10
  74. package/dist/containers/webm/seek/fetch-web-cues.d.ts +3 -1
  75. package/dist/containers/webm/seek/fetch-web-cues.js +3 -1
  76. package/dist/containers/webm/state-for-processing.d.ts +2 -2
  77. package/dist/controller/media-parser-controller.d.ts +1 -1
  78. package/dist/controller/media-parser-controller.js +6 -2
  79. package/dist/controller/seek-signal.d.ts +1 -5
  80. package/dist/download-and-parse-media.js +1 -1
  81. package/dist/esm/index.mjs +1400 -611
  82. package/dist/esm/node.mjs +23 -3
  83. package/dist/esm/server-worker.mjs +8 -1
  84. package/dist/esm/universal.mjs +168 -15
  85. package/dist/esm/web.mjs +145 -13
  86. package/dist/esm/worker-server-entry.mjs +1467 -635
  87. package/dist/esm/worker-web-entry.mjs +1439 -634
  88. package/dist/esm/worker.mjs +8 -1
  89. package/dist/get-audio-codec.js +3 -0
  90. package/dist/get-duration.js +2 -1
  91. package/dist/get-fps.js +2 -1
  92. package/dist/get-sample-positions-from-mp4.js +10 -5
  93. package/dist/get-sample-positions.js +4 -4
  94. package/dist/get-seeking-byte.d.ts +5 -3
  95. package/dist/get-seeking-byte.js +19 -10
  96. package/dist/get-seeking-hints.d.ts +3 -3
  97. package/dist/get-seeking-hints.js +18 -13
  98. package/dist/get-tracks.d.ts +9 -1
  99. package/dist/get-tracks.js +13 -6
  100. package/dist/index.d.ts +21 -5
  101. package/dist/init-video.js +3 -2
  102. package/dist/internal-parse-media.js +13 -4
  103. package/dist/iterator/buffer-iterator.js +5 -3
  104. package/dist/metadata/metadata-from-iso.js +2 -1
  105. package/dist/options.d.ts +6 -1
  106. package/dist/parse-loop.js +22 -6
  107. package/dist/parse-media-on-worker-entry.js +1 -0
  108. package/dist/parse-media.js +1 -1
  109. package/dist/parse-result.d.ts +2 -2
  110. package/dist/perform-seek.d.ts +3 -1
  111. package/dist/perform-seek.js +3 -1
  112. package/dist/readers/fetch/get-body-and-reader.js +17 -2
  113. package/dist/readers/from-fetch.d.ts +17 -1
  114. package/dist/readers/from-fetch.js +68 -13
  115. package/dist/readers/from-node.js +24 -2
  116. package/dist/readers/from-web-file.js +3 -0
  117. package/dist/readers/reader.d.ts +19 -2
  118. package/dist/readers/universal.js +9 -0
  119. package/dist/readers/web.js +6 -0
  120. package/dist/register-track.d.ts +3 -3
  121. package/dist/seek-backwards.d.ts +3 -1
  122. package/dist/seek-backwards.js +4 -1
  123. package/dist/seek-forwards.d.ts +3 -1
  124. package/dist/seek-forwards.js +3 -1
  125. package/dist/seeking-hints.d.ts +4 -1
  126. package/dist/set-seeking-hints.js +4 -0
  127. package/dist/skip.d.ts +5 -0
  128. package/dist/skip.js +6 -1
  129. package/dist/state/can-skip-tracks.d.ts +1 -0
  130. package/dist/state/can-skip-tracks.js +10 -6
  131. package/dist/state/iso-base-media/cached-sample-positions.d.ts +15 -1
  132. package/dist/state/iso-base-media/cached-sample-positions.js +9 -4
  133. package/dist/state/iso-base-media/iso-state.d.ts +5 -1
  134. package/dist/state/iso-base-media/iso-state.js +2 -1
  135. package/dist/state/iso-base-media/lazy-mfra-load.d.ts +3 -1
  136. package/dist/state/iso-base-media/lazy-mfra-load.js +2 -1
  137. package/dist/state/keyframes.js +1 -0
  138. package/dist/state/m3u-state.d.ts +15 -4
  139. package/dist/state/m3u-state.js +20 -0
  140. package/dist/state/matroska/lazy-cues-fetch.d.ts +3 -1
  141. package/dist/state/matroska/lazy-cues-fetch.js +2 -1
  142. package/dist/state/matroska/webm.d.ts +3 -1
  143. package/dist/state/matroska/webm.js +2 -1
  144. package/dist/state/parser-state.d.ts +29 -13
  145. package/dist/state/parser-state.js +19 -5
  146. package/dist/state/riff/lazy-idx1-fetch.d.ts +3 -1
  147. package/dist/state/riff/lazy-idx1-fetch.js +2 -1
  148. package/dist/state/riff.d.ts +3 -1
  149. package/dist/state/riff.js +2 -1
  150. package/dist/state/sample-callbacks.d.ts +3 -2
  151. package/dist/state/sample-callbacks.js +3 -3
  152. package/dist/version.d.ts +1 -1
  153. package/dist/version.js +1 -1
  154. package/dist/work-on-seek-request.d.ts +6 -3
  155. package/dist/work-on-seek-request.js +13 -13
  156. package/dist/worker/forward-controller-to-worker.js +1 -1
  157. package/dist/worker/serialize-error.js +26 -3
  158. package/dist/worker/worker-types.d.ts +7 -1
  159. package/dist/worker-server.js +2 -2
  160. package/package.json +3 -3
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /*
3
+ https://discord.com/channels/809501355504959528/1001500302375125055/1364798934832119870
4
+ Android 13 produces MP4 videos where first, all video samples are at the beginning,
5
+ then all audio samples are at the end.
6
+
7
+ This causes issues with our video decoder: "Waited too long for VideoDecoder" because
8
+ the overall progress is stuck.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.calculateJumpMarks = void 0;
12
+ // In WebCodecs, we require the tracks to deviate by at most 10 seconds
13
+ // Therefore, we need to emit them to be less than 10 seconds apart
14
+ const MAX_SPREAD_IN_SECONDS = 8;
15
+ const getKey = (samplePositionTrack) => {
16
+ return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.dts}`;
17
+ };
18
+ const findBestJump = ({ allSamplesSortedByOffset, visited, progresses, }) => {
19
+ var _a;
20
+ const minProgress = Math.min(...Object.values(progresses));
21
+ const trackNumberWithLowestProgress = (_a = Object.entries(progresses).find(([, progress]) => progress === minProgress)) === null || _a === void 0 ? void 0 : _a[0];
22
+ const firstSampleAboveMinProgress = allSamplesSortedByOffset.findIndex((sample) => sample.track.trackId === Number(trackNumberWithLowestProgress) &&
23
+ !visited.has(getKey(sample)));
24
+ return firstSampleAboveMinProgress;
25
+ };
26
+ const calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
27
+ const progresses = {};
28
+ for (const track of samplePositionTracks) {
29
+ progresses[track[0].track.trackId] = 0;
30
+ }
31
+ const jumpMarks = [];
32
+ const allSamplesSortedByOffset = samplePositionTracks
33
+ .flat(1)
34
+ .sort((a, b) => a.samplePosition.offset - b.samplePosition.offset);
35
+ let indexToVisit = 0;
36
+ const visited = new Set();
37
+ let rollOverToProcess = false;
38
+ const increaseIndex = () => {
39
+ indexToVisit++;
40
+ if (indexToVisit >= allSamplesSortedByOffset.length) {
41
+ rollOverToProcess = true;
42
+ indexToVisit = 0;
43
+ }
44
+ };
45
+ let lastVisitedSample = null;
46
+ const addJumpMark = ({ firstSampleAboveMinProgress, }) => {
47
+ if (!lastVisitedSample) {
48
+ throw new Error('no last visited sample');
49
+ }
50
+ const jumpMark = {
51
+ afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
52
+ jumpToOffset: allSamplesSortedByOffset[firstSampleAboveMinProgress].samplePosition
53
+ .offset,
54
+ };
55
+ indexToVisit = firstSampleAboveMinProgress;
56
+ jumpMarks.push(jumpMark);
57
+ };
58
+ const addFinalJumpIfNecessary = () => {
59
+ if (indexToVisit === allSamplesSortedByOffset.length - 1) {
60
+ return;
61
+ }
62
+ jumpMarks.push({
63
+ afterSampleWithOffset: allSamplesSortedByOffset[indexToVisit].samplePosition.offset,
64
+ jumpToOffset: endOfMdat,
65
+ });
66
+ };
67
+ const considerJump = () => {
68
+ const firstSampleAboveMinProgress = findBestJump({
69
+ allSamplesSortedByOffset,
70
+ visited,
71
+ progresses,
72
+ });
73
+ if (firstSampleAboveMinProgress > -1 &&
74
+ firstSampleAboveMinProgress !== indexToVisit + 1) {
75
+ addJumpMark({ firstSampleAboveMinProgress });
76
+ indexToVisit = firstSampleAboveMinProgress;
77
+ }
78
+ else {
79
+ while (true) {
80
+ increaseIndex();
81
+ if (!visited.has(getKey(allSamplesSortedByOffset[indexToVisit]))) {
82
+ break;
83
+ }
84
+ }
85
+ }
86
+ };
87
+ while (true) {
88
+ const currentSamplePosition = allSamplesSortedByOffset[indexToVisit];
89
+ const sampleKey = getKey(currentSamplePosition);
90
+ if (visited.has(sampleKey)) {
91
+ considerJump();
92
+ continue;
93
+ }
94
+ visited.add(sampleKey);
95
+ if (rollOverToProcess) {
96
+ if (!lastVisitedSample) {
97
+ throw new Error('no last visited sample');
98
+ }
99
+ jumpMarks.push({
100
+ afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
101
+ jumpToOffset: currentSamplePosition.samplePosition.offset,
102
+ });
103
+ rollOverToProcess = false;
104
+ }
105
+ lastVisitedSample = currentSamplePosition;
106
+ if (visited.size === allSamplesSortedByOffset.length) {
107
+ addFinalJumpIfNecessary();
108
+ break;
109
+ }
110
+ const timestamp = currentSamplePosition.samplePosition.dts /
111
+ currentSamplePosition.track.timescale;
112
+ progresses[currentSamplePosition.track.trackId] = timestamp;
113
+ const progressValues = Object.values(progresses);
114
+ const maxProgress = Math.max(...progressValues);
115
+ const minProgress = Math.min(...progressValues);
116
+ const spread = maxProgress - minProgress;
117
+ if (visited.size === allSamplesSortedByOffset.length) {
118
+ addFinalJumpIfNecessary();
119
+ break;
120
+ }
121
+ // Also don't allow audio progress to go more
122
+ if (spread > MAX_SPREAD_IN_SECONDS) {
123
+ considerJump();
124
+ }
125
+ else {
126
+ increaseIndex();
127
+ }
128
+ }
129
+ return jumpMarks;
130
+ };
131
+ exports.calculateJumpMarks = calculateJumpMarks;
@@ -1,3 +1,3 @@
1
- import type { Skip } from '../../../skip';
1
+ import type { FetchMoreData, Skip } from '../../../skip';
2
2
  import type { ParserState } from '../../../state/parser-state';
3
- export declare const parseMdatSection: (state: ParserState) => Promise<Skip | null>;
3
+ export declare const parseMdatSection: (state: ParserState) => Promise<Skip | FetchMoreData | null>;
@@ -8,6 +8,7 @@ const cached_sample_positions_1 = require("../../../state/iso-base-media/cached-
8
8
  const may_skip_video_data_1 = require("../../../state/may-skip-video-data");
9
9
  const video_section_1 = require("../../../state/video-section");
10
10
  const get_moov_atom_1 = require("../get-moov-atom");
11
+ const calculate_jump_marks_1 = require("./calculate-jump-marks");
11
12
  const postprocess_bytes_1 = require("./postprocess-bytes");
12
13
  const parseMdatSection = async (state) => {
13
14
  const mediaSection = (0, video_section_1.getCurrentMediaSection)({
@@ -37,9 +38,13 @@ const parseMdatSection = async (state) => {
37
38
  return (0, exports.parseMdatSection)(state);
38
39
  }
39
40
  if (!state.iso.flatSamples.getSamples(mediaSection.start)) {
40
- state.iso.flatSamples.setSamples(mediaSection.start, (0, cached_sample_positions_1.calculateFlatSamples)(state));
41
+ const flattedSamples = (0, cached_sample_positions_1.calculateFlatSamples)(state);
42
+ const calcedJumpMarks = (0, calculate_jump_marks_1.calculateJumpMarks)(flattedSamples, endOfMdat);
43
+ state.iso.flatSamples.setJumpMarks(mediaSection.start, calcedJumpMarks);
44
+ state.iso.flatSamples.setSamples(mediaSection.start, flattedSamples.flat(1));
41
45
  }
42
46
  const flatSamples = state.iso.flatSamples.getSamples(mediaSection.start);
47
+ const jumpMarks = state.iso.flatSamples.getJumpMarks(mediaSection.start);
43
48
  const { iterator } = state;
44
49
  const samplesWithIndex = flatSamples.find((sample) => {
45
50
  return sample.samplePosition.offset === iterator.counter.getOffset();
@@ -59,8 +64,15 @@ const parseMdatSection = async (state) => {
59
64
  // iphonevideo.mov has extra padding here, so let's make sure to jump ahead
60
65
  return (0, skip_1.makeSkip)(endOfMdat);
61
66
  }
67
+ // Corrupt file: Sample is beyond the end of the file. Don't process it.
68
+ if (samplesWithIndex.samplePosition.offset +
69
+ samplesWithIndex.samplePosition.size >
70
+ state.contentLength) {
71
+ return (0, skip_1.makeSkip)(endOfMdat);
72
+ }
73
+ // Need to fetch more data
62
74
  if (iterator.bytesRemaining() < samplesWithIndex.samplePosition.size) {
63
- return null;
75
+ return (0, skip_1.makeFetchMoreData)(samplesWithIndex.samplePosition.size - iterator.bytesRemaining());
64
76
  }
65
77
  const { cts, dts, duration, isKeyframe, offset, bigEndian, chunkSize } = samplesWithIndex.samplePosition;
66
78
  const bytes = (0, postprocess_bytes_1.postprocessBytes)({
@@ -114,6 +126,10 @@ const parseMdatSection = async (state) => {
114
126
  });
115
127
  await state.callbacks.onVideoSample(samplesWithIndex.track.trackId, videoSample);
116
128
  }
129
+ const jump = jumpMarks.find((j) => j.afterSampleWithOffset === offset);
130
+ if (jump) {
131
+ return (0, skip_1.makeSkip)(jump.jumpToOffset);
132
+ }
117
133
  return null;
118
134
  };
119
135
  exports.parseMdatSection = parseMdatSection;
@@ -1,9 +1,9 @@
1
- import type { VideoTrack } from '../../../get-tracks';
1
+ import type { AudioTrack, VideoTrack } from '../../../get-tracks';
2
2
  import type { IsoBaseMediaBox } from '../base-media-box';
3
- export declare const findBestSegmentFromTfra: ({ mfra, time, firstVideoTrack, timescale, }: {
3
+ export declare const findBestSegmentFromTfra: ({ mfra, time, firstTrack, timescale, }: {
4
4
  mfra: IsoBaseMediaBox[];
5
5
  time: number;
6
- firstVideoTrack: VideoTrack;
6
+ firstTrack: VideoTrack | AudioTrack;
7
7
  timescale: number;
8
8
  }) => {
9
9
  start: number;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findBestSegmentFromTfra = void 0;
4
- const findBestSegmentFromTfra = ({ mfra, time, firstVideoTrack, timescale, }) => {
5
- const tfra = mfra.find((b) => b.type === 'tfra-box' && b.trackId === firstVideoTrack.trackId);
4
+ const findBestSegmentFromTfra = ({ mfra, time, firstTrack, timescale, }) => {
5
+ const tfra = mfra.find((b) => b.type === 'tfra-box' && b.trackId === firstTrack.trackId);
6
6
  if (!tfra) {
7
7
  return null;
8
8
  }
@@ -1,12 +1,16 @@
1
1
  import type { MediaParserController } from '../../../controller/media-parser-controller';
2
+ import type { PrefetchCache } from '../../../fetch';
3
+ import type { LogLevel } from '../../../log';
2
4
  import type { ParseMediaSrc } from '../../../options';
3
5
  import type { ReaderInterface } from '../../../readers/reader';
4
- export declare const getMfraAtom: ({ src, contentLength, readerInterface, controller, parentSize, }: {
6
+ export declare const getMfraAtom: ({ src, contentLength, readerInterface, controller, parentSize, logLevel, prefetchCache, }: {
5
7
  src: ParseMediaSrc;
6
8
  contentLength: number;
7
9
  readerInterface: ReaderInterface;
8
10
  controller: MediaParserController;
9
11
  parentSize: number;
12
+ logLevel: LogLevel;
13
+ prefetchCache: PrefetchCache;
10
14
  }) => Promise<{
11
15
  startReadingBits: () => void;
12
16
  stopReadingBits: () => void;
@@ -2,11 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMfraAtom = void 0;
4
4
  const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
5
- const getMfraAtom = async ({ src, contentLength, readerInterface, controller, parentSize, }) => {
5
+ const getMfraAtom = async ({ src, contentLength, readerInterface, controller, parentSize, logLevel, prefetchCache, }) => {
6
6
  const result = await readerInterface.read({
7
7
  controller,
8
8
  range: [contentLength - parentSize, contentLength - 1],
9
9
  src,
10
+ logLevel,
11
+ prefetchCache,
10
12
  });
11
13
  const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(new Uint8Array(), parentSize);
12
14
  while (true) {
@@ -1,9 +1,13 @@
1
1
  import type { MediaParserController } from '../../../controller/media-parser-controller';
2
+ import type { PrefetchCache } from '../../../fetch';
3
+ import type { LogLevel } from '../../../log';
2
4
  import type { ParseMediaSrc } from '../../../options';
3
5
  import type { ReaderInterface } from '../../../readers/reader';
4
- export declare const getMfroAtom: ({ src, contentLength, readerInterface, controller, }: {
6
+ export declare const getMfroAtom: ({ src, contentLength, readerInterface, controller, logLevel, prefetchCache, }: {
5
7
  src: ParseMediaSrc;
6
8
  contentLength: number;
7
9
  readerInterface: ReaderInterface;
8
10
  controller: MediaParserController;
11
+ logLevel: LogLevel;
12
+ prefetchCache: PrefetchCache;
9
13
  }) => Promise<number | null>;
@@ -2,11 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMfroAtom = void 0;
4
4
  const buffer_iterator_1 = require("../../../iterator/buffer-iterator");
5
- const getMfroAtom = async ({ src, contentLength, readerInterface, controller, }) => {
5
+ const getMfroAtom = async ({ src, contentLength, readerInterface, controller, logLevel, prefetchCache, }) => {
6
6
  const result = await readerInterface.read({
7
7
  controller,
8
8
  range: [contentLength - 16, contentLength - 1],
9
9
  src,
10
+ logLevel,
11
+ prefetchCache,
10
12
  });
11
13
  const { value } = await result.reader.reader.read();
12
14
  if (!value) {
@@ -25,8 +25,11 @@ const parseIsoBaseMedia = async (state) => {
25
25
  },
26
26
  contentLength: state.contentLength,
27
27
  });
28
- if (result) {
29
- state.structure.getIsoStructure().boxes.push(result);
28
+ if (result.type === 'fetch-more-data') {
29
+ return result.bytesNeeded;
30
+ }
31
+ if (result.type === 'box') {
32
+ state.structure.getIsoStructure().boxes.push(result.box);
30
33
  }
31
34
  return null;
32
35
  };
@@ -1,26 +1,37 @@
1
1
  import type { BufferIterator } from '../../iterator/buffer-iterator';
2
2
  import type { LogLevel } from '../../log';
3
+ import type { FetchMoreData } from '../../skip';
3
4
  import type { TracksState } from '../../state/has-tracks-section';
4
5
  import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
5
- import type { SampleCallbacks } from '../../state/sample-callbacks';
6
+ import type { CallbacksState } from '../../state/sample-callbacks';
6
7
  import type { MediaSectionState } from '../../state/video-section';
7
8
  import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
8
- import type { BoxAndNext } from './base-media-box';
9
+ import type { IsoBaseMediaBox } from './base-media-box';
9
10
  export type OnlyIfMoovAtomExpected = {
10
11
  tracks: TracksState;
11
12
  isoState: IsoBaseMediaState | null;
12
13
  onVideoTrack: OnVideoTrack | null;
13
14
  onAudioTrack: OnAudioTrack | null;
14
- registerVideoSampleCallback: SampleCallbacks['registerVideoSampleCallback'];
15
- registerAudioSampleCallback: SampleCallbacks['registerAudioSampleCallback'];
15
+ registerVideoSampleCallback: CallbacksState['registerVideoSampleCallback'];
16
+ registerAudioSampleCallback: CallbacksState['registerAudioSampleCallback'];
16
17
  };
17
18
  export type OnlyIfMdatAtomExpected = {
18
19
  mediaSectionState: MediaSectionState;
19
20
  };
21
+ type ProcessBoxResult = {
22
+ type: 'box';
23
+ box: IsoBaseMediaBox;
24
+ } | {
25
+ type: 'nothing';
26
+ } | {
27
+ type: 'fetch-more-data';
28
+ bytesNeeded: FetchMoreData;
29
+ };
20
30
  export declare const processBox: ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMdatAtomExpected, contentLength, }: {
21
31
  iterator: BufferIterator;
22
32
  logLevel: LogLevel;
23
33
  onlyIfMoovAtomExpected: OnlyIfMoovAtomExpected | null;
24
34
  onlyIfMdatAtomExpected: OnlyIfMdatAtomExpected | null;
25
35
  contentLength: number;
26
- }) => Promise<BoxAndNext>;
36
+ }) => Promise<ProcessBoxResult>;
37
+ export {};