@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,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matrixCoefficients = void 0;
4
+ exports.matrixCoefficients = {
5
+ MC_IDENTITY: 0,
6
+ MC_BT_709: 1,
7
+ MC_UNSPECIFIED: 2,
8
+ MC_RESERVED_3: 3,
9
+ MC_FCC: 4,
10
+ MC_BT_470_B_G: 5,
11
+ MC_BT_601: 6,
12
+ MC_SMPTE_240: 7,
13
+ MC_SMPTE_YCGCO: 8,
14
+ MC_BT_2020_NCL: 9,
15
+ MC_BT_2020_CL: 10,
16
+ MC_SMPTE_2085: 11,
17
+ MC_CHROMAT_NCL: 12,
18
+ MC_CHROMAT_CL: 13,
19
+ MC_ICTCP: 14,
20
+ };
@@ -0,0 +1,10 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export type OperatingParametersInfo = {
3
+ decoder_buffer_delay: number;
4
+ encoder_buffer_delay: number;
5
+ low_delay_mode_flag: boolean;
6
+ };
7
+ export declare const parseOperatingParametersInfo: ({ stream, buffer_delay_length_minus_1, }: {
8
+ stream: BufferIterator;
9
+ buffer_delay_length_minus_1: number;
10
+ }) => OperatingParametersInfo;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOperatingParametersInfo = void 0;
4
+ const parseOperatingParametersInfo = ({ stream, buffer_delay_length_minus_1, }) => {
5
+ const n = buffer_delay_length_minus_1 + 1;
6
+ const decoder_buffer_delay = stream.getBits(n);
7
+ const encoder_buffer_delay = stream.getBits(n);
8
+ const low_delay_mode_flag = Boolean(stream.getBits(1));
9
+ return {
10
+ decoder_buffer_delay,
11
+ encoder_buffer_delay,
12
+ low_delay_mode_flag,
13
+ };
14
+ };
15
+ exports.parseOperatingParametersInfo = parseOperatingParametersInfo;
@@ -0,0 +1,5 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export declare const getTemporalPointInfo: ({ stream, frame_presentation_time_length_minus_1, }: {
3
+ stream: BufferIterator;
4
+ frame_presentation_time_length_minus_1: number;
5
+ }) => number;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTemporalPointInfo = void 0;
4
+ const getTemporalPointInfo = ({ stream, frame_presentation_time_length_minus_1, }) => {
5
+ const n = frame_presentation_time_length_minus_1 + 1;
6
+ return stream.getBits(n);
7
+ };
8
+ exports.getTemporalPointInfo = getTemporalPointInfo;
@@ -0,0 +1,8 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export type TimingInfo = {
3
+ num_units_in_display_tick: number;
4
+ time_scale: number;
5
+ equal_picture_interval: boolean;
6
+ num_ticks_per_picture_minus_1: number;
7
+ };
8
+ export declare const getTimingInfo: (stream: BufferIterator) => TimingInfo;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTimingInfo = void 0;
4
+ const uvlc_1 = require("./uvlc");
5
+ const getTimingInfo = (stream) => {
6
+ const num_units_in_display_tick = stream.getBits(32);
7
+ const time_scale = stream.getBits(32);
8
+ const equal_picture_interval = Boolean(stream.getBits(1));
9
+ let num_ticks_per_picture_minus_1 = 0;
10
+ if (equal_picture_interval) {
11
+ num_ticks_per_picture_minus_1 = (0, uvlc_1.uvlc)(stream);
12
+ }
13
+ return {
14
+ num_units_in_display_tick,
15
+ time_scale,
16
+ equal_picture_interval,
17
+ num_ticks_per_picture_minus_1,
18
+ };
19
+ };
20
+ exports.getTimingInfo = getTimingInfo;
@@ -0,0 +1,21 @@
1
+ export declare const transferCharacteristics: {
2
+ TC_RESERVED_0: number;
3
+ TC_BT_709: number;
4
+ TC_UNSPECIFIED: number;
5
+ TC_RESERVED_3: number;
6
+ TC_BT_470_M: number;
7
+ TC_BT_470_B_G: number;
8
+ TC_BT_601: number;
9
+ TC_SMPTE_240: number;
10
+ TC_LINEAR: number;
11
+ TC_LOG_100: number;
12
+ TC_LOG_100_SQRT10: number;
13
+ TC_IEC_61966: number;
14
+ TC_BT_1361: number;
15
+ TC_SRGB: number;
16
+ TC_BT_2020_10_BIT: number;
17
+ TC_BT_2020_12_BIT: number;
18
+ TC_SMPTE_2084: number;
19
+ TC_SMPTE_428: number;
20
+ TC_HLG: number;
21
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transferCharacteristics = void 0;
4
+ exports.transferCharacteristics = {
5
+ TC_RESERVED_0: 0,
6
+ TC_BT_709: 1,
7
+ TC_UNSPECIFIED: 2,
8
+ TC_RESERVED_3: 3,
9
+ TC_BT_470_M: 4,
10
+ TC_BT_470_B_G: 5,
11
+ TC_BT_601: 6,
12
+ TC_SMPTE_240: 7,
13
+ TC_LINEAR: 8,
14
+ TC_LOG_100: 9,
15
+ TC_LOG_100_SQRT10: 10,
16
+ TC_IEC_61966: 11,
17
+ TC_BT_1361: 12,
18
+ TC_SRGB: 13,
19
+ TC_BT_2020_10_BIT: 14,
20
+ TC_BT_2020_12_BIT: 15,
21
+ TC_SMPTE_2084: 16,
22
+ TC_SMPTE_428: 17,
23
+ TC_HLG: 18,
24
+ };
@@ -0,0 +1,2 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export declare const uvlc: (stream: BufferIterator) => number;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uvlc = void 0;
4
+ const uvlc = (stream) => {
5
+ let leadingZeroBits = 0;
6
+ // eslint-disable-next-line no-constant-condition
7
+ while (true) {
8
+ const done = stream.getBits(1);
9
+ if (done) {
10
+ break;
11
+ }
12
+ leadingZeroBits++;
13
+ }
14
+ if (leadingZeroBits >= 32) {
15
+ return (1 << 32) - 1;
16
+ }
17
+ const value = stream.getBits(leadingZeroBits);
18
+ return value + (1 << leadingZeroBits) - 1;
19
+ };
20
+ exports.uvlc = uvlc;
@@ -0,0 +1,20 @@
1
+ import type { BufferIterator } from '../../../buffer-iterator';
2
+ import type { ParserContext } from '../../../parser-context';
3
+ import type { VideoSample } from '../../../webcodec-sample-types';
4
+ import { type Av1BitstreamHeaderSegment } from './av1/header-segment';
5
+ type Av1BitstreamUimplementedSegment = {
6
+ type: 'av1-bitstream-unimplemented';
7
+ };
8
+ export type Av1BitstreamSegment = Av1BitstreamHeaderSegment | Av1BitstreamUimplementedSegment;
9
+ export declare const av1Bitstream: ({ stream, length, onVideoSample, trackNumber, context, timecode, }: {
10
+ stream: BufferIterator;
11
+ length: number;
12
+ onVideoSample: (trackId: number, sample: VideoSample) => void;
13
+ trackNumber: number;
14
+ context: ParserContext;
15
+ timecode: number;
16
+ }) => {
17
+ discarded: boolean;
18
+ segment: Av1BitstreamSegment;
19
+ };
20
+ export {};
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.av1Bitstream = void 0;
4
+ const combine_uint8array_1 = require("../../../combine-uint8array");
5
+ const bitstream_frame_1 = require("./av1/bitstream-frame");
6
+ const header_segment_1 = require("./av1/header-segment");
7
+ const av1Bitstream = ({ stream, length, onVideoSample, trackNumber, context, timecode, }) => {
8
+ var _a, _b;
9
+ const address = stream.counter.getOffset();
10
+ stream.startReadingBits();
11
+ // log this to understand:
12
+ // (firstByte.toString(2).padStart(8, '0'));
13
+ // get bit 0
14
+ const obuForbiddenBit = stream.getBits(1);
15
+ if (obuForbiddenBit) {
16
+ throw new Error('obuForbiddenBit is not 0');
17
+ }
18
+ // get bits 1-3
19
+ const obuType = stream.getBits(4);
20
+ // get bit 4
21
+ const obuExtensionFlag = stream.getBits(1);
22
+ // get bit 5
23
+ const obuHasSizeField = stream.getBits(1);
24
+ // reserved bit
25
+ stream.getBits(1);
26
+ let size = null;
27
+ if (obuExtensionFlag) {
28
+ // extension
29
+ stream.getBits(6);
30
+ }
31
+ if (obuHasSizeField) {
32
+ // size
33
+ size = stream.leb128();
34
+ }
35
+ /*
36
+ console.log(
37
+ address.toString(16),
38
+ firstByte.toString(2).padStart(8, '0'),
39
+ obuForbiddenBit,
40
+ obuType,
41
+ obuExtensionFlag,
42
+ obuHasSizeField,
43
+ reservedBit,
44
+ size,
45
+ );
46
+ */
47
+ const bytesReadSoFar = stream.counter.getOffset() - address;
48
+ const segment = obuType === 1
49
+ ? (0, header_segment_1.parseAv1BitstreamHeaderSegment)(stream)
50
+ : {
51
+ type: 'av1-bitstream-unimplemented',
52
+ };
53
+ if (obuType === 6) {
54
+ const head = context.parserState.getAv1BitstreamHeaderSegment();
55
+ if (!head) {
56
+ throw new Error('Expected header segment');
57
+ }
58
+ const header = (0, bitstream_frame_1.parseAv1Frame)({
59
+ stream,
60
+ headerSegment: head.segment,
61
+ });
62
+ const bytesAdvanced = stream.counter.getOffset() - address;
63
+ stream.counter.decrement(bytesAdvanced);
64
+ if (size === null) {
65
+ throw new Error('Expected size in OBU');
66
+ }
67
+ const clusterTimestamp = context.parserState.getClusterTimestamp();
68
+ if (clusterTimestamp === null) {
69
+ throw new Error('Expected cluster timestamp');
70
+ }
71
+ const toSlice = size + bytesReadSoFar;
72
+ const frame = stream.getSlice(toSlice);
73
+ let extraBytes = null;
74
+ if (!context.parserState.getIsFirstAv1FrameRead()) {
75
+ context.parserState.setIsFirstAv1FrameRead();
76
+ extraBytes =
77
+ (_b = (_a = context.parserState.getAv1BitstreamHeaderSegment()) === null || _a === void 0 ? void 0 : _a.header) !== null && _b !== void 0 ? _b : null;
78
+ if (!extraBytes) {
79
+ throw new Error('Expected extra bytes');
80
+ }
81
+ }
82
+ onVideoSample(trackNumber, {
83
+ data: (0, combine_uint8array_1.combineUint8Arrays)(extraBytes, frame),
84
+ timestamp: timecode + clusterTimestamp,
85
+ duration: undefined,
86
+ trackId: trackNumber,
87
+ cts: null,
88
+ dts: null,
89
+ type: header.header.frameType === 'key' ? 'key' : 'delta',
90
+ });
91
+ stream.stopReadingBits();
92
+ return {
93
+ discarded: true,
94
+ segment,
95
+ };
96
+ }
97
+ stream.stopReadingBits();
98
+ if (size === null) {
99
+ return {
100
+ discarded: false,
101
+ segment,
102
+ };
103
+ }
104
+ const end = stream.counter.getOffset();
105
+ const remaining = (size === null ? length : size + bytesReadSoFar) - (end - address);
106
+ if (remaining > 0) {
107
+ stream.discard(remaining);
108
+ }
109
+ const remainingNow = length - (stream.counter.getOffset() - address);
110
+ if (remainingNow > 0 && remainingNow <= 2) {
111
+ throw new Error('remainingNow > 0 && remainingNow <= 2');
112
+ }
113
+ return {
114
+ discarded: Boolean(size),
115
+ segment,
116
+ };
117
+ };
118
+ exports.av1Bitstream = av1Bitstream;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,2 @@
1
+ import type { TrackEntrySegment } from './segments/track-entry';
2
+ export declare const getAudioDescription: (track: TrackEntrySegment) => undefined | Uint8Array;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAudioDescription = void 0;
4
+ const buffer_iterator_1 = require("../../buffer-iterator");
5
+ const traversal_1 = require("../../traversal");
6
+ const getAudioDescription = (track) => {
7
+ const codec = (0, traversal_1.getCodecSegment)(track);
8
+ if (!codec || codec.codec !== 'A_VORBIS') {
9
+ return undefined;
10
+ }
11
+ // how to parse vorbis private
12
+ // https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java#L2466
13
+ const privateData = (0, traversal_1.getPrivateData)(track);
14
+ if (!privateData) {
15
+ return undefined;
16
+ }
17
+ if (privateData[0] !== 2) {
18
+ throw new Error('Expected vorbis private data version 2');
19
+ }
20
+ let offset = 1;
21
+ let vorbisInfoLength = 0;
22
+ let vorbisSkipLength = 0;
23
+ while ((privateData[offset] & 0xff) === 0xff) {
24
+ vorbisInfoLength += 0xff;
25
+ offset++;
26
+ }
27
+ vorbisInfoLength += privateData[offset++] & 0xff;
28
+ while ((privateData[offset] & 0xff) === 0xff) {
29
+ vorbisSkipLength += 0xff;
30
+ offset++;
31
+ }
32
+ vorbisSkipLength += privateData[offset++] & 0xff;
33
+ if (privateData[offset] !== 0x01) {
34
+ throw new Error('Error parsing vorbis codec private');
35
+ }
36
+ const vorbisInfo = privateData.slice(offset, offset + vorbisInfoLength);
37
+ offset += vorbisInfoLength;
38
+ if (privateData[offset] !== 0x03) {
39
+ throw new Error('Error parsing vorbis codec private');
40
+ }
41
+ const vorbisComments = privateData.slice(offset, offset + vorbisSkipLength);
42
+ offset += vorbisSkipLength;
43
+ if (privateData[offset] !== 0x05) {
44
+ throw new Error('Error parsing vorbis codec private');
45
+ }
46
+ const vorbisBooks = privateData.slice(offset);
47
+ const bufferIterator = (0, buffer_iterator_1.getArrayBufferIterator)(vorbisInfo.slice(0));
48
+ // type
49
+ bufferIterator.getUint8();
50
+ // vorbis
51
+ const vorbis = bufferIterator.getByteString(6);
52
+ if (vorbis !== 'vorbis') {
53
+ throw new Error('Error parsing vorbis codec private');
54
+ }
55
+ const vorbisVersion = bufferIterator.getUint32Le();
56
+ if (vorbisVersion !== 0) {
57
+ throw new Error('Error parsing vorbis codec private');
58
+ }
59
+ const vorbisDescription = new Uint8Array([
60
+ // constructing the vorbis description
61
+ // This format consists in the page_segments field
62
+ /**
63
+ * The number of segment entries to appear in the segment table.
64
+ * The maximum number of 255 segments (255 bytes each) sets the maximum possible physical page size at 65307 bytes or just under 64kB (thus we know that a header corrupted so as destroy sizing/alignment information will not cause a runaway bitstream.
65
+ * We'll read in the page according to the corrupted size information that's guaranteed to be a reasonable size regardless, notice the checksum mismatch, drop sync and then look for recapture).
66
+ */
67
+ 2,
68
+ // followed by the segment_table field
69
+ // offset of the comments table
70
+ vorbisInfo.length,
71
+ // offset of the codebooks table
72
+ vorbisComments.length,
73
+ // followed by the three Vorbis header packets,
74
+ // respectively the identification header,
75
+ ...vorbisInfo,
76
+ // the comments header,
77
+ ...vorbisComments,
78
+ // and the setup header, in this order, as described in section 4.2 of [VORBIS].
79
+ ...vorbisBooks,
80
+ ]);
81
+ return vorbisDescription;
82
+ };
83
+ exports.getAudioDescription = getAudioDescription;
@@ -0,0 +1,3 @@
1
+ import type { Track } from '../../get-tracks';
2
+ import type { MainSegment } from './segments/main';
3
+ export declare const getTracksFromMatroska: (segment: MainSegment, timescale: number) => Track[];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTracksFromMatroska = void 0;
4
+ const traversal_1 = require("../../traversal");
5
+ const get_track_1 = require("./get-track");
6
+ const getTracksFromMatroska = (segment, timescale) => {
7
+ const tracksSegment = (0, traversal_1.getTracksSegment)(segment);
8
+ if (!tracksSegment) {
9
+ throw new Error('No tracks segment');
10
+ }
11
+ const tracks = [];
12
+ for (const trackEntrySegment of tracksSegment.children) {
13
+ if (trackEntrySegment.type === 'crc32-segment') {
14
+ continue;
15
+ }
16
+ if (trackEntrySegment.type !== 'track-entry-segment') {
17
+ throw new Error('Expected track entry segment');
18
+ }
19
+ const track = (0, get_track_1.getTrack)({
20
+ track: trackEntrySegment,
21
+ timescale,
22
+ });
23
+ if (track) {
24
+ tracks.push(track);
25
+ }
26
+ }
27
+ return tracks;
28
+ };
29
+ exports.getTracksFromMatroska = getTracksFromMatroska;
@@ -0,0 +1,6 @@
1
+ import type { AudioTrack, VideoTrack } from '../../get-tracks';
2
+ import type { TrackEntrySegment } from './segments/track-entry';
3
+ export declare const getTrack: ({ timescale, track, }: {
4
+ timescale: number;
5
+ track: TrackEntrySegment;
6
+ }) => VideoTrack | AudioTrack | null;
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTrack = void 0;
4
+ const buffer_iterator_1 = require("../../buffer-iterator");
5
+ const make_hvc1_codec_strings_1 = require("../../make-hvc1-codec-strings");
6
+ const traversal_1 = require("../../traversal");
7
+ const av1_codec_private_1 = require("./av1-codec-private");
8
+ const description_1 = require("./description");
9
+ const getDescription = (track) => {
10
+ const codec = (0, traversal_1.getCodecSegment)(track);
11
+ if (!codec) {
12
+ return undefined;
13
+ }
14
+ if (codec.codec === 'V_MPEG4/ISO/AVC' || codec.codec === 'V_MPEGH/ISO/HEVC') {
15
+ const priv = (0, traversal_1.getPrivateData)(track);
16
+ if (priv) {
17
+ return priv;
18
+ }
19
+ }
20
+ return undefined;
21
+ };
22
+ const getMatroskaVideoCodecString = ({ track, codecSegment: codec, }) => {
23
+ if (codec.codec === 'V_VP8') {
24
+ return 'vp8';
25
+ }
26
+ if (codec.codec === 'V_VP9') {
27
+ const priv = (0, traversal_1.getPrivateData)(track);
28
+ if (priv) {
29
+ throw new Error('@remotion/media-parser cannot handle the private data for VP9. Do you have an example file you could send so we can implement it?');
30
+ }
31
+ return 'vp09.00.10.08';
32
+ }
33
+ if (codec.codec === 'V_MPEG4/ISO/AVC') {
34
+ const priv = (0, traversal_1.getPrivateData)(track);
35
+ if (priv) {
36
+ return `avc1.${priv[1].toString(16).padStart(2, '0')}${priv[2].toString(16).padStart(2, '0')}${priv[3].toString(16).padStart(2, '0')}`;
37
+ }
38
+ throw new Error('Could not find a CodecPrivate field in TrackEntry');
39
+ }
40
+ if (codec.codec === 'V_AV1') {
41
+ const priv = (0, traversal_1.getPrivateData)(track);
42
+ if (!priv) {
43
+ throw new Error('Expected private data in AV1 track');
44
+ }
45
+ return (0, av1_codec_private_1.parseAv1PrivateData)(priv, null);
46
+ }
47
+ if (codec.codec === 'V_MPEGH/ISO/HEVC') {
48
+ const priv = (0, traversal_1.getPrivateData)(track);
49
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv);
50
+ return 'hvc1.' + (0, make_hvc1_codec_strings_1.getHvc1CodecString)(iterator);
51
+ }
52
+ throw new Error(`Unknown codec: ${codec.codec}`);
53
+ };
54
+ const getMatroskaAudioCodecString = (track) => {
55
+ const codec = (0, traversal_1.getCodecSegment)(track);
56
+ if (!codec) {
57
+ throw new Error('Expected codec segment');
58
+ }
59
+ if (codec.codec === 'A_OPUS') {
60
+ return 'opus';
61
+ }
62
+ if (codec.codec === 'A_VORBIS') {
63
+ return 'vorbis';
64
+ }
65
+ if (codec.codec === 'A_PCM/INT/LIT') {
66
+ // https://github.com/ietf-wg-cellar/matroska-specification/issues/142#issuecomment-330004950
67
+ // Audio samples MUST be considered as signed values, except if the audio bit depth is 8 which MUST be interpreted as unsigned values.
68
+ const bitDepth = (0, traversal_1.getBitDepth)(track);
69
+ if (bitDepth === null) {
70
+ throw new Error('Expected bit depth');
71
+ }
72
+ if (bitDepth === 8) {
73
+ return 'pcm-u8';
74
+ }
75
+ return 'pcm-s' + bitDepth;
76
+ }
77
+ if (codec.codec === 'A_AAC') {
78
+ const priv = (0, traversal_1.getPrivateData)(track);
79
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(priv);
80
+ iterator.startReadingBits();
81
+ /**
82
+ * ChatGPT
83
+ * ▪ The first 5 bits represent the AOT.
84
+ ▪ Common values:
85
+ ◦ 1 for AAC Main
86
+ ◦ 2 for AAC LC (Low Complexity)
87
+ ◦ 3 for AAC SSR (Scalable Sample Rate)
88
+ ◦ 4 for AAC LTP (Long Term Prediction)
89
+ ◦ 5 for SBR (Spectral Band Replication)
90
+ ◦ 29 for HE-AAC (which uses SBR with AAC LC)
91
+ */
92
+ /**
93
+ * Fully qualified codec:
94
+ * This codec has multiple possible codec strings:
95
+ "mp4a.40.2" — MPEG-4 AAC LC
96
+ "mp4a.40.02" — MPEG-4 AAC LC, leading 0 for Aud-OTI compatibility
97
+ "mp4a.40.5" — MPEG-4 HE-AAC v1 (AAC LC + SBR)
98
+ "mp4a.40.05" — MPEG-4 HE-AAC v1 (AAC LC + SBR), leading 0 for Aud-OTI compatibility
99
+ "mp4a.40.29" — MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
100
+ "mp4a.67" — MPEG-2 AAC LC
101
+ */
102
+ const profile = iterator.getBits(5);
103
+ iterator.stopReadingBits();
104
+ iterator.destroy();
105
+ return `mp4a.40.${profile.toString().padStart(2, '0')}`;
106
+ }
107
+ if (codec.codec === 'A_MPEG/L3') {
108
+ return 'mp3';
109
+ }
110
+ throw new Error(`Unknown codec: ${codec.codec}`);
111
+ };
112
+ const getTrack = ({ timescale, track, }) => {
113
+ const trackType = (0, traversal_1.getTrackTypeSegment)(track);
114
+ if (!trackType) {
115
+ throw new Error('Expected track type segment');
116
+ }
117
+ const trackId = (0, traversal_1.getTrackId)(track);
118
+ if (trackType.trackType === 'video') {
119
+ const width = (0, traversal_1.getWidthSegment)(track);
120
+ if (width === null) {
121
+ throw new Error('Expected width segment');
122
+ }
123
+ const height = (0, traversal_1.getHeightSegment)(track);
124
+ if (height === null) {
125
+ throw new Error('Expected height segment');
126
+ }
127
+ const displayHeight = (0, traversal_1.getDisplayHeightSegment)(track);
128
+ const displayWidth = (0, traversal_1.getDisplayWidthSegment)(track);
129
+ const codec = (0, traversal_1.getCodecSegment)(track);
130
+ if (!codec) {
131
+ return null;
132
+ }
133
+ const codecString = getMatroskaVideoCodecString({
134
+ track,
135
+ codecSegment: codec,
136
+ });
137
+ if (!codecString) {
138
+ return null;
139
+ }
140
+ return {
141
+ type: 'video',
142
+ trackId,
143
+ codec: codecString,
144
+ description: getDescription(track),
145
+ height: displayHeight ? displayHeight.displayHeight : height.height,
146
+ width: displayWidth ? displayWidth.displayWidth : width.width,
147
+ sampleAspectRatio: {
148
+ numerator: 1,
149
+ denominator: 1,
150
+ },
151
+ timescale,
152
+ samplePositions: [],
153
+ codedHeight: height.height,
154
+ codedWidth: width.width,
155
+ displayAspectHeight: displayHeight
156
+ ? displayHeight.displayHeight
157
+ : height.height,
158
+ displayAspectWidth: displayWidth
159
+ ? displayWidth.displayWidth
160
+ : width.width,
161
+ rotation: 0,
162
+ };
163
+ }
164
+ if (trackType.trackType === 'audio') {
165
+ const sampleRate = (0, traversal_1.getSampleRate)(track);
166
+ const numberOfChannels = (0, traversal_1.getNumberOfChannels)(track);
167
+ if (sampleRate === null) {
168
+ throw new Error('Could not find sample rate or number of channels');
169
+ }
170
+ return {
171
+ type: 'audio',
172
+ trackId,
173
+ codec: getMatroskaAudioCodecString(track),
174
+ samplePositions: null,
175
+ timescale,
176
+ numberOfChannels,
177
+ sampleRate,
178
+ description: (0, description_1.getAudioDescription)(track),
179
+ };
180
+ }
181
+ return null;
182
+ };
183
+ exports.getTrack = getTrack;
@@ -1,3 +1,4 @@
1
1
  import type { BufferIterator } from '../../buffer-iterator';
2
2
  import type { ParseResult } from '../../parse-result';
3
- export declare const parseWebm: (counter: BufferIterator) => ParseResult;
3
+ import type { ParserContext } from '../../parser-context';
4
+ export declare const parseWebm: (counter: BufferIterator, parserContext: ParserContext) => Promise<ParseResult>;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseWebm = void 0;
4
4
  const segments_1 = require("./segments");
5
5
  // Parsing according to https://darkcoding.net/software/reading-mediarecorders-webm-opus-output/
6
- const parseWebm = (counter) => {
6
+ const parseWebm = (counter, parserContext) => {
7
7
  counter.discard(4);
8
8
  const length = counter.getVint();
9
9
  if (length !== 31 && length !== 35) {
@@ -11,6 +11,6 @@ const parseWebm = (counter) => {
11
11
  }
12
12
  // Discard header for now
13
13
  counter.discard(length);
14
- return { status: 'done', segments: [(0, segments_1.expectSegment)(counter)] };
14
+ return (0, segments_1.expectSegment)(counter, parserContext);
15
15
  };
16
16
  exports.parseWebm = parseWebm;