@remotion/media-parser 4.0.200 → 4.0.202

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 (180) hide show
  1. package/dist/av1-codec-string.d.ts +5 -0
  2. package/dist/av1-codec-string.js +18 -1
  3. package/dist/bitstream/av1.d.ts +2 -0
  4. package/dist/bitstream/av1.js +12 -0
  5. package/dist/boxes/iso-base-media/avcc-hvcc.d.ts +20 -0
  6. package/dist/boxes/iso-base-media/avcc-hvcc.js +73 -0
  7. package/dist/boxes/iso-base-media/avcc.d.ts +18 -0
  8. package/dist/boxes/iso-base-media/avcc.js +27 -0
  9. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +21 -0
  10. package/dist/boxes/iso-base-media/esds-descriptors.js +62 -0
  11. package/dist/boxes/iso-base-media/esds.d.ts +15 -0
  12. package/dist/boxes/iso-base-media/esds.js +27 -0
  13. package/dist/boxes/iso-base-media/mdat/mdat.js +2 -1
  14. package/dist/boxes/iso-base-media/moov/moov.js +1 -0
  15. package/dist/boxes/iso-base-media/mvhd.js +2 -2
  16. package/dist/boxes/iso-base-media/process-box.d.ts +4 -2
  17. package/dist/boxes/iso-base-media/process-box.js +56 -40
  18. package/dist/boxes/iso-base-media/stsd/keys.js +1 -1
  19. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
  20. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
  21. package/dist/boxes/iso-base-media/stsd/samples.js +3 -0
  22. package/dist/boxes/iso-base-media/stsd/stco.d.ts +3 -2
  23. package/dist/boxes/iso-base-media/stsd/stco.js +2 -2
  24. package/dist/boxes/iso-base-media/trak/trak.js +1 -0
  25. package/dist/boxes/webm/av1-codec-private.js +1 -1
  26. package/dist/boxes/webm/bitstream/av1.js +10 -1
  27. package/dist/boxes/webm/description.d.ts +2 -2
  28. package/dist/boxes/webm/description.js +2 -2
  29. package/dist/boxes/webm/ebml.d.ts +2 -2
  30. package/dist/boxes/webm/ebml.js +23 -1
  31. package/dist/boxes/webm/get-ready-tracks.d.ts +1 -1
  32. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  33. package/dist/boxes/webm/get-sample-from-block.d.ts +17 -0
  34. package/dist/boxes/webm/get-sample-from-block.js +78 -0
  35. package/dist/boxes/webm/get-track.d.ts +2 -2
  36. package/dist/boxes/webm/get-track.js +26 -25
  37. package/dist/boxes/webm/make-header.d.ts +3 -1
  38. package/dist/boxes/webm/make-header.js +90 -32
  39. package/dist/boxes/webm/parse-ebml.d.ts +12 -0
  40. package/dist/boxes/webm/parse-ebml.js +175 -0
  41. package/dist/boxes/webm/parse-webm-header.js +8 -9
  42. package/dist/boxes/webm/segments/all-segments.d.ts +572 -1
  43. package/dist/boxes/webm/segments/all-segments.js +353 -2
  44. package/dist/boxes/webm/segments/track-entry.d.ts +5 -189
  45. package/dist/boxes/webm/segments/track-entry.js +2 -457
  46. package/dist/boxes/webm/segments.d.ts +3 -16
  47. package/dist/boxes/webm/segments.js +40 -219
  48. package/dist/boxes/webm/traversal.d.ts +5 -5
  49. package/dist/boxes/webm/traversal.js +17 -6
  50. package/dist/buffer-iterator.d.ts +10 -7
  51. package/dist/buffer-iterator.js +83 -7
  52. package/dist/create/create-media.d.ts +2 -0
  53. package/dist/create/create-media.js +36 -0
  54. package/dist/create/matroska-header.d.ts +1 -0
  55. package/dist/create/matroska-header.js +66 -0
  56. package/dist/create/matroska-info.d.ts +4 -0
  57. package/dist/create/matroska-info.js +39 -0
  58. package/dist/create/matroska-segment.d.ts +1 -0
  59. package/dist/create/matroska-segment.js +12 -0
  60. package/dist/create/matroska-trackentry.d.ts +21 -0
  61. package/dist/create/matroska-trackentry.js +191 -0
  62. package/dist/create-media.d.ts +1 -0
  63. package/dist/create-media.js +78 -0
  64. package/dist/from-fetch.js +13 -3
  65. package/dist/from-input-type-file.d.ts +2 -0
  66. package/dist/from-input-type-file.js +37 -0
  67. package/dist/from-node.js +9 -2
  68. package/dist/from-web-file.js +6 -1
  69. package/dist/from-web.js +15 -6
  70. package/dist/get-audio-codec.d.ts +2 -2
  71. package/dist/get-audio-codec.js +13 -13
  72. package/dist/get-codec.d.ts +4 -0
  73. package/dist/get-codec.js +22 -0
  74. package/dist/get-duration.js +12 -14
  75. package/dist/get-sample-positions.js +1 -1
  76. package/dist/get-tracks.js +2 -2
  77. package/dist/get-video-codec.js +13 -13
  78. package/dist/has-all-info.js +1 -1
  79. package/dist/options.d.ts +3 -2
  80. package/dist/parse-media.js +17 -10
  81. package/dist/parse-video.js +16 -0
  82. package/dist/parser-context.d.ts +1 -0
  83. package/dist/parser-state.d.ts +4 -3
  84. package/dist/parser-state.js +16 -3
  85. package/dist/reader.d.ts +1 -1
  86. package/dist/readers/from-fetch.d.ts +2 -0
  87. package/dist/readers/from-fetch.js +64 -0
  88. package/dist/readers/from-node.d.ts +2 -0
  89. package/dist/readers/from-node.js +40 -0
  90. package/dist/readers/from-web-file.d.ts +2 -0
  91. package/dist/readers/from-web-file.js +39 -0
  92. package/dist/readers/reader.d.ts +11 -0
  93. package/dist/readers/reader.js +2 -0
  94. package/dist/traversal.d.ts +19 -17
  95. package/dist/traversal.js +38 -39
  96. package/dist/web-file.d.ts +2 -0
  97. package/dist/web-file.js +37 -0
  98. package/dist/writers/web-fs.d.ts +2 -0
  99. package/dist/writers/web-fs.js +28 -0
  100. package/dist/writers/writer.d.ts +9 -0
  101. package/dist/writers/writer.js +2 -0
  102. package/input.webm +0 -0
  103. package/package.json +2 -2
  104. package/src/boxes/iso-base-media/mdat/mdat.ts +2 -1
  105. package/src/boxes/iso-base-media/moov/moov.ts +1 -0
  106. package/src/boxes/iso-base-media/mvhd.ts +2 -2
  107. package/src/boxes/iso-base-media/process-box.ts +70 -40
  108. package/src/boxes/iso-base-media/stsd/keys.ts +1 -1
  109. package/src/boxes/iso-base-media/stsd/mebx.ts +3 -0
  110. package/src/boxes/iso-base-media/stsd/samples.ts +3 -0
  111. package/src/boxes/iso-base-media/stsd/stco.ts +5 -3
  112. package/src/boxes/iso-base-media/trak/trak.ts +1 -0
  113. package/src/boxes/webm/av1-codec-private.ts +1 -1
  114. package/src/boxes/webm/description.ts +7 -4
  115. package/src/boxes/webm/ebml.ts +24 -4
  116. package/src/boxes/webm/get-ready-tracks.ts +4 -4
  117. package/src/boxes/webm/get-sample-from-block.ts +125 -0
  118. package/src/boxes/webm/get-track.ts +38 -31
  119. package/src/boxes/webm/make-header.ts +129 -32
  120. package/src/boxes/webm/parse-ebml.ts +247 -0
  121. package/src/boxes/webm/parse-webm-header.ts +8 -12
  122. package/src/boxes/webm/segments/all-segments.ts +539 -1
  123. package/src/boxes/webm/segments/track-entry.ts +5 -843
  124. package/src/boxes/webm/segments.ts +48 -435
  125. package/src/boxes/webm/traversal.ts +28 -15
  126. package/src/buffer-iterator.ts +104 -10
  127. package/src/from-fetch.ts +22 -3
  128. package/src/from-node.ts +18 -4
  129. package/src/from-web-file.ts +11 -1
  130. package/src/get-audio-codec.ts +14 -16
  131. package/src/get-duration.ts +15 -16
  132. package/src/get-sample-positions.ts +1 -1
  133. package/src/get-tracks.ts +2 -2
  134. package/src/get-video-codec.ts +13 -15
  135. package/src/has-all-info.ts +1 -1
  136. package/src/options.ts +3 -2
  137. package/src/parse-media.ts +20 -9
  138. package/src/parse-video.ts +17 -0
  139. package/src/parser-context.ts +1 -0
  140. package/src/parser-state.ts +22 -5
  141. package/src/reader.ts +1 -0
  142. package/src/test/create-matroska.test.ts +255 -7
  143. package/src/test/matroska.test.ts +311 -334
  144. package/src/test/mvhd.test.ts +1 -1
  145. package/src/test/parse-esds.test.ts +2 -2
  146. package/src/test/parse-stco.test.ts +4 -2
  147. package/src/test/parse-stsc.test.ts +2 -2
  148. package/src/test/parse-stsz.test.ts +2 -2
  149. package/src/test/parse-stts.test.ts +1 -1
  150. package/src/test/stream-local.test.ts +23 -9
  151. package/src/test/stream-remote.test.ts +23 -19
  152. package/src/test/stsd.test.ts +6 -2
  153. package/src/test/tkhd.test.ts +1 -1
  154. package/src/traversal.ts +62 -85
  155. package/tsconfig.tsbuildinfo +1 -1
  156. package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
  157. package/dist/boxes/iso-base-media/ftype.js +0 -31
  158. package/dist/get-video-metadata.d.ts +0 -2
  159. package/dist/get-video-metadata.js +0 -44
  160. package/dist/read-and-increment-offset.d.ts +0 -28
  161. package/dist/read-and-increment-offset.js +0 -177
  162. package/dist/understand-vorbis.d.ts +0 -1
  163. package/dist/understand-vorbis.js +0 -12
  164. package/src/boxes/webm/segments/duration.ts +0 -29
  165. package/src/boxes/webm/segments/info.ts +0 -34
  166. package/src/boxes/webm/segments/main.ts +0 -6
  167. package/src/boxes/webm/segments/muxing.ts +0 -18
  168. package/src/boxes/webm/segments/seek-head.ts +0 -34
  169. package/src/boxes/webm/segments/seek-position.ts +0 -18
  170. package/src/boxes/webm/segments/seek.ts +0 -45
  171. package/src/boxes/webm/segments/timestamp-scale.ts +0 -17
  172. package/src/boxes/webm/segments/tracks.ts +0 -32
  173. package/src/boxes/webm/segments/unknown.ts +0 -19
  174. package/src/boxes/webm/segments/void.ts +0 -18
  175. package/src/boxes/webm/segments/writing.ts +0 -18
  176. package/src/combine-uint8array.ts +0 -13
  177. /package/dist/{boxes/webm/bitstream/av1/frame.d.ts → get-samples.d.ts} +0 -0
  178. /package/dist/{boxes/webm/bitstream/av1/frame.js → get-samples.js} +0 -0
  179. /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.d.ts → sample-aspect-ratio.d.ts} +0 -0
  180. /package/dist/{boxes/webm/bitstream/h264/get-h264-descriptor.js → sample-aspect-ratio.js} +0 -0
