@remotion/media 4.0.508 → 4.0.510

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.
@@ -16,7 +16,7 @@ export declare const anchorToContinuousTime: ({ anchor, unloopedTimeInSeconds, p
16
16
  unloopedTimeInSeconds: number;
17
17
  playbackRate: number;
18
18
  }) => number;
19
- export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getSequenceEndTimestamp, getSequenceDurationInSeconds, getMediaEndTimestamp, getStartTime, initialMuted, drawDebugOverlay, initialPlaybackRate, initialTrimBefore, initialTrimAfter, initialSequenceOffset, initialSequenceDurationInFrames, initialLoop, initialFps, }: {
19
+ export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getSequenceEndTimestamp, getSequenceDurationInSeconds, getMediaEndTimestamp, getStartTime, initialMuted, drawDebugOverlay, }: {
20
20
  audioTrack: InputAudioTrack;
21
21
  delayPlaybackHandleIfNotPremounting: () => DelayPlaybackIfNotPremounting;
22
22
  sharedAudioContext: SharedAudioContextForMediaPlayer;
@@ -26,13 +26,6 @@ export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfN
26
26
  getStartTime: () => number;
27
27
  initialMuted: boolean;
28
28
  drawDebugOverlay: () => void;
29
- initialPlaybackRate: number;
30
- initialTrimBefore: number | undefined;
31
- initialTrimAfter: number | undefined;
32
- initialSequenceOffset: number;
33
- initialSequenceDurationInFrames: number;
34
- initialLoop: boolean;
35
- initialFps: number;
36
29
  }) => {
37
30
  startAudioIterator: ({ nonce, playbackRate, startFromSecond, unloopedStartFromSecond, scheduleAudioNode, getTargetTime, logLevel, loop, unscheduleAudioNode, getAudioContextCurrentTimeMockedInTest, }: {
38
31
  startFromSecond: number;
package/dist/caches.d.ts CHANGED
@@ -90,8 +90,8 @@ export declare const makeMediaCache: () => {
90
90
  totalSize: number;
91
91
  };
92
92
  isDisposed: () => boolean;
93
- queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
94
- queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
93
+ queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
94
+ queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
95
95
  dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
96
96
  };
97
97
  export type MediaCache = ReturnType<typeof makeMediaCache>;
@@ -185,8 +185,8 @@ export declare const globalMediaCache: {
185
185
  totalSize: number;
186
186
  };
187
187
  isDisposed: () => boolean;
188
- queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
189
- queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
188
+ queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
189
+ queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
190
190
  dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
191
191
  };
192
192
  export declare const keyframeManager: {
@@ -352,8 +352,8 @@ export declare const useRenderMediaCache: (logLevel: "error" | "info" | "trace"
352
352
  totalSize: number;
353
353
  };
354
354
  isDisposed: () => boolean;
355
- queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
356
- queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
355
+ queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
356
+ queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
357
357
  dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
358
358
  };
359
359
  export { getMaxVideoCacheSize };
@@ -435,27 +435,11 @@ var audioIteratorManager = ({
435
435
  getMediaEndTimestamp,
436
436
  getStartTime,
437
437
  initialMuted,
438
- drawDebugOverlay,
439
- initialPlaybackRate,
440
- initialTrimBefore,
441
- initialTrimAfter,
442
- initialSequenceOffset,
443
- initialSequenceDurationInFrames,
444
- initialLoop,
445
- initialFps
438
+ drawDebugOverlay
446
439
  }) => {
447
440
  let muted = initialMuted;
448
441
  let currentVolume = 1;
449
- let currentSeek = {
450
- time: -1,
451
- playbackRate: initialPlaybackRate,
452
- trimBefore: initialTrimBefore,
453
- trimAfter: initialTrimAfter,
454
- sequenceOffset: initialSequenceOffset,
455
- sequenceDurationInFrames: initialSequenceDurationInFrames,
456
- loop: initialLoop,
457
- fps: initialFps
458
- };
442
+ let currentSeek = null;
459
443
  const gainNode = sharedAudioContext.audioContext.createGain();
460
444
  gainNode.connect(sharedAudioContext.gainNode);
461
445
  const audioSink = new AudioBufferSink(audioTrack);
@@ -735,7 +719,7 @@ var audioIteratorManager = ({
735
719
  if (nonce.isStale()) {
736
720
  return;
737
721
  }
738
- if (currentSeek.time === newTime && currentSeek.playbackRate === playbackRate && currentSeek.trimBefore === trimBefore && currentSeek.trimAfter === trimAfter && currentSeek.sequenceOffset === sequenceOffset && currentSeek.sequenceDurationInFrames === sequenceDurationInFrames && currentSeek.loop === loop && currentSeek.fps === fps) {
722
+ if (currentSeek !== null && currentSeek.time === newTime && currentSeek.playbackRate === playbackRate && currentSeek.trimBefore === trimBefore && currentSeek.trimAfter === trimAfter && currentSeek.sequenceOffset === sequenceOffset && currentSeek.sequenceDurationInFrames === sequenceDurationInFrames && currentSeek.loop === loop && currentSeek.fps === fps) {
739
723
  return;
740
724
  }
741
725
  currentSeek = {
@@ -794,6 +778,7 @@ var audioIteratorManager = ({
794
778
  audioBufferIterator?.destroy();
795
779
  audioBufferIterator = null;
796
780
  currentAnchor = null;
781
+ currentSeek = null;
797
782
  unblockCurrentDelayHandle();
798
783
  },
799
784
  seek,
@@ -1845,8 +1830,7 @@ class MediaPlayer {
1845
1830
  this.getEffectChainState = getEffectChainState;
1846
1831
  if (canvas) {
1847
1832
  const context = canvas.getContext("2d", {
1848
- alpha: true,
1849
- desynchronized: true
1833
+ alpha: true
1850
1834
  });
1851
1835
  if (!context) {
1852
1836
  throw new Error("Could not get 2D context from canvas");
@@ -1987,14 +1971,7 @@ class MediaPlayer {
1987
1971
  getStartTime: () => this.getStartTime(),
1988
1972
  initialMuted,
1989
1973
  drawDebugOverlay: this.drawDebugOverlay,
1990
- initialPlaybackRate: this.playbackRate * this.globalPlaybackRate,
1991
- getSequenceDurationInSeconds: () => this.getSequenceDurationInSeconds(),
1992
- initialTrimBefore: this.trimBefore,
1993
- initialTrimAfter: this.trimAfter,
1994
- initialSequenceOffset: this.sequenceOffset,
1995
- initialSequenceDurationInFrames: this.sequenceDurationInFrames,
1996
- initialLoop: this.loop,
1997
- initialFps: this.fps
1974
+ getSequenceDurationInSeconds: () => this.getSequenceDurationInSeconds()
1998
1975
  });
1999
1976
  }
2000
1977
  const nonce = this.nonceManager.createAsyncOperation();
@@ -2844,6 +2821,20 @@ import { Internals as Internals15 } from "remotion";
2844
2821
  // src/audio-extraction/audio-manager.ts
2845
2822
  import { Internals as Internals10 } from "remotion";
2846
2823
 
2824
+ // src/serialized-queue.ts
2825
+ var makeSerializedQueue = () => {
2826
+ let tail = Promise.resolve(undefined);
2827
+ return (fn) => {
2828
+ const result = tail.then(() => fn());
2829
+ tail = result.then(() => {
2830
+ return;
2831
+ }, () => {
2832
+ return;
2833
+ });
2834
+ return result;
2835
+ };
2836
+ };
2837
+
2847
2838
  // src/audio-extraction/audio-iterator.ts
2848
2839
  import { Internals as Internals9 } from "remotion";
2849
2840
 
@@ -3192,7 +3183,7 @@ var makeAudioManager = ({
3192
3183
  disposed = true;
3193
3184
  clearAll();
3194
3185
  };
3195
- let queue = Promise.resolve(undefined);
3186
+ const enqueue = makeSerializedQueue();
3196
3187
  return {
3197
3188
  getIterator: ({
3198
3189
  src,
@@ -3203,7 +3194,7 @@ var makeAudioManager = ({
3203
3194
  logLevel,
3204
3195
  maxCacheSize
3205
3196
  }) => {
3206
- queue = queue.then(() => getIterator({
3197
+ return enqueue(() => getIterator({
3207
3198
  src,
3208
3199
  timeInSeconds,
3209
3200
  audioSampleSink,
@@ -3212,7 +3203,6 @@ var makeAudioManager = ({
3212
3203
  logLevel,
3213
3204
  maxCacheSize
3214
3205
  }));
3215
- return queue;
3216
3206
  },
3217
3207
  getCacheStats,
3218
3208
  getIteratorMostInThePast,
@@ -3634,7 +3624,7 @@ var makeKeyframeBank = async ({
3634
3624
  const getLastUsed = () => {
3635
3625
  return lastUsed;
3636
3626
  };
3637
- let queue = Promise.resolve(undefined);
3627
+ const enqueue = makeSerializedQueue();
3638
3628
  const firstFrame = await sampleIterator.next();
3639
3629
  if (!firstFrame.value) {
3640
3630
  throw new Error("No first frame found");
@@ -3699,18 +3689,16 @@ var makeKeyframeBank = async ({
3699
3689
  const keyframeBank = {
3700
3690
  getFrameFromTimestamp: (timestamp, fps) => {
3701
3691
  pendingOperations++;
3702
- queue = queue.then(() => getFrameFromTimestamp(timestamp, fps)).finally(() => {
3692
+ return enqueue(() => getFrameFromTimestamp(timestamp, fps)).finally(() => {
3703
3693
  pendingOperations--;
3704
3694
  });
3705
- return queue;
3706
3695
  },
3707
3696
  prepareForDeletion,
3708
3697
  hasTimestampInSecond: (timestamp, fps) => {
3709
3698
  pendingOperations++;
3710
- queue = queue.then(() => hasTimestampInSecond(timestamp, fps)).finally(() => {
3699
+ return enqueue(() => hasTimestampInSecond(timestamp, fps)).finally(() => {
3711
3700
  pendingOperations--;
3712
3701
  });
3713
- return queue;
3714
3702
  },
3715
3703
  addFrame,
3716
3704
  deleteFramesBeforeTimestamp,
@@ -3958,7 +3946,7 @@ var makeKeyframeManager = ({
3958
3946
  disposed = true;
3959
3947
  clearAll(logLevel);
3960
3948
  };
3961
- let queue = Promise.resolve(undefined);
3949
+ const enqueue = makeSerializedQueue();
3962
3950
  return {
3963
3951
  requestKeyframeBank: ({
3964
3952
  timestamp,
@@ -3968,7 +3956,7 @@ var makeKeyframeManager = ({
3968
3956
  maxCacheSize,
3969
3957
  fps
3970
3958
  }) => {
3971
- queue = queue.then(() => requestKeyframeBank({
3959
+ return enqueue(() => requestKeyframeBank({
3972
3960
  timestamp,
3973
3961
  videoSampleSink,
3974
3962
  src,
@@ -3976,7 +3964,6 @@ var makeKeyframeManager = ({
3976
3964
  maxCacheSize,
3977
3965
  fps
3978
3966
  }));
3979
- return queue;
3980
3967
  },
3981
3968
  getCacheStats,
3982
3969
  clearAll,
@@ -4012,8 +3999,8 @@ var makeMediaCache = () => {
4012
3999
  });
4013
4000
  managerInstances.keyframe = keyframeManagerInstance;
4014
4001
  managerInstances.audio = audioManagerInstance;
4015
- let frameExtractionQueue = Promise.resolve(undefined);
4016
- let audioExtractionQueue = Promise.resolve(undefined);
4002
+ const queueFrameExtraction = makeSerializedQueue();
4003
+ const queueAudioExtraction = makeSerializedQueue();
4017
4004
  let disposed = false;
4018
4005
  return {
4019
4006
  sinkManager,
@@ -4021,20 +4008,8 @@ var makeMediaCache = () => {
4021
4008
  audioManager: audioManagerInstance,
4022
4009
  getTotalCacheStats: getCacheStats,
4023
4010
  isDisposed: () => disposed,
4024
- queueFrameExtraction: (extract) => {
4025
- const extraction = frameExtractionQueue.then(extract);
4026
- frameExtractionQueue = extraction.catch(() => {
4027
- return;
4028
- });
4029
- return extraction;
4030
- },
4031
- queueAudioExtraction: (extract) => {
4032
- const extraction = audioExtractionQueue.then(extract);
4033
- audioExtractionQueue = extraction.catch(() => {
4034
- return;
4035
- });
4036
- return extraction;
4037
- },
4011
+ queueFrameExtraction,
4012
+ queueAudioExtraction,
4038
4013
  dispose: (logLevel) => {
4039
4014
  if (disposed) {
4040
4015
  return;
@@ -5566,8 +5541,7 @@ var VideoForPreviewAssertedShowing = ({
5566
5541
  canvas.width = cached.width;
5567
5542
  canvas.height = cached.height;
5568
5543
  const ctx = canvas.getContext("2d", {
5569
- alpha: true,
5570
- desynchronized: true
5544
+ alpha: true
5571
5545
  });
5572
5546
  if (!ctx) {
5573
5547
  return;
@@ -106,8 +106,8 @@ export declare const extractFrameAndAudio: ({ src, timeInSeconds, logLevel, dura
106
106
  totalSize: number;
107
107
  };
108
108
  isDisposed: () => boolean;
109
- queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
110
- queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
109
+ queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
110
+ queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
111
111
  dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
112
112
  };
113
113
  }) => Promise<ExtractFrameViaBroadcastChannelResult>;
@@ -0,0 +1 @@
1
+ export declare const makeSerializedQueue: () => <T>(fn: () => T | Promise<T>) => Promise<T>;
@@ -126,8 +126,8 @@ export declare const extractFrameViaBroadcastChannel: ({ src, timeInSeconds, log
126
126
  totalSize: number;
127
127
  };
128
128
  isDisposed: () => boolean;
129
- queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
130
- queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
129
+ queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
130
+ queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
131
131
  dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
132
132
  };
133
133
  }) => Promise<ExtractFrameViaBroadcastChannelResult>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/media",
3
- "version": "4.0.508",
3
+ "version": "4.0.510",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/esm/index.mjs",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "mediabunny": "1.50.8",
26
- "remotion": "4.0.508",
26
+ "remotion": "4.0.510",
27
27
  "zod": "4.4.3"
28
28
  },
29
29
  "peerDependencies": {
@@ -31,8 +31,8 @@
31
31
  "react-dom": ">=16.8.0"
32
32
  },
33
33
  "devDependencies": {
34
- "@remotion/eslint-config-internal": "4.0.508",
35
- "@remotion/player": "4.0.508",
34
+ "@remotion/eslint-config-internal": "4.0.510",
35
+ "@remotion/player": "4.0.510",
36
36
  "@vitest/browser-webdriverio": "4.0.9",
37
37
  "eslint": "9.19.0",
38
38
  "react": "19.2.3",