@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,55 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ type CttsEntry = {
5
+ sampleCount: number;
6
+ sampleOffset: number;
7
+ };
8
+
9
+ export interface CttsBox extends BaseBox {
10
+ type: 'ctts-box';
11
+ version: number;
12
+ flags: number[];
13
+ entryCount: number;
14
+ entries: CttsEntry[];
15
+ }
16
+
17
+ export const parseCtts = ({
18
+ iterator,
19
+ offset,
20
+ size,
21
+ }: {
22
+ iterator: BufferIterator;
23
+ offset: number;
24
+ size: number;
25
+ }): CttsBox => {
26
+ const version = iterator.getUint8();
27
+ if (version !== 0) {
28
+ throw new Error(`Unsupported CTTS version ${version}`);
29
+ }
30
+
31
+ const flags = iterator.getSlice(3);
32
+ const entryCount = iterator.getUint32();
33
+
34
+ const entries: CttsEntry[] = [];
35
+
36
+ for (let i = 0; i < entryCount; i++) {
37
+ const sampleCount = iterator.getUint32();
38
+ const sampleOffset = iterator.getUint32();
39
+
40
+ entries.push({
41
+ sampleCount,
42
+ sampleOffset,
43
+ });
44
+ }
45
+
46
+ return {
47
+ type: 'ctts-box',
48
+ boxSize: size,
49
+ offset,
50
+ version,
51
+ flags: [...flags],
52
+ entryCount,
53
+ entries,
54
+ };
55
+ };
@@ -0,0 +1,32 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import {getHvc1CodecString} from '../../../make-hvc1-codec-strings';
3
+
4
+ export interface HvccBox {
5
+ type: 'hvcc-box';
6
+ data: Uint8Array;
7
+ configurationString: string;
8
+ }
9
+
10
+ export const parseHvcc = ({
11
+ data,
12
+ size,
13
+ offset,
14
+ }: {
15
+ data: BufferIterator;
16
+ size: number;
17
+ offset: number;
18
+ }): HvccBox => {
19
+ const raw = data.getSlice(size - 8);
20
+ data.counter.decrement(size - 8);
21
+
22
+ const constraintString = getHvc1CodecString(data);
23
+
24
+ const remaining = size - (data.counter.getOffset() - offset);
25
+ data.discard(remaining);
26
+
27
+ return {
28
+ type: 'hvcc-box',
29
+ data: raw,
30
+ configurationString: constraintString,
31
+ };
32
+ };
@@ -17,6 +17,8 @@ export const parseKeys = (data: Uint8Array, offset: number): KeysBox => {
17
17
  throw new Error(`Expected keys type of keys, got ${atom}`);
18
18
  }
19
19
 
