@remotion/media-parser 4.0.191

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 (143) hide show
  1. package/.eslintrc +8 -0
  2. package/LICENSE.md +49 -0
  3. package/README.md +18 -0
  4. package/dist/boxes/iso-base-media/base-type.d.ts +4 -0
  5. package/dist/boxes/iso-base-media/base-type.js +2 -0
  6. package/dist/boxes/iso-base-media/ftyp.d.ts +13 -0
  7. package/dist/boxes/iso-base-media/ftyp.js +22 -0
  8. package/dist/boxes/iso-base-media/moov/moov.d.ts +12 -0
  9. package/dist/boxes/iso-base-media/moov/moov.js +22 -0
  10. package/dist/boxes/iso-base-media/mvhd.d.ts +30 -0
  11. package/dist/boxes/iso-base-media/mvhd.js +59 -0
  12. package/dist/boxes/iso-base-media/process-box.d.ts +8 -0
  13. package/dist/boxes/iso-base-media/process-box.js +174 -0
  14. package/dist/boxes/iso-base-media/stsd/keys.d.ts +5 -0
  15. package/dist/boxes/iso-base-media/stsd/keys.js +21 -0
  16. package/dist/boxes/iso-base-media/stsd/mebx.d.ts +14 -0
  17. package/dist/boxes/iso-base-media/stsd/mebx.js +27 -0
  18. package/dist/boxes/iso-base-media/stsd/samples.d.ts +48 -0
  19. package/dist/boxes/iso-base-media/stsd/samples.js +215 -0
  20. package/dist/boxes/iso-base-media/stsd/stsd.d.ts +13 -0
  21. package/dist/boxes/iso-base-media/stsd/stsd.js +26 -0
  22. package/dist/boxes/iso-base-media/stts/stts.d.ts +15 -0
  23. package/dist/boxes/iso-base-media/stts/stts.js +35 -0
  24. package/dist/boxes/iso-base-media/tkhd.d.ts +22 -0
  25. package/dist/boxes/iso-base-media/tkhd.js +63 -0
  26. package/dist/boxes/iso-base-media/to-date.d.ts +1 -0
  27. package/dist/boxes/iso-base-media/to-date.js +11 -0
  28. package/dist/boxes/iso-base-media/trak/trak.d.ts +12 -0
  29. package/dist/boxes/iso-base-media/trak/trak.js +22 -0
  30. package/dist/boxes/webm/parse-webm-header.d.ts +3 -0
  31. package/dist/boxes/webm/parse-webm-header.js +16 -0
  32. package/dist/boxes/webm/segments/duration.d.ts +6 -0
  33. package/dist/boxes/webm/segments/duration.js +15 -0
  34. package/dist/boxes/webm/segments/info.d.ts +8 -0
  35. package/dist/boxes/webm/segments/info.js +14 -0
  36. package/dist/boxes/webm/segments/main.d.ts +7 -0
  37. package/dist/boxes/webm/segments/main.js +13 -0
  38. package/dist/boxes/webm/segments/muxing.d.ts +6 -0
  39. package/dist/boxes/webm/segments/muxing.js +12 -0
  40. package/dist/boxes/webm/segments/parse-children.d.ts +3 -0
  41. package/dist/boxes/webm/segments/parse-children.js +17 -0
  42. package/dist/boxes/webm/segments/seek-head.d.ts +8 -0
  43. package/dist/boxes/webm/segments/seek-head.js +13 -0
  44. package/dist/boxes/webm/segments/seek-position.d.ts +6 -0
  45. package/dist/boxes/webm/segments/seek-position.js +12 -0
  46. package/dist/boxes/webm/segments/seek.d.ts +8 -0
  47. package/dist/boxes/webm/segments/seek.js +16 -0
  48. package/dist/boxes/webm/segments/timestamp-scale.d.ts +6 -0
  49. package/dist/boxes/webm/segments/timestamp-scale.js +11 -0
  50. package/dist/boxes/webm/segments/track-entry.d.ts +71 -0
  51. package/dist/boxes/webm/segments/track-entry.js +175 -0
  52. package/dist/boxes/webm/segments/tracks.d.ts +7 -0
  53. package/dist/boxes/webm/segments/tracks.js +13 -0
  54. package/dist/boxes/webm/segments/unknown.d.ts +6 -0
  55. package/dist/boxes/webm/segments/unknown.js +11 -0
  56. package/dist/boxes/webm/segments/void.d.ts +6 -0
  57. package/dist/boxes/webm/segments/void.js +12 -0
  58. package/dist/boxes/webm/segments/writing.d.ts +6 -0
  59. package/dist/boxes/webm/segments/writing.js +12 -0
  60. package/dist/boxes/webm/segments.d.ts +16 -0
  61. package/dist/boxes/webm/segments.js +106 -0
  62. package/dist/buffer-iterator.d.ts +36 -0
  63. package/dist/buffer-iterator.js +263 -0
  64. package/dist/from-node.d.ts +2 -0
  65. package/dist/from-node.js +19 -0
  66. package/dist/from-web.d.ts +2 -0
  67. package/dist/from-web.js +40 -0
  68. package/dist/get-dimensions.d.ts +7 -0
  69. package/dist/get-dimensions.js +104 -0
  70. package/dist/get-duration.d.ts +3 -0
  71. package/dist/get-duration.js +61 -0
  72. package/dist/get-fps.d.ts +3 -0
  73. package/dist/get-fps.js +70 -0
  74. package/dist/has-all-info.d.ts +3 -0
  75. package/dist/has-all-info.js +27 -0
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.js +5 -0
  78. package/dist/options.d.ts +19 -0
  79. package/dist/options.js +2 -0
  80. package/dist/parse-media.d.ts +2 -0
  81. package/dist/parse-media.js +44 -0
  82. package/dist/parse-result.d.ts +29 -0
  83. package/dist/parse-result.js +2 -0
  84. package/dist/parse-video.d.ts +10 -0
  85. package/dist/parse-video.js +29 -0
  86. package/dist/reader.d.ts +7 -0
  87. package/dist/reader.js +2 -0
  88. package/package.json +47 -0
  89. package/src/boxes/iso-base-media/base-type.ts +4 -0
  90. package/src/boxes/iso-base-media/ftyp.ts +39 -0
  91. package/src/boxes/iso-base-media/moov/moov.ts +37 -0
  92. package/src/boxes/iso-base-media/mvhd.ts +107 -0
  93. package/src/boxes/iso-base-media/process-box.ts +236 -0
  94. package/src/boxes/iso-base-media/stsd/keys.ts +25 -0
  95. package/src/boxes/iso-base-media/stsd/mebx.ts +46 -0
  96. package/src/boxes/iso-base-media/stsd/samples.ts +298 -0
  97. package/src/boxes/iso-base-media/stsd/stsd.ts +48 -0
  98. package/src/boxes/iso-base-media/stts/stts.ts +62 -0
  99. package/src/boxes/iso-base-media/tkhd.ts +105 -0
  100. package/src/boxes/iso-base-media/to-date.ts +9 -0
  101. package/src/boxes/iso-base-media/trak/trak.ts +37 -0
  102. package/src/boxes/webm/parse-webm-header.ts +18 -0
  103. package/src/boxes/webm/segments/duration.ts +22 -0
  104. package/src/boxes/webm/segments/info.ts +20 -0
  105. package/src/boxes/webm/segments/main.ts +19 -0
  106. package/src/boxes/webm/segments/muxing.ts +18 -0
  107. package/src/boxes/webm/segments/parse-children.ts +21 -0
  108. package/src/boxes/webm/segments/seek-head.ts +21 -0
  109. package/src/boxes/webm/segments/seek-position.ts +19 -0
  110. package/src/boxes/webm/segments/seek.ts +23 -0
  111. package/src/boxes/webm/segments/timestamp-scale.ts +17 -0
  112. package/src/boxes/webm/segments/track-entry.ts +295 -0
  113. package/src/boxes/webm/segments/tracks.ts +22 -0
  114. package/src/boxes/webm/segments/unknown.ts +19 -0
  115. package/src/boxes/webm/segments/void.ts +16 -0
  116. package/src/boxes/webm/segments/writing.ts +18 -0
  117. package/src/boxes/webm/segments.ts +206 -0
  118. package/src/buffer-iterator.ts +305 -0
  119. package/src/from-node.ts +22 -0
  120. package/src/from-web.ts +53 -0
  121. package/src/get-dimensions.ts +147 -0
  122. package/src/get-duration.ts +73 -0
  123. package/src/get-fps.ts +92 -0
  124. package/src/has-all-info.ts +34 -0
  125. package/src/index.ts +1 -0
  126. package/src/options.ts +38 -0
  127. package/src/parse-media.ts +57 -0
  128. package/src/parse-result.ts +44 -0
  129. package/src/parse-video.ts +41 -0
  130. package/src/reader.ts +10 -0
  131. package/src/test/duration.test.ts +34 -0
  132. package/src/test/keys.test.ts +47 -0
  133. package/src/test/matroska.test.ts +163 -0
  134. package/src/test/mvhd.test.ts +89 -0
  135. package/src/test/parse-stts.test.ts +38 -0
  136. package/src/test/parse-video.test.ts +113 -0
  137. package/src/test/parse-webm.test.ts +15 -0
  138. package/src/test/stream-local.test.ts +105 -0
  139. package/src/test/stream-remote.test.ts +12 -0
  140. package/src/test/stsd.test.ts +162 -0
  141. package/src/test/tkhd.test.ts +84 -0
  142. package/tsconfig.json +10 -0
  143. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,113 @@
