@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
@@ -1,4 +1,5 @@
1
1
  import type {BufferIterator} from '../../../buffer-iterator';
2
+ import type {ParserContext} from '../../../parser-context';
2
3
  import type {MatroskaSegment} from '../segments';
3
4
  import {expectChildren} from './parse-children';
4
5
 
@@ -7,16 +8,25 @@ export type TracksSegment = {
7
8
  children: MatroskaSegment[];
8
9
  };
9
10
 
10
- export const parseTracksSegment = (iterator: BufferIterator): TracksSegment => {
11
- const offset = iterator.counter.getOffset();
11
+ export const parseTracksSegment = async (
12
+ iterator: BufferIterator,
13
+ length: number,
14
+ parserContext: ParserContext,
15
+ ): Promise<TracksSegment> => {
16
+ const children = await expectChildren({
17
+ iterator,
18
+ length,
19
+ initialChildren: [],
20
+ wrap: null,
21
+ parserContext,
22
+ });
12
23
 
13
- const length = iterator.getVint();
24
+ if (children.status === 'incomplete') {
25
+ throw new Error('Incomplete children');
26
+ }
14
27
 
15
28
  return {
16
29
  type: 'tracks-segment',
17
- children: expectChildren(
18
- iterator,
19
- length - (iterator.counter.getOffset() - offset),
20
- ),
30
+ children: children.segments as MatroskaSegment[],
21
31
  };
22
32
  };
@@ -5,8 +5,10 @@ export type VoidSegment = {
5
5
  length: number;
6
6
  };
7
7
 
8
- export const parseVoidSegment = (iterator: BufferIterator): VoidSegment => {
9
- const length = iterator.getVint();
8
+ export const parseVoidSegment = (
9
+ iterator: BufferIterator,
10
+ length: number,
11
+ ): VoidSegment => {
10
12
  iterator.discard(length);
11
13
 
12
14
  return {
@@ -7,8 +7,8 @@ export type WritingAppSegment = {
7
7
 
8
8
  export const parseWritingSegment = (
9
9
  iterator: BufferIterator,
10
+ length: number,
10
11
  ): WritingAppSegment => {
11
- const length = iterator.getVint();
12
12
  const value = iterator.getByteString(length);
13
13
 
14
14
  return {
@@ -1,12 +1,22 @@
1
+ import {registerTrack} from '../../add-new-matroska-tracks';
1
2
  import type {BufferIterator} from '../../buffer-iterator';
3
+ import type {ParseResult} from '../../parse-result';
4
+ import type {ParserContext} from '../../parser-context';
5
+ import {getTrack} from './get-track';
6
+ import {matroskaElements} from './segments/all-segments';
2
7
  import type {DurationSegment} from './segments/duration';
3
8
  import {parseDurationSegment} from './segments/duration';
4
9
  import type {InfoSegment} from './segments/info';
5
10
  import {parseInfoSegment} from './segments/info';
6
- import type {MainSegment} from './segments/main';
7
- import {parseMainSegment} from './segments/main';
11
+ import {type MainSegment} from './segments/main';
8
12
  import {parseMuxingSegment, type MuxingAppSegment} from './segments/muxing';
9
- import {parseSeekSegment, type SeekSegment} from './segments/seek';
13
+ import {expectChildren} from './segments/parse-children';
14
+ import type {SeekIdSegment} from './segments/seek';
15
+ import {
16
+ parseSeekIdSegment,
17
+ parseSeekSegment,
18
+ type SeekSegment,
19
+ } from './segments/seek';
10
20
  import type {SeekHeadSegment} from './segments/seek-head';
11
21
  import {parseSeekHeadSegment} from './segments/seek-head';
12
22
  import {
@@ -17,18 +27,31 @@ import type {TimestampScaleSegment} from './segments/timestamp-scale';
17
27
  import {parseTimestampScaleSegment} from './segments/timestamp-scale';
18
28
  import type {
19
29
  AlphaModeSegment,
30
+ AudioSegment,
31
+ BitDepthSegment,
32
+ BlockElement,
33
+ BlockGroupSegment,
34
+ ChannelsSegment,
35
+ ClusterSegment,
20
36
  CodecPrivateSegment,
21
37
  CodecSegment,
22
38
  ColorSegment,
23
39
  Crc32Segment,
24
40
  DefaultDurationSegment,
25
41
  DefaultFlagSegment,
42
+ DisplayHeightSegment,
43
+ DisplayWidthSegment,
26
44
  FlagLacingSegment,
27
45
  HeightSegment,
28
46
  InterlacedSegment,
29
47
  LanguageSegment,
30
48
  MaxBlockAdditionId,
49
+ SamplingFrequencySegment,
31
50
  SegmentUUIDSegment,
51
+ SimpleBlockSegment,
52
+ TagSegment,
53
+ TagsSegment,
54
+ TimestampSegment,
32
55
  TitleSegment,
33
56
  TrackEntrySegment,
34
57
  TrackNumberSegment,
@@ -39,18 +62,30 @@ import type {
39
62
  } from './segments/track-entry';
40
63
  import {
41
64
  parseAlphaModeSegment,
65
+ parseAudioSegment,
66
+ parseBitDepthSegment,
67
+ parseBlockElementSegment,
68
+ parseBlockGroupSegment,
69
+ parseChannelsSegment,
42
70
  parseCodecPrivateSegment,
43
71
  parseCodecSegment,
44
72
  parseColorSegment,
45
73
  parseCrc32Segment,
46
74
  parseDefaultDurationSegment,
47
75
  parseDefaultFlagSegment,
76
+ parseDisplayHeightSegment,
77
+ parseDisplayWidthSegment,
48
78
  parseFlagLacing,
49
79
  parseHeightSegment,
50
80
  parseInterlacedSegment,
51
81
  parseLanguageSegment,
52
82
  parseMaxBlockAdditionId,
83
+ parseSamplingFrequencySegment,
53
84
  parseSegmentUUIDSegment,
85
+ parseSimpleBlockSegment,
86
+ parseTagSegment,
87
+ parseTagsSegment,
88
+ parseTimestampSegment,
54
89
  parseTitleSegment,
55
90
  parseTrackEntry,
56
91
  parseTrackNumber,
@@ -92,6 +127,8 @@ export type MatroskaSegment =
92
127
  | VideoSegment
93
128
  | WidthSegment
94
129
  | HeightSegment
130
+ | DisplayWidthSegment
131
+ | DisplayHeightSegment
95
132
  | AlphaModeSegment
96
133
  | MaxBlockAdditionId
97
134
  | ColorSegment
@@ -100,10 +137,37 @@ export type MatroskaSegment =
100
137
  | CodecPrivateSegment
101
138
  | Crc32Segment
102
139
  | SegmentUUIDSegment
103
- | DefaultFlagSegment;
140
+ | DefaultFlagSegment
141
+ | TagsSegment
142
+ | TagSegment
143
+ | ClusterSegment
144
+ | TimestampSegment
145
+ | SimpleBlockSegment
146
+ | BlockGroupSegment
147
+ | BlockElement
148
+ | SeekIdSegment
149
+ | AudioSegment
150
+ | SamplingFrequencySegment
151
+ | ChannelsSegment
152
+ | BitDepthSegment;
153
+
154
+ export type OnTrackEntrySegment = (trackEntry: TrackEntrySegment) => void;
155
+
156
+ const parseSegment = async ({
157
+ segmentId,
158
+ iterator,
159
+ length,
160
+ parserContext,
161
+ }: {
162
+ segmentId: string;
163
+ iterator: BufferIterator;
164
+ length: number;
165
+ parserContext: ParserContext;
166
+ }): Promise<Promise<MatroskaSegment> | MatroskaSegment> => {
167
+ if (length === 0) {
168
+ throw new Error(`Expected length of ${segmentId} to be greater than 0`);
169
+ }
104
170
 
105
- export const expectSegment = (iterator: BufferIterator): MatroskaSegment => {
106
- const segmentId = iterator.getMatroskaSegmentId();
107
171
  if (segmentId === '0x') {
108
172
  return {
109
173
  type: 'unknown-segment',
@@ -111,131 +175,210 @@ export const expectSegment = (iterator: BufferIterator): MatroskaSegment => {
111
175
  };
112
176
  }
113
177
 
114
- if (segmentId === '0x18538067') {
115
- return parseMainSegment(iterator);
116
- }
178
+ // Log this to debug
179
+ /*
180
+ console.log(
181
+ 'segmentId',
182
+ segmentId,
183
+ getSegmentName(segmentId),
184
+ iterator.counter.getOffset(),
185
+ );
186
+ */
117
187
 
118
188
  if (segmentId === '0x114d9b74') {
119
- return parseSeekHeadSegment(iterator);
189
+ return parseSeekHeadSegment(iterator, length, parserContext);
190
+ }
191
+
192
+ if (segmentId === '0x53ab') {
193
+ return parseSeekIdSegment(iterator);
120
194
  }
121
195
 
122
196
  if (segmentId === '0x4dbb') {
123
- return parseSeekSegment(iterator);
197
+ return parseSeekSegment(iterator, length, parserContext);
124
198
  }
125
199
 
126
200
  if (segmentId === '0x53ac') {
127
- return parseSeekPositionSegment(iterator);
201
+ return parseSeekPositionSegment(iterator, length);
128
202
  }
129
203
 
130
204
  if (segmentId === '0xec') {
131
- return parseVoidSegment(iterator);
205
+ return parseVoidSegment(iterator, length);
132
206
  }
133
207
 
134
208
  if (segmentId === '0x1549a966') {
135
- return parseInfoSegment(iterator);
209
+ return parseInfoSegment(iterator, length, parserContext);
136
210
  }
137
211
 
138
- if (segmentId === '0x2ad7b183') {
139
- return parseTimestampScaleSegment(iterator);
212
+ if (segmentId === matroskaElements.TimestampScale) {
213
+ const timestampScale = parseTimestampScaleSegment(iterator);
214
+ parserContext.parserState.setTimescale(timestampScale.timestampScale);
215
+ return timestampScale;
140
216
  }
141
217
 
142
218
  if (segmentId === '0x4d80') {
143
- return parseMuxingSegment(iterator);
219
+ return parseMuxingSegment(iterator, length);
144
220
  }
145
221
 
146
222
  if (segmentId === '0x5741') {
147
- return parseWritingSegment(iterator);
223
+ return parseWritingSegment(iterator, length);
148
224
  }
149
225
 
150
226
  if (segmentId === '0x4489') {
151
- return parseDurationSegment(iterator);
227
+ return parseDurationSegment(iterator, length);
152
228
  }
153
229
 
154
230
  if (segmentId === '0x1654ae6b') {
155
- return parseTracksSegment(iterator);
231
+ return parseTracksSegment(iterator, length, parserContext);
156
232
  }
157
233
 
158
- if (segmentId === '0xae') {
159
- return parseTrackEntry(iterator);
234
+ if (segmentId === matroskaElements.TrackEntry) {
235
+ const trackEntry = await parseTrackEntry(iterator, length, parserContext);
236
+
237
+ parserContext.parserState.onTrackEntrySegment(trackEntry);
238
+
239
+ const track = getTrack({
240
+ track: trackEntry,
241
+ timescale: parserContext.parserState.getTimescale(),
242
+ });
243
+
244
+ if (track) {
245
+ await registerTrack({
246
+ state: parserContext.parserState,
247
+ options: parserContext,
248
+ track,
249
+ });
250
+ }
251
+
252
+ return trackEntry;
160
253
  }
161
254
 
162
255
  if (segmentId === '0xd7') {
163
- return parseTrackNumber(iterator);
256
+ return parseTrackNumber(iterator, length);
164
257
  }
165
258
 
166
259
  if (segmentId === '0x73c5') {
167
- return parseTrackUID(iterator);
260
+ return parseTrackUID(iterator, length);
168
261
  }
169
262
 
170
263
  if (segmentId === '0x9c') {
171
- return parseFlagLacing(iterator);
264
+ return parseFlagLacing(iterator, length);
172
265
  }
173
266
 
174
267
  if (segmentId === '0x22b59c') {
175
- return parseLanguageSegment(iterator);
268
+ return parseLanguageSegment(iterator, length);
176
269
  }
177
270
 
178
271
  if (segmentId === '0x86') {
179
- return parseCodecSegment(iterator);
272
+ return parseCodecSegment(iterator, length);
180
273
  }
181
274
 
182
275
  if (segmentId === '0x83') {
183
- return parseTrackTypeSegment(iterator);
276
+ return parseTrackTypeSegment(iterator, length);
184
277
  }
185
278
 
186
279
  if (segmentId === '0x55ee') {
187
- return parseMaxBlockAdditionId(iterator);
280
+ return parseMaxBlockAdditionId(iterator, length);
188
281
  }
189
282
 
190
283
  if (segmentId === '0x55b0') {
191
- return parseColorSegment(iterator);
284
+ return parseColorSegment(iterator, length);
192
285
  }
193
286
 
194
287
  if (segmentId === '0x23e383') {
195
- return parseDefaultDurationSegment(iterator);
288
+ return parseDefaultDurationSegment(iterator, length);
196
289
  }
197
290
 
198
291
  if (segmentId === '0xe0') {
199
- return parseVideoSegment(iterator);
292
+ return parseVideoSegment(iterator, length, parserContext);
293
+ }
294
+
295
+ if (segmentId === '0xe1') {
296
+ return parseAudioSegment(iterator, length, parserContext);
200
297
  }
201
298
 
202
299
  if (segmentId === '0xb0') {
203
- return parseWidthSegment(iterator);
300
+ return parseWidthSegment(iterator, length);
204
301
  }
205
302
 
206
303
  if (segmentId === '0xba') {
207
- return parseHeightSegment(iterator);
304
+ return parseHeightSegment(iterator, length);
305
+ }
306
+
307
+ if (segmentId === matroskaElements.DisplayWidth) {
308
+ return parseDisplayWidthSegment(iterator, length);
309
+ }
310
+
311
+ if (segmentId === matroskaElements.DisplayHeight) {
312
+ return parseDisplayHeightSegment(iterator, length);
208
313
  }
209
314
 
210
315
  if (segmentId === '0x9a') {
211
- return parseInterlacedSegment(iterator);
316
+ return parseInterlacedSegment(iterator, length);
212
317
  }
213
318
 
214
319
  if (segmentId === '0x53c0') {
215
- return parseAlphaModeSegment(iterator);
320
+ return parseAlphaModeSegment(iterator, length);
216
321
  }
217
322
 
218
323
  if (segmentId === '0x63a2') {
219
- return parseCodecPrivateSegment(iterator);
324
+ return parseCodecPrivateSegment(iterator, length);
220
325
  }
221
326
 
222
327
  if (segmentId === '0x7ba9') {
223
- return parseTitleSegment(iterator);
328
+ return parseTitleSegment(iterator, length);
224
329
  }
225
330
 
226
331
  if (segmentId === '0xbf') {
227
- return parseCrc32Segment(iterator);
332
+ return parseCrc32Segment(iterator, length);
228
333
  }
229
334
 
230
335
  if (segmentId === '0x73a4') {
231
- return parseSegmentUUIDSegment(iterator);
336
+ return parseSegmentUUIDSegment(iterator, length);
232
337
  }
233
338
 
234
339
  if (segmentId === '0x88') {
235
- return parseDefaultFlagSegment(iterator);
340
+ return parseDefaultFlagSegment(iterator, length);
236
341
  }
237
342
 
238
- const length = iterator.getVint();
343
+ if (segmentId === '0x1254c367') {
344
+ return parseTagsSegment(iterator, length, parserContext);
345
+ }
346
+
347
+ if (segmentId === '0x7373') {
348
+ return parseTagSegment(iterator, length);
349
+ }
350
+
351
+ if (segmentId === matroskaElements.SamplingFrequency) {
352
+ return parseSamplingFrequencySegment(iterator, length);
353
+ }
354
+
355
+ if (segmentId === matroskaElements.Channels) {
356
+ return parseChannelsSegment(iterator, length);
357
+ }
358
+
359
+ if (segmentId === matroskaElements.BitDepth) {
360
+ return parseBitDepthSegment(iterator, length);
361
+ }
362
+
363
+ if (segmentId === '0xe7') {
364
+ return parseTimestampSegment(iterator, length);
365
+ }
366
+
367
+ if (segmentId === '0xa3') {
368
+ return parseSimpleBlockSegment({
369
+ iterator,
370
+ length,
371
+ parserContext,
372
+ });
373
+ }
374
+
375
+ if (segmentId === '0xa0') {
376
+ return parseBlockGroupSegment(iterator, length, parserContext);
377
+ }
378
+
379
+ if (segmentId === '0xa1') {
380
+ return parseBlockElementSegment(iterator, length);
381
+ }
239
382
 
240
383
  const bytesRemaining = iterator.byteLength() - iterator.counter.getOffset();
241
384
  const toDiscard = Math.min(
@@ -246,3 +389,84 @@ export const expectSegment = (iterator: BufferIterator): MatroskaSegment => {
246
389
  const child = parseUnknownSegment(iterator, segmentId, toDiscard);
247
390
  return child;
248
391
  };
392
+
393
+ export const expectSegment = async (
394
+ iterator: BufferIterator,
395
+ parserContext: ParserContext,
396
+ ): Promise<ParseResult> => {
397
+ const bytesRemaining_ = iterator.bytesRemaining();
398
+ if (bytesRemaining_ === 0) {
399
+ return {
400
+ status: 'incomplete',
401
+ segments: [],
402
+ continueParsing: () => {
403
+ return Promise.resolve(expectSegment(iterator, parserContext));
404
+ },
405
+ skipTo: null,
406
+ };
407
+ }
408
+
409
+ const offset = iterator.counter.getOffset();
410
+ const segmentId = iterator.getMatroskaSegmentId();
411
+ const length = iterator.getVint();
412
+ const bytesRemainingNow =
413
+ iterator.byteLength() - iterator.counter.getOffset();
414
+
415
+ if (segmentId === '0x18538067' || segmentId === '0x1f43b675') {
416
+ const main = await expectChildren({
417
+ iterator,
418
+ length,
419
+ initialChildren: [],
420
+ wrap:
421
+ segmentId === '0x18538067'
422
+ ? (s) => ({
423
+ type: 'main-segment',
424
+ children: s,
425
+ })
426
+ : (s) => ({
427
+ type: 'cluster-segment',
428
+ children: s,
429
+ }),
430
+ parserContext,
431
+ });
432
+
433
+ if (main.status === 'incomplete') {
434
+ return {
435
+ status: 'incomplete',
436
+ segments: main.segments,
437
+ skipTo: null,
438
+ continueParsing: main.continueParsing,
439
+ };
440
+ }
441
+
442
+ return {
443
+ status: 'done',
444
+ segments: main.segments,
445
+ };
446
+ }
447
+
448
+ if (bytesRemainingNow < length) {
449
+ const bytesRead = iterator.counter.getOffset() - offset;
450
+ iterator.counter.decrement(bytesRead);
451
+ return {
452
+ status: 'incomplete',
453
+ segments: [],
454
+ continueParsing: () => {
455
+ return Promise.resolve(expectSegment(iterator, parserContext));
456
+ },
457
+ skipTo: null,
458
+ };
459
+ }
460
+
461
+ const segment = await parseSegment({
462
+ segmentId,
463
+ iterator,
464
+ length,
465
+ parserContext,
466
+ });
467
+
468
+ return {
469
+ status: 'done',
470
+ segments: [segment],
471
+ };
472
+ };
@@ -0,0 +1,32 @@
1
+ import type {AnySegment} from '../../parse-result';
2
+ import type {MainSegment} from './segments/main';
3
+ import type {
4
+ CodecSegment,
5
+ TrackEntrySegment,
6
+ TrackNumberSegment,
7
+ } from './segments/track-entry';
8
+
9
+ export const getMainSegment = (segments: AnySegment[]): MainSegment | null => {
10
+ return segments.find((s) => s.type === 'main-segment') as MainSegment | null;
11
+ };
12
+
13
+ export const getTrackNumber = (track: TrackEntrySegment) => {
14
+ const child = track.children.find(
15
+ (b) => b.type === 'track-number-segment',
16
+ ) as TrackNumberSegment | null;
17
+ return child?.trackNumber ?? null;
18
+ };
19
+
20
+ export const getTrackCodec = (track: TrackEntrySegment) => {
21
+ const child = track.children.find(
22
+ (b) => b.type === 'codec-segment',
23
+ ) as CodecSegment | null;
24
+ return child ?? null;
25
+ };
26
+
27
+ export const getTrackByNumber = (tracks: TrackEntrySegment[], id: number) => {
28
+ return tracks.find((track) => {
29
+ const trackNumber = getTrackNumber(track);
30
+ return trackNumber === id;
31
+ });
32
+ };