@remotion/media-parser 4.0.209 → 4.0.210

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 (213) hide show
  1. package/buffer.js +2 -0
  2. package/dist/boxes/iso-base-media/get-sample-positions-from-track.js +1 -1
  3. package/dist/boxes/iso-base-media/make-track.js +14 -2
  4. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +2 -1
  5. package/dist/boxes/iso-base-media/mdat/mdat.js +8 -3
  6. package/dist/boxes/iso-base-media/moov/moov.d.ts +2 -1
  7. package/dist/boxes/iso-base-media/moov/moov.js +2 -1
  8. package/dist/boxes/iso-base-media/process-box.d.ts +6 -3
  9. package/dist/boxes/iso-base-media/process-box.js +20 -5
  10. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +1 -1
  11. package/dist/boxes/iso-base-media/stsd/avcc.js +2 -2
  12. package/dist/boxes/iso-base-media/stsd/ctts.js +2 -5
  13. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +1 -1
  14. package/dist/boxes/iso-base-media/stsd/hvcc.js +2 -2
  15. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +2 -1
  16. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -1
  17. package/dist/boxes/iso-base-media/stsd/samples.d.ts +4 -2
  18. package/dist/boxes/iso-base-media/stsd/samples.js +69 -11
  19. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +2 -1
  20. package/dist/boxes/iso-base-media/stsd/stsd.js +2 -1
  21. package/dist/boxes/iso-base-media/trak/trak.d.ts +2 -1
  22. package/dist/boxes/iso-base-media/trak/trak.js +2 -1
  23. package/dist/boxes/iso-base-media/traversal.d.ts +44 -0
  24. package/dist/boxes/iso-base-media/traversal.js +211 -0
  25. package/dist/boxes/webm/color.d.ts +4 -0
  26. package/dist/boxes/webm/color.js +120 -0
  27. package/dist/boxes/webm/description.js +1 -1
  28. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  29. package/dist/boxes/webm/get-sample-from-block.js +1 -1
  30. package/dist/boxes/webm/get-track.js +16 -1
  31. package/dist/boxes/webm/make-track.d.ts +9 -0
  32. package/dist/boxes/webm/make-track.js +260 -0
  33. package/dist/boxes/webm/parse-ebml.js +2 -2
  34. package/dist/boxes/webm/segments/all-segments.d.ts +36 -3
  35. package/dist/boxes/webm/segments/all-segments.js +34 -6
  36. package/dist/boxes/webm/traversal.d.ts +26 -1
  37. package/dist/boxes/webm/traversal.js +214 -1
  38. package/dist/create/cluster-segment.js +0 -2
  39. package/dist/create/cluster.d.ts +10 -2
  40. package/dist/create/cluster.js +16 -10
  41. package/dist/create/create-media.d.ts +4 -2
  42. package/dist/create/create-media.js +76 -14
  43. package/dist/create/cues.d.ts +0 -0
  44. package/dist/create/cues.js +1 -0
  45. package/dist/create/make-duration-with-padding.d.ts +1 -1
  46. package/dist/create/make-duration-with-padding.js +3 -3
  47. package/dist/create/matroska-cues.d.ts +6 -0
  48. package/dist/create/matroska-cues.js +50 -0
  49. package/dist/create/matroska-info.js +1 -1
  50. package/dist/create/matroska-seek.d.ts +6 -0
  51. package/dist/create/matroska-seek.js +32 -0
  52. package/dist/create/matroska-segment.d.ts +1 -0
  53. package/dist/create/matroska-segment.js +3 -2
  54. package/dist/create/matroska-trackentry.d.ts +9 -14
  55. package/dist/create/matroska-trackentry.js +79 -94
  56. package/dist/emit-available-info.d.ts +12 -0
  57. package/dist/emit-available-info.js +133 -0
  58. package/dist/esm/buffer.mjs +57 -0
  59. package/dist/esm/from-fetch.mjs +72 -0
  60. package/dist/esm/from-node.mjs +48 -0
  61. package/dist/esm/from-web-file.mjs +48 -0
  62. package/dist/esm/index.mjs +6689 -0
  63. package/dist/esm/web-fs.mjs +67 -0
  64. package/dist/get-audio-codec.d.ts +5 -5
  65. package/dist/get-audio-codec.js +41 -57
  66. package/dist/get-container.d.ts +4 -0
  67. package/dist/get-container.js +26 -0
  68. package/dist/get-duration.js +1 -1
  69. package/dist/get-fps.js +1 -1
  70. package/dist/get-sample-aspect-ratio.d.ts +1 -1
  71. package/dist/get-sample-aspect-ratio.js +19 -19
  72. package/dist/get-tracks.d.ts +13 -0
  73. package/dist/get-tracks.js +8 -8
  74. package/dist/get-video-codec.d.ts +5 -2
  75. package/dist/get-video-codec.js +111 -21
  76. package/dist/has-all-info.d.ts +2 -2
  77. package/dist/has-all-info.js +23 -9
  78. package/dist/index.d.ts +3 -1
  79. package/dist/options.d.ts +97 -30
  80. package/dist/parse-media.js +43 -62
  81. package/dist/parse-video.d.ts +2 -1
  82. package/dist/parse-video.js +3 -1
  83. package/dist/parser-state.js +1 -2
  84. package/dist/readers/from-fetch.js +24 -4
  85. package/dist/readers/from-node.js +13 -3
  86. package/dist/readers/from-web-file.js +14 -2
  87. package/dist/readers/reader.d.ts +6 -1
  88. package/dist/samples-from-moof.js +1 -1
  89. package/dist/traversal.d.ts +0 -21
  90. package/dist/traversal.js +1 -158
  91. package/dist/truthy.d.ts +3 -0
  92. package/dist/truthy.js +7 -0
  93. package/dist/writers/buffer.d.ts +2 -0
  94. package/dist/writers/buffer.js +58 -0
  95. package/dist/writers/web-fs.d.ts +1 -0
  96. package/dist/writers/web-fs.js +42 -18
  97. package/dist/writers/writer.d.ts +4 -2
  98. package/fetch.js +2 -0
  99. package/node.js +2 -0
  100. package/package.json +43 -8
  101. package/web-file.js +2 -0
  102. package/web-fs.js +2 -0
  103. package/.eslintrc +0 -8
  104. package/input.webm +0 -0
  105. package/src/add-new-matroska-tracks.ts +0 -23
  106. package/src/boxes/iso-base-media/base-type.ts +0 -4
  107. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
  108. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
  109. package/src/boxes/iso-base-media/esds/esds.ts +0 -49
  110. package/src/boxes/iso-base-media/ftyp.ts +0 -39
  111. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
  112. package/src/boxes/iso-base-media/make-track.ts +0 -116
  113. package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
  114. package/src/boxes/iso-base-media/mdhd.ts +0 -59
  115. package/src/boxes/iso-base-media/moov/moov.ts +0 -43
  116. package/src/boxes/iso-base-media/mvhd.ts +0 -114
  117. package/src/boxes/iso-base-media/process-box.ts +0 -748
  118. package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
  119. package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
  120. package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
  121. package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
  122. package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
  123. package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
  124. package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
  125. package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
  126. package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
  127. package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
  128. package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
  129. package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
  130. package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
  131. package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
  132. package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
  133. package/src/boxes/iso-base-media/tfdt.ts +0 -37
  134. package/src/boxes/iso-base-media/tfhd.ts +0 -66
  135. package/src/boxes/iso-base-media/tkhd.ts +0 -150
  136. package/src/boxes/iso-base-media/to-date.ts +0 -9
  137. package/src/boxes/iso-base-media/trak/trak.ts +0 -43
  138. package/src/boxes/iso-base-media/trun.ts +0 -74
  139. package/src/boxes/iso-base-media/void-box.ts +0 -4
  140. package/src/boxes/webm/allowed-partial-segments.ts +0 -1
  141. package/src/boxes/webm/av1-codec-private.ts +0 -113
  142. package/src/boxes/webm/description.ts +0 -104
  143. package/src/boxes/webm/ebml.ts +0 -98
  144. package/src/boxes/webm/get-ready-tracks.ts +0 -36
  145. package/src/boxes/webm/get-sample-from-block.ts +0 -125
  146. package/src/boxes/webm/get-track.ts +0 -257
  147. package/src/boxes/webm/make-header.ts +0 -253
  148. package/src/boxes/webm/parse-ebml.ts +0 -259
  149. package/src/boxes/webm/parse-webm-header.ts +0 -18
  150. package/src/boxes/webm/segments/all-segments.ts +0 -888
  151. package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
  152. package/src/boxes/webm/segments/parse-children.ts +0 -144
  153. package/src/boxes/webm/segments/track-entry.ts +0 -38
  154. package/src/boxes/webm/segments.ts +0 -147
  155. package/src/boxes/webm/traversal.ts +0 -45
  156. package/src/buffer-iterator.ts +0 -555
  157. package/src/create/cluster-segment.ts +0 -62
  158. package/src/create/cluster.ts +0 -64
  159. package/src/create/create-media.ts +0 -136
  160. package/src/create/make-duration-with-padding.ts +0 -15
  161. package/src/create/matroska-header.ts +0 -63
  162. package/src/create/matroska-info.ts +0 -30
  163. package/src/create/matroska-segment.ts +0 -10
  164. package/src/create/matroska-trackentry.ts +0 -325
  165. package/src/create/timescale.ts +0 -1
  166. package/src/get-audio-codec.ts +0 -270
  167. package/src/get-dimensions.ts +0 -47
  168. package/src/get-duration.ts +0 -103
  169. package/src/get-fps.ts +0 -113
  170. package/src/get-sample-aspect-ratio.ts +0 -204
  171. package/src/get-sample-positions.ts +0 -93
  172. package/src/get-tracks.ts +0 -147
  173. package/src/get-video-codec.ts +0 -117
  174. package/src/has-all-info.ts +0 -81
  175. package/src/index.ts +0 -18
  176. package/src/make-hvc1-codec-strings.ts +0 -55
  177. package/src/options.ts +0 -118
  178. package/src/parse-media.ts +0 -183
  179. package/src/parse-result.ts +0 -79
  180. package/src/parse-video.ts +0 -83
  181. package/src/parser-context.ts +0 -10
  182. package/src/parser-state.ts +0 -178
  183. package/src/readers/from-fetch.ts +0 -90
  184. package/src/readers/from-node.ts +0 -51
  185. package/src/readers/from-web-file.ts +0 -49
  186. package/src/readers/reader.ts +0 -15
  187. package/src/samples-from-moof.ts +0 -102
  188. package/src/test/aspect-ratio.test.ts +0 -42
  189. package/src/test/av1.test.ts +0 -108
  190. package/src/test/create-matroska.test.ts +0 -287
  191. package/src/test/duration.test.ts +0 -18
  192. package/src/test/keys.test.ts +0 -47
  193. package/src/test/matroska.test.ts +0 -463
  194. package/src/test/mvhd.test.ts +0 -94
  195. package/src/test/parse-esds.test.ts +0 -98
  196. package/src/test/parse-stco.test.ts +0 -61
  197. package/src/test/parse-stsc.test.ts +0 -104
  198. package/src/test/parse-stsz.test.ts +0 -57
  199. package/src/test/parse-stts.test.ts +0 -38
  200. package/src/test/parse-video.test.ts +0 -101
  201. package/src/test/parse-webm.test.ts +0 -17
  202. package/src/test/samples-from-moof.test.ts +0 -2496
  203. package/src/test/stream-local.test.ts +0 -743
  204. package/src/test/stream-remote.test.ts +0 -59
  205. package/src/test/stream-samples.test.ts +0 -181
  206. package/src/test/stsd.test.ts +0 -265
  207. package/src/test/tkhd.test.ts +0 -87
  208. package/src/traversal.ts +0 -528
  209. package/src/webcodec-sample-types.ts +0 -29
  210. package/src/writers/web-fs.ts +0 -50
  211. package/src/writers/writer.ts +0 -12
  212. package/tsconfig.json +0 -14
  213. package/tsconfig.tsbuildinfo +0 -1
