@remotion/media-parser 4.0.194 → 4.0.196

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 (275) hide show
  1. package/dist/add-new-matroska-tracks.d.ts +8 -0
  2. package/dist/add-new-matroska-tracks.js +14 -0
  3. package/dist/av1-codec-string.d.ts +3 -0
  4. package/dist/av1-codec-string.js +91 -0
  5. package/dist/boxes/iso-base-media/esds/decoder-specific-config.d.ts +14 -0
  6. package/dist/boxes/iso-base-media/esds/decoder-specific-config.js +38 -0
  7. package/dist/boxes/iso-base-media/esds/esds-descriptors.d.ts +8 -0
  8. package/dist/boxes/iso-base-media/esds/esds-descriptors.js +22 -2
  9. package/dist/boxes/iso-base-media/ftype.d.ts +9 -0
  10. package/dist/boxes/iso-base-media/ftype.js +31 -0
  11. package/dist/boxes/iso-base-media/make-track.d.ts +3 -0
  12. package/dist/boxes/iso-base-media/make-track.js +112 -0
  13. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +6 -2
  14. package/dist/boxes/iso-base-media/mdat/mdat.js +90 -6
  15. package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
  16. package/dist/boxes/iso-base-media/moov/moov.js +4 -2
  17. package/dist/boxes/iso-base-media/mvhd.js +7 -1
  18. package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
  19. package/dist/boxes/iso-base-media/process-box.js +322 -34
  20. package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
  21. package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
  22. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
  23. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
  24. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
  25. package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
  26. package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
  27. package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
  28. package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
  29. package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
  30. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
  31. package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
  32. package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
  33. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
  34. package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
  35. package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
  36. package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
  37. package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
  38. package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
  39. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
  40. package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
  41. package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
  42. package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
  43. package/dist/boxes/iso-base-media/stsd/stsz.d.ts +9 -3
  44. package/dist/boxes/iso-base-media/stsd/stsz.js +14 -2
  45. package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
  46. package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
  47. package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
  48. package/dist/boxes/iso-base-media/tkhd.js +41 -14
  49. package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
  50. package/dist/boxes/iso-base-media/trak/trak.js +4 -2
  51. package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
  52. package/dist/boxes/iso-base-media/void-box.js +2 -0
  53. package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
  54. package/dist/boxes/webm/allowed-partial-segments.js +4 -0
  55. package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
  56. package/dist/boxes/webm/av1-codec-private.js +95 -0
  57. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
  58. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
  59. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
  60. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
  61. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
  62. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
  63. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
  64. package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
  65. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
  66. package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
  67. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
  68. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
  69. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
  70. package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
  71. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
  72. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
  73. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
  74. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
  75. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
  76. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
  77. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
  78. package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
  79. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
  80. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
  81. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
  82. package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
  83. package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
  84. package/dist/boxes/webm/bitstream/av1.js +118 -0
  85. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  86. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
  87. package/dist/boxes/webm/description.d.ts +2 -0
  88. package/dist/boxes/webm/description.js +83 -0
  89. package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
  90. package/dist/boxes/webm/get-ready-tracks.js +29 -0
  91. package/dist/boxes/webm/get-track.d.ts +6 -0
  92. package/dist/boxes/webm/get-track.js +183 -0
  93. package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
  94. package/dist/boxes/webm/parse-webm-header.js +2 -2
  95. package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
  96. package/dist/boxes/webm/segments/all-segments.js +277 -0
  97. package/dist/boxes/webm/segments/duration.d.ts +1 -1
  98. package/dist/boxes/webm/segments/duration.js +13 -9
  99. package/dist/boxes/webm/segments/info.d.ts +2 -1
  100. package/dist/boxes/webm/segments/info.js +12 -4
  101. package/dist/boxes/webm/segments/main.d.ts +0 -2
  102. package/dist/boxes/webm/segments/main.js +0 -11
  103. package/dist/boxes/webm/segments/muxing.d.ts +1 -1
  104. package/dist/boxes/webm/segments/muxing.js +1 -2
  105. package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
  106. package/dist/boxes/webm/segments/parse-children.js +82 -6
  107. package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
  108. package/dist/boxes/webm/segments/seek-head.js +12 -3
  109. package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
  110. package/dist/boxes/webm/segments/seek-position.js +1 -2
  111. package/dist/boxes/webm/segments/seek.d.ts +7 -2
  112. package/dist/boxes/webm/segments/seek.js +22 -9
  113. package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
  114. package/dist/boxes/webm/segments/track-entry.js +269 -57
  115. package/dist/boxes/webm/segments/tracks.d.ts +2 -1
  116. package/dist/boxes/webm/segments/tracks.js +12 -4
  117. package/dist/boxes/webm/segments/void.d.ts +1 -1
  118. package/dist/boxes/webm/segments/void.js +1 -2
  119. package/dist/boxes/webm/segments/writing.d.ts +1 -1
  120. package/dist/boxes/webm/segments/writing.js +1 -2
  121. package/dist/boxes/webm/segments.d.ts +8 -4
  122. package/dist/boxes/webm/segments.js +176 -40
  123. package/dist/boxes/webm/traversal.d.ts +7 -0
  124. package/dist/boxes/webm/traversal.js +25 -0
  125. package/dist/buffer-iterator.d.ts +15 -1
  126. package/dist/buffer-iterator.js +115 -46
  127. package/dist/combine-uint8array.d.ts +1 -0
  128. package/dist/combine-uint8array.js +13 -0
  129. package/dist/from-fetch.d.ts +2 -0
  130. package/dist/from-fetch.js +54 -0
  131. package/dist/from-node.js +6 -0
  132. package/dist/from-web-file.d.ts +2 -0
  133. package/dist/from-web-file.js +34 -0
  134. package/dist/from-web.js +6 -9
  135. package/dist/get-audio-codec.d.ts +19 -0
  136. package/dist/get-audio-codec.js +153 -60
  137. package/dist/get-dimensions.d.ts +8 -2
  138. package/dist/get-dimensions.js +13 -91
  139. package/dist/get-duration.js +4 -7
  140. package/dist/get-fps.d.ts +4 -3
  141. package/dist/get-fps.js +17 -116
  142. package/dist/get-sample-aspect-ratio.d.ts +37 -0
  143. package/dist/get-sample-aspect-ratio.js +137 -0
  144. package/dist/get-sample-positions.d.ts +11 -1
  145. package/dist/get-sample-positions.js +31 -2
  146. package/dist/get-tracks.d.ts +44 -5
  147. package/dist/get-tracks.js +66 -48
  148. package/dist/get-video-codec.d.ts +2 -0
  149. package/dist/get-video-codec.js +47 -31
  150. package/dist/get-video-metadata.d.ts +2 -0
  151. package/dist/get-video-metadata.js +44 -0
  152. package/dist/has-all-info.d.ts +2 -1
  153. package/dist/has-all-info.js +14 -5
  154. package/dist/index.d.ts +1 -0
  155. package/dist/make-hvc1-codec-strings.d.ts +2 -0
  156. package/dist/make-hvc1-codec-strings.js +47 -0
  157. package/dist/options.d.ts +26 -4
  158. package/dist/parse-media.js +62 -17
  159. package/dist/parse-result.d.ts +16 -5
  160. package/dist/parse-video.d.ts +11 -2
  161. package/dist/parse-video.js +14 -6
  162. package/dist/parser-context.d.ts +8 -0
  163. package/dist/parser-context.js +2 -0
  164. package/dist/parser-state.d.ts +23 -0
  165. package/dist/parser-state.js +112 -0
  166. package/dist/read-and-increment-offset.d.ts +28 -0
  167. package/dist/read-and-increment-offset.js +177 -0
  168. package/dist/reader.d.ts +2 -2
  169. package/dist/traversal.d.ts +37 -0
  170. package/dist/traversal.js +244 -1
  171. package/dist/understand-vorbis.d.ts +1 -0
  172. package/dist/understand-vorbis.js +12 -0
  173. package/dist/webcodec-sample-types.d.ts +21 -0
  174. package/dist/webcodec-sample-types.js +2 -0
  175. package/package.json +10 -2
  176. package/src/add-new-matroska-tracks.ts +23 -0
  177. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
  178. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
  179. package/src/boxes/iso-base-media/make-track.ts +157 -0
  180. package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
  181. package/src/boxes/iso-base-media/moov/moov.ts +8 -3
  182. package/src/boxes/iso-base-media/mvhd.ts +7 -1
  183. package/src/boxes/iso-base-media/process-box.ts +388 -38
  184. package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
  185. package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
  186. package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
  187. package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
  188. package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
  189. package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
  190. package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
  191. package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
  192. package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
  193. package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
  194. package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
  195. package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
  196. package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
  197. package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
  198. package/src/boxes/iso-base-media/tkhd.ts +63 -16
  199. package/src/boxes/iso-base-media/trak/trak.ts +8 -3
  200. package/src/boxes/iso-base-media/void-box.ts +4 -0
  201. package/src/boxes/webm/allowed-partial-segments.ts +1 -0
  202. package/src/boxes/webm/av1-codec-private.ts +113 -0
  203. package/src/boxes/webm/description.ts +101 -0
  204. package/src/boxes/webm/get-ready-tracks.ts +36 -0
  205. package/src/boxes/webm/get-track.ts +250 -0
  206. package/src/boxes/webm/parse-webm-header.ts +6 -2
  207. package/src/boxes/webm/segments/all-segments.ts +285 -0
  208. package/src/boxes/webm/segments/duration.ts +15 -8
  209. package/src/boxes/webm/segments/info.ts +18 -4
  210. package/src/boxes/webm/segments/main.ts +0 -13
  211. package/src/boxes/webm/segments/muxing.ts +1 -1
  212. package/src/boxes/webm/segments/parse-children.ts +132 -9
  213. package/src/boxes/webm/segments/seek-head.ts +17 -4
  214. package/src/boxes/webm/segments/seek-position.ts +1 -2
  215. package/src/boxes/webm/segments/seek.ts +31 -9
  216. package/src/boxes/webm/segments/track-entry.ts +475 -65
  217. package/src/boxes/webm/segments/tracks.ts +17 -7
  218. package/src/boxes/webm/segments/void.ts +4 -2
  219. package/src/boxes/webm/segments/writing.ts +1 -1
  220. package/src/boxes/webm/segments.ts +266 -42
  221. package/src/boxes/webm/traversal.ts +32 -0
  222. package/src/buffer-iterator.ts +140 -45
  223. package/src/combine-uint8array.ts +13 -0
  224. package/src/{from-web.ts → from-fetch.ts} +9 -1
  225. package/src/from-node.ts +8 -0
  226. package/src/from-web-file.ts +39 -0
  227. package/src/get-audio-codec.ts +213 -84
  228. package/src/get-dimensions.ts +25 -132
  229. package/src/get-duration.ts +4 -8
  230. package/src/get-fps.ts +27 -172
  231. package/src/get-sample-aspect-ratio.ts +204 -0
  232. package/src/get-sample-positions.ts +93 -0
  233. package/src/get-tracks.ts +147 -0
  234. package/src/get-video-codec.ts +62 -47
  235. package/src/has-all-info.ts +35 -5
  236. package/src/index.ts +8 -0
  237. package/src/make-hvc1-codec-strings.ts +55 -0
  238. package/src/options.ts +48 -9
  239. package/src/parse-media.ts +90 -21
  240. package/src/parse-result.ts +28 -4
  241. package/src/parse-video.ts +30 -7
  242. package/src/parser-context.ts +9 -0
  243. package/src/parser-state.ts +151 -0
  244. package/src/reader.ts +2 -2
  245. package/src/test/aspect-ratio.test.ts +42 -0
  246. package/src/test/av1.test.ts +108 -0
  247. package/src/test/duration.test.ts +5 -21
  248. package/src/test/matroska.test.ts +350 -31
  249. package/src/test/mvhd.test.ts +6 -1
  250. package/src/test/parse-esds.test.ts +29 -6
  251. package/src/test/parse-stco.test.ts +59 -0
  252. package/src/test/parse-stsc.test.ts +104 -0
  253. package/src/test/parse-stsz.test.ts +57 -0
  254. package/src/test/parse-stts.test.ts +1 -1
  255. package/src/test/parse-video.test.ts +23 -35
  256. package/src/test/parse-webm.test.ts +5 -5
  257. package/src/test/stream-local.test.ts +542 -46
  258. package/src/test/stream-remote.test.ts +15 -13
  259. package/src/test/stream-samples.test.ts +259 -0
  260. package/src/test/stsd.test.ts +60 -8
  261. package/src/test/tkhd.test.ts +4 -1
  262. package/src/traversal.ts +496 -0
  263. package/src/webcodec-sample-types.ts +30 -0
  264. package/tsconfig.json +5 -1
  265. package/tsconfig.tsbuildinfo +1 -1
  266. package/boxes.json +0 -1
  267. package/dist/boxes/iso-base-media/esds-descriptors.d.ts +0 -21
  268. package/dist/boxes/iso-base-media/esds-descriptors.js +0 -62
  269. package/dist/boxes/iso-base-media/esds.d.ts +0 -15
  270. package/dist/boxes/iso-base-media/esds.js +0 -27
  271. package/dist/get-codec.d.ts +0 -4
  272. package/dist/get-codec.js +0 -22
  273. /package/dist/{get-samples.d.ts → boxes/webm/bitstream/av1/frame.d.ts} +0 -0
  274. /package/dist/{get-samples.js → boxes/webm/bitstream/av1/frame.js} +0 -0
  275. /package/src/boxes/iso-base-media/{stts → stsd}/stts.ts +0 -0
