@remotion/media-parser 4.0.319 → 4.0.321

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.
@@ -0,0 +1,30 @@
1
+ import type { BufferIterator } from '../../iterator/buffer-iterator';
2
+ import type { BaseBox } from './base-type';
3
+ export type ThreeDMatrix = [
4
+ number,
5
+ number,
6
+ number,
7
+ number,
8
+ number,
9
+ number,
10
+ number,
11
+ number,
12
+ number
13
+ ];
14
+ export interface MvhdBox extends BaseBox {
15
+ durationInUnits: number;
16
+ durationInSeconds: number;
17
+ creationTime: number | null;
18
+ modificationTime: number | null;
19
+ timeScale: number;
20
+ rate: number;
21
+ volume: number;
22
+ matrix: ThreeDMatrix;
23
+ nextTrackId: number;
24
+ type: 'mvhd-box';
25
+ }
26
+ export declare const parseMvhd: ({ iterator, offset, size, }: {
27
+ iterator: BufferIterator;
28
+ offset: number;
29
+ size: number;
30
+ }) => MvhdBox;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMvhd = void 0;
4
+ const buffer_iterator_1 = require("../../iterator/buffer-iterator");
5
+ const to_date_1 = require("./to-date");
6
+ const parseMvhd = ({ iterator, offset, size, }) => {
7
+ const version = iterator.getUint8();
8
+ // Flags, we discard them
9
+ iterator.discard(3);
10
+ const creationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
11
+ const modificationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
12
+ const timeScale = iterator.getUint32();
13
+ const durationInUnits = version === 1 ? iterator.getUint64() : iterator.getUint32();
14
+ const durationInSeconds = Number(durationInUnits) / timeScale;
15
+ const rateArray = iterator.getSlice(4);
16
+ const rateView = (0, buffer_iterator_1.getArrayBufferIterator)(rateArray, rateArray.length);
17
+ const rate = rateView.getInt8() * 10 +
18
+ rateView.getInt8() +
19
+ rateView.getInt8() * 0.1 +
20
+ rateView.getInt8() * 0.01;
21
+ const volumeArray = iterator.getSlice(2);
22
+ const volumeView = (0, buffer_iterator_1.getArrayBufferIterator)(volumeArray, volumeArray.length);
23
+ const volume = volumeView.getInt8() + volumeView.getInt8() * 0.1;
24
+ // reserved 16bit
25
+ iterator.discard(2);
26
+ // reserved 32bit x2
27
+ iterator.discard(4);
28
+ iterator.discard(4);
29
+ // matrix
30
+ const matrix = [
31
+ iterator.getFixedPointSigned1616Number(),
32
+ iterator.getFixedPointSigned1616Number(),
33
+ iterator.getFixedPointSigned230Number(),
34
+ iterator.getFixedPointSigned1616Number(),
35
+ iterator.getFixedPointSigned1616Number(),
36
+ iterator.getFixedPointSigned230Number(),
37
+ iterator.getFixedPointSigned1616Number(),
38
+ iterator.getFixedPointSigned1616Number(),
39
+ iterator.getFixedPointSigned230Number(),
40
+ ];
41
+ // pre-defined
42
+ iterator.discard(4 * 6);
43
+ // next track id
44
+ const nextTrackId = iterator.getUint32();
45
+ volumeView.destroy();
46
+ const bytesRemaining = size - (iterator.counter.getOffset() - offset);
47
+ if (bytesRemaining !== 0) {
48
+ throw new Error('expected 0 bytes ' + bytesRemaining);
49
+ }
50
+ return {
51
+ creationTime: (0, to_date_1.toUnixTimestamp)(Number(creationTime)),
52
+ modificationTime: (0, to_date_1.toUnixTimestamp)(Number(modificationTime)),
53
+ timeScale,
54
+ durationInUnits: Number(durationInUnits),
55
+ durationInSeconds,
56
+ rate,
57
+ volume,
58
+ matrix: matrix,
59
+ nextTrackId,
60
+ type: 'mvhd-box',
61
+ boxSize: size,
62
+ offset,
63
+ };
64
+ };
65
+ exports.parseMvhd = parseMvhd;
@@ -16,9 +16,9 @@ const parseWav = (state) => {
16
16
  if (insideMediaSection === 'in-section') {
17
17
  return (0, parse_media_section_1.parseMediaSection)({ state });
18
18
  }
19
- const type = iterator.getByteString(4, false);
19
+ const type = iterator.getByteString(4, false).toLowerCase();
20
20
  log_1.Log.trace(state.logLevel, `Processing box type ${type}`);
21
- if (type === 'RIFF') {
21
+ if (type === 'riff') {
22
22
  return (0, parse_header_1.parseHeader)({ state });
23
23
  }
24
24
  if (type === 'fmt') {
@@ -27,13 +27,13 @@ const parseWav = (state) => {
27
27
  if (type === 'data') {
28
28
  return (0, parse_data_1.parseData)({ state });
29
29
  }
30
- if (type === 'LIST') {
30
+ if (type === 'list') {
31
31
  return (0, parse_list_1.parseList)({ state });
32
32
  }
33
- if (type === 'id3' || type === 'ID3') {
33
+ if (type === 'id3') {
34
34
  return (0, parse_id3_1.parseId3)({ state });
35
35
  }
36
- if (type === 'JUNK' || type === 'FLLR') {
36
+ if (type === 'junk' || type === 'fllr') {
37
37
  return (0, parse_junk_1.parseJunk)({ state });
38
38
  }
39
39
  if (type === 'fact') {
@@ -15439,9 +15439,9 @@ var parseWav = (state) => {
15439
15439
  if (insideMediaSection === "in-section") {
15440
15440
  return parseMediaSection2({ state });
15441
15441
  }
15442
- const type = iterator.getByteString(4, false);
15442
+ const type = iterator.getByteString(4, false).toLowerCase();
15443
15443
  Log.trace(state.logLevel, `Processing box type ${type}`);
15444
- if (type === "RIFF") {
15444
+ if (type === "riff") {
15445
15445
  return parseHeader({ state });
15446
15446
  }
15447
15447
  if (type === "fmt") {
@@ -15450,13 +15450,13 @@ var parseWav = (state) => {
15450
15450
  if (type === "data") {
15451
15451
  return parseData({ state });
15452
15452
  }
15453
- if (type === "LIST") {
15453
+ if (type === "list") {
15454
15454
  return parseList({ state });
15455
15455
  }
15456
- if (type === "id3" || type === "ID3") {
15456
+ if (type === "id3") {
15457
15457
  return parseId32({ state });
15458
15458
  }
15459
- if (type === "JUNK" || type === "FLLR") {
15459
+ if (type === "junk" || type === "fllr") {
15460
15460
  return parseJunk({ state });
15461
15461
  }
15462
15462
  if (type === "fact") {
@@ -18105,7 +18105,7 @@ var downloadAndParseMedia = async (options) => {
18105
18105
  return returnValue;
18106
18106
  };
18107
18107
  // src/version.ts
18108
- var VERSION = "4.0.319";
18108
+ var VERSION = "4.0.321";
18109
18109
 
18110
18110
  // src/index.ts
18111
18111
  var MediaParserInternals = {
@@ -252,6 +252,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
252
252
  return prom.promise;
253
253
  });
254
254
  const callbacks = {};
255
+ const trackDoneCallbacks = {};
255
256
  function onMessage(message) {
256
257
  const data = message.data;
257
258
  if (data.type === "response-done") {
@@ -435,15 +436,35 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
435
436
  if (!callback) {
436
437
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
437
438
  }
438
- await callback(data.payload.value);
439
- return { payloadType: "void" };
439
+ const trackDoneCallback = await callback(data.payload.value);
440
+ if (trackDoneCallback) {
441
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
442
+ }
443
+ return {
444
+ payloadType: "on-sample-response",
445
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
446
+ };
440
447
  }
441
448
  if (data.payload.callbackType === "on-video-sample") {
442
449
  const callback = callbacks[data.payload.trackId];
443
450
  if (!callback) {
444
451
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
445
452
  }
446
- await callback(data.payload.value);
453
+ const trackDoneCallback = await callback(data.payload.value);
454
+ if (trackDoneCallback) {
455
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
456
+ }
457
+ return {
458
+ payloadType: "on-sample-response",
459
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
460
+ };
461
+ }
462
+ if (data.payload.callbackType === "track-done") {
463
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
464
+ if (!trackDoneCallback) {
465
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
466
+ }
467
+ trackDoneCallback();
447
468
  return { payloadType: "void" };
448
469
  }
449
470
  throw new Error(`Unknown callback type: ${data.payload}`);
@@ -15170,9 +15170,9 @@ var parseWav = (state) => {
15170
15170
  if (insideMediaSection === "in-section") {
15171
15171
  return parseMediaSection2({ state });
15172
15172
  }
15173
- const type = iterator.getByteString(4, false);
15173
+ const type = iterator.getByteString(4, false).toLowerCase();
15174
15174
  Log.trace(state.logLevel, `Processing box type ${type}`);
15175
- if (type === "RIFF") {
15175
+ if (type === "riff") {
15176
15176
  return parseHeader({ state });
15177
15177
  }
15178
15178
  if (type === "fmt") {
@@ -15181,13 +15181,13 @@ var parseWav = (state) => {
15181
15181
  if (type === "data") {
15182
15182
  return parseData({ state });
15183
15183
  }
15184
- if (type === "LIST") {
15184
+ if (type === "list") {
15185
15185
  return parseList({ state });
15186
15186
  }
15187
- if (type === "id3" || type === "ID3") {
15187
+ if (type === "id3") {
15188
15188
  return parseId32({ state });
15189
15189
  }
15190
- if (type === "JUNK" || type === "FLLR") {
15190
+ if (type === "junk" || type === "fllr") {
15191
15191
  return parseJunk({ state });
15192
15192
  }
15193
15193
  if (type === "fact") {
@@ -18585,11 +18585,23 @@ var startParsing = async (message, reader) => {
18585
18585
  return null;
18586
18586
  }
18587
18587
  return async (sample) => {
18588
- await executeCallback({
18588
+ const audioSampleRes = await executeCallback({
18589
18589
  callbackType: "on-audio-sample",
18590
18590
  value: sample,
18591
18591
  trackId: params.track.trackId
18592
18592
  });
18593
+ if (audioSampleRes.payloadType !== "on-sample-response") {
18594
+ throw new Error("Invalid response from callback");
18595
+ }
18596
+ if (!audioSampleRes.registeredTrackDoneCallback) {
18597
+ return;
18598
+ }
18599
+ return async () => {
18600
+ await executeCallback({
18601
+ callbackType: "track-done",
18602
+ trackId: params.track.trackId
18603
+ });
18604
+ };
18593
18605
  };
18594
18606
  } : null,
18595
18607
  onVideoTrack: postOnVideoTrack ? async (params) => {
@@ -18604,11 +18616,23 @@ var startParsing = async (message, reader) => {
18604
18616
  return null;
18605
18617
  }
18606
18618
  return async (sample) => {
18607
- await executeCallback({
18619
+ const videoSampleRes = await executeCallback({
18608
18620
  callbackType: "on-video-sample",
18609
18621
  value: sample,
18610
18622
  trackId: params.track.trackId
18611
18623
  });
18624
+ if (videoSampleRes.payloadType !== "on-sample-response") {
18625
+ throw new Error("Invalid response from callback");
18626
+ }
18627
+ if (!videoSampleRes.registeredTrackDoneCallback) {
18628
+ return;
18629
+ }
18630
+ return async () => {
18631
+ await executeCallback({
18632
+ callbackType: "track-done",
18633
+ trackId: params.track.trackId
18634
+ });
18635
+ };
18612
18636
  };
18613
18637
  } : null,
18614
18638
  onDiscardedData: null,
@@ -15039,9 +15039,9 @@ var parseWav = (state) => {
15039
15039
  if (insideMediaSection === "in-section") {
15040
15040
  return parseMediaSection2({ state });
15041
15041
  }
15042
- const type = iterator.getByteString(4, false);
15042
+ const type = iterator.getByteString(4, false).toLowerCase();
15043
15043
  Log.trace(state.logLevel, `Processing box type ${type}`);
15044
- if (type === "RIFF") {
15044
+ if (type === "riff") {
15045
15045
  return parseHeader({ state });
15046
15046
  }
15047
15047
  if (type === "fmt") {
@@ -15050,13 +15050,13 @@ var parseWav = (state) => {
15050
15050
  if (type === "data") {
15051
15051
  return parseData({ state });
15052
15052
  }
15053
- if (type === "LIST") {
15053
+ if (type === "list") {
15054
15054
  return parseList({ state });
15055
15055
  }
15056
- if (type === "id3" || type === "ID3") {
15056
+ if (type === "id3") {
15057
15057
  return parseId32({ state });
15058
15058
  }
15059
- if (type === "JUNK" || type === "FLLR") {
15059
+ if (type === "junk" || type === "fllr") {
15060
15060
  return parseJunk({ state });
15061
15061
  }
15062
15062
  if (type === "fact") {
@@ -18454,11 +18454,23 @@ var startParsing = async (message, reader) => {
18454
18454
  return null;
18455
18455
  }
18456
18456
  return async (sample) => {
18457
- await executeCallback({
18457
+ const audioSampleRes = await executeCallback({
18458
18458
  callbackType: "on-audio-sample",
18459
18459
  value: sample,
18460
18460
  trackId: params.track.trackId
18461
18461
  });
18462
+ if (audioSampleRes.payloadType !== "on-sample-response") {
18463
+ throw new Error("Invalid response from callback");
18464
+ }
18465
+ if (!audioSampleRes.registeredTrackDoneCallback) {
18466
+ return;
18467
+ }
18468
+ return async () => {
18469
+ await executeCallback({
18470
+ callbackType: "track-done",
18471
+ trackId: params.track.trackId
18472
+ });
18473
+ };
18462
18474
  };
18463
18475
  } : null,
18464
18476
  onVideoTrack: postOnVideoTrack ? async (params) => {
@@ -18473,11 +18485,23 @@ var startParsing = async (message, reader) => {
18473
18485
  return null;
18474
18486
  }
18475
18487
  return async (sample) => {
18476
- await executeCallback({
18488
+ const videoSampleRes = await executeCallback({
18477
18489
  callbackType: "on-video-sample",
18478
18490
  value: sample,
18479
18491
  trackId: params.track.trackId
18480
18492
  });
18493
+ if (videoSampleRes.payloadType !== "on-sample-response") {
18494
+ throw new Error("Invalid response from callback");
18495
+ }
18496
+ if (!videoSampleRes.registeredTrackDoneCallback) {
18497
+ return;
18498
+ }
18499
+ return async () => {
18500
+ await executeCallback({
18501
+ callbackType: "track-done",
18502
+ trackId: params.track.trackId
18503
+ });
18504
+ };
18481
18505
  };
18482
18506
  } : null,
18483
18507
  onDiscardedData: null,
@@ -252,6 +252,7 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
252
252
  return prom.promise;
253
253
  });
254
254
  const callbacks = {};
255
+ const trackDoneCallbacks = {};
255
256
  function onMessage(message) {
256
257
  const data = message.data;
257
258
  if (data.type === "response-done") {
@@ -435,15 +436,35 @@ var parseMediaOnWorkerImplementation = async ({ controller, reader, ...params },
435
436
  if (!callback) {
436
437
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
437
438
  }
438
- await callback(data.payload.value);
439
- return { payloadType: "void" };
439
+ const trackDoneCallback = await callback(data.payload.value);
440
+ if (trackDoneCallback) {
441
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
442
+ }
443
+ return {
444
+ payloadType: "on-sample-response",
445
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
446
+ };
440
447
  }
441
448
  if (data.payload.callbackType === "on-video-sample") {
442
449
  const callback = callbacks[data.payload.trackId];
443
450
  if (!callback) {
444
451
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
445
452
  }
446
- await callback(data.payload.value);
453
+ const trackDoneCallback = await callback(data.payload.value);
454
+ if (trackDoneCallback) {
455
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
456
+ }
457
+ return {
458
+ payloadType: "on-sample-response",
459
+ registeredTrackDoneCallback: Boolean(trackDoneCallback)
460
+ };
461
+ }
462
+ if (data.payload.callbackType === "track-done") {
463
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
464
+ if (!trackDoneCallback) {
465
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
466
+ }
467
+ trackDoneCallback();
447
468
  return { payloadType: "void" };
448
469
  }
449
470
  throw new Error(`Unknown callback type: ${data.payload}`);
@@ -93,6 +93,7 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
93
93
  return prom.promise;
94
94
  });
95
95
  const callbacks = {};
96
+ const trackDoneCallbacks = {};
96
97
  function onMessage(message) {
97
98
  const data = message.data;
98
99
  if (data.type === 'response-done') {
@@ -284,15 +285,35 @@ const parseMediaOnWorkerImplementation = async ({ controller, reader, ...params
284
285
  if (!callback) {
285
286
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
286
287
  }
287
- await callback(data.payload.value);
288
- return { payloadType: 'void' };
288
+ const trackDoneCallback = await callback(data.payload.value);
289
+ if (trackDoneCallback) {
290
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
291
+ }
292
+ return {
293
+ payloadType: 'on-sample-response',
294
+ registeredTrackDoneCallback: Boolean(trackDoneCallback),
295
+ };
289
296
  }
290
297
  if (data.payload.callbackType === 'on-video-sample') {
291
298
  const callback = callbacks[data.payload.trackId];
292
299
  if (!callback) {
293
300
  throw new Error(`No callback registered for track ${data.payload.trackId}`);
294
301
  }
295
- await callback(data.payload.value);
302
+ const trackDoneCallback = await callback(data.payload.value);
303
+ if (trackDoneCallback) {
304
+ trackDoneCallbacks[data.payload.trackId] = trackDoneCallback;
305
+ }
306
+ return {
307
+ payloadType: 'on-sample-response',
308
+ registeredTrackDoneCallback: Boolean(trackDoneCallback),
309
+ };
310
+ }
311
+ if (data.payload.callbackType === 'track-done') {
312
+ const trackDoneCallback = trackDoneCallbacks[data.payload.trackId];
313
+ if (!trackDoneCallback) {
314
+ throw new Error(`No track done callback registered for track ${data.payload.trackId}`);
315
+ }
316
+ trackDoneCallback();
296
317
  return { payloadType: 'void' };
297
318
  }
298
319
  throw new Error(`Unknown callback type: ${data.payload}`);
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.319";
1
+ export declare const VERSION = "4.0.321";
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.319';
5
+ exports.VERSION = '4.0.321';
@@ -240,6 +240,9 @@ export type ResponseCallbackPayload = {
240
240
  callbackType: 'on-video-sample';
241
241
  value: MediaParserVideoSample;
242
242
  trackId: number;
243
+ } | {
244
+ callbackType: 'track-done';
245
+ trackId: number;
243
246
  } | {
244
247
  callbackType: 'm3u-associated-playlists-selection';
245
248
  value: SelectM3uAssociatedPlaylistsFnOptions;
@@ -263,6 +266,9 @@ export type AcknowledgePayload = {
263
266
  } | {
264
267
  payloadType: 'on-video-track-response';
265
268
  registeredCallback: boolean;
269
+ } | {
270
+ payloadType: 'on-sample-response';
271
+ registeredTrackDoneCallback: boolean;
266
272
  };
267
273
  export type AcknowledgeCallback = {
268
274
  type: 'acknowledge-callback';
@@ -328,11 +328,23 @@ const startParsing = async (message, reader) => {
328
328
  return null;
329
329
  }
330
330
  return async (sample) => {
331
- await executeCallback({
331
+ const audioSampleRes = await executeCallback({
332
332
  callbackType: 'on-audio-sample',
333
333
  value: sample,
334
334
  trackId: params.track.trackId,
335
335
  });
336
+ if (audioSampleRes.payloadType !== 'on-sample-response') {
337
+ throw new Error('Invalid response from callback');
338
+ }
339
+ if (!audioSampleRes.registeredTrackDoneCallback) {
340
+ return;
341
+ }
342
+ return async () => {
343
+ await executeCallback({
344
+ callbackType: 'track-done',
345
+ trackId: params.track.trackId,
346
+ });
347
+ };
336
348
  };
337
349
  }
338
350
  : null,
@@ -349,11 +361,23 @@ const startParsing = async (message, reader) => {
349
361
  return null;
350
362
  }
351
363
  return async (sample) => {
352
- await executeCallback({
364
+ const videoSampleRes = await executeCallback({
353
365
  callbackType: 'on-video-sample',
354
366
  value: sample,
355
367
  trackId: params.track.trackId,
356
368
  });
369
+ if (videoSampleRes.payloadType !== 'on-sample-response') {
370
+ throw new Error('Invalid response from callback');
371
+ }
372
+ if (!videoSampleRes.registeredTrackDoneCallback) {
373
+ return;
374
+ }
375
+ return async () => {
376
+ await executeCallback({
377
+ callbackType: 'track-done',
378
+ trackId: params.track.trackId,
379
+ });
380
+ };
357
381
  };
358
382
  }
359
383
  : null,
package/package.json CHANGED
@@ -3,15 +3,15 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.319",
6
+ "version": "4.0.321",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.19.0",
12
12
  "@types/bun": "1.2.8",
13
- "@remotion/example-videos": "4.0.319",
14
- "@remotion/eslint-config-internal": "4.0.319"
13
+ "@remotion/example-videos": "4.0.321",
14
+ "@remotion/eslint-config-internal": "4.0.321"
15
15
  },
16
16
  "publishConfig": {
17
17
  "access": "public"