@@ -1,226 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.expectSegment = void 0;
4
- const add_new_matroska_tracks_1 = require("../../add-new-matroska-tracks");
5
- const get_track_1 = require("./get-track");
6
- const all_segments_1 = require("./segments/all-segments");
7
- const duration_1 = require("./segments/duration");
8
- const info_1 = require("./segments/info");
9
- const muxing_1 = require("./segments/muxing");
4
+ const parse_ebml_1 = require("./parse-ebml");
10
5
  const parse_children_1 = require("./segments/parse-children");
11
- const seek_1 = require("./segments/seek");
12
- const seek_head_1 = require("./segments/seek-head");
13
- const seek_position_1 = require("./segments/seek-position");
14
- const timestamp_scale_1 = require("./segments/timestamp-scale");
15
- const track_entry_1 = require("./segments/track-entry");
16
- const tracks_1 = require("./segments/tracks");
17
- const unknown_1 = require("./segments/unknown");
18
- const void_1 = require("./segments/void");
19
- const writing_1 = require("./segments/writing");
20
- const parseSegment = async ({ segmentId, iterator, length, parserContext, }) => {
6
+ const parseSegment = async ({ segmentId, iterator, length, parserContext, headerReadSoFar, }) => {
21
7
  if (length === 0) {
22
8
  throw new Error(`Expected length of ${segmentId} to be greater than 0`);
23
9
  }
24
- if (segmentId === '0x') {
25
- return {
26
- type: 'unknown-segment',
27
- id: segmentId,
28
- };
29
- }
30
- // Log this to debug
31
- /*
32
- console.log(
33
- 'segmentId',
34
- segmentId,
35
- getSegmentName(segmentId),
36
- iterator.counter.getOffset(),
37
- );
38
- */
39
- if (segmentId === '0x114d9b74') {
40
- return (0, seek_head_1.parseSeekHeadSegment)(iterator, length, parserContext);
41
- }
42
- if (segmentId === '0x53ab') {
43
- return (0, seek_1.parseSeekIdSegment)(iterator);
44
- }
45
- if (segmentId === '0x4dbb') {
46
- return (0, seek_1.parseSeekSegment)(iterator, length, parserContext);
47
- }
48
- if (segmentId === '0x53ac') {
49
- return (0, seek_position_1.parseSeekPositionSegment)(iterator, length);
50
- }
51
- if (segmentId === '0xec') {
52
- return (0, void_1.parseVoidSegment)(iterator, length);
53
- }
54
- if (segmentId === '0x1549a966') {
55
- return (0, info_1.parseInfoSegment)(iterator, length, parserContext);
56
- }
57
- if (segmentId === all_segments_1.matroskaElements.TimestampScale) {
58
- const timestampScale = (0, timestamp_scale_1.parseTimestampScaleSegment)(iterator);
59
- parserContext.parserState.setTimescale(timestampScale.timestampScale);
60
- return timestampScale;
61
- }
62
- if (segmentId === '0x4d80') {
63
- return (0, muxing_1.parseMuxingSegment)(iterator, length);
64
- }
65
- if (segmentId === '0x5741') {
66
- return (0, writing_1.parseWritingSegment)(iterator, length);
67
- }
68
- if (segmentId === '0x4489') {
69
- return (0, duration_1.parseDurationSegment)(iterator, length);
70
- }
71
- if (segmentId === '0x1654ae6b') {
72
- return (0, tracks_1.parseTracksSegment)(iterator, length, parserContext);
73
- }
74
- if (segmentId === all_segments_1.matroskaElements.TrackEntry) {
75
- const trackEntry = await (0, track_entry_1.parseTrackEntry)(iterator, length, parserContext);
76
- parserContext.parserState.onTrackEntrySegment(trackEntry);
77
- const track = (0, get_track_1.getTrack)({
78
- track: trackEntry,
79
- timescale: parserContext.parserState.getTimescale(),
80
- });
81
- if (track) {
82
- await (0, add_new_matroska_tracks_1.registerTrack)({
83
- state: parserContext.parserState,
84
- options: parserContext,
85
- track,
86
- });
87
- }
88
- return trackEntry;
89
- }
90
- if (segmentId === '0xd7') {
91
- return (0, track_entry_1.parseTrackNumber)(iterator, length);
92
- }
93
- if (segmentId === '0x73c5') {
94
- return (0, track_entry_1.parseTrackUID)(iterator, length);
95
- }
96
- if (segmentId === '0x9c') {
97
- return (0, track_entry_1.parseFlagLacing)(iterator, length);
98
- }
99
- if (segmentId === '0x22b59c') {
100
- return (0, track_entry_1.parseLanguageSegment)(iterator, length);
101
- }
102
- if (segmentId === '0x86') {
103
- return (0, track_entry_1.parseCodecSegment)(iterator, length);
104
- }
105
- if (segmentId === '0x83') {
106
- return (0, track_entry_1.parseTrackTypeSegment)(iterator, length);
107
- }
108
- if (segmentId === '0x55ee') {
109
- return (0, track_entry_1.parseMaxBlockAdditionId)(iterator, length);
110
- }
111
- if (segmentId === '0x55b0') {
112
- return (0, track_entry_1.parseColorSegment)(iterator, length);
113
- }
114
- if (segmentId === '0x23e383') {
115
- return (0, track_entry_1.parseDefaultDurationSegment)(iterator, length);
116
- }
117
- if (segmentId === '0xe0') {
118
- return (0, track_entry_1.parseVideoSegment)(iterator, length, parserContext);
119
- }
120
- if (segmentId === '0xe1') {
121
- return (0, track_entry_1.parseAudioSegment)(iterator, length, parserContext);
122
- }
123
- if (segmentId === '0xb0') {
124
- return (0, track_entry_1.parseWidthSegment)(iterator, length);
125
- }
126
- if (segmentId === '0xba') {
127
- return (0, track_entry_1.parseHeightSegment)(iterator, length);
128
- }
129
- if (segmentId === all_segments_1.matroskaElements.DisplayWidth) {
130
- return (0, track_entry_1.parseDisplayWidthSegment)(iterator, length);
131
- }
132
- if (segmentId === all_segments_1.matroskaElements.DisplayHeight) {
133
- return (0, track_entry_1.parseDisplayHeightSegment)(iterator, length);
134
- }
135
- if (segmentId === '0x9a') {
136
- return (0, track_entry_1.parseInterlacedSegment)(iterator, length);
137
- }
138
- if (segmentId === '0x53c0') {
139
- return (0, track_entry_1.parseAlphaModeSegment)(iterator, length);
140
- }
141
- if (segmentId === '0x63a2') {
142
- return (0, track_entry_1.parseCodecPrivateSegment)(iterator, length);
143
- }
144
- if (segmentId === '0x7ba9') {
145
- return (0, track_entry_1.parseTitleSegment)(iterator, length);
146
- }
147
- if (segmentId === '0xbf') {
148
- return (0, track_entry_1.parseCrc32Segment)(iterator, length);
149
- }
150
- if (segmentId === '0x73a4') {
151
- return (0, track_entry_1.parseSegmentUUIDSegment)(iterator, length);
152
- }
153
- if (segmentId === '0x88') {
154
- return (0, track_entry_1.parseDefaultFlagSegment)(iterator, length);
155
- }
156
- if (segmentId === '0x1254c367') {
157
- return (0, track_entry_1.parseTagsSegment)(iterator, length, parserContext);
158
- }
159
- if (segmentId === '0x7373') {
160
- return (0, track_entry_1.parseTagSegment)(iterator, length);
161
- }
162
- if (segmentId === all_segments_1.matroskaElements.SamplingFrequency) {
163
- return (0, track_entry_1.parseSamplingFrequencySegment)(iterator, length);
164
- }
165
- if (segmentId === all_segments_1.matroskaElements.Channels) {
166
- return (0, track_entry_1.parseChannelsSegment)(iterator, length);
167
- }
168
- if (segmentId === all_segments_1.matroskaElements.BitDepth) {
169
- return (0, track_entry_1.parseBitDepthSegment)(iterator, length);
170
- }
171
- if (segmentId === all_segments_1.matroskaElements.Timestamp) {
172
- const offset = iterator.counter.getOffset();
173
- const timestampSegment = (0, track_entry_1.parseTimestampSegment)(iterator, length);
174
- parserContext.parserState.setTimestampOffset(offset, timestampSegment.timestamp);
175
- return timestampSegment;
176
- }
177
- if (segmentId === all_segments_1.matroskaElements.SimpleBlock ||
178
- segmentId === all_segments_1.matroskaElements.Block) {
179
- return (0, track_entry_1.parseSimpleBlockOrBlockSegment)({
180
- iterator,
181
- length,
182
- parserContext,
183
- type: segmentId,
184
- });
185
- }
186
- if (segmentId === all_segments_1.matroskaElements.ReferenceBlock) {
187
- return (0, track_entry_1.parseReferenceBlockSegment)(iterator, length);
188
- }
189
- if (segmentId === all_segments_1.matroskaElements.BlockAdditions) {
190
- return (0, track_entry_1.parseBlockAdditionsSegment)(iterator, length);
191
- }
192
- if (segmentId === '0xa0') {
193
- const blockGroup = await (0, track_entry_1.parseBlockGroupSegment)(iterator, length, parserContext);
194
- // Blocks don't have information about keyframes.
195
- // https://ffmpeg.org/pipermail/ffmpeg-devel/2015-June/173825.html
196
- // "For Blocks, keyframes is
197
- // inferred by the absence of ReferenceBlock element (as done by matroskadec).""
198
- const block = blockGroup.children.find((c) => c.type === 'simple-block-or-block-segment');
199
- if (!block || block.type !== 'simple-block-or-block-segment') {
200
- throw new Error('Expected block segment');
201
- }
202
- const hasReferenceBlock = blockGroup.children.find((c) => c.type === 'reference-block-segment');
203
- const partialVideoSample = block.videoSample;
204
- if (partialVideoSample) {
205
- const completeFrame = {
206
- ...partialVideoSample,
207
- type: hasReferenceBlock ? 'delta' : 'key',
208
- };
209
- await parserContext.parserState.onVideoSample(partialVideoSample.trackId, completeFrame);
210
- }
211
- return blockGroup;
212
- }
213
- if (segmentId === '0xa1') {
214
- return (0, track_entry_1.parseBlockElementSegment)(iterator, length);
215
- }
216
- const bytesRemaining = iterator.byteLength() - iterator.counter.getOffset();
217
- const toDiscard = Math.min(bytesRemaining, length > 0 ? length : bytesRemaining);
218
- const child = (0, unknown_1.parseUnknownSegment)(iterator, segmentId, toDiscard);
219
- return child;
10
+ iterator.counter.decrement(headerReadSoFar);
11
+ const offset = iterator.counter.getOffset();
12
+ const ebml = await (0, parse_ebml_1.parseEbml)(iterator, parserContext);
13
+ const remapped = await (0, parse_ebml_1.postprocessEbml)({ offset, ebml, parserContext });
14
+ return remapped;
220
15
  };
221
16
  const expectSegment = async (iterator, parserContext) => {
222
- const bytesRemaining_ = iterator.bytesRemaining();
223
- if (bytesRemaining_ === 0) {
17
+ const offset = iterator.counter.getOffset();
18
+ if (iterator.bytesRemaining() === 0) {
224
19
  return {
225
20
  status: 'incomplete',
226
21
  segments: [],
@@ -230,9 +25,32 @@ const expectSegment = async (iterator, parserContext) => {
230
25
  skipTo: null,
231
26
  };
232
27
  }
233
- const offset = iterator.counter.getOffset();
234
28
  const segmentId = iterator.getMatroskaSegmentId();
29
+ if (segmentId === null) {
30
+ iterator.counter.decrement(iterator.counter.getOffset() - offset);
31
+ return {
32
+ status: 'incomplete',
33
+ segments: [],
34
+ continueParsing: () => {
35
+ return Promise.resolve((0, exports.expectSegment)(iterator, parserContext));
36
+ },
37
+ skipTo: null,
38
+ };
39
+ }
40
+ const offsetBeforeVInt = iterator.counter.getOffset();
235
41
  const length = iterator.getVint();
42
+ const offsetAfterVInt = iterator.counter.getOffset();
43
+ if (length === null) {
44
+ iterator.counter.decrement(iterator.counter.getOffset() - offset);
45
+ return {
46
+ status: 'incomplete',
47
+ segments: [],
48
+ continueParsing: () => {
49
+ return Promise.resolve((0, exports.expectSegment)(iterator, parserContext));
50
+ },
51
+ skipTo: null,
52
+ };
53
+ }
236
54
  const bytesRemainingNow = iterator.byteLength() - iterator.counter.getOffset();
237
55
  if (segmentId === '0x18538067' || segmentId === '0x1f43b675') {
238
56
  const main = await (0, parse_children_1.expectChildren)({
@@ -241,12 +59,14 @@ const expectSegment = async (iterator, parserContext) => {
241
59
  initialChildren: [],
242
60
  wrap: segmentId === '0x18538067'
243
61
  ? (s) => ({
244
- type: 'main-segment',
245
- children: s,
62
+ type: 'Segment',
63
+ value: s,
64
+ minVintWidth: offsetAfterVInt - offsetBeforeVInt,
246
65
  })
247
66
  : (s) => ({
248
- type: 'cluster-segment',
249
- children: s,
67
+ type: 'Cluster',
68
+ value: s,
69
+ minVintWidth: offsetAfterVInt - offsetBeforeVInt,
250
70
  }),
251
71
  parserContext,
252
72
  });
@@ -280,6 +100,7 @@ const expectSegment = async (iterator, parserContext) => {
280
100
  iterator,
281
101
  length,
282
102
  parserContext,
103
+ headerReadSoFar: iterator.counter.getOffset() - offset,
283
104
  });
284
105
  return {
285
106
  status: 'done',
@@ -1,7 +1,7 @@
1
1
  import type { AnySegment } from '../../parse-result';
2
- import type { MainSegment } from './segments/main';
3
- import type { CodecSegment, TrackEntrySegment } from './segments/track-entry';
2
+ import type { CodecIdSegment, MainSegment, TrackEntry } from './segments/all-segments';
4
3
  export declare const getMainSegment: (segments: AnySegment[]) => MainSegment | null;
5
- export declare const getTrackNumber: (track: TrackEntrySegment) => number | null;
6
- export declare const getTrackCodec: (track: TrackEntrySegment) => CodecSegment | null;
7
- export declare const getTrackByNumber: (tracks: TrackEntrySegment[], id: number) => TrackEntrySegment | undefined;
4
+ export declare const getTrackNumber: (track: TrackEntry) => import("./segments/all-segments").UintWithSize | null;
5
+ export declare const getTrackCodec: (track: TrackEntry) => CodecIdSegment | null;
6
+ export declare const getTrackTimestampScale: (track: TrackEntry) => import("./segments/all-segments").FloatWithSize | null;
7
+ export declare const getTrackByNumber: (tracks: TrackEntry[], id: number) => TrackEntry | undefined;
@@ -1,25 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTrackByNumber = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
3
+ exports.getTrackByNumber = exports.getTrackTimestampScale = exports.getTrackCodec = exports.getTrackNumber = exports.getMainSegment = void 0;
4
4
  const getMainSegment = (segments) => {
5
- return segments.find((s) => s.type === 'main-segment');
5
+ return segments.find((s) => s.type === 'Segment');
6
6
  };
7
7
  exports.getMainSegment = getMainSegment;
8
8
  const getTrackNumber = (track) => {
9
9
  var _a;
10
- const child = track.children.find((b) => b.type === 'track-number-segment');
11
- return (_a = child === null || child === void 0 ? void 0 : child.trackNumber) !== null && _a !== void 0 ? _a : null;
10
+ const child = track.value.find((b) => b.type === 'TrackNumber');
11
+ return (_a = child === null || child === void 0 ? void 0 : child.value) !== null && _a !== void 0 ? _a : null;
12
12
  };
13
13
  exports.getTrackNumber = getTrackNumber;
14
14
  const getTrackCodec = (track) => {
15
- const child = track.children.find((b) => b.type === 'codec-segment');
15
+ const child = track.value.find((b) => b.type === 'CodecID');
16
16
  return child !== null && child !== void 0 ? child : null;
17
17
  };
18
18
  exports.getTrackCodec = getTrackCodec;
19
+ const getTrackTimestampScale = (track) => {
20
+ const child = track.value.find((b) => b.type === 'TrackTimestampScale');
21
+ if (!child) {
22
+ return null;
23
+ }
24
+ if (child.type !== 'TrackTimestampScale') {
25
+ throw new Error('Expected TrackTimestampScale');
26
+ }
27
+ return child.value;
28
+ };
29
+ exports.getTrackTimestampScale = getTrackTimestampScale;
19
30
  const getTrackByNumber = (tracks, id) => {
20
31
  return tracks.find((track) => {
21
32
  const trackNumber = (0, exports.getTrackNumber)(track);
22
- return trackNumber === id;
33
+ return (trackNumber === null || trackNumber === void 0 ? void 0 : trackNumber.value) === id;
23
34
  });
24
35
  };
25
36
  exports.getTrackByNumber = getTrackByNumber;
@@ -8,7 +8,7 @@ export declare class OffsetCounter {
8
8
  discardBytes(amount: number): void;
9
9
  decrement(amount: number): void;
10
10
  }
11
- export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes?: number) => {
11
+ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes: number | null) => {
12
12
  startReadingBits: () => void;
13
13
  stopReadingBits: () => void;
14
14
  skipTo: (offset: number) => void;
@@ -21,27 +21,30 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes?
21
21
  bytesRemaining: () => number;
22
22
  isIsoBaseMedia: () => boolean;
23
23
  leb128: () => number;
24
- discardFirstBytes: () => void;
24
+ removeBytesRead: () => void;
25
25
  isWebm: () => boolean;
26
26
  discard: (length: number) => void;
27
- getFourByteNumber: () => number;
27
+ getEightByteNumber: (littleEndian?: boolean) => number;
28
+ getFourByteNumber: (littleEndian?: boolean) => number;
28
29
  getSlice: (amount: number) => Uint8Array;
29
30
  getAtom: () => string;
31
+ isRiff: () => boolean;
30
32
  getPaddedFourByteNumber: () => number;
31
- getMatroskaSegmentId: () => string;
32
- getVint: () => number;
33
+ getMatroskaSegmentId: () => string | null;
34
+ getVint: () => number | null;
33
35
  getUint8: () => number;
34
36
  getEBML: () => number;
35
37
  getInt8: () => number;
36
38
  getUint16: () => number;
37
39
  getUint24: () => number;
38
40
  getInt16: () => number;
39
- getUint32: () => number;
41
+ getUint32: (littleEndian?: boolean) => number;
42
+ getUint64: (littleEndian?: boolean) => bigint;
40
43
  getFixedPointUnsigned1616Number: () => number;
41
44
  getFixedPointSigned1616Number: () => number;
42
45
  getFixedPointSigned230Number: () => number;
43
46
  getPascalString: () => number[];
44
- getDecimalBytes(length: number): number;
47
+ getUint(length: number): number;
45
48
  getByteString(length: number): string;
46
49
  getFloat64: () => number;
47
50
  getFloat32: () => number;
@@ -51,6 +51,7 @@ exports.OffsetCounter = OffsetCounter;
51
51
  _OffsetCounter_offset = new WeakMap(), _OffsetCounter_discardedBytes = new WeakMap();
52
52
  const isoBaseMediaMp4Pattern = new TextEncoder().encode('ftyp');
53
53
  const mpegPattern = new Uint8Array([0xff, 0xf3, 0xe4, 0x64]);
54
+ const riffPattern = new Uint8Array([0x52, 0x49, 0x46, 0x46]);
54
55
  const matchesPattern = (pattern) => {
55
56
  return (data) => {
56
57
  return pattern.every((value, index) => data[index] === value);
@@ -61,7 +62,9 @@ const makeOffsetCounter = () => {
61
62
  };
62
63
  const getArrayBufferIterator = (initialData, maxBytes) => {
63
64
  const buf = new ArrayBuffer(initialData.byteLength, {
64
- maxByteLength: maxBytes !== null && maxBytes !== void 0 ? maxBytes : 1000000000,
65
+ maxByteLength: maxBytes === null
66
+ ? initialData.byteLength
67
+ : Math.min(maxBytes, 2 ** 32),
65
68
  });
66
69
  if (!buf.resize) {
67
70
  throw new Error('`ArrayBuffer.resize` is not supported in this Runtime. On the server: Use at least Node.js 20 or Bun. In the browser: Chrome 111, Edge 111, Safari 16.4, Firefox 128, Opera 111');
@@ -80,7 +83,52 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
80
83
  counter.increment(1);
81
84
  return val;
82
85
  };
83
- const getFourByteNumber = () => {
86
+ const getEightByteNumber = (littleEndian = false) => {
87
+ if (littleEndian) {
88
+ const one = getUint8();
89
+ const two = getUint8();
90
+ const three = getUint8();
91
+ const four = getUint8();
92
+ const five = getUint8();
93
+ const six = getUint8();
94
+ const seven = getUint8();
95
+ const eight = getUint8();
96
+ return ((eight << 56) |
97
+ (seven << 48) |
98
+ (six << 40) |
99
+ (five << 32) |
100
+ (four << 24) |
101
+ (three << 16) |
102
+ (two << 8) |
103
+ one);
104
+ }
105
+ function byteArrayToBigInt(byteArray) {
106
+ let result = BigInt(0);
107
+ for (let i = 0; i < byteArray.length; i++) {
108
+ result = (result << BigInt(8)) + BigInt(byteArray[i]);
109
+ }
110
+ return result;
111
+ }
112
+ const bigInt = byteArrayToBigInt([
113
+ getUint8(),
114
+ getUint8(),
115
+ getUint8(),
116
+ getUint8(),
117
+ getUint8(),
118
+ getUint8(),
119
+ getUint8(),
120
+ getUint8(),
121
+ ]);
122
+ return Number(bigInt);
123
+ };
124
+ const getFourByteNumber = (littleEndian = false) => {
125
+ if (littleEndian) {
126
+ const one = getUint8();
127
+ const two = getUint8();
128
+ const three = getUint8();
129
+ const four = getUint8();
130
+ return (four << 24) | (three << 16) | (two << 8) | one;
131
+ }
84
132
  return ((getUint8() << 24) | (getUint8() << 16) | (getUint8() << 8) | getUint8());
85
133
  };
86
134
  const getPaddedFourByteNumber = () => {
@@ -90,11 +138,16 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
90
138
  }
91
139
  return lastInt;
92
140
  };
93
- const getUint32 = () => {
94
- const val = view.getUint32(counter.getDiscardedOffset());
141
+ const getUint32 = (littleEndian = false) => {
142
+ const val = view.getUint32(counter.getDiscardedOffset(), littleEndian);
95
143
  counter.increment(4);
96
144
  return val;
97
145
  };
146
+ const getUint64 = (littleEndian = false) => {
147
+ const val = view.getBigUint64(counter.getDiscardedOffset(), littleEndian);
148
+ counter.increment(8);
149
+ return val;
150
+ };
98
151
  const getUint32Le = () => {
99
152
  const val = view.getUint32(counter.getDiscardedOffset(), true);
100
153
  counter.increment(4);
@@ -128,6 +181,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
128
181
  const isIsoBaseMedia = () => {
129
182
  return matchesPattern(isoBaseMediaMp4Pattern)(data.subarray(4, 8));
130
183
  };
184
+ const isRiff = () => {
185
+ return matchesPattern(riffPattern)(data.subarray(0, 4));
186
+ };
131
187
  const isWebm = () => {
132
188
  return matchesPattern(make_header_1.webmPattern)(data.subarray(0, 4));
133
189
  };
@@ -154,7 +210,6 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
154
210
  counter.setDiscardedOffset(offset);
155
211
  }
156
212
  else {
157
- buf.resize(offset);
158
213
  const currentOffset = counter.getOffset();
159
214
  counter.increment(offset - currentOffset);
160
215
  removeBytesRead();
@@ -225,19 +280,24 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
225
280
  bytesRemaining,
226
281
  isIsoBaseMedia,
227
282
  leb128,
228
- discardFirstBytes: removeBytesRead,
283
+ removeBytesRead,
229
284
  isWebm,
230
285
  discard: (length) => {
231
286
  counter.increment(length);
232
287
  },
288
+ getEightByteNumber,
233
289
  getFourByteNumber,
234
290
  getSlice,
235
291
  getAtom: () => {
236
292
  const atom = getSlice(4);
237
293
  return new TextDecoder().decode(atom);
238
294
  },
295
+ isRiff,
239
296
  getPaddedFourByteNumber,
240
297
  getMatroskaSegmentId: () => {
298
+ if (bytesRemaining() === 0) {
299
+ return null;
300
+ }
241
301
  const first = getSlice(1);
242
302
  const firstOneString = `0x${Array.from(new Uint8Array(first))
243
303
  .map((b) => {
@@ -249,6 +309,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
249
309
  if (all_segments_1.knownIdsWithOneLength.includes(firstOneString)) {
250
310
  return firstOneString;
251
311
  }
312
+ if (bytesRemaining() === 0) {
313
+ return null;
314
+ }
252
315
  const firstTwo = getSlice(1);
253
316
  const firstTwoString = `${firstOneString}${Array.from(new Uint8Array(firstTwo))
254
317
  .map((b) => {
@@ -258,6 +321,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
258
321
  if (all_segments_1.knownIdsWithTwoLength.includes(firstTwoString)) {
259
322
  return firstTwoString;
260
323
  }
324
+ if (bytesRemaining() === 0) {
325
+ return null;
326
+ }
261
327
  const firstThree = getSlice(1);
262
328
  const firstThreeString = `${firstTwoString}${Array.from(new Uint8Array(firstThree))
263
329
  .map((b) => {
@@ -267,6 +333,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
267
333
  if (all_segments_1.knownIdsWithThreeLength.includes(firstThreeString)) {
268
334
  return firstThreeString;
269
335
  }
336
+ if (bytesRemaining() === 0) {
337
+ return null;
338
+ }
270
339
  const segmentId = getSlice(1);
271
340
  return `${firstThreeString}${Array.from(new Uint8Array(segmentId))
272
341
  .map((b) => {
@@ -275,6 +344,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
275
344
  .join('')}`;
276
345
  },
277
346
  getVint: () => {
347
+ if (bytesRemaining() === 0) {
348
+ return null;
349
+ }
278
350
  const firstByte = getUint8();
279
351
  const totalLength = firstByte;
280
352
  if (totalLength === 0) {
@@ -285,6 +357,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
285
357
  while (((totalLength >> (7 - actualLength)) & 0x01) === 0) {
286
358
  actualLength++;
287
359
  }
360
+ if (bytesRemaining() < actualLength) {
361
+ return null;
362
+ }
288
363
  const slice = getSlice(actualLength);
289
364
  const d = [firstByte, ...Array.from(new Uint8Array(slice))];
290
365
  actualLength += 1; // Include the first byte set as 1
@@ -328,6 +403,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
328
403
  return val;
329
404
  },
330
405
  getUint32,
406
+ getUint64,
331
407
  // https://developer.apple.com/documentation/quicktime-file-format/sound_sample_description_version_1
332
408
  // A 32-bit unsigned fixed-point number (16.16) that indicates the rate at which the sound samples were obtained.
333
409
  getFixedPointUnsigned1616Number: () => {
@@ -346,7 +422,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
346
422
  const val = getSlice(32);
347
423
  return [...Array.from(new Uint8Array(val))];
348
424
  },
349
- getDecimalBytes(length) {
425
+ getUint(length) {
350
426
  const bytes = getSlice(length);
351
427
  const numbers = [...Array.from(new Uint8Array(bytes))];
352
428
  return numbers.reduce((acc, byte, index) => acc + (byte << (8 * (numbers.length - index - 1))), 0);
@@ -0,0 +1,2 @@
1
+ import type { WriterInterface } from '../writers/writer';
2
+ export declare const createMedia: (writer: WriterInterface) => Promise<() => Promise<void>>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMedia = void 0;
4
+ const matroska_header_1 = require("./matroska-header");
5
+ const matroska_info_1 = require("./matroska-info");
6
+ const matroska_segment_1 = require("./matroska-segment");
7
+ const matroska_trackentry_1 = require("./matroska-trackentry");
8
+ const createMedia = async (writer) => {
9
+ const header = (0, matroska_header_1.makeMatroskaHeader)();
10
+ const w = await writer.createContent();
11
+ await w.write(header);
12
+ const matroskaInfo = (0, matroska_info_1.makeMatroskaInfo)({
13
+ timescale: 1000000,
14
+ duration: 2658,
15
+ });
16
+ const matroskaTrackEntry = (0, matroska_trackentry_1.makeMatroskaVideoTrackEntryBytes)({
17
+ color: {
18
+ transferChracteristics: 'bt709',
19
+ matrixCoefficients: 'bt709',
20
+ primaries: 'bt709',
21
+ fullRange: true,
22
+ },
23
+ width: 1920,
24
+ height: 1080,
25
+ defaultDuration: 2658,
26
+ trackNumber: 1,
27
+ codecId: 'V_VP8',
28
+ });
29
+ const matroskaTracks = (0, matroska_trackentry_1.makeMatroskaTracks)([matroskaTrackEntry]);
30
+ const matroskaSegment = (0, matroska_segment_1.createMatroskaSegment)([matroskaInfo, matroskaTracks]);
31
+ await w.write(matroskaSegment);
32
+ return async () => {
33
+ await w.save();
34
+ };
35
+ };
36
+ exports.createMedia = createMedia;
@@ -0,0 +1 @@
1
+ export declare const makeMatroskaHeader: () => Uint8Array;