@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,52 +0,0 @@
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 | bigint)[];
10
- }
11
-
12
- export const parseStco = ({
13
- iterator,
14
- offset,
15
- size,
16
- mode64Bit,
17
- }: {
18
- iterator: BufferIterator;
19
- offset: number;
20
- size: number;
21
- mode64Bit: boolean;
22
- }): StcoBox => {
23
- const version = iterator.getUint8();
24
- if (version !== 0) {
25
- throw new Error(`Unsupported STSD version ${version}`);
26
- }
27
-
28
- const flags = iterator.getSlice(3);
29
- const entryCount = iterator.getUint32();
30
-
31
- const entries: (number | bigint)[] = [];
32
- for (let i = 0; i < entryCount; i++) {
33
- const bytesRemaining = size - (iterator.counter.getOffset() - offset);
34
- if (bytesRemaining < 4) {
35
- break;
36
- }
37
-
38
- entries.push(mode64Bit ? iterator.getUint64() : iterator.getUint32());
39
- }
40
-
41
- iterator.discard(size - (iterator.counter.getOffset() - offset));
42
-
43
- return {
44
- type: 'stco-box',
45
- boxSize: size,
46
- offset,
47
- version,
48
- flags: [...flags],
49
- entries,
50
- entryCount,
51
- };
52
- };
@@ -1,61 +0,0 @@
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,55 +0,0 @@
1
- import type {BufferIterator} from '../../../buffer-iterator';
2
- import type {ParserContext} from '../../../parser-context';
3
- import type {BaseBox} from '../base-type';
4
- import type {Sample} from './samples';
5
- import {parseSamples} from './samples';
6
-
7
- export interface StsdBox extends BaseBox {
8
- type: 'stsd-box';
9
- numberOfEntries: number;
10
- samples: Sample[];
11
- }
12
-
13
- export const parseStsd = async ({
14
- iterator,
15
- offset,
16
- size,
17
- options,
18
- }: {
19
- iterator: BufferIterator;
20
- offset: number;
21
- size: number;
22
- options: ParserContext;
23
- }): Promise<StsdBox> => {
24
- const version = iterator.getUint8();
25
- if (version !== 0) {
26
- throw new Error(`Unsupported STSD version ${version}`);
27
- }
28
-
29
- // flags, we discard them
30
- iterator.discard(3);
31
-
32
- const numberOfEntries = iterator.getUint32();
33
-
34
- const bytesRemainingInBox = size - (iterator.counter.getOffset() - offset);
35
-
36
- const boxes = await parseSamples({
37
- iterator,
38
- maxBytes: bytesRemainingInBox,
39
- options,
40
- });
41
-
42
- if (boxes.length !== numberOfEntries) {
43
- throw new Error(
44
- `Expected ${numberOfEntries} sample descriptions, got ${boxes.length}`,
45
- );
46
- }
47
-
48
- return {
49
- type: 'stsd-box',
50
- boxSize: size,
51
- offset,
52
- numberOfEntries,
53
- samples: boxes,
54
- };
55
- };
@@ -1,47 +0,0 @@
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
- };
@@ -1,75 +0,0 @@
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
- };
@@ -1,62 +0,0 @@
1
- import type {BufferIterator} from '../../../buffer-iterator';
2
-
3
- export interface SttsBox {
4
- type: 'stts-box';
5
- sampleDistribution: SampleDistribution[];
6
- }
7
-
8
- type SampleDistribution = {
9
- sampleCount: number;
10
- sampleDelta: number;
11
- };
12
-
13
- export const parseStts = ({
14
- data,
15
- size,
16
- fileOffset,
17
- }: {
18
- data: BufferIterator;
19
- size: number;
20
- fileOffset: number;
21
- }): SttsBox => {
22
- const initialOffset = data.counter.getOffset();
23
- const initialCounter = initialOffset - fileOffset;
24
-
25
- const version = data.getUint8();
26
- if (version !== 0) {
27
- throw new Error(`Unsupported STTS version ${version}`);
28
- }
29
-
30
- // flags, we discard them
31
- data.discard(3);
32
-
33
- // entry count
34
- const entryCount = data.getUint32();
35
-
36
- const sampleDistributions: SampleDistribution[] = [];
37
-
38
- // entries
39
- for (let i = 0; i < entryCount; i++) {
40
- const sampleCount = data.getUint32();
41
- const sampleDelta = data.getUint32();
42
-
43
- const sampleDistribution: SampleDistribution = {
44
- sampleCount,
45
- sampleDelta,
46
- };
47
- sampleDistributions.push(sampleDistribution);
48
- }
49
-
50
- const bytesUsed = data.counter.getOffset() - initialOffset + initialCounter;
51
-
52
- if (bytesUsed !== size) {
53
- throw new Error(
54
- `Expected stts box to be ${size} bytes, but was ${bytesUsed} bytes`,
55
- );
56
- }
57
-
58
- return {
59
- type: 'stts-box',
60
- sampleDistribution: sampleDistributions,
61
- };
62
- };
@@ -1,37 +0,0 @@
1
- import type {BufferIterator} from '../../buffer-iterator';
2
-
3
- export interface TfdtBox {
4
- type: 'tfdt-box';
5
- version: number;
6
- baseMediaDecodeTime: number;
7
- offset: number;
8
- }
9
-
10
- export const parseTfdt = ({
11
- iterator,
12
- size,
13
- offset,
14
- }: {
15
- iterator: BufferIterator;
16
- size: number;
17
- offset: number;
18
- }): TfdtBox => {
19
- const version = iterator.getUint8();
20
- iterator.discard(3);
21
- // Flags, discard them
22
- const num =
23
- version === 0 ? iterator.getUint32() : Number(iterator.getUint64());
24
-
25
- const bytesRemaining = size - (iterator.counter.getOffset() - offset);
26
-
27
- if (bytesRemaining !== 0) {
28
- throw new Error('expected 0 bytes ' + bytesRemaining);
29
- }
30
-
31
- return {
32
- type: 'tfdt-box',
33
- version,
34
- baseMediaDecodeTime: num,
35
- offset,
36
- };
37
- };
@@ -1,66 +0,0 @@
1
- import type {BufferIterator} from '../../buffer-iterator';
2
-
3
- export interface TfhdBox {
4
- type: 'tfhd-box';
5
- version: number;
6
- trackId: number;
7
- baseDataOffset: number;
8
- baseSampleDescriptionIndex: number;
9
- defaultSampleDuration: number;
10
- defaultSampleSize: number;
11
- defaultSampleFlags: number;
12
- }
13
-
14
- export const getTfhd = ({
15
- iterator,
16
- offset,
17
- size,
18
- }: {
19
- iterator: BufferIterator;
20
- size: number;
21
- offset: number;
22
- }): TfhdBox => {
23
- const version = iterator.getUint8();
24
- const flags = iterator.getUint24();
25
-
26
- const trackId = iterator.getUint32();
27
-
28
- const baseDataOffsetPresent = flags & 0x01;
29
- const baseDataOffset = baseDataOffsetPresent
30
- ? Number(iterator.getUint64())
31
- : 0;
32
-
33
- const baseSampleDescriptionIndexPresent = flags & 0x02;
34
- const baseSampleDescriptionIndex = baseSampleDescriptionIndexPresent
35
- ? iterator.getUint32()
36
- : 0;
37
-
38
- const defaultSampleDurationPresent = flags & 0x08;
39
- const defaultSampleDuration = defaultSampleDurationPresent
40
- ? iterator.getUint32()
41
- : 0;
42
-
43
- const defaultSampleSizePresent = flags & 0x10;
44
- const defaultSampleSize = defaultSampleSizePresent ? iterator.getUint32() : 0;
45
-
46
- const defaultSampleFlagsPresent = flags & 0x20;
47
- const defaultSampleFlags = defaultSampleFlagsPresent
48
- ? iterator.getUint32()
49
- : 0;
50
-
51
- const bytesRemaining = size - (iterator.counter.getOffset() - offset);
52
- if (bytesRemaining !== 0) {
53
- throw new Error('expected 0 bytes ' + bytesRemaining);
54
- }
55
-
56
- return {
57
- type: 'tfhd-box',
58
- version,
59
- trackId,
60
- baseDataOffset,
61
- baseSampleDescriptionIndex,
62
- defaultSampleDuration,
63
- defaultSampleSize,
64
- defaultSampleFlags,
65
- };
66
- };
@@ -1,150 +0,0 @@
1
- import type {BufferIterator} from '../../buffer-iterator';
2
- import type {BaseBox} from './base-type';
3
- import type {ThreeDMatrix} from './mvhd';
4
- import {toUnixTimestamp} from './to-date';
5
-
6
- export interface TkhdBox extends BaseBox {
7
- type: 'tkhd-box';
8
- alternateGroup: number;
9
- creationTime: number | null;
10
- duration: number;
11
- modificationTime: number | null;
12
- trackId: number;
13
- version: number;
14
- layer: number;
15
- volume: number;
16
- matrix: ThreeDMatrix;
17
- width: number;
18
- height: number;
19
- unrotatedWidth: number;
20
- unrotatedHeight: number;
21
- rotation: number;
22
- }
23
-
24
- type Matrix2x2 = readonly [number, number, number, number];
25
-
26
- function getRotationAngleFromMatrix(matrix: Matrix2x2): number {
27
- // Extract elements from the matrix
28
- const [a, b, c, d] = matrix;
29
- if (a === 0 && b === 0 && c === 0 && d === 0) {
30
- return 0;
31
- }
32
-
33
- // Check if the matrix is a valid rotation matrix
34
- if (Math.round(a * a + b * b) !== 1 || Math.round(c * c + d * d) !== 1) {
35
- throw new Error('The provided matrix is not a valid rotation matrix.');
36
- }
37
-
38
- // Calculate the angle using the atan2 function
39
- const angleRadians = Math.atan2(c, a); // atan2(sin(θ), cos(θ))
40
- const angleDegrees = angleRadians * (180 / Math.PI); // Convert radians to degrees
41
-
42
- return angleDegrees;
43
- }
44
-
45
- const applyRotation = ({
46
- matrix,
47
- width,
48
- height,
49
- }: {
50
- matrix: Matrix2x2;
51
- width: number;
52
- height: number;
53
- }) => {
54
- const newWidth = matrix[0] * width + matrix[1] * height; // 0*3840 + 1*2160
55
- const newHeight = matrix[2] * width + matrix[3] * height; // -1*3840 + 0*2160
56
-
57
- return {
58
- width: Math.abs(newWidth),
59
- height: Math.abs(newHeight),
60
- };
61
- };
62
-
63
- export const parseTkhd = ({
64
- iterator,
65
- offset,
66
- size,
67
- }: {
68
- iterator: BufferIterator;
69
- offset: number;
70
- size: number;
71
- }): TkhdBox => {
72
- const version = iterator.getUint8();
73
-
74
- // Flags, we discard them
75
- iterator.discard(3);
76
-
77
- const creationTime =
78
- version === 1 ? iterator.getUint64() : iterator.getUint32();
79
-
80
- const modificationTime =
81
- version === 1 ? iterator.getUint64() : iterator.getUint32();
82
-
83
- const trackId = iterator.getUint32();
84
-
85
- // reserved
86
- iterator.discard(4);
87
-
88
- const duration = version === 1 ? iterator.getUint64() : iterator.getUint32();
89
-
90
- // reserved 2
91
- iterator.discard(4);
92
-
93
- // reserved 3
94
- iterator.discard(4);
95
-
96
- const layer = iterator.getUint16();
97
-
98
- const alternateGroup = iterator.getUint16();
99
-
100
- const volume = iterator.getUint16();
101
-
102
- // reserved 4
103
- iterator.discard(2);
104
-
105
- const matrix = [
106
- iterator.getFixedPointSigned1616Number(),
107
- iterator.getFixedPointSigned1616Number(),
108
- iterator.getFixedPointSigned230Number(),
109
- iterator.getFixedPointSigned1616Number(),
110
- iterator.getFixedPointSigned1616Number(),
111
- iterator.getFixedPointSigned230Number(),
112
- iterator.getFixedPointSigned1616Number(),
113
- iterator.getFixedPointSigned1616Number(),
114
- iterator.getFixedPointSigned230Number(),
115
- ];
116
-
117
- const rotationMatrix = [matrix[0], matrix[1], matrix[3], matrix[4]] as const;
118
-
119
- const widthWithoutRotationApplied =
120
- iterator.getFixedPointUnsigned1616Number();
121
- const heightWithoutRotationApplied = iterator.getFixedPointSigned1616Number();
122
-
123
- const {width, height} = applyRotation({
124
- matrix: rotationMatrix,
125
- width: widthWithoutRotationApplied,
126
- height: heightWithoutRotationApplied,
127
- });
128
-
129
- const rotation = getRotationAngleFromMatrix(rotationMatrix);
130
-
131
- return {
132
- offset,
133
- boxSize: size,
134
- type: 'tkhd-box',
135
- creationTime: toUnixTimestamp(Number(creationTime)),
136
- modificationTime: toUnixTimestamp(Number(modificationTime)),
137
- trackId,
138
- duration: Number(duration),
139
- layer,
140
- alternateGroup,
141
- volume,
142
- matrix: matrix as ThreeDMatrix,
143
- width,
144
- height,
145
- version,
146
- rotation,
147
- unrotatedWidth: widthWithoutRotationApplied,
148
- unrotatedHeight: heightWithoutRotationApplied,
149
- };
150
- };
@@ -1,9 +0,0 @@
1
- export const toUnixTimestamp = (value: number): number | null => {
2
- if (value === 0) {
3
- return null;
4
- }
5
-
6
- const baseDate = new Date('1904-01-01T00:00:00Z');
7
-
8
- return Math.floor(value + baseDate.getTime() / 1000) * 1000;
9
- };
@@ -1,43 +0,0 @@
1
- import type {BufferIterator} from '../../../buffer-iterator';
2
- import type {AnySegment} from '../../../parse-result';
3
- import type {ParserContext} from '../../../parser-context';
4
- import type {BaseBox} from '../base-type';
5
- import {parseBoxes} from '../process-box';
6
-
7
- export interface TrakBox extends BaseBox {
8
- type: 'trak-box';
9
- children: AnySegment[];
10
- }
11
-
12
- export const parseTrak = async ({
13
- data,
14
- size,
15
- offsetAtStart,
16
- options,
17
- }: {
18
- data: BufferIterator;
19
- size: number;
20
- offsetAtStart: number;
21
- options: ParserContext;
22
- }): Promise<TrakBox> => {
23
- const children = await parseBoxes({
24
- iterator: data,
25
- maxBytes: size - (data.counter.getOffset() - offsetAtStart),
26
- allowIncompleteBoxes: false,
27
- initialBoxes: [],
28
- options,
29
- continueMdat: false,
30
- littleEndian: false,
31
- });
32
-
33
- if (children.status === 'incomplete') {
34
- throw new Error('Incomplete boxes are not allowed');
35
- }
36
-
37
- return {
38
- offset: offsetAtStart,
39
- boxSize: size,
40
- type: 'trak-box',
41
- children: children.segments,
42
- };
43
- };