@remotion/media-parser 4.0.247 → 4.0.249

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 (92) hide show
  1. package/dist/boxes/avc/key.d.ts +1 -1
  2. package/dist/boxes/iso-base-media/get-children.d.ts +14 -0
  3. package/dist/boxes/iso-base-media/get-children.js +39 -0
  4. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -1
  5. package/dist/boxes/iso-base-media/mdat/mdat.js +10 -1
  6. package/dist/boxes/iso-base-media/moov/moov.js +2 -3
  7. package/dist/boxes/iso-base-media/parse-boxes.d.ts +15 -0
  8. package/dist/boxes/iso-base-media/parse-boxes.js +129 -0
  9. package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +12 -0
  10. package/dist/boxes/iso-base-media/parse-mdat-partially.js +33 -0
  11. package/dist/boxes/iso-base-media/process-box.d.ts +2 -21
  12. package/dist/boxes/iso-base-media/process-box.js +53 -270
  13. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -3
  14. package/dist/boxes/iso-base-media/stsd/samples.js +5 -9
  15. package/dist/boxes/iso-base-media/trak/trak.js +2 -3
  16. package/dist/boxes/mp3/get-duration.d.ts +2 -0
  17. package/dist/boxes/mp3/get-duration.js +30 -0
  18. package/dist/boxes/mp3/get-frame-length.d.ts +13 -0
  19. package/dist/boxes/mp3/get-frame-length.js +33 -0
  20. package/dist/boxes/mp3/get-metadata-from-mp3.d.ts +3 -0
  21. package/dist/boxes/mp3/get-metadata-from-mp3.js +8 -0
  22. package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +4 -0
  23. package/dist/boxes/mp3/get-tracks-from-mp3.js +25 -0
  24. package/dist/boxes/mp3/id3-v1.d.ts +2 -0
  25. package/dist/boxes/mp3/id3-v1.js +12 -0
  26. package/dist/boxes/mp3/id3-v2.d.ts +0 -0
  27. package/dist/boxes/mp3/id3-v2.js +1 -0
  28. package/dist/boxes/mp3/id3.d.ts +8 -0
  29. package/dist/boxes/mp3/id3.js +78 -0
  30. package/dist/boxes/mp3/parse-mp3.d.ts +8 -0
  31. package/dist/boxes/mp3/parse-mp3.js +57 -0
  32. package/dist/boxes/mp3/parse-mpeg-header.d.ts +6 -0
  33. package/dist/boxes/mp3/parse-mpeg-header.js +274 -0
  34. package/dist/boxes/mp3/samples-per-mpeg-file.d.ts +4 -0
  35. package/dist/boxes/mp3/samples-per-mpeg-file.js +26 -0
  36. package/dist/boxes/riff/continue-after-riff-result.d.ts +13 -0
  37. package/dist/boxes/riff/continue-after-riff-result.js +34 -0
  38. package/dist/boxes/riff/expect-riff-box.d.ts +3 -1
  39. package/dist/boxes/riff/expect-riff-box.js +4 -3
  40. package/dist/boxes/riff/parse-box.d.ts +1 -7
  41. package/dist/boxes/riff/parse-box.js +4 -120
  42. package/dist/boxes/riff/parse-list-box.d.ts +3 -1
  43. package/dist/boxes/riff/parse-list-box.js +4 -3
  44. package/dist/boxes/riff/parse-riff-body.d.ts +11 -0
  45. package/dist/boxes/riff/parse-riff-body.js +105 -0
  46. package/dist/boxes/riff/parse-riff-box.d.ts +3 -1
  47. package/dist/boxes/riff/parse-riff-box.js +2 -2
  48. package/dist/boxes/transport-stream/parse-transport-stream.js +30 -41
  49. package/dist/buffer-iterator.d.ts +6 -0
  50. package/dist/buffer-iterator.js +21 -0
  51. package/dist/continue-mdat-routine.d.ts +17 -0
  52. package/dist/continue-mdat-routine.js +92 -0
  53. package/dist/emit-available-info.js +38 -24
  54. package/dist/esm/index.mjs +1820 -1046
  55. package/dist/file-types/detect-file-type.js +4 -2
  56. package/dist/get-audio-codec.js +1 -1
  57. package/dist/get-container.js +5 -1
  58. package/dist/get-dimensions.d.ts +1 -1
  59. package/dist/get-dimensions.js +3 -0
  60. package/dist/get-duration.js +5 -1
  61. package/dist/get-fields-from-callbacks.js +1 -0
  62. package/dist/get-fps.js +3 -0
  63. package/dist/get-is-hdr.js +1 -1
  64. package/dist/get-keyframes.js +1 -1
  65. package/dist/get-tracks.d.ts +1 -1
  66. package/dist/get-tracks.js +10 -3
  67. package/dist/get-video-codec.js +1 -1
  68. package/dist/has-all-info.js +4 -3
  69. package/dist/index.d.ts +20 -2
  70. package/dist/may-skip-video-data/need-samples-for-fields.js +1 -0
  71. package/dist/metadata/get-metadata.d.ts +1 -0
  72. package/dist/metadata/get-metadata.js +16 -1
  73. package/dist/options.d.ts +12 -5
  74. package/dist/parse-media.js +48 -43
  75. package/dist/parse-result.d.ts +16 -1
  76. package/dist/parse-video.js +9 -10
  77. package/dist/state/can-skip-tracks.js +1 -0
  78. package/dist/state/emitted-fields.js +1 -0
  79. package/dist/state/images.d.ts +9 -0
  80. package/dist/state/images.js +14 -0
  81. package/dist/state/mp3.d.ts +11 -0
  82. package/dist/state/mp3.js +13 -0
  83. package/dist/state/parser-state.d.ts +13 -2
  84. package/dist/state/parser-state.js +8 -1
  85. package/dist/state/sample-callbacks.js +4 -1
  86. package/dist/state/slow-duration-fps.d.ts +2 -1
  87. package/dist/state/slow-duration-fps.js +52 -18
  88. package/dist/throttled-progress.d.ts +14 -0
  89. package/dist/throttled-progress.js +44 -0
  90. package/dist/version.d.ts +1 -1
  91. package/dist/version.js +1 -1
  92. package/package.json +3 -3
