remotion 4.0.0-oops.3 → 4.0.0-preload.13
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/.turbo/turbo-build.log +5 -5
- package/.turbo/turbo-lint.log +11 -0
- package/.turbo/turbo-test.log +63 -0
- package/dist/Img.js +20 -4
- package/dist/Still.d.ts +0 -1
- package/dist/config/chromium-flags.d.ts +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.js +2 -2
- package/dist/internals.d.ts +3 -6
- package/dist/internals.js +0 -3
- package/dist/validation/validate-opengl-renderer.d.ts +1 -1
- package/dist/validation/validate-opengl-renderer.js +1 -1
- package/dist/video/OffthreadVideo.d.ts +3 -0
- package/dist/video/OffthreadVideo.js +90 -0
- package/dist/video/Video.d.ts +2 -2
- package/dist/video/VideoForRendering.d.ts +1 -1
- package/dist/video/VideoForRendering.js +17 -17
- package/package.json +2 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
[
|
|
2
|
-
[
|
|
3
|
-
[
|
|
4
|
-
[
|
|
5
|
-
[
|
|
1
|
+
[35mremotion:build: [0mcache hit, replaying output [2m18641be29acc0312[0m
|
|
2
|
+
[35mremotion:build: [0m
|
|
3
|
+
[35mremotion:build: [0m> remotion@3.0.9 build /Users/jonathanburger/remotion/packages/core
|
|
4
|
+
[35mremotion:build: [0m> tsc -d
|
|
5
|
+
[35mremotion:build: [0m
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[34mremotion:lint: [0mcache hit, replaying output [2mca801c8a64489efb[0m
|
|
2
|
+
[34mremotion:lint: [0m
|
|
3
|
+
[34mremotion:lint: [0m> remotion@3.0.9 lint /Users/jonathanburger/remotion/packages/core
|
|
4
|
+
[34mremotion:lint: [0m> eslint src --ext ts,tsx
|
|
5
|
+
[34mremotion:lint: [0m
|
|
6
|
+
[34mremotion:lint: [0m
|
|
7
|
+
[34mremotion:lint: [0m/Users/jonathanburger/remotion/packages/core/src/use-lazy-component.ts
|
|
8
|
+
[34mremotion:lint: [0m 9:50 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
|
|
9
|
+
[34mremotion:lint: [0m
|
|
10
|
+
[34mremotion:lint: [0m✖ 1 problem (0 errors, 1 warning)
|
|
11
|
+
[34mremotion:lint: [0m
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
[34mremotion:test: [0mcache hit, replaying output [2mcceb170b4f03ca12[0m
|
|
2
|
+
[34mremotion:test: [0m
|
|
3
|
+
[34mremotion:test: [0m> remotion@3.0.9 test /Users/jonathanburger/remotion/packages/core
|
|
4
|
+
[34mremotion:test: [0m> jest --coverage && node generate-badges.js
|
|
5
|
+
[34mremotion:test: [0m
|
|
6
|
+
[34mremotion:test: [0mwatchman warning: Recrawled this watch 25 times, most recently because:
|
|
7
|
+
[34mremotion:test: [0mMustScanSubDirs UserDroppedTo resolve, please review the information on
|
|
8
|
+
[34mremotion:test: [0mhttps://facebook.github.io/watchman/docs/troubleshooting.html#recrawl
|
|
9
|
+
[34mremotion:test: [0mTo clear this warning, run:
|
|
10
|
+
[34mremotion:test: [0m`watchman watch-del '/Users/jonathanburger/remotion' ; watchman watch-project '/Users/jonathanburger/remotion'`
|
|
11
|
+
[34mremotion:test: [0m
|
|
12
|
+
[34mremotion:test: [0mPASS src/test/easing.test.ts (16.995 s)
|
|
13
|
+
[34mremotion:test: [0mPASS src/test/interpolate.test.ts (17.428 s)
|
|
14
|
+
[34mremotion:test: [0mPASS src/test/crf.test.ts (17.267 s)
|
|
15
|
+
[34mremotion:test: [0mPASS src/test/volume-prop.test.ts
|
|
16
|
+
[34mremotion:test: [0mPASS src/test/interpolateColors.test.ts
|
|
17
|
+
[34mremotion:test: [0mPASS src/test/nested-sequences.test.tsx (21.573 s)
|
|
18
|
+
[34mremotion:test: [0mPASS src/test/pixel-format.test.ts
|
|
19
|
+
[34mremotion:test: [0mPASS src/test/media-validation.test.tsx
|
|
20
|
+
[34mremotion:test: [0mPASS src/test/random.test.ts
|
|
21
|
+
[34mremotion:test: [0mPASS src/test/image-format.test.ts
|
|
22
|
+
[34mremotion:test: [0mPASS src/test/codec.test.ts
|
|
23
|
+
[34mremotion:test: [0mPASS src/test/get-current-time.test.ts
|
|
24
|
+
[34mremotion:test: [0mPASS src/test/range.test.tsx (9.35 s)
|
|
25
|
+
[34mremotion:test: [0mPASS src/test/audio-for-rendering.test.tsx (7.636 s)
|
|
26
|
+
[34mremotion:test: [0mPASS src/test/sequence-validation.test.tsx
|
|
27
|
+
[34mremotion:test: [0mPASS src/test/use-audio-frame.test.tsx (5.104 s)
|
|
28
|
+
[34mremotion:test: [0mPASS src/test/freeze.test.tsx (6.656 s)
|
|
29
|
+
[34mremotion:test: [0mPASS src/test/composition-validation.test.tsx (32.821 s)
|
|
30
|
+
[34mremotion:test: [0mPASS src/test/validate-start-from-props.test.ts
|
|
31
|
+
[34mremotion:test: [0mPASS src/test/series.test.tsx (32.945 s)
|
|
32
|
+
[34mremotion:test: [0mPASS src/test/loop-validation.test.tsx (32.887 s)
|
|
33
|
+
[34mremotion:test: [0mPASS src/test/composition-rules.test.tsx (5.824 s)
|
|
34
|
+
[34mremotion:test: [0mPASS src/test/log.test.ts
|
|
35
|
+
[34mremotion:test: [0mPASS src/test/measure-spring.test.ts
|
|
36
|
+
[34mremotion:test: [0mPASS src/test/pro-res-profile.test.ts
|
|
37
|
+
[34mremotion:test: [0mPASS src/test/video.test.tsx (8.266 s)
|
|
38
|
+
[34mremotion:test: [0mPASS src/test/bezier.test.ts
|
|
39
|
+
[34mremotion:test: [0mPASS src/test/use-media-tag-volume.test.tsx
|
|
40
|
+
[34mremotion:test: [0mPASS src/test/quality.test.ts
|
|
41
|
+
[34mremotion:test: [0mPASS src/test/use-sync-volume-with-media-tag.test.ts
|
|
42
|
+
[34mremotion:test: [0mPASS src/test/image-sequence.test.ts
|
|
43
|
+
[34mremotion:test: [0mPASS src/test/overwrite.test.ts
|
|
44
|
+
[34mremotion:test: [0mPASS src/test/input-props.test.ts
|
|
45
|
+
[34mremotion:test: [0mPASS src/test/validate-frame.test.ts
|
|
46
|
+
[34mremotion:test: [0mPASS src/test/preview-server.test.ts
|
|
47
|
+
[34mremotion:test: [0mPASS src/test/concurrency.test.ts
|
|
48
|
+
[34mremotion:test: [0mPASS src/test/spring.test.ts
|
|
49
|
+
[34mremotion:test: [0mPASS src/test/webpack-caching.test.ts
|
|
50
|
+
[34mremotion:test: [0mPASS src/test/ready-manager.test.ts
|
|
51
|
+
[34mremotion:test: [0mPASS src/test/use-media-in-timeline.test.tsx
|
|
52
|
+
[34mremotion:test: [0mPASS src/test/get-asset-file-name.test.ts
|
|
53
|
+
[34mremotion:test: [0mPASS src/test/truthy.test.ts
|
|
54
|
+
[34mremotion:test: [0mPASS src/test/absolute-src.test.ts
|
|
55
|
+
[34mremotion:test: [0mPASS src/test/validate-image-format.test.ts
|
|
56
|
+
[34mremotion:test: [0mPASS src/test/audio.test.tsx (7.831 s)
|
|
57
|
+
[34mremotion:test: [0mPASS src/test/Img.test.tsx
|
|
58
|
+
[34mremotion:test: [0m
|
|
59
|
+
[34mremotion:test: [0mTest Suites: 46 passed, 46 total
|
|
60
|
+
[34mremotion:test: [0mTests: 474 passed, 474 total
|
|
61
|
+
[34mremotion:test: [0mSnapshots: 0 total
|
|
62
|
+
[34mremotion:test: [0mTime: 43.001 s
|
|
63
|
+
[34mremotion:test: [0mRan all test suites.
|
package/dist/Img.js
CHANGED
|
@@ -5,19 +5,26 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const delay_render_1 = require("./delay-render");
|
|
7
7
|
const ImgRefForwarding = ({ onLoad, onError, ...props }, ref) => {
|
|
8
|
-
const [handle] = (0, react_1.useState)(() =>
|
|
8
|
+
const [handle, setHandle] = (0, react_1.useState)(() => {
|
|
9
|
+
return null;
|
|
10
|
+
});
|
|
9
11
|
(0, react_1.useEffect)(() => {
|
|
10
12
|
if (ref &&
|
|
11
|
-
ref.current.complete
|
|
13
|
+
ref.current.complete &&
|
|
14
|
+
handle) {
|
|
12
15
|
(0, delay_render_1.continueRender)(handle);
|
|
13
16
|
}
|
|
14
17
|
}, [handle, ref]);
|
|
15
18
|
const didLoad = (0, react_1.useCallback)((e) => {
|
|
16
|
-
|
|
19
|
+
if (handle) {
|
|
20
|
+
(0, delay_render_1.continueRender)(handle);
|
|
21
|
+
}
|
|
17
22
|
onLoad === null || onLoad === void 0 ? void 0 : onLoad(e);
|
|
18
23
|
}, [handle, onLoad]);
|
|
19
24
|
const didGetError = (0, react_1.useCallback)((e) => {
|
|
20
|
-
|
|
25
|
+
if (handle) {
|
|
26
|
+
(0, delay_render_1.continueRender)(handle);
|
|
27
|
+
}
|
|
21
28
|
if (onError) {
|
|
22
29
|
onError(e);
|
|
23
30
|
}
|
|
@@ -25,6 +32,15 @@ const ImgRefForwarding = ({ onLoad, onError, ...props }, ref) => {
|
|
|
25
32
|
console.error('Error loading image:', e, 'Handle the event using the onError() prop to make this message disappear.');
|
|
26
33
|
}
|
|
27
34
|
}, [handle, onError]);
|
|
35
|
+
// If image source switches, make new handle
|
|
36
|
+
(0, react_1.useEffect)(() => {
|
|
37
|
+
const newHandle = (0, delay_render_1.delayRender)('Loading <Img> with src=' + props.src);
|
|
38
|
+
setHandle(newHandle);
|
|
39
|
+
// If tag gets unmounted, clear pending handles because image is not going to load
|
|
40
|
+
return () => {
|
|
41
|
+
(0, delay_render_1.continueRender)(newHandle);
|
|
42
|
+
};
|
|
43
|
+
}, [props.src]);
|
|
28
44
|
return (0, jsx_runtime_1.jsx)("img", { ...props, ref: ref, onLoad: didLoad, onError: didGetError }, void 0);
|
|
29
45
|
};
|
|
30
46
|
exports.Img = (0, react_1.forwardRef)(ImgRefForwarding);
|
package/dist/Still.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const getChromiumDisableWebSecurity: () => boolean;
|
|
|
4
4
|
export declare const setChromiumDisableWebSecurity: (should: boolean) => void;
|
|
5
5
|
export declare const getIgnoreCertificateErrors: () => boolean;
|
|
6
6
|
export declare const setChromiumIgnoreCertificateErrors: (should: boolean) => void;
|
|
7
|
-
export declare const getChromiumOpenGlRenderer: () => "angle" | "egl" | "swiftshader" | null;
|
|
7
|
+
export declare const getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
8
8
|
export declare const setChromiumOpenGlRenderer: (renderer: OpenGlRenderer) => void;
|
|
9
9
|
export declare const getChromiumHeadlessMode: () => boolean;
|
|
10
10
|
export declare const setChromiumHeadlessMode: (should: boolean) => void;
|
package/dist/config/index.d.ts
CHANGED
|
@@ -73,10 +73,10 @@ export declare const Config: {
|
|
|
73
73
|
*/
|
|
74
74
|
readonly setChromiumHeadlessMode: (should: boolean) => void;
|
|
75
75
|
/**
|
|
76
|
-
* Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle' and '
|
|
77
|
-
* Default: '
|
|
76
|
+
* Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle', 'swiftshader' and 'swangle'.
|
|
77
|
+
* Default: 'swangle' in Lambda, null elsewhere.
|
|
78
78
|
*/
|
|
79
|
-
readonly setChromiumOpenGlRenderer: (renderer: "angle" | "egl" | "swiftshader") => void;
|
|
79
|
+
readonly setChromiumOpenGlRenderer: (renderer: "swangle" | "angle" | "egl" | "swiftshader") => void;
|
|
80
80
|
};
|
|
81
81
|
readonly Rendering: {
|
|
82
82
|
/**
|
package/dist/config/index.js
CHANGED
|
@@ -87,8 +87,8 @@ exports.Config = {
|
|
|
87
87
|
*/
|
|
88
88
|
setChromiumHeadlessMode: chromium_flags_1.setChromiumHeadlessMode,
|
|
89
89
|
/**
|
|
90
|
-
* Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle' and '
|
|
91
|
-
* Default: '
|
|
90
|
+
* Set the OpenGL rendering backend for Chrome. Possible values: 'egl', 'angle', 'swiftshader' and 'swangle'.
|
|
91
|
+
* Default: 'swangle' in Lambda, null elsewhere.
|
|
92
92
|
*/
|
|
93
93
|
setChromiumOpenGlRenderer: chromium_flags_1.setChromiumOpenGlRenderer,
|
|
94
94
|
},
|
package/dist/internals.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import { CompProps } from './Composition';
|
|
3
2
|
import { CompositionManagerContext, RenderAssetInfo, TAsset, TCompMetadata, TComposition, TSequence } from './CompositionManager';
|
|
4
3
|
import * as AssetCompression from './compress-assets';
|
|
@@ -93,9 +92,7 @@ export declare const Internals: {
|
|
|
93
92
|
RemotionContextProvider: (props: import("./wrap-remotion-context").RemotionContextProviderProps) => JSX.Element;
|
|
94
93
|
CSSUtils: typeof CSSUtils;
|
|
95
94
|
setupEnvVariables: () => void;
|
|
96
|
-
setupInitialFrame: () => void;
|
|
97
95
|
ENV_VARIABLES_ENV_NAME: "ENV_VARIABLES";
|
|
98
|
-
INITIAL_FRAME_LOCAL_STORAGE_KEY: string;
|
|
99
96
|
getDotEnvLocation: () => string | null;
|
|
100
97
|
getServerPort: () => number | undefined;
|
|
101
98
|
MediaVolumeContext: import("react").Context<MediaVolumeContextValue>;
|
|
@@ -138,10 +135,10 @@ export declare const Internals: {
|
|
|
138
135
|
getCurrentPuppeteerTimeout: () => number;
|
|
139
136
|
getChromiumDisableWebSecurity: () => boolean;
|
|
140
137
|
getIgnoreCertificateErrors: () => boolean;
|
|
141
|
-
validateOpenGlRenderer: (option: "angle" | "egl" | "swiftshader" | null) => "angle" | "egl" | "swiftshader" | null;
|
|
142
|
-
getChromiumOpenGlRenderer: () => "angle" | "egl" | "swiftshader" | null;
|
|
138
|
+
validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
139
|
+
getChromiumOpenGlRenderer: () => "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
143
140
|
getChromiumHeadlessMode: () => boolean;
|
|
144
|
-
DEFAULT_OPENGL_RENDERER: "angle" | "egl" | "swiftshader" | null;
|
|
141
|
+
DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
|
|
145
142
|
getPreviewDomElement: () => HTMLElement | null;
|
|
146
143
|
compositionsRef: import("react").RefObject<{
|
|
147
144
|
getCompositions: () => TCompMetadata[];
|
package/dist/internals.js
CHANGED
|
@@ -51,7 +51,6 @@ const delay_render_1 = require("./delay-render");
|
|
|
51
51
|
const feature_flags_1 = require("./feature-flags");
|
|
52
52
|
const get_environment_1 = require("./get-environment");
|
|
53
53
|
const get_preview_dom_element_1 = require("./get-preview-dom-element");
|
|
54
|
-
const initial_frame_1 = require("./initial-frame");
|
|
55
54
|
const is_audio_codec_1 = require("./is-audio-codec");
|
|
56
55
|
const perf = __importStar(require("./perf"));
|
|
57
56
|
const register_root_1 = require("./register-root");
|
|
@@ -125,9 +124,7 @@ exports.Internals = {
|
|
|
125
124
|
RemotionContextProvider: wrap_remotion_context_1.RemotionContextProvider,
|
|
126
125
|
CSSUtils,
|
|
127
126
|
setupEnvVariables: setup_env_variables_1.setupEnvVariables,
|
|
128
|
-
setupInitialFrame: initial_frame_1.setupInitialFrame,
|
|
129
127
|
ENV_VARIABLES_ENV_NAME: setup_env_variables_1.ENV_VARIABLES_ENV_NAME,
|
|
130
|
-
INITIAL_FRAME_LOCAL_STORAGE_KEY: initial_frame_1.INITIAL_FRAME_LOCAL_STORAGE_KEY,
|
|
131
128
|
getDotEnvLocation: env_file_1.getDotEnvLocation,
|
|
132
129
|
getServerPort: preview_server_1.getServerPort,
|
|
133
130
|
MediaVolumeContext: volume_position_state_1.MediaVolumeContext,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const validRenderers: readonly ["angle", "egl", "swiftshader"];
|
|
1
|
+
declare const validRenderers: readonly ["swangle", "angle", "egl", "swiftshader"];
|
|
2
2
|
export declare type OpenGlRenderer = typeof validRenderers[number];
|
|
3
3
|
export declare const validateOpenGlRenderer: (option: OpenGlRenderer | null) => OpenGlRenderer | null;
|
|
4
4
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateOpenGlRenderer = void 0;
|
|
4
|
-
const validRenderers = ['angle', 'egl', 'swiftshader'];
|
|
4
|
+
const validRenderers = ['swangle', 'angle', 'egl', 'swiftshader'];
|
|
5
5
|
const validateOpenGlRenderer = (option) => {
|
|
6
6
|
if (option === null) {
|
|
7
7
|
return null;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { RemotionOffthreadVideoProps } from './props';
|
|
3
|
+
export declare const OffthreadVideo: React.ForwardRefExoticComponent<Pick<RemotionOffthreadVideoProps, "volume" | "playbackRate" | "key" | "muted" | keyof React.ImgHTMLAttributes<HTMLImageElement>> & React.RefAttributes<HTMLImageElement>>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OffthreadVideo = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const absolute_src_1 = require("../absolute-src");
|
|
7
|
+
const use_audio_frame_1 = require("../audio/use-audio-frame");
|
|
8
|
+
const CompositionManager_1 = require("../CompositionManager");
|
|
9
|
+
const Img_1 = require("../Img");
|
|
10
|
+
const random_1 = require("../random");
|
|
11
|
+
const sequencing_1 = require("../sequencing");
|
|
12
|
+
const use_frame_1 = require("../use-frame");
|
|
13
|
+
const use_unsafe_video_config_1 = require("../use-unsafe-video-config");
|
|
14
|
+
const volume_prop_1 = require("../volume-prop");
|
|
15
|
+
const get_current_time_1 = require("./get-current-time");
|
|
16
|
+
const OffthreadVideoForRenderingForwardFunction = ({ onError, volume: volumeProp, playbackRate, src, ...props }, ref) => {
|
|
17
|
+
const absoluteFrame = (0, use_frame_1.useAbsoluteCurrentFrame)();
|
|
18
|
+
const frame = (0, use_frame_1.useCurrentFrame)();
|
|
19
|
+
const volumePropsFrame = (0, use_audio_frame_1.useFrameForVolumeProp)();
|
|
20
|
+
const videoConfig = (0, use_unsafe_video_config_1.useUnsafeVideoConfig)();
|
|
21
|
+
const imageRef = (0, react_1.useRef)(null);
|
|
22
|
+
const sequenceContext = (0, react_1.useContext)(sequencing_1.SequenceContext);
|
|
23
|
+
const mediaStartsAt = (0, use_audio_frame_1.useMediaStartsAt)();
|
|
24
|
+
(0, react_1.useImperativeHandle)(ref, () => {
|
|
25
|
+
return imageRef.current;
|
|
26
|
+
});
|
|
27
|
+
const { registerAsset, unregisterAsset } = (0, react_1.useContext)(CompositionManager_1.CompositionManager);
|
|
28
|
+
if (!src) {
|
|
29
|
+
throw new TypeError('No `src` was passed to <OffthreadVideo>.');
|
|
30
|
+
}
|
|
31
|
+
// Generate a string that's as unique as possible for this asset
|
|
32
|
+
// but at the same time the same on all threads
|
|
33
|
+
const id = (0, react_1.useMemo)(() => `video-${(0, random_1.random)(src !== null && src !== void 0 ? src : '')}-${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}-muted:${props.muted}`, [
|
|
34
|
+
src,
|
|
35
|
+
props.muted,
|
|
36
|
+
sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.cumulatedFrom,
|
|
37
|
+
sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.relativeFrom,
|
|
38
|
+
sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.durationInFrames,
|
|
39
|
+
]);
|
|
40
|
+
if (!videoConfig) {
|
|
41
|
+
throw new Error('No video config found');
|
|
42
|
+
}
|
|
43
|
+
const volume = (0, volume_prop_1.evaluateVolume)({
|
|
44
|
+
volume: volumeProp,
|
|
45
|
+
frame: volumePropsFrame,
|
|
46
|
+
mediaVolume: 1,
|
|
47
|
+
});
|
|
48
|
+
(0, react_1.useEffect)(() => {
|
|
49
|
+
if (!src) {
|
|
50
|
+
throw new Error('No src passed');
|
|
51
|
+
}
|
|
52
|
+
if (props.muted) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
registerAsset({
|
|
56
|
+
type: 'video',
|
|
57
|
+
src: (0, absolute_src_1.getAbsoluteSrc)(src),
|
|
58
|
+
id,
|
|
59
|
+
frame: absoluteFrame,
|
|
60
|
+
volume,
|
|
61
|
+
mediaFrame: frame,
|
|
62
|
+
playbackRate: playbackRate !== null && playbackRate !== void 0 ? playbackRate : 1,
|
|
63
|
+
});
|
|
64
|
+
return () => unregisterAsset(id);
|
|
65
|
+
}, [
|
|
66
|
+
props.muted,
|
|
67
|
+
src,
|
|
68
|
+
registerAsset,
|
|
69
|
+
id,
|
|
70
|
+
unregisterAsset,
|
|
71
|
+
volume,
|
|
72
|
+
frame,
|
|
73
|
+
absoluteFrame,
|
|
74
|
+
playbackRate,
|
|
75
|
+
]);
|
|
76
|
+
const currentTime = (0, react_1.useMemo)(() => {
|
|
77
|
+
return (0, get_current_time_1.getMediaTime)({
|
|
78
|
+
fps: videoConfig.fps,
|
|
79
|
+
frame,
|
|
80
|
+
src,
|
|
81
|
+
playbackRate: playbackRate || 1,
|
|
82
|
+
startFrom: -mediaStartsAt,
|
|
83
|
+
});
|
|
84
|
+
}, [frame, mediaStartsAt, playbackRate, src, videoConfig.fps]);
|
|
85
|
+
const actualSrc = (0, react_1.useMemo)(() => {
|
|
86
|
+
return `https://remotionoffthreadvideo.com/proxy?src=${encodeURIComponent(src)}&time=${encodeURIComponent(currentTime)}`;
|
|
87
|
+
}, [currentTime, src]);
|
|
88
|
+
return (0, jsx_runtime_1.jsx)(Img_1.Img, { ref: imageRef, src: actualSrc, ...props, onError: onError }, void 0);
|
|
89
|
+
};
|
|
90
|
+
exports.OffthreadVideo = (0, react_1.forwardRef)(OffthreadVideoForRenderingForwardFunction);
|
package/dist/video/Video.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { RemotionMainVideoProps } from './props';
|
|
3
|
-
export declare const Video: React.ForwardRefExoticComponent<Pick<Omit<React.DetailedHTMLProps<React.VideoHTMLAttributes<HTMLVideoElement>, HTMLVideoElement>, "
|
|
3
|
+
export declare const Video: React.ForwardRefExoticComponent<Pick<Omit<React.DetailedHTMLProps<React.VideoHTMLAttributes<HTMLVideoElement>, HTMLVideoElement>, "onEnded" | "autoPlay" | "controls" | "loop"> & {
|
|
4
4
|
volume?: import("../volume-prop").VolumeProp | undefined;
|
|
5
5
|
playbackRate?: number | undefined;
|
|
6
|
-
} & RemotionMainVideoProps, "
|
|
6
|
+
} & RemotionMainVideoProps, "style" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "slot" | "spellCheck" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "height" | "width" | "src" | "volume" | "playbackRate" | "controlsList" | "crossOrigin" | "mediaGroup" | "muted" | "playsInline" | "preload" | "key" | "poster" | "disablePictureInPicture" | "disableRemotePlayback" | keyof RemotionMainVideoProps> & React.RefAttributes<HTMLVideoElement>>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { RemotionVideoProps } from './props';
|
|
3
|
-
export declare const VideoForRendering: React.ForwardRefExoticComponent<Pick<RemotionVideoProps, "
|
|
3
|
+
export declare const VideoForRendering: React.ForwardRefExoticComponent<Pick<RemotionVideoProps, "style" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "slot" | "spellCheck" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "height" | "width" | "src" | "volume" | "playbackRate" | "controlsList" | "crossOrigin" | "mediaGroup" | "muted" | "playsInline" | "preload" | "key" | "poster" | "disablePictureInPicture" | "disableRemotePlayback"> & React.RefAttributes<HTMLVideoElement>>;
|
|
@@ -103,36 +103,36 @@ const VideoForRenderingForwardFunction = ({ onError, volume: volumeProp, playbac
|
|
|
103
103
|
return;
|
|
104
104
|
}
|
|
105
105
|
videoRef.current.currentTime = currentTime;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// Please see this issue for context: https://github.com/remotion-dev/remotion/issues/200
|
|
113
|
-
// Only affects macOS since it uses VideoToolbox decoding.
|
|
114
|
-
console.log('new frame ', frame, now, JSON.stringify(metadata), (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState, (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime, currentTime);
|
|
106
|
+
videoRef.current.addEventListener('seeked', () => {
|
|
107
|
+
if (window.navigator.platform.startsWith('Mac')) {
|
|
108
|
+
// Improve me: This is ensures frame perfectness but slows down render.
|
|
109
|
+
// Please see this issue for context: https://github.com/remotion-dev/remotion/issues/200
|
|
110
|
+
// Only affects macOS since it uses VideoToolbox decoding.
|
|
111
|
+
setTimeout(() => {
|
|
115
112
|
(0, delay_render_1.continueRender)(handle);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
});
|
|
113
|
+
}, 100);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
(0, delay_render_1.continueRender)(handle);
|
|
117
|
+
}
|
|
118
|
+
}, { once: true });
|
|
123
119
|
videoRef.current.addEventListener('ended', () => {
|
|
124
120
|
(0, delay_render_1.continueRender)(handle);
|
|
125
121
|
}, { once: true });
|
|
126
122
|
videoRef.current.addEventListener('error', () => {
|
|
127
123
|
var _a, _b, _c, _d;
|
|
128
124
|
if ((_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.error) {
|
|
129
|
-
console.error('Error occurred in video', (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.error
|
|
125
|
+
console.error('Error occurred in video', (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.error);
|
|
130
126
|
throw new Error(`The browser threw an error while playing the video: ${(_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.error) === null || _d === void 0 ? void 0 : _d.message}`);
|
|
131
127
|
}
|
|
132
128
|
else {
|
|
133
129
|
throw new Error('The browser threw an errir');
|
|
134
130
|
}
|
|
135
131
|
}, { once: true });
|
|
132
|
+
// If video skips to another frame or unmounts, we clear the created handle
|
|
133
|
+
return () => {
|
|
134
|
+
(0, delay_render_1.continueRender)(handle);
|
|
135
|
+
};
|
|
136
136
|
}, [
|
|
137
137
|
volumePropsFrame,
|
|
138
138
|
props.src,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remotion",
|
|
3
|
-
"version": "4.0.0-
|
|
3
|
+
"version": "4.0.0-preload.13+f7b159495",
|
|
4
4
|
"description": "Render videos in React",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "f7b1594951e881444050f2f9d4af8d442bbec942"
|
|
59
59
|
}
|