@remotion/media-parser 4.0.209 → 4.0.211

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 (290) 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 +13 -4
  5. package/dist/boxes/iso-base-media/mdat/mdat.js +20 -5
  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 +66 -12
  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 +39 -0
  24. package/dist/boxes/iso-base-media/traversal.js +201 -0
  25. package/dist/boxes/webm/color.d.ts +4 -0
  26. package/dist/boxes/webm/color.js +127 -0
  27. package/dist/boxes/webm/description.js +1 -1
  28. package/dist/boxes/webm/ebml.d.ts +1 -1
  29. package/dist/boxes/webm/get-ready-tracks.js +3 -3
  30. package/dist/boxes/webm/get-sample-from-block.js +1 -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 +2 -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/segments/parse-children.js +6 -0
  37. package/dist/boxes/webm/traversal.d.ts +26 -1
  38. package/dist/boxes/webm/traversal.js +214 -1
  39. package/dist/buffer-iterator.d.ts +4 -1
  40. package/dist/buffer-iterator.js +31 -5
  41. package/dist/create/cluster-segment.js +0 -2
  42. package/dist/create/cluster.d.ts +16 -2
  43. package/dist/create/cluster.js +17 -10
  44. package/dist/create/create-media.d.ts +4 -2
  45. package/dist/create/create-media.js +101 -22
  46. package/dist/create/make-duration-with-padding.d.ts +1 -1
  47. package/dist/create/make-duration-with-padding.js +3 -3
  48. package/dist/create/matroska-cues.d.ts +6 -0
  49. package/dist/create/matroska-cues.js +49 -0
  50. package/dist/create/matroska-info.js +1 -1
  51. package/dist/create/matroska-seek.d.ts +6 -0
  52. package/dist/create/matroska-seek.js +32 -0
  53. package/dist/create/matroska-segment.d.ts +1 -0
  54. package/dist/create/matroska-segment.js +3 -2
  55. package/dist/create/matroska-trackentry.d.ts +9 -14
  56. package/dist/create/matroska-trackentry.js +79 -102
  57. package/dist/emit-available-info.d.ts +12 -0
  58. package/dist/emit-available-info.js +133 -0
  59. package/dist/esm/buffer.mjs +57 -0
  60. package/dist/esm/from-fetch.mjs +107 -0
  61. package/dist/esm/from-node.mjs +49 -0
  62. package/dist/esm/from-web-file.mjs +49 -0
  63. package/dist/esm/index.mjs +6822 -0
  64. package/dist/esm/web-fs.mjs +67 -0
  65. package/dist/get-audio-codec.d.ts +5 -5
  66. package/dist/get-audio-codec.js +44 -57
  67. package/dist/get-container.d.ts +4 -0
  68. package/dist/get-container.js +26 -0
  69. package/dist/get-duration.js +1 -1
  70. package/dist/get-fps.js +1 -1
  71. package/dist/get-sample-aspect-ratio.d.ts +1 -1
  72. package/dist/get-sample-aspect-ratio.js +19 -19
  73. package/dist/get-tracks.d.ts +13 -0
  74. package/dist/get-tracks.js +8 -8
  75. package/dist/get-video-codec.d.ts +5 -2
  76. package/dist/get-video-codec.js +111 -21
  77. package/dist/has-all-info.d.ts +2 -2
  78. package/dist/has-all-info.js +23 -9
  79. package/dist/index.d.ts +4 -1
  80. package/dist/options.d.ts +97 -30
  81. package/dist/parse-media.js +59 -69
  82. package/dist/parse-video.d.ts +2 -1
  83. package/dist/parse-video.js +3 -1
  84. package/dist/parser-context.d.ts +1 -0
  85. package/dist/parser-state.js +1 -2
  86. package/dist/readers/from-fetch.d.ts +12 -0
  87. package/dist/readers/from-fetch.js +83 -17
  88. package/dist/readers/from-node.js +14 -3
  89. package/dist/readers/from-web-file.js +15 -2
  90. package/dist/readers/reader.d.ts +7 -1
  91. package/dist/samples-from-moof.js +1 -1
  92. package/dist/truthy.d.ts +3 -0
  93. package/dist/truthy.js +7 -0
  94. package/dist/writers/buffer.d.ts +2 -0
  95. package/dist/writers/buffer.js +58 -0
  96. package/dist/writers/web-fs.d.ts +1 -0
  97. package/dist/writers/web-fs.js +42 -18
  98. package/dist/writers/writer.d.ts +4 -2
  99. package/fetch.js +2 -0
  100. package/node.js +2 -0
  101. package/package.json +43 -8
  102. package/web-file.js +2 -0
  103. package/web-fs.js +2 -0
  104. package/.eslintrc +0 -8
  105. package/dist/av1-codec-string.d.ts +0 -3
  106. package/dist/av1-codec-string.js +0 -91
  107. package/dist/boxes/iso-base-media/ftype.d.ts +0 -9
  108. package/dist/boxes/iso-base-media/ftype.js +0 -31
  109. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +0 -20
  110. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +0 -73
  111. package/dist/boxes/iso-base-media/stts/stts.d.ts +0 -15
  112. package/dist/boxes/iso-base-media/stts/stts.js +0 -35
  113. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +0 -14
  114. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +0 -67
  115. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +0 -11
  116. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +0 -14
  117. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +0 -6
  118. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +0 -9
  119. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +0 -16
  120. package/dist/boxes/webm/bitstream/av1/color-config.js +0 -103
  121. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +0 -14
  122. package/dist/boxes/webm/bitstream/av1/color-primaries.js +0 -17
  123. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +0 -9
  124. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +0 -17
  125. package/dist/boxes/webm/bitstream/av1/frame.d.ts +0 -0
  126. package/dist/boxes/webm/bitstream/av1/frame.js +0 -1
  127. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +0 -51
  128. package/dist/boxes/webm/bitstream/av1/header-segment.js +0 -183
  129. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +0 -17
  130. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +0 -20
  131. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +0 -10
  132. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +0 -15
  133. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +0 -5
  134. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +0 -8
  135. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +0 -8
  136. package/dist/boxes/webm/bitstream/av1/timing-info.js +0 -20
  137. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +0 -21
  138. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +0 -24
  139. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +0 -2
  140. package/dist/boxes/webm/bitstream/av1/uvlc.js +0 -20
  141. package/dist/boxes/webm/bitstream/av1.d.ts +0 -20
  142. package/dist/boxes/webm/bitstream/av1.js +0 -118
  143. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  144. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +0 -1
  145. package/dist/boxes/webm/segments/duration.d.ts +0 -6
  146. package/dist/boxes/webm/segments/duration.js +0 -19
  147. package/dist/boxes/webm/segments/info.d.ts +0 -9
  148. package/dist/boxes/webm/segments/info.js +0 -22
  149. package/dist/boxes/webm/segments/main.d.ts +0 -5
  150. package/dist/boxes/webm/segments/main.js +0 -2
  151. package/dist/boxes/webm/segments/muxing.d.ts +0 -6
  152. package/dist/boxes/webm/segments/muxing.js +0 -11
  153. package/dist/boxes/webm/segments/seek-head.d.ts +0 -9
  154. package/dist/boxes/webm/segments/seek-head.js +0 -22
  155. package/dist/boxes/webm/segments/seek-position.d.ts +0 -6
  156. package/dist/boxes/webm/segments/seek-position.js +0 -11
  157. package/dist/boxes/webm/segments/seek.d.ts +0 -13
  158. package/dist/boxes/webm/segments/seek.js +0 -35
  159. package/dist/boxes/webm/segments/timestamp-scale.d.ts +0 -6
  160. package/dist/boxes/webm/segments/timestamp-scale.js +0 -11
  161. package/dist/boxes/webm/segments/tracks.d.ts +0 -8
  162. package/dist/boxes/webm/segments/tracks.js +0 -21
  163. package/dist/boxes/webm/segments/unknown.d.ts +0 -6
  164. package/dist/boxes/webm/segments/unknown.js +0 -11
  165. package/dist/boxes/webm/segments/void.d.ts +0 -6
  166. package/dist/boxes/webm/segments/void.js +0 -11
  167. package/dist/boxes/webm/segments/writing.d.ts +0 -6
  168. package/dist/boxes/webm/segments/writing.js +0 -11
  169. package/dist/boxes/webm/tracks.d.ts +0 -8
  170. package/dist/boxes/webm/tracks.js +0 -21
  171. package/dist/combine-uint8array.d.ts +0 -1
  172. package/dist/combine-uint8array.js +0 -13
  173. package/dist/from-web.d.ts +0 -2
  174. package/dist/from-web.js +0 -45
  175. package/dist/get-video-metadata.d.ts +0 -2
  176. package/dist/get-video-metadata.js +0 -44
  177. package/dist/read-and-increment-offset.d.ts +0 -28
  178. package/dist/read-and-increment-offset.js +0 -177
  179. package/dist/understand-vorbis.d.ts +0 -1
  180. package/dist/understand-vorbis.js +0 -12
  181. package/input.webm +0 -0
  182. package/src/add-new-matroska-tracks.ts +0 -23
  183. package/src/boxes/iso-base-media/base-type.ts +0 -4
  184. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +0 -68
  185. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +0 -135
  186. package/src/boxes/iso-base-media/esds/esds.ts +0 -49
  187. package/src/boxes/iso-base-media/ftyp.ts +0 -39
  188. package/src/boxes/iso-base-media/get-sample-positions-from-track.ts +0 -69
  189. package/src/boxes/iso-base-media/make-track.ts +0 -116
  190. package/src/boxes/iso-base-media/mdat/mdat.ts +0 -140
  191. package/src/boxes/iso-base-media/mdhd.ts +0 -59
  192. package/src/boxes/iso-base-media/moov/moov.ts +0 -43
  193. package/src/boxes/iso-base-media/mvhd.ts +0 -114
  194. package/src/boxes/iso-base-media/process-box.ts +0 -748
  195. package/src/boxes/iso-base-media/stsd/av1c.ts +0 -19
  196. package/src/boxes/iso-base-media/stsd/avcc.ts +0 -36
  197. package/src/boxes/iso-base-media/stsd/colr.ts +0 -49
  198. package/src/boxes/iso-base-media/stsd/ctts.ts +0 -64
  199. package/src/boxes/iso-base-media/stsd/hvcc.ts +0 -32
  200. package/src/boxes/iso-base-media/stsd/keys.ts +0 -27
  201. package/src/boxes/iso-base-media/stsd/mebx.ts +0 -54
  202. package/src/boxes/iso-base-media/stsd/pasp.ts +0 -32
  203. package/src/boxes/iso-base-media/stsd/samples.ts +0 -359
  204. package/src/boxes/iso-base-media/stsd/stco.ts +0 -52
  205. package/src/boxes/iso-base-media/stsd/stsc.ts +0 -61
  206. package/src/boxes/iso-base-media/stsd/stsd.ts +0 -55
  207. package/src/boxes/iso-base-media/stsd/stss.ts +0 -47
  208. package/src/boxes/iso-base-media/stsd/stsz.ts +0 -75
  209. package/src/boxes/iso-base-media/stsd/stts.ts +0 -62
  210. package/src/boxes/iso-base-media/tfdt.ts +0 -37
  211. package/src/boxes/iso-base-media/tfhd.ts +0 -66
  212. package/src/boxes/iso-base-media/tkhd.ts +0 -150
  213. package/src/boxes/iso-base-media/to-date.ts +0 -9
  214. package/src/boxes/iso-base-media/trak/trak.ts +0 -43
  215. package/src/boxes/iso-base-media/trun.ts +0 -74
  216. package/src/boxes/iso-base-media/void-box.ts +0 -4
  217. package/src/boxes/webm/allowed-partial-segments.ts +0 -1
  218. package/src/boxes/webm/av1-codec-private.ts +0 -113
  219. package/src/boxes/webm/description.ts +0 -104
  220. package/src/boxes/webm/ebml.ts +0 -98
  221. package/src/boxes/webm/get-ready-tracks.ts +0 -36
  222. package/src/boxes/webm/get-sample-from-block.ts +0 -125
  223. package/src/boxes/webm/get-track.ts +0 -257
  224. package/src/boxes/webm/make-header.ts +0 -253
  225. package/src/boxes/webm/parse-ebml.ts +0 -259
  226. package/src/boxes/webm/parse-webm-header.ts +0 -18
  227. package/src/boxes/webm/segments/all-segments.ts +0 -888
  228. package/src/boxes/webm/segments/block-simple-block-flags.ts +0 -52
  229. package/src/boxes/webm/segments/parse-children.ts +0 -144
  230. package/src/boxes/webm/segments/track-entry.ts +0 -38
  231. package/src/boxes/webm/segments.ts +0 -147
  232. package/src/boxes/webm/traversal.ts +0 -45
  233. package/src/buffer-iterator.ts +0 -555
  234. package/src/create/cluster-segment.ts +0 -62
  235. package/src/create/cluster.ts +0 -64
  236. package/src/create/create-media.ts +0 -136
  237. package/src/create/make-duration-with-padding.ts +0 -15
  238. package/src/create/matroska-header.ts +0 -63
  239. package/src/create/matroska-info.ts +0 -30
  240. package/src/create/matroska-segment.ts +0 -10
  241. package/src/create/matroska-trackentry.ts +0 -325
  242. package/src/create/timescale.ts +0 -1
  243. package/src/get-audio-codec.ts +0 -270
  244. package/src/get-dimensions.ts +0 -47
  245. package/src/get-duration.ts +0 -103
  246. package/src/get-fps.ts +0 -113
  247. package/src/get-sample-aspect-ratio.ts +0 -204
  248. package/src/get-sample-positions.ts +0 -93
  249. package/src/get-tracks.ts +0 -147
  250. package/src/get-video-codec.ts +0 -117
  251. package/src/has-all-info.ts +0 -81
  252. package/src/index.ts +0 -18
  253. package/src/make-hvc1-codec-strings.ts +0 -55
  254. package/src/options.ts +0 -118
  255. package/src/parse-media.ts +0 -183
  256. package/src/parse-result.ts +0 -79
  257. package/src/parse-video.ts +0 -83
  258. package/src/parser-context.ts +0 -10
  259. package/src/parser-state.ts +0 -178
  260. package/src/readers/from-fetch.ts +0 -90
  261. package/src/readers/from-node.ts +0 -51
  262. package/src/readers/from-web-file.ts +0 -49
  263. package/src/readers/reader.ts +0 -15
  264. package/src/samples-from-moof.ts +0 -102
  265. package/src/test/aspect-ratio.test.ts +0 -42
  266. package/src/test/av1.test.ts +0 -108
  267. package/src/test/create-matroska.test.ts +0 -287
  268. package/src/test/duration.test.ts +0 -18
  269. package/src/test/keys.test.ts +0 -47
  270. package/src/test/matroska.test.ts +0 -463
  271. package/src/test/mvhd.test.ts +0 -94
  272. package/src/test/parse-esds.test.ts +0 -98
  273. package/src/test/parse-stco.test.ts +0 -61
  274. package/src/test/parse-stsc.test.ts +0 -104
  275. package/src/test/parse-stsz.test.ts +0 -57
  276. package/src/test/parse-stts.test.ts +0 -38
  277. package/src/test/parse-video.test.ts +0 -101
  278. package/src/test/parse-webm.test.ts +0 -17
  279. package/src/test/samples-from-moof.test.ts +0 -2496
  280. package/src/test/stream-local.test.ts +0 -743
  281. package/src/test/stream-remote.test.ts +0 -59
  282. package/src/test/stream-samples.test.ts +0 -181
  283. package/src/test/stsd.test.ts +0 -265
  284. package/src/test/tkhd.test.ts +0 -87
  285. package/src/traversal.ts +0 -528
  286. package/src/webcodec-sample-types.ts +0 -29
  287. package/src/writers/web-fs.ts +0 -50
  288. package/src/writers/writer.ts +0 -12
  289. package/tsconfig.json +0 -14
  290. package/tsconfig.tsbuildinfo +0 -1
