@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
@@ -0,0 +1,67 @@
1
+ // src/writers/web-fs.ts
2
+ var createContent = async () => {
3
+ const directoryHandle = await navigator.storage.getDirectory();
4
+ const filename = `media-parser-${Math.random().toString().replace("0.", "")}.webm`;
5
+ const fileHandle = await directoryHandle.getFileHandle(filename, {
6
+ create: true
7
+ });
8
+ const writable = await fileHandle.createWritable();
9
+ let written = 0;
10
+ let writPromise = Promise.resolve();
11
+ const write = async (arr) => {
12
+ await writable.write(arr);
13
+ written += arr.byteLength;
14
+ };
15
+ const updateDataAt = async (position, data) => {
16
+ await writable.seek(position);
17
+ await writable.write(data);
18
+ await writable.seek(written);
19
+ };
20
+ const remove = async () => {
21
+ await directoryHandle.removeEntry(filename, {
22
+ recursive: true
23
+ });
24
+ };
25
+ const writer = {
26
+ write: (arr) => {
27
+ writPromise = writPromise.then(() => write(arr));
28
+ return writPromise;
29
+ },
30
+ save: async () => {
31
+ try {
32
+ await writable.close();
33
+ } catch (err) {
34
+ }
35
+ const newHandle = await directoryHandle.getFileHandle(filename, {
36
+ create: true
37
+ });
38
+ const newFile = await newHandle.getFile();
39
+ return newFile;
40
+ },
41
+ getWrittenByteCount: () => written,
42
+ updateDataAt: (position, data) => {
43
+ writPromise = writPromise.then(() => updateDataAt(position, data));
44
+ return writPromise;
45
+ },
46
+ waitForFinish: async () => {
47
+ await writPromise;
48
+ },
49
+ remove
50
+ };
51
+ return writer;
52
+ };
53
+ var webFsWriter = {
54
+ createContent
55
+ };
56
+ var canUseWebFsWriter = async () => {
57
+ const directoryHandle = await navigator.storage.getDirectory();
58
+ const fileHandle = await directoryHandle.getFileHandle("remotion-probe-web-fs-support", {
59
+ create: true
60
+ });
61
+ const canUse = fileHandle.createWritable !== undefined;
62
+ return canUse;
63
+ };
64
+ export {
65
+ webFsWriter,
66
+ canUseWebFsWriter
67
+ };
@@ -1,9 +1,9 @@
1
1
  import type { MoovBox } from './boxes/iso-base-media/moov/moov';
2
2
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
3
- import type { MainSegment } from './boxes/webm/segments/all-segments';
4
- import type { KnownAudioCodecs } from './options';
3
+ import { type MediaParserAudioCodec } from './get-tracks';
5
4
  import type { AnySegment } from './parse-result';
