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.
- package/dist/cjs/audio/Audio.d.ts +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/internals.d.ts +1 -1
- package/dist/cjs/use-video.d.ts +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/version.mjs +1 -1
- package/dist/tsconfig-esm.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/tsconfig-esm.json +12 -0
- package/dist/esm/AbsoluteFill.js +0 -25
- package/dist/esm/CanUseRemotionHooks.js +0 -6
- package/dist/esm/Clipper.js +0 -20
- package/dist/esm/Composition.js +0 -112
- package/dist/esm/CompositionManager.js +0 -137
- package/dist/esm/Folder.js +0 -33
- package/dist/esm/IFrame.js +0 -25
- package/dist/esm/Img.js +0 -53
- package/dist/esm/NativeLayers.js +0 -25
- package/dist/esm/Null.js +0 -21
- package/dist/esm/RemotionRoot.js +0 -69
- package/dist/esm/Sequence.js +0 -128
- package/dist/esm/SequenceContext.js +0 -2
- package/dist/esm/Still.js +0 -9
- package/dist/esm/absolute-src.js +0 -3
- package/dist/esm/asset-types.js +0 -1
- package/dist/esm/audio/Audio.js +0 -53
- package/dist/esm/audio/AudioForDevelopment.js +0 -91
- package/dist/esm/audio/AudioForRendering.js +0 -108
- package/dist/esm/audio/index.js +0 -2
- package/dist/esm/audio/props.js +0 -1
- package/dist/esm/audio/shared-audio-tags.js +0 -194
- package/dist/esm/audio/use-audio-frame.js +0 -18
- package/dist/esm/bezier.js +0 -110
- package/dist/esm/cancel-render.js +0 -43
- package/dist/esm/config/input-props.js +0 -27
- package/dist/esm/config.js +0 -17
- package/dist/esm/default-css.js +0 -44
- package/dist/esm/delay-render.js +0 -72
- package/dist/esm/easing.js +0 -77
- package/dist/esm/freeze.js +0 -34
- package/dist/esm/get-asset-file-name.js +0 -10
- package/dist/esm/get-environment.js +0 -29
- package/dist/esm/get-preview-dom-element.js +0 -3
- package/dist/esm/get-static-files.js +0 -31
- package/dist/esm/get-timeline-clip-name.js +0 -21
- package/dist/esm/index.js +0 -49
- package/dist/esm/internals.js +0 -75
- package/dist/esm/interpolate-colors.js +0 -401
- package/dist/esm/interpolate.js +0 -123
- package/dist/esm/is-approximately-the-same.js +0 -4
- package/dist/esm/is-player.js +0 -9
- package/dist/esm/loading-indicator.js +0 -31
- package/dist/esm/loop/index.js +0 -29
- package/dist/esm/multiple-versions-warning.js +0 -28
- package/dist/esm/nonce.js +0 -13
- package/dist/esm/play-and-handle-not-allowed-error.js +0 -40
- package/dist/esm/portal-node.js +0 -19
- package/dist/esm/prefetch-state.js +0 -22
- package/dist/esm/prefetch.js +0 -107
- package/dist/esm/random.js +0 -37
- package/dist/esm/register-root.js +0 -31
- package/dist/esm/series/flatten-children.js +0 -12
- package/dist/esm/series/index.js +0 -61
- package/dist/esm/setup-env-variables.js +0 -32
- package/dist/esm/spring/index.js +0 -50
- package/dist/esm/spring/measure-spring.js +0 -64
- package/dist/esm/spring/spring-utils.js +0 -99
- package/dist/esm/static-file.js +0 -29
- package/dist/esm/test/Img.test.js +0 -20
- package/dist/esm/test/absolute-src.test.js +0 -16
- package/dist/esm/test/audio-for-rendering.test.js +0 -83
- package/dist/esm/test/audio.test.js +0 -51
- package/dist/esm/test/bezier.test.js +0 -50
- package/dist/esm/test/composition-rules.test.js +0 -28
- package/dist/esm/test/composition-validation.test.js +0 -97
- package/dist/esm/test/easing.test.js +0 -189
- package/dist/esm/test/expect-to-throw.js +0 -11
- package/dist/esm/test/freeze.test.js +0 -63
- package/dist/esm/test/get-asset-file-name.test.js +0 -12
- package/dist/esm/test/get-current-time.test.js +0 -72
- package/dist/esm/test/input-props.test.js +0 -29
- package/dist/esm/test/interpolate.test.js +0 -136
- package/dist/esm/test/interpolateColors.test.js +0 -61
- package/dist/esm/test/loop-validation.test.js +0 -68
- package/dist/esm/test/measure-spring.test.js +0 -43
- package/dist/esm/test/media-validation.test.js +0 -45
- package/dist/esm/test/nested-sequences.test.js +0 -130
- package/dist/esm/test/not-all-props-in-media-tags.test.js +0 -28
- package/dist/esm/test/random.test.js +0 -58
- package/dist/esm/test/ready-manager.test.js +0 -27
- package/dist/esm/test/render-hook.js +0 -20
- package/dist/esm/test/sequence-from-initial-offset.test.js +0 -33
- package/dist/esm/test/sequence-validation.test.js +0 -45
- package/dist/esm/test/series.test.js +0 -113
- package/dist/esm/test/spring.test.js +0 -36
- package/dist/esm/test/truthy.test.js +0 -22
- package/dist/esm/test/use-audio-frame.test.js +0 -53
- package/dist/esm/test/use-media-in-timeline.test.js +0 -49
- package/dist/esm/test/use-media-tag-volume.test.js +0 -44
- package/dist/esm/test/use-sync-volume-with-media-tag.test.js +0 -53
- package/dist/esm/test/validate-start-from-props.test.js +0 -37
- package/dist/esm/test/video.test.js +0 -55
- package/dist/esm/test/volume-prop.test.js +0 -93
- package/dist/esm/test/wrap-sequence-context.js +0 -37
- package/dist/esm/timeline-position-state.js +0 -35
- package/dist/esm/truthy.js +0 -3
- package/dist/esm/use-current-frame.js +0 -23
- package/dist/esm/use-lazy-component.js +0 -22
- package/dist/esm/use-media-in-timeline.js +0 -125
- package/dist/esm/use-media-playback.js +0 -73
- package/dist/esm/use-media-tag-volume.js +0 -27
- package/dist/esm/use-sync-volume-with-media-tag.js +0 -17
- package/dist/esm/use-unsafe-video-config.js +0 -23
- package/dist/esm/use-video-config.js +0 -26
- package/dist/esm/use-video.js +0 -24
- package/dist/esm/validate-frame.js +0 -20
- package/dist/esm/validate-media-props.js +0 -20
- package/dist/esm/validate-start-from-props.js +0 -27
- package/dist/esm/validation/validate-composition-id.js +0 -8
- package/dist/esm/validation/validate-dimensions.js +0 -17
- package/dist/esm/validation/validate-duration-in-frames.js +0 -11
- package/dist/esm/validation/validate-folder-name.js +0 -14
- package/dist/esm/validation/validate-fps.js +0 -17
- package/dist/esm/validation/validate-offthreadvideo-image-format.js +0 -11
- package/dist/esm/validation/validation-spring-duration.js +0 -17
- package/dist/esm/version.js +0 -2
- package/dist/esm/video/OffthreadVideo.js +0 -33
- package/dist/esm/video/OffthreadVideoForRendering.js +0 -100
- package/dist/esm/video/Video.js +0 -51
- package/dist/esm/video/VideoForDevelopment.js +0 -110
- package/dist/esm/video/VideoForRendering.js +0 -200
- package/dist/esm/video/duration-state.js +0 -29
- package/dist/esm/video/get-current-time.js +0 -26
- package/dist/esm/video/index.js +0 -2
- package/dist/esm/video/props.js +0 -1
- package/dist/esm/video/video-fragment.js +0 -55
- package/dist/esm/video-config.js +0 -1
- package/dist/esm/volume-position-state.js +0 -27
- package/dist/esm/volume-prop.js +0 -20
- package/dist/esm/warn-about-non-seekable-media.js +0 -30
- 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
|
-
};
|
package/dist/esm/video/index.js
DELETED
package/dist/esm/video/props.js
DELETED
|
@@ -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
|
-
};
|
package/dist/esm/video-config.js
DELETED
|
@@ -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
|
-
};
|
package/dist/esm/volume-prop.js
DELETED
|
@@ -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
|
-
};
|