@@ -1,125 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseRiff = exports.parseRiffBody = void 0;
4
- const get_tracks_1 = require("../../get-tracks");
3
+ exports.parseRiff = void 0;
5
4
  const has_all_info_1 = require("../../has-all-info");
6
- const register_track_1 = require("../../register-track");
7
- const expect_riff_box_1 = require("./expect-riff-box");
8
- const get_tracks_from_avi_1 = require("./get-tracks-from-avi");
9
- const traversal_1 = require("./traversal");
10
- const continueAfterRiffBoxResult = ({ result, structure, iterator, maxOffset, state: options, }) => {
11
- if (result.type === 'incomplete') {
12
- return Promise.resolve({
13
- status: 'incomplete',
14
- async continueParsing() {
15
- return Promise.resolve(continueAfterRiffBoxResult({
16
- result: await result.continueParsing(),
17
- structure,
18
- iterator,
19
- maxOffset,
20
- state: options,
21
- }));
22
- },
23
- segments: structure,
24
- skipTo: null,
25
- });
26
- }
27
- if (result.type === 'complete' && result.box) {
28
- structure.boxes.push(result.box);
29
- }
30
- return (0, exports.parseRiffBody)({ iterator, maxOffset, state: options, structure });
31
- };
32
- const parseRiffBody = async ({ iterator, structure, maxOffset, state, }) => {
33
- while (iterator.bytesRemaining() > 0 &&
34
- iterator.counter.getOffset() < maxOffset) {
35
- const result = await (0, expect_riff_box_1.expectRiffBox)({
36
- iterator,
37
- state,
38
- structure,
39
- });
40
- if (result.type === 'complete' && result.skipTo !== null) {
41
- return {
42
- status: 'incomplete',
43
- skipTo: result.skipTo,
44
- continueParsing() {
45
- return Promise.resolve(continueAfterRiffBoxResult({
46
- iterator,
47
- maxOffset,
48
- state,
49
- result,
50
- structure,
51
- }));
52
- },
53
- };
54
- }
55
- if (result.type === 'incomplete') {
56
- return {
57
- status: 'incomplete',
58
- async continueParsing() {
59
- return Promise.resolve(continueAfterRiffBoxResult({
60
- iterator,
61
- maxOffset,
62
- state,
63
- result: await result.continueParsing(),
64
- structure,
65
- }));
66
- },
67
- skipTo: null,
68
- };
69
- }
70
- if (result.box === null) {
71
- continue;
72
- }
73
- structure.boxes.push(result.box);
74
- // When parsing an AVI
75
- if (result.box.type === 'list-box' && result.box.listType === 'hdrl') {
76
- const tracks = (0, get_tracks_1.getTracks)(structure, state);
77
- if (!tracks.videoTracks.some((t) => t.codec === get_tracks_from_avi_1.TO_BE_OVERRIDDEN_LATER)) {
78
- state.callbacks.tracks.setIsDone();
79
- }
80
- }
81
- // When parsing a WAV
82
- if (result.box.type === 'wave-format-box') {
83
- state.callbacks.tracks.setIsDone();
84
- }
85
- if (result.box.type === 'strf-box-video' ||
86
- result.box.type === 'strf-box-audio') {
87
- const strh = (0, traversal_1.getStrhBox)(structure.boxes);
88
- const strf = (0, traversal_1.getStrfBox)(structure.boxes);
89
- if (!strh || !strf) {
90
- throw new Error('strh or strf box missing');
91
- }
92
- if (strf.type === 'strf-box-audio' && state.onAudioTrack) {
93
- const audioTrack = (0, get_tracks_from_avi_1.makeAviAudioTrack)({
94
- index: state.riff.getNextTrackIndex(),
95
- strf,
96
- });
97
- await (0, register_track_1.registerTrack)({
98
- state,
99
- track: audioTrack,
100
- container: 'avi',
101
- });
102
- }
103
- if (state.onVideoTrack && strf.type === 'strf-box-video') {
104
- const videoTrack = (0, get_tracks_from_avi_1.makeAviVideoTrack)({
105
- strh,
106
- index: state.riff.getNextTrackIndex(),
107
- strf,
108
- });
109
- (0, register_track_1.registerVideoTrackWhenProfileIsAvailable)({
110
- state,
111
- track: videoTrack,
112
- container: 'avi',
113
- });
114
- }
115
- state.riff.incrementNextTrackIndex();
116
- }
117
- }
118
- return {
119
- status: 'done',
120
- };
121
- };
122
- exports.parseRiffBody = parseRiffBody;
5
+ const parse_riff_body_1 = require("./parse-riff-body");
123
6
  const parseRiff = ({ iterator, state, fields, }) => {
124
7
  const riff = iterator.getByteString(4, false);
125
8
  if (riff !== 'RIFF') {
@@ -141,11 +24,12 @@ const parseRiff = ({ iterator, state, fields, }) => {
141
24
  segments: structure,
142
25
  });
143
26
  }
