remotion 4.0.187 → 4.0.188

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 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("react");
4
+ if (typeof react_1.createContext !== 'function') {
5
+ const err = [
6
+ 'Remotion requires React.createContext, but it is "undefined".',
7
+ 'If you are in a React Server Component, turn it into a client component by adding "use client" at the top of the file.',
8
+ '',
9
+ 'Before:',
10
+ ' import {useCurrentFrame} from "remotion";',
11
+ '',
12
+ 'After:',
13
+ ' "use client";',
14
+ ' import {useCurrentFrame} from "remotion";',
15
+ ];
16
+ throw new Error(err.join('\n'));
17
+ }
@@ -1,7 +1,8 @@
1
- export declare const useBufferUntilFirstFrame: ({ mediaRef, mediaType, onVariableFpsVideoDetected, }: {
1
+ export declare const useBufferUntilFirstFrame: ({ mediaRef, mediaType, onVariableFpsVideoDetected, pauseWhenBuffering, }: {
2
2
  mediaRef: React.RefObject<HTMLVideoElement | HTMLAudioElement>;
3
3
  mediaType: 'video' | 'audio';
4
4
  onVariableFpsVideoDetected: () => void;
5
+ pauseWhenBuffering: boolean;
5
6
  }) => {
6
7
  isBuffering: () => boolean;
7
8
  bufferUntilFirstFrame: (requestedTime: number) => void;
@@ -3,13 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useBufferUntilFirstFrame = void 0;
4
4
  const react_1 = require("react");
5
5
  const use_buffer_state_1 = require("./use-buffer-state");
6
- const useBufferUntilFirstFrame = ({ mediaRef, mediaType, onVariableFpsVideoDetected, }) => {
6
+ const useBufferUntilFirstFrame = ({ mediaRef, mediaType, onVariableFpsVideoDetected, pauseWhenBuffering, }) => {
7
7
  const bufferingRef = (0, react_1.useRef)(false);
8
8
  const { delayPlayback } = (0, use_buffer_state_1.useBufferState)();
9
9
  const bufferUntilFirstFrame = (0, react_1.useCallback)((requestedTime) => {
10
10
  if (mediaType !== 'video') {
11
11
  return;
12
12
  }
13
+ if (!pauseWhenBuffering) {
14
+ return;
15
+ }
13
16
  const current = mediaRef.current;
14
17
  if (!current) {
15
18
  return;
@@ -47,7 +50,13 @@ const useBufferUntilFirstFrame = ({ mediaRef, mediaType, onVariableFpsVideoDetec
47
50
  });
48
51
  current.addEventListener('ended', onEndedOrPause, { once: true });
49
52
  current.addEventListener('pause', onEndedOrPause, { once: true });
50
- }, [delayPlayback, mediaRef, mediaType, onVariableFpsVideoDetected]);
53
+ }, [
54
+ delayPlayback,
55
+ mediaRef,
56
+ mediaType,
57
+ onVariableFpsVideoDetected,
58
+ pauseWhenBuffering,
59
+ ]);
51
60
  return (0, react_1.useMemo)(() => {
52
61
  return {
53
62
  isBuffering: () => bufferingRef.current,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("react");
4
+ if (typeof react_1.createContext !== 'function') {
5
+ throw new Error('React 18 is required for Remotion');
6
+ }
@@ -32,21 +32,10 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
32
32
  const { fps } = (0, use_video_config_js_1.useVideoConfig)();
33
33
  const mediaStartsAt = (0, use_audio_frame_js_1.useMediaStartsAt)();
34
34
  const lastSeekDueToShift = (0, react_1.useRef)(null);
35
+ const lastSeek = (0, react_1.useRef)(null);
35
36
  if (!buffering) {
36
37
  throw new Error('useMediaPlayback must be used inside a <BufferingContext>');
37
38
  }
38
- const currentTime = (0, use_request_video_callback_time_js_1.useRequestVideoCallbackTime)(mediaRef, mediaType);
39
- const desiredUnclampedTime = (0, get_current_time_js_1.getMediaTime)({
40
- frame,
41
- playbackRate: localPlaybackRate,
42
- startFrom: -mediaStartsAt,
43
- fps,
44
- });
45
- const isMediaTagBuffering = (0, use_media_buffering_js_1.useMediaBuffering)({
46
- element: mediaRef,
47
- shouldBuffer: pauseWhenBuffering,
48
- isPremounting,
49
- });
50
39
  const isVariableFpsVideoMap = (0, react_1.useRef)({});
51
40
  const onVariableFpsVideoDetected = (0, react_1.useCallback)(() => {
52
41
  if (!src) {
@@ -58,10 +47,28 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
58
47
  }
59
48
  isVariableFpsVideoMap.current[src] = true;
60
49
  }, [debugSeeking, src]);
50
+ const currentTime = (0, use_request_video_callback_time_js_1.useRequestVideoCallbackTime)({
51
+ mediaRef,
52
+ mediaType,
53
+ lastSeek,
54
+ onVariableFpsVideoDetected,
55
+ });
56
+ const desiredUnclampedTime = (0, get_current_time_js_1.getMediaTime)({
57
+ frame,
58
+ playbackRate: localPlaybackRate,
59
+ startFrom: -mediaStartsAt,
60
+ fps,
61
+ });
62
+ const isMediaTagBuffering = (0, use_media_buffering_js_1.useMediaBuffering)({
63
+ element: mediaRef,
64
+ shouldBuffer: pauseWhenBuffering,
65
+ isPremounting,
66
+ });
61
67
  const { bufferUntilFirstFrame, isBuffering } = (0, buffer_until_first_frame_js_1.useBufferUntilFirstFrame)({
62
68
  mediaRef,
63
69
  mediaType,
64
70
  onVariableFpsVideoDetected,
71
+ pauseWhenBuffering,
65
72
  });
66
73
  const playbackRate = localPlaybackRate * globalPlaybackRate;
67
74
  // For short audio, a lower acceptable time shift is used
@@ -137,9 +144,11 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
137
144
  isTime: mediaTagTime,
138
145
  rvcTime,
139
146
  timeShift,
147
+ isVariableFpsVideo,
140
148
  });
141
149
  }
142
150
  seek(mediaRef, shouldBeTime);
151
+ lastSeek.current = shouldBeTime;
143
152
  lastSeekDueToShift.current = shouldBeTime;
144
153
  if (playing && !isVariableFpsVideo) {
145
154
  bufferUntilFirstFrame(shouldBeTime);
@@ -164,6 +173,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
164
173
  if (!playing || isSomethingElseBuffering) {
165
174
  if (makesSenseToSeek) {
166
175
  seek(mediaRef, shouldBeTime);
176
+ lastSeek.current = shouldBeTime;
167
177
  }
168
178
  return;
169
179
  }
@@ -172,6 +182,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
172
182
  absoluteFrame === 0) {
173
183
  if (makesSenseToSeek) {
174
184
  seek(mediaRef, shouldBeTime);
185
+ lastSeek.current = shouldBeTime;
175
186
  }
176
187
  (0, play_and_handle_not_allowed_error_js_1.playAndHandleNotAllowedError)(mediaRef, mediaType, onAutoPlayError);
177
188
  if (!isVariableFpsVideo) {
@@ -1,2 +1,7 @@
1
1
  import type { RefObject } from 'react';
2
- export declare const useRequestVideoCallbackTime: (mediaRef: RefObject<HTMLVideoElement | HTMLAudioElement>, mediaType: 'video' | 'audio') => import("react").MutableRefObject<number | null>;
2
+ export declare const useRequestVideoCallbackTime: ({ mediaRef, mediaType, lastSeek, onVariableFpsVideoDetected, }: {
3
+ mediaRef: RefObject<HTMLVideoElement | HTMLAudioElement>;
4
+ mediaType: 'video' | 'audio';
5
+ lastSeek: React.MutableRefObject<number | null>;
6
+ onVariableFpsVideoDetected: () => void;
7
+ }) => import("react").MutableRefObject<number | null>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useRequestVideoCallbackTime = void 0;
4
4
  const react_1 = require("react");
5
- const useRequestVideoCallbackTime = (mediaRef, mediaType) => {
5
+ const useRequestVideoCallbackTime = ({ mediaRef, mediaType, lastSeek, onVariableFpsVideoDetected, }) => {
6
6
  const currentTime = (0, react_1.useRef)(null);
7
7
  (0, react_1.useEffect)(() => {
8
8
  const { current } = mediaRef;
@@ -27,6 +27,20 @@ const useRequestVideoCallbackTime = (mediaRef, mediaType) => {
27
27
  return;
28
28
  }
29
29
  const cb = videoTag.requestVideoFrameCallback((_, info) => {
30
+ if (currentTime.current !== null) {
31
+ const difference = Math.abs(currentTime.current - info.mediaTime);
32
+ const differenceToLastSeek = Math.abs(lastSeek.current === null
33
+ ? Infinity
34
+ : info.mediaTime - lastSeek.current);
35
+ // If a video suddenly jumps to a position much further than previously
36
+ // and there was no relevant seek
37
+ // Case to be seen with 66a4a49b0862333a56c7d03c.mp4 and autoPlay and pauseWhenBuffering
38
+ if (difference > 0.5 &&
39
+ differenceToLastSeek > 0.5 &&
40
+ info.mediaTime > currentTime.current) {
41
+ onVariableFpsVideoDetected();
42
+ }
43
+ }
30
44
  currentTime.current = info.mediaTime;
31
45
  request();
32
46
  });
@@ -39,7 +53,7 @@ const useRequestVideoCallbackTime = (mediaRef, mediaType) => {
39
53
  return () => {
40
54
  cancel();
41
55
  };
42
- }, [mediaRef, mediaType]);
56
+ }, [lastSeek, mediaRef, mediaType, onVariableFpsVideoDetected]);
43
57
  return currentTime;
44
58
  };
45
59
  exports.useRequestVideoCallbackTime = useRequestVideoCallbackTime;
@@ -3,4 +3,4 @@
3
3
  * @see [Documentation](https://remotion.dev/docs/version)
4
4
  * @returns {string} The current version of the remotion package
5
5
  */
6
- export declare const VERSION = "4.0.187";
6
+ export declare const VERSION = "4.0.188";
@@ -7,4 +7,4 @@ exports.VERSION = void 0;
7
7
  * @see [Documentation](https://remotion.dev/docs/version)
8
8
  * @returns {string} The current version of the remotion package
9
9
  */
10
- exports.VERSION = '4.0.187';
10
+ exports.VERSION = '4.0.188';
@@ -136,6 +136,13 @@ const OffthreadVideoForRendering = ({ onError, volume: volumeProp, playbackRate,
136
136
  });
137
137
  }
138
138
  catch (err) {
139
+ // If component is unmounted, we should not throw
140
+ if (err.message.includes('aborted')) {
141
+ return;
142
+ }
143
+ if (controller.signal.aborted) {
144
+ return;
145
+ }
139
146
  if (onError) {
140
147
  onError(err);
141
148
  }
@@ -138,7 +138,7 @@ function truthy(value) {
138
138
  }
139
139
 
140
140
  // src/version.ts
141
- var VERSION = "4.0.187";
141
+ var VERSION = "4.0.188";
142
142
 
143
143
  // src/multiple-versions-warning.ts
144
144
  var checkMultipleRemotionVersions = () => {
@@ -2406,7 +2406,8 @@ var useBufferState = () => {
2406
2406
  var useBufferUntilFirstFrame = ({
2407
2407
  mediaRef,
2408
2408
  mediaType,
2409
- onVariableFpsVideoDetected
2409
+ onVariableFpsVideoDetected,
2410
+ pauseWhenBuffering
2410
2411
  }) => {
2411
2412
  const bufferingRef = useRef3(false);
2412
2413
  const { delayPlayback } = useBufferState();
@@ -2414,6 +2415,9 @@ var useBufferUntilFirstFrame = ({
2414
2415
  if (mediaType !== "video") {
2415
2416
  return;
2416
2417
  }
2418
+ if (!pauseWhenBuffering) {
2419
+ return;
2420
+ }
2417
2421
  const current = mediaRef.current;
2418
2422
  if (!current) {
2419
2423
  return;
@@ -2447,7 +2451,13 @@ var useBufferUntilFirstFrame = ({
2447
2451
  });
2448
2452
  current.addEventListener("ended", onEndedOrPause, { once: true });
2449
2453
  current.addEventListener("pause", onEndedOrPause, { once: true });
2450
- }, [delayPlayback, mediaRef, mediaType, onVariableFpsVideoDetected]);
2454
+ }, [
2455
+ delayPlayback,
2456
+ mediaRef,
2457
+ mediaType,
2458
+ onVariableFpsVideoDetected,
2459
+ pauseWhenBuffering
2460
+ ]);
2451
2461
  return useMemo17(() => {
2452
2462
  return {
2453
2463
  isBuffering: () => bufferingRef.current,
@@ -2532,7 +2542,12 @@ var useMediaBuffering = ({
2532
2542
 
2533
2543
  // src/use-request-video-callback-time.ts
2534
2544
  import {useEffect as useEffect11, useRef as useRef4} from "react";
2535
- var useRequestVideoCallbackTime = (mediaRef, mediaType) => {
2545
+ var useRequestVideoCallbackTime = ({
2546
+ mediaRef,
2547
+ mediaType,
2548
+ lastSeek,
2549
+ onVariableFpsVideoDetected
2550
+ }) => {
2536
2551
  const currentTime = useRef4(null);
2537
2552
  useEffect11(() => {
2538
2553
  const { current } = mediaRef;
@@ -2558,6 +2573,13 @@ var useRequestVideoCallbackTime = (mediaRef, mediaType) => {
2558
2573
  return;
2559
2574
  }
2560
2575
  const cb = videoTag.requestVideoFrameCallback((_, info) => {
2576
+ if (currentTime.current !== null) {
2577
+ const difference = Math.abs(currentTime.current - info.mediaTime);
2578
+ const differenceToLastSeek = Math.abs(lastSeek.current === null ? Infinity : info.mediaTime - lastSeek.current);
2579
+ if (difference > 0.5 && differenceToLastSeek > 0.5 && info.mediaTime > currentTime.current) {
2580
+ onVariableFpsVideoDetected();
2581
+ }
2582
+ }
2561
2583
  currentTime.current = info.mediaTime;
2562
2584
  request();
2563
2585
  });
@@ -2572,7 +2594,7 @@ var useRequestVideoCallbackTime = (mediaRef, mediaType) => {
2572
2594
  return () => {
2573
2595
  cancel();
2574
2596
  };
2575
- }, [mediaRef, mediaType]);
2597
+ }, [lastSeek, mediaRef, mediaType, onVariableFpsVideoDetected]);
2576
2598
  return currentTime;
2577
2599
  };
2578
2600
 
@@ -2842,10 +2864,26 @@ var useMediaPlayback = ({
2842
2864
  const { fps } = useVideoConfig();
2843
2865
  const mediaStartsAt = useMediaStartsAt();
2844
2866
  const lastSeekDueToShift = useRef6(null);
2867
+ const lastSeek = useRef6(null);
2845
2868
  if (!buffering3) {
2846
2869
  throw new Error("useMediaPlayback must be used inside a <BufferingContext>");
2847
2870
  }
2848
- const currentTime = useRequestVideoCallbackTime(mediaRef, mediaType);
2871
+ const isVariableFpsVideoMap = useRef6({});
2872
+ const onVariableFpsVideoDetected = useCallback7(() => {
2873
+ if (!src) {
2874
+ return;
2875
+ }
2876
+ if (debugSeeking) {
2877
+ console.log(`Detected ${src} as a variable FPS video. Disabling buffering while seeking.`);
2878
+ }
2879
+ isVariableFpsVideoMap.current[src] = true;
2880
+ }, [debugSeeking, src]);
2881
+ const currentTime = useRequestVideoCallbackTime({
2882
+ mediaRef,
2883
+ mediaType,
2884
+ lastSeek,
2885
+ onVariableFpsVideoDetected
2886
+ });
2849
2887
  const desiredUnclampedTime = getMediaTime({
2850
2888
  frame,
2851
2889
  playbackRate: localPlaybackRate,
@@ -2857,20 +2895,11 @@ var useMediaPlayback = ({
2857
2895
  shouldBuffer: pauseWhenBuffering,
2858
2896
  isPremounting
2859
2897
  });
2860
- const isVariableFpsVideoMap = useRef6({});
2861
- const onVariableFpsVideoDetected = useCallback7(() => {
2862
- if (!src) {
2863
- return;
2864
- }
2865
- if (debugSeeking) {
2866
- console.log(`Detected ${src} as a variable FPS video. Disabling buffering while seeking.`);
2867
- }
2868
- isVariableFpsVideoMap.current[src] = true;
2869
- }, [debugSeeking, src]);
2870
2898
  const { bufferUntilFirstFrame, isBuffering } = useBufferUntilFirstFrame({
2871
2899
  mediaRef,
2872
2900
  mediaType,
2873
- onVariableFpsVideoDetected
2901
+ onVariableFpsVideoDetected,
2902
+ pauseWhenBuffering
2874
2903
  });
2875
2904
  const playbackRate = localPlaybackRate * globalPlaybackRate;
2876
2905
  const acceptableTimeShiftButLessThanDuration = (() => {
@@ -2932,10 +2961,12 @@ var useMediaPlayback = ({
2932
2961
  shouldBeTime,
2933
2962
  isTime: mediaTagTime,
2934
2963
  rvcTime,
2935
- timeShift
2964
+ timeShift,
2965
+ isVariableFpsVideo
2936
2966
  });
2937
2967
  }
2938
2968
  seek(mediaRef, shouldBeTime);
2969
+ lastSeek.current = shouldBeTime;
2939
2970
  lastSeekDueToShift.current = shouldBeTime;
2940
2971
  if (playing && !isVariableFpsVideo) {
2941
2972
  bufferUntilFirstFrame(shouldBeTime);
@@ -2955,12 +2986,14 @@ var useMediaPlayback = ({
2955
2986
  if (!playing || isSomethingElseBuffering) {
2956
2987
  if (makesSenseToSeek) {
2957
2988
  seek(mediaRef, shouldBeTime);
2989
+ lastSeek.current = shouldBeTime;
2958
2990
  }
2959
2991
  return;
2960
2992
  }
2961
2993
  if (mediaRef.current.paused && !mediaRef.current.ended || absoluteFrame === 0) {
2962
2994
  if (makesSenseToSeek) {
2963
2995
  seek(mediaRef, shouldBeTime);
2996
+ lastSeek.current = shouldBeTime;
2964
2997
  }
2965
2998
  playAndHandleNotAllowedError(mediaRef, mediaType, onAutoPlayError);
2966
2999
  if (!isVariableFpsVideo) {
@@ -5871,6 +5904,12 @@ var OffthreadVideoForRendering = ({
5871
5904
  handle: newHandle
5872
5905
  });
5873
5906
  } catch (err) {
5907
+ if (err.message.includes("aborted")) {
5908
+ return;
5909
+ }
5910
+ if (controller.signal.aborted) {
5911
+ return;
5912
+ }
5874
5913
  if (onError) {
5875
5914
  onError(err);
5876
5915
  } else {
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "4.0.187";
2
+ var VERSION = "4.0.188";
3
3
  export {
4
4
  VERSION
5
5
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/core"
4
4
  },
5
5
  "name": "remotion",
6
- "version": "4.0.187",
6
+ "version": "4.0.188",
7
7
  "description": "Make videos programmatically",
8
8
  "main": "dist/cjs/index.js",
9
9
  "types": "dist/cjs/index.d.ts",