remotion 3.3.55 → 3.3.56

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.
Files changed (143) hide show
  1. package/dist/cjs/audio/Audio.d.ts +1 -1
  2. package/dist/cjs/index.d.ts +1 -0
  3. package/dist/cjs/internals.d.ts +1 -1
  4. package/dist/cjs/use-video.d.ts +1 -1
  5. package/dist/cjs/version.d.ts +1 -1
  6. package/dist/cjs/version.js +1 -1
  7. package/dist/esm/index.mjs +1 -1
  8. package/dist/esm/version.mjs +1 -1
  9. package/dist/tsconfig-esm.tsbuildinfo +1 -0
  10. package/package.json +3 -3
  11. package/tsconfig-esm.json +12 -0
  12. package/dist/esm/AbsoluteFill.js +0 -25
  13. package/dist/esm/CanUseRemotionHooks.js +0 -6
  14. package/dist/esm/Clipper.js +0 -20
  15. package/dist/esm/Composition.js +0 -112
  16. package/dist/esm/CompositionManager.js +0 -137
  17. package/dist/esm/Folder.js +0 -33
  18. package/dist/esm/IFrame.js +0 -25
  19. package/dist/esm/Img.js +0 -53
  20. package/dist/esm/NativeLayers.js +0 -25
  21. package/dist/esm/Null.js +0 -21
  22. package/dist/esm/RemotionRoot.js +0 -69
  23. package/dist/esm/Sequence.js +0 -128
  24. package/dist/esm/SequenceContext.js +0 -2
  25. package/dist/esm/Still.js +0 -9
  26. package/dist/esm/absolute-src.js +0 -3
  27. package/dist/esm/asset-types.js +0 -1
  28. package/dist/esm/audio/Audio.js +0 -53
  29. package/dist/esm/audio/AudioForDevelopment.js +0 -91
  30. package/dist/esm/audio/AudioForRendering.js +0 -108
  31. package/dist/esm/audio/index.js +0 -2
  32. package/dist/esm/audio/props.js +0 -1
  33. package/dist/esm/audio/shared-audio-tags.js +0 -194
  34. package/dist/esm/audio/use-audio-frame.js +0 -18
  35. package/dist/esm/bezier.js +0 -110
  36. package/dist/esm/cancel-render.js +0 -43
  37. package/dist/esm/config/input-props.js +0 -27
  38. package/dist/esm/config.js +0 -17
  39. package/dist/esm/default-css.js +0 -44
  40. package/dist/esm/delay-render.js +0 -72
  41. package/dist/esm/easing.js +0 -77
  42. package/dist/esm/freeze.js +0 -34
  43. package/dist/esm/get-asset-file-name.js +0 -10
  44. package/dist/esm/get-environment.js +0 -29
  45. package/dist/esm/get-preview-dom-element.js +0 -3
  46. package/dist/esm/get-static-files.js +0 -31
  47. package/dist/esm/get-timeline-clip-name.js +0 -21
  48. package/dist/esm/index.js +0 -49
  49. package/dist/esm/internals.js +0 -75
  50. package/dist/esm/interpolate-colors.js +0 -401
  51. package/dist/esm/interpolate.js +0 -123
  52. package/dist/esm/is-approximately-the-same.js +0 -4
  53. package/dist/esm/is-player.js +0 -9
  54. package/dist/esm/loading-indicator.js +0 -31
  55. package/dist/esm/loop/index.js +0 -29
  56. package/dist/esm/multiple-versions-warning.js +0 -28
  57. package/dist/esm/nonce.js +0 -13
  58. package/dist/esm/play-and-handle-not-allowed-error.js +0 -40
  59. package/dist/esm/portal-node.js +0 -19
  60. package/dist/esm/prefetch-state.js +0 -22
  61. package/dist/esm/prefetch.js +0 -107
  62. package/dist/esm/random.js +0 -37
  63. package/dist/esm/register-root.js +0 -31
  64. package/dist/esm/series/flatten-children.js +0 -12
  65. package/dist/esm/series/index.js +0 -61
  66. package/dist/esm/setup-env-variables.js +0 -32
  67. package/dist/esm/spring/index.js +0 -50
  68. package/dist/esm/spring/measure-spring.js +0 -64
  69. package/dist/esm/spring/spring-utils.js +0 -99
  70. package/dist/esm/static-file.js +0 -29
  71. package/dist/esm/test/Img.test.js +0 -20
  72. package/dist/esm/test/absolute-src.test.js +0 -16
  73. package/dist/esm/test/audio-for-rendering.test.js +0 -83
  74. package/dist/esm/test/audio.test.js +0 -51
  75. package/dist/esm/test/bezier.test.js +0 -50
  76. package/dist/esm/test/composition-rules.test.js +0 -28
  77. package/dist/esm/test/composition-validation.test.js +0 -97
  78. package/dist/esm/test/easing.test.js +0 -189
  79. package/dist/esm/test/expect-to-throw.js +0 -11
  80. package/dist/esm/test/freeze.test.js +0 -63
  81. package/dist/esm/test/get-asset-file-name.test.js +0 -12
  82. package/dist/esm/test/get-current-time.test.js +0 -72
  83. package/dist/esm/test/input-props.test.js +0 -29
  84. package/dist/esm/test/interpolate.test.js +0 -136
  85. package/dist/esm/test/interpolateColors.test.js +0 -61
  86. package/dist/esm/test/loop-validation.test.js +0 -68
  87. package/dist/esm/test/measure-spring.test.js +0 -43
  88. package/dist/esm/test/media-validation.test.js +0 -45
  89. package/dist/esm/test/nested-sequences.test.js +0 -130
  90. package/dist/esm/test/not-all-props-in-media-tags.test.js +0 -28
  91. package/dist/esm/test/random.test.js +0 -58
  92. package/dist/esm/test/ready-manager.test.js +0 -27
  93. package/dist/esm/test/render-hook.js +0 -20
  94. package/dist/esm/test/sequence-from-initial-offset.test.js +0 -33
  95. package/dist/esm/test/sequence-validation.test.js +0 -45
  96. package/dist/esm/test/series.test.js +0 -113
  97. package/dist/esm/test/spring.test.js +0 -36
  98. package/dist/esm/test/truthy.test.js +0 -22
  99. package/dist/esm/test/use-audio-frame.test.js +0 -53
  100. package/dist/esm/test/use-media-in-timeline.test.js +0 -49
  101. package/dist/esm/test/use-media-tag-volume.test.js +0 -44
  102. package/dist/esm/test/use-sync-volume-with-media-tag.test.js +0 -53
  103. package/dist/esm/test/validate-start-from-props.test.js +0 -37
  104. package/dist/esm/test/video.test.js +0 -55
  105. package/dist/esm/test/volume-prop.test.js +0 -93
  106. package/dist/esm/test/wrap-sequence-context.js +0 -37
  107. package/dist/esm/timeline-position-state.js +0 -35
  108. package/dist/esm/truthy.js +0 -3
  109. package/dist/esm/use-current-frame.js +0 -23
  110. package/dist/esm/use-lazy-component.js +0 -22
  111. package/dist/esm/use-media-in-timeline.js +0 -125
  112. package/dist/esm/use-media-playback.js +0 -73
  113. package/dist/esm/use-media-tag-volume.js +0 -27
  114. package/dist/esm/use-sync-volume-with-media-tag.js +0 -17
  115. package/dist/esm/use-unsafe-video-config.js +0 -23
  116. package/dist/esm/use-video-config.js +0 -26
  117. package/dist/esm/use-video.js +0 -24
  118. package/dist/esm/validate-frame.js +0 -20
  119. package/dist/esm/validate-media-props.js +0 -20
  120. package/dist/esm/validate-start-from-props.js +0 -27
  121. package/dist/esm/validation/validate-composition-id.js +0 -8
  122. package/dist/esm/validation/validate-dimensions.js +0 -17
  123. package/dist/esm/validation/validate-duration-in-frames.js +0 -11
  124. package/dist/esm/validation/validate-folder-name.js +0 -14
  125. package/dist/esm/validation/validate-fps.js +0 -17
  126. package/dist/esm/validation/validate-offthreadvideo-image-format.js +0 -11
  127. package/dist/esm/validation/validation-spring-duration.js +0 -17
  128. package/dist/esm/version.js +0 -2
  129. package/dist/esm/video/OffthreadVideo.js +0 -33
  130. package/dist/esm/video/OffthreadVideoForRendering.js +0 -100
  131. package/dist/esm/video/Video.js +0 -51
  132. package/dist/esm/video/VideoForDevelopment.js +0 -110
  133. package/dist/esm/video/VideoForRendering.js +0 -200
  134. package/dist/esm/video/duration-state.js +0 -29
  135. package/dist/esm/video/get-current-time.js +0 -26
  136. package/dist/esm/video/index.js +0 -2
  137. package/dist/esm/video/props.js +0 -1
  138. package/dist/esm/video/video-fragment.js +0 -55
  139. package/dist/esm/video-config.js +0 -1
  140. package/dist/esm/volume-position-state.js +0 -27
  141. package/dist/esm/volume-prop.js +0 -20
  142. package/dist/esm/warn-about-non-seekable-media.js +0 -30
  143. package/dist/esm/wrap-remotion-context.js +0 -45