144
- return (0, exports.parseRiffBody)({
27
+ return (0, parse_riff_body_1.parseRiffBody)({
145
28
  iterator,
146
29
  maxOffset: Infinity,
147
30
  state,
148
31
  structure,
32
+ fields,
149
33
  });
150
34
  };
151
35
  exports.parseRiff = parseRiff;
@@ -1,8 +1,10 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
+ import type { Options, ParseMediaFields } from '../../options';
2
3
  import type { ParserState } from '../../state/parser-state';
3
4
  import type { RiffBox } from './riff-box';
4
- export declare const parseListBox: ({ iterator, size, state, }: {
5
+ export declare const parseListBox: ({ iterator, size, state, fields, }: {
5
6
  iterator: BufferIterator;
6
7
  size: number;
7
8
  state: ParserState;
9
+ fields: Options<ParseMediaFields>;
8
10
  }) => Promise<RiffBox>;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseListBox = void 0;
4
- const parse_box_1 = require("./parse-box");
5
- const parseListBox = async ({ iterator, size, state, }) => {
4
+ const parse_riff_body_1 = require("./parse-riff-body");
5
+ const parseListBox = async ({ iterator, size, state, fields, }) => {
6
6
  const counter = iterator.counter.getOffset();
7
7
  const listType = iterator.getByteString(4, false);
8
8
  if (listType === 'movi') {
@@ -12,11 +12,12 @@ const parseListBox = async ({ iterator, size, state, }) => {
12
12
  type: 'riff',
13
13
  boxes: [],
14
14
  };
15
- const result = await (0, parse_box_1.parseRiffBody)({
15
+ const result = await (0, parse_riff_body_1.parseRiffBody)({
16
16
  structure,
17
17
  iterator,
18
18
  maxOffset: counter + size,
19
19
  state,
20
+ fields,
20
21
  });
21
22
  if (result.status === 'incomplete') {
22
23
  throw new Error(`Should only parse complete boxes (${listType})`);
@@ -0,0 +1,11 @@
1
+ import type { BufferIterator } from '../../buffer-iterator';
2
+ import type { Options, ParseMediaFields } from '../../options';
3
+ import type { ParseResult, RiffStructure } from '../../parse-result';
4
+ import type { ParserState } from '../../state/parser-state';
5
+ export declare const parseRiffBody: ({ iterator, structure, maxOffset, state, fields, }: {
6
+ iterator: BufferIterator;
7
+ structure: RiffStructure;
8
+ maxOffset: number;
9
+ state: ParserState;
10
+ fields: Options<ParseMediaFields>;
11
+ }) => Promise<ParseResult>;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRiffBody = void 0;
4
+ const get_tracks_1 = require("../../get-tracks");
5
+ const has_all_info_1 = require("../../has-all-info");
6
+ const register_track_1 = require("../../register-track");
7
+ const continue_after_riff_result_1 = require("./continue-after-riff-result");
8
+ const expect_riff_box_1 = require("./expect-riff-box");
9
+ const get_tracks_from_avi_1 = require("./get-tracks-from-avi");
10
+ const traversal_1 = require("./traversal");
11
+ const parseRiffBody = async ({ iterator, structure, maxOffset, state, fields, }) => {
12
+ while (iterator.bytesRemaining() > 0 &&
13
+ iterator.counter.getOffset() < maxOffset &&
14
+ !(0, has_all_info_1.hasAllInfo)({ fields, state })) {
15
+ const result = await (0, expect_riff_box_1.expectRiffBox)({
16
+ iterator,
17
+ state,
18
+ structure,
19
+ fields,
20
+ });
21
+ if (result.type === 'complete' && result.skipTo !== null) {
22
+ return {
23
+ status: 'incomplete',
24
+ skipTo: result.skipTo,
25
+ continueParsing() {
26
+ return Promise.resolve((0, continue_after_riff_result_1.continueAfterRiffBoxResult)({
27
+ iterator,
28
+ maxOffset,
29
+ state,
30
+ result,
31
+ structure,
32
+ fields,
33
+ }));
34
+ },
35
+ };
36
+ }
37
+ if (result.type === 'incomplete') {
38
+ return {
39
+ status: 'incomplete',
40
+ async continueParsing() {
41
+ return Promise.resolve((0, continue_after_riff_result_1.continueAfterRiffBoxResult)({
42
+ iterator,
43
+ maxOffset,
44
+ state,
45
+ result: await result.continueParsing(),
46
+ structure,
47
+ fields,
48
+ }));
49
+ },
50
+ skipTo: null,
51
+ };
52
+ }
53
+ if (result.box === null) {
54
+ continue;
55
+ }
56
+ structure.boxes.push(result.box);
57
+ // When parsing an AVI
58
+ if (result.box.type === 'list-box' && result.box.listType === 'hdrl') {
59
+ const tracks = (0, get_tracks_1.getTracks)(structure, state);
60
+ if (!tracks.videoTracks.some((t) => t.codec === get_tracks_from_avi_1.TO_BE_OVERRIDDEN_LATER)) {
61
+ state.callbacks.tracks.setIsDone();
62
+ }
63
+ }
64
+ // When parsing a WAV
65
+ if (result.box.type === 'wave-format-box') {
66
+ state.callbacks.tracks.setIsDone();
67
+ }
68
+ if (result.box.type === 'strf-box-video' ||
69
+ result.box.type === 'strf-box-audio') {
70
+ const strh = (0, traversal_1.getStrhBox)(structure.boxes);
71
+ const strf = (0, traversal_1.getStrfBox)(structure.boxes);
72
+ if (!strh || !strf) {
73
+ throw new Error('strh or strf box missing');
74
+ }
75
+ if (strf.type === 'strf-box-audio' && state.onAudioTrack) {
76
+ const audioTrack = (0, get_tracks_from_avi_1.makeAviAudioTrack)({
77
+ index: state.riff.getNextTrackIndex(),
78
+ strf,
79
+ });
80
+ await (0, register_track_1.registerTrack)({
81
+ state,
82
+ track: audioTrack,
83
+ container: 'avi',
84
+ });
85
+ }
86
+ if (state.onVideoTrack && strf.type === 'strf-box-video') {
87
+ const videoTrack = (0, get_tracks_from_avi_1.makeAviVideoTrack)({
88
+ strh,
89
+ index: state.riff.getNextTrackIndex(),
90
+ strf,
91
+ });
92
+ (0, register_track_1.registerVideoTrackWhenProfileIsAvailable)({
93
+ state,
94
+ track: videoTrack,
95
+ container: 'avi',
96
+ });
97
+ }
98
+ state.riff.incrementNextTrackIndex();
99
+ }
100
+ }
101
+ return {
102
+ status: 'done',
103
+ };
104
+ };
105
+ exports.parseRiffBody = parseRiffBody;
@@ -1,10 +1,12 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
+ import type { Options, ParseMediaFields } from '../../options';
2
3
  import type { ParserState } from '../../state/parser-state';
3
4
  import type { RiffBox } from './riff-box';
4
- export declare const parseRiffBox: ({ iterator, size, id, boxes, state, }: {
5
+ export declare const parseRiffBox: ({ iterator, size, id, boxes, state, fields, }: {
5
6
  iterator: BufferIterator;
6
7
  size: number;
7
8
  id: string;
8
9
  boxes: RiffBox[];
9
10
  state: ParserState;
11
+ fields: Options<ParseMediaFields>;
10
12
  }) => Promise<RiffBox>;
@@ -7,12 +7,12 @@ const parse_isft_1 = require("./parse-isft");
7
7
  const parse_list_box_1 = require("./parse-list-box");
8
8
  const parse_strf_1 = require("./parse-strf");
9
9
  const parse_strh_1 = require("./parse-strh");
10
- const parseRiffBox = ({ iterator, size, id, boxes, state, }) => {
10
+ const parseRiffBox = ({ iterator, size, id, boxes, state, fields, }) => {
11
11
  if (id === 'fmt') {
12
12
  return Promise.resolve((0, parse_fmt_box_1.parseFmtBox)({ iterator, boxes, size }));
13
13
  }
14
14
  if (id === 'LIST') {
15
- return (0, parse_list_box_1.parseListBox)({ iterator, size, state });
15
+ return (0, parse_list_box_1.parseListBox)({ iterator, size, state, fields });
16
16
  }
17
17
  if (id === 'ISFT') {
18
18
  return Promise.resolve((0, parse_isft_1.parseIsft)({ iterator, size }));
@@ -17,56 +17,45 @@ const parseTransportStream = async ({ iterator, state, streamBuffers, fields, ne
17
17
  });
18
18
  return Promise.resolve({
19
19
  status: 'done',
20
- segments: structure,
21
20
  });
22
21
  }
23
- while (true) {
24
- if ((0, has_all_info_1.hasAllInfo)({
25
- fields,
26
- state,
27
- })) {
28
- break;
29
- }
30
- if (iterator.bytesRemaining() < 188) {
31
- return Promise.resolve({
32
- status: 'incomplete',
33
- segments: structure,
34
- skipTo: null,
35
- continueParsing: () => {
36
- return (0, exports.parseTransportStream)({
37
- iterator,
38
- state,
39
- streamBuffers,
40
- fields,
41
- nextPesHeaderStore,
42
- });
43
- },
44
- });
45
- }
46
- const packet = await (0, parse_packet_1.parsePacket)({
22
+ const continueParsing = () => {
23
+ return (0, exports.parseTransportStream)({
47
24
  iterator,
48
- structure,
25
+ state,
49
26
  streamBuffers,
50
- parserState: state,
27
+ fields,
51
28
  nextPesHeaderStore,
52
29
  });
53
- if (packet) {
54
- structure.boxes.push(packet);
55
- break;
56
- }
30
+ };
31
+ if ((0, has_all_info_1.hasAllInfo)({
32
+ fields,
33
+ state,
34
+ })) {
35
+ return Promise.resolve({
36
+ status: 'done',
37
+ });
38
+ }
39
+ if (iterator.bytesRemaining() < 188) {
40
+ return Promise.resolve({
41
+ status: 'incomplete',
42
+ continueParsing,
43
+ skipTo: null,
44
+ });
45
+ }
46
+ const packet = await (0, parse_packet_1.parsePacket)({
47
+ iterator,
48
+ structure,
49
+ streamBuffers,
50
+ parserState: state,
51
+ nextPesHeaderStore,
52
+ });
53
+ if (packet) {
54
+ structure.boxes.push(packet);
57
55
  }
58
56
  return Promise.resolve({
59
- segments: structure,
60
57
  status: 'incomplete',
61
- continueParsing() {
62
- return (0, exports.parseTransportStream)({
63
- iterator,
64
- state,
65
- streamBuffers,
66
- fields,
67
- nextPesHeaderStore,
68
- });
69
- },
58
+ continueParsing,
70
59
  skipTo: null,
71
60
  });
72
61
  };
@@ -48,6 +48,9 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
48
48
  getPascalString: () => number[];
49
49
  getUint(length: number): number;
50
50
  getByteString(length: number, trimTrailingZeroes: boolean): string;
51
+ planBytes: (size: number) => {
52
+ discardRest: () => Uint8Array;
53
+ };
51
54
  getFloat64: () => number;
52
55
  readUntilNullTerminator: () => string;
53
56
  getFloat32: () => number;
@@ -62,5 +65,8 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
62
65
  expectNoMoreBytes: () => void;
63
66
  };
64
67
  readExpGolomb: () => number;
68
+ startCheckpoint: () => {
69
+ returnToCheckpoint: () => void;
70
+ };
65
71
  };
66
72
  export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
@@ -70,6 +70,14 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
70
70
  let view = new DataView(data.buffer);
71
71
  const counter = makeOffsetCounter();
72
72
  let discardAllowed = true;
73
+ const startCheckpoint = () => {
74
+ const checkpoint = counter.getOffset();
75
+ return {
76
+ returnToCheckpoint: () => {
77
+ counter.decrement(counter.getOffset() - checkpoint);
78
+ },
79
+ };
80
+ };
73
81
  const getSlice = (amount) => {
74
82
  const value = data.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
75
83
  counter.increment(amount);
@@ -501,6 +509,18 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
501
509
  }
502
510
  return new TextDecoder().decode(bytes).trim();
503
511
  },
512
+ planBytes: (size) => {
513
+ const currentOffset = counter.getOffset();
514
+ return {
515
+ discardRest: () => {
516
+ const toDiscard = size - (counter.getOffset() - currentOffset);
517
+ if (toDiscard < 0) {
518
+ throw new Error('read too many bytes');
519
+ }
520
+ return getSlice(toDiscard);
521
+ },
522
+ };
523
+ },
504
524
  getFloat64: () => {
505
525
  const val = view.getFloat64(counter.getDiscardedOffset());
506
526
  counter.increment(8);
@@ -520,6 +540,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
520
540
  allowDiscard,
521
541
  startBox,
522
542
  readExpGolomb,
543
+ startCheckpoint,
523
544
  };
524
545
  };
525
546
  exports.getArrayBufferIterator = getArrayBufferIterator;
@@ -0,0 +1,17 @@
1
+ import type { BufferIterator } from './buffer-iterator';
2
+ import type { LogLevel } from './log';
3
+ import type { Options, ParseMediaFields } from './options';
4
+ import type { IsoBaseMediaBox, ParseResult } from './parse-result';
5
+ import type { PartialMdatBox } from './parse-video';
6
+ import type { ParserState } from './state/parser-state';
7
+ export declare const continueMdatRoutine: ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, state, continueMdat, signal, logLevel, fields, }: {
8
+ iterator: BufferIterator;
9
+ maxBytes: number;
10
+ allowIncompleteBoxes: boolean;
11
+ initialBoxes: IsoBaseMediaBox[];
12
+ state: ParserState;
13
+ continueMdat: PartialMdatBox;
14
+ signal: AbortSignal | null;
15
+ logLevel: LogLevel;
16
+ fields: Options<ParseMediaFields>;
17
+ }) => Promise<ParseResult>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.continueMdatRoutine = void 0;
4
+ const parse_boxes_1 = require("./boxes/iso-base-media/parse-boxes");
5
+ const parse_mdat_partially_1 = require("./boxes/iso-base-media/parse-mdat-partially");
6
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
7
+ const has_all_info_1 = require("./has-all-info");
8
+ const may_skip_video_data_1 = require("./may-skip-video-data/may-skip-video-data");
9
+ const continueMdatRoutine = async ({ iterator, maxBytes, allowIncompleteBoxes, initialBoxes, state, continueMdat, signal, logLevel, fields, }) => {
10
+ var _a;
11
+ const initialOffset = iterator.counter.getOffset();
12
+ while (iterator.bytesRemaining() > 0 &&
13
+ iterator.counter.getOffset() - initialOffset < maxBytes) {
14
+ const result = await (0, parse_mdat_partially_1.parseMdatPartially)({
15
+ iterator,
16
+ boxSize: continueMdat.boxSize,
17
+ fileOffset: continueMdat.fileOffset,
18
+ parsedBoxes: initialBoxes,
19
+ state,
20
+ signal,
21
+ });
22
+ if (result.type === 'incomplete') {
23
+ throw new Error('Incomplete boxes are not allowed in this routine');
24
+ }
25
+ if (result.type === 'partial-mdat-box') {
26
+ return {
27
+ status: 'incomplete',
28
+ continueParsing: () => {
29
+ return Promise.resolve((0, exports.continueMdatRoutine)({
30
+ iterator,
31
+ maxBytes,
32
+ allowIncompleteBoxes,
33
+ initialBoxes,
34
+ state,
35
+ continueMdat: result,
36
+ signal,
37
+ logLevel,
38
+ fields,
39
+ }));
40
+ },
41
+ skipTo: null,
42
+ };
43
+ }
44
+ const alreadyHasMdat = (_a = state.structure
45
+ .getStructureOrNull()) === null || _a === void 0 ? void 0 : _a.boxes.find((b) => b.type === 'mdat-box');
46
+ if (result.box.type === 'mdat-box' && alreadyHasMdat) {
47
+ initialBoxes = initialBoxes.filter((b) => b.type !== 'mdat-box');
48
+ initialBoxes.push(result.box);
49
+ iterator.allowDiscard();
50
+ break;
51
+ }
52
+ else {
53
+ initialBoxes.push(result.box);
54
+ if ((0, has_all_info_1.hasAllInfo)({ fields, state })) {
55
+ return {
56
+ status: 'done',
57
+ };
58
+ }
59
+ }
60
+ iterator.removeBytesRead();
61
+ }
62
+ const mdatState = (0, traversal_1.getMdatBox)(initialBoxes);
63
+ const skipped = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-skipped' &&
64
+ !(0, may_skip_video_data_1.maySkipVideoData)({ state }) &&
65
+ state.supportsContentRange;
66
+ const buffered = (mdatState === null || mdatState === void 0 ? void 0 : mdatState.status) === 'samples-buffered' && !(0, may_skip_video_data_1.maySkipVideoData)({ state });
67
+ if (skipped || buffered) {
68
+ return {
69
+ status: 'incomplete',
70
+ continueParsing: () => {
71
+ if (buffered) {
72
+ iterator.skipTo(mdatState.fileOffset, false);
73
+ }
74
+ return (0, parse_boxes_1.parseIsoBaseMediaBoxes)({
75
+ iterator,
76
+ maxBytes,
77
+ allowIncompleteBoxes: false,
78
+ initialBoxes,
79
+ state,
80
+ signal,
81
+ logLevel,
82
+ fields,
83
+ });
84
+ },
85
+ skipTo: skipped ? mdatState.fileOffset : null,
86
+ };
87
+ }
88
+ return {
89
+ status: 'done',
90
+ };
91
+ };
92
+ exports.continueMdatRoutine = continueMdatRoutine;