@remotion/media-parser 4.0.206 → 4.0.207
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.
- package/dist/boxes/iso-base-media/stsd/ctts.js +8 -1
- package/dist/boxes/iso-base-media/stsd/samples.d.ts +6 -3
- package/dist/boxes/iso-base-media/stsd/samples.js +6 -6
- package/dist/boxes/webm/ebml.d.ts +1 -1
- package/dist/boxes/webm/make-header.d.ts +6 -2
- package/dist/boxes/webm/make-header.js +102 -18
- package/dist/boxes/webm/parse-ebml.js +3 -1
- package/dist/boxes/webm/segments/all-segments.d.ts +70 -12
- package/dist/boxes/webm/segments/all-segments.js +43 -5
- package/dist/create/cluster-segment.d.ts +10 -0
- package/dist/create/cluster-segment.js +41 -0
- package/dist/create/create-media.d.ts +13 -0
- package/dist/create/create-media.js +108 -0
- package/dist/create/matroska-header.d.ts +1 -0
- package/dist/create/matroska-header.js +66 -0
- package/dist/create/matroska-info.d.ts +4 -0
- package/dist/create/matroska-info.js +41 -0
- package/dist/create/matroska-segment.d.ts +2 -0
- package/dist/create/matroska-segment.js +12 -0
- package/dist/create/matroska-trackentry.d.ts +32 -0
- package/dist/create/matroska-trackentry.js +266 -0
- package/dist/get-audio-codec.d.ts +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -1
- package/dist/options.d.ts +1 -1
- package/dist/parse-media.js +1 -1
- package/dist/readers/from-fetch.d.ts +2 -0
- package/dist/readers/from-fetch.js +64 -0
- package/dist/readers/from-node.d.ts +2 -0
- package/dist/readers/from-node.js +40 -0
- package/dist/readers/from-web-file.d.ts +2 -0
- package/dist/readers/from-web-file.js +39 -0
- package/dist/readers/reader.d.ts +11 -0
- package/dist/readers/reader.js +2 -0
- package/dist/traversal.d.ts +1 -1
- package/dist/writers/web-fs.d.ts +2 -0
- package/dist/writers/web-fs.js +44 -0
- package/dist/writers/writer.d.ts +11 -0
- package/dist/writers/writer.js +2 -0
- package/package.json +13 -8
- package/src/boxes/iso-base-media/stsd/ctts.ts +10 -1
- package/src/boxes/iso-base-media/stsd/samples.ts +12 -9
- package/src/boxes/webm/make-header.ts +132 -24
- package/src/boxes/webm/parse-ebml.ts +4 -1
- package/src/boxes/webm/segments/all-segments.ts +67 -7
- package/src/create/cluster-segment.ts +62 -0
- package/src/create/create-media.ts +172 -0
- package/src/create/matroska-header.ts +63 -0
- package/src/create/matroska-info.ts +46 -0
- package/src/create/matroska-segment.ts +10 -0
- package/src/create/matroska-trackentry.ts +325 -0
- package/src/index.ts +9 -0
- package/src/options.ts +1 -1
- package/src/parse-media.ts +1 -1
- package/src/test/av1.test.ts +1 -1
- package/src/test/create-matroska.test.ts +31 -6
- package/src/test/duration.test.ts +1 -1
- package/src/test/matroska.test.ts +35 -5
- package/src/test/parse-video.test.ts +1 -1
- package/src/test/parse-webm.test.ts +1 -1
- package/src/test/stream-local.test.ts +1 -1
- package/src/test/stream-samples.test.ts +1 -1
- package/src/writers/web-fs.ts +50 -0
- package/src/writers/writer.ts +12 -0
- package/tsconfig.tsbuildinfo +1 -1
- /package/src/{from-fetch.ts → readers/from-fetch.ts} +0 -0
- /package/src/{from-node.ts → readers/from-node.ts} +0 -0
- /package/src/{from-web-file.ts → readers/from-web-file.ts} +0 -0
- /package/src/{reader.ts → readers/reader.ts} +0 -0
package/src/test/av1.test.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {trakBoxContainsVideo} from '../get-fps';
|
|
5
4
|
import {getAv1CBox} from '../get-sample-aspect-ratio';
|
|
6
5
|
import {parseMedia} from '../parse-media';
|
|
6
|
+
import {nodeReader} from '../readers/from-node';
|
|
7
7
|
import {getMoovBox, getTraks} from '../traversal';
|
|
8
8
|
|
|
9
9
|
test('AV1 in MP4', async () => {
|
|
@@ -9,11 +9,11 @@ import type {
|
|
|
9
9
|
TrackEntry,
|
|
10
10
|
} from '../boxes/webm/segments/all-segments';
|
|
11
11
|
import {getArrayBufferIterator} from '../buffer-iterator';
|
|
12
|
-
import {nodeReader} from '../from-node';
|
|
13
12
|
import {parseMedia} from '../parse-media';
|
|
14
13
|
import type {AnySegment} from '../parse-result';
|
|
15
14
|
import type {ParserContext} from '../parser-context';
|
|
16
15
|
import {makeParserState} from '../parser-state';
|
|
16
|
+
import {nodeReader} from '../readers/from-node';
|
|
17
17
|
|
|
18
18
|
const state = makeParserState({
|
|
19
19
|
hasAudioCallbacks: false,
|
|
@@ -72,7 +72,10 @@ test('Should make Matroska header that is same as input', async () => {
|
|
|
72
72
|
],
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
-
const iterator = getArrayBufferIterator(
|
|
75
|
+
const iterator = getArrayBufferIterator(
|
|
76
|
+
headerOutput.bytes,
|
|
77
|
+
headerOutput.bytes.length,
|
|
78
|
+
);
|
|
76
79
|
const parsed = await parseEbml(iterator, options);
|
|
77
80
|
|
|
78
81
|
expect(parsed).toEqual({
|
|
@@ -128,7 +131,7 @@ test('Should be able to create SeekIdBox', async () => {
|
|
|
128
131
|
value: '0x1549a966',
|
|
129
132
|
minVintWidth: 1,
|
|
130
133
|
});
|
|
131
|
-
expect(custom).toEqual(file);
|
|
134
|
+
expect(custom.bytes).toEqual(file);
|
|
132
135
|
});
|
|
133
136
|
|
|
134
137
|
test('Should be able to create Seek', async () => {
|
|
@@ -154,7 +157,7 @@ test('Should be able to create Seek', async () => {
|
|
|
154
157
|
});
|
|
155
158
|
|
|
156
159
|
const custom = makeMatroskaBytes(parsed);
|
|
157
|
-
expect(custom).toEqual(file);
|
|
160
|
+
expect(custom.bytes).toEqual(file);
|
|
158
161
|
});
|
|
159
162
|
|
|
160
163
|
test('Should parse seekHead', async () => {
|
|
@@ -186,7 +189,29 @@ test('Should parse seekHead', async () => {
|
|
|
186
189
|
],
|
|
187
190
|
minVintWidth: 1,
|
|
188
191
|
});
|
|
189
|
-
expect(custom).toEqual(
|
|
192
|
+
expect(custom.offsets).toEqual({
|
|
193
|
+
offset: 0,
|
|
194
|
+
children: [
|
|
195
|
+
{
|
|
196
|
+
offset: 5,
|
|
197
|
+
children: [
|
|
198
|
+
{
|
|
199
|
+
offset: 8,
|
|
200
|
+
children: [],
|
|
201
|
+
field: 'SeekID',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
offset: 15,
|
|
205
|
+
children: [],
|
|
206
|
+
field: 'SeekPosition',
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
field: 'Seek',
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
field: 'SeekHead',
|
|
213
|
+
});
|
|
214
|
+
expect(custom.bytes).toEqual(file);
|
|
190
215
|
|
|
191
216
|
const iterator = getArrayBufferIterator(file, file.length);
|
|
192
217
|
const parsed = await parseEbml(iterator, options);
|
|
@@ -225,7 +250,7 @@ const parseWebm = async (str: string) => {
|
|
|
225
250
|
const stringifyWebm = (boxes: AnySegment[]) => {
|
|
226
251
|
const buffers: Uint8Array[] = [];
|
|
227
252
|
for (const box of boxes) {
|
|
228
|
-
const bytes = makeMatroskaBytes(box as MatroskaSegment);
|
|
253
|
+
const {bytes} = makeMatroskaBytes(box as MatroskaSegment);
|
|
229
254
|
buffers.push(bytes);
|
|
230
255
|
}
|
|
231
256
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {parseMedia} from '../parse-media';
|
|
4
|
+
import {nodeReader} from '../readers/from-node';
|
|
5
5
|
|
|
6
6
|
test('Should get duration of video', async () => {
|
|
7
7
|
const parsed = await parseMedia({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {parseMedia} from '../parse-media';
|
|
4
|
+
import {nodeReader} from '../readers/from-node';
|
|
5
5
|
|
|
6
6
|
test('Should get duration of AV1 video', async () => {
|
|
7
7
|
const parsed = await parseMedia({
|
|
@@ -233,10 +233,40 @@ test('Should get duration of AV1 video', async () => {
|
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
235
|
type: 'Colour',
|
|
236
|
-
value:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
value: [
|
|
237
|
+
{
|
|
238
|
+
minVintWidth: 1,
|
|
239
|
+
type: 'TransferCharacteristics',
|
|
240
|
+
value: {
|
|
241
|
+
byteLength: 1,
|
|
242
|
+
value: 1,
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
minVintWidth: 1,
|
|
247
|
+
type: 'MatrixCoefficients',
|
|
248
|
+
value: {
|
|
249
|
+
byteLength: 1,
|
|
250
|
+
value: 1,
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
minVintWidth: 1,
|
|
255
|
+
type: 'Primaries',
|
|
256
|
+
value: {
|
|
257
|
+
byteLength: 1,
|
|
258
|
+
value: 1,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
minVintWidth: 1,
|
|
263
|
+
type: 'Range',
|
|
264
|
+
value: {
|
|
265
|
+
byteLength: 1,
|
|
266
|
+
value: 1,
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
],
|
|
240
270
|
minVintWidth: 1,
|
|
241
271
|
},
|
|
242
272
|
],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {parseMedia} from '../parse-media';
|
|
4
|
+
import {nodeReader} from '../readers/from-node';
|
|
5
5
|
|
|
6
6
|
test('Parse Big Buck bunny', async () => {
|
|
7
7
|
const data = await parseMedia({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {parseMedia} from '../parse-media';
|
|
4
|
+
import {nodeReader} from '../readers/from-node';
|
|
5
5
|
|
|
6
6
|
test('should be able to parse a WebM', async () => {
|
|
7
7
|
const webm = await parseMedia({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {RenderInternals} from '@remotion/renderer';
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
|
-
import {nodeReader} from '../from-node';
|
|
4
3
|
import {parseMedia} from '../parse-media';
|
|
4
|
+
import {nodeReader} from '../readers/from-node';
|
|
5
5
|
|
|
6
6
|
test('Should stream ISO base media', async () => {
|
|
7
7
|
let videoTracks = 0;
|
|
@@ -2,8 +2,8 @@ import {RenderInternals} from '@remotion/renderer';
|
|
|
2
2
|
import {expect, test} from 'bun:test';
|
|
3
3
|
import {getSamplePositionsFromTrack} from '../boxes/iso-base-media/get-sample-positions-from-track';
|
|
4
4
|
import type {TrakBox} from '../boxes/iso-base-media/trak/trak';
|
|
5
|
-
import {nodeReader} from '../from-node';
|
|
6
5
|
import {parseMedia} from '../parse-media';
|
|
6
|
+
import {nodeReader} from '../readers/from-node';
|
|
7
7
|
|
|
8
8
|
test('Stream samples', async () => {
|
|
9
9
|
const {videoTracks, audioTracks} = await parseMedia({
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type {Writer, WriterInterface} from './writer';
|
|
2
|
+
|
|
3
|
+
const createContent = async () => {
|
|
4
|
+
const directoryHandle = await navigator.storage.getDirectory();
|
|
5
|
+
const filename = `media-parser-${Math.random().toString().replace('0.', '')}.webm`;
|
|
6
|
+
|
|
7
|
+
const fileHandle = await directoryHandle.getFileHandle(filename, {
|
|
8
|
+
create: true,
|
|
9
|
+
});
|
|
10
|
+
const writable = await fileHandle.createWritable();
|
|
11
|
+
|
|
12
|
+
let written = 0;
|
|
13
|
+
|
|
14
|
+
const writer: Writer = {
|
|
15
|
+
write: async (arr: Uint8Array) => {
|
|
16
|
+
await writable.write(arr);
|
|
17
|
+
written += arr.byteLength;
|
|
18
|
+
},
|
|
19
|
+
save: async () => {
|
|
20
|
+
await writable.close();
|
|
21
|
+
const picker = await window.showSaveFilePicker({
|
|
22
|
+
suggestedName: `${Math.random().toString().replace('.', '')}.webm`,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const newHandle = await directoryHandle.getFileHandle(filename, {
|
|
26
|
+
create: true,
|
|
27
|
+
});
|
|
28
|
+
const newFile = await newHandle.getFile();
|
|
29
|
+
const pickerWriteable = await picker.createWritable();
|
|
30
|
+
const stream = newFile.stream();
|
|
31
|
+
await stream.pipeTo(pickerWriteable);
|
|
32
|
+
|
|
33
|
+
await directoryHandle.removeEntry(filename, {
|
|
34
|
+
recursive: true,
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
getWrittenByteCount: () => written,
|
|
38
|
+
updateDataAt: async (position: number, vint: Uint8Array) => {
|
|
39
|
+
await writable.seek(position);
|
|
40
|
+
await writable.write(vint);
|
|
41
|
+
await writable.seek(written);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return writer;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const webFsWriter: WriterInterface = {
|
|
49
|
+
createContent,
|
|
50
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Writer = {
|
|
2
|
+
write: (arr: Uint8Array) => Promise<void>;
|
|
3
|
+
save: () => Promise<void>;
|
|
4
|
+
getWrittenByteCount: () => number;
|
|
5
|
+
updateDataAt: (position: number, vint: Uint8Array) => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
type CreateContent = () => Promise<Writer>;
|
|
9
|
+
|
|
10
|
+
export type WriterInterface = {
|
|
11
|
+
createContent: CreateContent;
|
|
12
|
+
};
|