@@ -1,5 +1,13 @@
1
1
  import type { Writer } from '../writers/writer';
2
+ export type AudioOrVideoSample = {
3
+ timestamp: number;
4
+ type: 'key' | 'delta';
5
+ copyTo(destination: AllowSharedBufferSource): void;
6
+ byteLength: number;
7
+ duration: number | null;
8
+ };
9
+ export declare const timestampToClusterTimestamp: (timestamp: number) => number;
2
10
  export declare const makeCluster: (w: Writer, timestamp: number) => Promise<{
3
- addSample: (chunk: EncodedVideoChunk, trackNumber: number) => Promise<void>;
4
- shouldMakeNewCluster: (chunk: EncodedVideoChunk) => boolean;
11
+ addSample: (chunk: AudioOrVideoSample, trackNumber: number) => Promise<void>;
12
+ shouldMakeNewCluster: (newT: number, keyframe: boolean) => boolean;
5
13
  }>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeCluster = void 0;
3
+ exports.makeCluster = exports.timestampToClusterTimestamp = void 0;
4
4
  const ebml_1 = require("../boxes/webm/ebml");
5
5
  const make_header_1 = require("../boxes/webm/make-header");
6
6
  const all_segments_1 = require("../boxes/webm/segments/all-segments");
@@ -10,20 +10,26 @@ const maxClusterTimestamp = 2 ** 15;
10
10
  const timestampToClusterTimestamp = (timestamp) => {
11
11
  return Math.round((timestamp / timescale_1.CREATE_TIME_SCALE) * 1000);
12
12
  };
