@remotion/media-parser 4.0.229 → 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 (162) 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 -7
  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 +4 -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/{cluster.d.ts → matroska/cluster.d.ts} +6 -5
  113. package/dist/create/{cluster.js → matroska/cluster.js} +16 -16
  114. package/dist/create/matroska/create-matroska-media.d.ts +2 -0
  115. package/dist/create/{create-media.js → matroska/create-matroska-media.js} +25 -18
  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/{create-media.d.ts → media-fn.d.ts} +16 -4
  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 +1 -1
  135. package/dist/esm/index.mjs +1452 -209
  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 -20
  153. package/dist/writers/buffer-implementation/writer.js +1 -1
  154. package/package.json +3 -3
  155. package/dist/create/make-duration-with-padding.d.ts +0 -1
  156. package/dist/create/matroska-header.d.ts +0 -1
  157. package/dist/create/matroska-seek.d.ts +0 -6
  158. package/dist/create/matroska-trackentry.d.ts +0 -27
  159. package/dist/create/polyfill-audio-sample.d.ts +0 -3
  160. package/dist/create/polyfill-audio-sample.js +0 -15
  161. package/dist/writers/buffer-implementation/multi-buffer.d.ts +0 -0
  162. package/dist/writers/buffer-implementation/multi-buffer.js +0 -1
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseColorParameterBox = void 0;
4
- const parseColorParameterBox = ({ iterator, }) => {
4
+ const parse_icc_profile_1 = require("../parse-icc-profile");
5
+ const parseColorParameterBox = ({ iterator, size, }) => {
5
6
  const byteString = iterator.getByteString(4);
6
7
  if (byteString === 'nclx') {
7
8
  const primaries = iterator.getUint16();
@@ -12,6 +13,7 @@ const parseColorParameterBox = ({ iterator, }) => {
12
13
  iterator.stopReadingBits();
13
14
  return {
14
15
  type: 'colr-box',
16
+ colorType: 'transfer-characteristics',
15
17
  fullRangeFlag,
16
18
  matrixIndex,
17
19
  primaries,
@@ -24,12 +26,22 @@ const parseColorParameterBox = ({ iterator, }) => {
24
26
  const matrixIndex = iterator.getUint16();
25
27
  return {
26
28
  type: 'colr-box',
29
+ colorType: 'transfer-characteristics',
27
30
  fullRangeFlag: false,
28
31
  matrixIndex,
29
32
  primaries,
30
33
  transfer,
31
34
  };
32
35
  }
36
+ if (byteString === 'prof') {
37
+ const profile = iterator.getSlice(size - 12);
38
+ return {
39
+ type: 'colr-box',
40
+ colorType: 'icc-profile',
41
+ profile,
42
+ parsed: (0, parse_icc_profile_1.parseIccProfile)(profile),
43
+ };
44
+ }
33
45
  throw new Error('Unexpected box type ' + byteString);
34
46
  };
35
47
  exports.parseColorParameterBox = parseColorParameterBox;
@@ -8,11 +8,10 @@ export interface MebxBox extends BaseBox {
8
8
  format: string;
9
9
  children: AnySegment[];
10
10
  }
11
- export declare const parseMebx: ({ iterator, offset, size, options, littleEndian, signal, }: {
11
+ export declare const parseMebx: ({ iterator, offset, size, options, signal, }: {
12
12
  iterator: BufferIterator;
13
13
  offset: number;
14
14
  size: number;
15
15
  options: ParserContext;
16
- littleEndian: boolean;
17
16
  signal: AbortSignal | null;
18
17
  }) => Promise<MebxBox>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMebx = void 0;
4
4
  const process_box_1 = require("../process-box");
5
- const parseMebx = async ({ iterator, offset, size, options, littleEndian, signal, }) => {
5
+ const parseMebx = async ({ iterator, offset, size, options, signal, }) => {
6
6
  // reserved, 6 bit
7
7
  iterator.discard(6);
8
8
  const dataReferenceIndex = iterator.getUint16();
@@ -13,8 +13,8 @@ const parseMebx = async ({ iterator, offset, size, options, littleEndian, signal
13
13
  initialBoxes: [],
14
14
  options,
15
15
  continueMdat: false,
16
- littleEndian,
17
16
  signal,
17
+ logLevel: 'info',
18
18
  });
19
19
  if (children.status === 'incomplete') {
20
20
  throw new Error('Incomplete boxes are not allowed');
@@ -1,4 +1,5 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
+ import type { LogLevel } from '../../../log';
2
3
  import type { AnySegment } from '../../../parse-result';
3
4
  import type { ParserContext } from '../../../parser-context';
4
5
  type SampleBase = {
@@ -48,15 +49,17 @@ export type Sample = AudioSample | VideoSample | UnknownSample;
48
49
  type SampleAndNext = {
49
50
  sample: Sample | null;
50
51
  };
51
- export declare const processSample: ({ iterator, options, signal, }: {
52
+ export declare const processSample: ({ iterator, options, signal, logLevel, }: {
52
53
  iterator: BufferIterator;
53
54
  options: ParserContext;
54
55
  signal: AbortSignal | null;
56
+ logLevel: LogLevel;
55
57
  }) => Promise<SampleAndNext>;
56
- export declare const parseSamples: ({ iterator, maxBytes, options, signal, }: {
58
+ export declare const parseSamples: ({ iterator, maxBytes, options, signal, logLevel, }: {
57
59
  iterator: BufferIterator;
58
60
  maxBytes: number;
59
61
  options: ParserContext;
60
62
  signal: AbortSignal | null;
63
+ logLevel: LogLevel;
61
64
  }) => Promise<Sample[]>;
62
65
  export {};
@@ -61,7 +61,7 @@ const audioTags = [
61
61
  'mp4a',
62
62
  'ac-3',
63
63
  ];
64
- const processSample = async ({ iterator, options, signal, }) => {
64
+ const processSample = async ({ iterator, options, signal, logLevel, }) => {
65
65
  const fileOffset = iterator.counter.getOffset();
66
66
  const bytesRemaining = iterator.bytesRemaining();
67
67
  const boxSize = iterator.getUint32();
@@ -105,8 +105,8 @@ const processSample = async ({ iterator, options, signal, }) => {
105
105
  initialBoxes: [],
106
106
  options,
107
107
  continueMdat: false,
108
- littleEndian: false,
109
108
  signal,
109
+ logLevel,
110
110
  });
111
111
  if (children.status === 'incomplete') {
112
112
  throw new Error('Incomplete boxes are not allowed');
@@ -152,8 +152,8 @@ const processSample = async ({ iterator, options, signal, }) => {
152
152
  initialBoxes: [],
153
153
  options,
154
154
  continueMdat: false,
155
- littleEndian: false,
156
155
  signal,
156
+ logLevel,
157
157
  });
158
158
  if (children.status === 'incomplete') {
159
159
  throw new Error('Incomplete boxes are not allowed');
@@ -203,8 +203,8 @@ const processSample = async ({ iterator, options, signal, }) => {
203
203
  initialBoxes: [],
204
204
  options,
205
205
  continueMdat: false,
206
- littleEndian: false,
207
206
  signal,
207
+ logLevel,
208
208
  });
209
209
  if (children.status === 'incomplete') {
210
210
  throw new Error('Incomplete boxes are not allowed');
@@ -258,8 +258,8 @@ const processSample = async ({ iterator, options, signal, }) => {
258
258
  initialBoxes: [],
259
259
  options,
260
260
  continueMdat: false,
261
- littleEndian: false,
262
261
  signal,
262
+ logLevel,
263
263
  })
264
264
  : (iterator.discard(bytesRemainingInBox),
265
265
  { status: 'done', segments: [] });
@@ -294,7 +294,7 @@ const processSample = async ({ iterator, options, signal, }) => {
294
294
  throw new Error(`Unknown sample format ${boxFormat}`);
295
295
  };
296
296
  exports.processSample = processSample;
297
- const parseSamples = async ({ iterator, maxBytes, options, signal, }) => {
297
+ const parseSamples = async ({ iterator, maxBytes, options, signal, logLevel, }) => {
298
298
  const samples = [];
299
299
  const initialOffset = iterator.counter.getOffset();
300
300
  while (iterator.bytesRemaining() > 0 &&
@@ -303,6 +303,7 @@ const parseSamples = async ({ iterator, maxBytes, options, signal, }) => {
303
303
  iterator,
304
304
  options,
305
305
  signal,
306
+ logLevel,
306
307
  });
307
308
  if (sample) {
308
309
  samples.push(sample);
@@ -16,6 +16,7 @@ const parseStsd = async ({ iterator, offset, size, options, signal, }) => {
16
16
  maxBytes: bytesRemainingInBox,
17
17
  options,
18
18
  signal,
19
+ logLevel: 'info',
19
20
  });
20
21
  if (boxes.length !== numberOfEntries) {
21
22
  throw new Error(`Expected ${numberOfEntries} sample descriptions, got ${boxes.length}`);
@@ -1 +1,2 @@
1
1
  export declare const toUnixTimestamp: (value: number) => number | null;
2
+ export declare const fromUnixTimestamp: (value: number | null) => number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toUnixTimestamp = void 0;
3
+ exports.fromUnixTimestamp = exports.toUnixTimestamp = void 0;
4
4
  const toUnixTimestamp = (value) => {
5
5
  if (value === 0) {
6
6
  return null;
@@ -9,3 +9,11 @@ const toUnixTimestamp = (value) => {
9
9
  return Math.floor(value + baseDate.getTime() / 1000) * 1000;
10
10
  };
11
11
  exports.toUnixTimestamp = toUnixTimestamp;
12
+ const fromUnixTimestamp = (value) => {
13
+ if (value === null) {
14
+ return 0;
15
+ }
16
+ const baseDate = new Date('1904-01-01T00:00:00Z');
17
+ return Math.floor(value / 1000 - baseDate.getTime() / 1000);
18
+ };
19
+ exports.fromUnixTimestamp = fromUnixTimestamp;
@@ -1,4 +1,5 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
+ import type { LogLevel } from '../../../log';
2
3
  import type { AnySegment } from '../../../parse-result';
3
4
  import type { ParserContext } from '../../../parser-context';
4
5
  import type { BaseBox } from '../base-type';
@@ -6,10 +7,11 @@ export interface TrakBox extends BaseBox {
6
7
  type: 'trak-box';
7
8
  children: AnySegment[];
8
9
  }
9
- export declare const parseTrak: ({ data, size, offsetAtStart, options, signal, }: {
10
+ export declare const parseTrak: ({ data, size, offsetAtStart, options, signal, logLevel, }: {
10
11
  data: BufferIterator;
11
12
  size: number;
12
13
  offsetAtStart: number;
13
14
  options: ParserContext;
14
15
  signal: AbortSignal | null;
16
+ logLevel: LogLevel;
15
17
  }) => Promise<TrakBox>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseTrak = void 0;
4
4
  const process_box_1 = require("../process-box");
5
- const parseTrak = async ({ data, size, offsetAtStart, options, signal, }) => {
5
+ const parseTrak = async ({ data, size, offsetAtStart, options, signal, logLevel, }) => {
6
6
  const children = await (0, process_box_1.parseBoxes)({
7
7
  iterator: data,
8
8
  maxBytes: size - (data.counter.getOffset() - offsetAtStart),
@@ -10,8 +10,8 @@ const parseTrak = async ({ data, size, offsetAtStart, options, signal, }) => {
10
10
  initialBoxes: [],
11
11
  options,
12
12
  continueMdat: false,
13
- littleEndian: false,
14
13
  signal,
14
+ logLevel,
15
15
  });
16
16
  if (children.status === 'incomplete') {
17
17
  throw new Error('Incomplete boxes are not allowed');
@@ -61,7 +61,7 @@ const parseAv1PrivateData = (data, colrAtom) => {
61
61
  : '0'
62
62
  : '0';
63
63
  str += '.';
64
- if (colrAtom) {
64
+ if (colrAtom && colrAtom.colorType === 'transfer-characteristics') {
65
65
  str += colrAtom.primaries.toString().padStart(2, '0');
66
66
  str += '.';
67
67
  str += colrAtom.transfer.toString().padStart(2, '0');
@@ -1,2 +1,2 @@
1
- export declare const measureEBMLVarInt: (value: number) => 1 | 4 | 2 | 3 | 5 | 6;
1
+ export declare const measureEBMLVarInt: (value: number) => 1 | 2 | 3 | 4 | 5 | 6;
2
2
  export declare const getVariableInt: (value: number, minWidth: number | null) => Uint8Array;
@@ -1,15 +1,15 @@
1
1
  import type { ParserContext } from '../../parser-context';
2
- import type { AudioSample, VideoSample } from '../../webcodec-sample-types';
2
+ import type { AudioOrVideoSample } from '../../webcodec-sample-types';
3
3
  import type { BlockSegment, SimpleBlockSegment } from './segments/all-segments';
4
4
  type SampleResult = {
5
5
  type: 'video-sample';
6
- videoSample: VideoSample;
6
+ videoSample: AudioOrVideoSample;
7
7
  } | {
8
8
  type: 'audio-sample';
9
- audioSample: AudioSample;
9
+ audioSample: AudioOrVideoSample;
10
10
  } | {
11
11
  type: 'partial-video-sample';
12
- partialVideoSample: Omit<VideoSample, 'type'>;
12
+ partialVideoSample: Omit<AudioOrVideoSample, 'type'>;
13
13
  } | {
14
14
  type: 'no-sample';
15
15
  };
@@ -34,8 +34,8 @@ const getSampleFromBlock = (ebml, parserContext, offset) => {
34
34
  if (codec.startsWith('V_')) {
35
35
  const partialVideoSample = {
36
36
  data: iterator.getSlice(remainingNow),
37
- cts: null,
38
- dts: null,
37
+ cts: timecodeInMicroseconds,
38
+ dts: timecodeInMicroseconds,
39
39
  duration: undefined,
40
40
  trackId: trackNumber,
41
41
  timestamp: timecodeInMicroseconds,
@@ -64,6 +64,8 @@ const getSampleFromBlock = (ebml, parserContext, offset) => {
64
64
  timestamp: timecodeInMicroseconds,
65
65
  type: 'key',
66
66
  duration: undefined,
67
+ cts: timecodeInMicroseconds,
68
+ dts: timecodeInMicroseconds,
67
69
  };
68
70
  iterator.destroy();
69
71
  return {
@@ -231,6 +231,7 @@ const getTrack = ({ timescale, track, }) => {
231
231
  codecWithoutConfig: getMatroskaVideoCodecWithoutConfigString({
232
232
  codecSegment: codec,
233
233
  }),
234
+ fps: null,
234
235
  };
235
236
  }
236
237
  if ((0, track_entry_1.trackTypeToString)(trackType.value.value) === 'audio') {
@@ -26,7 +26,7 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
26
26
  isWebm: () => boolean;
27
27
  discard: (length: number) => void;
28
28
  getEightByteNumber: (littleEndian?: boolean) => number;
29
- getFourByteNumber: (littleEndian?: boolean) => number;
29
+ getFourByteNumber: () => number;
30
30
  getSlice: (amount: number) => Uint8Array;
31
31
  getAtom: () => string;
32
32
  isRiff: () => boolean;
@@ -132,14 +132,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
132
132
  ]);
133
133
  return Number(bigInt);
134
134
  };
135
- const getFourByteNumber = (littleEndian = false) => {
136
- if (littleEndian) {
137
- const one = getUint8();
138
- const two = getUint8();
139
- const three = getUint8();
140
- const four = getUint8();
141
- return (four << 24) | (three << 16) | (two << 8) | one;
142
- }
135
+ const getFourByteNumber = () => {
143
136
  return ((getUint8() << 24) | (getUint8() << 16) | (getUint8() << 8) | getUint8());
144
137
  };
145
138
  const getPaddedFourByteNumber = () => {
@@ -0,0 +1,2 @@
1
+ import type { Avc1Data } from './create-codec-specific-data';
2
+ export declare const createAvc1Data: ({ avccBox, pasp, width, height, horizontalResolution, verticalResolution, compressorName, depth, }: Avc1Data) => Uint8Array;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAvc1Data = void 0;
4
+ const make_header_1 = require("../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../primitives");
6
+ const createAvc1Data = ({ avccBox, pasp, width, height, horizontalResolution, verticalResolution, compressorName, depth, }) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ // type
9
+ (0, primitives_1.stringsToUint8Array)('avc1'),
10
+ // reserved
11
+ new Uint8Array([0, 0, 0, 0, 0, 0]),
12
+ // data_reference_index
13
+ new Uint8Array([0, 1]),
14
+ // version
15
+ new Uint8Array([0, 0]),
16
+ // revisionLevel
17
+ new Uint8Array([0, 0]),
18
+ // vendor
19
+ new Uint8Array([0, 0, 0, 0]),
20
+ // temporalQuality
21
+ new Uint8Array([0, 0, 0, 0]),
22
+ // spatialQuality
23
+ new Uint8Array([0, 0, 0, 0]),
24
+ // width
25
+ (0, primitives_1.numberTo16BitUIntOrInt)(width),
26
+ // height
27
+ (0, primitives_1.numberTo16BitUIntOrInt)(height),
28
+ // horizontalResolution
29
+ (0, primitives_1.setFixedPointSignedOrUnsigned1616Number)(horizontalResolution),
30
+ // verticalResolution
31
+ (0, primitives_1.setFixedPointSignedOrUnsigned1616Number)(verticalResolution),
32
+ // dataSize
33
+ new Uint8Array([0, 0, 0, 0]),
34
+ // frame count per sample
35
+ (0, primitives_1.numberTo16BitUIntOrInt)(1),
36
+ // compressor name
37
+ (0, primitives_1.stringToPascalString)(compressorName),
38
+ // depth
39
+ (0, primitives_1.numberTo16BitUIntOrInt)(depth),
40
+ // colorTableId
41
+ (0, primitives_1.numberTo16BitUIntOrInt)(-1),
42
+ // avcc box
43
+ avccBox,
44
+ // pasp
45
+ pasp,
46
+ ]));
47
+ };
48
+ exports.createAvc1Data = createAvc1Data;
@@ -0,0 +1,22 @@
1
+ import type { MakeTrackAudio, MakeTrackVideo } from '../../make-track-info';
2
+ export type Avc1Data = {
3
+ pasp: Uint8Array;
4
+ avccBox: Uint8Array;
5
+ width: number;
6
+ height: number;
7
+ horizontalResolution: number;
8
+ verticalResolution: number;
9
+ compressorName: string;
10
+ depth: number;
11
+ type: 'avc1-data';
12
+ };
13
+ export type Mp4aData = {
14
+ type: 'mp4a-data';
15
+ sampleRate: number;
16
+ channelCount: number;
17
+ maxBitrate: number;
18
+ avgBitrate: number;
19
+ codecPrivate: Uint8Array | null;
20
+ };
21
+ export type CodecSpecificData = Avc1Data | Mp4aData;
22
+ export declare const createCodecSpecificData: (track: MakeTrackAudio | MakeTrackVideo) => Uint8Array;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCodecSpecificData = void 0;
4
+ const create_avcc_1 = require("../trak/mdia/minf/stbl/stsd/create-avcc");
5
+ const create_pasp_1 = require("../trak/mdia/minf/stbl/stsd/create-pasp");
6
+ const avc1_1 = require("./avc1");
7
+ const mp4a_1 = require("./mp4a");
8
+ const createCodecSpecificData = (track) => {
9
+ if (track.type === 'video') {
10
+ return (0, avc1_1.createAvc1Data)({
11
+ avccBox: (0, create_avcc_1.createAvccBox)(track.codecPrivate),
12
+ compressorName: 'WebCodecs',
13
+ depth: 24,
14
+ horizontalResolution: 72,
15
+ verticalResolution: 72,
16
+ height: track.height,
17
+ width: track.width,
18
+ pasp: (0, create_pasp_1.createPasp)(1, 1),
19
+ type: 'avc1-data',
20
+ });
21
+ }
22
+ if (track.type === 'audio') {
23
+ return (0, mp4a_1.createMp4a)({
24
+ type: 'mp4a-data',
25
+ // TODO: Put in values based on real data,
26
+ // this seems to work though
27
+ avgBitrate: 128 * 1024,
28
+ maxBitrate: 128 * 1024,
29
+ channelCount: track.numberOfChannels,
30
+ sampleRate: track.sampleRate,
31
+ codecPrivate: track.codecPrivate,
32
+ });
33
+ }
34
+ throw new Error('Unsupported codec specific data ' + track);
35
+ };
36
+ exports.createCodecSpecificData = createCodecSpecificData;
@@ -0,0 +1,2 @@
1
+ import type { Mp4aData } from './create-codec-specific-data';
2
+ export declare const createMp4a: ({ sampleRate, channelCount, avgBitrate, maxBitrate, codecPrivate, }: Mp4aData) => Uint8Array;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMp4a = void 0;
4
+ const make_header_1 = require("../../../boxes/webm/make-header");
5
+ const primitives_1 = require("../primitives");
6
+ const createMp4a = ({ sampleRate, channelCount, avgBitrate, maxBitrate, codecPrivate, }) => {
7
+ if (!codecPrivate) {
8
+ throw new Error('Need codecPrivate for mp4a');
9
+ }
10
+ const esdsAtom = (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
11
+ // type
12
+ (0, primitives_1.stringsToUint8Array)('esds'),
13
+ // version
14
+ new Uint8Array([0]),
15
+ // flags
16
+ new Uint8Array([0, 0, 0]),
17
+ // tag = 'ES_DescrTag'
18
+ new Uint8Array([3]),
19
+ (0, primitives_1.addLeading128Size)((0, make_header_1.combineUint8Arrays)([
20
+ // ES_ID
21
+ (0, primitives_1.numberTo16BitUIntOrInt)(2),
22
+ // streamDependenceFlag, URL_Flag, OCRstreamFlag
23
+ new Uint8Array([0]),
24
+ // DecoderConfigDescrTag
25
+ new Uint8Array([4]),
26
+ (0, primitives_1.addLeading128Size)((0, make_header_1.combineUint8Arrays)([
27
+ // objectTypeIndication
28
+ new Uint8Array([0x40]),
29
+ // streamType, upStream
30
+ new Uint8Array([21]),
31
+ // reserved
32
+ new Uint8Array([0, 0, 0]),
33
+ // maxBitrate
34
+ (0, primitives_1.numberTo32BitUIntOrInt)(maxBitrate),
35
+ // avgBitrate
36
+ (0, primitives_1.numberTo32BitUIntOrInt)(avgBitrate),
37
+ // DecoderSpecificInfoTag
38
+ new Uint8Array([5]),
39
+ // codec private, for example [17, 144]
40
+ // audioObjectType = 2 = 'AAC LC'
41
+ // samplingFrequencyIndex = 3 = '48000 Hz'
42
+ // channelConfiguration = 2 = '2 channels'
43
+ /**
44
+ * Byte 1 (17): 0001 0001
45
+ ^^^^^ ^^^^
46
+ | |
47
+ | +-- Start of samplingFrequencyIndex (3)
48
+ +-- audioConfigType (2)
49
+
50
+ Byte 2 (144): 1001 0000
51
+ ^^^^ ^^^^
52
+ | |
53
+ | +-- Remaining bits/padding
54
+ +-- channelConfiguration (2)
55
+ */
56
+ (0, primitives_1.addLeading128Size)(codecPrivate),
57
+ ])),
58
+ // SLConfigDescrTag
59
+ new Uint8Array([6]),
60
+ (0, primitives_1.addLeading128Size)(new Uint8Array([2])),
61
+ ])),
62
+ ]));
63
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
64
+ // type
65
+ (0, primitives_1.stringsToUint8Array)('mp4a'),
66
+ // reserved
67
+ new Uint8Array([0, 0, 0, 0, 0, 0]),
68
+ // data_reference_index
69
+ (0, primitives_1.numberTo16BitUIntOrInt)(1),
70
+ // version
71
+ (0, primitives_1.numberTo16BitUIntOrInt)(0),
72
+ // revision level
73
+ (0, primitives_1.numberTo16BitUIntOrInt)(0),
74
+ // vendor
75
+ new Uint8Array([0, 0, 0, 0]),
76
+ // channelCount
77
+ (0, primitives_1.numberTo16BitUIntOrInt)(channelCount),
78
+ // sampleSize
79
+ (0, primitives_1.numberTo16BitUIntOrInt)(16),
80
+ // compressionId
81
+ (0, primitives_1.numberTo16BitUIntOrInt)(0),
82
+ // packet size
83
+ (0, primitives_1.numberTo16BitUIntOrInt)(0),
84
+ // sample rate
85
+ (0, primitives_1.setFixedPointSignedOrUnsigned1616Number)(sampleRate),
86
+ // esds atom
87
+ esdsAtom,
88
+ ]));
89
+ };
90
+ exports.createMp4a = createMp4a;
@@ -0,0 +1,6 @@
1
+ export declare const createColr: ({ fullRange, matrixIndex, primaries, transferFunction, }: {
2
+ fullRange: boolean;
3
+ matrixIndex: number;
4
+ primaries: number;
5
+ transferFunction: number;
6
+ }) => Uint8Array;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createColr = void 0;
4
+ const make_header_1 = require("../../boxes/webm/make-header");
5
+ const primitives_1 = require("./primitives");
6
+ // TODO: Not used in creation of MP4 yet
7
+ const createColr = ({ fullRange, matrixIndex, primaries, transferFunction, }) => {
8
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
9
+ // type
10
+ (0, primitives_1.stringsToUint8Array)('colr'),
11
+ // colour_type
12
+ (0, primitives_1.stringsToUint8Array)('nclx'),
13
+ // primaries
14
+ // 1 = 'ITU-R BT.7090
15
+ new Uint8Array([0, primaries]),
16
+ // transfer_function
17
+ // 1 = 'ITU-R BT.7090
18
+ new Uint8Array([0, transferFunction]),
19
+ // matrix_index
20
+ // 1 = 'ITU-R BT.7090
21
+ new Uint8Array([0, matrixIndex]),
22
+ // full_range_flag
23
+ new Uint8Array([fullRange ? 1 : 0]),
24
+ ]));
25
+ };
26
+ exports.createColr = createColr;
@@ -0,0 +1,10 @@
1
+ export declare const createFtyp: ({ majorBrand, minorBrand, compatibleBrands, }: {
2
+ majorBrand: string;
3
+ minorBrand: number;
4
+ compatibleBrands: string[];
5
+ }) => Uint8Array;
6
+ export declare const createIsoBaseMediaFtyp: ({ majorBrand, minorBrand, compatibleBrands, }: {
7
+ majorBrand: string;
8
+ minorBrand: number;
9
+ compatibleBrands: string[];
10
+ }) => Uint8Array;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIsoBaseMediaFtyp = exports.createFtyp = void 0;
4
+ const make_header_1 = require("../../boxes/webm/make-header");
5
+ const primitives_1 = require("./primitives");
6
+ const createFtyp = ({ majorBrand, minorBrand, compatibleBrands, }) => {
7
+ const type = (0, primitives_1.stringsToUint8Array)('ftyp');
8
+ const majorBrandArr = (0, primitives_1.stringsToUint8Array)(majorBrand);
9
+ const minorBrandArr = (0, primitives_1.numberTo32BitUIntOrInt)(minorBrand);
10
+ const compatibleBrandsArr = (0, make_header_1.combineUint8Arrays)(compatibleBrands.map((b) => (0, primitives_1.stringsToUint8Array)(b)));
11
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
12
+ type,
13
+ majorBrandArr,
14
+ minorBrandArr,
15
+ compatibleBrandsArr,
16
+ ]));
17
+ };
18
+ exports.createFtyp = createFtyp;
19
+ const createIsoBaseMediaFtyp = ({ majorBrand, minorBrand, compatibleBrands, }) => {
20
+ return (0, exports.createFtyp)({ compatibleBrands, majorBrand, minorBrand });
21
+ };
22
+ exports.createIsoBaseMediaFtyp = createIsoBaseMediaFtyp;
@@ -0,0 +1 @@
1
+ export declare const createIlst: (items: Uint8Array[]) => Uint8Array;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIlst = void 0;
4
+ const make_header_1 = require("../../boxes/webm/make-header");
5
+ const primitives_1 = require("./primitives");
6
+ const createIlst = (items) => {
7
+ return (0, primitives_1.addSize)((0, make_header_1.combineUint8Arrays)([
8
+ // name
9
+ (0, primitives_1.stringsToUint8Array)('ilst'),
10
+ // items
11
+ ...items,
12
+ ]));
13
+ };
14
+ exports.createIlst = createIlst;
@@ -0,0 +1,2 @@
1
+ import type { MediaFn, MediaFnGeneratorInput } from '../media-fn';
2
+ export declare const createIsoBaseMedia: ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, }: MediaFnGeneratorInput) => Promise<MediaFn>;