@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
@@ -0,0 +1,9 @@
1
+ import type {ParserState} from './parser-state';
2
+ import type {OnAudioTrack, OnVideoTrack} from './webcodec-sample-types';
3
+
4
+ export type ParserContext = {
5
+ onAudioTrack: OnAudioTrack | null;
6
+ onVideoTrack: OnVideoTrack | null;
7
+ canSkipVideoData: boolean;
8
+ parserState: ParserState;
9
+ };
@@ -0,0 +1,151 @@
1
+ import type {OnTrackEntrySegment} from './boxes/webm/segments';
2
+ import type {CodecSegment} from './boxes/webm/segments/track-entry';
3
+ import {getTrackCodec} from './boxes/webm/traversal';
4
+ import {getTrackId} from './traversal';
5
+ import type {
6
+ AudioSample,
7
+ OnAudioSample,
8
+ OnVideoSample,
9
+ VideoSample,
10
+ } from './webcodec-sample-types';
11
+
12
+ export type InternalStats = {
13
+ samplesThatHadToBeQueued: number;
14
+ };
15
+
16
+ export const makeParserState = ({
17
+ hasAudioCallbacks,
18
+ hasVideoCallbacks,
19
+ }: {
20
+ hasAudioCallbacks: boolean;
21
+ hasVideoCallbacks: boolean;
22
+ }) => {
23
+ const trackEntries: Record<number, CodecSegment> = {};
24
+
25
+ const onTrackEntrySegment: OnTrackEntrySegment = (trackEntry) => {
26
+ const trackId = getTrackId(trackEntry);
27
+ if (!trackId) {
28
+ throw new Error('Expected track id');
29
+ }
30
+
31
+ if (trackEntries[trackId]) {
32
+ return;
33
+ }
34
+
35
+ const codec = getTrackCodec(trackEntry);
36
+ if (!codec) {
37
+ throw new Error('Expected codec');
38
+ }
39
+
40
+ trackEntries[trackId] = codec;
41
+ };
42
+
43
+ const videoSampleCallbacks: Record<number, OnVideoSample> = {};
44
+ const audioSampleCallbacks: Record<number, OnAudioSample> = {};
45
+
46
+ let samplesThatHadToBeQueued = 0;
47
+
48
+ const queuedAudioSamples: Record<number, AudioSample[]> = {};
49
+ const queuedVideoSamples: Record<number, VideoSample[]> = {};
50
+
51
+ const declinedTrackNumbers: number[] = [];
52
+
53
+ let timescale: number | null = null;
54
+
55
+ const getTimescale = () => {
56
+ if (timescale === null) {
57
+ throw new Error('Timescale not set');
58
+ }
59
+
60
+ return timescale;
61
+ };
62
+
63
+ const setTimescale = (newTimescale: number) => {
64
+ timescale = newTimescale;
65
+ };
66
+
67
+ return {
68
+ onTrackEntrySegment,
69
+ getTrackInfoByNumber: (id: number) => trackEntries[id],
70
+ registerVideoSampleCallback: async (
71
+ id: number,
72
+ callback: OnVideoSample | null,
73
+ ) => {
74
+ if (callback === null) {
75
+ delete videoSampleCallbacks[id];
76
+ declinedTrackNumbers.push(id);
77
+ return;
78
+ }
79
+
80
+ videoSampleCallbacks[id] = callback;
81
+
82
+ for (const queued of queuedVideoSamples[id] ?? []) {
83
+ await callback(queued);
84
+ }
85
+
86
+ queuedVideoSamples[id] = [];
87
+ },
88
+ registerAudioSampleCallback: async (
89
+ id: number,
90
+ callback: OnAudioSample | null,
91
+ ) => {
92
+ if (callback === null) {
93
+ delete audioSampleCallbacks[id];
94
+ declinedTrackNumbers.push(id);
95
+ return;
96
+ }
97
+
98
+ audioSampleCallbacks[id] = callback;
99
+ for (const queued of queuedAudioSamples[id] ?? []) {
100
+ await callback(queued);
101
+ }
102
+
103
+ queuedAudioSamples[id] = [];
104
+ },
105
+ onAudioSample: async (trackId: number, audioSample: AudioSample) => {
106
+ const callback = audioSampleCallbacks[trackId];
107
+ if (callback) {
108
+ await callback(audioSample);
109
+ } else {
110
+ if (declinedTrackNumbers.includes(trackId)) {
111
+ return;
112
+ }
113
+
114
+ if (!hasAudioCallbacks) {
115
+ return;
116
+ }
117
+
118
+ queuedAudioSamples[trackId] ??= [];
119
+ queuedAudioSamples[trackId].push(audioSample);
120
+ samplesThatHadToBeQueued++;
121
+ }
122
+ },
123
+ onVideoSample: async (trackId: number, videoSample: VideoSample) => {
124
+ const callback = videoSampleCallbacks[trackId];
125
+ if (callback) {
126
+ await callback(videoSample);
127
+ } else {
128
+ if (declinedTrackNumbers.includes(trackId)) {
129
+ return;
130
+ }
131
+
132
+ if (!hasVideoCallbacks) {
133
+ return;
134
+ }
135
+
136
+ queuedVideoSamples[trackId] ??= [];
137
+ queuedVideoSamples[trackId].push(videoSample);
138
+ samplesThatHadToBeQueued++;
139
+ }
140
+ },
141
+ getInternalStats: () => {
142
+ return {
143
+ samplesThatHadToBeQueued,
144
+ };
145
+ },
146
+ getTimescale,
147
+ setTimescale,
148
+ };
149
+ };
150
+
151
+ export type ParserState = ReturnType<typeof makeParserState>;
package/src/reader.ts CHANGED
@@ -3,10 +3,10 @@ type ReadResult = {
3
3
  contentLength: number | null;
4
4
  };
