@remotion/media-parser 4.0.193 → 4.0.195

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 (266) 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/make-track.d.ts +3 -0
  10. package/dist/boxes/iso-base-media/make-track.js +112 -0
  11. package/dist/boxes/iso-base-media/mdat/mdat.d.ts +16 -0
  12. package/dist/boxes/iso-base-media/mdat/mdat.js +97 -0
  13. package/dist/boxes/iso-base-media/moov/moov.d.ts +4 -2
  14. package/dist/boxes/iso-base-media/moov/moov.js +4 -2
  15. package/dist/boxes/iso-base-media/mvhd.js +7 -1
  16. package/dist/boxes/iso-base-media/process-box.d.ts +20 -3
  17. package/dist/boxes/iso-base-media/process-box.js +356 -18
  18. package/dist/boxes/iso-base-media/stsd/av1c.d.ts +9 -0
  19. package/dist/boxes/iso-base-media/stsd/av1c.js +10 -0
  20. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.d.ts +20 -0
  21. package/dist/boxes/iso-base-media/stsd/avcc-hvcc.js +73 -0
  22. package/dist/boxes/iso-base-media/stsd/avcc.d.ts +10 -0
  23. package/dist/boxes/iso-base-media/stsd/avcc.js +21 -0
  24. package/dist/boxes/iso-base-media/stsd/colr.d.ts +11 -0
  25. package/dist/boxes/iso-base-media/stsd/colr.js +35 -0
  26. package/dist/boxes/iso-base-media/stsd/ctts.d.ts +19 -0
  27. package/dist/boxes/iso-base-media/stsd/ctts.js +30 -0
  28. package/dist/boxes/iso-base-media/stsd/hvcc.d.ts +11 -0
  29. package/dist/boxes/iso-base-media/stsd/hvcc.js +17 -0
  30. package/dist/boxes/iso-base-media/stsd/keys.js +1 -0
  31. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +4 -2
  32. package/dist/boxes/iso-base-media/stsd/mebx.js +4 -2
  33. package/dist/boxes/iso-base-media/stsd/pasp.d.ts +12 -0
  34. package/dist/boxes/iso-base-media/stsd/pasp.js +17 -0
  35. package/dist/boxes/iso-base-media/stsd/samples.d.ts +12 -5
  36. package/dist/boxes/iso-base-media/stsd/samples.js +27 -10
  37. package/dist/boxes/iso-base-media/stsd/stco.d.ts +14 -0
  38. package/dist/boxes/iso-base-media/stsd/stco.js +30 -0
  39. package/dist/boxes/iso-base-media/stsd/stsc.d.ts +19 -0
  40. package/dist/boxes/iso-base-media/stsd/stsc.js +34 -0
  41. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +4 -2
  42. package/dist/boxes/iso-base-media/stsd/stsd.js +6 -2
  43. package/dist/boxes/iso-base-media/stsd/stss.d.ts +13 -0
  44. package/dist/boxes/iso-base-media/stsd/stss.js +28 -0
  45. package/dist/boxes/iso-base-media/stsd/stsz.d.ts +21 -0
  46. package/dist/boxes/iso-base-media/stsd/stsz.js +44 -0
  47. package/dist/boxes/iso-base-media/stsd/stts.d.ts +15 -0
  48. package/dist/boxes/iso-base-media/stsd/stts.js +35 -0
  49. package/dist/boxes/iso-base-media/tkhd.d.ts +3 -0
  50. package/dist/boxes/iso-base-media/tkhd.js +41 -14
  51. package/dist/boxes/iso-base-media/trak/trak.d.ts +4 -2
  52. package/dist/boxes/iso-base-media/trak/trak.js +4 -2
  53. package/dist/boxes/iso-base-media/void-box.d.ts +4 -0
  54. package/dist/boxes/iso-base-media/void-box.js +2 -0
  55. package/dist/boxes/webm/allowed-partial-segments.d.ts +1 -0
  56. package/dist/boxes/webm/allowed-partial-segments.js +4 -0
  57. package/dist/boxes/webm/av1-codec-private.d.ts +2 -0
  58. package/dist/boxes/webm/av1-codec-private.js +95 -0
  59. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.d.ts +14 -0
  60. package/dist/boxes/webm/bitstream/av1/bitstream-frame-header.js +67 -0
  61. package/dist/boxes/webm/bitstream/av1/bitstream-frame.d.ts +11 -0
  62. package/dist/boxes/webm/bitstream/av1/bitstream-frame.js +14 -0
  63. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.d.ts +6 -0
  64. package/dist/boxes/webm/bitstream/av1/chroma-sample-position.js +9 -0
  65. package/dist/boxes/webm/bitstream/av1/color-config.d.ts +16 -0
  66. package/dist/boxes/webm/bitstream/av1/color-config.js +103 -0
  67. package/dist/boxes/webm/bitstream/av1/color-primaries.d.ts +14 -0
  68. package/dist/boxes/webm/bitstream/av1/color-primaries.js +17 -0
  69. package/dist/boxes/webm/bitstream/av1/decoder-model-info.d.ts +9 -0
  70. package/dist/boxes/webm/bitstream/av1/decoder-model-info.js +17 -0
  71. package/dist/boxes/webm/bitstream/av1/frame.d.ts +0 -0
  72. package/dist/boxes/webm/bitstream/av1/frame.js +1 -0
  73. package/dist/boxes/webm/bitstream/av1/header-segment.d.ts +51 -0
  74. package/dist/boxes/webm/bitstream/av1/header-segment.js +183 -0
  75. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.d.ts +17 -0
  76. package/dist/boxes/webm/bitstream/av1/matrix-coefficients.js +20 -0
  77. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.d.ts +10 -0
  78. package/dist/boxes/webm/bitstream/av1/operating-parameters-info.js +15 -0
  79. package/dist/boxes/webm/bitstream/av1/temporal-point-info.d.ts +5 -0
  80. package/dist/boxes/webm/bitstream/av1/temporal-point-info.js +8 -0
  81. package/dist/boxes/webm/bitstream/av1/timing-info.d.ts +8 -0
  82. package/dist/boxes/webm/bitstream/av1/timing-info.js +20 -0
  83. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.d.ts +21 -0
  84. package/dist/boxes/webm/bitstream/av1/transfer-characteristics.js +24 -0
  85. package/dist/boxes/webm/bitstream/av1/uvlc.d.ts +2 -0
  86. package/dist/boxes/webm/bitstream/av1/uvlc.js +20 -0
  87. package/dist/boxes/webm/bitstream/av1.d.ts +20 -0
  88. package/dist/boxes/webm/bitstream/av1.js +118 -0
  89. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.d.ts +0 -0
  90. package/dist/boxes/webm/bitstream/h264/get-h264-descriptor.js +1 -0
  91. package/dist/boxes/webm/description.d.ts +2 -0
  92. package/dist/boxes/webm/description.js +83 -0
  93. package/dist/boxes/webm/get-ready-tracks.d.ts +3 -0
  94. package/dist/boxes/webm/get-ready-tracks.js +29 -0
  95. package/dist/boxes/webm/get-track.d.ts +6 -0
  96. package/dist/boxes/webm/get-track.js +183 -0
  97. package/dist/boxes/webm/parse-webm-header.d.ts +2 -1
  98. package/dist/boxes/webm/parse-webm-header.js +2 -2
  99. package/dist/boxes/webm/segments/all-segments.d.ts +269 -0
  100. package/dist/boxes/webm/segments/all-segments.js +277 -0
  101. package/dist/boxes/webm/segments/duration.d.ts +1 -1
  102. package/dist/boxes/webm/segments/duration.js +13 -9
  103. package/dist/boxes/webm/segments/info.d.ts +2 -1
  104. package/dist/boxes/webm/segments/info.js +12 -4
  105. package/dist/boxes/webm/segments/main.d.ts +0 -2
  106. package/dist/boxes/webm/segments/main.js +0 -11
  107. package/dist/boxes/webm/segments/muxing.d.ts +1 -1
  108. package/dist/boxes/webm/segments/muxing.js +1 -2
  109. package/dist/boxes/webm/segments/parse-children.d.ts +11 -1
  110. package/dist/boxes/webm/segments/parse-children.js +82 -6
  111. package/dist/boxes/webm/segments/seek-head.d.ts +2 -1
  112. package/dist/boxes/webm/segments/seek-head.js +12 -3
  113. package/dist/boxes/webm/segments/seek-position.d.ts +1 -1
  114. package/dist/boxes/webm/segments/seek-position.js +1 -2
  115. package/dist/boxes/webm/segments/seek.d.ts +7 -2
  116. package/dist/boxes/webm/segments/seek.js +22 -9
  117. package/dist/boxes/webm/segments/track-entry.d.ts +102 -22
  118. package/dist/boxes/webm/segments/track-entry.js +269 -57
  119. package/dist/boxes/webm/segments/tracks.d.ts +2 -1
  120. package/dist/boxes/webm/segments/tracks.js +12 -4
  121. package/dist/boxes/webm/segments/void.d.ts +1 -1
  122. package/dist/boxes/webm/segments/void.js +1 -2
  123. package/dist/boxes/webm/segments/writing.d.ts +1 -1
  124. package/dist/boxes/webm/segments/writing.js +1 -2
  125. package/dist/boxes/webm/segments.d.ts +8 -4
  126. package/dist/boxes/webm/segments.js +176 -40
  127. package/dist/boxes/webm/traversal.d.ts +7 -0
  128. package/dist/boxes/webm/traversal.js +25 -0
  129. package/dist/buffer-iterator.d.ts +16 -1
  130. package/dist/buffer-iterator.js +124 -41
  131. package/dist/combine-uint8array.d.ts +1 -0
  132. package/dist/combine-uint8array.js +13 -0
  133. package/dist/from-fetch.d.ts +2 -0
  134. package/dist/from-fetch.js +54 -0
  135. package/dist/from-node.js +12 -2
  136. package/dist/from-web-file.d.ts +2 -0
  137. package/dist/from-web-file.js +34 -0
  138. package/dist/get-audio-codec.d.ts +19 -0
  139. package/dist/get-audio-codec.js +153 -60
  140. package/dist/get-dimensions.d.ts +8 -2
  141. package/dist/get-dimensions.js +13 -91
  142. package/dist/get-duration.js +4 -7
  143. package/dist/get-fps.d.ts +4 -3
  144. package/dist/get-fps.js +17 -116
  145. package/dist/get-sample-aspect-ratio.d.ts +37 -0
  146. package/dist/get-sample-aspect-ratio.js +137 -0
  147. package/dist/get-sample-positions.d.ts +22 -0
  148. package/dist/get-sample-positions.js +54 -0
  149. package/dist/get-tracks.d.ts +49 -0
  150. package/dist/get-tracks.js +84 -0
  151. package/dist/get-video-codec.d.ts +2 -0
  152. package/dist/get-video-codec.js +47 -31
  153. package/dist/has-all-info.d.ts +2 -1
  154. package/dist/has-all-info.js +14 -5
  155. package/dist/index.d.ts +1 -0
  156. package/dist/make-hvc1-codec-strings.d.ts +2 -0
  157. package/dist/make-hvc1-codec-strings.js +47 -0
  158. package/dist/options.d.ts +26 -4
  159. package/dist/parse-media.js +76 -20
  160. package/dist/parse-result.d.ts +17 -5
  161. package/dist/parse-video.d.ts +12 -2
  162. package/dist/parse-video.js +15 -6
  163. package/dist/parser-context.d.ts +8 -0
  164. package/dist/parser-context.js +2 -0
  165. package/dist/parser-state.d.ts +23 -0
  166. package/dist/parser-state.js +112 -0
  167. package/dist/reader.d.ts +2 -2
  168. package/dist/traversal.d.ts +56 -0
  169. package/dist/traversal.js +331 -0
  170. package/dist/understand-vorbis.d.ts +1 -0
  171. package/dist/understand-vorbis.js +12 -0
  172. package/dist/webcodec-sample-types.d.ts +21 -0
  173. package/dist/webcodec-sample-types.js +2 -0
  174. package/package.json +10 -2
  175. package/src/add-new-matroska-tracks.ts +23 -0
  176. package/src/boxes/iso-base-media/esds/decoder-specific-config.ts +61 -0
  177. package/src/boxes/iso-base-media/esds/esds-descriptors.ts +33 -2
  178. package/src/boxes/iso-base-media/make-track.ts +157 -0
  179. package/src/boxes/iso-base-media/mdat/mdat.ts +131 -0
  180. package/src/boxes/iso-base-media/moov/moov.ts +8 -3
  181. package/src/boxes/iso-base-media/mvhd.ts +7 -1
  182. package/src/boxes/iso-base-media/process-box.ts +426 -21
  183. package/src/boxes/iso-base-media/stsd/av1c.ts +19 -0
  184. package/src/boxes/iso-base-media/stsd/avcc.ts +36 -0
  185. package/src/boxes/iso-base-media/stsd/colr.ts +49 -0
  186. package/src/boxes/iso-base-media/stsd/ctts.ts +55 -0
  187. package/src/boxes/iso-base-media/stsd/hvcc.ts +32 -0
  188. package/src/boxes/iso-base-media/stsd/keys.ts +2 -0
  189. package/src/boxes/iso-base-media/stsd/mebx.ts +8 -3
  190. package/src/boxes/iso-base-media/stsd/pasp.ts +32 -0
  191. package/src/boxes/iso-base-media/stsd/samples.ts +43 -16
  192. package/src/boxes/iso-base-media/stsd/stco.ts +50 -0
  193. package/src/boxes/iso-base-media/stsd/stsc.ts +61 -0
  194. package/src/boxes/iso-base-media/stsd/stsd.ts +10 -3
  195. package/src/boxes/iso-base-media/stsd/stss.ts +47 -0
  196. package/src/boxes/iso-base-media/stsd/stsz.ts +75 -0
  197. package/src/boxes/iso-base-media/tkhd.ts +63 -16
  198. package/src/boxes/iso-base-media/trak/trak.ts +8 -3
  199. package/src/boxes/iso-base-media/void-box.ts +4 -0
  200. package/src/boxes/webm/allowed-partial-segments.ts +1 -0
  201. package/src/boxes/webm/av1-codec-private.ts +113 -0
  202. package/src/boxes/webm/description.ts +101 -0
  203. package/src/boxes/webm/get-ready-tracks.ts +36 -0
  204. package/src/boxes/webm/get-track.ts +250 -0
  205. package/src/boxes/webm/parse-webm-header.ts +6 -2
  206. package/src/boxes/webm/segments/all-segments.ts +285 -0
  207. package/src/boxes/webm/segments/duration.ts +15 -8
  208. package/src/boxes/webm/segments/info.ts +18 -4
  209. package/src/boxes/webm/segments/main.ts +0 -13
  210. package/src/boxes/webm/segments/muxing.ts +1 -1
  211. package/src/boxes/webm/segments/parse-children.ts +132 -9
  212. package/src/boxes/webm/segments/seek-head.ts +17 -4
  213. package/src/boxes/webm/segments/seek-position.ts +1 -2
  214. package/src/boxes/webm/segments/seek.ts +31 -9
  215. package/src/boxes/webm/segments/track-entry.ts +475 -65
  216. package/src/boxes/webm/segments/tracks.ts +17 -7
  217. package/src/boxes/webm/segments/void.ts +4 -2
  218. package/src/boxes/webm/segments/writing.ts +1 -1
  219. package/src/boxes/webm/segments.ts +266 -42
  220. package/src/boxes/webm/traversal.ts +32 -0
  221. package/src/buffer-iterator.ts +155 -40
  222. package/src/combine-uint8array.ts +13 -0
  223. package/src/{from-web.ts → from-fetch.ts} +18 -7
  224. package/src/from-node.ts +15 -2
  225. package/src/from-web-file.ts +39 -0
  226. package/src/get-audio-codec.ts +213 -84
  227. package/src/get-dimensions.ts +25 -132
  228. package/src/get-duration.ts +4 -8
  229. package/src/get-fps.ts +27 -172
  230. package/src/get-sample-aspect-ratio.ts +204 -0
  231. package/src/get-sample-positions.ts +93 -0
  232. package/src/get-tracks.ts +147 -0
  233. package/src/get-video-codec.ts +62 -47
  234. package/src/has-all-info.ts +35 -5
  235. package/src/index.ts +8 -0
  236. package/src/make-hvc1-codec-strings.ts +55 -0
  237. package/src/options.ts +48 -9
  238. package/src/parse-media.ts +112 -25
  239. package/src/parse-result.ts +29 -4
  240. package/src/parse-video.ts +32 -7
  241. package/src/parser-context.ts +9 -0
  242. package/src/parser-state.ts +151 -0
  243. package/src/reader.ts +3 -3
  244. package/src/test/aspect-ratio.test.ts +42 -0
  245. package/src/test/av1.test.ts +108 -0
  246. package/src/test/duration.test.ts +5 -21
  247. package/src/test/matroska.test.ts +350 -31
  248. package/src/test/mvhd.test.ts +6 -1
  249. package/src/test/parse-esds.test.ts +29 -6
  250. package/src/test/parse-stco.test.ts +59 -0
  251. package/src/test/parse-stsc.test.ts +104 -0
  252. package/src/test/parse-stsz.test.ts +57 -0
  253. package/src/test/parse-stts.test.ts +1 -1
  254. package/src/test/parse-video.test.ts +23 -35
  255. package/src/test/parse-webm.test.ts +5 -5
  256. package/src/test/stream-local.test.ts +543 -47
  257. package/src/test/stream-remote.test.ts +15 -13
  258. package/src/test/stream-samples.test.ts +259 -0
  259. package/src/test/stsd.test.ts +60 -8
  260. package/src/test/tkhd.test.ts +4 -1
  261. package/src/traversal.ts +496 -0
  262. package/src/webcodec-sample-types.ts +30 -0
  263. package/tsconfig.json +5 -1
  264. package/tsconfig.tsbuildinfo +1 -1
  265. package/boxes.json +0 -1
  266. /package/src/boxes/iso-base-media/{stts → stsd}/stts.ts +0 -0
