@remotion/media-parser 4.0.208 → 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 (215) 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 +5 -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/buffer-iterator.js +6 -0
  39. package/dist/create/cluster-segment.d.ts +1 -1
  40. package/dist/create/cluster-segment.js +3 -5
  41. package/dist/create/cluster.d.ts +13 -0
  42. package/dist/create/cluster.js +54 -0
  43. package/dist/create/create-media.d.ts +4 -2
  44. package/dist/create/create-media.js +87 -47
  45. package/dist/create/cues.d.ts +0 -0
  46. package/dist/create/cues.js +1 -0
  47. package/dist/create/make-duration-with-padding.d.ts +1 -0
  48. package/dist/create/make-duration-with-padding.js +15 -0
  49. package/dist/create/matroska-cues.d.ts +6 -0
  50. package/dist/create/matroska-cues.js +50 -0
  51. package/dist/create/matroska-info.d.ts +1 -2
  52. package/dist/create/matroska-info.js +3 -11
  53. package/dist/create/matroska-seek.d.ts +6 -0
  54. package/dist/create/matroska-seek.js +32 -0
  55. package/dist/create/matroska-segment.d.ts +1 -0
  56. package/dist/create/matroska-segment.js +3 -2
  57. package/dist/create/matroska-trackentry.d.ts +9 -14
  58. package/dist/create/matroska-trackentry.js +79 -94
  59. package/dist/create/timescale.d.ts +1 -0
  60. package/dist/create/timescale.js +4 -0
  61. package/dist/emit-available-info.d.ts +12 -0
  62. package/dist/emit-available-info.js +133 -0
  63. package/dist/esm/buffer.mjs +57 -0
  64. package/dist/esm/from-fetch.mjs +72 -0
  65. package/dist/esm/from-node.mjs +48 -0
  66. package/dist/esm/from-web-file.mjs +48 -0
  67. package/dist/esm/index.mjs +6689 -0
  68. package/dist/esm/web-fs.mjs +67 -0
  69. package/dist/get-audio-codec.d.ts +5 -5
  70. package/dist/get-audio-codec.js +41 -57
  71. package/dist/get-container.d.ts +4 -0
  72. package/dist/get-container.js +26 -0
  73. package/dist/get-duration.js +1 -1
  74. package/dist/get-fps.js +1 -1
  75. package/dist/get-sample-aspect-ratio.d.ts +1 -1
  76. package/dist/get-sample-aspect-ratio.js +19 -19
  77. package/dist/get-tracks.d.ts +13 -0
  78. package/dist/get-tracks.js +8 -8
  79. package/dist/get-video-codec.d.ts +5 -2
  80. package/dist/get-video-codec.js +111 -21
  81. package/dist/has-all-info.d.ts +2 -2
  82. package/dist/has-all-info.js +23 -9
  83. package/dist/index.d.ts +3 -1
  84. package/dist/options.d.ts +97 -30
  85. package/dist/parse-media.js +43 -62
  86. package/dist/parse-video.d.ts +2 -1
  87. package/dist/parse-video.js +3 -1
  88. package/dist/parser-state.js +1 -2
  89. package/dist/readers/from-fetch.js +24 -4
  90. package/dist/readers/from-node.js +13 -3
  91. package/dist/readers/from-web-file.js +14 -2
  92. package/dist/readers/reader.d.ts +6 -1
  93. package/dist/samples-from-moof.js +1 -1
  94. package/dist/traversal.d.ts +0 -21
  95. package/dist/traversal.js +1 -158
  96. package/dist/truthy.d.ts +3 -0
  97. package/dist/truthy.js +7 -0
  98. package/dist/writers/buffer.d.ts +2 -0
  99. package/dist/writers/buffer.js +58 -0
  100. package/dist/writers/web-fs.d.ts +1 -0
  101. package/dist/writers/web-fs.js +42 -18
  102. package/dist/writers/writer.d.ts +4 -2
  103. package/fetch.js +2 -0
  104. package/node.js +2 -0
  105. package/package.json +43 -8
  106. package/web-file.js +2 -0
  107. package/web-fs.js +2 -0
  108. package/.eslintrc +0 -8
  109. package/input.webm +0 -0
  110. package/src/add-new-matroska-tracks.ts +0 -23
  111. package/src/boxes/iso-base-media/base-type.ts +0 -4
  112. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
  113. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
  114. package/src/boxes/iso-base-media/esds/esds.ts +0 -49
  115. package/src/boxes/iso-base-media/ftyp.ts +0 -39
  116. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
  117. package/src/boxes/iso-base-media/make-track.ts +0 -116
  118. package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
  119. package/src/boxes/iso-base-media/mdhd.ts +0 -59
  120. package/src/boxes/iso-base-media/moov/moov.ts +0 -43
  121. package/src/boxes/iso-base-media/mvhd.ts +0 -114
  122. package/src/boxes/iso-base-media/process-box.ts +0 -748
  123. package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
  124. package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
  125. package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
  126. package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
  127. package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
  128. package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
  129. package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
  130. package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
  131. package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
  132. package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
  133. package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
  134. package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
  135. package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
  136. package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
  137. package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
  138. package/src/boxes/iso-base-media/tfdt.ts +0 -37
  139. package/src/boxes/iso-base-media/tfhd.ts +0 -66
  140. package/src/boxes/iso-base-media/tkhd.ts +0 -150
  141. package/src/boxes/iso-base-media/to-date.ts +0 -9
  142. package/src/boxes/iso-base-media/trak/trak.ts +0 -43
  143. package/src/boxes/iso-base-media/trun.ts +0 -74
  144. package/src/boxes/iso-base-media/void-box.ts +0 -4
  145. package/src/boxes/webm/allowed-partial-segments.ts +0 -1
  146. package/src/boxes/webm/av1-codec-private.ts +0 -113
  147. package/src/boxes/webm/description.ts +0 -104
  148. package/src/boxes/webm/ebml.ts +0 -98
  149. package/src/boxes/webm/get-ready-tracks.ts +0 -36
  150. package/src/boxes/webm/get-sample-from-block.ts +0 -125
  151. package/src/boxes/webm/get-track.ts +0 -257
  152. package/src/boxes/webm/make-header.ts +0 -253
  153. package/src/boxes/webm/parse-ebml.ts +0 -255
  154. package/src/boxes/webm/parse-webm-header.ts +0 -18
  155. package/src/boxes/webm/segments/all-segments.ts +0 -888
  156. package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
  157. package/src/boxes/webm/segments/parse-children.ts +0 -144
  158. package/src/boxes/webm/segments/track-entry.ts +0 -38
  159. package/src/boxes/webm/segments.ts +0 -147
  160. package/src/boxes/webm/traversal.ts +0 -45
  161. package/src/buffer-iterator.ts +0 -548
  162. package/src/create/cluster-segment.ts +0 -62
  163. package/src/create/create-media.ts +0 -172
  164. package/src/create/matroska-header.ts +0 -63
  165. package/src/create/matroska-info.ts +0 -46
  166. package/src/create/matroska-segment.ts +0 -10
  167. package/src/create/matroska-trackentry.ts +0 -325
  168. package/src/get-audio-codec.ts +0 -270
  169. package/src/get-dimensions.ts +0 -47
  170. package/src/get-duration.ts +0 -103
  171. package/src/get-fps.ts +0 -113
  172. package/src/get-sample-aspect-ratio.ts +0 -204
  173. package/src/get-sample-positions.ts +0 -93
  174. package/src/get-tracks.ts +0 -147
  175. package/src/get-video-codec.ts +0 -117
  176. package/src/has-all-info.ts +0 -81
  177. package/src/index.ts +0 -18
  178. package/src/make-hvc1-codec-strings.ts +0 -55
  179. package/src/options.ts +0 -118
  180. package/src/parse-media.ts +0 -183
  181. package/src/parse-result.ts +0 -79
  182. package/src/parse-video.ts +0 -83
  183. package/src/parser-context.ts +0 -10
  184. package/src/parser-state.ts +0 -178
  185. package/src/readers/from-fetch.ts +0 -90
  186. package/src/readers/from-node.ts +0 -51
  187. package/src/readers/from-web-file.ts +0 -49
  188. package/src/readers/reader.ts +0 -15
  189. package/src/samples-from-moof.ts +0 -102
  190. package/src/test/aspect-ratio.test.ts +0 -42
  191. package/src/test/av1.test.ts +0 -108
  192. package/src/test/create-matroska.test.ts +0 -287
  193. package/src/test/duration.test.ts +0 -18
  194. package/src/test/keys.test.ts +0 -47
  195. package/src/test/matroska.test.ts +0 -463
  196. package/src/test/mvhd.test.ts +0 -94
  197. package/src/test/parse-esds.test.ts +0 -98
  198. package/src/test/parse-stco.test.ts +0 -61
  199. package/src/test/parse-stsc.test.ts +0 -104
  200. package/src/test/parse-stsz.test.ts +0 -57
  201. package/src/test/parse-stts.test.ts +0 -38
  202. package/src/test/parse-video.test.ts +0 -101
  203. package/src/test/parse-webm.test.ts +0 -17
  204. package/src/test/samples-from-moof.test.ts +0 -2496
  205. package/src/test/stream-local.test.ts +0 -743
  206. package/src/test/stream-remote.test.ts +0 -59
  207. package/src/test/stream-samples.test.ts +0 -181
  208. package/src/test/stsd.test.ts +0 -265
  209. package/src/test/tkhd.test.ts +0 -87
  210. package/src/traversal.ts +0 -528
  211. package/src/webcodec-sample-types.ts +0 -29
  212. package/src/writers/web-fs.ts +0 -50
  213. package/src/writers/writer.ts +0 -12
  214. package/tsconfig.json +0 -14
  215. package/tsconfig.tsbuildinfo +0 -1