5
5
  type ReadContent = (
6
- src: string,
6
+ src: string | File,
7
7
  range: [number, number] | number | null,
8
8
  ) => Promise<ReadResult>;
9
- type GetLength = (src: string) => Promise<number>;
9
+ type GetLength = (src: string | File) => Promise<number>;
10
10
 
11
11
  export type ReaderInterface = {
12
12
  read: ReadContent;
@@ -0,0 +1,42 @@
1
+ import {expect, test} from 'bun:test';
2
+ import {
3
+ applyAspectRatios,
4
+ getDisplayAspectRatio,
5
+ } from '../get-sample-aspect-ratio';
6
+
7
+ test('Should calculate sample aspect ratio', () => {
8
+ const displayAspectRatio = getDisplayAspectRatio({
9
+ sampleAspectRatio: {
10
+ denominator: 177,
11
+ numerator: 56,
12
+ },
13
+ nativeDimensions: {
14
+ width: 1280,
15
+ height: 720,
16
+ },
17
+ });
18
+
19
+ expect(displayAspectRatio).toEqual({
20
+ numerator: 896,
21
+ denominator: 1593,
22
+ });
23
+
24
+ const applied = applyAspectRatios({
25
+ dimensions: {
26
+ width: 1280,
27
+ height: 720,
28
+ },
29
+ sampleAspectRatio: {
30
+ numerator: 56,
31
+ denominator: 177,
32
+ },
33
+ displayAspectRatio: {
34
+ numerator: 896,
35
+ denominator: 1593,
36
+ },
37
+ });
38
+ expect(applied).toEqual({
39
+ width: 405,
40
+ height: 720,
41
+ });
42
+ });
@@ -0,0 +1,108 @@
1
+ import {RenderInternals} from '@remotion/renderer';
2
+ import {expect, test} from 'bun:test';
3
+ import {nodeReader} from '../from-node';
4
+ import {trakBoxContainsVideo} from '../get-fps';
5
+ import {getAv1CBox} from '../get-sample-aspect-ratio';
6
+ import {parseMedia} from '../parse-media';
7
+ import {getMoovBox, getTraks} from '../traversal';
8
+
9
+ test('AV1 in MP4', async () => {
10
+ const parsed = await parseMedia({
11
+ src: RenderInternals.exampleVideos.av1mp4,
12
+ fields: {
13
+ durationInSeconds: true,
14
+ fps: true,
15
+ videoCodec: true,
16
+ tracks: true,
17
+ audioCodec: true,
18
+ dimensions: true,
19
+ rotation: true,
20
+ boxes: true,
21
+ },
22
+ reader: nodeReader,
23
+ });
24
+
25
+ const moovBox = getMoovBox(parsed.boxes);
26
+ if (!moovBox) {
27
+ throw new Error('No moov box');
28
+ }
29
+
30
+ const traks = getTraks(moovBox).filter((t) => trakBoxContainsVideo(t))[0];
31
+ const avc1Box = getAv1CBox(traks);
32
+ expect(avc1Box).toEqual({
33
+ type: 'av1C-box',
34
+ privateData: new Uint8Array([
35
+ 129, 8, 12, 0, 10, 11, 0, 0, 0, 66, 171, 191, 195, 119, 111, 228, 1,
36
+ ]),
37
+ });
38
+ expect(avc1Box).toBeTruthy();
39
+
40
+ expect(parsed.durationInSeconds).toBe(10);
41
+ expect(parsed.fps).toBe(30);
42
+ expect(parsed.videoCodec).toBe('av1');
43
+ expect(parsed.videoTracks[0].codec).toEqual('av01.0.08M.08');
44
+ // This is true, there are no audio tracks
45
+ expect(parsed.audioTracks).toEqual([]);
46
+ expect(parsed.audioCodec).toEqual(null);
47
+ expect(parsed.dimensions).toEqual({
48
+ width: 1920,
49
+ height: 1080,
50
+ });
51
+ expect(parsed.rotation).toBe(0);
52
+ });
53
+
54
+ test('AV1 in MP4 with colr atom', async () => {
55
+ let tracks = 0;
56
+ let samples = 0;
57
+
58
+ const parsed = await parseMedia({
59
+ src: RenderInternals.exampleVideos.av1mp4WithColr,
60
+ fields: {
61
+ durationInSeconds: true,
62
+ fps: true,
63
+ videoCodec: true,
64
+ tracks: true,
65
+ audioCodec: true,
66
+ dimensions: true,
67
+ rotation: true,
68
+ boxes: true,
69
+ },
70
+ reader: nodeReader,
71
+ onVideoTrack: () => {
72
+ tracks++;
73
+ return () => {
74
+ samples++;
75
+ };
76
+ },
77
+ });
78
+
79
+ const moovBox = getMoovBox(parsed.boxes);
80
+ if (!moovBox) {
81
+ throw new Error('No moov box');
82
+ }
83
+
84
+ const traks = getTraks(moovBox).filter((t) => trakBoxContainsVideo(t))[0];
85
+ const avc1Box = getAv1CBox(traks);
86
+ expect(avc1Box).toEqual({
87
+ type: 'av1C-box',
88
+ privateData: new Uint8Array([
89
+ 129, 8, 12, 0, 10, 14, 0, 0, 0, 66, 171, 191, 195, 118, 0, 8, 8, 8, 8, 32,
90
+ ]),
91
+ });
92
+ expect(avc1Box).toBeTruthy();
93
+
94
+ expect(parsed.durationInSeconds).toBe(1);
95
+ expect(parsed.fps).toBe(25);
96
+ expect(parsed.videoCodec).toBe('av1');
97
+ expect(parsed.videoTracks[0].codec).toEqual('av01.0.08M.08');
98
+ // This is true, there are no audio tracks
99
+ expect(parsed.audioTracks).toEqual([]);
100
+ expect(parsed.audioCodec).toEqual(null);
101
+ expect(parsed.dimensions).toEqual({
102
+ width: 1920,
103
+ height: 1080,
104
+ });
105
+ expect(parsed.rotation).toBe(0);
106
+ expect(tracks).toBe(1);
107
+ expect(samples).toBe(25);
108
+ });
@@ -4,31 +4,15 @@ import {nodeReader} from '../from-node';
4
4
  import {parseMedia} from '../parse-media';
5
5
 
6
6
  test('Should get duration of video', async () => {
7
- const parsed = await parseMedia(
8
- RenderInternals.exampleVideos.framer24fps,
9
- {
7
+ const parsed = await parseMedia({
8
+ src: RenderInternals.exampleVideos.framer24fps,
9
+ fields: {
10
10
  durationInSeconds: true,
11
11
  dimensions: true,
12
12
  },
13
- nodeReader,
14
- );
13
+ reader: nodeReader,
14
+ });
15
15
 
16
16
  expect(parsed.durationInSeconds).toBe(4.167);
17
17
  expect(parsed.dimensions).toEqual({width: 1080, height: 1080});
18
18
  });
19
-
20
- test('Should get duration of HEVC video', async () => {
21
- const parsed = await parseMedia(
22
- RenderInternals.exampleVideos.iphonehevc,
23
- {durationInSeconds: true, dimensions: true, fps: true},
24
- nodeReader,
25
- );
26
-
27
- expect(parsed.durationInSeconds).toBe(3.4);
28
- // TODO: Should apply rotation matrix to get the correct dimensions
29
- expect(parsed.dimensions).toEqual({
30
- width: 1920,
31
- height: 1080,
32
- });
33
- expect(parsed.fps).toEqual(30);
34
- });