@@ -14,6 +14,9 @@ export interface TkhdBox extends BaseBox {
14
14
  matrix: ThreeDMatrix;
15
15
  width: number;
16
16
  height: number;
17
+ unrotatedWidth: number;
18
+ unrotatedHeight: number;
19
+ rotation: number;
17
20
  }
18
21
  export declare const parseTkhd: ({ iterator, offset, size, }: {
19
22
  iterator: BufferIterator;
@@ -2,6 +2,26 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseTkhd = void 0;
4
4
  const to_date_1 = require("./to-date");
5
+ function getRotationAngleFromMatrix(matrix) {
6
+ // Extract elements from the matrix
7
+ const [a, b, c, d] = matrix;
8
+ // Check if the matrix is a valid rotation matrix
9
+ if (Math.round(a * a + b * b) !== 1 || Math.round(c * c + d * d) !== 1) {
10
+ throw new Error('The provided matrix is not a valid rotation matrix.');
11
+ }
12
+ // Calculate the angle using the atan2 function
13
+ const angleRadians = Math.atan2(c, a); // atan2(sin(θ), cos(θ))
14
+ const angleDegrees = angleRadians * (180 / Math.PI); // Convert radians to degrees
15
+ return angleDegrees;
16
+ }
17
+ const applyRotation = ({ matrix, width, height, }) => {
18
+ const newWidth = matrix[0] * width + matrix[1] * height; // 0*3840 + 1*2160
19
+ const newHeight = matrix[2] * width + matrix[3] * height; // -1*3840 + 0*2160
20
+ return {
21
+ width: Math.abs(newWidth),
22
+ height: Math.abs(newHeight),
23
+ };
24
+ };
5
25
  const parseTkhd = ({ iterator, offset, size, }) => {
6
26
  if (size !== 92) {
7
27
  throw new Error(`Expected tkhd size of version 0 to be 92, got ${size}`);
@@ -28,21 +48,25 @@ const parseTkhd = ({ iterator, offset, size, }) => {
28
48
  // reserved 4
29
49
  iterator.discard(2);
30
50
  const matrix = [
31
- iterator.getUint32(),
32
- iterator.getUint32(),
33
- iterator.getUint32(),
34
- iterator.getUint32(),
35
- iterator.getUint32(),
36
- iterator.getUint32(),
37
- iterator.getUint32(),
38
- iterator.getUint32(),
39
- iterator.getUint32(),
51
+ iterator.getFixedPointSigned1616Number(),
52
+ iterator.getFixedPointSigned1616Number(),
53
+ iterator.getFixedPointSigned230Number(),
54
+ iterator.getFixedPointSigned1616Number(),
55
+ iterator.getFixedPointSigned1616Number(),
56
+ iterator.getFixedPointSigned230Number(),
57
+ iterator.getFixedPointSigned1616Number(),
58
+ iterator.getFixedPointSigned1616Number(),
59
+ iterator.getFixedPointSigned230Number(),
40
60
  ];
41
- const widthWithoutRotationApplied = iterator.getUint32() / (matrix[0] === 0 ? 1 : matrix[0]);
42
- const heightWithoutRotationApplied = iterator.getUint32() / (matrix[4] === 0 ? 1 : matrix[4]);
43
- // TODO: This is not correct, HEVC videos with matrix is wrong
44
- const width = widthWithoutRotationApplied / (matrix[1] === 0 ? 1 : matrix[1]);
45
- const height = heightWithoutRotationApplied / (matrix[1] === 0 ? 1 : matrix[1]);
61
+ const rotationMatrix = [matrix[0], matrix[1], matrix[3], matrix[4]];
62
+ const widthWithoutRotationApplied = iterator.getFixedPointUnsigned1616Number();
63
+ const heightWithoutRotationApplied = iterator.getFixedPointSigned1616Number();
64
+ const { width, height } = applyRotation({
65
+ matrix: rotationMatrix,
66
+ width: widthWithoutRotationApplied,
67
+ height: heightWithoutRotationApplied,
68
+ });
69
+ const rotation = getRotationAngleFromMatrix(rotationMatrix);
46
70
  return {
47
71
  offset,
48
72
  boxSize: size,
@@ -58,6 +82,9 @@ const parseTkhd = ({ iterator, offset, size, }) => {
58
82
  width,
59
83
  height,
60
84
  version,
85
+ rotation,
86
+ unrotatedWidth: widthWithoutRotationApplied,
87
+ unrotatedHeight: heightWithoutRotationApplied,
61
88
  };
62
89
  };
63
90
  exports.parseTkhd = parseTkhd;
@@ -1,12 +1,14 @@
1
1
  import type { BufferIterator } from '../../../buffer-iterator';
2
2
  import type { AnySegment } from '../../../parse-result';
3
+ import type { ParserContext } from '../../../parser-context';
3
4
  import type { BaseBox } from '../base-type';
4
5
  export interface TrakBox extends BaseBox {
5
6
  type: 'trak-box';
6
7
  children: AnySegment[];
7
8
  }
8
- export declare const parseTrak: ({ data, size, offsetAtStart, }: {
9
+ export declare const parseTrak: ({ data, size, offsetAtStart, options, }: {
9
10
  data: BufferIterator;
10
11
  size: number;
11
12
  offsetAtStart: number;
12
- }) => TrakBox;
13
+ options: ParserContext;
14
+ }) => Promise<TrakBox>;
@@ -2,12 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseTrak = void 0;
4
4
  const process_box_1 = require("../process-box");
5
- const parseTrak = ({ data, size, offsetAtStart, }) => {
6
- const children = (0, process_box_1.parseBoxes)({
5
+ const parseTrak = async ({ data, size, offsetAtStart, options, }) => {
6
+ const children = await (0, process_box_1.parseBoxes)({
7
7
  iterator: data,
8
8
  maxBytes: size - (data.counter.getOffset() - offsetAtStart),
9
9
  allowIncompleteBoxes: false,
10
10
  initialBoxes: [],
11
+ options,
12
+ continueMdat: false,
11
13
  });
12
14
  if (children.status === 'incomplete') {
13
15
  throw new Error('Incomplete boxes are not allowed');
@@ -0,0 +1,4 @@
1
+ export interface VoidBox {
2
+ type: 'void-box';
3
+ boxSize: number;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const allowedPartialSegments: string[];
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allowedPartialSegments = void 0;
4
+ exports.allowedPartialSegments = ['0x1f43b675', '0x18538067'];
@@ -0,0 +1,2 @@
1
+ import type { ColorParameterBox } from '../iso-base-media/stsd/colr';
2
+ export declare const parseAv1PrivateData: (data: Uint8Array, colrAtom: ColorParameterBox | null) => string;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAv1PrivateData = void 0;
4
+ const buffer_iterator_1 = require("../../buffer-iterator");
5
+ const parseAv1PrivateData = (data, colrAtom) => {
6
+ const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(data);
7
+ iterator.startReadingBits();
8
+ if (iterator.getBits(1) !== 1) {
9
+ iterator.destroy();
10
+ throw new Error('Expected av1 private data to be version 1');
11
+ }
12
+ const version = iterator.getBits(7);
13
+ if (version !== 1) {
14
+ iterator.destroy();
15
+ throw new Error(`Expected av1 private data to be version 1, got ${version}`);
16
+ }
17
+ let str = 'av01.';
18
+ // https://aomediacodec.github.io/av1-isobmff/#codecsparam
19
+ const seqProfile = iterator.getBits(3);
20
+ // Profile
21
+ str += seqProfile;
22
+ str += '.';
23
+ const seq_level_idx = iterator.getBits(5);
24
+ const seq_tier_0 = iterator.getBits(1);
25
+ // Level
26
+ // The level parameter value SHALL equal the first level value indicated by seq_level_idx in the Sequence Header OBU
27
+ str += seq_level_idx.toString(16).padStart(2, '0');
28
+ str += seq_tier_0 ? 'H' : 'M';
29
+ str += '.';
30
+ // bitDepth
31
+ // The bitDepth parameter value SHALL equal the value of BitDepth variable as defined in [AV1] derived from the Sequence Header OBU
32
+ const high_bitdepth = iterator.getBits(1);
33
+ const twelve_bit = iterator.getBits(1);
34
+ const bitDepth = high_bitdepth && seqProfile === 2
35
+ ? twelve_bit
36
+ ? 12
37
+ : 10
38
+ : high_bitdepth
39
+ ? 10
40
+ : 8;
41
+ str += bitDepth.toString().padStart(2, '0');
42
+ str += '.';
43
+ // monochrome
44
+ // The monochrome parameter value, represented by a single digit decimal, SHALL equal the value of mono_chrome in the Sequence Header OBU
45
+ const mono_chrome = iterator.getBits(1);
46
+ str += mono_chrome ? '1' : '0';
47
+ str += '.';
48
+ // The chromaSubsampling parameter value, represented by a three-digit decimal,
49
+ // SHALL have its first digit equal to subsampling_x
50
+ const subsampling_x = iterator.getBits(1);
51
+ str += subsampling_x ? '1' : '0';
52
+ // and its second digit equal to subsampling_y.
53
+ const subsampling_y = iterator.getBits(1);
54
+ str += subsampling_y ? '1' : '0';
55
+ // If both subsampling_x and subsampling_y are set to 1, then the third digit SHALL be equal to chroma_sample_position, otherwise it SHALL be set to 0
56
+ const chroma_sample_position = iterator.getBits(2);
57
+ str +=
58
+ subsampling_x && subsampling_y
59
+ ? chroma_sample_position === 1
60
+ ? '1'
61
+ : '0'
62
+ : '0';
63
+ str += '.';
64
+ if (colrAtom) {
65
+ str += colrAtom.primaries.toString().padStart(2, '0');
66
+ str += '.';
67
+ str += colrAtom.transfer.toString().padStart(2, '0');
68
+ str += '.';
69
+ str += colrAtom.matrixIndex.toString().padStart(2, '0');
70
+ str += '.';
71
+ str += colrAtom.fullRangeFlag ? '1' : '0';
72
+ }
73
+ else {
74
+ // Otherwise, the color_description_present_flag is set to 0 in the Sequence Header OBU. The colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHOULD be set to the default values below.
75
+ // colorPrimaries 01 (ITU-R BT.709)
76
+ str += '01';
77
+ str += '.';
78
+ // transferCharacteristics 01 (ITU-R BT.709)
79
+ str += '01';
80
+ str += '.';
81
+ // matrixCoefficients 00 (ITU-R BT.709)
82
+ str += '01';
83
+ str += '.';
84
+ // videoFullRangeFlag 0 (studio swing representation)
85
+ str += '0';
86
+ }
87
+ // If the codecs parameter string ends with ".0.110.01.01.01.0" (containing all the default values below), that trailing part of the string SHOULD be omitted.
88
+ const suffix = '.0.110.01.01.01.0';
89
+ if (str.endsWith(suffix)) {
90
+ str = str.slice(0, -suffix.length);
91
+ }
92
+ iterator.destroy();
93
+ return str;
94
+ };
95
+ exports.parseAv1PrivateData = parseAv1PrivateData;
@@ -0,0 +1,14 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ import type { Av1BitstreamHeaderSegment } from './header-segment';
3
+ type FrameType = 'key' | 'delta' | 'intra' | 'switch';
4
+ export type Av1FrameHeader = {
5
+ type: 'av1-frame-header';
6
+ frameType: FrameType;
7
+ temporalPointInfo: number | null;
8
+ };
9
+ export declare const getFrameType: (frameType: number) => FrameType;
10
+ export declare const parseAv1FrameHeader: ({ stream, headerSegment, }: {
11
+ stream: BufferIterator;
12
+ headerSegment: Av1BitstreamHeaderSegment;
13
+ }) => Av1FrameHeader;
14
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAv1FrameHeader = exports.getFrameType = void 0;
4
+ const temporal_point_info_1 = require("./temporal-point-info");
5
+ const getFrameType = (frameType) => {
6
+ switch (frameType) {
7
+ case 0:
8
+ return 'key';
9
+ case 1:
10
+ return 'delta';
11
+ case 2:
12
+ return 'intra';
13
+ case 3:
14
+ return 'switch';
15
+ default:
16
+ throw new Error('Unknown frame type');
17
+ }
18
+ };
19
+ exports.getFrameType = getFrameType;
20
+ // https://aomediacodec.github.io/av1-spec/#uncompressed-header-syntax
21
+ // Only implmementing to get the basic stuff
22
+ const parseAv1FrameHeader = ({ stream, headerSegment, }) => {
23
+ var _a, _b;
24
+ if (headerSegment.reduced_still_picture_header) {
25
+ return {
26
+ type: 'av1-frame-header',
27
+ frameType: 'key',
28
+ temporalPointInfo: null,
29
+ };
30
+ }
31
+ let temporalPointInfo = null;
32
+ const show_existing_frame = Boolean(stream.getBits(1));
33
+ if (show_existing_frame) {
34
+ const frame_to_show_map_idx = stream.getBits(3);
35
+ if (headerSegment.decoder_model_info &&
36
+ !((_a = headerSegment.timing_info) === null || _a === void 0 ? void 0 : _a.equal_picture_interval)) {
37
+ temporalPointInfo = (0, temporal_point_info_1.getTemporalPointInfo)({
38
+ stream,
39
+ frame_presentation_time_length_minus_1: headerSegment.decoder_model_info
40
+ .frame_presentation_time_length_minus_1,
41
+ });
42
+ }
43
+ // TODO: this is wrong, there should be a store
44
+ const frame_type = (0, exports.getFrameType)(frame_to_show_map_idx);
45
+ return {
46
+ type: 'av1-frame-header',
47
+ frameType: frame_type,
48
+ temporalPointInfo,
49
+ };
50
+ }
51
+ const frameType = (0, exports.getFrameType)(stream.getBits(2));
52
+ const showFrame = Boolean(stream.getBits(1));
53
+ if (showFrame &&
54
+ headerSegment.decoder_model_info &&
55
+ !((_b = headerSegment.timing_info) === null || _b === void 0 ? void 0 : _b.equal_picture_interval)) {
56
+ temporalPointInfo = (0, temporal_point_info_1.getTemporalPointInfo)({
57
+ stream,
58
+ frame_presentation_time_length_minus_1: headerSegment.decoder_model_info.frame_presentation_time_length_minus_1,
59
+ });
60
+ }
61
+ return {
62
+ type: 'av1-frame-header',
63
+ frameType,
64
+ temporalPointInfo,
65
+ };
66
+ };
67
+ exports.parseAv1FrameHeader = parseAv1FrameHeader;
@@ -0,0 +1,11 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ import { type Av1FrameHeader } from './bitstream-frame-header';
3
+ import type { Av1BitstreamHeaderSegment } from './header-segment';
4
+ export type Av1Frame = {
5
+ type: 'av1-frame';
6
+ header: Av1FrameHeader;
7
+ };
8
+ export declare const parseAv1Frame: ({ stream, headerSegment, }: {
9
+ stream: BufferIterator;
10
+ headerSegment: Av1BitstreamHeaderSegment;
11
+ }) => Av1Frame;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseAv1Frame = void 0;
4
+ const bitstream_frame_header_1 = require("./bitstream-frame-header");
5
+ const parseAv1Frame = ({ stream, headerSegment, }) => {
6
+ return {
7
+ type: 'av1-frame',
8
+ header: (0, bitstream_frame_header_1.parseAv1FrameHeader)({
9
+ stream,
10
+ headerSegment,
11
+ }),
12
+ };
13
+ };
14
+ exports.parseAv1Frame = parseAv1Frame;
@@ -0,0 +1,6 @@
1
+ export declare const chromaSamplePositions: {
2
+ CSP_UNKNOWN: number;
3
+ CSP_VERTICAL: number;
4
+ CSP_COLOCATED: number;
5
+ CSP_RESERVED: number;
6
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.chromaSamplePositions = void 0;
4
+ exports.chromaSamplePositions = {
5
+ CSP_UNKNOWN: 0,
6
+ CSP_VERTICAL: 1,
7
+ CSP_COLOCATED: 2,
8
+ CSP_RESERVED: 3,
9
+ };
@@ -0,0 +1,16 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export type ColorConfig = {
3
+ bitDepth: number;
4
+ numPlanes: number;
5
+ color_primaries: number;
6
+ transfer_characteristics: number;
7
+ matrix_coefficients: number;
8
+ separate_uv_delta_q: number;
9
+ color_range: boolean;
10
+ subsampling_x: boolean;
11
+ subsampling_y: boolean;
12
+ chroma_sample_position: number;
13
+ mono_chrome: boolean;
14
+ color_description_present_flag: boolean;
15
+ };
16
+ export declare const getColorConfig: (stream: BufferIterator, seq_profile: number) => ColorConfig;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getColorConfig = void 0;
4
+ const chroma_sample_position_1 = require("./chroma-sample-position");
5
+ const color_primaries_1 = require("./color-primaries");
6
+ const matrix_coefficients_1 = require("./matrix-coefficients");
7
+ const transfer_characteristics_1 = require("./transfer-characteristics");
8
+ const getColorConfig = (stream, seq_profile) => {
9
+ const high_bitdepth = Boolean(stream.getBits(1));
10
+ let bitDepth = 0;
11
+ if (seq_profile === 2 && high_bitdepth) {
12
+ const twelve_bit = Boolean(stream.getBits(1));
13
+ bitDepth = twelve_bit ? 12 : 10;
14
+ }
15
+ else if (seq_profile <= 2) {
16
+ bitDepth = high_bitdepth ? 10 : 8;
17
+ }
18
+ const mono_chrome = seq_profile === 1 ? true : Boolean(stream.getBits(1));
19
+ const numPlanes = mono_chrome ? 1 : 3;
20
+ const color_description_present_flag = Boolean(stream.getBits(1));
21
+ const color_primaries = color_description_present_flag
22
+ ? stream.getBits(8)
23
+ : color_primaries_1.colorPrimaries.CP_UNSPECIFIED;
24
+ const transfer_characteristics = color_description_present_flag
25
+ ? stream.getBits(8)
26
+ : transfer_characteristics_1.transferCharacteristics.TC_UNSPECIFIED;
27
+ const matrix_coefficients = color_description_present_flag
28
+ ? stream.getBits(8)
29
+ : matrix_coefficients_1.matrixCoefficients.MC_UNSPECIFIED;
30
+ let chroma_sample_position = chroma_sample_position_1.chromaSamplePositions.CSP_UNKNOWN;
31
+ let color_range = false;
32
+ let subsampling_x = false;
33
+ let subsampling_y = false;
34
+ if (mono_chrome) {
35
+ color_range = Boolean(stream.getBits(1));
36
+ subsampling_x = true;
37
+ subsampling_y = true;
38
+ return {
39
+ bitDepth,
40
+ numPlanes,
41
+ color_primaries,
42
+ transfer_characteristics,
43
+ matrix_coefficients,
44
+ separate_uv_delta_q: 0,
45
+ color_range,
46
+ subsampling_x,
47
+ subsampling_y,
48
+ chroma_sample_position,
49
+ mono_chrome,
50
+ color_description_present_flag,
51
+ };
52
+ }
53
+ if (color_primaries === color_primaries_1.colorPrimaries.CP_BT_709 &&
54
+ transfer_characteristics === transfer_characteristics_1.transferCharacteristics.TC_SRGB &&
55
+ matrix_coefficients === matrix_coefficients_1.matrixCoefficients.MC_IDENTITY) {
56
+ color_range = true;
57
+ subsampling_x = false;
58
+ subsampling_y = false;
59
+ }
60
+ else {
61
+ color_range = Boolean(stream.getBits(1));
62
+ if (seq_profile === 0) {
63
+ subsampling_x = true;
64
+ subsampling_y = true;
65
+ }
66
+ else if (seq_profile === 1) {
67
+ subsampling_x = false;
68
+ subsampling_y = false;
69
+ }
70
+ else if (bitDepth === 12) {
71
+ subsampling_x = Boolean(stream.getBits(1));
72
+ if (subsampling_x) {
73
+ subsampling_y = Boolean(stream.getBits(1));
74
+ }
75
+ else {
76
+ subsampling_y = false;
77
+ }
78
+ }
79
+ else {
80
+ subsampling_x = true;
81
+ subsampling_y = false;
82
+ }
83
+ if (subsampling_x && subsampling_y) {
84
+ chroma_sample_position = stream.getBits(2);
85
+ }
86
+ }
87
+ const separate_uv_delta_q = stream.getBits(1);
88
+ return {
89
+ bitDepth,
90
+ numPlanes,
91
+ color_primaries,
92
+ transfer_characteristics,
93
+ matrix_coefficients,
94
+ separate_uv_delta_q,
95
+ chroma_sample_position,
96
+ color_range,
97
+ subsampling_x,
98
+ subsampling_y,
99
+ mono_chrome,
100
+ color_description_present_flag,
101
+ };
102
+ };
103
+ exports.getColorConfig = getColorConfig;
@@ -0,0 +1,14 @@
1
+ export declare const colorPrimaries: {
2
+ CP_BT_709: number;
3
+ CP_UNSPECIFIED: number;
4
+ CP_BT_470_M: number;
5
+ CP_BT_470_B_G: number;
6
+ CP_BT_601: number;
7
+ CP_SMPTE_240: number;
8
+ CP_GENERIC_FILM: number;
9
+ CP_BT_2020: number;
10
+ CP_XYZ: number;
11
+ CP_SMPTE_431: number;
12
+ CP_SMPTE_432: number;
13
+ CP_EBU_3213: number;
14
+ };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.colorPrimaries = void 0;
4
+ exports.colorPrimaries = {
5
+ CP_BT_709: 1,
6
+ CP_UNSPECIFIED: 2,
7
+ CP_BT_470_M: 4,
8
+ CP_BT_470_B_G: 5,
9
+ CP_BT_601: 6,
10
+ CP_SMPTE_240: 7,
11
+ CP_GENERIC_FILM: 8,
12
+ CP_BT_2020: 9,
13
+ CP_XYZ: 10,
14
+ CP_SMPTE_431: 11,
15
+ CP_SMPTE_432: 12,
16
+ CP_EBU_3213: 22,
17
+ };
@@ -0,0 +1,9 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ export type DecoderModelInfo = {
3
+ type: 'decoder-model-info';
4
+ buffer_delay_length_minus_1: number;
5
+ num_units_in_decoding_tick: number;
6
+ buffer_removal_time_length_minus_1: number;
7
+ frame_presentation_time_length_minus_1: number;
8
+ };
9
+ export declare const parseDecoderModelInfo: (stream: BufferIterator) => DecoderModelInfo;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDecoderModelInfo = void 0;
4
+ const parseDecoderModelInfo = (stream) => {
5
+ const buffer_delay_length_minus_1 = stream.getBits(5);
6
+ const num_units_in_decoding_tick = stream.getBits(32);
7
+ const buffer_removal_time_length_minus_1 = stream.getBits(5);
8
+ const frame_presentation_time_length_minus_1 = stream.getBits(5);
9
+ return {
10
+ type: 'decoder-model-info',
11
+ buffer_delay_length_minus_1,
12
+ num_units_in_decoding_tick,
13
+ buffer_removal_time_length_minus_1,
14
+ frame_presentation_time_length_minus_1,
15
+ };
16
+ };
17
+ exports.parseDecoderModelInfo = parseDecoderModelInfo;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,51 @@
1
+ import type { BufferIterator } from '../../../../buffer-iterator';
2
+ import type { ColorConfig } from './color-config';
3
+ import { type DecoderModelInfo } from './decoder-model-info';
4
+ import { type OperatingParametersInfo } from './operating-parameters-info';
5
+ import { type TimingInfo } from './timing-info';
6
+ type SeqLevelIndex = {
7
+ operating_point_idc: number;
8
+ seq_level_idx: number;
9
+ seq_tier: number;
10
+ };
11
+ export type Av1BitstreamHeaderSegment = {
12
+ type: 'av1-bitstream-header';
13
+ seq_profile: number;
14
+ still_picture: boolean;
15
+ reduced_still_picture_header: boolean;
16
+ timing_info_present_flag: boolean;
17
+ decoder_model_info_present_flag: boolean;
18
+ initial_display_delay_present_flag: boolean;
19
+ operating_points_cnt_minus_1: number;
20
+ seq_level: SeqLevelIndex[];
21
+ timing_info: TimingInfo | null;
22
+ decoder_model_info: DecoderModelInfo | null;
23
+ operating_parameters_info: OperatingParametersInfo[];
24
+ initial_display_delay_minus_1: number[];
25
+ frame_width_bits_minus_1: number;
26
+ frame_height_bits_minus_1: number;
27
+ max_frame_width_minus_1: number;
28
+ max_frame_height_minus_1: number;
29
+ delta_frame_id_length_minus_2: number | null;
30
+ additional_frame_id_length_minus_1: number | null;
31
+ use_128x128_superblock: boolean;
32
+ enable_filter_intra: boolean;
33
+ enable_intra_edge_filter: boolean;
34
+ color_config: ColorConfig;
35
+ film_grain_params_present: boolean;
36
+ enable_interintra_compound: number;
37
+ enable_masked_compound: number;
38
+ enable_warped_motion: number;
39
+ enable_order_hint: number;
40
+ enable_dual_filter: number;
41
+ enable_jnt_comp: boolean;
42
+ enable_ref_frame_mvs: boolean;
43
+ seq_force_screen_content_tools: number;
44
+ seq_force_integer_mv: number;
45
+ enable_superres: boolean;
46
+ enable_cdef: boolean;
47
+ enable_restoration: boolean;
48
+ orderHintBits: number;
49
+ };
50
+ export declare const parseAv1BitstreamHeaderSegment: (stream: BufferIterator) => Av1BitstreamHeaderSegment;
51
+ export {};