6
- export declare const hasAudioCodec: (boxes: AnySegment[]) => boolean;
5
+ import type { ParserState } from './parser-state';
6
+ export declare const hasAudioCodec: (boxes: AnySegment[], state: ParserState) => boolean;
7
7
  type AudioCodecInfo = {
8
8
  format: string;
9
9
  primarySpecificator: number | null;
@@ -14,10 +14,10 @@ export declare const getNumberOfChannelsFromTrak: (trak: TrakBox) => number | nu
14
14
  export declare const getSampleRate: (trak: TrakBox) => number | null;
15
15
  export declare const getAudioCodecFromTrak: (trak: TrakBox) => AudioCodecInfo | null;
16
16
  export declare const getAudioCodecFromIso: (moov: MoovBox) => AudioCodecInfo | null;
17
- export declare const getAudioCodecFromMatroska: (mainSegment: MainSegment) => "vorbis" | "opus" | "mp3" | "aac" | "pcm" | null;
18
17
  export declare const getAudioCodecStringFromTrak: (trak: TrakBox) => {
19
18
  codecString: string;
20
19
  description: Uint8Array | undefined;
21
20
  };
22
- export declare const getAudioCodec: (boxes: AnySegment[]) => KnownAudioCodecs | null;
21
+ export declare const getAudioCodecFromTrack: (track: TrakBox) => "aac" | "mp3" | "aiff";
22
+ export declare const getAudioCodec: (boxes: AnySegment[], parserState: ParserState) => MediaParserAudioCodec | null;
23
23
  export {};
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAudioCodec = exports.getAudioCodecStringFromTrak = exports.getAudioCodecFromMatroska = exports.getAudioCodecFromIso = exports.getAudioCodecFromTrak = exports.getSampleRate = exports.getNumberOfChannelsFromTrak = exports.hasAudioCodec = void 0;
3
+ exports.getAudioCodec = exports.getAudioCodecFromTrack = exports.getAudioCodecStringFromTrak = exports.getAudioCodecFromIso = exports.getAudioCodecFromTrak = exports.getSampleRate = exports.getNumberOfChannelsFromTrak = exports.hasAudioCodec = void 0;
4
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
4
5
  const get_fps_1 = require("./get-fps");
5
- const traversal_1 = require("./traversal");
6
- const hasAudioCodec = (boxes) => {
6
+ const get_tracks_1 = require("./get-tracks");
7
+ const hasAudioCodec = (boxes, state) => {
7
8
  try {
8
- return (0, exports.getAudioCodec)(boxes) !== null;
9
+ return (0, exports.getAudioCodec)(boxes, state) !== null;
9
10
  }
10
11
  catch (e) {
11
12
  return false;
@@ -114,36 +115,6 @@ const getAudioCodecFromIso = (moov) => {
114
115
  return (0, exports.getAudioCodecFromTrak)(trakBox);
115
116
  };
116
117
  exports.getAudioCodecFromIso = getAudioCodecFromIso;
117
- const getAudioCodecFromMatroska = (mainSegment) => {
118
- const tracksSegment = mainSegment.value.find((b) => b.type === 'Tracks');
119
- if (!tracksSegment || tracksSegment.type !== 'Tracks') {
120
- return null;
121
- }
122
- for (const track of tracksSegment.value) {
123
- if (track.type === 'TrackEntry') {
124
- const trackType = track.value.find((b) => b.type === 'CodecID');
125
- if (trackType && trackType.type === 'CodecID') {
126
- if (trackType.value === 'A_OPUS') {
127
- return 'opus';
128
- }
129
- if (trackType.value === 'A_VORBIS') {
130
- return 'vorbis';
131
- }
132
- if (trackType.value === 'A_PCM/INT/LIT') {
133
- return 'pcm';
134
- }
135
- if (trackType.value === 'A_AAC') {
136
- return 'aac';
137
- }
138
- if (trackType.value === 'A_MPEG/L3') {
139
- return 'mp3';
140
- }
141
- }
142
- }
143
- }
144
- return null;
145
- };
146
- exports.getAudioCodecFromMatroska = getAudioCodecFromMatroska;
147
118
  const getAudioCodecStringFromTrak = (trak) => {
148
119
  const codec = (0, exports.getAudioCodecFromTrak)(trak);
149
120
  if (!codec) {
@@ -166,34 +137,47 @@ const getAudioCodecStringFromTrak = (trak) => {
166
137
  };
167
138
  };
168
139
  exports.getAudioCodecStringFromTrak = getAudioCodecStringFromTrak;
169
- const getAudioCodec = (boxes) => {
170
- const moovBox = (0, traversal_1.getMoovBox)(boxes);
171
- if (moovBox) {
172
- const codec = (0, exports.getAudioCodecFromIso)(moovBox);
173
- if (!codec) {
174
- return null;
140
+ const getAudioCodecFromAudioCodecInfo = (codec) => {
141
+ if (codec.format === 'sowt') {
142
+ return 'aiff';
143
+ }
144
+ if (codec.format === 'mp4a') {
145
+ if (codec.primarySpecificator === 0x40) {
146
+ return 'aac';
175
147
  }
176
- if (codec.format === 'sowt') {
177
- return 'aiff';
148
+ if (codec.primarySpecificator === 0x6b) {
149
+ return 'mp3';
178
150
  }
179
- if (codec.format === 'mp4a') {
180
- if (codec.primarySpecificator === 0x40) {
181
- return 'aac';
182
- }
183
- if (codec.primarySpecificator === 0x6b) {
184
- return 'mp3';
185
- }
186
- if (codec.primarySpecificator === null) {
187
- return 'aac';
188
- }
189
- throw new Error('Unknown mp4a codec: ' + codec.primarySpecificator);
151
+ if (codec.primarySpecificator === null) {
152
+ return 'aac';
190
153
  }
191
- throw new Error('Unknown audio format: ' + codec.format);
154
+ throw new Error('Unknown mp4a codec: ' + codec.primarySpecificator);
155
+ }
156
+ throw new Error('Unknown audio format: ' + codec.format);
157
+ };
158
+ const getAudioCodecFromTrack = (track) => {
159
+ const audioSample = (0, exports.getAudioCodecFromTrak)(track);
160
+ if (!audioSample) {
161
+ throw new Error('Could not find audio sample');
192
162
  }
193
- const mainSegment = boxes.find((b) => b.type === 'Segment');
194
- if (!mainSegment || mainSegment.type !== 'Segment') {
163
+ return getAudioCodecFromAudioCodecInfo(audioSample);
164
+ };
165
+ exports.getAudioCodecFromTrack = getAudioCodecFromTrack;
166
+ const getAudioCodec = (boxes, parserState) => {
167
+ const tracks = (0, get_tracks_1.getTracks)(boxes, parserState);
168
+ const allTracks = tracks.audioTracks.length +
169
+ tracks.otherTracks.length +
170
+ tracks.videoTracks.length;
171
+ if (allTracks === 0) {
172
+ throw new Error('No tracks yet');
173
+ }
174
+ const audioTrack = tracks.audioTracks[0];
175
+ if (!audioTrack) {
195
176
  return null;
196
177
  }
197
- return (0, exports.getAudioCodecFromMatroska)(mainSegment);
178
+ if (audioTrack.type === 'audio') {
179
+ return audioTrack.codecWithoutConfig;
180
+ }
181
+ return null;
198
182
  };
199
183
  exports.getAudioCodec = getAudioCodec;
@@ -0,0 +1,4 @@
1
+ import type { ParseMediaContainer } from './options';
2
+ import type { AnySegment } from './parse-result';
3
+ export declare const getContainer: (segments: AnySegment[]) => ParseMediaContainer | null;
4
+ export declare const hasContainer: (boxes: AnySegment[]) => boolean;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasContainer = exports.getContainer = void 0;
4
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
+ const traversal_2 = require("./boxes/webm/traversal");
6
+ const getContainer = (segments) => {
7
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
8
+ if (moovBox) {
9
+ return 'mp4';
10
+ }
11
+ const mainSegment = (0, traversal_2.getMainSegment)(segments);
12
+ if (mainSegment) {
13
+ return 'webm';
14
+ }
15
+ return null;
16
+ };
17
+ exports.getContainer = getContainer;
18
+ const hasContainer = (boxes) => {
19
+ try {
20
+ return (0, exports.getContainer)(boxes) !== null;
21
+ }
22
+ catch (e) {
23
+ return false;
24
+ }
25
+ };
26
+ exports.hasContainer = hasContainer;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasDuration = exports.getDuration = void 0;
4
4
  const get_sample_positions_from_track_1 = require("./boxes/iso-base-media/get-sample-positions-from-track");
5
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
6
  const get_tracks_1 = require("./get-tracks");
6
- const traversal_1 = require("./traversal");
7
7
  const getDurationFromMatroska = (segments) => {
8
8
  const mainSegment = segments.find((s) => s.type === 'Segment');
9
9
  if (!mainSegment || mainSegment.type !== 'Segment') {
package/dist/get-fps.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasFps = exports.getFps = exports.getTimescaleAndDuration = exports.trakBoxContainsVideo = exports.trakBoxContainsAudio = void 0;
4
- const traversal_1 = require("./traversal");
4
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
5
  const calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
6
6
  let totalSamples = 0;
7
7
  for (const sample of sttsBox.sampleDistribution) {
@@ -11,7 +11,7 @@ type AspectRatio = {
11
11
  numerator: number;
12
12
  denominator: number;
13
13
  };
14
- export declare const getVideoSample: (trakBox: TrakBox) => VideoSample | null;
14
+ export declare const getStsdVideoConfig: (trakBox: TrakBox) => VideoSample | null;
15
15
  export declare const getAvccBox: (trakBox: TrakBox) => AvccBox | null;
16
16
  export declare const getAv1CBox: (trakBox: TrakBox) => Av1CBox | null;
17
17
  export declare const getPaspBox: (trakBox: TrakBox) => PaspBox | null;
@@ -1,25 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDisplayAspectRatio = exports.applyAspectRatios = exports.applyTkhdBox = exports.getColrBox = exports.getSampleAspectRatio = exports.getHvccBox = exports.getPaspBox = exports.getAv1CBox = exports.getAvccBox = exports.getVideoSample = void 0;
4
- const traversal_1 = require("./traversal");
5
- const getVideoSample = (trakBox) => {
3
+ exports.getDisplayAspectRatio = exports.applyAspectRatios = exports.applyTkhdBox = exports.getColrBox = exports.getSampleAspectRatio = exports.getHvccBox = exports.getPaspBox = exports.getAv1CBox = exports.getAvccBox = exports.getStsdVideoConfig = void 0;
4
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
+ const getStsdVideoConfig = (trakBox) => {
6
6
  const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
7
7
  if (!stsdBox) {
8
8
  return null;
9
9
  }
10
- const videoSample = stsdBox.samples.find((s) => s.type === 'video');
11
- if (!videoSample || videoSample.type !== 'video') {
10
+ const videoConfig = stsdBox.samples.find((s) => s.type === 'video');
11
+ if (!videoConfig || videoConfig.type !== 'video') {
12
12
  return null;
13
13
  }
14
- return videoSample;
14
+ return videoConfig;
15
15
  };
16
- exports.getVideoSample = getVideoSample;
16
+ exports.getStsdVideoConfig = getStsdVideoConfig;
17
17
  const getAvccBox = (trakBox) => {
18
- const videoSample = (0, exports.getVideoSample)(trakBox);
19
- if (!videoSample) {
18
+ const videoConfig = (0, exports.getStsdVideoConfig)(trakBox);
19
+ if (!videoConfig) {
20
20
  return null;
21
21
  }
22
- const avccBox = videoSample.descriptors.find((c) => c.type === 'avcc-box');
22
+ const avccBox = videoConfig.descriptors.find((c) => c.type === 'avcc-box');
23
23
  if (!avccBox || avccBox.type !== 'avcc-box') {
24
24
  return null;
25
25
  }
@@ -27,11 +27,11 @@ const getAvccBox = (trakBox) => {
27
27
  };
28
28
  exports.getAvccBox = getAvccBox;
29
29
  const getAv1CBox = (trakBox) => {
30
- const videoSample = (0, exports.getVideoSample)(trakBox);
31
- if (!videoSample) {
30
+ const videoConfig = (0, exports.getStsdVideoConfig)(trakBox);
31
+ if (!videoConfig) {
32
32
  return null;
33
33
  }
34
- const av1cBox = videoSample.descriptors.find((c) => c.type === 'av1C-box');
34
+ const av1cBox = videoConfig.descriptors.find((c) => c.type === 'av1C-box');
35
35
  if (!av1cBox || av1cBox.type !== 'av1C-box') {
36
36
  return null;
37
37
  }
@@ -39,11 +39,11 @@ const getAv1CBox = (trakBox) => {
39
39
  };
40
40
  exports.getAv1CBox = getAv1CBox;
41
41
  const getPaspBox = (trakBox) => {
42
- const videoSample = (0, exports.getVideoSample)(trakBox);
43
- if (!videoSample) {
42
+ const videoConfig = (0, exports.getStsdVideoConfig)(trakBox);
43
+ if (!videoConfig) {
44
44
  return null;
45
45
  }
46
- const paspBox = videoSample.descriptors.find((c) => c.type === 'pasp-box');
46
+ const paspBox = videoConfig.descriptors.find((c) => c.type === 'pasp-box');
47
47
  if (!paspBox || paspBox.type !== 'pasp-box') {
48
48
  return null;
49
49
  }
@@ -51,11 +51,11 @@ const getPaspBox = (trakBox) => {
51
51
  };
52
52
  exports.getPaspBox = getPaspBox;
53
53
  const getHvccBox = (trakBox) => {
54
- const videoSample = (0, exports.getVideoSample)(trakBox);
55
- if (!videoSample) {
54
+ const videoConfig = (0, exports.getStsdVideoConfig)(trakBox);
55
+ if (!videoConfig) {
56
56
  return null;
57
57
  }
58
- const hvccBox = videoSample.descriptors.find((c) => c.type === 'hvcc-box');
58
+ const hvccBox = videoConfig.descriptors.find((c) => c.type === 'hvcc-box');
59
59
  if (!hvccBox || hvccBox.type !== 'hvcc-box') {
60
60
  return null;
61
61
  }
@@ -6,12 +6,21 @@ type SampleAspectRatio = {
6
6
  numerator: number;
7
7
  denominator: number;
8
8
  };
9
+ export type VideoTrackColorParams = {
10
+ transferCharacteristics: 'bt709' | 'smpte170m' | 'iec61966-2-1' | null;
11
+ matrixCoefficients: 'bt709' | 'bt470bg' | 'rgb' | 'smpte170m' | null;
12
+ primaries: 'bt709' | 'smpte170m' | 'bt470bg' | null;
13
+ fullRange: boolean | null;
14
+ };
15
+ export type MediaParserVideoCodec = 'vp8' | 'vp9' | 'h264' | 'av1' | 'h265' | 'prores';
16
+ export type MediaParserAudioCodec = 'opus' | 'aac' | 'mp3' | 'vorbis' | 'pcm-u8' | 'pcm-s16' | 'pcm-s24' | 'pcm-s32' | 'pcm-f32' | 'aiff';
9
17
  export type VideoTrack = {
10
18
  type: 'video';
11
19
  trackId: number;
12
20
  description: Uint8Array | undefined;
13
21
  timescale: number;
14
22
  codec: string;
23
+ codecWithoutConfig: MediaParserVideoCodec;
15
24
  sampleAspectRatio: SampleAspectRatio;
16
25
  width: number;
17
26
  height: number;
@@ -21,16 +30,20 @@ export type VideoTrack = {
21
30
  codedHeight: number;
22
31
  rotation: number;
23
32
  trakBox: TrakBox | null;
33
+ codecPrivate: Uint8Array | null;
34
+ color: VideoTrackColorParams;
24
35
  };
25
36
  export type AudioTrack = {
26
37
  type: 'audio';
27
38
  trackId: number;
28
39
  timescale: number;
29
40
  codec: string;
41
+ codecWithoutConfig: MediaParserAudioCodec;
30
42
  numberOfChannels: number;
31
43
  sampleRate: number;
32
44
  description: Uint8Array | undefined;
33
45
  trakBox: TrakBox | null;
46
+ codecPrivate: Uint8Array | null;
34
47
  };
35
48
  export type OtherTrack = {
36
49
  type: 'other';
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getTracks = exports.hasTracks = exports.getNumberOfTracks = void 0;
4
4
  const make_track_1 = require("./boxes/iso-base-media/make-track");
5
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
5
6
  const get_ready_tracks_1 = require("./boxes/webm/get-ready-tracks");
6
- const traversal_1 = require("./boxes/webm/traversal");
7
- const traversal_2 = require("./traversal");
7
+ const traversal_2 = require("./boxes/webm/traversal");
8
8
  const getNumberOfTracks = (moovBox) => {
9
- const mvHdBox = (0, traversal_2.getMvhdBox)(moovBox);
9
+ const mvHdBox = (0, traversal_1.getMvhdBox)(moovBox);
10
10
  if (!mvHdBox) {
11
11
  return 0;
12
12
  }
@@ -14,16 +14,16 @@ const getNumberOfTracks = (moovBox) => {
14
14
  };
15
15
  exports.getNumberOfTracks = getNumberOfTracks;
16
16
  const hasTracks = (segments) => {
17
- const mainSegment = (0, traversal_1.getMainSegment)(segments);
17
+ const mainSegment = (0, traversal_2.getMainSegment)(segments);
18
18
  if (mainSegment) {
19
19
  return (0, traversal_2.getTracksSegment)(mainSegment) !== null;
20
20
  }
21
- const moovBox = (0, traversal_2.getMoovBox)(segments);
21
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
22
22
  if (!moovBox) {
23
23
  return false;
24
24
  }
25
25
  const numberOfTracks = (0, exports.getNumberOfTracks)(moovBox);
26
- const tracks = (0, traversal_2.getTraks)(moovBox);
26
+ const tracks = (0, traversal_1.getTraks)(moovBox);
27
27
  return tracks.length === numberOfTracks;
28
28
  };
29
29
  exports.hasTracks = hasTracks;
@@ -51,7 +51,7 @@ const getTracks = (segments, state) => {
51
51
  otherTracks,
52
52
  };
53
53
  }
54
- const moovBox = (0, traversal_2.getMoovBox)(segments);
54
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
55
55
  if (!moovBox) {
56
56
  return {
57
57
  videoTracks,
@@ -59,7 +59,7 @@ const getTracks = (segments, state) => {
59
59
  otherTracks,
60
60
  };
61
61
  }
62
- const tracks = (0, traversal_2.getTraks)(moovBox);
62
+ const tracks = (0, traversal_1.getTraks)(moovBox);
63
63
  for (const trakBox of tracks) {
64
64
  const track = (0, make_track_1.makeBaseMediaTrack)(trakBox);
65
65
  if (!track) {
@@ -1,6 +1,9 @@
1
1
  import type { TrakBox } from './boxes/iso-base-media/trak/trak';
2
- import type { KnownVideoCodecs } from './options';
2
+ import type { MediaParserVideoCodec, VideoTrackColorParams } from './get-tracks';
3
3
  import type { AnySegment } from './parse-result';
4
4
  export declare const hasVideoCodec: (boxes: AnySegment[]) => boolean;
5
+ export declare const getVideoPrivateData: (trakBox: TrakBox) => Uint8Array | null;
6
+ export declare const getIsoBmColrConfig: (trakBox: TrakBox) => VideoTrackColorParams | null;
5
7
  export declare const getVideoCodecString: (trakBox: TrakBox) => string | null;
6
- export declare const getVideoCodec: (boxes: AnySegment[]) => KnownVideoCodecs | null;
8
+ export declare const getVideoCodecFromIsoTrak: (trakBox: TrakBox) => "h264" | "av1" | "h265" | "prores";
9
+ export declare const getVideoCodec: (boxes: AnySegment[]) => MediaParserVideoCodec | null;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getVideoCodec = exports.getVideoCodecString = exports.hasVideoCodec = void 0;
3
+ exports.getVideoCodec = exports.getVideoCodecFromIsoTrak = exports.getVideoCodecString = exports.getIsoBmColrConfig = exports.getVideoPrivateData = exports.hasVideoCodec = void 0;
4
+ const traversal_1 = require("./boxes/iso-base-media/traversal");
4
5
  const av1_codec_private_1 = require("./boxes/webm/av1-codec-private");
5
6
  const get_fps_1 = require("./get-fps");
6
7
  const get_sample_aspect_ratio_1 = require("./get-sample-aspect-ratio");
7
- const traversal_1 = require("./traversal");
8
8
  const hasVideoCodec = (boxes) => {
9
9
  try {
10
10
  return (0, exports.getVideoCodec)(boxes) !== null;
@@ -14,8 +14,64 @@ const hasVideoCodec = (boxes) => {
14
14
  }
15
15
  };
16
16
  exports.hasVideoCodec = hasVideoCodec;
17
+ const getVideoPrivateData = (trakBox) => {
18
+ const videoSample = (0, get_sample_aspect_ratio_1.getStsdVideoConfig)(trakBox);
19
+ const avccBox = (0, get_sample_aspect_ratio_1.getAvccBox)(trakBox);
20
+ const hvccBox = (0, get_sample_aspect_ratio_1.getHvccBox)(trakBox);
21
+ const av1cBox = (0, get_sample_aspect_ratio_1.getAv1CBox)(trakBox);
22
+ if (!videoSample) {
23
+ return null;
24
+ }
25
+ if (avccBox) {
26
+ return avccBox.privateData;
27
+ }
28
+ if (hvccBox) {
29
+ return hvccBox.privateData;
30
+ }
31
+ if (av1cBox) {
32
+ return av1cBox.privateData;
33
+ }
34
+ return null;
35
+ };
36
+ exports.getVideoPrivateData = getVideoPrivateData;
37
+ const getIsoBmColrConfig = (trakBox) => {
38
+ const videoSample = (0, get_sample_aspect_ratio_1.getStsdVideoConfig)(trakBox);
39
+ if (!videoSample) {
40
+ return null;
41
+ }
42
+ const colrAtom = (0, get_sample_aspect_ratio_1.getColrBox)(videoSample);
43
+ if (!colrAtom) {
44
+ return null;
45
+ }
46
+ // https://github.com/bbc/qtff-parameter-editor
47
+ return {
48
+ fullRange: colrAtom.fullRangeFlag,
49
+ matrixCoefficients: colrAtom.matrixIndex === 1
50
+ ? 'bt709'
51
+ : colrAtom.matrixIndex === 5
52
+ ? 'bt470bg'
53
+ : colrAtom.matrixIndex === 6
54
+ ? 'smpte170m'
55
+ : null,
56
+ primaries: colrAtom.primaries === 1
57
+ ? 'bt709'
58
+ : colrAtom.primaries === 5
59
+ ? 'bt470bg'
60
+ : colrAtom.primaries === 6
61
+ ? 'smpte170m'
62
+ : null,
63
+ transferCharacteristics: colrAtom.transfer === 1
64
+ ? 'bt709'
65
+ : colrAtom.transfer === 6
66
+ ? 'smpte170m'
67
+ : colrAtom.transfer === 13
68
+ ? 'iec61966-2-1'
69
+ : null,
70
+ };
71
+ };
72
+ exports.getIsoBmColrConfig = getIsoBmColrConfig;
17
73
  const getVideoCodecString = (trakBox) => {
18
- const videoSample = (0, get_sample_aspect_ratio_1.getVideoSample)(trakBox);
74
+ const videoSample = (0, get_sample_aspect_ratio_1.getStsdVideoConfig)(trakBox);
19
75
  const avccBox = (0, get_sample_aspect_ratio_1.getAvccBox)(trakBox);
20
76
  const hvccBox = (0, get_sample_aspect_ratio_1.getHvccBox)(trakBox);
21
77
  const av1cBox = (0, get_sample_aspect_ratio_1.getAv1CBox)(trakBox);
@@ -35,29 +91,63 @@ const getVideoCodecString = (trakBox) => {
35
91
  return videoSample.format;
36
92
  };
37
93
  exports.getVideoCodecString = getVideoCodecString;
94
+ const getVideoCodecFromIsoTrak = (trakBox) => {
95
+ const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
96
+ if (stsdBox && stsdBox.type === 'stsd-box') {
97
+ const videoSample = stsdBox.samples.find((s) => s.type === 'video');
98
+ if (videoSample && videoSample.type === 'video') {
99
+ if (videoSample.format === 'hvc1') {
100
+ return 'h265';
101
+ }
102
+ if (videoSample.format === 'avc1') {
103
+ return 'h264';
104
+ }
105
+ if (videoSample.format === 'av01') {
106
+ return 'av1';
107
+ }
108
+ // ap4h: ProRes 4444
109
+ if (videoSample.format === 'ap4h') {
110
+ return 'prores';
111
+ }
112
+ // ap4x: ap4x: ProRes 4444 XQ
113
+ if (videoSample.format === 'ap4x') {
114
+ return 'prores';
115
+ }
116
+ // apch: ProRes 422 High Quality
117
+ if (videoSample.format === 'apch') {
118
+ return 'prores';
119
+ }
120
+ // apcn: ProRes 422 Standard Definition
121
+ if (videoSample.format === 'apcn') {
122
+ return 'prores';
123
+ }
124
+ // apcs: ProRes 422 LT
125
+ if (videoSample.format === 'apcs') {
126
+ return 'prores';
127
+ }
128
+ // apco: ProRes 422 Proxy
129
+ if (videoSample.format === 'apco') {
130
+ return 'prores';
131
+ }
132
+ // aprh: ProRes RAW High Quality
133
+ if (videoSample.format === 'aprh') {
134
+ return 'prores';
135
+ }
136
+ // aprn: ProRes RAW Standard Definition
137
+ if (videoSample.format === 'aprn') {
138
+ return 'prores';
139
+ }
140
+ }
141
+ }
142
+ throw new Error('Could not find video codec');
143
+ };
144
+ exports.getVideoCodecFromIsoTrak = getVideoCodecFromIsoTrak;
38
145
  const getVideoCodec = (boxes) => {
39
146
  const moovBox = (0, traversal_1.getMoovBox)(boxes);
40
147
  if (moovBox) {
41
148
  const trakBox = (0, traversal_1.getTraks)(moovBox).filter((t) => (0, get_fps_1.trakBoxContainsVideo)(t))[0];
42
149
  if (trakBox) {
43
- const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
44
- if (stsdBox && stsdBox.type === 'stsd-box') {
45
- const videoSample = stsdBox.samples.find((s) => s.type === 'video');
46
- if (videoSample && videoSample.type === 'video') {
47
- if (videoSample.format === 'hvc1') {
48
- return 'h265';
49
- }
50
- if (videoSample.format === 'avc1') {
51
- return 'h264';
52
- }
53
- if (videoSample.format === 'av01') {
54
- return 'av1';
55
- }
56
- if (videoSample.format === 'ap4h') {
57
- return 'prores';
58
- }
59
- }
60
- }
150
+ return (0, exports.getVideoCodecFromIsoTrak)(trakBox);
61
151
  }
62
152
  }
63
153
  const mainSegment = boxes.find((b) => b.type === 'Segment');
@@ -1,4 +1,4 @@
1
- import type { Options } from './options';
1
+ import type { Options, ParseMediaFields } from './options';
2
2
  import type { ParseResult } from './parse-result';
3
3
  import type { ParserState } from './parser-state';
4
- export declare const hasAllInfo: (options: Options<boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean>, parseResult: ParseResult, state: ParserState) => boolean;
4
+ export declare const getAvailableInfo: (options: Options<ParseMediaFields>, parseResult: ParseResult, state: ParserState) => Record<keyof Options<ParseMediaFields>, boolean>;