@remotion/studio 4.0.327 → 4.0.330

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.
@@ -22809,6 +22809,24 @@ var findTrackStartTimeInSeconds = ({
22809
22809
  }
22810
22810
  return dwellTime / movieTimeScale;
22811
22811
  };
22812
+ var findTrackMediaTimeOffsetInTrackTimescale = ({
22813
+ trakBox
22814
+ }) => {
22815
+ const elstBox = getElstBox(trakBox);
22816
+ if (!elstBox) {
22817
+ return 0;
22818
+ }
22819
+ const { entries } = elstBox;
22820
+ let dwellTime = 0;
22821
+ for (const entry of entries) {
22822
+ const { mediaTime } = entry;
22823
+ if (mediaTime === -1) {
22824
+ continue;
22825
+ }
22826
+ dwellTime += mediaTime;
22827
+ }
22828
+ return dwellTime;
22829
+ };
22812
22830
  var WEBCODECS_TIMESCALE = 1e6;
22813
22831
  var MEDIA_PARSER_RIFF_TIMESCALE = 1e6;
22814
22832
  var isRiffAvi2 = (structure) => {
@@ -22860,7 +22878,8 @@ var makeAviAudioTrack = ({
22860
22878
  originalTimescale: MEDIA_PARSER_RIFF_TIMESCALE,
22861
22879
  trackId: index,
22862
22880
  startInSeconds: 0,
22863
- timescale: WEBCODECS_TIMESCALE
22881
+ timescale: WEBCODECS_TIMESCALE,
22882
+ trackMediaTimeOffsetInTrackTimescale: 0
22864
22883
  };
22865
22884
  };
22866
22885
  var makeAviVideoTrack = ({
@@ -22905,7 +22924,8 @@ var makeAviVideoTrack = ({
22905
22924
  },
22906
22925
  fps: strh.rate / strh.scale,
22907
22926
  startInSeconds: 0,
22908
- timescale: WEBCODECS_TIMESCALE
22927
+ timescale: WEBCODECS_TIMESCALE,
22928
+ trackMediaTimeOffsetInTrackTimescale: 0
22909
22929
  };
22910
22930
  };
22911
22931
  var getTracksFromAvi = (structure, state) => {
@@ -23685,7 +23705,8 @@ var getTrack = ({
23685
23705
  codecEnum,
23686
23706
  fps: null,
23687
23707
  startInSeconds: 0,
23688
- timescale: WEBCODECS_TIMESCALE
23708
+ timescale: WEBCODECS_TIMESCALE,
23709
+ trackMediaTimeOffsetInTrackTimescale: 0
23689
23710
  };
23690
23711
  }
23691
23712
  if (trackTypeToString(trackType2.value.value) === "audio") {
@@ -23709,7 +23730,8 @@ var getTrack = ({
23709
23730
  track
23710
23731
  }),
23711
23732
  startInSeconds: 0,
23712
- timescale: WEBCODECS_TIMESCALE
23733
+ timescale: WEBCODECS_TIMESCALE,
23734
+ trackMediaTimeOffsetInTrackTimescale: 0
23713
23735
  };
23714
23736
  }
23715
23737
  return null;
@@ -24485,6 +24507,9 @@ var getVideoCodecString = (trakBox) => {
24485
24507
  }
24486
24508
  return videoSample.format;
24487
24509
  };
24510
+ var normalizeVideoRotation = (rotation) => {
24511
+ return (rotation % 360 + 360) % 360;
24512
+ };
24488
24513
  var getActualDecoderParameters = ({
24489
24514
  audioCodec,
24490
24515
  codecPrivate: codecPrivate2,
@@ -24596,7 +24621,10 @@ var makeBaseMediaTrack = (trakBox, startTimeInSeconds) => {
24596
24621
  codecData: actual.codecPrivate,
24597
24622
  codecEnum,
24598
24623
  startInSeconds: startTimeInSeconds,
24599
- timescale: WEBCODECS_TIMESCALE
24624
+ timescale: WEBCODECS_TIMESCALE,
24625
+ trackMediaTimeOffsetInTrackTimescale: findTrackMediaTimeOffsetInTrackTimescale({
24626
+ trakBox
24627
+ })
24600
24628
  };
24601
24629
  }
24602
24630
  if (!trakBoxContainsVideo(trakBox)) {
@@ -24606,7 +24634,10 @@ var makeBaseMediaTrack = (trakBox, startTimeInSeconds) => {
24606
24634
  originalTimescale: timescaleAndDuration.timescale,
24607
24635
  trakBox,
24608
24636
  startInSeconds: startTimeInSeconds,
24609
- timescale: WEBCODECS_TIMESCALE
24637
+ timescale: WEBCODECS_TIMESCALE,
24638
+ trackMediaTimeOffsetInTrackTimescale: findTrackMediaTimeOffsetInTrackTimescale({
24639
+ trakBox
24640
+ })
24610
24641
  };
24611
24642
  }
24612
24643
  const videoSample = getStsdVideoConfig(trakBox);
@@ -24648,14 +24679,17 @@ var makeBaseMediaTrack = (trakBox, startTimeInSeconds) => {
24648
24679
  codedHeight: videoSample.height,
24649
24680
  displayAspectWidth,
24650
24681
  displayAspectHeight,
24651
- rotation,
24682
+ rotation: normalizeVideoRotation(0 - rotation),
24652
24683
  codecData: privateData,
24653
24684
  colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
24654
24685
  advancedColor,
24655
24686
  codecEnum: getVideoCodecFromIsoTrak(trakBox),
24656
24687
  fps: getFpsFromMp4TrakBox(trakBox),
24657
24688
  startInSeconds: startTimeInSeconds,
24658
- timescale: WEBCODECS_TIMESCALE
24689
+ timescale: WEBCODECS_TIMESCALE,
24690
+ trackMediaTimeOffsetInTrackTimescale: findTrackMediaTimeOffsetInTrackTimescale({
24691
+ trakBox
24692
+ })
24659
24693
  };
24660
24694
  return track;
24661
24695
  };
@@ -29330,7 +29364,8 @@ var handleAvcPacket = async ({
29330
29364
  colorSpace: mediaParserAdvancedColorToWebCodecsColor(advancedColor),
29331
29365
  advancedColor,
29332
29366
  startInSeconds: 0,
29333
- timescale: WEBCODECS_TIMESCALE
29367
+ timescale: WEBCODECS_TIMESCALE,
29368
+ trackMediaTimeOffsetInTrackTimescale: 0
29334
29369
  };
29335
29370
  await registerVideoTrack({
29336
29371
  track,
@@ -30926,7 +30961,8 @@ var parseAac = async (state) => {
30926
30961
  trackId: 0,
30927
30962
  type: "audio",
30928
30963
  startInSeconds: 0,
30929
- timescale: WEBCODECS_TIMESCALE
30964
+ timescale: WEBCODECS_TIMESCALE,
30965
+ trackMediaTimeOffsetInTrackTimescale: 0
30930
30966
  },
30931
30967
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
30932
30968
  tracks: state.callbacks.tracks,
@@ -31309,7 +31345,8 @@ var parseStreamInfo = async ({
31309
31345
  originalTimescale: WEBCODECS_TIMESCALE,
31310
31346
  trackId: 0,
31311
31347
  startInSeconds: 0,
31312
- timescale: WEBCODECS_TIMESCALE
31348
+ timescale: WEBCODECS_TIMESCALE,
31349
+ trackMediaTimeOffsetInTrackTimescale: 0
31313
31350
  },
31314
31351
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
31315
31352
  tracks: state.callbacks.tracks,
@@ -31402,7 +31439,10 @@ var calculateFlatSamples = ({
31402
31439
  if (!moov) {
31403
31440
  throw new Error("No moov box found");
31404
31441
  }
31405
- const flatSamples = tracks2.map((track) => {
31442
+ const offsets = [];
31443
+ const trackIds = [];
31444
+ const map = new Map;
31445
+ for (const track of tracks2) {
31406
31446
  const trakBox = getTrakBoxByTrackId(moov, track.trackId);
31407
31447
  if (!trakBox) {
31408
31448
  throw new Error("No trak box found");
@@ -31413,14 +31453,17 @@ var calculateFlatSamples = ({
31413
31453
  moofComplete,
31414
31454
  trexBoxes: getTrexBoxes(moov)
31415
31455
  });
31416
- return samplePositions.map((samplePosition) => {
31417
- return {
31456
+ trackIds.push(track.trackId);
31457
+ for (const samplePosition of samplePositions) {
31458
+ offsets.push(samplePosition.offset);
31459
+ map.set(samplePosition.offset, {
31418
31460
  track,
31419
31461
  samplePosition
31420
- };
31421
- });
31422
- });
31423
- return flatSamples;
31462
+ });
31463
+ }
31464
+ }
31465
+ offsets.sort((a, b) => a - b);
31466
+ return { flatSamples: map, offsets, trackIds };
31424
31467
  };
31425
31468
  var cachedSamplePositionsState = () => {
31426
31469
  const cachedForMdatStart = {};
@@ -31711,31 +31754,36 @@ var getMoovAtom = async ({
31711
31754
  };
31712
31755
  var MAX_SPREAD_IN_SECONDS = 8;
31713
31756
  var getKey = (samplePositionTrack) => {
31714
- return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.decodingTimestamp}`;
31757
+ return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.decodingTimestamp}.${samplePositionTrack.samplePosition.offset}`;
31715
31758
  };
31716
31759
  var findBestJump = ({
31717
- allSamplesSortedByOffset,
31760
+ sampleMap,
31761
+ offsetsSorted,
31718
31762
  visited,
31719
31763
  progresses
31720
31764
  }) => {
31721
31765
  const minProgress = Math.min(...Object.values(progresses));
31722
31766
  const trackNumberWithLowestProgress = Object.entries(progresses).find(([, progress]) => progress === minProgress)?.[0];
31723
- const firstSampleAboveMinProgress = allSamplesSortedByOffset.findIndex((sample) => sample.track.trackId === Number(trackNumberWithLowestProgress) && !visited.has(getKey(sample)));
31767
+ const firstSampleAboveMinProgress = offsetsSorted.findIndex((offset) => sampleMap.get(offset).track.trackId === Number(trackNumberWithLowestProgress) && !visited.has(getKey(sampleMap.get(offset))));
31724
31768
  return firstSampleAboveMinProgress;
31725
31769
  };
31726
- var calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
31770
+ var calculateJumpMarks = ({
31771
+ sampleMap,
31772
+ offsetsSorted,
31773
+ trackIds,
31774
+ endOfMdat
31775
+ }) => {
31727
31776
  const progresses = {};
31728
- for (const track of samplePositionTracks) {
31729
- progresses[track[0].track.trackId] = 0;
31777
+ for (const trackId of trackIds) {
31778
+ progresses[trackId] = 0;
31730
31779
  }
31731
31780
  const jumpMarks = [];
31732
- const allSamplesSortedByOffset = samplePositionTracks.flat(1).filter((s) => s.track.type === "audio" || s.track.type === "video").sort((a, b) => a.samplePosition.offset - b.samplePosition.offset);
31733
31781
  let indexToVisit = 0;
31734
31782
  const visited = new Set;
31735
31783
  let rollOverToProcess = false;
31736
31784
  const increaseIndex = () => {
31737
31785
  indexToVisit++;
31738
- if (indexToVisit >= allSamplesSortedByOffset.length) {
31786
+ if (indexToVisit >= offsetsSorted.length) {
31739
31787
  rollOverToProcess = true;
31740
31788
  indexToVisit = 0;
31741
31789
  }
@@ -31749,23 +31797,24 @@ var calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
31749
31797
  }
31750
31798
  const jumpMark = {
31751
31799
  afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
31752
- jumpToOffset: allSamplesSortedByOffset[firstSampleAboveMinProgress].samplePosition.offset
31800
+ jumpToOffset: offsetsSorted[firstSampleAboveMinProgress]
31753
31801
  };
31754
31802
  indexToVisit = firstSampleAboveMinProgress;
31755
31803
  jumpMarks.push(jumpMark);
31756
31804
  };
31757
31805
  const addFinalJumpIfNecessary = () => {
31758
- if (indexToVisit === allSamplesSortedByOffset.length - 1) {
31806
+ if (indexToVisit === offsetsSorted.length - 1) {
31759
31807
  return;
31760
31808
  }
31761
31809
  jumpMarks.push({
31762
- afterSampleWithOffset: allSamplesSortedByOffset[indexToVisit].samplePosition.offset,
31810
+ afterSampleWithOffset: offsetsSorted[indexToVisit],
31763
31811
  jumpToOffset: endOfMdat
31764
31812
  });
31765
31813
  };
31766
31814
  const considerJump = () => {
31767
31815
  const firstSampleAboveMinProgress = findBestJump({
31768
- allSamplesSortedByOffset,
31816
+ sampleMap,
31817
+ offsetsSorted,
31769
31818
  visited,
31770
31819
  progresses
31771
31820
  });
@@ -31775,14 +31824,14 @@ var calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
31775
31824
  } else {
31776
31825
  while (true) {
31777
31826
  increaseIndex();
31778
- if (!visited.has(getKey(allSamplesSortedByOffset[indexToVisit]))) {
31827
+ if (!visited.has(getKey(sampleMap.get(offsetsSorted[indexToVisit])))) {
31779
31828
  break;
31780
31829
  }
31781
31830
  }
31782
31831
  }
31783
31832
  };
31784
31833
  while (true) {
31785
- const currentSamplePosition = allSamplesSortedByOffset[indexToVisit];
31834
+ const currentSamplePosition = sampleMap.get(offsetsSorted[indexToVisit]);
31786
31835
  const sampleKey = getKey(currentSamplePosition);
31787
31836
  if (visited.has(sampleKey)) {
31788
31837
  considerJump();
@@ -31800,7 +31849,7 @@ var calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
31800
31849
  rollOverToProcess = false;
31801
31850
  }
31802
31851
  lastVisitedSample = currentSamplePosition;
31803
- if (visited.size === allSamplesSortedByOffset.length) {
31852
+ if (visited.size === offsetsSorted.length) {
31804
31853
  addFinalJumpIfNecessary();
31805
31854
  break;
31806
31855
  }
@@ -31810,7 +31859,7 @@ var calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
31810
31859
  const maxProgress = Math.max(...progressValues);
31811
31860
  const minProgress = Math.min(...progressValues);
31812
31861
  const spread = maxProgress - minProgress;
31813
- if (visited.size === allSamplesSortedByOffset.length) {
31862
+ if (visited.size === offsetsSorted.length) {
31814
31863
  addFinalJumpIfNecessary();
31815
31864
  break;
31816
31865
  }
@@ -31888,24 +31937,32 @@ var parseMdatSection = async (state) => {
31888
31937
  return parseMdatSection(state);
31889
31938
  }
31890
31939
  if (!state.iso.flatSamples.getSamples(mediaSection.start)) {
31891
- const flattedSamples = calculateFlatSamples({
31940
+ const {
31941
+ flatSamples: flatSamplesMap,
31942
+ offsets,
31943
+ trackIds
31944
+ } = calculateFlatSamples({
31892
31945
  state,
31893
31946
  mediaSectionStart: mediaSection.start
31894
31947
  });
31895
- const calcedJumpMarks = calculateJumpMarks(flattedSamples, endOfMdat);
31948
+ const calcedJumpMarks = calculateJumpMarks({
31949
+ sampleMap: flatSamplesMap,
31950
+ offsetsSorted: offsets,
31951
+ trackIds,
31952
+ endOfMdat
31953
+ });
31896
31954
  state.iso.flatSamples.setJumpMarks(mediaSection.start, calcedJumpMarks);
31897
- state.iso.flatSamples.setSamples(mediaSection.start, flattedSamples.flat(1));
31955
+ state.iso.flatSamples.setSamples(mediaSection.start, flatSamplesMap);
31898
31956
  }
31899
31957
  const flatSamples = state.iso.flatSamples.getSamples(mediaSection.start);
31900
31958
  const jumpMarks = state.iso.flatSamples.getJumpMarks(mediaSection.start);
31901
31959
  const { iterator } = state;
31902
- const samplesWithIndex = flatSamples.find((sample) => {
31903
- return sample.samplePosition.offset === iterator.counter.getOffset();
31904
- });
31960
+ const samplesWithIndex = flatSamples.get(iterator.counter.getOffset());
31905
31961
  if (!samplesWithIndex) {
31906
- const nextSample_ = flatSamples.filter((s) => s.samplePosition.offset > iterator.counter.getOffset()).sort((a, b) => a.samplePosition.offset - b.samplePosition.offset)[0];
31962
+ const offsets = Array.from(flatSamples.keys());
31963
+ const nextSample_ = offsets.filter((s) => s > iterator.counter.getOffset()).sort((a, b) => a - b)[0];
31907
31964
  if (nextSample_) {
31908
- iterator.discard(nextSample_.samplePosition.offset - iterator.counter.getOffset());
31965
+ iterator.discard(nextSample_ - iterator.counter.getOffset());
31909
31966
  return null;
31910
31967
  }
31911
31968
  Log.verbose(state.logLevel, "Could not find sample at offset", iterator.counter.getOffset(), "skipping to end of mdat");
@@ -31927,9 +31984,14 @@ var parseMdatSection = async (state) => {
31927
31984
  bigEndian,
31928
31985
  chunkSize
31929
31986
  } = samplesWithIndex.samplePosition;
31930
- const { originalTimescale, startInSeconds } = samplesWithIndex.track;
31931
- const cts = rawCts + startInSeconds * originalTimescale;
31932
- const dts = rawDts + startInSeconds * originalTimescale;
31987
+ const {
31988
+ originalTimescale,
31989
+ startInSeconds,
31990
+ trackMediaTimeOffsetInTrackTimescale,
31991
+ timescale: trackTimescale
31992
+ } = samplesWithIndex.track;
31993
+ const cts = rawCts + startInSeconds * originalTimescale - trackMediaTimeOffsetInTrackTimescale / trackTimescale * WEBCODECS_TIMESCALE;
31994
+ const dts = rawDts + startInSeconds * originalTimescale - trackMediaTimeOffsetInTrackTimescale / trackTimescale * WEBCODECS_TIMESCALE;
31933
31995
  const bytes = postprocessBytes({
31934
31996
  bytes: iterator.getSlice(samplesWithIndex.samplePosition.size),
31935
31997
  bigEndian,
@@ -33606,7 +33668,8 @@ var parseMpegHeader = async ({
33606
33668
  originalTimescale: 1e6,
33607
33669
  trackId: 0,
33608
33670
  startInSeconds: 0,
33609
- timescale: WEBCODECS_TIMESCALE
33671
+ timescale: WEBCODECS_TIMESCALE,
33672
+ trackMediaTimeOffsetInTrackTimescale: 0
33610
33673
  },
33611
33674
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
33612
33675
  tracks: state.callbacks.tracks,
@@ -34643,7 +34706,8 @@ var handleAacPacket = async ({
34643
34706
  numberOfChannels: channelConfiguration,
34644
34707
  sampleRate,
34645
34708
  startInSeconds: 0,
34646
- timescale: WEBCODECS_TIMESCALE
34709
+ timescale: WEBCODECS_TIMESCALE,
34710
+ trackMediaTimeOffsetInTrackTimescale: 0
34647
34711
  };
34648
34712
  await registerAudioTrack({
34649
34713
  track,
@@ -35254,7 +35318,8 @@ var parseFmt = async ({
35254
35318
  originalTimescale: 1e6,
35255
35319
  trackId: 0,
35256
35320
  startInSeconds: 0,
35257
- timescale: WEBCODECS_TIMESCALE
35321
+ timescale: WEBCODECS_TIMESCALE,
35322
+ trackMediaTimeOffsetInTrackTimescale: 0
35258
35323
  },
35259
35324
  container: "wav",
35260
35325
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -35829,9 +35894,11 @@ var parseLoop = async ({
35829
35894
  try {
35830
35895
  await triggerInfoEmit(state);
35831
35896
  await state.controller._internals.checkForAbortAndPause();
35897
+ const parseLoopStart = Date.now();
35832
35898
  const result = await runParseIteration({
35833
35899
  state
35834
35900
  });
35901
+ state.timings.timeInParseLoop += Date.now() - parseLoopStart;
35835
35902
  if (result !== null && result.action === "fetch-more-data") {
35836
35903
  Log.verbose(state.logLevel, `Need to fetch ${result.bytesNeeded} more bytes before we can continue`);
35837
35904
  const startBytesRemaining = state.iterator.bytesRemaining();
@@ -35918,6 +35985,7 @@ var printTimings = (state) => {
35918
35985
  Log.verbose(state.logLevel, `Time seeking: ${state.timings.timeSeeking}ms`);
35919
35986
  Log.verbose(state.logLevel, `Time checking if done: ${state.timings.timeCheckingIfDone}ms`);
35920
35987
  Log.verbose(state.logLevel, `Time freeing data: ${state.timings.timeFreeingData}ms`);
35988
+ Log.verbose(state.logLevel, `Time in parse loop: ${state.timings.timeInParseLoop}ms`);
35921
35989
  };
35922
35990
  var warningShown = false;
35923
35991
  var warnIfRemotionLicenseNotAcknowledged = ({
@@ -37450,7 +37518,8 @@ var timingsState = () => {
37450
37518
  timeReadingData: 0,
37451
37519
  timeSeeking: 0,
37452
37520
  timeCheckingIfDone: 0,
37453
- timeFreeingData: 0
37521
+ timeFreeingData: 0,
37522
+ timeInParseLoop: 0
37454
37523
  };
37455
37524
  };
37456
37525
  var lastEmittedSampleState = () => {
@@ -183,7 +183,7 @@ var renderContent = (Root) => {
183
183
  renderToDOM(/* @__PURE__ */ jsx("div", {
184
184
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
185
185
  }));
186
- import("./chunk-sgrpvcge.js").then(({ StudioInternals }) => {
186
+ import("./chunk-wzm783qz.js").then(({ StudioInternals }) => {
187
187
  renderToDOM(/* @__PURE__ */ jsx(StudioInternals.Studio, {
188
188
  readOnly: true,
189
189
  rootComponent: Root
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.327",
6
+ "version": "4.0.330",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "sideEffects": false,
@@ -23,21 +23,21 @@
23
23
  "source-map": "0.7.3",
24
24
  "open": "^8.4.2",
25
25
  "zod": "3.22.3",
26
- "remotion": "4.0.327",
27
- "@remotion/media-utils": "4.0.327",
28
- "@remotion/player": "4.0.327",
29
- "@remotion/media-parser": "4.0.327",
30
- "@remotion/renderer": "4.0.327",
31
- "@remotion/studio-shared": "4.0.327",
32
- "@remotion/webcodecs": "4.0.327",
33
- "@remotion/zod-types": "4.0.327"
26
+ "remotion": "4.0.330",
27
+ "@remotion/player": "4.0.330",
28
+ "@remotion/media-utils": "4.0.330",
29
+ "@remotion/media-parser": "4.0.330",
30
+ "@remotion/renderer": "4.0.330",
31
+ "@remotion/studio-shared": "4.0.330",
32
+ "@remotion/webcodecs": "4.0.330",
33
+ "@remotion/zod-types": "4.0.330"
34
34
  },
35
35
  "devDependencies": {
36
36
  "react": "19.0.0",
37
37
  "react-dom": "19.0.0",
38
38
  "@types/semver": "^7.3.4",
39
39
  "eslint": "9.19.0",
40
- "@remotion/eslint-config-internal": "4.0.327"
40
+ "@remotion/eslint-config-internal": "4.0.330"
41
41
  },
42
42
  "publishConfig": {
43
43
  "access": "public"