@remotion/media-parser 4.0.228 → 4.0.230

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 (165) hide show
  1. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +3 -2
  2. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +7 -8
  3. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +4 -2
  4. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +5 -4
  5. package/dist/boxes/iso-base-media/esds/esds.d.ts +3 -1
  6. package/dist/boxes/iso-base-media/esds/esds.js +2 -2
  7. package/dist/boxes/iso-base-media/make-track.js +2 -1
  8. package/dist/boxes/iso-base-media/mdat/mdat.js +13 -8
  9. package/dist/boxes/iso-base-media/moov/moov.d.ts +3 -1
  10. package/dist/boxes/iso-base-media/moov/moov.js +2 -2
  11. package/dist/boxes/iso-base-media/mvhd.js +11 -9
  12. package/dist/boxes/iso-base-media/parse-icc-profile.d.ts +36 -0
  13. package/dist/boxes/iso-base-media/parse-icc-profile.js +115 -0
  14. package/dist/boxes/iso-base-media/process-box.d.ts +5 -4
  15. package/dist/boxes/iso-base-media/process-box.js +17 -14
  16. package/dist/boxes/iso-base-media/stsd/colr.d.ts +14 -4
  17. package/dist/boxes/iso-base-media/stsd/colr.js +13 -1
  18. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +1 -2
  19. package/dist/boxes/iso-base-media/stsd/mebx.js +2 -2
  20. package/dist/boxes/iso-base-media/stsd/samples.d.ts +5 -2
  21. package/dist/boxes/iso-base-media/stsd/samples.js +7 -6
  22. package/dist/boxes/iso-base-media/stsd/stsd.js +1 -0
  23. package/dist/boxes/iso-base-media/to-date.d.ts +1 -0
  24. package/dist/boxes/iso-base-media/to-date.js +9 -1
  25. package/dist/boxes/iso-base-media/trak/trak.d.ts +3 -1
  26. package/dist/boxes/iso-base-media/trak/trak.js +2 -2
  27. package/dist/boxes/webm/av1-codec-private.js +1 -1
  28. package/dist/boxes/webm/ebml.d.ts +1 -1
  29. package/dist/boxes/webm/get-sample-from-block.d.ts +4 -4
  30. package/dist/boxes/webm/get-sample-from-block.js +5 -2
  31. package/dist/boxes/webm/make-track.js +1 -0
  32. package/dist/buffer-iterator.d.ts +1 -1
  33. package/dist/buffer-iterator.js +1 -8
  34. package/dist/create/iso-base-media/codec-specific/avc1.d.ts +2 -0
  35. package/dist/create/iso-base-media/codec-specific/avc1.js +48 -0
  36. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +22 -0
  37. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +36 -0
  38. package/dist/create/iso-base-media/codec-specific/mp4a.d.ts +2 -0
  39. package/dist/create/iso-base-media/codec-specific/mp4a.js +90 -0
  40. package/dist/create/iso-base-media/create-colr.d.ts +6 -0
  41. package/dist/create/iso-base-media/create-colr.js +26 -0
  42. package/dist/create/iso-base-media/create-ftyp.d.ts +10 -0
  43. package/dist/create/iso-base-media/create-ftyp.js +22 -0
  44. package/dist/create/iso-base-media/create-ilst.d.ts +1 -0
  45. package/dist/create/iso-base-media/create-ilst.js +14 -0
  46. package/dist/create/iso-base-media/create-iso-base-media.d.ts +2 -0
  47. package/dist/create/iso-base-media/create-iso-base-media.js +168 -0
  48. package/dist/create/iso-base-media/create-mdia.d.ts +5 -0
  49. package/dist/create/iso-base-media/create-mdia.js +18 -0
  50. package/dist/create/iso-base-media/create-moov.d.ts +5 -0
  51. package/dist/create/iso-base-media/create-moov.js +18 -0
  52. package/dist/create/iso-base-media/create-mvhd.d.ts +10 -0
  53. package/dist/create/iso-base-media/create-mvhd.js +48 -0
  54. package/dist/create/iso-base-media/create-trak.d.ts +4 -0
  55. package/dist/create/iso-base-media/create-trak.js +17 -0
  56. package/dist/create/iso-base-media/create-udta.d.ts +1 -0
  57. package/dist/create/iso-base-media/create-udta.js +14 -0
  58. package/dist/create/iso-base-media/create-url.d.ts +1 -0
  59. package/dist/create/iso-base-media/create-url.js +16 -0
  60. package/dist/create/iso-base-media/example-stts.d.ts +3 -0
  61. package/dist/create/iso-base-media/example-stts.js +2797 -0
  62. package/dist/create/iso-base-media/ilst/create-cmt.d.ts +1 -0
  63. package/dist/create/iso-base-media/ilst/create-cmt.js +26 -0
  64. package/dist/create/iso-base-media/ilst/create-too.d.ts +1 -0
  65. package/dist/create/iso-base-media/ilst/create-too.js +27 -0
  66. package/dist/create/iso-base-media/mdia/create-mdhd.d.ts +6 -0
  67. package/dist/create/iso-base-media/mdia/create-mdhd.js +33 -0
  68. package/dist/create/iso-base-media/mp4-header.d.ts +6 -0
  69. package/dist/create/iso-base-media/mp4-header.js +47 -0
  70. package/dist/create/iso-base-media/primitives.d.ts +15 -0
  71. package/dist/create/iso-base-media/primitives.js +133 -0
  72. package/dist/create/iso-base-media/serialize-track.d.ts +9 -0
  73. package/dist/create/iso-base-media/serialize-track.js +63 -0
  74. package/dist/create/iso-base-media/trak/create-tkhd.d.ts +27 -0
  75. package/dist/create/iso-base-media/trak/create-tkhd.js +97 -0
  76. package/dist/create/iso-base-media/trak/mdia/create-minf.d.ts +4 -0
  77. package/dist/create/iso-base-media/trak/mdia/create-minf.js +19 -0
  78. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.d.ts +1 -0
  79. package/dist/create/iso-base-media/trak/mdia/minf/create-dinf.js +22 -0
  80. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.d.ts +1 -0
  81. package/dist/create/iso-base-media/trak/mdia/minf/create-smhd.js +20 -0
  82. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.d.ts +6 -0
  83. package/dist/create/iso-base-media/trak/mdia/minf/create-stbl.js +35 -0
  84. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.d.ts +1 -0
  85. package/dist/create/iso-base-media/trak/mdia/minf/create-vmhd.js +20 -0
  86. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.d.ts +2 -0
  87. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-ctts.js +45 -0
  88. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.d.ts +2 -0
  89. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stco.js +28 -0
  90. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.d.ts +2 -0
  91. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsc.js +56 -0
  92. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.d.ts +2 -0
  93. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stss.js +23 -0
  94. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.d.ts +2 -0
  95. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stsz.js +25 -0
  96. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.d.ts +2 -0
  97. package/dist/create/iso-base-media/trak/mdia/minf/stbl/create-stts.js +48 -0
  98. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.d.ts +1 -0
  99. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avc1.js +20 -0
  100. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.d.ts +1 -0
  101. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-avcc.js +16 -0
  102. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.d.ts +1 -0
  103. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.js +13 -0
  104. package/dist/create/iso-base-media/udta/create-meta.d.ts +4 -0
  105. package/dist/create/iso-base-media/udta/create-meta.js +20 -0
  106. package/dist/create/iso-base-media/udta/meta/create-hdlr.d.ts +1 -0
  107. package/dist/create/iso-base-media/udta/meta/create-hdlr.js +32 -0
  108. package/dist/create/make-track-info.d.ts +20 -0
  109. package/dist/create/make-track-info.js +2 -0
  110. package/dist/create/{cluster-segment.d.ts → matroska/cluster-segment.d.ts} +1 -1
  111. package/dist/create/{cluster-segment.js → matroska/cluster-segment.js} +2 -2
  112. package/dist/create/matroska/cluster.d.ts +19 -0
  113. package/dist/create/matroska/cluster.js +74 -0
  114. package/dist/create/matroska/create-matroska-media.d.ts +2 -0
  115. package/dist/create/{create-media.js → matroska/create-matroska-media.js} +26 -19
  116. package/dist/create/matroska/make-duration-with-padding.d.ts +1 -0
  117. package/dist/create/{make-duration-with-padding.js → matroska/make-duration-with-padding.js} +1 -1
  118. package/dist/create/{matroska-cues.d.ts → matroska/matroska-cues.d.ts} +1 -1
  119. package/dist/create/{matroska-cues.js → matroska/matroska-cues.js} +1 -1
  120. package/dist/create/matroska/matroska-header.d.ts +1 -0
  121. package/dist/create/{matroska-header.js → matroska/matroska-header.js} +1 -1
  122. package/dist/create/{matroska-info.d.ts → matroska/matroska-info.d.ts} +1 -1
  123. package/dist/create/{matroska-info.js → matroska/matroska-info.js} +1 -1
  124. package/dist/create/matroska/matroska-seek.d.ts +6 -0
  125. package/dist/create/{matroska-seek.js → matroska/matroska-seek.js} +1 -1
  126. package/dist/create/{matroska-segment.d.ts → matroska/matroska-segment.d.ts} +1 -1
  127. package/dist/create/{matroska-segment.js → matroska/matroska-segment.js} +1 -1
  128. package/dist/create/matroska/matroska-trackentry.d.ts +10 -0
  129. package/dist/create/{matroska-trackentry.js → matroska/matroska-trackentry.js} +9 -3
  130. package/dist/create/media-fn.d.ts +31 -0
  131. package/dist/create/media-fn.js +2 -0
  132. package/dist/create/timescale.d.ts +1 -1
  133. package/dist/create/timescale.js +2 -2
  134. package/dist/esm/buffer.mjs +6 -7
  135. package/dist/esm/index.mjs +1476 -215
  136. package/dist/get-audio-codec.d.ts +1 -0
  137. package/dist/get-audio-codec.js +27 -3
  138. package/dist/get-fps.d.ts +1 -0
  139. package/dist/get-fps.js +17 -13
  140. package/dist/get-sample-positions.d.ts +1 -0
  141. package/dist/get-sample-positions.js +1 -0
  142. package/dist/get-tracks.d.ts +1 -0
  143. package/dist/get-video-codec.js +4 -0
  144. package/dist/index.d.ts +4 -7
  145. package/dist/index.js +4 -2
  146. package/dist/options.d.ts +2 -0
  147. package/dist/parse-media.js +2 -1
  148. package/dist/parse-video.d.ts +3 -1
  149. package/dist/parse-video.js +3 -14
  150. package/dist/parser-state.d.ts +3 -3
  151. package/dist/samples-from-moof.js +1 -0
  152. package/dist/webcodec-sample-types.d.ts +7 -13
  153. package/dist/writers/buffer-implementation/writer.d.ts +2 -0
  154. package/dist/writers/buffer-implementation/writer.js +54 -0
  155. package/dist/writers/buffer.js +2 -53
  156. package/dist/writers/web-fs.js +1 -0
  157. package/dist/writers/writer.d.ts +1 -1
  158. package/package.json +4 -4
  159. package/dist/create/cluster.d.ts +0 -19
  160. package/dist/create/cluster.js +0 -55
  161. package/dist/create/create-media.d.ts +0 -19
  162. package/dist/create/make-duration-with-padding.d.ts +0 -1
  163. package/dist/create/matroska-header.d.ts +0 -1
  164. package/dist/create/matroska-seek.d.ts +0 -6
  165. package/dist/create/matroska-trackentry.d.ts +0 -27
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCttsBox = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const makeEntry = (entry) => {
7
+ return (0, make_header_1.combineUint8Arrays)([
8
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.sampleCount),
9
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.sampleOffset),
10
+ ]);
11
+ };
12
+ const createCttsBox = (samplePositions) => {
13
+ const offsets = samplePositions.map((s) => s.cts - s.dts);
14
+ const entries = [];
15
+ let lastOffset = null;
16
+ for (const offset of offsets) {
17
+ if (lastOffset === offset) {
18
+ entries[entries.length - 1].sampleCount++;
19
+ }
20
+ else {
21
+ entries.push({
22
+ sampleCount: 1,
23
+ sampleOffset: offset,
24
+ });
25
+ }
26
+ lastOffset = offset;
27
+ }
28
+ const needsCtts = entries.length > 0 && entries.some((e) => e.sampleOffset !== 0);
29
+ if (!needsCtts) {
30
+ return null;
31
+ }
32
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
33
+ // type
34
+ (0, primitives_1.stringsToUint8Array)('ctts'),
35
+ // version
36
+ new Uint8Array([0]),
37
+ // flags
38
+ new Uint8Array([0, 0, 0]),
39
+ // entry count
40
+ (0, primitives_1.numberTo32BitUIntOrInt)(entries.length),
41
+ // entries
42
+ ...entries.map((e) => makeEntry(e)),
43
+ ]));
44
+ };
45
+ exports.createCttsBox = createCttsBox;
@@ -0,0 +1,2 @@
1
+ import type { SamplePosition } from '../../../../../../get-sample-positions';
2
+ export declare const createStcoAtom: (samplePositions: SamplePosition[]) => Uint8Array;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStcoAtom = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const createStcoAtom = (samplePositions) => {
7
+ const chunkOffsets = [];
8
+ let lastChunk;
9
+ for (const sample of samplePositions) {
10
+ if (lastChunk !== sample.chunk) {
11
+ chunkOffsets.push(sample.offset);
12
+ }
13
+ lastChunk = sample.chunk;
14
+ }
15
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
16
+ // type
17
+ (0, primitives_1.stringsToUint8Array)('stco'),
18
+ // version
19
+ new Uint8Array([0]),
20
+ // flags
21
+ new Uint8Array([0, 0, 0]),
22
+ // number of entries
23
+ (0, primitives_1.numberTo32BitUIntOrInt)(chunkOffsets.length),
24
+ // chunk offsets
25
+ ...chunkOffsets.map((offset) => (0, primitives_1.numberTo32BitUIntOrInt)(offset)),
26
+ ]));
27
+ };
28
+ exports.createStcoAtom = createStcoAtom;
@@ -0,0 +1,2 @@
1
+ import type { SamplePosition } from '../../../../../../get-sample-positions';
2
+ export declare const createStsc: (samplePositions: SamplePosition[]) => Uint8Array;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStsc = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const createEntry = (entry) => {
7
+ return (0, make_header_1.combineUint8Arrays)([
8
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.firstChunk),
9
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.samplesPerChunk),
10
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.sampleDescriptionIndex),
11
+ ]);
12
+ };
13
+ const createStsc = (samplePositions) => {
14
+ const entries = [];
15
+ const deduplicateLastEntry = () => {
16
+ const lastEntry = entries[entries.length - 1];
17
+ const secondToLastEntry = entries[entries.length - 2];
18
+ if (lastEntry &&
19
+ secondToLastEntry &&
20
+ lastEntry.samplesPerChunk === secondToLastEntry.samplesPerChunk &&
21
+ lastEntry.sampleDescriptionIndex ===
22
+ secondToLastEntry.sampleDescriptionIndex) {
23
+ const lastIndex = entries.length - 1;
24
+ entries.length = lastIndex;
25
+ }
26
+ };
27
+ let lastChunk;
28
+ for (const samplePosition of samplePositions) {
29
+ if (samplePosition.chunk === lastChunk) {
30
+ entries[entries.length - 1].samplesPerChunk++;
31
+ }
32
+ else {
33
+ deduplicateLastEntry();
34
+ entries.push({
35
+ firstChunk: samplePosition.chunk,
36
+ samplesPerChunk: 1,
37
+ sampleDescriptionIndex: 1,
38
+ });
39
+ lastChunk = samplePosition.chunk;
40
+ }
41
+ }
42
+ deduplicateLastEntry();
43
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
44
+ // type
45
+ (0, primitives_1.stringsToUint8Array)('stsc'),
46
+ // version
47
+ new Uint8Array([0]),
48
+ // flags
49
+ new Uint8Array([0, 0, 0]),
50
+ // entry count
51
+ (0, primitives_1.numberTo32BitUIntOrInt)(entries.length),
52
+ // entries
53
+ ...entries.map((e) => createEntry(e)),
54
+ ]));
55
+ };
56
+ exports.createStsc = createStsc;
@@ -0,0 +1,2 @@
1
+ import type { SamplePosition } from '../../../../../../get-sample-positions';
2
+ export declare const createStss: (samplePositions: SamplePosition[]) => Uint8Array;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStss = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const createStss = (samplePositions) => {
7
+ const samples = samplePositions
8
+ .map((sample, i) => [sample.isKeyframe, i])
9
+ .filter((s) => s[0])
10
+ .map((s) => s[1] + 1);
11
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
12
+ // type
13
+ (0, primitives_1.stringsToUint8Array)('stss'),
14
+ // version
15
+ new Uint8Array([0]),
16
+ // flags
17
+ new Uint8Array([0, 0, 0]),
18
+ // entry count
19
+ (0, primitives_1.numberTo32BitUIntOrInt)(samples.length),
20
+ ...samples.map((sample) => (0, primitives_1.numberTo32BitUIntOrInt)(sample)),
21
+ ]));
22
+ };
23
+ exports.createStss = createStss;
@@ -0,0 +1,2 @@
1
+ import type { SamplePosition } from '../../../../../../get-sample-positions';
2
+ export declare const createStsz: (samplePositions: SamplePosition[]) => Uint8Array;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStsz = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const createStsz = (samplePositions) => {
7
+ const sampleSizes = samplePositions.map((samplePosition) => samplePosition.size);
8
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
9
+ // type
10
+ (0, primitives_1.stringsToUint8Array)('stsz'),
11
+ // version
12
+ new Uint8Array([0]),
13
+ // flags
14
+ new Uint8Array([0, 0, 0]),
15
+ // sample size
16
+ // Possible optimization for the future: If all sizes are the same, we don't have to list them all out
17
+ // https://developer.apple.com/documentation/quicktime-file-format/sample_size_atom
18
+ (0, primitives_1.numberTo32BitUIntOrInt)(0),
19
+ // number of entries
20
+ (0, primitives_1.numberTo32BitUIntOrInt)(sampleSizes.length),
21
+ // sample sizes
22
+ ...sampleSizes.map((size) => (0, primitives_1.numberTo32BitUIntOrInt)(size)),
23
+ ]));
24
+ };
25
+ exports.createStsz = createStsz;
@@ -0,0 +1,2 @@
1
+ import type { SamplePosition } from '../../../../../../get-sample-positions';
2
+ export declare const createSttsAtom: (samplePositions: SamplePosition[]) => Uint8Array;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSttsAtom = void 0;
4
+ const make_header_1 = require("../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../primitives");
6
+ const makeEntry = (entry) => {
7
+ return (0, make_header_1.combineUint8Arrays)([
8
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.sampleCount),
9
+ (0, primitives_1.numberTo32BitUIntOrInt)(entry.sampleOffset),
10
+ ]);
11
+ };
12
+ const createSttsAtom = (samplePositions) => {
13
+ let lastDuration = null;
14
+ const durations = samplePositions.map((_, i, a) => {
15
+ var _a, _b;
16
+ // TODO: Why does 0 appear here?
17
+ if (a[i].duration === undefined || a[i].duration === 0) {
18
+ return ((_b = (_a = a[i + 1]) === null || _a === void 0 ? void 0 : _a.dts) !== null && _b !== void 0 ? _b : a[i].dts) - a[i].dts;
19
+ }
20
+ return a[i].duration;
21
+ });
22
+ const entries = [];
23
+ for (const duration of durations) {
24
+ if (duration === lastDuration) {
25
+ entries[entries.length - 1].sampleCount++;
26
+ }
27
+ else {
28
+ entries.push({
29
+ sampleCount: 1,
30
+ sampleOffset: duration,
31
+ });
32
+ }
33
+ lastDuration = duration;
34
+ }
35
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
36
+ // type
37
+ (0, primitives_1.stringsToUint8Array)('stts'),
38
+ // version
39
+ new Uint8Array([0]),
40
+ // flags
41
+ new Uint8Array([0, 0, 0]),
42
+ // entry count
43
+ (0, primitives_1.numberTo32BitUIntOrInt)(entries.length),
44
+ // entries
45
+ ...entries.map((e) => makeEntry(e)),
46
+ ]));
47
+ };
48
+ exports.createSttsAtom = createSttsAtom;
@@ -0,0 +1 @@
1
+ export declare const createStsdData: (codecSpecificData: Uint8Array) => Uint8Array;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStsdData = void 0;
4
+ const make_header_1 = require("../../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../../primitives");
6
+ const createStsdData = (codecSpecificData) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ // type
9
+ (0, primitives_1.stringsToUint8Array)('stsd'),
10
+ // version
11
+ new Uint8Array([0]),
12
+ // flags
13
+ new Uint8Array([0, 0, 0]),
14
+ // entry count
15
+ new Uint8Array([0, 0, 0, 1]),
16
+ // entry
17
+ codecSpecificData,
18
+ ]));
19
+ };
20
+ exports.createStsdData = createStsdData;
@@ -0,0 +1 @@
1
+ export declare const createAvccBox: (privateData: Uint8Array | null) => Uint8Array;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAvccBox = void 0;
4
+ const make_header_1 = require("../../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../../primitives");
6
+ const createAvccBox = (privateData) => {
7
+ if (!privateData) {
8
+ throw new Error('privateData is required');
9
+ }
10
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
11
+ // type
12
+ (0, primitives_1.stringsToUint8Array)('avcC'),
13
+ privateData,
14
+ ]));
15
+ };
16
+ exports.createAvccBox = createAvccBox;
@@ -0,0 +1 @@
1
+ export declare const createPasp: (x: number, y: number) => Uint8Array;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPasp = void 0;
4
+ const make_header_1 = require("../../../../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../../../../primitives");
6
+ const createPasp = (x, y) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ (0, primitives_1.stringsToUint8Array)('pasp'),
9
+ (0, primitives_1.numberTo32BitUIntOrInt)(x),
10
+ (0, primitives_1.numberTo32BitUIntOrInt)(y),
11
+ ]));
12
+ };
13
+ exports.createPasp = createPasp;
@@ -0,0 +1,4 @@
1
+ export declare const createMeta: ({ hdlr, ilst, }: {
2
+ hdlr: Uint8Array;
3
+ ilst: Uint8Array;
4
+ }) => Uint8Array;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMeta = void 0;
4
+ const make_header_1 = require("../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../primitives");
6
+ const createMeta = ({ hdlr, ilst, }) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ // type
9
+ (0, primitives_1.stringsToUint8Array)('meta'),
10
+ // version
11
+ new Uint8Array([0]),
12
+ // flags
13
+ new Uint8Array([0, 0, 0]),
14
+ // hdlr
15
+ hdlr,
16
+ // ilst
17
+ ilst,
18
+ ]));
19
+ };
20
+ exports.createMeta = createMeta;
@@ -0,0 +1 @@
1
+ export declare const createHdlr: (type: "video" | "audio" | "mdir") => Uint8Array;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createHdlr = void 0;
4
+ const make_header_1 = require("../../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../../primitives");
6
+ const createHdlr = (type) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ // type
9
+ (0, primitives_1.stringsToUint8Array)('hdlr'),
10
+ // version
11
+ new Uint8Array([0]),
12
+ // flags
13
+ new Uint8Array([0, 0, 0]),
14
+ // pre_defined
15
+ new Uint8Array([0, 0, 0, 0]),
16
+ // handler_type
17
+ (0, primitives_1.stringsToUint8Array)(type === 'mdir' ? 'mdir' : type === 'video' ? 'vide' : 'soun'),
18
+ // reserved
19
+ type === 'mdir'
20
+ ? (0, primitives_1.numberTo32BitUIntOrInt)(1634758764)
21
+ : new Uint8Array([0, 0, 0, 0]),
22
+ new Uint8Array([0, 0, 0, 0]),
23
+ new Uint8Array([0, 0, 0, 0]),
24
+ // name
25
+ (0, primitives_1.stringsToUint8Array)(type === 'mdir'
26
+ ? '\0'
27
+ : type === 'video'
28
+ ? 'VideoHandler\0'
29
+ : 'SoundHandler\0'),
30
+ ]));
31
+ };
32
+ exports.createHdlr = createHdlr;
@@ -0,0 +1,20 @@
1
+ import type { MediaParserAudioCodec, MediaParserVideoCodec, VideoTrackColorParams } from '../get-tracks';
2
+ export type MakeTrackAudio = {
3
+ trackNumber: number;
4
+ codec: MediaParserAudioCodec;
5
+ numberOfChannels: number;
6
+ sampleRate: number;
7
+ type: 'audio';
8
+ codecPrivate: Uint8Array | null;
9
+ timescale: number;
10
+ };
11
+ export type MakeTrackVideo = {
12
+ color: VideoTrackColorParams;
13
+ width: number;
14
+ height: number;
15
+ trackNumber: number;
16
+ codec: MediaParserVideoCodec;
17
+ type: 'video';
18
+ codecPrivate: Uint8Array | null;
19
+ timescale: number;
20
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,5 @@
1
1
  export declare const CLUSTER_MIN_VINT_WIDTH = 8;
2
- export declare const createClusterSegment: (timestamp: number) => import("../boxes/webm/segments/all-segments").BytesAndOffset;
2
+ export declare const createClusterSegment: (timestamp: number) => import("../../boxes/webm/segments/all-segments").BytesAndOffset;
3
3
  export declare const makeSimpleBlock: ({ bytes, trackNumber, timecodeRelativeToCluster, keyframe, invisible, lacing, }: {
4
4
  bytes: Uint8Array;
5
5
  trackNumber: number;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeSimpleBlock = exports.createClusterSegment = exports.CLUSTER_MIN_VINT_WIDTH = void 0;
4
- const ebml_1 = require("../boxes/webm/ebml");
5
- const make_header_1 = require("../boxes/webm/make-header");
4
+ const ebml_1 = require("../../boxes/webm/ebml");
5
+ const make_header_1 = require("../../boxes/webm/make-header");
6
6
  exports.CLUSTER_MIN_VINT_WIDTH = 8;
7
7
  const createClusterSegment = (timestamp) => {
8
8
  return (0, make_header_1.makeMatroskaBytes)({
@@ -0,0 +1,19 @@
1
+ import type { AudioOrVideoSample } from '../../webcodec-sample-types';
2
+ import type { Writer } from '../../writers/writer';
3
+ export declare const timestampToClusterTimestamp: (timestamp: number, timescale: number) => number;
4
+ export declare const canFitInCluster: ({ clusterStartTimestamp, chunk, timescale, }: {
5
+ clusterStartTimestamp: number;
6
+ chunk: AudioOrVideoSample;
7
+ timescale: number;
8
+ }) => boolean;
9
+ export declare const makeCluster: (w: Writer, clusterStartTimestamp: number, timescale: number) => Promise<{
10
+ addSample: (chunk: AudioOrVideoSample, trackNumber: number) => Promise<{
11
+ timecodeRelativeToCluster: number;
12
+ }>;
13
+ shouldMakeNewCluster: ({ isVideo, chunk, newT, }: {
14
+ newT: number;
15
+ chunk: AudioOrVideoSample;
16
+ isVideo: boolean;
17
+ }) => boolean;
18
+ startTimestamp: number;
19
+ }>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeCluster = exports.canFitInCluster = exports.timestampToClusterTimestamp = void 0;
4
+ const ebml_1 = require("../../boxes/webm/ebml");
5
+ const make_header_1 = require("../../boxes/webm/make-header");
6
+ const all_segments_1 = require("../../boxes/webm/segments/all-segments");
7
+ const cluster_segment_1 = require("./cluster-segment");
8
+ const maxClusterTimestamp = 2 ** 15;
9
+ const timestampToClusterTimestamp = (timestamp, timescale) => {
10
+ return Math.round((timestamp / timescale) * 1000);
11
+ };
12
+ exports.timestampToClusterTimestamp = timestampToClusterTimestamp;
13
+ const canFitInCluster = ({ clusterStartTimestamp, chunk, timescale, }) => {
14
+ const timecodeRelativeToCluster = (0, exports.timestampToClusterTimestamp)(chunk.timestamp, timescale) -
15
+ (0, exports.timestampToClusterTimestamp)(clusterStartTimestamp, timescale);
16
+ if (timecodeRelativeToCluster < 0) {
17
+ throw new Error(`timecodeRelativeToCluster is negative`);
18
+ }
19
+ return timecodeRelativeToCluster <= maxClusterTimestamp;
20
+ };
21
+ exports.canFitInCluster = canFitInCluster;
22
+ const makeCluster = async (w, clusterStartTimestamp, timescale) => {
23
+ const cluster = (0, cluster_segment_1.createClusterSegment)((0, exports.timestampToClusterTimestamp)(clusterStartTimestamp, timescale));
24
+ const clusterVIntPosition = w.getWrittenByteCount() +
25
+ cluster.offsets.offset +
26
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength;
27
+ let clusterSize = cluster.bytes.byteLength -
28
+ (0, make_header_1.matroskaToHex)(all_segments_1.matroskaElements.Cluster).byteLength -
29
+ cluster_segment_1.CLUSTER_MIN_VINT_WIDTH;
30
+ await w.write(cluster.bytes);
31
+ const addSample = async (chunk, trackNumber) => {
32
+ const timecodeRelativeToCluster = (0, exports.timestampToClusterTimestamp)(chunk.timestamp, timescale) -
33
+ (0, exports.timestampToClusterTimestamp)(clusterStartTimestamp, timescale);
34
+ if (!(0, exports.canFitInCluster)({ clusterStartTimestamp, chunk, timescale })) {
35
+ throw new Error(`timecodeRelativeToCluster is too big: ${timecodeRelativeToCluster} > ${maxClusterTimestamp}`);
36
+ }
37
+ const keyframe = chunk.type === 'key';
38
+ const simpleBlock = (0, cluster_segment_1.makeSimpleBlock)({
39
+ bytes: chunk.data,
40
+ invisible: false,
41
+ keyframe,
42
+ lacing: 0,
43
+ trackNumber,
44
+ timecodeRelativeToCluster,
45
+ });
46
+ clusterSize += simpleBlock.byteLength;
47
+ await w.updateDataAt(clusterVIntPosition, (0, ebml_1.getVariableInt)(clusterSize, cluster_segment_1.CLUSTER_MIN_VINT_WIDTH));
48
+ await w.write(simpleBlock);
49
+ return { timecodeRelativeToCluster };
50
+ };
51
+ const shouldMakeNewCluster = ({ isVideo, chunk, newT, }) => {
52
+ const newTimestamp = (0, exports.timestampToClusterTimestamp)(newT, timescale);
53
+ const oldTimestamp = (0, exports.timestampToClusterTimestamp)(clusterStartTimestamp, timescale);
54
+ const canFit = (0, exports.canFitInCluster)({
55
+ chunk,
56
+ clusterStartTimestamp,
57
+ timescale,
58
+ });
59
+ if (!canFit) {
60
+ // We must create a new cluster
61
+ // This is for example if we have an audio-only file
62
+ return true;
63
+ }
64
+ const keyframe = chunk.type === 'key';
65
+ // TODO: Timestamp falls apart when video only
66
+ return newTimestamp - oldTimestamp >= 2000 && keyframe && isVideo;
67
+ };
68
+ return {
69
+ addSample,
70
+ shouldMakeNewCluster,
71
+ startTimestamp: clusterStartTimestamp,
72
+ };
73
+ };
74
+ exports.makeCluster = makeCluster;
@@ -0,0 +1,2 @@
1
+ import type { MediaFn, MediaFnGeneratorInput } from '../media-fn';
2
+ export declare const createMatroskaMedia: ({ writer, onBytesProgress, onMillisecondsProgress, }: MediaFnGeneratorInput) => Promise<MediaFn>;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMedia = void 0;
4
- const ebml_1 = require("../boxes/webm/ebml");
5
- const make_header_1 = require("../boxes/webm/make-header");
6
- const all_segments_1 = require("../boxes/webm/segments/all-segments");
3
+ exports.createMatroskaMedia = void 0;
4
+ const ebml_1 = require("../../boxes/webm/ebml");
5
+ const make_header_1 = require("../../boxes/webm/make-header");
6
+ const all_segments_1 = require("../../boxes/webm/segments/all-segments");
7
7
  const cluster_1 = require("./cluster");
8
8
  const make_duration_with_padding_1 = require("./make-duration-with-padding");
9
9
  const matroska_cues_1 = require("./matroska-cues");
@@ -12,14 +12,14 @@ const matroska_info_1 = require("./matroska-info");
12
12
  const matroska_seek_1 = require("./matroska-seek");
13
13
  const matroska_segment_1 = require("./matroska-segment");
14
14
  const matroska_trackentry_1 = require("./matroska-trackentry");
15
- const timescale_1 = require("./timescale");
16
- const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, }) => {
15
+ const timescale = 1000000;
16
+ const createMatroskaMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, }) => {
17
17
  var _a, _b, _c, _d, _e, _f, _g;
18
18
  const header = (0, matroska_header_1.makeMatroskaHeader)();
19
19
  const w = await writer.createContent();
20
20
  await w.write(header.bytes);
21
21
  const matroskaInfo = (0, matroska_info_1.makeMatroskaInfo)({
22
- timescale: timescale_1.CREATE_TIME_SCALE,
22
+ timescale,
23
23
  });
24
24
  const currentTracks = [];
25
25
  const seeks = [];
@@ -69,7 +69,7 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
69
69
  };
70
70
  await w.write(matroskaSegment.bytes);
71
71
  const clusterOffset = w.getWrittenByteCount();
72
- let currentCluster = await (0, cluster_1.makeCluster)(w, 0);
72
+ let currentCluster = await (0, cluster_1.makeCluster)(w, 0, timescale);
73
73
  seeks.push({
74
74
  hexString: all_segments_1.matroskaElements.Cluster,
75
75
  byte: clusterOffset - seekHeadOffset,
@@ -79,12 +79,12 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
79
79
  const smallestProgress = Math.min(...Object.values(trackNumberProgresses));
80
80
  if (!currentCluster.shouldMakeNewCluster({
81
81
  newT: smallestProgress,
82
- keyframe: chunk.type === 'key',
83
82
  isVideo,
83
+ chunk,
84
84
  })) {
85
85
  return { cluster: currentCluster, isNew: false, smallestProgress };
86
86
  }
87
- currentCluster = await (0, cluster_1.makeCluster)(w, smallestProgress);
87
+ currentCluster = await (0, cluster_1.makeCluster)(w, smallestProgress, timescale);
88
88
  return { cluster: currentCluster, isNew: true, smallestProgress };
89
89
  };
90
90
  const updateDuration = async (newDuration) => {
@@ -92,7 +92,7 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
92
92
  await w.updateDataAt(durationOffset, blocks.bytes);
93
93
  onBytesProgress(w.getWrittenByteCount());
94
94
  };
95
- const addSample = async (chunk, trackNumber, isVideo) => {
95
+ const addSample = async ({ chunk, trackNumber, isVideo, }) => {
96
96
  var _a;
97
97
  trackNumberProgresses[trackNumber] = chunk.timestamp;
98
98
  const { cluster, isNew, smallestProgress } = await getClusterOrMakeNew({
@@ -105,7 +105,7 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
105
105
  if (isNew) {
106
106
  const newCluster = w.getWrittenByteCount();
107
107
  cues.push({
108
- time: (0, cluster_1.timestampToClusterTimestamp)(smallestProgress) +
108
+ time: (0, cluster_1.timestampToClusterTimestamp)(smallestProgress, timescale) +
109
109
  timecodeRelativeToCluster,
110
110
  clusterPosition: newCluster - seekHeadOffset,
111
111
  trackNumber,
@@ -122,6 +122,16 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
122
122
  const operationProm = { current: Promise.resolve() };
123
123
  const waitForFinishPromises = [];
124
124
  return {
125
+ updateTrackSampleRate: ({ sampleRate, trackNumber }) => {
126
+ currentTracks.forEach((track) => {
127
+ if (track.trackNumber === trackNumber) {
128
+ if (track.type !== 'audio') {
129
+ throw new Error('track is not audio');
130
+ }
131
+ track.sampleRate = sampleRate;
132
+ }
133
+ });
134
+ },
125
135
  save: async () => {
126
136
  const file = await w.save();
127
137
  return file;
@@ -129,8 +139,8 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
129
139
  remove: async () => {
130
140
  await w.remove();
131
141
  },
132
- addSample: (chunk, trackNumber, isVideo) => {
133
- operationProm.current = operationProm.current.then(() => addSample(chunk, trackNumber, isVideo));
142
+ addSample: ({ chunk, trackNumber, isVideo }) => {
143
+ operationProm.current = operationProm.current.then(() => addSample({ chunk, trackNumber, isVideo }));
134
144
  return operationProm.current;
135
145
  },
136
146
  updateDuration: (duration) => {
@@ -139,10 +149,7 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
139
149
  },
140
150
  addTrack: (track) => {
141
151
  const trackNumber = currentTracks.length + 1;
142
- const bytes = track.type === 'video'
143
- ? (0, matroska_trackentry_1.makeMatroskaVideoTrackEntryBytes)({ ...track, trackNumber })
144
- : (0, matroska_trackentry_1.makeMatroskaAudioTrackEntryBytes)({ ...track, trackNumber });
145
- operationProm.current = operationProm.current.then(() => addTrack(bytes));
152
+ operationProm.current = operationProm.current.then(() => addTrack({ ...track, trackNumber }));
146
153
  trackNumbers.push(trackNumber);
147
154
  return operationProm.current.then(() => ({ trackNumber }));
148
155
  },
@@ -167,4 +174,4 @@ const createMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, })
167
174
  },
168
175
  };
169
176
  };
170
- exports.createMedia = createMedia;
177
+ exports.createMatroskaMedia = createMatroskaMedia;
@@ -0,0 +1 @@
1
+ export declare const makeDurationWithPadding: (newDuration: number) => import("../../boxes/webm/segments/all-segments").BytesAndOffset;