@@ -1,172 +0,0 @@
1
- import {getVariableInt} from '../boxes/webm/ebml';
2
- import {
3
- combineUint8Arrays,
4
- matroskaToHex,
5
- padMatroskaBytes,
6
- } from '../boxes/webm/make-header';
7
- import type {BytesAndOffset} from '../boxes/webm/segments/all-segments';
8
- import {matroskaElements} from '../boxes/webm/segments/all-segments';
9
- import type {WriterInterface} from '../writers/writer';
10
- import {
11
- CLUSTER_MIN_VINT_WIDTH,
12
- createClusterSegment,
13
- makeSimpleBlock,
14
- } from './cluster-segment';
15
- import {makeMatroskaHeader} from './matroska-header';
16
- import {makeMatroskaInfo} from './matroska-info';
17
- import {createMatroskaSegment} from './matroska-segment';
18
- import type {MakeTrackAudio, MakeTrackVideo} from './matroska-trackentry';
19
- import {
20
- makeMatroskaAudioTrackEntryBytes,
21
- makeMatroskaTracks,
22
- makeMatroskaVideoTrackEntryBytes,
23
- } from './matroska-trackentry';
24
-
25
- export type MediaFn = {
26
- save: () => Promise<void>;
27
- addSample: (chunk: EncodedVideoChunk, trackNumber: number) => Promise<void>;
28
- updateDuration: (duration: number) => Promise<void>;
29
- addTrack: (
30
- track:
31
- | Omit<MakeTrackAudio, 'trackNumber'>
32
- | Omit<MakeTrackVideo, 'trackNumber'>,
33
- ) => Promise<{trackNumber: number}>;
34
- addWaitForFinishPromise: (promise: () => Promise<void>) => void;
35
- waitForFinish: () => Promise<void>;
36
- };
37
-
38
- export const createMedia = async (
39
- writer: WriterInterface,
40
- ): Promise<MediaFn> => {
41
- const header = makeMatroskaHeader();
42
-
43
- const w = await writer.createContent();
44
- await w.write(header.bytes);
45
- const matroskaInfo = makeMatroskaInfo({
46
- timescale: 1_000_000,
47
- // TODO: Hardcoded
48
- duration: 2658,
49
- });
50
-
51
- const currentTracks: BytesAndOffset[] = [];
52
-
53
- const matroskaTracks = makeMatroskaTracks(currentTracks);
54
- const matroskaSegment = createMatroskaSegment([
55
- matroskaInfo,
56
- ...matroskaTracks,
57
- ]);
58
-
59
- const durationOffset =
60
- (matroskaSegment.offsets.children[0].children.find(
61
- (c) => c.field === 'Duration',
62
- )?.offset ?? 0) + w.getWrittenByteCount();
63
- const tracksOffset =
64
- (matroskaSegment.offsets.children.find((o) => o.field === 'Tracks')
65
- ?.offset ?? 0) + w.getWrittenByteCount();
66
-
67
- if (!durationOffset) {
68
- throw new Error('could not get duration offset');
69
- }
70
-
71
- if (!tracksOffset) {
72
- throw new Error('could not get tracks offset');
73
- }
74
-
75
- await w.write(matroskaSegment.bytes);
76
-
77
- const cluster = createClusterSegment();
78
- const clusterVIntPosition =
79
- w.getWrittenByteCount() +
80
- cluster.offsets.offset +
81
- matroskaToHex(matroskaElements.Cluster).byteLength;
82
-
83
- let clusterSize = cluster.bytes.byteLength;
84
- await w.write(cluster.bytes);
85
-
86
- const addSample = async (chunk: EncodedVideoChunk, trackNumber: number) => {
87
- const arr = new Uint8Array(chunk.byteLength);
88
- chunk.copyTo(arr);
89
- const simpleBlock = makeSimpleBlock({
90
- bytes: arr,
91
- invisible: false,
92
- keyframe: chunk.type === 'key',
93
- lacing: 0,
94
- trackNumber,
95
- // TODO: Maybe this is bad, because it's in microseconds, but should be in timescale
96
- // Maybe it only works by coincidence
97
- timecodeRelativeToCluster: Math.round(chunk.timestamp / 1000),
98
- });
99
-
100
- clusterSize += simpleBlock.byteLength;
101
- await w.updateDataAt(
102
- clusterVIntPosition,
103
- getVariableInt(clusterSize, CLUSTER_MIN_VINT_WIDTH),
104
- );
105
- await w.write(simpleBlock);
106
- };
107
-
108
- const updateDuration = async (newDuration: number) => {
109
- const blocks = padMatroskaBytes(
110
- {
111
- type: 'Duration',
112
- value: {
113
- value: newDuration,
114
- size: '64',
115
- },
116
- minVintWidth: null,
117
- },
118
- // TODO: That's too much padding
119
- 1000,
120
- );
121
- await w.updateDataAt(
122
- durationOffset,
123
- combineUint8Arrays(blocks.map((b) => b.bytes)),
124
- );
125
- };
126
-
127
- const addTrack = async (track: BytesAndOffset) => {
128
- currentTracks.push(track);
129
- const newTracks = makeMatroskaTracks(currentTracks);
130
-
131
- await w.updateDataAt(
132
- tracksOffset,
133
- combineUint8Arrays(newTracks.map((b) => b.bytes)),
134
- );
135
- };
136
-
137
- let operationProm = Promise.resolve();
138
-
139
- const waitForFinishPromises: (() => Promise<void>)[] = [];
140
-
141
- return {
142
- save: async () => {
143
- await w.save();
144
- },
145
- addSample: (chunk, trackNumber) => {
146
- operationProm = operationProm.then(() => addSample(chunk, trackNumber));
147
- return operationProm;
148
- },
149
- updateDuration: (duration) => {
150
- operationProm = operationProm.then(() => updateDuration(duration));
151
- return operationProm;
152
- },
153
- addTrack: (track) => {
154
- const trackNumber = currentTracks.length + 1;
155
-
156
- const bytes =
157
- track.type === 'video'
158
- ? makeMatroskaVideoTrackEntryBytes({...track, trackNumber})
159
- : makeMatroskaAudioTrackEntryBytes({...track, trackNumber});
160
-
161
- operationProm = operationProm.then(() => addTrack(bytes));
162
-
163
- return operationProm.then(() => ({trackNumber}));
164
- },
165
- addWaitForFinishPromise: (promise) => {
166
- waitForFinishPromises.push(promise);
167
- },
168
- async waitForFinish() {
169
- await Promise.all(waitForFinishPromises.map((p) => p()));
170
- },
171
- };
172
- };
@@ -1,63 +0,0 @@
1
- import {makeMatroskaBytes} from '../boxes/webm/make-header';
2
-
3
- export const makeMatroskaHeader = () => {
4
- return makeMatroskaBytes({
5
- type: 'Header',
6
- value: [
7
- {
8
- minVintWidth: null,
9
- type: 'EBMLVersion',
10
- value: {
11
- value: 1,
12
- byteLength: null,
13
- },
14
- },
15
- {
16
- minVintWidth: null,
17
- type: 'EBMLReadVersion',
18
- value: {
19
- value: 1,
20
- byteLength: null,
21
- },
22
- },
23
- {
24
- type: 'EBMLMaxIDLength',
25
- value: {
26
- byteLength: null,
27
- value: 4,
28
- },
29
- minVintWidth: null,
30
- },
31
- {
32
- type: 'EBMLMaxSizeLength',
33
- value: {
34
- byteLength: null,
35
- value: 8,
36
- },
37
- minVintWidth: null,
38
- },
39
- {
40
- type: 'DocType',
41
- value: 'webm',
42
- minVintWidth: null,
43
- },
44
- {
45
- type: 'DocTypeVersion',
46
- value: {
47
- byteLength: null,
48
- value: 4,
49
- },
50
- minVintWidth: null,
51
- },
52
- {
53
- type: 'DocTypeReadVersion',
54
- value: {
55
- byteLength: null,
56
- value: 2,
57
- },
58
- minVintWidth: null,
59
- },
60
- ],
61
- minVintWidth: null,
62
- });
63
- };
@@ -1,46 +0,0 @@
1
- import {makeMatroskaBytes, padMatroskaBytes} from '../boxes/webm/make-header';
2
-
3
- export const makeMatroskaInfo = ({
4
- timescale,
5
- duration,
6
- }: {
7
- timescale: number;
8
- duration: number;
9
- }) => {
10
- return makeMatroskaBytes({
11
- type: 'Info',
12
- value: [
13
- {
14
- type: 'TimestampScale',
15
- value: {
16
- value: timescale,
17
- byteLength: null,
18
- },
19
- minVintWidth: null,
20
- },
21
- {
22
- type: 'MuxingApp',
23
- value: '@remotion/media-parser',
24
- minVintWidth: null,
25
- },
26
- {
27
- type: 'WritingApp',
28
- value: '@remotion/media-parser',
29
- minVintWidth: null,
30
- },
31
- ...padMatroskaBytes(
32
- {
33
- type: 'Duration',
34
- value: {
35
- value: duration,
36
- size: '64',
37
- },
38
- minVintWidth: null,
39
- },
40
- // TODO: That's too much padding
41
- 1000,
42
- ),
43
- ],
44
- minVintWidth: null,
45
- });
46
- };
@@ -1,10 +0,0 @@
1
- import {makeMatroskaBytes} from '../boxes/webm/make-header';
2
- import type {BytesAndOffset} from '../boxes/webm/segments/all-segments';
3
-
4
- export const createMatroskaSegment = (children: BytesAndOffset[]) => {
5
- return makeMatroskaBytes({
6
- type: 'Segment',
7
- value: children,
8
- minVintWidth: 8,
9
- });
10
- };
@@ -1,325 +0,0 @@
1
- import {makeMatroskaBytes, padMatroskaBytes} from '../boxes/webm/make-header';
2
- import type {BytesAndOffset} from '../boxes/webm/segments/all-segments';
3
-
4
- export type MatroskaColorParams = {
5
- transferChracteristics: 'bt709' | 'smpte170m' | 'iec61966-2-1' | null;
6
- matrixCoefficients: 'bt709' | 'bt470bg' | 'rgb' | 'smpte170m' | null;
7
- primaries: 'bt709' | 'smpte170m' | 'bt470bg' | null;
8
- fullRange: boolean | null;
9
- };
10
-
11
- export const makeMatroskaColorBytes = ({
12
- transferChracteristics,
13
- matrixCoefficients,
14
- primaries,
15
- fullRange,
16
- }: MatroskaColorParams) => {
17
- const rangeValue =
18
- transferChracteristics && matrixCoefficients
19
- ? 3
20
- : fullRange === true
21
- ? 2
22
- : fullRange === false
23
- ? 1
24
- : 0;
25
-
26
- // https://datatracker.ietf.org/doc/draft-ietf-cellar-matroska/
27
- // 5.1.4.1.28.27
28
- const primariesValue =
29
- primaries === 'bt709'
30
- ? 1
31
- : primaries === 'smpte170m'
32
- ? 6
33
- : primaries === 'bt470bg'
34
- ? 5
35
- : 2;
36
-
37
- const transferChracteristicsValue =
38
- transferChracteristics === 'bt709'
39
- ? 1
40
- : transferChracteristics === 'smpte170m'
41
- ? 6
42
- : transferChracteristics === 'iec61966-2-1'
43
- ? 13
44
- : 2;
45
-
46
- if (matrixCoefficients === 'rgb') {
47
- throw new Error('Cannot encode Matroska in RGB');
48
- }
49
-
50
- const matrixCoefficientsValue =
51
- matrixCoefficients === 'bt709'
52
- ? 1
53
- : matrixCoefficients === 'bt470bg'
54
- ? 5
55
- : matrixCoefficients === 'smpte170m'
56
- ? 6
57
- : 2;
58
-
59
- return makeMatroskaBytes({
60
- type: 'Colour',
61
- minVintWidth: null,
62
- value: [
63
- {
64
- type: 'TransferCharacteristics',
65
- value: {
66
- value: transferChracteristicsValue,
67
- byteLength: null,
68
- },
69
- minVintWidth: null,
70
- },
71
- {
72
- type: 'MatrixCoefficients',
73
- value: {
74
- value: matrixCoefficientsValue,
75
- byteLength: null,
76
- },
77
- minVintWidth: null,
78
- },
79
- {
80
- type: 'Primaries',
81
- value: {
82
- value: primariesValue,
83
- byteLength: null,
84
- },
85
- minVintWidth: null,
86
- },
87
- {
88
- type: 'Range',
89
- value: {
90
- value: rangeValue,
91
- byteLength: null,
92
- },
93
- minVintWidth: null,
94
- },
95
- ],
96
- });
97
- };
98
-
99
- export const makeMatroskaVideoBytes = ({
100
- color,
101
- width,
102
- height,
103
- }: {
104
- color: MatroskaColorParams;
105
- width: number;
106
- height: number;
107
- }) => {
108
- return makeMatroskaBytes({
109
- type: 'Video',
110
- value: [
111
- {
112
- type: 'PixelWidth',
113
- value: {
114
- value: width,
115
- byteLength: null,
116
- },
117
- minVintWidth: null,
118
- },
119
- {
120
- type: 'PixelHeight',
121
- value: {
122
- value: height,
123
- byteLength: null,
124
- },
125
- minVintWidth: null,
126
- },
127
- {
128
- type: 'FlagInterlaced',
129
- value: {
130
- // https://datatracker.ietf.org/doc/draft-ietf-cellar-matroska/
131
- // 5.1.4.1.28.1.
132
- value: 2, // 2 - progressive, no interlaced
133
- byteLength: null,
134
- },
135
- minVintWidth: null,
136
- },
137
- makeMatroskaColorBytes(color),
138
- ],
139
- minVintWidth: null,
140
- });
141
- };
142
-
143
- export type MakeTrackAudio = {
144
- trackNumber: number;
145
- codecId: string;
146
- numberOfChannels: number;
147
- sampleRate: number;
148
- type: 'audio';
149
- };
150
-
151
- export type MakeTrackVideo = {
152
- color: MatroskaColorParams;
153
- width: number;
154
- height: number;
155
- defaultDuration: number;
156
- trackNumber: number;
157
- codecId: string;
158
- type: 'video';
159
- };
160
-
161
- export const makeMatroskaAudioTrackEntryBytes = ({
162
- trackNumber,
163
- codecId,
164
- numberOfChannels: audioChannels,
165
- sampleRate,
166
- }: MakeTrackAudio) => {
167
- return makeMatroskaBytes({
168
- type: 'TrackEntry',
169
- minVintWidth: null,
170
- value: [
171
- {
172
- type: 'TrackNumber',
173
- value: {
174
- value: trackNumber,
175
- byteLength: null,
176
- },
177
- minVintWidth: null,
178
- },
179
- {
180
- type: 'TrackUID',
181
- value: '0x188FEB95C8EFABA',
182
- minVintWidth: null,
183
- },
184
- {
185
- type: 'TrackType',
186
- value: {
187
- value: 2,
188
- byteLength: null,
189
- },
190
- minVintWidth: null,
191
- },
192
- {
193
- type: 'TrackTimestampScale',
194
- value: {
195
- value: 1,
196
- size: '64',
197
- },
198
- minVintWidth: null,
199
- },
200
- {
201
- type: 'CodecID',
202
- value: codecId,
203
- minVintWidth: null,
204
- },
205
- {
206
- type: 'Audio',
207
- value: [
208
- {
209
- type: 'Channels',
210
- minVintWidth: null,
211
- value: {
212
- value: audioChannels,
213
- byteLength: null,
214
- },
215
- },
216
- {
217
- type: 'SamplingFrequency',
218
- minVintWidth: null,
219
- value: {
220
- value: sampleRate,
221
- size: '64',
222
- },
223
- },
224
- {
225
- type: 'BitDepth',
226
- minVintWidth: null,
227
- value: {
228
- value: 32,
229
- byteLength: null,
230
- },
231
- },
232
- ],
233
- minVintWidth: null,
234
- },
235
- ],
236
- });
237
- };
238
-
239
- export const makeMatroskaVideoTrackEntryBytes = ({
240
- color,
241
- width,
242
- height,
243
- defaultDuration,
244
- trackNumber,
245
- codecId,
246
- }: MakeTrackVideo) => {
247
- return makeMatroskaBytes({
248
- type: 'TrackEntry',
249
- minVintWidth: null,
250
- value: [
251
- {
252
- type: 'TrackNumber',
253
- value: {
254
- value: trackNumber,
255
- byteLength: null,
256
- },
257
- minVintWidth: null,
258
- },
259
- {
260
- type: 'TrackUID',
261
- value: '0xab2171012bb9020a',
262
- minVintWidth: null,
263
- },
264
- {
265
- type: 'FlagLacing',
266
- value: {
267
- value: 0,
268
- byteLength: null,
269
- },
270
- minVintWidth: null,
271
- },
272
- {
273
- type: 'Language',
274
- value: 'und',
275
- minVintWidth: null,
276
- },
277
- {
278
- type: 'FlagDefault',
279
- value: {
280
- value: 0,
281
- byteLength: null,
282
- },
283
- minVintWidth: null,
284
- },
285
- {
286
- type: 'CodecID',
287
- value: codecId,
288
- minVintWidth: null,
289
- },
290
- {
291
- type: 'TrackType',
292
- value: {
293
- value: 1, // 'video'
294
- byteLength: null,
295
- },
296
- minVintWidth: null,
297
- },
298
- {
299
- type: 'DefaultDuration',
300
- value: {
301
- value: defaultDuration,
302
- byteLength: null,
303
- },
304
- minVintWidth: null,
305
- },
306
- makeMatroskaVideoBytes({
307
- color,
308
- width,
309
- height,
310
- }),
311
- ],
312
- });
313
- };
314
-
315
- export const makeMatroskaTracks = (tracks: BytesAndOffset[]) => {
316
- return padMatroskaBytes(
317
- makeMatroskaBytes({
318
- type: 'Tracks',
319
- value: tracks,
320
- minVintWidth: null,
321
- }),
322
- // TODO: That's too much padding
323
- 1000,
324
- );
325
- };