20
+ iterator.destroy();
21
+
20
22
  return {
21
23
  type: 'keys-box',
22
24
  boxSize: data.byteLength,
@@ -1,5 +1,6 @@
1
1
  import type {BufferIterator} from '../../../buffer-iterator';
2
2
  import type {AnySegment} from '../../../parse-result';
3
+ import type {ParserContext} from '../../../parser-context';
3
4
  import type {BaseBox} from '../base-type';
4
5
  import {parseBoxes} from '../process-box';
5
6
 
@@ -10,25 +11,29 @@ export interface MebxBox extends BaseBox {
10
11
  children: AnySegment[];
11
12
  }
12
13
 
13
- export const parseMebx = ({
14
+ export const parseMebx = async ({
14
15
  iterator,
15
16
  offset,
16
17
  size,
18
+ options,
17
19
  }: {
18
20
  iterator: BufferIterator;
19
21
  offset: number;
20
22
  size: number;
21
- }): MebxBox => {
23
+ options: ParserContext;
24
+ }): Promise<MebxBox> => {
22
25
  // reserved, 6 bit
23
26
  iterator.discard(6);
24
27
 
25
28
  const dataReferenceIndex = iterator.getUint16();
26
29
 
27
- const children = parseBoxes({
30
+ const children = await parseBoxes({
28
31
  iterator,
29
32
  maxBytes: iterator.counter.getOffset() - offset,
30
33
  allowIncompleteBoxes: false,
31
34
  initialBoxes: [],
35
+ options,
36
+ continueMdat: false,
32
37
  });
33
38
 
34
39
  if (children.status === 'incomplete') {
@@ -0,0 +1,32 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ export interface PaspBox extends BaseBox {
5
+ type: 'pasp-box';
6
+ hSpacing: number;
7
+ vSpacing: number;
8
+ }
9
+
10
+ export const parsePasp = ({
11
+ iterator,
12
+ offset,
13
+ size,
14
+ }: {
15
+ iterator: BufferIterator;
16
+ offset: number;
17
+ size: number;
18
+ }): PaspBox => {
19
+ const hSpacing = iterator.getUint32();
20
+ const vSpacing = iterator.getUint32();
21
+
22
+ const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset);
23
+ iterator.discard(bytesRemainingInBox);
24
+
25
+ return {
26
+ type: 'pasp-box',
27
+ boxSize: size,
28
+ offset,
29
+ hSpacing,
30
+ vSpacing,
31
+ };
32
+ };
@@ -1,5 +1,6 @@
1
1
  import type {BufferIterator} from '../../../buffer-iterator';
2
2
  import type {AnySegment} from '../../../parse-result';
3
+ import type {ParserContext} from '../../../parser-context';
3
4
  import {parseBoxes} from '../process-box';
4
5
 
5
6
  type SampleBase = {
@@ -12,7 +13,7 @@ type SampleBase = {
12
13
  size: number;
13
14
  };
14
15
 
15
- type AudioSample = SampleBase & {
16
+ export type AudioSample = SampleBase & {
16
17
  type: 'audio';
17
18
  numberOfChannels: number;
18
19
  sampleSize: number;
@@ -26,7 +27,7 @@ type AudioSample = SampleBase & {
26
27
  children: AnySegment[];
27
28
  };
28
29
 
29
- type VideoSample = SampleBase & {
30
+ export type VideoSample = SampleBase & {
30
31
  type: 'video';
31
32
  temporalQuality: number;
32
33
  spacialQuality: number;
@@ -39,6 +40,7 @@ type VideoSample = SampleBase & {
39
40
  frameCountPerSample: number;
40
41
  depth: number;
41
42
  colorTableId: number;
43
+ descriptors: AnySegment[];
42
44
  };
43
45
 
44
46
  type UnknownSample = SampleBase & {
@@ -81,6 +83,7 @@ const videoTags = [
81
83
  'v210',
82
84
  'hvc1',
83
85
  'ap4h',
86
+ 'av01',
84
87
  ];
85
88
 
86
89
  // https://developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions
@@ -111,11 +114,13 @@ const audioTags = [
111
114
  'ac-3',
112
115
  ];
113
116
 
114
- export const processSample = ({
117
+ export const processSample = async ({
115
118
  iterator,
119
+ options,
116
120
  }: {
117
121
  iterator: BufferIterator;
118
- }): SampleAndNext => {
122
+ options: ParserContext;
123
+ }): Promise<SampleAndNext> => {
119
124
  const fileOffset = iterator.counter.getOffset();
120
125
  const bytesRemaining = iterator.bytesRemaining();
121
126
  const boxSize = iterator.getUint32();
@@ -163,15 +168,17 @@ export const processSample = ({
163
168
  const sampleSize = iterator.getUint16();
164
169
  const compressionId = iterator.getUint16();
165
170
  const packetSize = iterator.getUint16();
166
- const sampleRate = iterator.getFixedPoint1616Number();
171
+ const sampleRate = iterator.getFixedPointUnsigned1616Number();
167
172
 
168
173
  const bytesRemainingInBox =
169
174
  boxSize - (iterator.counter.getOffset() - fileOffset);
170
- const children = parseBoxes({
175
+ const children = await parseBoxes({
171
176
  iterator,
172
177
  allowIncompleteBoxes: false,
173
178
  maxBytes: bytesRemainingInBox,
174
179
  initialBoxes: [],
180
+ options,
181
+ continueMdat: false,
175
182
  });
176
183
 
177
184
  if (children.status === 'incomplete') {
@@ -207,7 +214,7 @@ export const processSample = ({
207
214
  const sampleSize = iterator.getUint16();
208
215
  const compressionId = iterator.getInt16();
209
216
  const packetSize = iterator.getUint16();
210
- const sampleRate = iterator.getFixedPoint1616Number();
217
+ const sampleRate = iterator.getFixedPointUnsigned1616Number();
211
218
 
212
219
  const samplesPerPacket = iterator.getUint32();
213
220
 
@@ -218,11 +225,13 @@ export const processSample = ({
218
225
  const bytesRemainingInBox =
219
226
  boxSize - (iterator.counter.getOffset() - fileOffset);
220
227
 
221
- const children = parseBoxes({
228
+ const children = await parseBoxes({
222
229
  iterator,
223
230
  allowIncompleteBoxes: false,
224
231
  maxBytes: bytesRemainingInBox,
225
232
  initialBoxes: [],
233
+ options,
234
+ continueMdat: false,
226
235
  });
227
236
 
228
237
  if (children.status === 'incomplete') {
@@ -261,8 +270,8 @@ export const processSample = ({
261
270
  const spacialQuality = iterator.getUint32();
262
271
  const width = iterator.getUint16();
263
272
  const height = iterator.getUint16();
264
- const horizontalResolution = iterator.getFixedPoint1616Number();
265
- const verticalResolution = iterator.getFixedPoint1616Number();
273
+ const horizontalResolution = iterator.getFixedPointUnsigned1616Number();
274
+ const verticalResolution = iterator.getFixedPointUnsigned1616Number();
266
275
  const dataSize = iterator.getUint32();
267
276
  const frameCountPerSample = iterator.getUint16();
268
277
  const compressorName = iterator.getPascalString();
@@ -272,7 +281,18 @@ export const processSample = ({
272
281
  const bytesRemainingInBox =
273
282
  boxSize - (iterator.counter.getOffset() - fileOffset);
274
283
 
275
- iterator.discard(bytesRemainingInBox);
284
+ const children = await parseBoxes({
285
+ iterator,
286
+ allowIncompleteBoxes: false,
287
+ maxBytes: bytesRemainingInBox,
288
+ initialBoxes: [],
289
+ options,
290
+ continueMdat: false,
291
+ });
292
+
293
+ if (children.status === 'incomplete') {
294
+ throw new Error('Incomplete boxes are not allowed');
295
+ }
276
296
 
277
297
  return {
278
298
  sample: {
@@ -295,6 +315,7 @@ export const processSample = ({
295
315
  compressorName,
296
316
  depth,
297
317
  colorTableId,
318
+ descriptors: children.segments,
298
319
  },
299
320
  };
300
321
  }
@@ -302,10 +323,15 @@ export const processSample = ({
302
323
  throw new Error(`Unknown sample format ${boxFormat}`);
303
324
  };
304
325
 
305
- export const parseSamples = (
306
- iterator: BufferIterator,
307
- maxBytes: number,
308
- ): Sample[] => {
326
+ export const parseSamples = async ({
327
+ iterator,
328
+ maxBytes,
329
+ options,
330
+ }: {
331
+ iterator: BufferIterator;
332
+ maxBytes: number;
333
+ options: ParserContext;
334
+ }): Promise<Sample[]> => {
309
335
  const samples: Sample[] = [];
310
336
  const initialOffset = iterator.counter.getOffset();
311
337
 
@@ -313,8 +339,9 @@ export const parseSamples = (
313
339
  iterator.bytesRemaining() > 0 &&
314
340
  iterator.counter.getOffset() - initialOffset < maxBytes
315
341
  ) {
316
- const {sample} = processSample({
342
+ const {sample} = await processSample({
317
343
  iterator,
344
+ options,
318
345
  });
319
346
 
320
347
  if (sample) {
@@ -0,0 +1,50 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ export interface StcoBox extends BaseBox {
5
+ type: 'stco-box';
6
+ version: number;
7
+ flags: number[];
8
+ entryCount: number;
9
+ entries: number[];
10
+ }
11
+
12
+ export const parseStco = ({
13
+ iterator,
14
+ offset,
15
+ size,
16
+ }: {
17
+ iterator: BufferIterator;
18
+ offset: number;
19
+ size: number;
20
+ }): StcoBox => {
21
+ const version = iterator.getUint8();
22
+ if (version !== 0) {
23
+ throw new Error(`Unsupported STSD version ${version}`);
24
+ }
25
+
26
+ const flags = iterator.getSlice(3);
27
+ const entryCount = iterator.getUint32();
28
+
29
+ const entries: number[] = [];
30
+ for (let i = 0; i < entryCount; i++) {
31
+ const bytesRemaining = size - (iterator.counter.getOffset() - offset);
32
+ if (bytesRemaining < 4) {
33
+ break;
34
+ }
35
+
36
+ entries.push(iterator.getUint32());
37
+ }
38
+
39
+ iterator.discard(size - (iterator.counter.getOffset() - offset));
40
+
41
+ return {
42
+ type: 'stco-box',
43
+ boxSize: size,
44
+ offset,
45
+ version,
46
+ flags: [...flags],
47
+ entries,
48
+ entryCount,
49
+ };
50
+ };
@@ -0,0 +1,61 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ type StscEntry = {
5
+ firstChunk: number;
6
+ samplesPerChunk: number;
7
+ };
8
+
9
+ export interface StscBox extends BaseBox {
10
+ type: 'stsc-box';
11
+ version: number;
12
+ flags: number[];
13
+ entryCount: number;
14
+ entries: StscEntry[];
15
+ }
16
+
17
+ export const parseStsc = ({
18
+ iterator,
19
+ offset,
20
+ size,
21
+ }: {
22
+ iterator: BufferIterator;
23
+ offset: number;
24
+ size: number;
25
+ }): StscBox => {
26
+ const version = iterator.getUint8();
27
+ if (version !== 0) {
28
+ throw new Error(`Unsupported STSD version ${version}`);
29
+ }
30
+
31
+ const flags = iterator.getSlice(3);
32
+ const entryCount = iterator.getUint32();
33
+
34
+ const entries: StscEntry[] = [];
35
+
36
+ for (let i = 0; i < entryCount; i++) {
37
+ const firstChunk = iterator.getUint32();
38
+ const samplesPerChunk = iterator.getUint32();
39
+ const sampleDescriptionIndex = iterator.getUint32();
40
+ if (sampleDescriptionIndex !== 1) {
41
+ throw new Error(
42
+ `Expected sampleDescriptionIndex to be 1, but got ${sampleDescriptionIndex}`,
43
+ );
44
+ }
45
+
46
+ entries.push({
47
+ firstChunk,
48
+ samplesPerChunk,
49
+ });
50
+ }
51
+
52
+ return {
53
+ type: 'stsc-box',
54
+ boxSize: size,
55
+ offset,
56
+ version,
57
+ flags: [...flags],
58
+ entryCount,
59
+ entries,
60
+ };
61
+ };
@@ -1,4 +1,5 @@
1
1
  import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {ParserContext} from '../../../parser-context';
2
3
  import type {BaseBox} from '../base-type';
3
4
  import type {Sample} from './samples';
4
5
  import {parseSamples} from './samples';
@@ -9,15 +10,17 @@ export interface StsdBox extends BaseBox {
9
10
  samples: Sample[];
10
11
  }
11
12
 
12
- export const parseStsd = ({
13
+ export const parseStsd = async ({
13
14
  iterator,
14
15
  offset,
15
16
  size,
17
+ options,
16
18
  }: {
17
19
  iterator: BufferIterator;
18
20
  offset: number;
19
21
  size: number;
20
- }): StsdBox => {
22
+ options: ParserContext;
23
+ }): Promise<StsdBox> => {
21
24
  const version = iterator.getUint8();
22
25
  if (version !== 0) {
23
26
  throw new Error(`Unsupported STSD version ${version}`);
@@ -30,7 +33,11 @@ export const parseStsd = ({
30
33
 
31
34
  const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset);
32
35
 
33
- const boxes = parseSamples(iterator, bytesRemainingInBox);
36
+ const boxes = await parseSamples({
37
+ iterator,
38
+ maxBytes: bytesRemainingInBox,
39
+ options,
40
+ });
34
41
 
35
42
  if (boxes.length !== numberOfEntries) {
36
43
  throw new Error(
@@ -0,0 +1,47 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ export interface StssBox extends BaseBox {
5
+ type: 'stss-box';
6
+ version: number;
7
+ flags: number[];
8
+ sampleNumber: number[];
9
+ }
10
+
11
+ export const parseStss = ({
12
+ iterator,
13
+ offset,
14
+ boxSize,
15
+ }: {
16
+ iterator: BufferIterator;
17
+ offset: number;
18
+ boxSize: number;
19
+ }): StssBox => {
20
+ const version = iterator.getUint8();
21
+ if (version !== 0) {
22
+ throw new Error(`Unsupported STSS version ${version}`);
23
+ }
24
+
25
+ const flags = iterator.getSlice(3);
26
+ const sampleCount = iterator.getUint32();
27
+
28
+ const sampleNumber: number[] = [];
29
+ for (let i = 0; i < sampleCount; i++) {
30
+ sampleNumber.push(iterator.getUint32());
31
+ }
32
+
33
+ const bytesRemainingInBox = boxSize - (iterator.counter.getOffset() - offset);
34
+
35
+ if (bytesRemainingInBox > 0) {
36
+ throw new Error(`Unexpected bytes remaining in box stss`);
37
+ }
38
+
39
+ return {
40
+ type: 'stss-box',
41
+ version,
42
+ flags: [...flags],
43
+ sampleNumber,
44
+ boxSize,
45
+ offset,
46
+ };
47
+ };
@@ -0,0 +1,75 @@
1
+ import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {BaseBox} from '../base-type';
3
+
4
+ type Discriminated =
5
+ | {
6
+ countType: 'fixed';
7
+ sampleSize: number;
8
+ }
9
+ | {
10
+ countType: 'variable';
11
+ entries: number[];
12
+ };
13
+
14
+ export type StszBox = BaseBox & {
15
+ type: 'stsz-box';
16
+ version: number;
17
+ flags: number[];
18
+ sampleCount: number;
19
+ } & Discriminated;
20
+
21
+ export const parseStsz = ({
22
+ iterator,
23
+ offset,
24
+ size,
25
+ }: {
26
+ iterator: BufferIterator;
27
+ offset: number;
28
+ size: number;
29
+ }): StszBox => {
30
+ const version = iterator.getUint8();
31
+ if (version !== 0) {
32
+ throw new Error(`Unsupported STSD version ${version}`);
33
+ }
34
+
35
+ const flags = iterator.getSlice(3);
36
+
37
+ const sampleSize = iterator.getUint32();
38
+ const sampleCount = iterator.getUint32();
39
+
40
+ if (sampleSize !== 0) {
41
+ return {
42
+ type: 'stsz-box',
43
+ boxSize: size,
44
+ offset,
45
+ version,
46
+ flags: [...flags],
47
+ sampleCount,
48
+ countType: 'fixed',
49
+ sampleSize,
50
+ };
51
+ }
52
+
53
+ const samples: number[] = [];
54
+ for (let i = 0; i < sampleCount; i++) {
55
+ const bytesRemaining = size - (iterator.counter.getOffset() - offset);
56
+ if (bytesRemaining < 4) {
57
+ break;
58
+ }
59
+
60
+ samples.push(iterator.getUint32());
61
+ }
62
+
63
+ iterator.discard(size - (iterator.counter.getOffset() - offset));
64
+
65
+ return {
66
+ type: 'stsz-box',
67
+ boxSize: size,
68
+ offset,
69
+ version,
70
+ flags: [...flags],
71
+ sampleCount,
72
+ countType: 'variable',
73
+ entries: samples,
74
+ };
75
+ };