@@ -1,204 +0,0 @@
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
- import {getStsdBox} from './traversal';
11
-
12
- type AspectRatio = {
13
- numerator: number;
14
- denominator: number;
15
- };
16
-
17
- export const getVideoSample = (trakBox: TrakBox): VideoSample | null => {
18
- const stsdBox = getStsdBox(trakBox);
19
-
20
- if (!stsdBox) {
21
- return null;
22
- }
23
-
24
- const videoSample = stsdBox.samples.find((s) => s.type === 'video');
25
- if (!videoSample || videoSample.type !== 'video') {
26
- return null;
27
- }
28
-
29
- return videoSample;
30
- };
31
-
32
- export const getAvccBox = (trakBox: TrakBox): AvccBox | null => {
33
- const videoSample = getVideoSample(trakBox);
34
- if (!videoSample) {
35
- return null;
36
- }
37
-
38
- const avccBox = videoSample.descriptors.find((c) => c.type === 'avcc-box');
39
-
40
- if (!avccBox || avccBox.type !== 'avcc-box') {
41
- return null;
42
- }
43
-
44
- return avccBox;
45
- };
46
-
47
- export const getAv1CBox = (trakBox: TrakBox): Av1CBox | null => {
48
- const videoSample = getVideoSample(trakBox);
49
- if (!videoSample) {
50
- return null;
51
- }
52
-
53
- const av1cBox = videoSample.descriptors.find((c) => c.type === 'av1C-box');
54
-
55
- if (!av1cBox || av1cBox.type !== 'av1C-box') {
56
- return null;
57
- }
58
-
59
- return av1cBox;
60
- };
61
-
62
- export const getPaspBox = (trakBox: TrakBox): PaspBox | null => {
63
- const videoSample = getVideoSample(trakBox);
64
- if (!videoSample) {
65
- return null;
66
- }
67
-
68
- const paspBox = videoSample.descriptors.find((c) => c.type === 'pasp-box');
69
-
70
- if (!paspBox || paspBox.type !== 'pasp-box') {
71
- return null;
72
- }
73
-
74
- return paspBox;
75
- };
76
-
77
- export const getHvccBox = (trakBox: TrakBox): HvccBox | null => {
78
- const videoSample = getVideoSample(trakBox);
79
- if (!videoSample) {
80
- return null;
81
- }
82
-
83
- const hvccBox = videoSample.descriptors.find((c) => c.type === 'hvcc-box');
84
-
85
- if (!hvccBox || hvccBox.type !== 'hvcc-box') {
86
- return null;
87
- }
88
-
89
- return hvccBox;
90
- };
91
-
92
- export const getSampleAspectRatio = (trakBox: TrakBox): AspectRatio => {
93
- const paspBox = getPaspBox(trakBox);
94
- if (!paspBox) {
95
- return {
96
- numerator: 1,
97
- denominator: 1,
98
- };
99
- }
100
-
101
- return {
102
- numerator: paspBox.hSpacing,
103
- denominator: paspBox.vSpacing,
104
- };
105
- };
106
-
107
- export const getColrBox = (
108
- videoSample: VideoSample,
109
- ): ColorParameterBox | null => {
110
- const colrBox = videoSample.descriptors.find((c) => c.type === 'colr-box');
111
-
112
- if (!colrBox || colrBox.type !== 'colr-box') {
113
- return null;
114
- }
115
-
116
- return colrBox;
117
- };
118
-
119
- export const applyTkhdBox = (
120
- aspectRatioApplied: Dimensions,
121
- tkhdBox: TkhdBox,
122
- ): {
123
- displayAspectWidth: number;
124
- displayAspectHeight: number;
125
- width: number;
126
- height: number;
127
- rotation: number;
128
- } => {
129
- if (tkhdBox === null || tkhdBox.rotation === 0) {
130
- return {
131
- displayAspectWidth: aspectRatioApplied.width,
132
- displayAspectHeight: aspectRatioApplied.height,
133
- width: aspectRatioApplied.width,
134
- height: aspectRatioApplied.height,
135
- rotation: 0,
136
- };
137
- }
138
-
139
- return {
140
- width: tkhdBox.width,
141
- height: tkhdBox.height,
142
- rotation: tkhdBox.rotation,
143
- displayAspectWidth: aspectRatioApplied.width,
144
- displayAspectHeight: aspectRatioApplied.height,
145
- };
146
- };
147
-
148
- export const applyAspectRatios = ({
149
- dimensions,
150
- sampleAspectRatio,
151
- displayAspectRatio,
152
- }: {
153
- dimensions: Dimensions;
154
- sampleAspectRatio: AspectRatio;
155
- displayAspectRatio: AspectRatio;
156
- }): Dimensions => {
157
- if (displayAspectRatio.numerator === 0) {
158
- return dimensions;
159
- }
160
-
161
- if (displayAspectRatio.denominator === 0) {
162
- return dimensions;
163
- }
164
-
165
- const newWidth = Math.round(
166
- (dimensions.width * sampleAspectRatio.numerator) /
167
- sampleAspectRatio.denominator,
168
- );
169
- const newHeight = Math.floor(
170
- newWidth / (displayAspectRatio.numerator / displayAspectRatio.denominator),
171
- );
172
-
173
- return {
174
- width: Math.floor(newWidth),
175
- height: newHeight,
176
- };
177
- };
178
-
179
- function gcd(a: number, b: number): number {
180
- return b === 0 ? a : gcd(b, a % b);
181
- }
182
-
183
- function reduceFraction(numerator: number, denominator: number) {
184
- const greatestCommonDivisor = gcd(Math.abs(numerator), Math.abs(denominator));
185
- return {
186
- numerator: numerator / greatestCommonDivisor,
187
- denominator: denominator / greatestCommonDivisor,
188
- };
189
- }
190
-
191
- export const getDisplayAspectRatio = ({
192
- sampleAspectRatio,
193
- nativeDimensions,
194
- }: {
195
- sampleAspectRatio: AspectRatio;
196
- nativeDimensions: Dimensions;
197
- }): AspectRatio => {
198
- const num = Math.round(nativeDimensions.width * sampleAspectRatio.numerator);
199
- const den = Math.round(
200
- nativeDimensions.height * sampleAspectRatio.denominator,
201
- );
202
-
203
- return reduceFraction(num, den);
204
- };
@@ -1,93 +0,0 @@
1
- import type {CttsBox} from './boxes/iso-base-media/stsd/ctts';
2
- import type {StcoBox} from './boxes/iso-base-media/stsd/stco';
3
- import type {StscBox} from './boxes/iso-base-media/stsd/stsc';
4
- import type {StssBox} from './boxes/iso-base-media/stsd/stss';
5
- import type {StszBox} from './boxes/iso-base-media/stsd/stsz';
6
- import type {SttsBox} from './boxes/iso-base-media/stsd/stts';
7
-
8
- export type SamplePosition = {
9
- offset: number;
10
- size: number;
11
- isKeyframe: boolean;
12
- dts: number;
13
- cts: number;
14
- duration: number;
15
- };
16
-
17
- export const getSamplePositions = ({
18
- stcoBox,
19
- stszBox,
20
- stscBox,
21
- stssBox,
22
- sttsBox,
23
- cttsBox,
24
- }: {
25
- stcoBox: StcoBox;
26
- stszBox: StszBox;
27
- stscBox: StscBox;
28
- stssBox: StssBox | null;
29
- sttsBox: SttsBox;
30
- cttsBox: CttsBox | null;
31
- }) => {
32
- const sttsDeltas: number[] = [];
33
- for (const distribution of sttsBox.sampleDistribution) {
34
- for (let i = 0; i < distribution.sampleCount; i++) {
35
- sttsDeltas.push(distribution.sampleDelta);
36
- }
37
- }
38
-
39
- const cttsEntries: number[] = [];
40
- for (const entry of cttsBox?.entries ?? [
41
- {sampleCount: sttsDeltas.length, sampleOffset: 0},
42
- ]) {
43
- for (let i = 0; i < entry.sampleCount; i++) {
44
- cttsEntries.push(entry.sampleOffset);
45
- }
46
- }
47
-
48
- let dts = 0;
49
-
50
- const chunks = stcoBox.entries;
51
- const samples: SamplePosition[] = [];
52
-
53
- let samplesPerChunk = 1;
54
-
55
- for (let i = 0; i < chunks.length; i++) {
56
- const hasEntry = stscBox.entries.find(
57
- (entry) => entry.firstChunk === i + 1,
58
- );
59
- if (hasEntry) {
60
- samplesPerChunk = hasEntry.samplesPerChunk;
61
- }
62
-
63
- let offsetInThisChunk = 0;
64
-
65
- for (let j = 0; j < samplesPerChunk; j++) {
66
- const size =
67
- stszBox.countType === 'fixed'
68
- ? stszBox.sampleSize
69
- : stszBox.entries[samples.length];
70
-
71
- const isKeyframe = stssBox
72
- ? stssBox.sampleNumber.includes(samples.length + 1)
73
- : true;
74
-
75
- const delta = sttsDeltas[samples.length];
76
- const ctsOffset = cttsEntries[samples.length];
77
- const cts = dts + ctsOffset;
78
-
79
- samples.push({
80
- offset: Number(chunks[i]) + offsetInThisChunk,
81
- size,
82
- isKeyframe,
83
- dts,
84
- cts,
85
- duration: delta,
86
- });
87
- dts += delta;
88
- offsetInThisChunk += size;
89
- }
90
- }
91
-
92
- return samples;
93
- };
package/src/get-tracks.ts DELETED
@@ -1,147 +0,0 @@
1
- import {makeBaseMediaTrack} from './boxes/iso-base-media/make-track';
2
- import type {MoovBox} from './boxes/iso-base-media/moov/moov';
3
- import type {TrakBox} from './boxes/iso-base-media/trak/trak';
4
- import {getTracksFromMatroska} from './boxes/webm/get-ready-tracks';
5
- import {getMainSegment} from './boxes/webm/traversal';
6
- import type {AnySegment} from './parse-result';
7
- import type {ParserState} from './parser-state';
8
- import {getMoovBox, getMvhdBox, getTracksSegment, getTraks} from './traversal';
9
-
10
- type SampleAspectRatio = {
11
- numerator: number;
12
- denominator: number;
13
- };
14
-
15
- export type VideoTrack = {
16
- type: 'video';
17
- trackId: number;
18
- description: Uint8Array | undefined;
19
- timescale: number;
20
- codec: string;
21
- sampleAspectRatio: SampleAspectRatio;
22
- width: number;
23
- height: number;
24
- displayAspectWidth: number;
25
- displayAspectHeight: number;
26
- codedWidth: number;
27
- codedHeight: number;
28
- rotation: number;
29
- trakBox: TrakBox | null;
30
- };
31
-
32
- export type AudioTrack = {
33
- type: 'audio';
34
- trackId: number;
35
- timescale: number;
36
- codec: string;
37
- numberOfChannels: number;
38
- sampleRate: number;
39
- description: Uint8Array | undefined;
40
- trakBox: TrakBox | null;
41
- };
42
-
43
- export type OtherTrack = {
44
- type: 'other';
45
- trackId: number;
46
- timescale: number;
47
- trakBox: TrakBox | null;
48
- };
49
-
50
- export type Track = VideoTrack | AudioTrack | OtherTrack;
51
-
52
- export const getNumberOfTracks = (moovBox: MoovBox): number => {
53
- const mvHdBox = getMvhdBox(moovBox);
54
- if (!mvHdBox) {
55
- return 0;
56
- }
57
-
58
- return mvHdBox.nextTrackId - 1;
59
- };
60
-
61
- export const hasTracks = (segments: AnySegment[]): boolean => {
62
- const mainSegment = getMainSegment(segments);
63
-
64
- if (mainSegment) {
65
- return getTracksSegment(mainSegment) !== null;
66
- }
67
-
68
- const moovBox = getMoovBox(segments);
69
-
70
- if (!moovBox) {
71
- return false;
72
- }
73
-
74
- const numberOfTracks = getNumberOfTracks(moovBox);
75
- const tracks = getTraks(moovBox);
76
-
77
- return tracks.length === numberOfTracks;
78
- };
79
-
80
- export const getTracks = (
81
- segments: AnySegment[],
82
- state: ParserState,
83
- ): {
84
- videoTracks: VideoTrack[];
85
- audioTracks: AudioTrack[];
86
- otherTracks: OtherTrack[];
87
- } => {
88
- const videoTracks: VideoTrack[] = [];
89
- const audioTracks: AudioTrack[] = [];
90
- const otherTracks: OtherTrack[] = [];
91
-
92
- const mainSegment = segments.find((s) => s.type === 'Segment');
93
- if (mainSegment && mainSegment.type === 'Segment') {
94
- const matroskaTracks = getTracksFromMatroska(
95
- mainSegment,
96
- state.getTimescale(),
97
- );
98
-
99
- for (const track of matroskaTracks) {
100
- if (track.type === 'video') {
101
- videoTracks.push(track);
102
- } else if (track.type === 'audio') {
103
- audioTracks.push(track);
104
- } else if (track.type === 'other') {
105
- otherTracks.push(track);
106
- }
107
- }
108
-
109
- return {
110
- videoTracks,
111
- audioTracks,
112
- otherTracks,
113
- };
114
- }
115
-
116
- const moovBox = getMoovBox(segments);
117
- if (!moovBox) {
118
- return {
119
- videoTracks,
120
- audioTracks,
121
- otherTracks,
122
- };
123
- }
124
-
125
- const tracks = getTraks(moovBox);
126
-
127
- for (const trakBox of tracks) {
128
- const track = makeBaseMediaTrack(trakBox);
129
- if (!track) {
130
- continue;
131
- }
132
-
133
- if (track.type === 'video') {
134
- videoTracks.push(track);
135
- } else if (track.type === 'audio') {
136
- audioTracks.push(track);
137
- } else if (track.type === 'other') {
138
- otherTracks.push(track);
139
- }
140
- }
141
-
142
- return {
143
- videoTracks,
144
- audioTracks,
145
- otherTracks,
146
- };
147
- };
@@ -1,117 +0,0 @@
1
- /* eslint-disable max-depth */
2
- import type {TrakBox} from './boxes/iso-base-media/trak/trak';
3
- import {parseAv1PrivateData} from './boxes/webm/av1-codec-private';
4
- import {trakBoxContainsVideo} from './get-fps';
5
- import {
6
- getAv1CBox,
7
- getAvccBox,
8
- getColrBox,
9
- getHvccBox,
10
- getVideoSample,
11
- } from './get-sample-aspect-ratio';
12
- import type {KnownVideoCodecs} from './options';
13
- import type {AnySegment} from './parse-result';
14
- import {getMoovBox, getStsdBox, getTraks} from './traversal';
15
-
16
- export const hasVideoCodec = (boxes: AnySegment[]): boolean => {
17
- try {
18
- return getVideoCodec(boxes) !== null;
19
- } catch (e) {
20
- return false;
21
- }
22
- };
23
-
24
- export const getVideoCodecString = (trakBox: TrakBox): string | null => {
25
- const videoSample = getVideoSample(trakBox);
26
- const avccBox = getAvccBox(trakBox);
27
- const hvccBox = getHvccBox(trakBox);
28
- const av1cBox = getAv1CBox(trakBox);
29
-
30
- if (!videoSample) {
31
- return null;
32
- }
33
-
34
- if (avccBox) {
35
- return `${videoSample.format}.${avccBox.configurationString}`;
36
- }
37
-
38
- if (hvccBox) {
39
- return `${videoSample.format}.${hvccBox.configurationString}`;
40
- }
41
-
42
- if (av1cBox) {
43
- const colrAtom = getColrBox(videoSample);
44
- return parseAv1PrivateData(av1cBox.privateData, colrAtom);
45
- }
46
-
47
- return videoSample.format;
48
- };
49
-
50
- export const getVideoCodec = (boxes: AnySegment[]): KnownVideoCodecs | null => {
51
- const moovBox = getMoovBox(boxes);
52
- if (moovBox) {
53
- const trakBox = getTraks(moovBox).filter((t) => trakBoxContainsVideo(t))[0];
54
- if (trakBox) {
55
- const stsdBox = getStsdBox(trakBox);
56
- if (stsdBox && stsdBox.type === 'stsd-box') {
57
- const videoSample = stsdBox.samples.find((s) => s.type === 'video');
58
- if (videoSample && videoSample.type === 'video') {
59
- if (videoSample.format === 'hvc1') {
60
- return 'h265';
61
- }
62
-
63
- if (videoSample.format === 'avc1') {
64
- return 'h264';
65
- }
66
-
67
- if (videoSample.format === 'av01') {
68
- return 'av1';
69
- }
70
-
71
- if (videoSample.format === 'ap4h') {
72
- return 'prores';
73
- }
74
- }
75
- }
76
- }
77
- }
78
-
79
- const mainSegment = boxes.find((b) => b.type === 'Segment');
80
- if (!mainSegment || mainSegment.type !== 'Segment') {
81
- return null;
82
- }
83
-
84
- const tracksSegment = mainSegment.value.find((b) => b.type === 'Tracks');
85
- if (!tracksSegment || tracksSegment.type !== 'Tracks') {
86
- return null;
87
- }
88
-
89
- for (const track of tracksSegment.value) {
90
- if (track.type === 'TrackEntry') {
91
- const trackType = track.value.find((b) => b.type === 'CodecID');
92
- if (trackType && trackType.type === 'CodecID') {
93
- if (trackType.value === 'V_VP8') {
94
- return 'vp8';
95
- }
96
-
97
- if (trackType.value === 'V_VP9') {
98
- return 'vp9';
99
- }
100
-
101
- if (trackType.value === 'V_AV1') {
102
- return 'av1';
103
- }
104
-
105
- if (trackType.value === 'V_MPEG4/ISO/AVC') {
106
- return 'h264';
107
- }
108
-
109
- if (trackType.value === 'V_MPEGH/ISO/HEVC') {
110
- return 'h265';
111
- }
112
- }
113
- }
114
- }
115
-
116
- return null;
117
- };
@@ -1,81 +0,0 @@
1
- import {hasAudioCodec} from './get-audio-codec';
2
- import {hasDimensions} from './get-dimensions';
3
- import {hasDuration} from './get-duration';
4
- import {hasFps} from './get-fps';
5
- import {hasTracks} from './get-tracks';
6
- import {hasVideoCodec} from './get-video-codec';
7
- import type {Options} from './options';
8
- import type {ParseResult} from './parse-result';
9
- import type {ParserState} from './parser-state';
10
-
11
- export const hasAllInfo = (
12
- options: Options<
13
- boolean,
14
- boolean,
15
- boolean,
16
- boolean,
17
- boolean,
18
- boolean,
19
- boolean,
20
- boolean,
21
- boolean,
22
- boolean
23
- >,
24
- parseResult: ParseResult,
25
- state: ParserState,
26
- ) => {
27
- const keys = Object.entries(options)
28
- .filter(([, value]) => value)
29
- .map(([key]) => key) as (keyof Options<
30
- true,
31
- true,
32
- true,
33
- true,
34
- true,
35
- true,
36
- true,
37
- true,
38
- true,
39
- true
40
- >)[];
41
-
42
- return keys.every((key) => {
43
- if (key === 'boxes') {
44
- return parseResult.status === 'done';
45
- }
46
-
47
- if (key === 'durationInSeconds') {
48
- return hasDuration(parseResult.segments, state);
49
- }
50
-
51
- if (
52
- key === 'dimensions' ||
53
- key === 'rotation' ||
54
- key === 'unrotatedDimensions'
55
- ) {
56
- return hasDimensions(parseResult.segments, state);
57
- }
58
-
59
- if (key === 'fps') {
60
- return hasFps(parseResult.segments) !== null;
61
- }
62
-
63
- if (key === 'videoCodec') {
64
- return hasVideoCodec(parseResult.segments);
65
- }
66
-
67
- if (key === 'audioCodec') {
68
- return hasAudioCodec(parseResult.segments);
69
- }
70
-
71
- if (key === 'tracks') {
72
- return hasTracks(parseResult.segments);
73
- }
74
-
75
- if (key === 'internalStats') {
76
- return false;
77
- }
78
-
79
- throw new Error(`Unknown key: ${key satisfies never}`);
80
- });
81
- };
package/src/index.ts DELETED
@@ -1,18 +0,0 @@
1
- import {createMedia} from './create/create-media';
2
-
3
- export {AudioTrack, OtherTrack, Track, VideoTrack} from './get-tracks';
4
- export {parseMedia} from './parse-media';
5
- export {
6
- AudioSample,
7
- OnAudioSample,
8
- OnAudioTrack,
9
- OnVideoSample,
10
- OnVideoTrack,
11
- VideoSample,
12
- } from './webcodec-sample-types';
13
-
14
- export type {MediaFn} from './create/create-media';
15
-
16
- export const MediaParserInternals = {
17
- createMedia,
18
- };
@@ -1,55 +0,0 @@
1
- import type {BufferIterator} from './buffer-iterator';
2
-
3
- export const getHvc1CodecString = (data: BufferIterator) => {
4
- const configurationVersion = data.getUint8();
5
- if (configurationVersion !== 1) {
6
- throw new Error(`Unsupported HVCC version ${configurationVersion}`);
7
- }
8
-
9
- const generalProfileSpaceTierFlagAndIdc = data.getUint8();
10
- let generalProfileCompatibility = data.getUint32();
11
- // unsigned int(2) general_profile_space;
12
- // unsigned int(1) general_tier_flag;
13
- // unsigned int(5) general_profile_idc;
14
-
15
- const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6;
16
- const generalTierFlag = generalProfileSpaceTierFlagAndIdc >> 5;
17
- const generalProfileIdc = generalProfileSpaceTierFlagAndIdc >> 0;
18
-
19
- // general_constraint_indicator_flags(48)
20
- const generalConstraintIndicator = data.getSlice(6);
21
- const generalLevelIdc = data.getUint8();
22
-
23
- let reversedGeneralProfileSpace = 0;
24
- for (let i = 0; i < 32; i++) {
25
- reversedGeneralProfileSpace |= generalProfileCompatibility & 1;
26
- if (i === 31) break;
27
-
28
- reversedGeneralProfileSpace <<= 1;
29
- generalProfileCompatibility >>= 1;
30
- }
31
-
32
- const profileSpaceChar =
33
- generalProfileSpace === 0
34
- ? ''
35
- : generalProfileSpace === 1
36
- ? 'A'
37
- : generalProfileSpace === 2
38
- ? 'B'
39
- : 'C';
40
-
41
- const generalTierChar = generalTierFlag === 0 ? 'L' : 'H';
42
-
43
- let hasByte = false;
44
-
45
- let generalConstraintString = '';
46
- for (let i = 5; i >= 0; i--) {
47
- if (generalConstraintIndicator[i] || hasByte) {
48
- generalConstraintString =
49
- generalConstraintIndicator[i].toString(16) + generalConstraintString;
50
- hasByte = true;
51
- }
52
- }
53
-
54
- return `${profileSpaceChar}${generalProfileIdc.toString(16)}.${reversedGeneralProfileSpace.toString(16)}.${generalTierChar}${generalLevelIdc}.${generalConstraintString}`;
55
- };