13
+ exports.timestampToClusterTimestamp = timestampToClusterTimestamp;
13
14
  const makeCluster = async (w, timestamp) => {
14
- const cluster = (0, cluster_segment_1.createClusterSegment)(timestampToClusterTimestamp(timestamp));
15
+ const cluster = (0, cluster_segment_1.createClusterSegment)((0, exports.timestampToClusterTimestamp)(timestamp));
15
16
  const clusterVIntPosition = w.getWrittenByteCount() +
16
17
  cluster.offsets.offset +
17
18
  (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength;
18
- let clusterSize = cluster.bytes.byteLength;
19
+ let clusterSize = cluster.bytes.byteLength -
20
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength -
21
+ cluster_segment_1.CLUSTER_MIN_VINT_WIDTH;
19
22
  await w.write(cluster.bytes);
20
23
  const addSample = async (chunk, trackNumber) => {
21
24
  const arr = new Uint8Array(chunk.byteLength);
22
25
  chunk.copyTo(arr);
23
- const timecodeRelativeToCluster = timestampToClusterTimestamp(chunk.timestamp) -
24
- timestampToClusterTimestamp(timestamp);
26
+ const timecodeRelativeToCluster = (0, exports.timestampToClusterTimestamp)(chunk.timestamp) -
27
+ (0, exports.timestampToClusterTimestamp)(timestamp);
28
+ if (timecodeRelativeToCluster < 0) {
29
+ throw new Error(`timecodeRelativeToCluster is negative (track ${trackNumber})`);
30
+ }
25
31
  if (timecodeRelativeToCluster > maxClusterTimestamp) {
26
- throw new Error('timecodeRelativeToCluster is too big');
32
+ throw new Error(`timecodeRelativeToCluster is too big: ${timecodeRelativeToCluster} > ${maxClusterTimestamp}`);
27
33
  }
28
34
  const keyframe = chunk.type === 'key';
29
35
  const simpleBlock = (0, cluster_segment_1.makeSimpleBlock)({
@@ -38,10 +44,10 @@ const makeCluster = async (w, timestamp) => {
38
44
  await w.updateDataAt(clusterVIntPosition, (0, ebml_1.getVariableInt)(clusterSize, cluster_segment_1.CLUSTER_MIN_VINT_WIDTH));
39
45
  await w.write(simpleBlock);
40
46
  };
41
- const shouldMakeNewCluster = (chunk) => {
42
- const newTimestamp = timestampToClusterTimestamp(chunk.timestamp);
43
- const oldTimestamp = timestampToClusterTimestamp(timestamp);
44
- return newTimestamp - oldTimestamp >= 2000 && chunk.type === 'key';
47
+ const shouldMakeNewCluster = (newT, keyframe) => {
48
+ const newTimestamp = (0, exports.timestampToClusterTimestamp)(newT);
49
+ const oldTimestamp = (0, exports.timestampToClusterTimestamp)(timestamp);
50
+ return newTimestamp - oldTimestamp >= 2000 && keyframe;
45
51
  };
46
52
  return { addSample, shouldMakeNewCluster };
47
53
  };
@@ -1,8 +1,10 @@
1
1
  import type { WriterInterface } from '../writers/writer';
2
+ import type { AudioOrVideoSample } from './cluster';
2
3
  import type { MakeTrackAudio, MakeTrackVideo } from './matroska-trackentry';
3
4
  export type MediaFn = {
4
- save: () => Promise<void>;
5
- addSample: (chunk: EncodedVideoChunk, trackNumber: number) => Promise<void>;
5
+ save: () => Promise<File>;
6
+ remove: () => Promise<void>;
7
+ addSample: (chunk: AudioOrVideoSample, trackNumber: number) => Promise<void>;
6
8
  updateDuration: (duration: number) => Promise<void>;
7
9
  addTrack: (track: Omit<MakeTrackAudio, 'trackNumber'> | Omit<MakeTrackVideo, 'trackNumber'>) => Promise<{
8
10
  trackNumber: number;
@@ -1,16 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMedia = void 0;
4
+ const ebml_1 = require("../boxes/webm/ebml");
4
5
  const make_header_1 = require("../boxes/webm/make-header");
6
+ const all_segments_1 = require("../boxes/webm/segments/all-segments");
5
7
  const cluster_1 = require("./cluster");
6
8
  const make_duration_with_padding_1 = require("./make-duration-with-padding");
9
+ const matroska_cues_1 = require("./matroska-cues");
7
10
  const matroska_header_1 = require("./matroska-header");
8
11
  const matroska_info_1 = require("./matroska-info");
12
+ const matroska_seek_1 = require("./matroska-seek");
9
13
  const matroska_segment_1 = require("./matroska-segment");
10
14
  const matroska_trackentry_1 = require("./matroska-trackentry");
11
15
  const timescale_1 = require("./timescale");
12
16
  const createMedia = async (writer) => {
13
- var _a, _b, _c, _d;
17
+ var _a, _b, _c, _d, _e, _f;
14
18
  const header = (0, matroska_header_1.makeMatroskaHeader)();
15
19
  const w = await writer.createContent();
16
20
  await w.write(header.bytes);
@@ -18,68 +22,126 @@ const createMedia = async (writer) => {
18
22
  timescale: timescale_1.CREATE_TIME_SCALE,
19
23
  });
20
24
  const currentTracks = [];
21
- const matroskaTracks = (0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks);
25
+ const seeks = [];
26
+ const cues = [];
27
+ const trackNumbers = [];
22
28
  const matroskaSegment = (0, matroska_segment_1.createMatroskaSegment)([
23
29
  matroskaInfo,
24
- ...matroskaTracks,
30
+ ...(0, matroska_seek_1.createMatroskaSeekHead)(seeks),
31
+ ...(0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks),
25
32
  ]);
26
33
  const durationOffset = ((_b = (_a = matroskaSegment.offsets.children[0].children.find((c) => c.field === 'Duration')) === null || _a === void 0 ? void 0 : _a.offset) !== null && _b !== void 0 ? _b : 0) + w.getWrittenByteCount();
27
34
  const tracksOffset = ((_d = (_c = matroskaSegment.offsets.children.find((o) => o.field === 'Tracks')) === null || _c === void 0 ? void 0 : _c.offset) !== null && _d !== void 0 ? _d : 0) + w.getWrittenByteCount();
35
+ const seekHeadOffset = ((_f = (_e = matroskaSegment.offsets.children.find((o) => o.field === 'SeekHead')) === null || _e === void 0 ? void 0 : _e.offset) !== null && _f !== void 0 ? _f : 0) + w.getWrittenByteCount();
36
+ if (!seekHeadOffset) {
37
+ throw new Error('could not get seek offset');
38
+ }
28
39
  if (!durationOffset) {
29
40
  throw new Error('could not get duration offset');
30
41
  }
31
42
  if (!tracksOffset) {
32
43
  throw new Error('could not get tracks offset');
33
44
  }
45
+ seeks.push({
46
+ hexString: all_segments_1.matroskaElements.Tracks,
47
+ byte: tracksOffset - seekHeadOffset,
48
+ });
49
+ const updateSeekWrite = async () => {
50
+ const updatedSeek = (0, matroska_seek_1.createMatroskaSeekHead)(seeks);
51
+ await w.updateDataAt(seekHeadOffset, (0, make_header_1.combineUint8Arrays)(updatedSeek.map((b) => b.bytes)));
52
+ };
53
+ const segmentOffset = w.getWrittenByteCount() +
54
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Segment).byteLength;
55
+ const updateSegmentSize = async (size) => {
56
+ const data = (0, ebml_1.getVariableInt)(size, matroska_segment_1.MATROSKA_SEGMENT_MIN_VINT_WIDTH);
57
+ await w.updateDataAt(segmentOffset, data);
58
+ };
34
59
  await w.write(matroskaSegment.bytes);
60
+ const clusterOffset = w.getWrittenByteCount();
35
61
  let currentCluster = await (0, cluster_1.makeCluster)(w, 0);
62
+ seeks.push({
63
+ hexString: all_segments_1.matroskaElements.Cluster,
64
+ byte: clusterOffset - seekHeadOffset,
65
+ });
66
+ cues.push({
67
+ time: 0,
68
+ clusterPosition: clusterOffset - seekHeadOffset,
69
+ trackNumbers,
70
+ });
71
+ const trackNumberProgresses = {};
36
72
  const getClusterOrMakeNew = async (chunk) => {
37
- if (!currentCluster.shouldMakeNewCluster(chunk)) {
73
+ const smallestProgress = Math.min(...Object.values(trackNumberProgresses));
74
+ if (!currentCluster.shouldMakeNewCluster(smallestProgress, chunk.type === 'key')) {
38
75
  return currentCluster;
39
76
  }
40
- currentCluster = await (0, cluster_1.makeCluster)(w, chunk.timestamp);
77
+ const newCluster = w.getWrittenByteCount();
78
+ cues.push({
79
+ time: smallestProgress,
80
+ clusterPosition: newCluster - seekHeadOffset,
81
+ trackNumbers,
82
+ });
83
+ currentCluster = await (0, cluster_1.makeCluster)(w, smallestProgress);
41
84
  return currentCluster;
42
85
  };
43
86
  const addSample = async (chunk, trackNumber) => {
87
+ var _a;
88
+ trackNumberProgresses[trackNumber] = chunk.timestamp;
44
89
  const cluster = await getClusterOrMakeNew(chunk);
90
+ const newDuration = Math.round((chunk.timestamp + ((_a = chunk.duration) !== null && _a !== void 0 ? _a : 0)) / 1000);
91
+ await updateDuration(newDuration);
45
92
  return cluster.addSample(chunk, trackNumber);
46
93
  };
47
94
  const updateDuration = async (newDuration) => {
48
95
  const blocks = (0, make_duration_with_padding_1.makeDurationWithPadding)(newDuration);
49
- await w.updateDataAt(durationOffset, (0, make_header_1.combineUint8Arrays)(blocks.map((b) => b.bytes)));
96
+ await w.updateDataAt(durationOffset, blocks.bytes);
50
97
  };
51
98
  const addTrack = async (track) => {
52
99
  currentTracks.push(track);
53
100
  const newTracks = (0, matroska_trackentry_1.makeMatroskaTracks)(currentTracks);
54
101
  await w.updateDataAt(tracksOffset, (0, make_header_1.combineUint8Arrays)(newTracks.map((b) => b.bytes)));
55
102
  };
56
- let operationProm = Promise.resolve();
103
+ const operationProm = { current: Promise.resolve() };
57
104
  const waitForFinishPromises = [];
58
105
  return {
59
106
  save: async () => {
60
- await w.save();
107
+ const file = await w.save();
108
+ return file;
109
+ },
110
+ remove: async () => {
111
+ await w.remove();
61
112
  },
62
113
  addSample: (chunk, trackNumber) => {
63
- operationProm = operationProm.then(() => addSample(chunk, trackNumber));
64
- return operationProm;
114
+ operationProm.current = operationProm.current.then(() => addSample(chunk, trackNumber));
115
+ return operationProm.current;
65
116
  },
66
117
  updateDuration: (duration) => {
67
- operationProm = operationProm.then(() => updateDuration(duration));
68
- return operationProm;
118
+ operationProm.current = operationProm.current.then(() => updateDuration(duration));
119
+ return operationProm.current;
69
120
  },
70
121
  addTrack: (track) => {
71
122
  const trackNumber = currentTracks.length + 1;
72
123
  const bytes = track.type === 'video'
73
124
  ? (0, matroska_trackentry_1.makeMatroskaVideoTrackEntryBytes)({ ...track, trackNumber })
74
125
  : (0, matroska_trackentry_1.makeMatroskaAudioTrackEntryBytes)({ ...track, trackNumber });
75
- operationProm = operationProm.then(() => addTrack(bytes));
76
- return operationProm.then(() => ({ trackNumber }));
126
+ operationProm.current = operationProm.current.then(() => addTrack(bytes));
127
+ trackNumbers.push(trackNumber);
128
+ return operationProm.current.then(() => ({ trackNumber }));
77
129
  },
78
130
  addWaitForFinishPromise: (promise) => {
79
131
  waitForFinishPromises.push(promise);
80
132
  },
81
133
  async waitForFinish() {
82
134
  await Promise.all(waitForFinishPromises.map((p) => p()));
135
+ await operationProm.current;
136
+ seeks.push({
137
+ hexString: all_segments_1.matroskaElements.Cues,
138
+ byte: w.getWrittenByteCount() - seekHeadOffset,
139
+ });
140
+ await updateSeekWrite();
141
+ await w.write((0, matroska_cues_1.createMatroskaCues)(cues).bytes);
142
+ const segmentSize = w.getWrittenByteCount() - segmentOffset;
143
+ await w.waitForFinish();
144
+ await updateSegmentSize(segmentSize);
83
145
  },
84
146
  };
85
147
  };
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -1 +1 @@
1
- export declare const makeDurationWithPadding: (newDuration: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset[];
1
+ export declare const makeDurationWithPadding: (newDuration: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset;
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeDurationWithPadding = void 0;
4
4
  const make_header_1 = require("../boxes/webm/make-header");
5
5
  const makeDurationWithPadding = (newDuration) => {
6
- return (0, make_header_1.padMatroskaBytes)({
6
+ return (0, make_header_1.makeMatroskaBytes)({
7
7
  type: 'Duration',
8
8
  value: {
9
9
  value: newDuration,
10
10
  size: '64',
11
11
  },
12
- minVintWidth: null,
13
- }, 100);
12
+ minVintWidth: 8,
13
+ });
14
14
  };
15
15
  exports.makeDurationWithPadding = makeDurationWithPadding;
@@ -0,0 +1,6 @@
1
+ export type Cue = {
2
+ time: number;
3
+ clusterPosition: number;
4
+ trackNumbers: number[];
5
+ };
6
+ export declare const createMatroskaCues: (cues: Cue[]) => import("../boxes/webm/segments/all-segments").BytesAndOffset;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMatroskaCues = void 0;
4
+ const make_header_1 = require("../boxes/webm/make-header");
5
+ const cluster_1 = require("./cluster");
6
+ const createMatroskaCues = (cues) => {
7
+ return (0, make_header_1.makeMatroskaBytes)({
8
+ type: 'Cues',
9
+ minVintWidth: null,
10
+ value: cues.map((cue) => {
11
+ return {
12
+ type: 'CuePoint',
13
+ value: [
14
+ {
15
+ type: 'CueTime',
16
+ minVintWidth: null,
17
+ value: {
18
+ value: (0, cluster_1.timestampToClusterTimestamp)(cue.time),
19
+ byteLength: null,
20
+ },
21
+ },
22
+ ...cue.trackNumbers.map((trackNumber) => ({
23
+ type: 'CueTrackPositions',
24
+ value: [
25
+ {
26
+ type: 'CueTrack',
27
+ minVintWidth: null,
28
+ value: {
29
+ value: trackNumber,
30
+ byteLength: null,
31
+ },
32
+ },
33
+ {
34
+ type: 'CueClusterPosition',
35
+ minVintWidth: null,
36
+ value: {
37
+ value: cue.clusterPosition,
38
+ byteLength: null,
39
+ },
40
+ },
41
+ ],
42
+ minVintWidth: null,
43
+ })),
44
+ ],
45
+ minVintWidth: null,
46
+ };
47
+ }),
48
+ });
49
+ };
50
+ exports.createMatroskaCues = createMatroskaCues;
@@ -25,7 +25,7 @@ const makeMatroskaInfo = ({ timescale }) => {
25
25
  value: '@remotion/media-parser',
26
26
  minVintWidth: null,
27
27
  },
28
- ...(0, make_duration_with_padding_1.makeDurationWithPadding)(0),
28
+ (0, make_duration_with_padding_1.makeDurationWithPadding)(0),
29
29
  ],
30
30
  minVintWidth: null,
31
31
  });
@@ -0,0 +1,6 @@
1
+ import type { MatroskaElement } from '../boxes/webm/segments/all-segments';
2
+ export type Seek = {
3
+ hexString: MatroskaElement;
4
+ byte: number;
5
+ };
6
+ export declare const createMatroskaSeekHead: (seeks: Seek[]) => import("../boxes/webm/segments/all-segments").BytesAndOffset[];
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMatroskaSeekHead = void 0;
4
+ const make_header_1 = require("../boxes/webm/make-header");
5
+ const createMatroskaSeekHead = (seeks) => {
6
+ return (0, make_header_1.padMatroskaBytes)((0, make_header_1.makeMatroskaBytes)({
7
+ type: 'SeekHead',
8
+ minVintWidth: null,
9
+ value: seeks.map((seek) => {
10
+ return {
11
+ type: 'Seek',
12
+ minVintWidth: null,
13
+ value: [
14
+ {
15
+ type: 'SeekID',
16
+ minVintWidth: null,
17
+ value: seek.hexString,
18
+ },
19
+ {
20
+ type: 'SeekPosition',
21
+ minVintWidth: null,
22
+ value: {
23
+ value: seek.byte,
24
+ byteLength: null,
25
+ },
26
+ },
27
+ ],
28
+ };
29
+ }),
30
+ }), 200);
31
+ };
32
+ exports.createMatroskaSeekHead = createMatroskaSeekHead;
@@ -1,2 +1,3 @@
1
1
  import type { BytesAndOffset } from '../boxes/webm/segments/all-segments';
2
+ export declare const MATROSKA_SEGMENT_MIN_VINT_WIDTH = 8;
2
3
  export declare const createMatroskaSegment: (children: BytesAndOffset[]) => BytesAndOffset;
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMatroskaSegment = void 0;
3
+ exports.createMatroskaSegment = exports.MATROSKA_SEGMENT_MIN_VINT_WIDTH = void 0;
4
4
  const make_header_1 = require("../boxes/webm/make-header");
5
+ exports.MATROSKA_SEGMENT_MIN_VINT_WIDTH = 8;
5
6
  const createMatroskaSegment = (children) => {
6
7
  return (0, make_header_1.makeMatroskaBytes)({
7
8
  type: 'Segment',
8
9
  value: children,
9
- minVintWidth: 8,
10
+ minVintWidth: exports.MATROSKA_SEGMENT_MIN_VINT_WIDTH,
10
11
  });
11
12
  };
12
13
  exports.createMatroskaSegment = createMatroskaSegment;
@@ -1,32 +1,27 @@
1
1
  import type { BytesAndOffset } from '../boxes/webm/segments/all-segments';
2
- export type MatroskaColorParams = {
3
- transferChracteristics: 'bt709' | 'smpte170m' | 'iec61966-2-1' | null;
4
- matrixCoefficients: 'bt709' | 'bt470bg' | 'rgb' | 'smpte170m' | null;
5
- primaries: 'bt709' | 'smpte170m' | 'bt470bg' | null;
6
- fullRange: boolean | null;
7
- };
8
- export declare const makeMatroskaColorBytes: ({ transferChracteristics, matrixCoefficients, primaries, fullRange, }: MatroskaColorParams) => BytesAndOffset;
2
+ import type { MediaParserAudioCodec, MediaParserVideoCodec, VideoTrackColorParams } from '../get-tracks';
9
3
  export declare const makeMatroskaVideoBytes: ({ color, width, height, }: {
10
- color: MatroskaColorParams;
4
+ color: VideoTrackColorParams;
11
5
  width: number;
12
6
  height: number;
13
7
  }) => BytesAndOffset;
14
8
  export type MakeTrackAudio = {
15
9
  trackNumber: number;
16
- codecId: string;
10
+ codec: MediaParserAudioCodec;
17
11
  numberOfChannels: number;
18
12
  sampleRate: number;
19
13
  type: 'audio';
14
+ codecPrivate: Uint8Array | null;
20
15
  };
21
16
  export type MakeTrackVideo = {
22
- color: MatroskaColorParams;
17
+ color: VideoTrackColorParams;
23
18
  width: number;
24
19
  height: number;
25
- defaultDuration: number;
26
20
  trackNumber: number;
27
- codecId: string;
21
+ codec: MediaParserVideoCodec;
28
22
  type: 'video';
23
+ codecPrivate: Uint8Array | null;
29
24
  };
30
- export declare const makeMatroskaAudioTrackEntryBytes: ({ trackNumber, codecId, numberOfChannels: audioChannels, sampleRate, }: MakeTrackAudio) => BytesAndOffset;
31
- export declare const makeMatroskaVideoTrackEntryBytes: ({ color, width, height, defaultDuration, trackNumber, codecId, }: MakeTrackVideo) => BytesAndOffset;
25
+ export declare const makeMatroskaAudioTrackEntryBytes: ({ trackNumber, codec, numberOfChannels, sampleRate, codecPrivate, }: MakeTrackAudio) => BytesAndOffset;
26
+ export declare const makeMatroskaVideoTrackEntryBytes: ({ color, width, height, trackNumber, codec, codecPrivate, }: MakeTrackVideo) => BytesAndOffset;
32
27
  export declare const makeMatroskaTracks: (tracks: BytesAndOffset[]) => BytesAndOffset[];