package/dist/get-fps.js CHANGED
@@ -1,6 +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
5
  const calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
5
6
  let totalSamples = 0;
6
7
  for (const sample of sttsBox.sampleDistribution) {
@@ -11,29 +12,8 @@ const calculateFps = ({ sttsBox, timeScale, durationInSamples, }) => {
11
12
  return fps;
12
13
  };
13
14
  const trakBoxContainsAudio = (trakBox) => {
14
- if (trakBox.type !== 'trak-box') {
15
- return false;
16
- }
17
- const { children } = trakBox;
18
- const mediaBoxes = children.filter((c) => c.type === 'regular-box' && c.boxType === 'mdia');
19
- if (!mediaBoxes || mediaBoxes.length === 0) {
20
- return false;
21
- }
22
- const firstMediaBox = mediaBoxes[0];
23
- if (firstMediaBox.type !== 'regular-box' ||
24
- firstMediaBox.boxType !== 'mdia') {
25
- return false;
26
- }
27
- const minf = firstMediaBox.children.find((c) => c.type === 'regular-box' && c.boxType === 'minf');
28
- if (!minf || minf.type !== 'regular-box' || minf.boxType !== 'minf') {
29
- return false;
30
- }
31
- const stbl = minf.children.find((c) => c.type === 'regular-box' && c.boxType === 'stbl');
32
- if (!stbl || stbl.type !== 'regular-box' || stbl.boxType !== 'stbl') {
33
- return false;
34
- }
35
- const stsd = stbl.children.find((c) => c.type === 'stsd-box');
36
- if (!stsd || stsd.type !== 'stsd-box') {
15
+ const stsd = (0, traversal_1.getStsdBox)(trakBox);
16
+ if (!stsd) {
37
17
  return false;
38
18
  }
39
19
  const videoSample = stsd.samples.find((s) => s.type === 'audio');
@@ -44,29 +24,8 @@ const trakBoxContainsAudio = (trakBox) => {
44
24
  };
45
25
  exports.trakBoxContainsAudio = trakBoxContainsAudio;
46
26
  const trakBoxContainsVideo = (trakBox) => {
47
- if (trakBox.type !== 'trak-box') {
48
- return false;
49
- }
50
- const { children } = trakBox;
51
- const mediaBoxes = children.filter((c) => c.type === 'regular-box' && c.boxType === 'mdia');
52
- if (!mediaBoxes || mediaBoxes.length === 0) {
53
- return false;
54
- }
55
- const firstMediaBox = mediaBoxes[0];
56
- if (firstMediaBox.type !== 'regular-box' ||
57
- firstMediaBox.boxType !== 'mdia') {
58
- return false;
59
- }
60
- const minf = firstMediaBox.children.find((c) => c.type === 'regular-box' && c.boxType === 'minf');
61
- if (!minf || minf.type !== 'regular-box' || minf.boxType !== 'minf') {
62
- return false;
63
- }
64
- const stbl = minf.children.find((c) => c.type === 'regular-box' && c.boxType === 'stbl');
65
- if (!stbl || stbl.type !== 'regular-box' || stbl.boxType !== 'stbl') {
66
- return false;
67
- }
68
- const stsd = stbl.children.find((c) => c.type === 'stsd-box');
69
- if (!stsd || stsd.type !== 'stsd-box') {
27
+ const stsd = (0, traversal_1.getStsdBox)(trakBox);
28
+ if (!stsd) {
70
29
  return false;
71
30
  }
72
31
  const videoSample = stsd.samples.find((s) => s.type === 'video');
@@ -76,88 +35,30 @@ const trakBoxContainsVideo = (trakBox) => {
76
35
  return true;
77
36
  };
78
37
  exports.trakBoxContainsVideo = trakBoxContainsVideo;
79
- const getTimescaleAndDuration = (boxes) => {
80
- const moovBox = boxes.find((s) => s.type === 'moov-box');
81
- if (!moovBox || moovBox.type !== 'moov-box') {
82
- return null;
83
- }
84
- const { children } = moovBox;
85
- const trackBoxes = children.filter((c) => c.type === 'trak-box');
86
- if (!trackBoxes || trackBoxes.length === 0) {
87
- return null;
88
- }
89
- const trackBox = trackBoxes.find(exports.trakBoxContainsVideo);
90
- if (!trackBox || trackBox.type !== 'trak-box') {
91
- return null;
92
- }
93
- const trackBoxChildren = trackBox.children;
94
- if (!trackBoxChildren || trackBoxChildren.length === 0) {
95
- return null;
96
- }
97
- const mdiaBox = trackBoxChildren.find((c) => c.type === 'regular-box' && c.boxType === 'mdia');
98
- if (!mdiaBox ||
99
- mdiaBox.type !== 'regular-box' ||
100
- mdiaBox.boxType !== 'mdia') {
101
- return null;
102
- }
103
- const mdhdBox = mdiaBox === null || mdiaBox === void 0 ? void 0 : mdiaBox.children.find((c) => c.type === 'mdhd-box');
104
- if (mdhdBox && mdhdBox.type === 'mdhd-box') {
38
+ const getTimescaleAndDuration = (trakBox) => {
39
+ const mdhdBox = (0, traversal_1.getMdhdBox)(trakBox);
40
+ if (mdhdBox) {
105
41
  return { timescale: mdhdBox.timescale, duration: mdhdBox.duration };
106
42
  }
107
- const mvhdBox = moovBox.children.find((c) => c.type === 'mvhd-box');
108
- if (!mvhdBox || mvhdBox.type !== 'mvhd-box') {
109
- return null;
110
- }
111
- const { timeScale, durationInUnits } = mvhdBox;
112
- return { timescale: timeScale, duration: durationInUnits };
43
+ return null;
113
44
  };
114
45
  exports.getTimescaleAndDuration = getTimescaleAndDuration;
115
46
  const getFps = (segments) => {
116
- const timescaleAndDuration = (0, exports.getTimescaleAndDuration)(segments);
117
- if (!timescaleAndDuration) {
118
- return null;
119
- }
120
- const moovBox = segments.find((s) => s.type === 'moov-box');
121
- if (!moovBox || moovBox.type !== 'moov-box') {
122
- return null;
123
- }
124
- const mvhdBox = moovBox.children.find((c) => c.type === 'mvhd-box');
125
- if (!mvhdBox || mvhdBox.type !== 'mvhd-box') {
126
- return null;
127
- }
128
- const { children } = moovBox;
129
- const trackBoxes = children.filter((c) => c.type === 'trak-box');
130
- if (!trackBoxes || trackBoxes.length === 0) {
47
+ const moovBox = (0, traversal_1.getMoovBox)(segments);
48
+ if (!moovBox) {
131
49
  return null;
132
50
  }
51
+ const trackBoxes = (0, traversal_1.getTraks)(moovBox);
133
52
  const trackBox = trackBoxes.find(exports.trakBoxContainsVideo);
134
- if (!trackBox || trackBox.type !== 'trak-box') {
135
- return null;
136
- }
137
- const trackBoxChildren = trackBox.children;
138
- if (!trackBoxChildren || trackBoxChildren.length === 0) {
53
+ if (!trackBox) {
139
54
  return null;
140
55
  }
141
- const mdiaBox = trackBoxChildren.find((c) => c.type === 'regular-box' && c.boxType === 'mdia');
142
- if (!mdiaBox ||
143
- mdiaBox.type !== 'regular-box' ||
144
- mdiaBox.boxType !== 'mdia') {
145
- return null;
146
- }
147
- const minfBox = mdiaBox.children.find((c) => c.type === 'regular-box' && c.boxType === 'minf');
148
- if (!minfBox ||
149
- minfBox.type !== 'regular-box' ||
150
- minfBox.boxType !== 'minf') {
151
- return null;
152
- }
153
- const stblBox = minfBox.children.find((c) => c.type === 'regular-box' && c.boxType === 'stbl');
154
- if (!stblBox ||
155
- stblBox.type !== 'regular-box' ||
156
- stblBox.boxType !== 'stbl') {
56
+ const timescaleAndDuration = (0, exports.getTimescaleAndDuration)(trackBox);
57
+ if (!timescaleAndDuration) {
157
58
  return null;
158
59
  }
159
- const sttsBox = stblBox.children.find((c) => c.type === 'stts-box');
160
- if (!sttsBox || sttsBox.type !== 'stts-box') {
60
+ const sttsBox = (0, traversal_1.getSttsBox)(trackBox);
61
+ if (!sttsBox) {
161
62
  return null;
162
63
  }
163
64
  return calculateFps({
@@ -0,0 +1,37 @@
1
+ import type { Av1CBox } from './boxes/iso-base-media/stsd/av1c';
2
+ import type { AvccBox } from './boxes/iso-base-media/stsd/avcc';
3
+ import type { ColorParameterBox } from './boxes/iso-base-media/stsd/colr';
4
+ import type { HvccBox } from './boxes/iso-base-media/stsd/hvcc';
5
+ import type { PaspBox } from './boxes/iso-base-media/stsd/pasp';
6
+ import type { VideoSample } from './boxes/iso-base-media/stsd/samples';
7
+ import type { TkhdBox } from './boxes/iso-base-media/tkhd';
8
+ import type { TrakBox } from './boxes/iso-base-media/trak/trak';
9
+ import type { Dimensions } from './get-dimensions';
10
+ type AspectRatio = {
11
+ numerator: number;
12
+ denominator: number;
13
+ };
14
+ export declare const getVideoSample: (trakBox: TrakBox) => VideoSample | null;
15
+ export declare const getAvccBox: (trakBox: TrakBox) => AvccBox | null;
16
+ export declare const getAv1CBox: (trakBox: TrakBox) => Av1CBox | null;
17
+ export declare const getPaspBox: (trakBox: TrakBox) => PaspBox | null;
18
+ export declare const getHvccBox: (trakBox: TrakBox) => HvccBox | null;
19
+ export declare const getSampleAspectRatio: (trakBox: TrakBox) => AspectRatio;
20
+ export declare const getColrBox: (videoSample: VideoSample) => ColorParameterBox | null;
21
+ export declare const applyTkhdBox: (aspectRatioApplied: Dimensions, tkhdBox: TkhdBox) => {
22
+ displayAspectWidth: number;
23
+ displayAspectHeight: number;
24
+ width: number;
25
+ height: number;
26
+ rotation: number;
27
+ };
28
+ export declare const applyAspectRatios: ({ dimensions, sampleAspectRatio, displayAspectRatio, }: {
29
+ dimensions: Dimensions;
30
+ sampleAspectRatio: AspectRatio;
31
+ displayAspectRatio: AspectRatio;
32
+ }) => Dimensions;
33
+ export declare const getDisplayAspectRatio: ({ sampleAspectRatio, nativeDimensions, }: {
34
+ sampleAspectRatio: AspectRatio;
35
+ nativeDimensions: Dimensions;
36
+ }) => AspectRatio;
37
+ export {};
@@ -0,0 +1,137 @@
1
+ "use strict";
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) => {
6
+ const stsdBox = (0, traversal_1.getStsdBox)(trakBox);
7
+ if (!stsdBox) {
8
+ return null;
9
+ }
10
+ const videoSample = stsdBox.samples.find((s) => s.type === 'video');
11
+ if (!videoSample || videoSample.type !== 'video') {
12
+ return null;
13
+ }
14
+ return videoSample;
15
+ };
16
+ exports.getVideoSample = getVideoSample;
17
+ const getAvccBox = (trakBox) => {
18
+ const videoSample = (0, exports.getVideoSample)(trakBox);
19
+ if (!videoSample) {
20
+ return null;
21
+ }
22
+ const avccBox = videoSample.descriptors.find((c) => c.type === 'avcc-box');
23
+ if (!avccBox || avccBox.type !== 'avcc-box') {
24
+ return null;
25
+ }
26
+ return avccBox;
27
+ };
28
+ exports.getAvccBox = getAvccBox;
29
+ const getAv1CBox = (trakBox) => {
30
+ const videoSample = (0, exports.getVideoSample)(trakBox);
31
+ if (!videoSample) {
32
+ return null;
33
+ }
34
+ const av1cBox = videoSample.descriptors.find((c) => c.type === 'av1C-box');
35
+ if (!av1cBox || av1cBox.type !== 'av1C-box') {
36
+ return null;
37
+ }
38
+ return av1cBox;
39
+ };
40
+ exports.getAv1CBox = getAv1CBox;
41
+ const getPaspBox = (trakBox) => {
42
+ const videoSample = (0, exports.getVideoSample)(trakBox);
43
+ if (!videoSample) {
44
+ return null;
45
+ }
46
+ const paspBox = videoSample.descriptors.find((c) => c.type === 'pasp-box');
47
+ if (!paspBox || paspBox.type !== 'pasp-box') {
48
+ return null;
49
+ }
50
+ return paspBox;
51
+ };
52
+ exports.getPaspBox = getPaspBox;
53
+ const getHvccBox = (trakBox) => {
54
+ const videoSample = (0, exports.getVideoSample)(trakBox);
55
+ if (!videoSample) {
56
+ return null;
57
+ }
58
+ const hvccBox = videoSample.descriptors.find((c) => c.type === 'hvcc-box');
59
+ if (!hvccBox || hvccBox.type !== 'hvcc-box') {
60
+ return null;
61
+ }
62
+ return hvccBox;
63
+ };
64
+ exports.getHvccBox = getHvccBox;
65
+ const getSampleAspectRatio = (trakBox) => {
66
+ const paspBox = (0, exports.getPaspBox)(trakBox);
67
+ if (!paspBox) {
68
+ return {
69
+ numerator: 1,
70
+ denominator: 1,
71
+ };
72
+ }
73
+ return {
74
+ numerator: paspBox.hSpacing,
75
+ denominator: paspBox.vSpacing,
76
+ };
77
+ };
78
+ exports.getSampleAspectRatio = getSampleAspectRatio;
79
+ const getColrBox = (videoSample) => {
80
+ const colrBox = videoSample.descriptors.find((c) => c.type === 'colr-box');
81
+ if (!colrBox || colrBox.type !== 'colr-box') {
82
+ return null;
83
+ }
84
+ return colrBox;
85
+ };
86
+ exports.getColrBox = getColrBox;
87
+ const applyTkhdBox = (aspectRatioApplied, tkhdBox) => {
88
+ if (tkhdBox === null || tkhdBox.rotation === 0) {
89
+ return {
90
+ displayAspectWidth: aspectRatioApplied.width,
91
+ displayAspectHeight: aspectRatioApplied.height,
92
+ width: aspectRatioApplied.width,
93
+ height: aspectRatioApplied.height,
94
+ rotation: 0,
95
+ };
96
+ }
97
+ return {
98
+ width: tkhdBox.width,
99
+ height: tkhdBox.height,
100
+ rotation: tkhdBox.rotation,
101
+ displayAspectWidth: aspectRatioApplied.width,
102
+ displayAspectHeight: aspectRatioApplied.height,
103
+ };
104
+ };
105
+ exports.applyTkhdBox = applyTkhdBox;
106
+ const applyAspectRatios = ({ dimensions, sampleAspectRatio, displayAspectRatio, }) => {
107
+ if (displayAspectRatio.numerator === 0) {
108
+ return dimensions;
109
+ }
110
+ if (displayAspectRatio.denominator === 0) {
111
+ return dimensions;
112
+ }
113
+ const newWidth = Math.round((dimensions.width * sampleAspectRatio.numerator) /
114
+ sampleAspectRatio.denominator);
115
+ const newHeight = Math.floor(newWidth / (displayAspectRatio.numerator / displayAspectRatio.denominator));
116
+ return {
117
+ width: Math.floor(newWidth),
118
+ height: newHeight,
119
+ };
120
+ };
121
+ exports.applyAspectRatios = applyAspectRatios;
122
+ function gcd(a, b) {
123
+ return b === 0 ? a : gcd(b, a % b);
124
+ }
125
+ function reduceFraction(numerator, denominator) {
126
+ const greatestCommonDivisor = gcd(Math.abs(numerator), Math.abs(denominator));
127
+ return {
128
+ numerator: numerator / greatestCommonDivisor,
129
+ denominator: denominator / greatestCommonDivisor,
130
+ };
131
+ }
132
+ const getDisplayAspectRatio = ({ sampleAspectRatio, nativeDimensions, }) => {
133
+ const num = Math.round(nativeDimensions.width * sampleAspectRatio.numerator);
134
+ const den = Math.round(nativeDimensions.height * sampleAspectRatio.denominator);
135
+ return reduceFraction(num, den);
136
+ };
137
+ exports.getDisplayAspectRatio = getDisplayAspectRatio;
@@ -1,12 +1,22 @@
1
+ import type { CttsBox } from './boxes/iso-base-media/stsd/ctts';
1
2
  import type { StcoBox } from './boxes/iso-base-media/stsd/stco';
2
3
  import type { StscBox } from './boxes/iso-base-media/stsd/stsc';
4
+ import type { StssBox } from './boxes/iso-base-media/stsd/stss';
3
5
  import type { StszBox } from './boxes/iso-base-media/stsd/stsz';
6
+ import type { SttsBox } from './boxes/iso-base-media/stsd/stts';
4
7
  export type SamplePosition = {
5
8
  offset: number;
6
9
  size: number;
10
+ isKeyframe: boolean;
11
+ dts: number;
12
+ cts: number;
13
+ duration: number;
7
14
  };
8
- export declare const getSamplePositions: ({ stcoBox, stszBox, stscBox, }: {
15
+ export declare const getSamplePositions: ({ stcoBox, stszBox, stscBox, stssBox, sttsBox, cttsBox, }: {
9
16
  stcoBox: StcoBox;
10
17
  stszBox: StszBox;
11
18
  stscBox: StscBox;
19
+ stssBox: StssBox | null;
20
+ sttsBox: SttsBox;
21
+ cttsBox: CttsBox | null;
12
22
  }) => SamplePosition[];
@@ -1,7 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSamplePositions = void 0;
4
- const getSamplePositions = ({ stcoBox, stszBox, stscBox, }) => {
4
+ const getSamplePositions = ({ stcoBox, stszBox, stscBox, stssBox, sttsBox, cttsBox, }) => {
5
+ var _a;
6
+ const sttsDeltas = [];
7
+ for (const distribution of sttsBox.sampleDistribution) {
8
+ for (let i = 0; i < distribution.sampleCount; i++) {
9
+ sttsDeltas.push(distribution.sampleDelta);
10
+ }
11
+ }
12
+ const cttsEntries = [];
13
+ for (const entry of (_a = cttsBox === null || cttsBox === void 0 ? void 0 : cttsBox.entries) !== null && _a !== void 0 ? _a : [
14
+ { sampleCount: sttsDeltas.length, sampleOffset: 0 },
15
+ ]) {
16
+ for (let i = 0; i < entry.sampleCount; i++) {
17
+ cttsEntries.push(entry.sampleOffset);
18
+ }
19
+ }
20
+ let dts = 0;
5
21
  const chunks = stcoBox.entries;
6
22
  const samples = [];
7
23
  let samplesPerChunk = 1;
@@ -12,11 +28,24 @@ const getSamplePositions = ({ stcoBox, stszBox, stscBox, }) => {
12
28
  }
13
29
  let offsetInThisChunk = 0;
14
30
  for (let j = 0; j < samplesPerChunk; j++) {
15
- const size = stszBox.samples[samples.length];
31
+ const size = stszBox.countType === 'fixed'
32
+ ? stszBox.sampleSize
33
+ : stszBox.entries[samples.length];
34
+ const isKeyframe = stssBox
35
+ ? stssBox.sampleNumber.includes(samples.length + 1)
36
+ : true;
37
+ const delta = sttsDeltas[samples.length];
38
+ const ctsOffset = cttsEntries[samples.length];
39
+ const cts = dts + ctsOffset;
16
40
  samples.push({
17
41
  offset: chunks[i] + offsetInThisChunk,
18
42
  size,
43
+ isKeyframe,
44
+ dts,
45
+ cts,
46
+ duration: delta,
19
47
  });
48
+ dts += delta;
20
49
  offsetInThisChunk += size;
21
50
  }
22
51
  }
@@ -1,10 +1,49 @@
1
+ import type { MoovBox } from './boxes/iso-base-media/moov/moov';
1
2
  import type { SamplePosition } from './get-sample-positions';
2
3
  import type { AnySegment } from './parse-result';
3
- type Track = {
4
- type: 'audio' | 'video';
5
- samplePositions: SamplePosition[];
4
+ import type { ParserState } from './parser-state';
5
+ type SampleAspectRatio = {
6
+ numerator: number;
7
+ denominator: number;
8
+ };
9
+ export type VideoTrack = {
10
+ type: 'video';
11
+ samplePositions: SamplePosition[] | null;
12
+ trackId: number;
13
+ description: Uint8Array | undefined;
14
+ timescale: number;
15
+ codec: string;
16
+ sampleAspectRatio: SampleAspectRatio;
17
+ width: number;
18
+ height: number;
19
+ displayAspectWidth: number;
20
+ displayAspectHeight: number;
21
+ codedWidth: number;
22
+ codedHeight: number;
23
+ rotation: number;
24
+ };
25
+ export type AudioTrack = {
26
+ type: 'audio';
27
+ samplePositions: SamplePosition[] | null;
6
28
  trackId: number;
29
+ timescale: number;
30
+ codec: string;
31
+ numberOfChannels: number;
32
+ sampleRate: number;
33
+ description: Uint8Array | undefined;
34
+ };
35
+ export type OtherTrack = {
36
+ type: 'other';
37
+ samplePositions: SamplePosition[] | null;
38
+ trackId: number;
39
+ timescale: number;
40
+ };
41
+ export type Track = VideoTrack | AudioTrack | OtherTrack;
42
+ export declare const getNumberOfTracks: (moovBox: MoovBox) => number;
43
+ export declare const hasTracks: (segments: AnySegment[]) => boolean;
44
+ export declare const getTracks: (segments: AnySegment[], state: ParserState) => {
45
+ videoTracks: VideoTrack[];
46
+ audioTracks: AudioTrack[];
47
+ otherTracks: OtherTrack[];
7
48
  };
8
- export declare const getNumberOfTracks: (segments: AnySegment[]) => number;
9
- export declare const getTracks: (segments: AnySegment[]) => Track[];
10
49
  export {};
@@ -1,66 +1,84 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTracks = exports.getNumberOfTracks = void 0;
4
- const get_fps_1 = require("./get-fps");
5
- const get_sample_positions_1 = require("./get-sample-positions");
6
- const traversal_1 = require("./traversal");
7
- // TODO: Use this to determine if all tracks are present
8
- const getNumberOfTracks = (segments) => {
9
- const moovBox = (0, traversal_1.getMoovBox)(segments);
10
- if (!moovBox) {
11
- return 0;
12
- }
13
- const mvHdBox = (0, traversal_1.getMvhdBox)(moovBox);
3
+ exports.getTracks = exports.hasTracks = exports.getNumberOfTracks = void 0;
4
+ const make_track_1 = require("./boxes/iso-base-media/make-track");
5
+ 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");
8
+ const getNumberOfTracks = (moovBox) => {
9
+ const mvHdBox = (0, traversal_2.getMvhdBox)(moovBox);
14
10
  if (!mvHdBox) {
15
11
  return 0;
16
12
  }
17
13
  return mvHdBox.nextTrackId - 1;
18
14
  };
19
15
  exports.getNumberOfTracks = getNumberOfTracks;
20
- const getTracks = (segments) => {
21
- const moovBox = (0, traversal_1.getMoovBox)(segments);
16
+ const hasTracks = (segments) => {
17
+ const mainSegment = (0, traversal_1.getMainSegment)(segments);
18
+ if (mainSegment) {
19
+ return (0, traversal_2.getTracksSegment)(mainSegment) !== null;
20
+ }
21
+ const moovBox = (0, traversal_2.getMoovBox)(segments);
22
22
  if (!moovBox) {
23
- return [];
23
+ return false;
24
24
  }
25
- const foundTracks = [];
26
- const tracks = (0, traversal_1.getTraks)(moovBox);
27
- for (const track of tracks) {
28
- const stszBox = (0, traversal_1.getStszBox)(track);
29
- const stcoBox = (0, traversal_1.getStcoBox)(track);
30
- const stscBox = (0, traversal_1.getStscBox)(track);
31
- const tkhdBox = (0, traversal_1.getTkhdBox)(track);
32
- if (!tkhdBox) {
33
- throw new Error('Expected tkhd box in trak box');
34
- }
35
- if (!stszBox) {
36
- throw new Error('Expected stsz box in trak box');
25
+ const numberOfTracks = (0, exports.getNumberOfTracks)(moovBox);
26
+ const tracks = (0, traversal_2.getTraks)(moovBox);
27
+ return tracks.length === numberOfTracks;
28
+ };
29
+ exports.hasTracks = hasTracks;
30
+ const getTracks = (segments, state) => {
31
+ const videoTracks = [];
32
+ const audioTracks = [];
33
+ const otherTracks = [];
34
+ const mainSegment = segments.find((s) => s.type === 'main-segment');
35
+ if (mainSegment && mainSegment.type === 'main-segment') {
36
+ const matroskaTracks = (0, get_ready_tracks_1.getTracksFromMatroska)(mainSegment, state.getTimescale());
37
+ for (const track of matroskaTracks) {
38
+ if (track.type === 'video') {
39
+ videoTracks.push(track);
40
+ }
41
+ else if (track.type === 'audio') {
42
+ audioTracks.push(track);
43
+ }
44
+ else if (track.type === 'other') {
45
+ otherTracks.push(track);
46
+ }
37
47
  }
38
- if (!stcoBox) {
39
- throw new Error('Expected stco box in trak box');
48
+ return {
49
+ videoTracks,
50
+ audioTracks,
51
+ otherTracks,
52
+ };
53
+ }
54
+ const moovBox = (0, traversal_2.getMoovBox)(segments);
55
+ if (!moovBox) {
56
+ return {
57
+ videoTracks,
58
+ audioTracks,
59
+ otherTracks,
60
+ };
61
+ }
62
+ const tracks = (0, traversal_2.getTraks)(moovBox);
63
+ for (const trakBox of tracks) {
64
+ const track = (0, make_track_1.makeBaseMediaTrack)(trakBox);
65
+ if (!track) {
66
+ continue;
40
67
  }
41
- if (!stscBox) {
42
- throw new Error('Expected stsc box in trak box');
68
+ if (track.type === 'video') {
69
+ videoTracks.push(track);
43
70
  }
44
- const samplePositions = (0, get_sample_positions_1.getSamplePositions)({
45
- stcoBox,
46
- stscBox,
47
- stszBox,
48
- });
49
- if ((0, get_fps_1.trakBoxContainsAudio)(track)) {
50
- foundTracks.push({
51
- type: 'audio',
52
- samplePositions,
53
- trackId: tkhdBox.trackId,
54
- });
71
+ else if (track.type === 'audio') {
72
+ audioTracks.push(track);
55
73
  }
56
- if ((0, get_fps_1.trakBoxContainsVideo)(track)) {
57
- foundTracks.push({
58
- type: 'video',
59
- samplePositions,
60
- trackId: tkhdBox.trackId,
61
- });
74
+ else if (track.type === 'other') {
75
+ otherTracks.push(track);
62
76
  }
63
77
  }
64
- return foundTracks;
78
+ return {
79
+ videoTracks,
80
+ audioTracks,
81
+ otherTracks,
82
+ };
65
83
  };
66
84
  exports.getTracks = getTracks;
@@ -1,4 +1,6 @@
1
+ import type { TrakBox } from './boxes/iso-base-media/trak/trak';
1
2
  import type { KnownVideoCodecs } from './options';
2
3
  import type { AnySegment } from './parse-result';
3
4
  export declare const hasVideoCodec: (boxes: AnySegment[]) => boolean;
5
+ export declare const getVideoCodecString: (trakBox: TrakBox) => string | null;
4
6
  export declare const getVideoCodec: (boxes: AnySegment[]) => KnownVideoCodecs | null;