@@ -1,110 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useContext, useEffect, useImperativeHandle, useRef, } from 'react';
3
- import { useFrameForVolumeProp } from '../audio/use-audio-frame.js';
4
- import { usePreload } from '../prefetch.js';
5
- import { SequenceContext } from '../SequenceContext.js';
6
- import { useMediaInTimeline } from '../use-media-in-timeline.js';
7
- import { DEFAULT_ACCEPTABLE_TIMESHIFT, useMediaPlayback, } from '../use-media-playback.js';
8
- import { useMediaTagVolume } from '../use-media-tag-volume.js';
9
- import { useSyncVolumeWithMediaTag } from '../use-sync-volume-with-media-tag.js';
10
- import { useVideoConfig } from '../use-video-config.js';
11
- import { useMediaMutedState, useMediaVolumeState, } from '../volume-position-state.js';
12
- import { useAppendVideoFragment } from './video-fragment.js';
13
- const VideoForDevelopmentRefForwardingFunction = (props, ref) => {
14
- var _a, _b;
15
- const videoRef = useRef(null);
16
- const volumePropFrame = useFrameForVolumeProp();
17
- const { fps, durationInFrames } = useVideoConfig();
18
- const parentSequence = useContext(SequenceContext);
19
- const { volume, muted, playbackRate, onlyWarnForMediaSeekingError, src, onDuration,
20
- // @ts-expect-error
21
- acceptableTimeShift, acceptableTimeShiftInSeconds, ...nativeProps } = props;
22
- if (typeof acceptableTimeShift !== 'undefined') {
23
- throw new Error('acceptableTimeShift has been removed. Use acceptableTimeShiftInSeconds instead.');
24
- }
25
- const actualVolume = useMediaTagVolume(videoRef);
26
- const [mediaVolume] = useMediaVolumeState();
27
- const [mediaMuted] = useMediaMutedState();
28
- useMediaInTimeline({
29
- mediaRef: videoRef,
30
- volume,
31
- mediaVolume,
32
- mediaType: 'video',
33
- src,
34
- playbackRate: (_a = props.playbackRate) !== null && _a !== void 0 ? _a : 1,
35
- });
36
- useSyncVolumeWithMediaTag({
37
- volumePropFrame,
38
- actualVolume,
39
- volume,
40
- mediaVolume,
41
- mediaRef: videoRef,
42
- });
43
- useMediaPlayback({
44
- mediaRef: videoRef,
45
- src,
46
- mediaType: 'video',
47
- playbackRate: (_b = props.playbackRate) !== null && _b !== void 0 ? _b : 1,
48
- onlyWarnForMediaSeekingError,
49
- acceptableTimeshift: acceptableTimeShiftInSeconds !== null && acceptableTimeShiftInSeconds !== void 0 ? acceptableTimeShiftInSeconds : DEFAULT_ACCEPTABLE_TIMESHIFT,
50
- });
51
- const actualFrom = parentSequence
52
- ? parentSequence.relativeFrom + parentSequence.cumulatedFrom
53
- : 0;
54
- const duration = parentSequence
55
- ? Math.min(parentSequence.durationInFrames, durationInFrames)
56
- : durationInFrames;
57
- const actualSrc = useAppendVideoFragment({
58
- actualSrc: usePreload(src),
59
- actualFrom,
60
- duration,
61
- fps,
62
- });
63
- useImperativeHandle(ref, () => {
64
- return videoRef.current;
65
- }, []);
66
- useEffect(() => {
67
- const { current } = videoRef;
68
- if (!current) {
69
- return;
70
- }
71
- const errorHandler = () => {
72
- var _a;
73
- if (current === null || current === void 0 ? void 0 : current.error) {
74
- console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
75
- throw new Error(`The browser threw an error while playing the video ${src}: Code ${current.error.code} - ${(_a = current === null || current === void 0 ? void 0 : current.error) === null || _a === void 0 ? void 0 : _a.message}. See https://remotion.dev/docs/media-playback-error for help`);
76
- }
77
- else {
78
- throw new Error('The browser threw an error');
79
- }
80
- };
81
- current.addEventListener('error', errorHandler, { once: true });
82
- return () => {
83
- current.removeEventListener('error', errorHandler);
84
- };
85
- }, [src]);
86
- const currentOnDurationCallback = useRef();
87
- currentOnDurationCallback.current = onDuration;
88
- useEffect(() => {
89
- var _a;
90
- const { current } = videoRef;
91
- if (!current) {
92
- return;
93
- }
94
- if (current.duration) {
95
- (_a = currentOnDurationCallback.current) === null || _a === void 0 ? void 0 : _a.call(currentOnDurationCallback, src, current.duration);
96
- return;
97
- }
98
- const onLoadedMetadata = () => {
99
- var _a;
100
- (_a = currentOnDurationCallback.current) === null || _a === void 0 ? void 0 : _a.call(currentOnDurationCallback, src, current.duration);
101
- };
102
- current.addEventListener('loadedmetadata', onLoadedMetadata);
103
- return () => {
104
- current.removeEventListener('loadedmetadata', onLoadedMetadata);
105
- };
106
- }, [src]);
107
- return (_jsx("video", { ref: videoRef, muted: muted || mediaMuted, playsInline: true, src: actualSrc, ...nativeProps }));
108
- };
109
- // Copy types from forwardRef but not necessary to remove ref
110
- export const VideoForDevelopment = forwardRef(VideoForDevelopmentRefForwardingFunction);
@@ -1,200 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, } from 'react';
3
- import { getAbsoluteSrc } from '../absolute-src.js';
4
- import { useFrameForVolumeProp, useMediaStartsAt, } from '../audio/use-audio-frame.js';
5
- import { CompositionManager } from '../CompositionManager.js';
6
- import { continueRender, delayRender } from '../delay-render.js';
7
- import { useRemotionEnvironment } from '../get-environment.js';
8
- import { isApproximatelyTheSame } from '../is-approximately-the-same.js';
9
- import { random } from '../random.js';
10
- import { SequenceContext } from '../SequenceContext.js';
11
- import { useTimelinePosition } from '../timeline-position-state.js';
12
- import { useCurrentFrame } from '../use-current-frame.js';
13
- import { useUnsafeVideoConfig } from '../use-unsafe-video-config.js';
14
- import { evaluateVolume } from '../volume-prop.js';
15
- import { warnAboutNonSeekableMedia } from '../warn-about-non-seekable-media.js';
16
- import { getMediaTime } from './get-current-time.js';
17
- const VideoForRenderingForwardFunction = ({ onError, volume: volumeProp, allowAmplificationDuringRender, playbackRate, onDuration, ...props }, ref) => {
18
- const absoluteFrame = useTimelinePosition();
19
- const frame = useCurrentFrame();
20
- const volumePropsFrame = useFrameForVolumeProp();
21
- const videoConfig = useUnsafeVideoConfig();
22
- const videoRef = useRef(null);
23
- const sequenceContext = useContext(SequenceContext);
24
- const mediaStartsAt = useMediaStartsAt();
25
- const environment = useRemotionEnvironment();
26
- const { registerAsset, unregisterAsset } = useContext(CompositionManager);
27
- // Generate a string that's as unique as possible for this asset
28
- // but at the same time the same on all threads
29
- const id = useMemo(() => {
30
- var _a;
31
- return `video-${random((_a = props.src) !== null && _a !== void 0 ? _a : '')}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.relativeFrom}-${sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames}`;
32
- }, [
33
- props.src,
34
- sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom,
35
- sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.relativeFrom,
36
- sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames,
37
- ]);
38
- if (!videoConfig) {
39
- throw new Error('No video config found');
40
- }
41
- const volume = evaluateVolume({
42
- volume: volumeProp,
43
- frame: volumePropsFrame,
44
- mediaVolume: 1,
45
- allowAmplificationDuringRender: allowAmplificationDuringRender !== null && allowAmplificationDuringRender !== void 0 ? allowAmplificationDuringRender : false,
46
- });
47
- useEffect(() => {
48
- if (!props.src) {
49
- throw new Error('No src passed');
50
- }
51
- if (props.muted) {
52
- return;
53
- }
54
- if (volume <= 0) {
55
- return;
56
- }
57
- if (!window.remotion_audioEnabled) {
58
- return;
59
- }
60
- registerAsset({
61
- type: 'video',
62
- src: getAbsoluteSrc(props.src),
63
- id,
64
- frame: absoluteFrame,
65
- volume,
66
- mediaFrame: frame,
67
- playbackRate: playbackRate !== null && playbackRate !== void 0 ? playbackRate : 1,
68
- allowAmplificationDuringRender: allowAmplificationDuringRender !== null && allowAmplificationDuringRender !== void 0 ? allowAmplificationDuringRender : false,
69
- });
70
- return () => unregisterAsset(id);
71
- }, [
72
- props.muted,
73
- props.src,
74
- registerAsset,
75
- id,
76
- unregisterAsset,
77
- volume,
78
- frame,
79
- absoluteFrame,
80
- playbackRate,
81
- allowAmplificationDuringRender,
82
- ]);
83
- useImperativeHandle(ref, () => {
84
- return videoRef.current;
85
- }, []);
86
- useEffect(() => {
87
- if (!window.remotion_videoEnabled) {
88
- return;
89
- }
90
- const { current } = videoRef;
91
- if (!current) {
92
- return;
93
- }
94
- const currentTime = (() => {
95
- return getMediaTime({
96
- fps: videoConfig.fps,
97
- frame,
98
- src: props.src,
99
- playbackRate: playbackRate || 1,
100
- startFrom: -mediaStartsAt,
101
- mediaType: 'video',
102
- });
103
- })();
104
- const handle = delayRender(`Rendering <Video /> with src="${props.src}"`);
105
- if (process.env.NODE_ENV === 'test') {
106
- continueRender(handle);
107
- return;
108
- }
109
- if (isApproximatelyTheSame(current.currentTime, currentTime)) {
110
- if (current.readyState >= 2) {
111
- continueRender(handle);
112
- return;
113
- }
114
- const loadedDataHandler = () => {
115
- continueRender(handle);
116
- };
117
- current.addEventListener('loadeddata', loadedDataHandler, { once: true });
118
- return () => {
119
- current.removeEventListener('loadeddata', loadedDataHandler);
120
- };
121
- }
122
- current.currentTime = currentTime;
123
- const seekedHandler = () => {
124
- warnAboutNonSeekableMedia(current, 'exception');
125
- if (window.navigator.platform.startsWith('Mac')) {
126
- // Improve me: This is ensures frame perfectness but slows down render.
127
- // Please see this issue for context: https://github.com/remotion-dev/remotion/issues/200
128
- // Only affects macOS since it uses VideoToolbox decoding.
129
- setTimeout(() => {
130
- continueRender(handle);
131
- }, 100);
132
- }
133
- else {
134
- continueRender(handle);
135
- }
136
- };
137
- current.addEventListener('seeked', seekedHandler, { once: true });
138
- const endedHandler = () => {
139
- continueRender(handle);
140
- };
141
- current.addEventListener('ended', endedHandler, { once: true });
142
- const errorHandler = () => {
143
- var _a;
144
- if (current === null || current === void 0 ? void 0 : current.error) {
145
- console.error('Error occurred in video', current === null || current === void 0 ? void 0 : current.error);
146
- throw new Error(`The browser threw an error while playing the video ${props.src}: Code ${current.error.code} - ${(_a = current === null || current === void 0 ? void 0 : current.error) === null || _a === void 0 ? void 0 : _a.message}. See https://remotion.dev/docs/media-playback-error for help`);
147
- }
148
- else {
149
- throw new Error('The browser threw an error');
150
- }
151
- };
152
- current.addEventListener('error', errorHandler, { once: true });
153
- // If video skips to another frame or unmounts, we clear the created handle
154
- return () => {
155
- current.removeEventListener('ended', endedHandler);
156
- current.removeEventListener('error', errorHandler);
157
- current.removeEventListener('seeked', seekedHandler);
158
- continueRender(handle);
159
- };
160
- }, [
161
- volumePropsFrame,
162
- props.src,
163
- playbackRate,
164
- videoConfig.fps,
165
- frame,
166
- mediaStartsAt,
167
- ]);
168
- const { src } = props;
169
- // If video source switches, make new handle
170
- if (environment === 'rendering') {
171
- // eslint-disable-next-line react-hooks/rules-of-hooks
172
- useLayoutEffect(() => {
173
- if (process.env.NODE_ENV === 'test') {
174
- return;
175
- }
176
- const newHandle = delayRender('Loading <Video> duration with src=' + src);
177
- const { current } = videoRef;
178
- const didLoad = () => {
179
- if (current === null || current === void 0 ? void 0 : current.duration) {
180
- onDuration(src, current.duration);
181
- }
182
- continueRender(newHandle);
183
- };
184
- if (current === null || current === void 0 ? void 0 : current.duration) {
185
- onDuration(src, current.duration);
186
- continueRender(newHandle);
187
- }
188
- else {
189
- current === null || current === void 0 ? void 0 : current.addEventListener('loadedmetadata', didLoad, { once: true });
190
- }
191
- // If tag gets unmounted, clear pending handles because video metadata is not going to load
192
- return () => {
193
- current === null || current === void 0 ? void 0 : current.removeEventListener('loadedmetadata', didLoad);
194
- continueRender(newHandle);
195
- };
196
- }, [src, onDuration]);
197
- }
198
- return _jsx("video", { ref: videoRef, ...props, onError: onError });
199
- };
200
- export const VideoForRendering = forwardRef(VideoForRenderingForwardFunction);
@@ -1,29 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useMemo, useReducer } from 'react';
3
- export const durationReducer = (state, action) => {
4
- switch (action.type) {
5
- case 'got-duration':
6
- return {
7
- ...state,
8
- [action.src]: action.durationInSeconds,
9
- };
10
- default:
11
- return state;
12
- }
13
- };
14
- export const DurationsContext = createContext({
15
- durations: {},
16
- setDurations: () => {
17
- throw new Error('context missing');
18
- },
19
- });
20
- export const DurationsContextProvider = ({ children }) => {
21
- const [durations, setDurations] = useReducer(durationReducer, {});
22
- const value = useMemo(() => {
23
- return {
24
- durations,
25
- setDurations,
26
- };
27
- }, [durations]);
28
- return (_jsx(DurationsContext.Provider, { value: value, children: children }));
29
- };
@@ -1,26 +0,0 @@
1
- // Calculate the `.currentTime` of a video or audio element
2
- import { interpolate } from '../interpolate.js';
3
- export const getExpectedMediaFrameUncorrected = ({ frame, playbackRate, startFrom, }) => {
4
- return interpolate(frame, [-1, startFrom, startFrom + 1], [-1, startFrom, startFrom + playbackRate]);
5
- };
6
- export const getMediaTime = ({ fps, frame, src, playbackRate, startFrom, mediaType, }) => {
7
- const expectedFrame = getExpectedMediaFrameUncorrected({
8
- frame,
9
- playbackRate,
10
- startFrom,
11
- });
12
- if (src.endsWith('webm')) {
13
- // For WebM videos, we need to add a little bit of shift to get the right frame.
14
- const msPerFrame = 1000 / fps;
15
- const msShift = msPerFrame / 2;
16
- return (expectedFrame * msPerFrame + msShift) / 1000;
17
- }
18
- if (mediaType === 'video') {
19
- // In Chrome, for MP4s, if 30fps, the first frame is still displayed at 0.033333
20
- // even though after that it increases by 0.033333333 each.
21
- // So frame = 0 in Remotion is like frame = 1 for the browser
22
- return (expectedFrame + 1) / fps;
23
- }
24
- // For audio, we don't do any shift correction
25
- return expectedFrame / fps;
26
- };
@@ -1,2 +0,0 @@
1
- export { OffthreadVideo } from './OffthreadVideo.js';
2
- export { Video } from './Video.js';
@@ -1 +0,0 @@
1
- export {};
@@ -1,55 +0,0 @@
1
- import { useRef } from 'react';
2
- const toSeconds = (time, fps) => {
3
- return Math.round((time / fps) * 100) / 100;
4
- };
5
- const isSubsetOfDuration = (prevStartFrom, newStartFrom, prevDuration, newDuration) => {
6
- return (prevStartFrom <= newStartFrom &&
7
- prevStartFrom + prevDuration >= newStartFrom + newDuration);
8
- };
9
- export const useAppendVideoFragment = ({ actualSrc: initialActualSrc, actualFrom: initialActualFrom, duration: initialDuration, fps, }) => {
10
- const actualFromRef = useRef(initialActualFrom);
11
- const actualDuration = useRef(initialDuration);
12
- const actualSrc = useRef(initialActualSrc);
13
- if (!isSubsetOfDuration || initialActualSrc !== actualSrc.current) {
14
- actualFromRef.current = initialActualFrom;
15
- actualDuration.current = initialDuration;
16
- actualSrc.current = initialActualSrc;
17
- }
18
- const appended = appendVideoFragment({
19
- actualSrc: actualSrc.current,
20
- actualFrom: actualFromRef.current,
21
- duration: actualDuration.current,
22
- fps,
23
- });
24
- return appended;
25
- };
26
- // https://github.com/remotion-dev/remotion/issues/1655
27
- const isIOSSafariCase = (actualSrc) => {
28
- return typeof window === 'undefined'
29
- ? false
30
- : /iP(ad|od|hone)/i.test(window.navigator.userAgent) &&
31
- Boolean(navigator.userAgent.match(/Version\/[\d.]+.*Safari/)) &&
32
- actualSrc.startsWith('blob:');
33
- };
34
- export const appendVideoFragment = ({ actualSrc, actualFrom, duration, fps, }) => {
35
- var _a;
36
- if (isIOSSafariCase(actualSrc)) {
37
- return actualSrc;
38
- }
39
- if (actualSrc.startsWith('data:')) {
40
- return actualSrc;
41
- }
42
- const existingHash = Boolean(new URL(actualSrc, (_a = (typeof window === 'undefined' ? null : window.location.href)) !== null && _a !== void 0 ? _a : 'http://localhost:3000').hash);
43
- if (existingHash) {
44
- return actualSrc;
45
- }
46
- if (!Number.isFinite(actualFrom)) {
47
- return actualSrc;
48
- }
49
- actualSrc += `#t=${toSeconds(-actualFrom, fps)}`;
50
- if (!Number.isFinite(duration)) {
51
- return actualSrc;
52
- }
53
- actualSrc += `,${toSeconds(duration, fps)}`;
54
- return actualSrc;
55
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,27 +0,0 @@
1
- import { createContext, useContext, useMemo } from 'react';
2
- export const MediaVolumeContext = createContext({
3
- mediaMuted: false,
4
- mediaVolume: 1,
5
- });
6
- export const SetMediaVolumeContext = createContext({
7
- setMediaMuted: () => {
8
- throw new Error('default');
9
- },
10
- setMediaVolume: () => {
11
- throw new Error('default');
12
- },
13
- });
14
- export const useMediaVolumeState = () => {
15
- const { mediaVolume } = useContext(MediaVolumeContext);
16
- const { setMediaVolume } = useContext(SetMediaVolumeContext);
17
- return useMemo(() => {
18
- return [mediaVolume, setMediaVolume];
19
- }, [mediaVolume, setMediaVolume]);
20
- };
21
- export const useMediaMutedState = () => {
22
- const { mediaMuted } = useContext(MediaVolumeContext);
23
- const { setMediaMuted } = useContext(SetMediaVolumeContext);
24
- return useMemo(() => {
25
- return [mediaMuted, setMediaMuted];
26
- }, [mediaMuted, setMediaMuted]);
27
- };
@@ -1,20 +0,0 @@
1
- export const evaluateVolume = ({ frame, volume, mediaVolume = 1, allowAmplificationDuringRender, }) => {
2
- const maxVolume = allowAmplificationDuringRender ? Infinity : 1;
3
- if (typeof volume === 'number') {
4
- return Math.min(maxVolume, volume * mediaVolume);
5
- }
6
- if (typeof volume === 'undefined') {
7
- return Number(mediaVolume);
8
- }
9
- const evaluated = volume(frame) * mediaVolume;
10
- if (typeof evaluated !== 'number') {
11
- throw new TypeError(`You passed in a a function to the volume prop but it did not return a number but a value of type ${typeof evaluated} for frame ${frame}`);
12
- }
13
- if (Number.isNaN(evaluated)) {
14
- throw new TypeError(`You passed in a function to the volume prop but it returned NaN for frame ${frame}.`);
15
- }
16
- if (!Number.isFinite(evaluated)) {
17
- throw new TypeError(`You passed in a function to the volume prop but it returned a non-finite number for frame ${frame}.`);
18
- }
19
- return Math.max(0, Math.min(maxVolume, evaluated));
20
- };
@@ -1,30 +0,0 @@
1
- const alreadyWarned = {};
2
- export const warnAboutNonSeekableMedia = (ref, type) => {
3
- // Media is not loaded yet, but this does not yet mean something is wrong with the media
4
- if (ref === null) {
5
- return;
6
- }
7
- if (ref.seekable.length === 0) {
8
- return;
9
- }
10
- if (ref.seekable.length > 1) {
11
- return;
12
- }
13
- if (alreadyWarned[ref.src]) {
14
- return;
15
- }
16
- const range = { start: ref.seekable.start(0), end: ref.seekable.end(0) };
17
- if (range.start === 0 && range.end === 0) {
18
- const msg = `The media ${ref.src} cannot be seeked. This could be one of two reasons: 1) The media resource was replaced while the video is playing but it was not loaded yet. 2) The media does not support seeking. Please see https://remotion.dev/docs/non-seekable-media for assistance.`;
19
- if (type === 'console-error') {
20
- console.error(msg);
21
- }
22
- else if (type === 'console-warning') {
23
- console.warn(`The media ${ref.src} does not support seeking. The video will render fine, but may not play correctly in preview and in the <Player>. See https://remotion.dev/docs/non-seekable-media for an explanation.`);
24
- }
25
- else {
26
- throw new Error(msg);
27
- }
28
- alreadyWarned[ref.src] = true;
29
- }
30
- };
@@ -1,45 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- // This is used for when other reconcilers are being used
3
- // such as in React Three Fiber. All the contexts need to be passed again
4
- // for them to be useable
5
- import React, { useMemo } from 'react';
6
- import { CanUseRemotionHooks } from './CanUseRemotionHooks.js';
7
- import { CompositionManager } from './CompositionManager.js';
8
- import { NativeLayersContext } from './NativeLayers.js';
9
- import { NonceContext } from './nonce.js';
10
- import { PreloadContext } from './prefetch-state.js';
11
- import { SequenceContext } from './SequenceContext.js';
12
- import { SetTimelineContext, TimelineContext, } from './timeline-position-state.js';
13
- export function useRemotionContexts() {
14
- const compositionManagerCtx = React.useContext(CompositionManager);
15
- const timelineContext = React.useContext(TimelineContext);
16
- const setTimelineContext = React.useContext(SetTimelineContext);
17
- const sequenceContext = React.useContext(SequenceContext);
18
- const nonceContext = React.useContext(NonceContext);
19
- const canUseRemotionHooksContext = React.useContext(CanUseRemotionHooks);
20
- const nativeLayersContext = React.useContext(NativeLayersContext);
21
- const preloadContext = React.useContext(PreloadContext);
22
- return useMemo(() => ({
23
- compositionManagerCtx,
24
- timelineContext,
25
- setTimelineContext,
26
- sequenceContext,
27
- nonceContext,
28
- canUseRemotionHooksContext,
29
- nativeLayersContext,
30
- preloadContext,
31
- }), [
32
- compositionManagerCtx,
33
- nonceContext,
34
- sequenceContext,
35
- setTimelineContext,
36
- timelineContext,
37
- canUseRemotionHooksContext,
38
- nativeLayersContext,
39
- preloadContext,
40
- ]);
41
- }
42
- export const RemotionContextProvider = (props) => {
43
- const { children, contexts } = props;
44
- return (_jsx(CanUseRemotionHooks.Provider, { value: contexts.canUseRemotionHooksContext, children: _jsx(NonceContext.Provider, { value: contexts.nonceContext, children: _jsx(NativeLayersContext.Provider, { value: contexts.nativeLayersContext, children: _jsx(PreloadContext.Provider, { value: contexts.preloadContext, children: _jsx(CompositionManager.Provider, { value: contexts.compositionManagerCtx, children: _jsx(TimelineContext.Provider, { value: contexts.timelineContext, children: _jsx(SetTimelineContext.Provider, { value: contexts.setTimelineContext, children: _jsx(SequenceContext.Provider, { value: contexts.sequenceContext, children: children }) }) }) }) }) }) }) }));
45
- };