1
+ import {RenderInternals} from '@remotion/renderer';
2
+ import {expect, test} from 'bun:test';
3
+ import {nodeReader} from '../from-node';
4
+ import {parseMedia} from '../parse-media';
5
+
6
+ test('Parse Big Buck bunny', async () => {
7
+ const data = await parseMedia(
8
+ RenderInternals.exampleVideos.bigBuckBunny,
9
+ {
10
+ boxes: true,
11
+ },
12
+ nodeReader,
13
+ );
14
+ expect(data.boxes.slice(0, 2)).toEqual([
15
+ {
16
+ offset: 0,
17
+ boxSize: 32,
18
+ type: 'ftyp-box',
19
+ majorBrand: 'isom',
20
+ minorVersion: 512,
21
+ compatibleBrands: ['isom', 'iso2', 'avc1', 'mp41'],
22
+ },
23
+ {
24
+ offset: 32,
25
+ boxSize: 8,
26
+ boxType: 'free',
27
+ type: 'regular-box',
28
+ children: [],
29
+ },
30
+ ]);
31
+ });
32
+
33
+ test('Parse an iPhone video', async () => {
34
+ const data = await parseMedia(
35
+ RenderInternals.exampleVideos.iphonevideo,
36
+ {durationInSeconds: true, dimensions: true},
37
+ nodeReader,
38
+ );
39
+
40
+ expect(data.durationInSeconds).toBe(12.568333333333333);
41
+ expect(data.dimensions).toEqual({
42
+ width: 3840,
43
+ height: 2160,
44
+ });
45
+ });
46
+
47
+ test('Parse framer', async () => {
48
+ const parsed = await parseMedia(
49
+ RenderInternals.exampleVideos.framerWithoutFileExtension,
50
+ {
51
+ boxes: true,
52
+ },
53
+ nodeReader,
54
+ );
55
+ expect(parsed.boxes.slice(0, 2)).toEqual([
56
+ {
57
+ offset: 0,
58
+ boxSize: 32,
59
+ compatibleBrands: ['isom', 'iso2', 'avc1', 'mp41'],
60
+ majorBrand: 'isom',
61
+ minorVersion: 512,
62
+ type: 'ftyp-box',
63
+ },
64
+ {
65
+ offset: 32,
66
+ boxSize: 8,
67
+ boxType: 'free',
68
+ type: 'regular-box',
69
+ children: [],
70
+ },
71
+ ]);
72
+ });
73
+
74
+ test('Parse a full video', async () => {
75
+ const data = await parseMedia(
76
+ RenderInternals.exampleVideos.framer24fps,
77
+ {boxes: true},
78
+ nodeReader,
79
+ );
80
+ if (!data) throw new Error('No data');
81
+
82
+ const [first, second, third] = data.boxes;
83
+
84
+ expect(first).toEqual({
85
+ offset: 0,
86
+ boxSize: 32,
87
+ type: 'ftyp-box',
88
+ majorBrand: 'isom',
89
+ minorVersion: 512,
90
+ compatibleBrands: ['isom', 'iso2', 'avc1', 'mp41'],
91
+ });
92
+ expect(second).toEqual({
93
+ offset: 32,
94
+ boxType: 'free',
95
+ boxSize: 8,
96
+ type: 'regular-box',
97
+ children: [],
98
+ });
99
+ expect(third).toEqual({
100
+ offset: 40,
101
+ boxSize: 57014,
102
+ boxType: 'mdat',
103
+ children: [],
104
+ type: 'regular-box',
105
+ });
106
+ });
107
+
108
+ test('Should warn if missing node reader', () => {
109
+ const data = parseMedia(RenderInternals.exampleVideos.framer24fps, {
110
+ boxes: true,
111
+ });
112
+ expect(data).rejects.toThrow(/node/);
113
+ });
@@ -0,0 +1,15 @@
1
+ import {RenderInternals} from '@remotion/renderer';
2
+ import {expect, test} from 'bun:test';
3
+ import {nodeReader} from '../from-node';
4
+ import {parseMedia} from '../parse-media';
5
+
6
+ test('should be able to parse a WebM', async () => {
7
+ const webm = await parseMedia(
8
+ RenderInternals.exampleVideos.transparentWebm,
9
+ {
10
+ durationInSeconds: true,
11
+ },
12
+ nodeReader,
13
+ );
14
+ expect(webm.durationInSeconds).toBe(5);
15
+ });
@@ -0,0 +1,105 @@
1
+ import {RenderInternals} from '@remotion/renderer';
2
+ import {expect, test} from 'bun:test';
3
+ import {nodeReader} from '../from-node';
4
+ import {parseMedia} from '../parse-media';
5
+
6
+ test('Should stream ISO base media', async () => {
7
+ const result = await parseMedia(
8
+ RenderInternals.exampleVideos.iphonevideo,
9
+ {
10
+ durationInSeconds: true,
11
+ fps: true,
12
+ },
13
+ nodeReader,
14
+ );
15
+ expect(result.durationInSeconds).toBe(12.568333333333333);
16
+ expect(result.fps).toBe(29.99602174777881);
17
+ });
18
+
19
+ test('Should stream WebM with no duration', async () => {
20
+ const result = await parseMedia(
21
+ RenderInternals.exampleVideos.nofps,
22
+ {fps: true, durationInSeconds: true, dimensions: true},
23
+ nodeReader,
24
+ );
25
+ expect(result.durationInSeconds).toBe(6.57);
26
+ expect(result.dimensions).toEqual({
27
+ width: 1470,
28
+ height: 690,
29
+ });
30
+ expect(result.fps).toBeDefined();
31
+ });
32
+
33
+ test('Should stream AV1 with no duration', async () => {
34
+ const parsed = await parseMedia(
35
+ RenderInternals.exampleVideos.av1,
36
+ {
37
+ durationInSeconds: true,
38
+ dimensions: true,
39
+ fps: true,
40
+ },
41
+ nodeReader,
42
+ );
43
+
44
+ expect(parsed.durationInSeconds).toBe(1);
45
+ expect(parsed.fps).toBe(null);
46
+ expect(parsed.dimensions).toEqual({
47
+ width: 1920,
48
+ height: 1080,
49
+ });
50
+ });
51
+
52
+ test('Should stream corrupted video', async () => {
53
+ const parsed = await parseMedia(
54
+ RenderInternals.exampleVideos.corrupted,
55
+ {
56
+ durationInSeconds: true,
57
+ dimensions: true,
58
+ fps: true,
59
+ },
60
+ nodeReader,
61
+ );
62
+
63
+ expect(parsed.durationInSeconds).toBe(30.03);
64
+ expect(parsed.fps).toBe(23.976023976023978);
65
+ expect(parsed.dimensions).toEqual({
66
+ width: 1920,
67
+ height: 1080,
68
+ });
69
+ });
70
+
71
+ test('Should stream screen recording video', async () => {
72
+ const parsed = await parseMedia(
73
+ RenderInternals.exampleVideos.screenrecording,
74
+ {
75
+ durationInSeconds: true,
76
+ dimensions: true,
77
+ fps: true,
78
+ },
79
+ nodeReader,
80
+ );
81
+
82
+ expect(parsed.durationInSeconds).toBe(5.866666666666666);
83
+ expect(parsed.fps).toBe(58.98305084745763);
84
+ expect(parsed.dimensions).toEqual({
85
+ height: 1766,
86
+ width: 2874,
87
+ });
88
+ });
89
+ test('Should stream ProRes video', async () => {
90
+ const parsed = await parseMedia(
91
+ RenderInternals.exampleVideos.prores,
92
+ {
93
+ fps: true,
94
+ dimensions: true,
95
+ durationInSeconds: true,
96
+ },
97
+ nodeReader,
98
+ );
99
+
100
+ // TODO: FPS should be 60
101
+ expect(parsed.fps).toBe(3.90625);
102
+ expect(parsed.dimensions.width).toBe(1920);
103
+ expect(parsed.dimensions.height).toBe(1080);
104
+ expect(parsed.durationInSeconds).toBe(0.034);
105
+ });
@@ -0,0 +1,12 @@
1
+ import {expect, test} from 'bun:test';
2
+ import {parseMedia} from '../parse-media';
3
+
4
+ test('Should stream', async () => {
5
+ const result = await parseMedia(
6
+ 'https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_1MB.mp4',
7
+ {
8
+ durationInSeconds: true,
9
+ },
10
+ );
11
+ expect(result.durationInSeconds).toBe(10);
12
+ });
@@ -0,0 +1,162 @@
1
+ import {expect, test} from 'bun:test';
2
+ import {processSample} from '../boxes/iso-base-media/stsd/samples';
3
+ import {parseStsd} from '../boxes/iso-base-media/stsd/stsd';
4
+ import {getArrayBufferIterator} from '../buffer-iterator';
5
+
6
+ test('Should be able to parse a STSD audio box correctly', () => {
7
+ const buffer = Uint8Array.from([
8
+ // box size
9
+ 0, 0, 0, 159,
10
+ // data format "stsd"
11
+ 115, 116, 115, 100,
12
+ // reserved
13
+ 0, 0, 0, 0, 0, 0,
14
+ // number of entries
15
+ 0, 1,
16
+ // size
17
+ 0, 0, 0, 143,
18
+ // "mp4a"
19
+ 109, 112, 52, 97,
20
+ // reserved
21
+ 0, 0, 0, 0, 0, 0,
22
+ // data reference index
23
+ 0, 1,
24
+ // version
25
+ 0, 1,
26
+ // revisioon level
27
+ 0, 0, 0, 0, 0, 0,
28
+ // revision level
29
+ 0, 2, 0, 16, 255, 254, 0, 0, 172, 68, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0,
30
+ 2, 0, 0, 0, 2, 0, 0, 0, 91, 119, 97, 118, 101, 0, 0, 0, 12, 102, 114, 109,
31
+ 97, 109, 112, 52, 97, 0, 0, 0, 12, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0,
32
+ 51, 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 0, 0, 4, 128,
33
+ 128, 128, 20, 64, 20, 0, 24, 0, 0, 2, 238, 0, 0, 0, 0, 0, 5, 128, 128, 128,
34
+ 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 8, 0, 0, 0, 0,
35
+ ]);
36
+
37
+ const iterator = getArrayBufferIterator(buffer);
38
+ iterator.discard(8);
39
+
40
+ const parsed = parseStsd({
41
+ iterator,
42
+ offset: 0,
43
+ size: 159,
44
+ });
45
+
46
+ expect(parsed).toEqual({
47
+ offset: 0,
48
+ boxSize: 159,
49
+ type: 'stsd-box',
50
+ numberOfEntries: 1,
51
+ samples: [
52
+ {
53
+ size: 143,
54
+ offset: 16,
55
+ format: 'mp4a',
56
+ dataReferenceIndex: 1,
57
+ version: 1,
58
+ revisionLevel: 0,
59
+ vendor: [0, 0, 0, 0],
60
+ numberOfChannels: 2,
61
+ type: 'audio',
62
+ sampleSize: 16,
63
+ compressionId: 65534,
64
+ packetSize: 0,
65
+ samplesPerPacket: 0,
66
+ bitsPerSample: 1,
67
+ bytesPerFrame: 0,
68
+ bytesPerPacket: 1024,
69
+ sampleRate: 44100,
70
+ },
71
+ ],
72
+ });
73
+ });
74
+
75
+ test('Should be able to parse a STSD video box correctly', () => {
76
+ const buffer = Uint8Array.from([
77
+ // box size
78
+ 0, 0, 0, 158,
79
+ // data format "avc1"
80
+ 97, 118, 99, 49,
81
+ // padding
82
+ 0, 0, 0, 0, 0, 0,
83
+ // data reference index
84
+ 0, 1,
85
+ // version
86
+ 0, 0,
87
+ // revision level
88
+ 0, 0,
89
+ // vendor
90
+ 0, 0, 0, 0,
91
+ // temporal quality
92
+ 0, 0, 0, 0,
93
+ // spatial quality
94
+ 0, 0, 0, 0,
95
+ // width
96
+ 4, 56,
97
+ // height
98
+ 4, 56,
99
+ // horiz resolution
100
+ 0, 72, 0, 0,
101
+ // vert resolution
102
+ 0, 72, 0, 0,
103
+ // frame count
104
+ 0, 0,
105
+ // compressor name
106
+ // 0
107
+ 0, 0, 0, 1,
108
+ // 1
109
+ 0, 0, 0, 0,
110
+ // 2
111
+ 0, 0, 0, 0,
112
+ // 3
113
+ 0, 0, 0, 0,
114
+ // 4
115
+ 0, 0, 0, 0,
116
+ // 5
117
+ 0, 0, 0, 0,
118
+ // 6
119
+ 0, 0, 0, 0,
120
+ // 7
121
+ 0, 0, 0, 0,
122
+ // 8
123
+ 0, 0, 0, 0,
124
+ // depth
125
+ 0, 24,
126
+ // color space
127
+ 255, 255,
128
+ // avcC info (not parsed)
129
+ 0, 0, 0, 56, 97, 118, 99, 67, 1, 100, 0, 32, 255, 225, 0, 27, 103, 100, 0,
130
+ 32, 172, 217, 64, 68, 2, 39, 150, 92, 4, 64, 0, 0, 3, 0, 64, 0, 0, 12, 3,
131
+ 198, 12, 101, 128, 1, 0, 6, 104, 235, 224, 140, 178, 44, 253, 248, 248, 0,
132
+ 0, 0, 0, 16, 112, 97, 115, 112, 0, 0, 0, 1, 0, 0, 0, 1,
133
+ ]);
134
+
135
+ const parsed = processSample({
136
+ iterator: getArrayBufferIterator(buffer),
137
+ });
138
+ expect(parsed.sample).toEqual({
139
+ size: 158,
140
+ format: 'avc1',
141
+ dataReferenceIndex: 1,
142
+ version: 0,
143
+ revisionLevel: 0,
144
+ vendor: [0, 0, 0, 0],
145
+ type: 'video',
146
+ temporalQuality: 0,
147
+ spacialQuality: 0,
148
+ width: 1080,
149
+ height: 1080,
150
+ horizontalResolutionPpi: 72,
151
+ verticalResolutionPpi: 72,
152
+ dataSize: 0,
153
+ frameCountPerSample: 1,
154
+ compressorName: [
155
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
156
+ 0, 0, 0, 0, 0, 0, 0,
157
+ ],
158
+ offset: 0,
159
+ depth: 24,
160
+ colorTableId: -1,
161
+ });
162
+ });
@@ -0,0 +1,84 @@
1
+ import {expect, test} from 'bun:test';
2
+ import {parseTkhd} from '../boxes/iso-base-media/tkhd';
3
+ import {getArrayBufferIterator} from '../buffer-iterator';
4
+
5
+ test('Should be able to parse a TKHD box', () => {
6
+ const buffer = Uint8Array.from([
7
+ // size, 32 bit
8
+ 0, 0, 0, 92,
9
+ // mvhd atom, 32 bit
10
+ 116, 107, 104, 100,
11
+ // version, 8 unsigned bit
12
+ 0,
13
+ // flags, 24 bit
14
+ 0, 0, 15,
15
+ // creation time, 32 bit
16
+ 226, 94, 106, 178,
17
+ // modification time, 32 bit
18
+ 226, 94, 106, 182,
19
+ // track id, 32 bit
20
+ 0, 0, 0, 5,
21
+ // reserved, 32 bit
22
+ 0, 0, 0, 0,
23
+ // duration, 32 bit
24
+ 0, 0, 7, 248,
25
+ // reserved, 32 bit
26
+ 0, 0, 0, 0,
27
+ // reserved, 32 bit
28
+ 0, 0, 0, 0,
29
+ // layer, 16 bit
30
+ 0, 0,
31
+ // alternate group, 16 bit
32
+ 0, 0,
33
+ // volume, 16 bit
34
+ 0, 0,
35
+ // reserved, 16 bit
36
+ 0, 0,
37
+ // matrix[0], 32 bit
38
+ 0, 1, 0, 0,
39
+ // matrix[1], 32 bit
40
+ 0, 0, 0, 0,
41
+ // matrix[2], 32 bit
42
+ 0, 0, 0, 0,
43
+ // matrix[3], 32 bit
44
+ 0, 0, 0, 0,
45
+ // matrix[4], 32 bit
46
+ 0, 1, 0, 0,
47
+ // matrix[5], 32 bit
48
+ 0, 0, 0, 0,
49
+ // matrix[6], 32 bit
50
+ 0, 0, 0, 0,
51
+ // matrix[7], 32 bit
52
+ 0, 0, 0, 0,
53
+ // matrix[8], 32 bit
54
+ 64, 0, 0, 0,
55
+ // width, 32 bit
56
+ 0, 0, 0, 0,
57
+ // height, 32 bit
58
+ 0, 0, 0, 0,
59
+ ]);
60
+
61
+ const iterator = getArrayBufferIterator(buffer);
62
+ iterator.discard(8);
63
+ const mvhd = parseTkhd({
64
+ iterator,
65
+ offset: 0,
66
+ size: 92,
67
+ });
68
+ expect(mvhd).toEqual({
69
+ type: 'tkhd-box',
70
+ boxSize: 92,
71
+ offset: 0,
72
+ alternateGroup: 0,
73
+ creationTime: 1714993714000,
74
+ duration: 2040,
75
+ modificationTime: 1714993718000,
76
+ trackId: 5,
77
+ version: 0,
78
+ layer: 0,
79
+ volume: 0,
80
+ matrix: [65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824],
81
+ width: 0,
82
+ height: 0,
83
+ });
84
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../tsconfig.settings.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "./dist",
6
+ "skipLibCheck": true
7
+ },
8
+ "references": [],
9
+ "include": ["src"]
10
+ }