remotion 4.0.536 → 4.0.537

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.
@@ -27,6 +27,7 @@ __export(exports_timeline_position_state, {
27
27
  usePlaying: () => usePlaying,
28
28
  useTimelineContext: () => useTimelineContext,
29
29
  useTimelinePosition: () => useTimelinePosition,
30
+ useTimelinePositionWithOptionalSubscription: () => useTimelinePositionWithOptionalSubscription,
30
31
  useTimelineSeekFrame: () => useTimelineSeekFrame,
31
32
  useTimelineSetFrameWithoutSeek: () => useTimelineSetFrameWithoutSeek
32
33
  });
@@ -284,13 +285,15 @@ class CompositionErrorBoundary extends React5.Component {
284
285
  // src/CompositionManagerContext.tsx
285
286
  import { createContext as createContext7 } from "react";
286
287
  var getAssetPreviewCompositionId = (asset) => `asset:${asset}`;
287
- var CompositionManager = createContext7({
288
+ var defaultCompositionManagerContext = {
288
289
  compositions: [],
289
290
  folders: [],
290
291
  currentCompositionMetadata: null,
291
292
  currentAssetMetadata: null,
292
293
  canvasContent: null
293
- });
294
+ };
295
+ var CompositionManager = createContext7(defaultCompositionManagerContext);
296
+ var CompositionManagerRefContext = createContext7({ current: defaultCompositionManagerContext });
294
297
  var CompositionSetters = createContext7({
295
298
  setCanvasContent: () => {
296
299
  return;
@@ -761,12 +764,12 @@ function validateDurationInFrames(durationInFrames, options) {
761
764
  if (durationInFrames <= 0) {
762
765
  throw new TypeError(`The "durationInFrames" prop ${component} must be positive, but got ${durationInFrames}.`);
763
766
  }
764
- if (!allowFloats && durationInFrames % 1 !== 0) {
765
- throw new TypeError(`The "durationInFrames" prop ${component} must be an integer, but got ${durationInFrames}.`);
766
- }
767
767
  if (!Number.isFinite(durationInFrames)) {
768
768
  throw new TypeError(`The "durationInFrames" prop ${component} must be finite, but got ${durationInFrames}.`);
769
769
  }
770
+ if (!allowFloats && durationInFrames % 1 !== 0) {
771
+ throw new TypeError(`The "durationInFrames" prop ${component} must be an integer, but got ${durationInFrames}.`);
772
+ }
770
773
  }
771
774
 
772
775
  // src/validation/validate-fps.ts
@@ -1741,7 +1744,7 @@ var getStackForControls = (controls) => {
1741
1744
  };
1742
1745
 
1743
1746
  // src/version.ts
1744
- var VERSION = "4.0.536";
1747
+ var VERSION = "4.0.537";
1745
1748
 
1746
1749
  // src/multiple-versions-warning.ts
1747
1750
  var checkMultipleRemotionVersions = () => {
@@ -1779,12 +1782,12 @@ var Null = () => {
1779
1782
 
1780
1783
  // src/Sequence.tsx
1781
1784
  import React26, {
1782
- createContext as createContext27,
1785
+ createContext as createContext28,
1783
1786
  forwardRef as forwardRef3,
1784
1787
  useCallback as useCallback7,
1785
1788
  useContext as useContext28,
1786
1789
  useLayoutEffect as useLayoutEffect8,
1787
- useMemo as useMemo19,
1790
+ useMemo as useMemo20,
1788
1791
  useRef as useRef8,
1789
1792
  useState as useState9
1790
1793
  } from "react";
@@ -1805,7 +1808,7 @@ var DEFAULT_PREMOUNT_IN_SECONDS = ENABLE_V5_BREAKING_CHANGES ? 2 : 0;
1805
1808
  var DefaultPremountContext = createContext17(DEFAULT_PREMOUNT_IN_SECONDS);
1806
1809
 
1807
1810
  // src/freeze.tsx
1808
- import { createContext as createContext20, useContext as useContext17, useMemo as useMemo11 } from "react";
1811
+ import { createContext as createContext21, useContext as useContext17, useMemo as useMemo11 } from "react";
1809
1812
 
1810
1813
  // src/sequence-activity-context.ts
1811
1814
  import { createContext as createContext18, useContext as useContext11 } from "react";
@@ -1825,7 +1828,7 @@ var SequenceContent = ({ children }) => {
1825
1828
  };
1826
1829
 
1827
1830
  // src/timeline-position-state.ts
1828
- import { useContext as useContext14 } from "react";
1831
+ import { createContext as createContext20, useContext as useContext14 } from "react";
1829
1832
 
1830
1833
  // src/TimelineContext.tsx
1831
1834
  import {
@@ -2020,6 +2023,7 @@ var useBuffering = () => {
2020
2023
  };
2021
2024
 
2022
2025
  // src/timeline-position-state.ts
2026
+ var UnsubscribedTimelineContext = createContext20(null);
2023
2027
  var makeKey = () => {
2024
2028
  return `remotion.time-all`;
2025
2029
  };
@@ -2049,6 +2053,9 @@ var useTimelinePositionFromContext = (state) => {
2049
2053
  const videoConfig = useVideo();
2050
2054
  const env = useRemotionEnvironment();
2051
2055
  const dormant = useContext14(SequenceActivityDormantContext);
2056
+ if (state === null) {
2057
+ return 0;
2058
+ }
2052
2059
  if (!videoConfig) {
2053
2060
  return typeof window === "undefined" ? 0 : window.remotion_initialFrame ?? 0;
2054
2061
  }
@@ -2074,6 +2081,15 @@ var useTimelinePosition = () => {
2074
2081
  const state = useTimelineContext();
2075
2082
  return useTimelinePositionFromContext(state);
2076
2083
  };
2084
+ var useTimelinePositionWithOptionalSubscription = (subscribe) => {
2085
+ const dormant = useContext14(SequenceActivityDormantContext);
2086
+ const state = useContext14(subscribe ? dormant ? SequenceActivityTimelineContext : TimelineContext : UnsubscribedTimelineContext);
2087
+ const frame = useTimelinePositionFromContext(state);
2088
+ if (subscribe && state === null) {
2089
+ throw new Error("TimelineContext is not available. This hook must be used inside a <Player> or the Remotion Studio.");
2090
+ }
2091
+ return frame;
2092
+ };
2077
2093
  var useIsInsideFreeze = () => {
2078
2094
  return useTimelineContext().isInsideFreeze;
2079
2095
  };
@@ -2096,7 +2112,7 @@ var useTimelineSeekFrame = () => {
2096
2112
 
2097
2113
  // src/use-current-frame.ts
2098
2114
  import { useContext as useContext15 } from "react";
2099
- var useCurrentFrame = () => {
2115
+ var useCurrentFrameWithOptionalSubscription = (subscribe) => {
2100
2116
  const canUseRemotionHooks = useContext15(CanUseRemotionHooks);
2101
2117
  const env = useRemotionEnvironment();
2102
2118
  if (!canUseRemotionHooks) {
@@ -2105,11 +2121,17 @@ var useCurrentFrame = () => {
2105
2121
  }
2106
2122
  throw new Error(`useCurrentFrame() can only be called inside a component that was registered as a composition. See https://www.remotion.dev/docs/the-fundamentals#defining-compositions`);
2107
2123
  }
2108
- const frame = useTimelinePosition();
2124
+ const frame = useTimelinePositionWithOptionalSubscription(subscribe);
2109
2125
  const context = useContext15(SequenceContext);
2126
+ if (!subscribe) {
2127
+ return 0;
2128
+ }
2110
2129
  const contextOffset = context ? context.cumulatedFrom + context.relativeFrom : 0;
2111
2130
  return (frame - contextOffset) * (context?.playbackRate ?? 1);
2112
2131
  };
2132
+ var useCurrentFrame = () => {
2133
+ return useCurrentFrameWithOptionalSubscription(true);
2134
+ };
2113
2135
 
2114
2136
  // src/use-video-config.ts
2115
2137
  import { useContext as useContext16 } from "react";
@@ -2135,7 +2157,7 @@ var useVideoConfig = () => {
2135
2157
 
2136
2158
  // src/freeze.tsx
2137
2159
  import { jsx as jsx11 } from "react/jsx-runtime";
2138
- var NonPremountFreezeContext = createContext20(false);
2160
+ var NonPremountFreezeContext = createContext21(false);
2139
2161
  var useIsInsideNonPremountFreeze = () => useContext17(NonPremountFreezeContext);
2140
2162
  var Freeze = ({
2141
2163
  frame: frameToFreeze,
@@ -2670,8 +2692,8 @@ var sequenceSchemaDefaultLayoutNone = {
2670
2692
  };
2671
2693
 
2672
2694
  // src/loop/loop-context.ts
2673
- import { createContext as createContext21 } from "react";
2674
- var LoopContext = createContext21(null);
2695
+ import { createContext as createContext22 } from "react";
2696
+ var LoopContext = createContext22(null);
2675
2697
 
2676
2698
  // src/resolve-sequence-duration.ts
2677
2699
  var resolveSequenceContentDuration = ({
@@ -2840,7 +2862,7 @@ var SequenceActivityBoundary = ({ children, dormant, frame }) => {
2840
2862
  };
2841
2863
 
2842
2864
  // src/SequenceActivityBudget.tsx
2843
- import React19, { createContext as createContext22, useContext as useContext19, useMemo as useMemo13, useState as useState4 } from "react";
2865
+ import React19, { createContext as createContext23, useContext as useContext19, useMemo as useMemo13, useState as useState4 } from "react";
2844
2866
  import { jsx as jsx13 } from "react/jsx-runtime";
2845
2867
  var useCommitEffect = React19.useInsertionEffect ?? React19.useLayoutEffect;
2846
2868
  var createActivityBudget = () => {
@@ -2919,10 +2941,10 @@ var createActivityBudget = () => {
2919
2941
  }
2920
2942
  };
2921
2943
  };
2922
- var ActivityBudgetContext = createContext22(null);
2923
- var InactiveTimelineContext = createContext22(null);
2944
+ var ActivityBudgetContext = createContext23(null);
2945
+ var InactiveTimelineContext = createContext23(null);
2924
2946
  var emptySelection = new Set;
2925
- var ActivitySelectionContext = createContext22(emptySelection);
2947
+ var ActivitySelectionContext = createContext23(emptySelection);
2926
2948
  var SequenceActivityBudgetProvider = ({ children }) => {
2927
2949
  const enabled = useContext19(SequenceActivityContext);
2928
2950
  const settings = useContext19(SequenceActivitySettingsContext);
@@ -3699,15 +3721,15 @@ var SequenceManagerProvider = ({ children }) => {
3699
3721
  };
3700
3722
 
3701
3723
  // src/timeline-track-context.ts
3702
- import { createContext as createContext23 } from "react";
3703
- var TimelineTrackContext = createContext23(null);
3724
+ import { createContext as createContext24 } from "react";
3725
+ var TimelineTrackContext = createContext24(null);
3704
3726
 
3705
3727
  // src/use-premounting.ts
3706
3728
  import { useContext as useContext24, useMemo as useMemo16 } from "react";
3707
3729
 
3708
3730
  // src/PremountContext.tsx
3709
- import { createContext as createContext24 } from "react";
3710
- var PremountContext = createContext24({
3731
+ import { createContext as createContext25 } from "react";
3732
+ var PremountContext = createContext25({
3711
3733
  premountFramesRemaining: 0
3712
3734
  });
3713
3735
 
@@ -3822,11 +3844,11 @@ var useSequenceRegistration = ({
3822
3844
 
3823
3845
  // src/with-interactivity-schema.ts
3824
3846
  import React25, {
3825
- createContext as createContext26,
3847
+ createContext as createContext27,
3826
3848
  forwardRef as forwardRef2,
3827
3849
  useContext as useContext27,
3828
3850
  useLayoutEffect as useLayoutEffect7,
3829
- useMemo as useMemo18,
3851
+ useMemo as useMemo19,
3830
3852
  useState as useState8
3831
3853
  } from "react";
3832
3854
 
@@ -3864,7 +3886,7 @@ var deleteNestedKey = (obj, keysToRemove) => {
3864
3886
  };
3865
3887
 
3866
3888
  // src/effects/use-memoized-effects.ts
3867
- import React24, { useContext as useContext26, useLayoutEffect as useLayoutEffect6, useRef as useRef7 } from "react";
3889
+ import React24, { useContext as useContext26, useLayoutEffect as useLayoutEffect6, useMemo as useMemo18, useRef as useRef7 } from "react";
3868
3890
 
3869
3891
  // src/evaluate-source-expressions.ts
3870
3892
  var evaluateSourceNumericValue = (expression, config) => {
@@ -5970,11 +5992,11 @@ var getEffectiveVisualModeValue = ({
5970
5992
  };
5971
5993
 
5972
5994
  // src/sequence-node-path.tsx
5973
- import { createContext as createContext25 } from "react";
5974
- var OverrideIdsToNodePathsGettersContext = createContext25({
5995
+ import { createContext as createContext26 } from "react";
5996
+ var OverrideIdsToNodePathsGettersContext = createContext26({
5975
5997
  overrideIdToNodePathMappings: {}
5976
5998
  });
5977
- var OverrideIdsToNodePathsSettersContext = createContext25({
5999
+ var OverrideIdsToNodePathsSettersContext = createContext26({
5978
6000
  setOverrideIdToNodePath: () => {
5979
6001
  throw new Error("OverrideIdsToNodePathsSettersContext not initialized");
5980
6002
  }
@@ -5983,6 +6005,15 @@ var OverrideIdsToNodePathsSettersContext = createContext25({
5983
6005
  // src/effects/use-memoized-effects.ts
5984
6006
  var emptyDragOverrides2 = {};
5985
6007
  var useCacheCommitEffect = React24.useInsertionEffect ?? useLayoutEffect6;
6008
+ var areEffectParamsEqual = (previous, next) => {
6009
+ if (Object.is(previous, next)) {
6010
+ return true;
6011
+ }
6012
+ if (previous === null || next === null || typeof previous !== "object" || typeof next !== "object" || Object.getPrototypeOf(previous) !== Object.prototype || Object.getPrototypeOf(next) !== Object.prototype) {
6013
+ return false;
6014
+ }
6015
+ return areRegistryEntriesEqual(previous, next);
6016
+ };
5986
6017
  var mergeOverrides = ({
5987
6018
  descriptor,
5988
6019
  propStatusOverrides,
@@ -6047,11 +6078,10 @@ var resolvePropStatusOverrides = (propStatus, frame) => {
6047
6078
  var useMemoizedEffectDefinitions = (effects) => {
6048
6079
  const activityDormant = useContext26(SequenceActivityDormantContext);
6049
6080
  const previousRef = useRef7(null);
6050
- const definitions = effects.map((descriptor) => descriptor.definition);
6051
6081
  const previous = previousRef.current;
6052
- const isSame = previous !== null && previous.definitions.length === definitions.length && previous.definitions.every((definition, i) => definition === definitions[i]);
6082
+ const isSame = previous !== null && previous.definitions.length === effects.length && previous.definitions.every((definition, i) => definition === effects[i].definition);
6053
6083
  const controllers = isSame ? previous.controllers : effects.map((effect) => createRuntimeValueStore(effect.params));
6054
- const stableDefinitions = isSame ? previous.definitions : Object.assign(definitions, {
6084
+ const stableDefinitions = isSame ? previous.definitions : Object.assign(effects.map((descriptor) => descriptor.definition), {
6055
6085
  runtimeValues: controllers.map((controller) => controller.store)
6056
6086
  });
6057
6087
  useCacheCommitEffect(() => {
@@ -6059,6 +6089,9 @@ var useMemoizedEffectDefinitions = (effects) => {
6059
6089
  if (!activityDormant || controllers.length === 0) {
6060
6090
  return;
6061
6091
  }
6092
+ if (controllers.every((controller, index) => areEffectParamsEqual(controller.store.getSnapshot(), effects[index]?.params))) {
6093
+ return;
6094
+ }
6062
6095
  let cancelled = false;
6063
6096
  queueMicrotask(() => {
6064
6097
  if (cancelled) {
@@ -6067,15 +6100,9 @@ var useMemoizedEffectDefinitions = (effects) => {
6067
6100
  controllers.forEach((controller, index) => {
6068
6101
  const snapshot = effects[index]?.params;
6069
6102
  const currentSnapshot = controller.store.getSnapshot();
6070
- if (Object.is(snapshot, currentSnapshot)) {
6103
+ if (areEffectParamsEqual(snapshot, currentSnapshot)) {
6071
6104
  return;
6072
6105
  }
6073
- if (snapshot !== null && currentSnapshot !== null && typeof snapshot === "object" && typeof currentSnapshot === "object") {
6074
- const keys = Object.keys(snapshot);
6075
- if (keys.length === Object.keys(currentSnapshot).length && keys.every((key) => Object.prototype.hasOwnProperty.call(currentSnapshot, key) && Object.is(snapshot[key], currentSnapshot[key]))) {
6076
- return;
6077
- }
6078
- }
6079
6106
  controller.setSnapshot(snapshot);
6080
6107
  });
6081
6108
  });
@@ -6086,7 +6113,9 @@ var useMemoizedEffectDefinitions = (effects) => {
6086
6113
  useLayoutEffect6(() => {
6087
6114
  stableDefinitions.forEach((_definition, index) => {
6088
6115
  const snapshot = effects[index]?.params;
6089
- controllers[index].setSnapshot(snapshot);
6116
+ if (!areEffectParamsEqual(controllers[index].store.getSnapshot(), snapshot)) {
6117
+ controllers[index].setSnapshot(snapshot);
6118
+ }
6090
6119
  });
6091
6120
  }, [controllers, effects, stableDefinitions]);
6092
6121
  return stableDefinitions;
@@ -6132,45 +6161,59 @@ var useMemoizedEffects = ({
6132
6161
  }) => {
6133
6162
  const previousRef = useRef7(null);
6134
6163
  const { propStatuses } = useContext26(VisualModePropStatusesContext);
6135
- const frame = useCurrentFrame();
6136
6164
  const { overrideIdToNodePathMappings } = useContext26(OverrideIdsToNodePathsGettersContext);
6137
6165
  const previous = previousRef.current;
6138
6166
  const nodePath = overrideId ? overrideIdToNodePathMappings[overrideId] ?? null : null;
6139
6167
  const effectDragOverrides = useEffectDragOverridesForNodePath(nodePath);
6140
- const resolved = effects.map((descriptor, index) => {
6168
+ const effectPropStatuses = useMemo18(() => Array.from({ length: effects.length }, (_, effectIndex) => {
6141
6169
  if (nodePath === null) {
6142
- return {
6143
- descriptor,
6144
- params: descriptor.params,
6145
- effectKey: descriptor.effectKey
6146
- };
6170
+ return null;
6147
6171
  }
6148
- const effectStatus = getEffectPropStatusesCtx({
6172
+ const status = getEffectPropStatusesCtx({
6149
6173
  propStatuses,
6150
6174
  nodePath: { ...nodePath, videoConfigValues },
6151
- effectIndex: index
6175
+ effectIndex
6152
6176
  });
6153
- const propStatusOverrides = effectStatus.type === "can-update-effect" ? resolvePropStatusOverrides(effectStatus.props, frame) : null;
6177
+ return status.type === "can-update-effect" ? status.props : null;
6178
+ }), [effects.length, nodePath, propStatuses, videoConfigValues]);
6179
+ const animatedEffects = useMemo18(() => effectPropStatuses.map((status, index) => Object.values(status ?? {}).some((prop) => prop.status === "keyframed") || Object.values(effectDragOverrides[index] ?? emptyDragOverrides2).some((override) => override.type === "keyframed")), [effectDragOverrides, effectPropStatuses]);
6180
+ const frame = useCurrentFrameWithOptionalSubscription(animatedEffects.some(Boolean));
6181
+ const prepared = effects.map((descriptor, index) => {
6182
+ const propStatus = effectPropStatuses[index];
6154
6183
  const dragOverridesMap = effectDragOverrides[index] ?? emptyDragOverrides2;
6155
6184
  const dragOverrides = Object.keys(dragOverridesMap).length === 0 ? null : dragOverridesMap;
6185
+ const effectFrame = animatedEffects[index] ? frame : null;
6186
+ const cached = previous?.prepared[index];
6187
+ if (cached && cached.definition === descriptor.definition && cached.sourceKey === descriptor.effectKey && areEffectParamsEqual(cached.params, descriptor.params) && cached.propStatus === propStatus && cached.dragOverrides === dragOverrides && cached.frame === effectFrame) {
6188
+ return cached;
6189
+ }
6190
+ const propStatusOverrides = resolvePropStatusOverrides(propStatus ?? undefined, frame);
6156
6191
  const { params, effectKey } = mergeOverrides({
6157
6192
  descriptor,
6158
6193
  propStatusOverrides,
6159
6194
  dragOverrides,
6160
6195
  frame
6161
6196
  });
6162
- return { descriptor, params, effectKey };
6197
+ return {
6198
+ definition: descriptor.definition,
6199
+ sourceKey: descriptor.effectKey,
6200
+ params: descriptor.params !== null && typeof descriptor.params === "object" && Object.getPrototypeOf(descriptor.params) === Object.prototype ? { ...descriptor.params } : descriptor.params,
6201
+ propStatus,
6202
+ dragOverrides,
6203
+ frame: effectFrame,
6204
+ value: cached?.value.definition === descriptor.definition && cached.value.effectKey === effectKey ? cached.value : {
6205
+ definition: descriptor.definition,
6206
+ effectKey,
6207
+ params,
6208
+ memoized: true
6209
+ }
6210
+ };
6163
6211
  });
6164
- const isSame = previous !== null && previous.length === resolved.length && previous.every((p, i) => p.definition === resolved[i].descriptor.definition && p.effectKey === resolved[i].effectKey);
6165
- const next = isSame ? previous : resolved.map(({ descriptor, params, effectKey }) => ({
6166
- definition: descriptor.definition,
6167
- effectKey,
6168
- params,
6169
- memoized: true
6170
- }));
6212
+ const isSame = previous !== null && previous.effects.length === prepared.length && previous.effects.every((effect, i) => effect === prepared[i].value);
6213
+ const next = isSame ? previous.effects : prepared.map((effect) => effect.value);
6171
6214
  useCacheCommitEffect(() => {
6172
- previousRef.current = next;
6173
- }, [next]);
6215
+ previousRef.current = { prepared, effects: next };
6216
+ }, [next, prepared]);
6174
6217
  return next;
6175
6218
  };
6176
6219
 
@@ -6571,11 +6614,11 @@ var mergeValues = ({
6571
6614
  deleteNestedKey(merged, propsToDeleteWithoutTextContent);
6572
6615
  return merged;
6573
6616
  };
6574
- var DisableInteractivityContext = createContext26(false);
6617
+ var DisableInteractivityContext = createContext27(false);
6575
6618
  var DisableInteractivityProvider = ({ children }) => {
6576
6619
  return React25.createElement(DisableInteractivityContext.Provider, { value: true }, children);
6577
6620
  };
6578
- var EnableInteractivityContext = createContext26(false);
6621
+ var EnableInteractivityContext = createContext27(false);
6579
6622
  var EnableInteractivityProvider = ({ children }) => {
6580
6623
  return React25.createElement(EnableInteractivityContext.Provider, { value: true }, children);
6581
6624
  };
@@ -6610,20 +6653,19 @@ var withInteractivitySchema = ({
6610
6653
  }
6611
6654
  const { propStatuses } = useContext27(VisualModePropStatusesContext);
6612
6655
  const nodePathMapping = useContext27(OverrideIdsToNodePathsGettersContext);
6613
- const frame = useCurrentFrame();
6614
6656
  const videoConfig = useUnsafeVideoConfig();
6615
6657
  const durationInFrames = videoConfig?.durationInFrames;
6616
6658
  const fps = videoConfig?.fps;
6617
6659
  const height = videoConfig?.height;
6618
6660
  const width = videoConfig?.width;
6619
- const videoConfigValues = useMemo18(() => durationInFrames === undefined || fps === undefined || height === undefined || width === undefined ? null : {
6661
+ const videoConfigValues = useMemo19(() => durationInFrames === undefined || fps === undefined || height === undefined || width === undefined ? null : {
6620
6662
  durationInFrames,
6621
6663
  fps,
6622
6664
  height,
6623
6665
  width
6624
6666
  }, [durationInFrames, fps, height, width]);
6625
6667
  const passedControls = cleanProps.controls;
6626
- const resolvedPassedControls = useMemo18(() => {
6668
+ const resolvedPassedControls = useMemo19(() => {
6627
6669
  if (!passedControls || getStackForControls(passedControls) !== null || internalStack === undefined) {
6628
6670
  return passedControls;
6629
6671
  }
@@ -6652,17 +6694,23 @@ var withInteractivitySchema = ({
6652
6694
  });
6653
6695
  const nodePath = env.isReadOnlyStudio ? null : nodePathMapping.overrideIdToNodePathMappings[overrideId] ?? null;
6654
6696
  const dragOverrides = useDragOverridesForNodePath(nodePath);
6697
+ const propStatus = useMemo19(() => nodePath === null ? undefined : getPropStatusesCtx(propStatuses, {
6698
+ ...nodePath,
6699
+ videoConfigValues
6700
+ }), [nodePath, propStatuses, videoConfigValues]);
6701
+ const needsFrame = flatKeys.some((key) => propStatus?.[key]?.status === "keyframed" || dragOverrides[key]?.type === "keyframed");
6702
+ const frame = useCurrentFrameWithOptionalSubscription(needsFrame);
6655
6703
  const runtimeValues = flatKeys.map((key) => getRuntimeValueForSchemaKey({
6656
6704
  flatSchema,
6657
6705
  key,
6658
6706
  props: cleanProps
6659
6707
  }));
6660
- const currentRuntimeValueDotNotation = useMemo18(() => readValuesFromProps(cleanProps, flatKeys, flatSchema), runtimeValues);
6708
+ const currentRuntimeValueDotNotation = useMemo19(() => readValuesFromProps(cleanProps, flatKeys, flatSchema), runtimeValues);
6661
6709
  const [runtimeValueStore] = useState8(() => createRuntimeValueStore(currentRuntimeValueDotNotation));
6662
6710
  useLayoutEffect7(() => {
6663
6711
  runtimeValueStore.setSnapshot(currentRuntimeValueDotNotation);
6664
6712
  }, [currentRuntimeValueDotNotation, runtimeValueStore]);
6665
- const controls = useMemo18(() => {
6713
+ const controls = useMemo19(() => {
6666
6714
  const controlsForRender = {
6667
6715
  schema: schemaWithSequenceName,
6668
6716
  currentRuntimeValueDotNotation,
@@ -6685,25 +6733,15 @@ var withInteractivitySchema = ({
6685
6733
  useLayoutEffect7(() => {
6686
6734
  OptimisticSequenceDeletion.register(internalStack ?? null, nodePath);
6687
6735
  }, [internalStack, nodePath]);
6688
- const { merged: valuesDotNotation, propsToDelete } = useMemo18(() => {
6736
+ const { merged: valuesDotNotation, propsToDelete } = useMemo19(() => {
6689
6737
  return computeEffectiveSchemaValuesDotNotation({
6690
6738
  schema: schemaWithSequenceName,
6691
6739
  currentValue: currentRuntimeValueDotNotation,
6692
6740
  overrideValues: dragOverrides,
6693
- propStatus: nodePath === null ? undefined : getPropStatusesCtx(propStatuses, {
6694
- ...nodePath,
6695
- videoConfigValues
6696
- }),
6741
+ propStatus,
6697
6742
  frame
6698
6743
  });
6699
- }, [
6700
- currentRuntimeValueDotNotation,
6701
- dragOverrides,
6702
- nodePath,
6703
- propStatuses,
6704
- videoConfigValues,
6705
- frame
6706
- ]);
6744
+ }, [currentRuntimeValueDotNotation, dragOverrides, propStatus, frame]);
6707
6745
  const activeKeys = selectActiveKeys(schemaWithSequenceName, valuesDotNotation);
6708
6746
  const mergedProps = mergeValues({
6709
6747
  flatSchema,
@@ -6727,7 +6765,7 @@ var withInteractivitySchema = ({
6727
6765
 
6728
6766
  // src/Sequence.tsx
6729
6767
  import { jsx as jsx17 } from "react/jsx-runtime";
6730
- var SeriesContentVisibilityContext = createContext27(true);
6768
+ var SeriesContentVisibilityContext = createContext28(true);
6731
6769
  var SequenceContextProvider = withCommittedMetadata(SequenceContext.Provider);
6732
6770
  var EMPTY_EFFECTS = [];
6733
6771
  var RegularSequenceRefForwardingFunction = ({
@@ -6875,13 +6913,13 @@ var RegularSequenceRefForwardingFunction = ({
6875
6913
  const sequenceRegistrationEnabled = useContext28(SequenceRegistrationContext);
6876
6914
  const canvasOutlinesEnabled = useContext28(SequenceOutlineContext);
6877
6915
  const shouldDiscoverOutline = env.isStudio || canvasOutlinesEnabled;
6878
- const automaticOutlineRef = useMemo19(() => shouldDiscoverOutline && layout === "none" ? SequenceOutlineInternals.createRef() : null, [shouldDiscoverOutline, layout]);
6916
+ const automaticOutlineRef = useMemo20(() => shouldDiscoverOutline && layout === "none" ? SequenceOutlineInternals.createRef() : null, [shouldDiscoverOutline, layout]);
6879
6917
  const wrapperRefForOutline = useRef8(null);
6880
6918
  const refForOutline = layout === "none" ? automaticOutlineRef : wrapperRefForOutline;
6881
- const premounting = useMemo19(() => {
6919
+ const premounting = useMemo20(() => {
6882
6920
  return parentSequence?.premounting || Boolean(other._remotionInternalIsPremounting);
6883
6921
  }, [other._remotionInternalIsPremounting, parentSequence?.premounting]);
6884
- const postmounting = useMemo19(() => {
6922
+ const postmounting = useMemo20(() => {
6885
6923
  return parentSequence?.postmounting || Boolean(other._remotionInternalIsPostmounting);
6886
6924
  }, [other._remotionInternalIsPostmounting, parentSequence?.postmounting]);
6887
6925
  const currentSequenceStart = cumulatedFrom + relativeFrom;
@@ -6889,7 +6927,7 @@ var RegularSequenceRefForwardingFunction = ({
6889
6927
  const parentFirstFrame = parentSequence ? parentSequenceStart - parentSequence.cumulatedNegativeFrom / parentPlaybackRate : 0;
6890
6928
  const firstFrame = Math.max(0, parentFirstFrame, cumulatedFrom + clockFrom / parentPlaybackRate);
6891
6929
  const cumulatedNegativeFrom = (currentSequenceStart - firstFrame) * cumulativePlaybackRate;
6892
- const contextValue = useMemo19(() => {
6930
+ const contextValue = useMemo20(() => {
6893
6931
  return {
6894
6932
  playbackRate: cumulativePlaybackRate,
6895
6933
  absoluteFrom,
@@ -6922,7 +6960,7 @@ var RegularSequenceRefForwardingFunction = ({
6922
6960
  postmountDisplay,
6923
6961
  cumulatedNegativeFrom
6924
6962
  ]);
6925
- const loopContextValue = useMemo19(() => {
6963
+ const loopContextValue = useMemo20(() => {
6926
6964
  if (loopPeriod === null) {
6927
6965
  return null;
6928
6966
  }
@@ -6931,7 +6969,7 @@ var RegularSequenceRefForwardingFunction = ({
6931
6969
  durationInFrames: contentDurationInFrames
6932
6970
  };
6933
6971
  }, [contentDurationInFrames, loopIteration, loopPeriod]);
6934
- const resolvedLoopDisplay = useMemo19(() => {
6972
+ const resolvedLoopDisplay = useMemo20(() => {
6935
6973
  if (loopDisplay || loopPeriod === null) {
6936
6974
  return loopDisplay;
6937
6975
  }
@@ -6941,12 +6979,12 @@ var RegularSequenceRefForwardingFunction = ({
6941
6979
  durationInFrames: loopPeriod
6942
6980
  };
6943
6981
  }, [actualDurationInFrames, loopDisplay, loopPeriod]);
6944
- const timelineClipName = useMemo19(() => {
6982
+ const timelineClipName = useMemo20(() => {
6945
6983
  return name ?? "";
6946
6984
  }, [name]);
6947
6985
  const resolvedDocumentationLink = documentationLink ?? "https://www.remotion.dev/docs/sequence";
6948
6986
  const isInsideSeries = useContext28(IsInsideSeriesContext);
6949
- const singleChildComponent = useMemo19(() => childComponentOverride === undefined ? getSingleChildComponent(children) : childComponentOverride, [children, childComponentOverride]);
6987
+ const singleChildComponent = useMemo20(() => childComponentOverride === undefined ? getSingleChildComponent(children) : childComponentOverride, [children, childComponentOverride]);
6950
6988
  const registrationStack = controls ? getStackForControls(controls) ?? stack ?? null : stack ?? null;
6951
6989
  const getStack = useCallback7(() => registrationStack, [registrationStack]);
6952
6990
  const registeredFrozenFrame = typeof freeze === "number" ? freeze : null;
@@ -6973,8 +7011,8 @@ var RegularSequenceRefForwardingFunction = ({
6973
7011
  const autoDuration = canInferDuration && durationInFrames === undefined;
6974
7012
  const isSeriesChild = controlsComponentIdentity === "dev.remotion.remotion.Series.Sequence" || controlsComponentIdentity === "dev.remotion.transitions.TransitionSeries.Sequence" || controlsComponentIdentity === "dev.remotion.transitions.TransitionSeries.Transition" || controlsComponentIdentity === "dev.remotion.transitions.TransitionSeries.Overlay";
6975
7013
  const seriesContentVisible = useContext28(SeriesContentVisibilityContext);
6976
- const effectRuntimeValues = useMemo19(() => _remotionInternalEffects?.runtimeValues ?? null, [_remotionInternalEffects]);
6977
- const registrationControls = useMemo19(() => {
7014
+ const effectRuntimeValues = useMemo20(() => _remotionInternalEffects?.runtimeValues ?? null, [_remotionInternalEffects]);
7015
+ const registrationControls = useMemo20(() => {
6978
7016
  if (controlsSchema === undefined || controlsRuntimeValues === undefined || controlsOverrideId === undefined || controlsSupportsEffects === undefined || controlsComponentIdentity === undefined || controlsComponentName === undefined || controlsVideoConfigValues === undefined) {
6979
7017
  return null;
6980
7018
  }
@@ -7181,7 +7219,7 @@ var RegularSequenceRefForwardingFunction = ({
7181
7219
  ref.current = node;
7182
7220
  }
7183
7221
  }, [ref]);
7184
- const defaultStyle = useMemo19(() => {
7222
+ const defaultStyle = useMemo20(() => {
7185
7223
  return {
7186
7224
  flexDirection: undefined,
7187
7225
  ...width ? { width } : {},
@@ -7195,7 +7233,7 @@ var RegularSequenceRefForwardingFunction = ({
7195
7233
  if (ref !== null && layout === "none") {
7196
7234
  throw new TypeError('It is not supported to pass both a `ref` and `layout="none"` to <Sequence />.');
7197
7235
  }
7198
- const metadata = useMemo19(() => shouldDiscoverOutline || registration !== null ? {
7236
+ const metadata = useMemo20(() => shouldDiscoverOutline || registration !== null ? {
7199
7237
  type: "sequence",
7200
7238
  id,
7201
7239
  value: registration,
@@ -7483,7 +7521,6 @@ addSequenceStackTraces(AbsoluteFill);
7483
7521
  // src/animated-image/AnimatedImage.tsx
7484
7522
  import {
7485
7523
  forwardRef as forwardRef4,
7486
- useEffect as useEffect8,
7487
7524
  useImperativeHandle as useImperativeHandle2,
7488
7525
  useLayoutEffect as useLayoutEffect9,
7489
7526
  useRef as useRef11,
@@ -7491,7 +7528,7 @@ import {
7491
7528
  } from "react";
7492
7529
 
7493
7530
  // src/use-crop-style.ts
7494
- import { useMemo as useMemo20 } from "react";
7531
+ import { useMemo as useMemo21 } from "react";
7495
7532
  var useCropStyle = ({
7496
7533
  cropLeft,
7497
7534
  cropRight,
@@ -7501,7 +7538,7 @@ var useCropStyle = ({
7501
7538
  componentName
7502
7539
  }) => {
7503
7540
  validateSequenceCrop({ cropLeft, cropRight, cropTop, cropBottom }, componentName);
7504
- return useMemo20(() => {
7541
+ return useMemo21(() => {
7505
7542
  const cropClipPath = getSequenceCropClipPath({
7506
7543
  ...resolveSequenceCrop({ cropLeft, cropRight, cropTop, cropBottom }),
7507
7544
  style
@@ -7514,7 +7551,7 @@ var useCropStyle = ({
7514
7551
  };
7515
7552
 
7516
7553
  // src/animated-image/canvas.tsx
7517
- import React28, { useCallback as useCallback9, useImperativeHandle, useMemo as useMemo22, useRef as useRef10 } from "react";
7554
+ import React28, { useCallback as useCallback9, useImperativeHandle, useMemo as useMemo23, useRef as useRef10 } from "react";
7518
7555
 
7519
7556
  // src/calculate-image-fit.ts
7520
7557
  var calculateImageFit = (fit, imageSize, canvasSize) => {
@@ -7884,7 +7921,7 @@ var runEffectChain = async (options) => {
7884
7921
  };
7885
7922
 
7886
7923
  // src/effects/use-effect-chain-state.ts
7887
- import { useEffect as useEffect7, useMemo as useMemo21, useRef as useRef9 } from "react";
7924
+ import { useEffect as useEffect7, useMemo as useMemo22, useRef as useRef9 } from "react";
7888
7925
  var useEffectChainState = (effectsOutputSize = null) => {
7889
7926
  const effectWidth = effectsOutputSize?.width;
7890
7927
  const effectHeight = effectsOutputSize?.height;
@@ -7906,7 +7943,7 @@ var useEffectChainState = (effectsOutputSize = null) => {
7906
7943
  }
7907
7944
  };
7908
7945
  }, []);
7909
- return useMemo21(() => ({
7946
+ return useMemo22(() => ({
7910
7947
  get: (width, height) => {
7911
7948
  width = effectWidth ?? width;
7912
7949
  height = effectHeight ?? height;
@@ -7930,7 +7967,7 @@ import { jsx as jsx19 } from "react/jsx-runtime";
7930
7967
  var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effects, effectsOutputSize, ...props }, ref) => {
7931
7968
  const canvasRef = useRef10(null);
7932
7969
  const chainState = useEffectChainState(effectsOutputSize);
7933
- const sourceCanvas = useMemo22(() => {
7970
+ const sourceCanvas = useMemo23(() => {
7934
7971
  if (typeof document === "undefined") {
7935
7972
  return null;
7936
7973
  }
@@ -8273,6 +8310,7 @@ var AnimatedImageContent = forwardRef4(({
8273
8310
  const resolvedSrc = resolveAnimatedImageSource(src);
8274
8311
  const [decodedImage, setDecodedImage] = useState10(null);
8275
8312
  const imageDecoder = decodedImage?.decoder ?? null;
8313
+ const activeDecoderRef = useRef11(null);
8276
8314
  const { delayRender, continueRender, cancelRender } = useDelayRender();
8277
8315
  const frame = useCurrentFrame();
8278
8316
  const { fps } = useVideoConfig();
@@ -8301,6 +8339,7 @@ var AnimatedImageContent = forwardRef4(({
8301
8339
  const controller = new AbortController;
8302
8340
  let cancelled = false;
8303
8341
  let continued = false;
8342
+ let decoder = null;
8304
8343
  const continueRenderOnce = () => {
8305
8344
  if (continued) {
8306
8345
  return;
@@ -8319,6 +8358,8 @@ var AnimatedImageContent = forwardRef4(({
8319
8358
  d.close();
8320
8359
  return;
8321
8360
  }
8361
+ decoder = d;
8362
+ activeDecoderRef.current = d;
8322
8363
  setDecodedImage({ decoder: d, handle: decodeHandle });
8323
8364
  }).catch((err) => {
8324
8365
  if (cancelled) {
@@ -8337,6 +8378,8 @@ var AnimatedImageContent = forwardRef4(({
8337
8378
  });
8338
8379
  return () => {
8339
8380
  cancelled = true;
8381
+ activeDecoderRef.current = null;
8382
+ decoder?.close();
8340
8383
  controller.abort();
8341
8384
  continueRenderOnce();
8342
8385
  };
@@ -8349,13 +8392,8 @@ var AnimatedImageContent = forwardRef4(({
8349
8392
  delayRender,
8350
8393
  cancelRender
8351
8394
  ]);
8352
- useEffect8(() => {
8353
- return () => {
8354
- imageDecoder?.close();
8355
- };
8356
- }, [imageDecoder]);
8357
8395
  useLayoutEffect9(() => {
8358
- if (!imageDecoder || !decodedImage) {
8396
+ if (!imageDecoder || !decodedImage || activeDecoderRef.current !== imageDecoder) {
8359
8397
  return;
8360
8398
  }
8361
8399
  const delay = delayRender(`Rendering frame at ${currentTime} of <AnimatedImage src="${src}"/>`);
@@ -8641,11 +8679,11 @@ import { useContext as useContext29, useLayoutEffect as useLayoutEffect11, useSt
8641
8679
 
8642
8680
  // src/RenderAssetManager.tsx
8643
8681
  import {
8644
- createContext as createContext28,
8682
+ createContext as createContext29,
8645
8683
  useCallback as useCallback10,
8646
8684
  useImperativeHandle as useImperativeHandle3,
8647
8685
  useLayoutEffect as useLayoutEffect10,
8648
- useMemo as useMemo23,
8686
+ useMemo as useMemo24,
8649
8687
  useRef as useRef12,
8650
8688
  useState as useState11
8651
8689
  } from "react";
@@ -8683,7 +8721,7 @@ var validateRenderAsset = (artifact) => {
8683
8721
 
8684
8722
  // src/RenderAssetManager.tsx
8685
8723
  import { jsx as jsx21 } from "react/jsx-runtime";
8686
- var RenderAssetManager = createContext28({
8724
+ var RenderAssetManager = createContext29({
8687
8725
  registerRenderAsset: () => {
8688
8726
  return;
8689
8727
  },
@@ -8726,7 +8764,7 @@ var RenderAssetManagerProvider = ({ children, collectAssets }) => {
8726
8764
  };
8727
8765
  }
8728
8766
  }, []);
8729
- const contextValue = useMemo23(() => {
8767
+ const contextValue = useMemo24(() => {
8730
8768
  return {
8731
8769
  registerRenderAsset,
8732
8770
  unregisterRenderAsset,
@@ -8841,9 +8879,9 @@ var getMediaTrimAfter = ({
8841
8879
  };
8842
8880
 
8843
8881
  // src/loop/index.tsx
8844
- import React29, { createContext as createContext29, useContext as useContext30, useMemo as useMemo24 } from "react";
8882
+ import React29, { createContext as createContext30, useContext as useContext30, useMemo as useMemo25 } from "react";
8845
8883
  import { jsx as jsx22 } from "react/jsx-runtime";
8846
- var LoopTimelineContext = createContext29(null);
8884
+ var LoopTimelineContext = createContext30(null);
8847
8885
  var useLoop = () => {
8848
8886
  return React29.useContext(LoopContext);
8849
8887
  };
@@ -8887,20 +8925,20 @@ var Loop = ({
8887
8925
  const iteration = Math.max(0, Math.min(actualTimes - 1, isAtBoundary ? nearestIteration : Math.floor(loopsElapsed)));
8888
8926
  const start = isAtBoundary ? currentFrame : iteration * iterationDurationInFrames;
8889
8927
  const from = Math.max(0, Math.min(start, maxFrame));
8890
- const loopDisplay = useMemo24(() => {
8928
+ const loopDisplay = useMemo25(() => {
8891
8929
  return {
8892
8930
  numberOfTimes: Math.min(compDuration / iterationDurationInFrames, times),
8893
8931
  startOffset: -from,
8894
8932
  durationInFrames: iterationDurationInFrames
8895
8933
  };
8896
8934
  }, [compDuration, from, iterationDurationInFrames, times]);
8897
- const loopContext = useMemo24(() => {
8935
+ const loopContext = useMemo25(() => {
8898
8936
  return {
8899
8937
  iteration,
8900
8938
  durationInFrames
8901
8939
  };
8902
8940
  }, [iteration, durationInFrames]);
8903
- const timelineContext = useMemo24(() => ({
8941
+ const timelineContext = useMemo25(() => ({
8904
8942
  startFrame: loopStartFrame,
8905
8943
  firstVisibleFrame,
8906
8944
  endFrame,
@@ -8944,9 +8982,9 @@ var playbackLogging = ({
8944
8982
  };
8945
8983
 
8946
8984
  // src/prefetch-state.tsx
8947
- import { createContext as createContext30, useEffect as useEffect9, useState as useState13 } from "react";
8985
+ import { createContext as createContext31, useEffect as useEffect8, useState as useState13 } from "react";
8948
8986
  import { jsx as jsx23 } from "react/jsx-runtime";
8949
- var PreloadContext = createContext30({});
8987
+ var PreloadContext = createContext31({});
8950
8988
  var preloads = {};
8951
8989
  var updaters = [];
8952
8990
  var setPreloads = (updater) => {
@@ -8955,7 +8993,7 @@ var setPreloads = (updater) => {
8955
8993
  };
8956
8994
  var PrefetchProvider = ({ children }) => {
8957
8995
  const [_preloads, _setPreloads] = useState13(() => preloads);
8958
- useEffect9(() => {
8996
+ useEffect8(() => {
8959
8997
  const updaterFunction = () => {
8960
8998
  _setPreloads(preloads);
8961
8999
  };
@@ -9271,7 +9309,7 @@ var resolveTrimProps = ({
9271
9309
  };
9272
9310
 
9273
9311
  // src/video/duration-state.tsx
9274
- import { createContext as createContext31, useMemo as useMemo25, useReducer } from "react";
9312
+ import { createContext as createContext32, useMemo as useMemo26, useReducer } from "react";
9275
9313
  import { jsx as jsx24 } from "react/jsx-runtime";
9276
9314
  var durationReducer = (state, action) => {
9277
9315
  switch (action.type) {
@@ -9289,7 +9327,7 @@ var durationReducer = (state, action) => {
9289
9327
  return state;
9290
9328
  }
9291
9329
  };
9292
- var DurationsContext = createContext31({
9330
+ var DurationsContext = createContext32({
9293
9331
  durations: {},
9294
9332
  setDurations: () => {
9295
9333
  throw new Error("context missing");
@@ -9297,7 +9335,7 @@ var DurationsContext = createContext31({
9297
9335
  });
9298
9336
  var DurationsContextProvider = ({ children }) => {
9299
9337
  const [durations, setDurations] = useReducer(durationReducer, {});
9300
- const value = useMemo25(() => {
9338
+ const value = useMemo26(() => {
9301
9339
  return {
9302
9340
  durations,
9303
9341
  setDurations
@@ -9314,9 +9352,9 @@ import { useCallback as useCallback16 } from "react";
9314
9352
  import React35, {
9315
9353
  forwardRef as forwardRef5,
9316
9354
  useContext as useContext41,
9317
- useEffect as useEffect16,
9355
+ useEffect as useEffect15,
9318
9356
  useImperativeHandle as useImperativeHandle4,
9319
- useMemo as useMemo33,
9357
+ useMemo as useMemo34,
9320
9358
  useRef as useRef21,
9321
9359
  useState as useState17
9322
9360
  } from "react";
@@ -9378,12 +9416,12 @@ import { useContext as useContext33, useLayoutEffect as useLayoutEffect12, useRe
9378
9416
 
9379
9417
  // src/audio/shared-audio-tags.tsx
9380
9418
  import React32, {
9381
- createContext as createContext32,
9419
+ createContext as createContext33,
9382
9420
  createRef as createRef2,
9383
9421
  useCallback as useCallback11,
9384
9422
  useContext as useContext32,
9385
- useEffect as useEffect10,
9386
- useMemo as useMemo27,
9423
+ useEffect as useEffect9,
9424
+ useMemo as useMemo28,
9387
9425
  useRef as useRef14,
9388
9426
  useState as useState14
9389
9427
  } from "react";
@@ -9488,7 +9526,7 @@ var makeSharedElementSourceNode = ({
9488
9526
  };
9489
9527
 
9490
9528
  // src/audio/use-audio-context.ts
9491
- import { useMemo as useMemo26, useRef as useRef13 } from "react";
9529
+ import { useMemo as useMemo27, useRef as useRef13 } from "react";
9492
9530
  var warned = false;
9493
9531
  var warnOnce = (logLevel) => {
9494
9532
  if (warned) {
@@ -9510,7 +9548,7 @@ var useSingletonAudioContext = ({
9510
9548
  if (sampleRate !== initialSampleRate.current) {
9511
9549
  throw new Error(`Changing the AudioContext sample rate dynamically is not supported. The sample rate was initialized with ${initialSampleRate.current} Hz, but ${sampleRate} Hz was passed later.`);
9512
9550
  }
9513
- const context = useMemo26(() => {
9551
+ const context = useMemo27(() => {
9514
9552
  if (env.isRendering) {
9515
9553
  return null;
9516
9554
  }
@@ -9674,8 +9712,8 @@ var didPropChange = (key, newProp, prevProp) => {
9674
9712
  }
9675
9713
  return true;
9676
9714
  };
9677
- var SharedAudioContext = createContext32(null);
9678
- var SharedAudioTagsContext = createContext32(null);
9715
+ var SharedAudioContext = createContext33(null);
9716
+ var SharedAudioTagsContext = createContext33(null);
9679
9717
  var shouldSaveForLater = (state) => {
9680
9718
  if (state === "suspended" || state === "running-to-suspended" || state === "interrupted") {
9681
9719
  return true;
@@ -9708,9 +9746,9 @@ var SharedAudioContextProvider = ({
9708
9746
  const isResuming = useRef14(null);
9709
9747
  const nextResumeAttemptId = useRef14(0);
9710
9748
  const nextResumeIsAutoPlayAttempt = useRef14(false);
9711
- const audioSyncAnchor = useMemo27(() => ({ value: 0 }), []);
9749
+ const audioSyncAnchor = useMemo28(() => ({ value: 0 }), []);
9712
9750
  const audioSyncAnchorListeners = useRef14([]);
9713
- const audioSyncAnchorEmitter = useMemo27(() => {
9751
+ const audioSyncAnchorEmitter = useMemo28(() => {
9714
9752
  return {
9715
9753
  dispatch: (event) => {
9716
9754
  audioSyncAnchorListeners.current.forEach((l) => l(event));
@@ -9730,7 +9768,7 @@ var SharedAudioContextProvider = ({
9730
9768
  const unscheduleAudioNode = useCallback11((node) => {
9731
9769
  return nodesToResume.current.delete(node);
9732
9770
  }, []);
9733
- const scheduleAudioNode = useMemo27(() => {
9771
+ const scheduleAudioNode = useMemo28(() => {
9734
9772
  return ({
9735
9773
  node,
9736
9774
  mediaTimestamp,
@@ -9847,7 +9885,7 @@ var SharedAudioContextProvider = ({
9847
9885
  }
9848
9886
  return ctxAndGain.suspend();
9849
9887
  }, [ctxAndGain, _experimentalKeepAudioContextAlive]);
9850
- useEffect10(() => {
9888
+ useEffect9(() => {
9851
9889
  if (!_experimentalKeepAudioContextAlive) {
9852
9890
  return;
9853
9891
  }
@@ -9875,7 +9913,7 @@ var SharedAudioContextProvider = ({
9875
9913
  ctxAndGain.suspend().catch(() => {});
9876
9914
  };
9877
9915
  }, [ctxAndGain, _experimentalKeepAudioContextAlive]);
9878
- const audioContextValue = useMemo27(() => {
9916
+ const audioContextValue = useMemo28(() => {
9879
9917
  return {
9880
9918
  sampleRate,
9881
9919
  audioContext: ctxAndGain?.audioContext ?? null,
@@ -10063,7 +10101,7 @@ var SharedAudioTagsContextProvider = ({ children, numberOfAudioTags }) => {
10063
10101
  });
10064
10102
  resume?.();
10065
10103
  }, [logLevel, mountTime, refs, env.isPlayer, resume]);
10066
- const audioTagsValue = useMemo27(() => {
10104
+ const audioTagsValue = useMemo28(() => {
10067
10105
  return {
10068
10106
  registerAudio,
10069
10107
  unregisterAudio,
@@ -10078,7 +10116,7 @@ var SharedAudioTagsContextProvider = ({ children, numberOfAudioTags }) => {
10078
10116
  unregisterAudio,
10079
10117
  updateAudio
10080
10118
  ]);
10081
- const sharedAudioTagElements = useMemo27(() => {
10119
+ const sharedAudioTagElements = useMemo28(() => {
10082
10120
  return refs.map(({ id, ref }) => {
10083
10121
  return /* @__PURE__ */ jsx25("audio", {
10084
10122
  ref,
@@ -10357,11 +10395,11 @@ var useVolume = ({
10357
10395
  };
10358
10396
 
10359
10397
  // src/use-media-in-timeline.ts
10360
- import { useCallback as useCallback12, useContext as useContext35, useMemo as useMemo28 } from "react";
10398
+ import { useCallback as useCallback12, useContext as useContext35, useMemo as useMemo29 } from "react";
10361
10399
 
10362
10400
  // src/audio/use-audio-frame.ts
10363
- import { createContext as createContext33, useContext as useContext34 } from "react";
10364
- var Html5MediaTrimContext = createContext33(0);
10401
+ import { createContext as createContext34, useContext as useContext34 } from "react";
10402
+ var Html5MediaTrimContext = createContext34(0);
10365
10403
  var useMediaStartsAt = () => {
10366
10404
  const parentSequence = useContext34(SequenceContext);
10367
10405
  return parentSequence?.cumulatedNegativeFrom ?? 0;
@@ -10447,7 +10485,7 @@ var useBasicMediaInTimeline = ({
10447
10485
  loop
10448
10486
  });
10449
10487
  const startMediaFrom = 0 - mediaStartsAt + (trimBefore ?? 0);
10450
- const memoizedResult = useMemo28(() => {
10488
+ const memoizedResult = useMemo29(() => {
10451
10489
  return {
10452
10490
  duration,
10453
10491
  finalDisplayName: displayName ?? getAssetDisplayName(src),
@@ -10483,7 +10521,7 @@ var useMediaInTimelineRegistration = ({
10483
10521
  const { isStudio } = useRemotionEnvironment();
10484
10522
  const stack = getStack();
10485
10523
  const getStackForRegistration = useCallback12(() => stack, [stack]);
10486
- const automaticOutlineRef = useMemo28(() => mediaType === "video" && (isStudio || canvasOutlinesEnabled) ? SequenceOutlineInternals.createRef() : null, [canvasOutlinesEnabled, isStudio, mediaType]);
10524
+ const automaticOutlineRef = useMemo29(() => mediaType === "video" && (isStudio || canvasOutlinesEnabled) ? SequenceOutlineInternals.createRef() : null, [canvasOutlinesEnabled, isStudio, mediaType]);
10487
10525
  const { duration, finalDisplayName } = useBasicMediaInTimeline({
10488
10526
  src,
10489
10527
  displayName,
@@ -10565,24 +10603,24 @@ var useMediaInTimelineRegistration = ({
10565
10603
  import {
10566
10604
  useCallback as useCallback15,
10567
10605
  useContext as useContext38,
10568
- useEffect as useEffect14,
10606
+ useEffect as useEffect13,
10569
10607
  useLayoutEffect as useLayoutEffect14,
10570
10608
  useRef as useRef19
10571
10609
  } from "react";
10572
10610
 
10573
10611
  // src/buffer-until-first-frame.ts
10574
- import { useCallback as useCallback14, useMemo as useMemo31, useRef as useRef17 } from "react";
10612
+ import { useCallback as useCallback14, useMemo as useMemo32, useRef as useRef17 } from "react";
10575
10613
 
10576
10614
  // src/use-buffer-state.ts
10577
- import { useContext as useContext37, useMemo as useMemo30 } from "react";
10615
+ import { useContext as useContext37, useMemo as useMemo31 } from "react";
10578
10616
 
10579
10617
  // src/buffering.tsx
10580
10618
  import React33, {
10581
10619
  useCallback as useCallback13,
10582
10620
  useContext as useContext36,
10583
- useEffect as useEffect11,
10621
+ useEffect as useEffect10,
10584
10622
  useLayoutEffect as useLayoutEffect13,
10585
- useMemo as useMemo29,
10623
+ useMemo as useMemo30,
10586
10624
  useState as useState15
10587
10625
  } from "react";
10588
10626
  import { jsx as jsx26 } from "react/jsx-runtime";
@@ -10610,7 +10648,7 @@ var useBufferManager = (logLevel, mountTime, setBuffering, isBuffering) => {
10610
10648
  }
10611
10649
  };
10612
10650
  }, [rendering]);
10613
- useEffect11(() => {
10651
+ useEffect10(() => {
10614
10652
  if (rendering) {
10615
10653
  return;
10616
10654
  }
@@ -10640,7 +10678,7 @@ var useBufferManager = (logLevel, mountTime, setBuffering, isBuffering) => {
10640
10678
  }
10641
10679
  }, [blockCount]);
10642
10680
  }
10643
- return useMemo29(() => ({ addBlock }), [addBlock]);
10681
+ return useMemo30(() => ({ addBlock }), [addBlock]);
10644
10682
  };
10645
10683
  var BufferingContextReact = React33.createContext(null);
10646
10684
  var BufferingProvider = ({ children }) => {
@@ -10658,7 +10696,7 @@ var useBufferState = () => {
10658
10696
  const buffer = useContext37(BufferingContextReact);
10659
10697
  const logLevel = useLogLevel();
10660
10698
  const addBlock = buffer ? buffer.addBlock : null;
10661
- return useMemo30(() => ({
10699
+ return useMemo31(() => ({
10662
10700
  delayPlayback: () => {
10663
10701
  if (!addBlock) {
10664
10702
  throw new Error("Tried to enable the buffering state, but a Remotion context was not found. This API can only be called in a component that was passed to the Remotion Player or a <Composition>. Or you might have experienced a version mismatch - run `npx remotion versions` and ensure all packages have the same version. This error is thrown by the buffer state https://remotion.dev/docs/player/buffer-state");
@@ -10766,7 +10804,7 @@ var useBufferUntilFirstFrame = ({
10766
10804
  onVariableFpsVideoDetected,
10767
10805
  pauseWhenBuffering
10768
10806
  ]);
10769
- return useMemo31(() => {
10807
+ return useMemo32(() => {
10770
10808
  return {
10771
10809
  isBuffering: () => bufferingRef.current,
10772
10810
  bufferUntilFirstFrame
@@ -10879,7 +10917,7 @@ var seek = ({
10879
10917
  };
10880
10918
 
10881
10919
  // src/use-media-buffering.ts
10882
- import { useEffect as useEffect12, useState as useState16 } from "react";
10920
+ import { useEffect as useEffect11, useState as useState16 } from "react";
10883
10921
  var useMediaBuffering = ({
10884
10922
  element,
10885
10923
  shouldBuffer,
@@ -10891,7 +10929,7 @@ var useMediaBuffering = ({
10891
10929
  }) => {
10892
10930
  const buffer = useBufferState();
10893
10931
  const [isBuffering, setIsBuffering] = useState16(false);
10894
- useEffect12(() => {
10932
+ useEffect11(() => {
10895
10933
  let cleanupFns = [];
10896
10934
  const { current } = element;
10897
10935
  if (!current) {
@@ -11019,7 +11057,7 @@ var useMediaBuffering = ({
11019
11057
  };
11020
11058
 
11021
11059
  // src/use-request-video-callback-time.ts
11022
- import { useEffect as useEffect13, useRef as useRef18 } from "react";
11060
+ import { useEffect as useEffect12, useRef as useRef18 } from "react";
11023
11061
  var useRequestVideoCallbackTime = ({
11024
11062
  mediaRef,
11025
11063
  mediaType,
@@ -11027,7 +11065,7 @@ var useRequestVideoCallbackTime = ({
11027
11065
  onVariableFpsVideoDetected
11028
11066
  }) => {
11029
11067
  const currentTime = useRef18(null);
11030
- useEffect13(() => {
11068
+ useEffect12(() => {
11031
11069
  const { current } = mediaRef;
11032
11070
  if (current) {
11033
11071
  currentTime.current = {
@@ -11245,7 +11283,7 @@ var useMediaPlayback = ({
11245
11283
  mediaRef.current.preservesPitch = preservePitch;
11246
11284
  }
11247
11285
  }, [mediaRef, playbackRate, preservePitch]);
11248
- useEffect14(() => {
11286
+ useEffect13(() => {
11249
11287
  const tagName = mediaType === "audio" ? "<Html5Audio>" : "<Html5Video>";
11250
11288
  if (!mediaRef.current) {
11251
11289
  throw new Error(`No ${mediaType} ref found`);
@@ -11388,7 +11426,7 @@ var useMediaPlayback = ({
11388
11426
  };
11389
11427
 
11390
11428
  // src/use-media-tag.ts
11391
- import { useContext as useContext39, useEffect as useEffect15, useRef as useRef20 } from "react";
11429
+ import { useContext as useContext39, useEffect as useEffect14, useRef as useRef20 } from "react";
11392
11430
  var useMediaTag = ({
11393
11431
  mediaRef,
11394
11432
  id,
@@ -11404,7 +11442,7 @@ var useMediaTag = ({
11404
11442
  const logLevel = useLogLevel();
11405
11443
  const mountTime = useMountTime();
11406
11444
  const env = useRemotionEnvironment();
11407
- useEffect15(() => {
11445
+ useEffect14(() => {
11408
11446
  const tag = {
11409
11447
  id,
11410
11448
  play: (reason) => {
@@ -11462,12 +11500,12 @@ var useMediaTag = ({
11462
11500
  };
11463
11501
 
11464
11502
  // src/volume-position-state.ts
11465
- import { createContext as createContext34, useContext as useContext40, useMemo as useMemo32 } from "react";
11466
- var MediaVolumeContext = createContext34({
11503
+ import { createContext as createContext35, useContext as useContext40, useMemo as useMemo33 } from "react";
11504
+ var MediaVolumeContext = createContext35({
11467
11505
  playerMuted: false,
11468
11506
  mediaVolume: 1
11469
11507
  });
11470
- var SetMediaVolumeContext = createContext34({
11508
+ var SetMediaVolumeContext = createContext35({
11471
11509
  setPlayerMuted: () => {
11472
11510
  throw new Error("default");
11473
11511
  },
@@ -11478,14 +11516,14 @@ var SetMediaVolumeContext = createContext34({
11478
11516
  var useMediaVolumeState = () => {
11479
11517
  const { mediaVolume } = useContext40(MediaVolumeContext);
11480
11518
  const { setMediaVolume } = useContext40(SetMediaVolumeContext);
11481
- return useMemo32(() => {
11519
+ return useMemo33(() => {
11482
11520
  return [mediaVolume, setMediaVolume];
11483
11521
  }, [mediaVolume, setMediaVolume]);
11484
11522
  };
11485
11523
  var usePlayerMutedState = () => {
11486
11524
  const { playerMuted } = useContext40(MediaVolumeContext);
11487
11525
  const { setPlayerMuted } = useContext40(SetMediaVolumeContext);
11488
- return useMemo32(() => {
11526
+ return useMemo33(() => {
11489
11527
  return [playerMuted, setPlayerMuted];
11490
11528
  }, [playerMuted, setPlayerMuted]);
11491
11529
  };
@@ -11607,7 +11645,7 @@ var AudioForDevelopmentForwardRefFunction = (props, ref) => {
11607
11645
  requestsVideoFrame: false,
11608
11646
  isClientSideRendering: false
11609
11647
  });
11610
- const propsToPass = useMemo33(() => {
11648
+ const propsToPass = useMemo34(() => {
11611
11649
  return {
11612
11650
  muted: isMutedForPlayback,
11613
11651
  src: preloadedSrc,
@@ -11622,7 +11660,7 @@ var AudioForDevelopmentForwardRefFunction = (props, ref) => {
11622
11660
  preloadedSrc,
11623
11661
  crossOriginValue
11624
11662
  ]);
11625
- const id = useMemo33(() => `audio-${random(src ?? "")}-${sequenceContext?.relativeFrom}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.durationInFrames}-muted:${props.muted}-loop:${props.loop}`, [
11663
+ const id = useMemo34(() => `audio-${random(src ?? "")}-${sequenceContext?.relativeFrom}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.durationInFrames}-muted:${props.muted}-loop:${props.loop}`, [
11626
11664
  src,
11627
11665
  sequenceContext?.relativeFrom,
11628
11666
  sequenceContext?.cumulatedFrom,
@@ -11681,7 +11719,7 @@ var AudioForDevelopmentForwardRefFunction = (props, ref) => {
11681
11719
  }, [audioRef]);
11682
11720
  const currentOnDurationCallback = useRef21(onDuration);
11683
11721
  currentOnDurationCallback.current = onDuration;
11684
- useEffect16(() => {
11722
+ useEffect15(() => {
11685
11723
  const { current } = audioRef;
11686
11724
  if (!current) {
11687
11725
  return;
@@ -11753,7 +11791,7 @@ var AudioForPreviewRefForwardingFunction = (props, ref) => {
11753
11791
  documentationLink: "https://www.remotion.dev/docs/html5-audio",
11754
11792
  muted: isMutedForTimeline
11755
11793
  });
11756
- const metadata = useMemo33(() => isStudio || registration !== null ? {
11794
+ const metadata = useMemo34(() => isStudio || registration !== null ? {
11757
11795
  type: "sequence",
11758
11796
  id: timelineId,
11759
11797
  value: registration,
@@ -11779,17 +11817,17 @@ var AudioForPreview = forwardRef5(AudioForPreviewRefForwardingFunction);
11779
11817
  import {
11780
11818
  forwardRef as forwardRef6,
11781
11819
  useContext as useContext43,
11782
- useEffect as useEffect17,
11820
+ useEffect as useEffect16,
11783
11821
  useImperativeHandle as useImperativeHandle5,
11784
11822
  useLayoutEffect as useLayoutEffect15,
11785
- useMemo as useMemo35,
11823
+ useMemo as useMemo36,
11786
11824
  useRef as useRef22
11787
11825
  } from "react";
11788
11826
 
11789
11827
  // src/use-media-enabled.tsx
11790
- import { createContext as createContext35, useContext as useContext42, useMemo as useMemo34 } from "react";
11828
+ import { createContext as createContext36, useContext as useContext42, useMemo as useMemo35 } from "react";
11791
11829
  import { jsx as jsx28 } from "react/jsx-runtime";
11792
- var MediaEnabledContext = createContext35(null);
11830
+ var MediaEnabledContext = createContext36(null);
11793
11831
  var useVideoEnabled = () => {
11794
11832
  const context = useContext42(MediaEnabledContext);
11795
11833
  if (!context) {
@@ -11815,7 +11853,7 @@ var MediaEnabledProvider = ({
11815
11853
  videoEnabled,
11816
11854
  audioEnabled
11817
11855
  }) => {
11818
- const value = useMemo34(() => ({ videoEnabled, audioEnabled }), [videoEnabled, audioEnabled]);
11856
+ const value = useMemo35(() => ({ videoEnabled, audioEnabled }), [videoEnabled, audioEnabled]);
11819
11857
  return /* @__PURE__ */ jsx28(MediaEnabledContext.Provider, {
11820
11858
  value,
11821
11859
  children
@@ -11853,7 +11891,7 @@ var AudioForRenderingRefForwardingFunction = (props, ref) => {
11853
11891
  const audioStartFrame = useContext43(Html5MediaTrimContext);
11854
11892
  const { registerRenderAsset, unregisterRenderAsset } = useContext43(RenderAssetManager);
11855
11893
  const { delayRender, continueRender } = useDelayRender();
11856
- const id = useMemo35(() => `audio-${random(props.src ?? "")}-${sequenceContext?.relativeFrom}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.durationInFrames}`, [
11894
+ const id = useMemo36(() => `audio-${random(props.src ?? "")}-${sequenceContext?.relativeFrom}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.durationInFrames}`, [
11857
11895
  props.src,
11858
11896
  sequenceContext?.relativeFrom,
11859
11897
  sequenceContext?.cumulatedFrom,
@@ -11874,7 +11912,7 @@ var AudioForRenderingRefForwardingFunction = (props, ref) => {
11874
11912
  useImperativeHandle5(ref, () => {
11875
11913
  return audioRef.current;
11876
11914
  }, []);
11877
- useEffect17(() => {
11915
+ useEffect16(() => {
11878
11916
  if (!props.src) {
11879
11917
  throw new Error("No src passed");
11880
11918
  }
@@ -12107,9 +12145,9 @@ var Audio = Html5Audio;
12107
12145
  import {
12108
12146
  forwardRef as forwardRef8,
12109
12147
  useCallback as useCallback18,
12110
- useEffect as useEffect18,
12148
+ useEffect as useEffect17,
12111
12149
  useImperativeHandle as useImperativeHandle6,
12112
- useMemo as useMemo36,
12150
+ useMemo as useMemo37,
12113
12151
  useRef as useRef23,
12114
12152
  useState as useState18
12115
12153
  } from "react";
@@ -12185,7 +12223,7 @@ var SolidInner = ({
12185
12223
  overrideId: overrideId ?? null,
12186
12224
  videoConfigValues
12187
12225
  });
12188
- const sourceCanvas = useMemo36(() => {
12226
+ const sourceCanvas = useMemo37(() => {
12189
12227
  if (typeof document === "undefined") {
12190
12228
  return null;
12191
12229
  }
@@ -12203,7 +12241,7 @@ var SolidInner = ({
12203
12241
  reference.current = canvas;
12204
12242
  }
12205
12243
  }, [reference]);
12206
- useEffect18(() => {
12244
+ useEffect17(() => {
12207
12245
  if (!outputCanvas || !sourceCanvas) {
12208
12246
  return;
12209
12247
  }
@@ -12253,7 +12291,7 @@ var SolidInner = ({
12253
12291
  cancelRender,
12254
12292
  memoizedEffects
12255
12293
  ]);
12256
- const canvasStyle = useMemo36(() => {
12294
+ const canvasStyle = useMemo37(() => {
12257
12295
  return {
12258
12296
  width,
12259
12297
  height,
@@ -12384,12 +12422,12 @@ Solid.displayName = "Solid";
12384
12422
  addSequenceStackTraces(Solid);
12385
12423
  // src/HtmlInCanvas.tsx
12386
12424
  import {
12387
- createContext as createContext36,
12425
+ createContext as createContext37,
12388
12426
  forwardRef as forwardRef9,
12389
12427
  useCallback as useCallback19,
12390
12428
  useContext as useContext45,
12391
12429
  useLayoutEffect as useLayoutEffect16,
12392
- useMemo as useMemo37,
12430
+ useMemo as useMemo38,
12393
12431
  useRef as useRef24
12394
12432
  } from "react";
12395
12433
  import { jsx as jsx32, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -12499,7 +12537,7 @@ var defaultOnPaint = ({
12499
12537
  ctx.reset();
12500
12538
  ctx.drawElementImage(elementImage, 0, 0);
12501
12539
  };
12502
- var HtmlInCanvasAncestorContext = createContext36(null);
12540
+ var HtmlInCanvasAncestorContext = createContext37(null);
12503
12541
  var HtmlInCanvasContent = forwardRef9(({
12504
12542
  width,
12505
12543
  height,
@@ -12526,7 +12564,7 @@ var HtmlInCanvasContent = forwardRef9(({
12526
12564
  const { isClientSideRendering, isRendering } = useRemotionEnvironment();
12527
12565
  const canRetryMissingPaintRecord = !isRendering || isClientSideRendering;
12528
12566
  const usesDirectLayoutCanvas = onPaint === undefined && onInit === undefined;
12529
- const paintTargetMode = usesDirectLayoutCanvas ? "direct" : isRendering ? "copied" : "transferred";
12567
+ const paintTargetMode = ancestorPaintState ? "copied" : usesDirectLayoutCanvas ? "direct" : isRendering ? "copied" : "transferred";
12530
12568
  if (!isHtmlInCanvasSupported()) {
12531
12569
  cancelRender(new Error(getHtmlInCanvasUnsupportedMessage()));
12532
12570
  }
@@ -12535,7 +12573,7 @@ var HtmlInCanvasContent = forwardRef9(({
12535
12573
  const paintTargetRef = useRef24(null);
12536
12574
  const divRef = useRef24(null);
12537
12575
  const canvasSizeKey = `${width}x${height}@${resolvedPixelDensity}-${paintTargetMode}`;
12538
- const paintState = useMemo37(() => {
12576
+ const paintState = useMemo38(() => {
12539
12577
  const state = {
12540
12578
  pendingChildren: 0,
12541
12579
  generation: 0,
@@ -12593,6 +12631,7 @@ var HtmlInCanvasContent = forwardRef9(({
12593
12631
  const initializedRef = useRef24(false);
12594
12632
  const onInitCleanupRef = useRef24(null);
12595
12633
  const unmountedRef = useRef24(false);
12634
+ const effectScratchCanvasesRef = useRef24(null);
12596
12635
  const paintingTargets = useRef24(new WeakMap);
12597
12636
  const onPaintCb = useCallback19(async () => {
12598
12637
  if (isRendering && paintState.pendingChildren > 0) {
@@ -12688,6 +12727,7 @@ var HtmlInCanvasContent = forwardRef9(({
12688
12727
  }
12689
12728
  throw error;
12690
12729
  }
12730
+ let effectSourceCanvas = null;
12691
12731
  try {
12692
12732
  const currentOnPaint = onPaintRef.current;
12693
12733
  if (currentOnPaint) {
@@ -12703,6 +12743,41 @@ var HtmlInCanvasContent = forwardRef9(({
12703
12743
  if (paintResult) {
12704
12744
  await paintResult;
12705
12745
  }
12746
+ } else if (paintTarget instanceof HTMLCanvasElement && effectsRef.current.some((effect) => !effect.params.disabled)) {
12747
+ effectScratchCanvasesRef.current ??= {
12748
+ source: document.createElement("canvas"),
12749
+ previousOutput: document.createElement("canvas")
12750
+ };
12751
+ const { source: effectSource, previousOutput } = effectScratchCanvasesRef.current;
12752
+ resizePaintTarget({
12753
+ target: effectSource,
12754
+ width: canvasWidth,
12755
+ height: canvasHeight
12756
+ });
12757
+ resizePaintTarget({
12758
+ target: previousOutput,
12759
+ width: canvasWidth,
12760
+ height: canvasHeight
12761
+ });
12762
+ const effectSourceCtx = effectSource.getContext("2d");
12763
+ const previousOutputCtx = previousOutput.getContext("2d");
12764
+ const paintTargetCtx = paintTarget.getContext("2d");
12765
+ if (!effectSourceCtx || !previousOutputCtx || !paintTargetCtx) {
12766
+ throw new Error("Failed to acquire 2D context for <HtmlInCanvas> canvas");
12767
+ }
12768
+ previousOutputCtx.reset();
12769
+ previousOutputCtx.drawImage(paintTarget, 0, 0);
12770
+ defaultOnPaint({
12771
+ canvas: paintTarget,
12772
+ element,
12773
+ elementImage: elImage,
12774
+ pixelDensity: resolvedPixelDensity
12775
+ });
12776
+ effectSourceCtx.reset();
12777
+ effectSourceCtx.drawImage(paintTarget, 0, 0);
12778
+ paintTargetCtx.reset();
12779
+ paintTargetCtx.drawImage(previousOutput, 0, 0);
12780
+ effectSourceCanvas = effectSource;
12706
12781
  } else {
12707
12782
  defaultOnPaint({
12708
12783
  canvas: paintTarget,
@@ -12715,7 +12790,7 @@ var HtmlInCanvasContent = forwardRef9(({
12715
12790
  if (state) {
12716
12791
  await runEffectChain({
12717
12792
  state,
12718
- source: paintTarget,
12793
+ source: effectSourceCanvas ?? paintTarget,
12719
12794
  effects: effectsRef.current,
12720
12795
  output: paintTarget,
12721
12796
  width: canvasWidth,
@@ -12835,13 +12910,13 @@ var HtmlInCanvasContent = forwardRef9(({
12835
12910
  isRendering,
12836
12911
  ancestorPaintState
12837
12912
  ]);
12838
- const innerStyle = useMemo37(() => {
12913
+ const innerStyle = useMemo38(() => {
12839
12914
  return {
12840
12915
  width,
12841
12916
  height
12842
12917
  };
12843
12918
  }, [width, height]);
12844
- const canvasStyle = useMemo37(() => {
12919
+ const canvasStyle = useMemo38(() => {
12845
12920
  return {
12846
12921
  width,
12847
12922
  height,
@@ -12851,7 +12926,7 @@ var HtmlInCanvasContent = forwardRef9(({
12851
12926
  return /* @__PURE__ */ jsxs3(HtmlInCanvasAncestorContext.Provider, {
12852
12927
  value: paintState,
12853
12928
  children: [
12854
- /* @__PURE__ */ jsxs3("canvas", {
12929
+ /* @__PURE__ */ jsx32("canvas", {
12855
12930
  ref: paintTargetMode === "copied" ? canvas2dRef : setVisibleCanvasRef,
12856
12931
  width: canvasWidth,
12857
12932
  height: canvasHeight,
@@ -12861,14 +12936,17 @@ var HtmlInCanvasContent = forwardRef9(({
12861
12936
  visibility: "hidden",
12862
12937
  pointerEvents: "none"
12863
12938
  } : canvasStyle,
12864
- children: [
12865
- /* @__PURE__ */ jsx32("div", {
12866
- ref: divRef,
12867
- style: paintTargetMode === "copied" ? { ...innerStyle, visibility: "visible" } : innerStyle,
12868
- children
12869
- }),
12870
- canvasSiblings
12871
- ]
12939
+ children: /* @__PURE__ */ jsxs3(DefaultPremountContext.Provider, {
12940
+ value: 0,
12941
+ children: [
12942
+ /* @__PURE__ */ jsx32("div", {
12943
+ ref: divRef,
12944
+ style: paintTargetMode === "copied" ? { ...innerStyle, visibility: "visible" } : innerStyle,
12945
+ children
12946
+ }),
12947
+ canvasSiblings
12948
+ ]
12949
+ })
12872
12950
  }, canvasSizeKey),
12873
12951
  paintTargetMode === "copied" ? /* @__PURE__ */ jsx32("canvas", {
12874
12952
  ref: setVisibleCanvasRef,
@@ -13028,7 +13106,7 @@ import {
13028
13106
  useContext as useContext46,
13029
13107
  useImperativeHandle as useImperativeHandle7,
13030
13108
  useLayoutEffect as useLayoutEffect17,
13031
- useMemo as useMemo38,
13109
+ useMemo as useMemo39,
13032
13110
  useRef as useRef25,
13033
13111
  useState as useState19
13034
13112
  } from "react";
@@ -13190,7 +13268,7 @@ var CanvasImageContent = forwardRef10(({
13190
13268
  continueRender(pending.handle);
13191
13269
  pendingLoadDelayRef.current = null;
13192
13270
  }, [continueRender]);
13193
- const sourceCanvas = useMemo38(() => {
13271
+ const sourceCanvas = useMemo39(() => {
13194
13272
  if (typeof document === "undefined") {
13195
13273
  return null;
13196
13274
  }
@@ -13417,7 +13495,7 @@ var CanvasImageInner = forwardRef10(({
13417
13495
  if (!src) {
13418
13496
  throw new Error('No "src" prop was passed to <CanvasImage>.');
13419
13497
  }
13420
- const isMedia = useMemo38(() => ({
13498
+ const isMedia = useMemo39(() => ({
13421
13499
  type: "image",
13422
13500
  src
13423
13501
  }), [src]);
@@ -13613,7 +13691,7 @@ import {
13613
13691
  useCallback as useCallback22,
13614
13692
  useContext as useContext47,
13615
13693
  useLayoutEffect as useLayoutEffect19,
13616
- useMemo as useMemo39,
13694
+ useMemo as useMemo40,
13617
13695
  useRef as useRef27,
13618
13696
  useState as useState20
13619
13697
  } from "react";
@@ -13804,7 +13882,7 @@ var NativeImgInner = ({
13804
13882
  if (!src) {
13805
13883
  throw new Error('No "src" prop was passed to <Img>.');
13806
13884
  }
13807
- const isMedia = useMemo39(() => ({
13885
+ const isMedia = useMemo40(() => ({
13808
13886
  type: "image",
13809
13887
  src
13810
13888
  }), [src]);
@@ -14439,7 +14517,7 @@ var compositionsRef = React43.createRef();
14439
14517
  import {
14440
14518
  useCallback as useCallback25,
14441
14519
  useImperativeHandle as useImperativeHandle9,
14442
- useMemo as useMemo41,
14520
+ useMemo as useMemo42,
14443
14521
  useRef as useRef29,
14444
14522
  useState as useState22
14445
14523
  } from "react";
@@ -14448,15 +14526,15 @@ import {
14448
14526
  import {
14449
14527
  forwardRef as forwardRef13,
14450
14528
  useCallback as useCallback24,
14451
- useEffect as useEffect19,
14529
+ useEffect as useEffect18,
14452
14530
  useImperativeHandle as useImperativeHandle8,
14453
14531
  useLayoutEffect as useLayoutEffect20,
14454
- useMemo as useMemo40,
14532
+ useMemo as useMemo41,
14455
14533
  useRef as useRef28,
14456
14534
  useState as useState21
14457
14535
  } from "react";
14458
14536
  import { jsx as jsx37 } from "react/jsx-runtime";
14459
- var useIsomorphicLayoutEffect6 = typeof window === "undefined" ? useEffect19 : useLayoutEffect20;
14537
+ var useIsomorphicLayoutEffect6 = typeof window === "undefined" ? useEffect18 : useLayoutEffect20;
14460
14538
  var CompositionRegistryFallbackProvider = withCommittedMetadata(CompositionRegistryFallbackContext.Provider);
14461
14539
  var CompositionRegistryProvider = forwardRef13(({ children, onSnapshot }, flushSnapshotRef) => {
14462
14540
  const { isStudio } = useRemotionEnvironment();
@@ -14498,7 +14576,7 @@ var CompositionRegistryProvider = forwardRef13(({ children, onSnapshot }, flushS
14498
14576
  observedCommitRef.current = true;
14499
14577
  queueSnapshot(snapshot);
14500
14578
  }, [queueSnapshot]);
14501
- const fallbackRegistry = useMemo40(() => {
14579
+ const fallbackRegistry = useMemo41(() => {
14502
14580
  const entries = new Map;
14503
14581
  const getSnapshot = () => {
14504
14582
  const compositions = [];
@@ -14569,7 +14647,7 @@ var CompositionRegistryProvider = forwardRef13(({ children, onSnapshot }, flushS
14569
14647
  }
14570
14648
  };
14571
14649
  }, [isStudio, useCommitObserver]);
14572
- const metadata = useMemo40(() => isStudio ? {
14650
+ const metadata = useMemo41(() => isStudio ? {
14573
14651
  type: "composition-manager",
14574
14652
  id: managerId,
14575
14653
  onCommit: useCommitObserver ? onObservedSnapshot : null
@@ -14656,12 +14734,12 @@ var CompositionManagerProvider = ({
14656
14734
  }
14657
14735
  };
14658
14736
  }, [registry]);
14659
- const compositionManagerSetters = useMemo41(() => ({
14737
+ const compositionManagerSetters = useMemo42(() => ({
14660
14738
  setCanvasContent,
14661
14739
  setCurrentAssetMetadata,
14662
14740
  onlyRenderComposition
14663
14741
  }), [onlyRenderComposition]);
14664
- const compositionManagerContextValue = useMemo41(() => {
14742
+ const compositionManagerContextValue = useMemo42(() => {
14665
14743
  return {
14666
14744
  compositions,
14667
14745
  folders,
@@ -14676,6 +14754,8 @@ var CompositionManagerProvider = ({
14676
14754
  currentAssetMetadata,
14677
14755
  canvasContent
14678
14756
  ]);
14757
+ const compositionManagerRef = useRef29(compositionManagerContextValue);
14758
+ compositionManagerRef.current = compositionManagerContextValue;
14679
14759
  if (registrationError !== null) {
14680
14760
  throw registrationError;
14681
14761
  }
@@ -14684,9 +14764,12 @@ var CompositionManagerProvider = ({
14684
14764
  onSnapshot: onCommitRegistrations,
14685
14765
  children: /* @__PURE__ */ jsx38(CompositionManager.Provider, {
14686
14766
  value: compositionManagerContextValue,
14687
- children: /* @__PURE__ */ jsx38(CompositionSetters.Provider, {
14688
- value: compositionManagerSetters,
14689
- children
14767
+ children: /* @__PURE__ */ jsx38(CompositionManagerRefContext.Provider, {
14768
+ value: compositionManagerRef,
14769
+ children: /* @__PURE__ */ jsx38(CompositionSetters.Provider, {
14770
+ value: compositionManagerSetters,
14771
+ children
14772
+ })
14690
14773
  })
14691
14774
  })
14692
14775
  });
@@ -14935,7 +15018,7 @@ var waitForRoot = (fn) => {
14935
15018
  };
14936
15019
 
14937
15020
  // src/RemotionRoot.tsx
14938
- import { useMemo as useMemo42 } from "react";
15021
+ import { useMemo as useMemo43 } from "react";
14939
15022
  import { jsx as jsx39 } from "react/jsx-runtime";
14940
15023
  var RemotionRootContexts = ({
14941
15024
  children,
@@ -14948,7 +15031,7 @@ var RemotionRootContexts = ({
14948
15031
  frameState,
14949
15032
  _experimentalKeepAudioContextAlive
14950
15033
  }) => {
14951
- const logging = useMemo42(() => {
15034
+ const logging = useMemo43(() => {
14952
15035
  return { logLevel, mountTime: Date.now() };
14953
15036
  }, [logLevel]);
14954
15037
  return /* @__PURE__ */ jsx39(LogLevelContext.Provider, {
@@ -15249,7 +15332,7 @@ var setupEnvVariables = () => {
15249
15332
  };
15250
15333
 
15251
15334
  // src/Track.tsx
15252
- import { useMemo as useMemo43, useState as useState23 } from "react";
15335
+ import { useMemo as useMemo44, useState as useState23 } from "react";
15253
15336
  import { jsx as jsx40 } from "react/jsx-runtime";
15254
15337
  var {
15255
15338
  freeze: _freeze,
@@ -15267,7 +15350,7 @@ var TrackWithoutSchema = ({
15267
15350
  ...props
15268
15351
  }) => {
15269
15352
  const [id] = useState23(() => String(Math.random()));
15270
- const value = useMemo43(() => ({ id, name }), [id, name]);
15353
+ const value = useMemo44(() => ({ id, name }), [id, name]);
15271
15354
  return /* @__PURE__ */ jsx40(TimelineTrackContext.Provider, {
15272
15355
  value,
15273
15356
  children: /* @__PURE__ */ jsx40(SequenceWithoutSchema, {
@@ -15326,9 +15409,9 @@ import { useCallback as useCallback28 } from "react";
15326
15409
  import {
15327
15410
  useCallback as useCallback26,
15328
15411
  useContext as useContext50,
15329
- useEffect as useEffect20,
15412
+ useEffect as useEffect19,
15330
15413
  useLayoutEffect as useLayoutEffect21,
15331
- useMemo as useMemo44,
15414
+ useMemo as useMemo45,
15332
15415
  useState as useState24
15333
15416
  } from "react";
15334
15417
 
@@ -15375,7 +15458,7 @@ var OffthreadVideoForRendering = ({
15375
15458
  if (!src) {
15376
15459
  throw new TypeError("No `src` was passed to <OffthreadVideo>.");
15377
15460
  }
15378
- const id = useMemo44(() => `offthreadvideo-${random(src)}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.relativeFrom}-${sequenceContext?.durationInFrames}`, [
15461
+ const id = useMemo45(() => `offthreadvideo-${random(src)}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.relativeFrom}-${sequenceContext?.durationInFrames}`, [
15379
15462
  src,
15380
15463
  sequenceContext?.cumulatedFrom,
15381
15464
  sequenceContext?.relativeFrom,
@@ -15396,7 +15479,7 @@ var OffthreadVideoForRendering = ({
15396
15479
  if (!videoConfig) {
15397
15480
  throw new Error("No video config found");
15398
15481
  }
15399
- useEffect20(() => {
15482
+ useEffect19(() => {
15400
15483
  if (!src) {
15401
15484
  throw new Error("No src passed");
15402
15485
  }
@@ -15431,14 +15514,14 @@ var OffthreadVideoForRendering = ({
15431
15514
  sequencePlaybackRate,
15432
15515
  audioStreamIndex
15433
15516
  ]);
15434
- const currentTime = useMemo44(() => {
15517
+ const currentTime = useMemo45(() => {
15435
15518
  return getExpectedMediaFrameUncorrected({
15436
15519
  frame,
15437
15520
  playbackRate: playbackRate || 1,
15438
15521
  startFrom: audioStartFrame
15439
15522
  }) / videoConfig.fps;
15440
15523
  }, [frame, audioStartFrame, playbackRate, videoConfig.fps]);
15441
- const actualSrc = useMemo44(() => {
15524
+ const actualSrc = useMemo45(() => {
15442
15525
  return getOffthreadVideoSource({
15443
15526
  src,
15444
15527
  currentTime,
@@ -15526,7 +15609,7 @@ var OffthreadVideoForRendering = ({
15526
15609
  cancelRender("Failed to load image with src " + imageSrc);
15527
15610
  }
15528
15611
  }, [imageSrc, onError]);
15529
- const className = useMemo44(() => {
15612
+ const className = useMemo45(() => {
15530
15613
  return [OBJECTFIT_CONTAIN_CLASS_NAME, props.className].filter(truthy).join(" ");
15531
15614
  }, [props.className]);
15532
15615
  const onImageFrame = useCallback26((img) => {
@@ -15554,20 +15637,20 @@ import React51, {
15554
15637
  forwardRef as forwardRef14,
15555
15638
  useCallback as useCallback27,
15556
15639
  useContext as useContext51,
15557
- useEffect as useEffect22,
15640
+ useEffect as useEffect21,
15558
15641
  useImperativeHandle as useImperativeHandle10,
15559
- useMemo as useMemo45,
15642
+ useMemo as useMemo46,
15560
15643
  useRef as useRef30,
15561
15644
  useState as useState25
15562
15645
  } from "react";
15563
15646
 
15564
15647
  // src/video/emit-video-frame.ts
15565
- import { useEffect as useEffect21 } from "react";
15648
+ import { useEffect as useEffect20 } from "react";
15566
15649
  var useEmitVideoFrame = ({
15567
15650
  ref,
15568
15651
  onVideoFrame
15569
15652
  }) => {
15570
- useEffect21(() => {
15653
+ useEffect20(() => {
15571
15654
  const { current } = ref;
15572
15655
  if (!current) {
15573
15656
  return;
@@ -15614,7 +15697,7 @@ var VideoForDevelopmentRefForwardingFunction = (props, ref) => {
15614
15697
  throw new Error("SharedAudioContext not found");
15615
15698
  }
15616
15699
  const videoRef = useRef30(null);
15617
- const sharedSource = useMemo45(() => {
15700
+ const sharedSource = useMemo46(() => {
15618
15701
  if (!context.audioContext) {
15619
15702
  return null;
15620
15703
  }
@@ -15721,7 +15804,7 @@ var VideoForDevelopmentRefForwardingFunction = (props, ref) => {
15721
15804
  tag: "video",
15722
15805
  mountTime
15723
15806
  }));
15724
- useEffect22(() => {
15807
+ useEffect21(() => {
15725
15808
  const { current } = videoRef;
15726
15809
  if (!current) {
15727
15810
  return;
@@ -15764,7 +15847,7 @@ var VideoForDevelopmentRefForwardingFunction = (props, ref) => {
15764
15847
  const currentOnDurationCallback = useRef30(onDuration);
15765
15848
  currentOnDurationCallback.current = onDuration;
15766
15849
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
15767
- useEffect22(() => {
15850
+ useEffect21(() => {
15768
15851
  const { current } = videoRef;
15769
15852
  if (!current) {
15770
15853
  return;
@@ -15781,7 +15864,7 @@ var VideoForDevelopmentRefForwardingFunction = (props, ref) => {
15781
15864
  current.removeEventListener("loadedmetadata", onLoadedMetadata);
15782
15865
  };
15783
15866
  }, [src]);
15784
- useEffect22(() => {
15867
+ useEffect21(() => {
15785
15868
  const { current } = videoRef;
15786
15869
  if (!current) {
15787
15870
  return;
@@ -15792,7 +15875,7 @@ var VideoForDevelopmentRefForwardingFunction = (props, ref) => {
15792
15875
  current.preload = "auto";
15793
15876
  }
15794
15877
  }, []);
15795
- const actualStyle = useMemo45(() => {
15878
+ const actualStyle = useMemo46(() => {
15796
15879
  return {
15797
15880
  ...style
15798
15881
  };
@@ -15861,7 +15944,7 @@ var VideoForPreviewRefForwardingFunction = (props, ref) => {
15861
15944
  documentationLink: onlyWarnForMediaSeekingError ? "https://www.remotion.dev/docs/offthreadvideo" : "https://www.remotion.dev/docs/html5-video",
15862
15945
  muted: isMutedForTimeline
15863
15946
  });
15864
- const metadata = useMemo45(() => isStudio || automaticOutlineRef || registration !== null ? {
15947
+ const metadata = useMemo46(() => isStudio || automaticOutlineRef || registration !== null ? {
15865
15948
  type: "sequence",
15866
15949
  id: timelineId,
15867
15950
  value: registration,
@@ -16100,7 +16183,7 @@ var watchStaticFile = (fileName, callback) => {
16100
16183
  };
16101
16184
 
16102
16185
  // src/wrap-remotion-context.tsx
16103
- import React53, { useCallback as useCallback29, useMemo as useMemo46, useRef as useRef31, useState as useState26 } from "react";
16186
+ import React53, { useCallback as useCallback29, useMemo as useMemo47, useRef as useRef31, useState as useState26 } from "react";
16104
16187
  import { jsx as jsx44 } from "react/jsx-runtime";
16105
16188
  function useRemotionContexts() {
16106
16189
  const compositionManagerCtx = React53.useContext(CompositionManager);
@@ -16124,7 +16207,7 @@ function useRemotionContexts() {
16124
16207
  const visualModePropStatusesRefContext = React53.useContext(VisualModePropStatusesRefContext);
16125
16208
  const bufferManagerContext = React53.useContext(BufferingContextReact);
16126
16209
  const logLevelContext = React53.useContext(LogLevelContext);
16127
- return useMemo46(() => ({
16210
+ return useMemo47(() => ({
16128
16211
  compositionManagerCtx,
16129
16212
  videoContext,
16130
16213
  timelineContext,
@@ -16231,7 +16314,7 @@ var ForwardedSequenceRegistry = ({
16231
16314
  });
16232
16315
  };
16233
16316
  }, [scope, scopeId, registry, commitRegistrationEnabled]);
16234
- const metadata = useMemo46(() => ({
16317
+ const metadata = useMemo47(() => ({
16235
16318
  type: "sequence-manager",
16236
16319
  id: scopeId,
16237
16320
  onCommit: commitRegistrationEnabled ? onCommitSequences : null
@@ -16350,6 +16433,7 @@ var Internals = {
16350
16433
  resolveTrimProps,
16351
16434
  VideoForPreview,
16352
16435
  CompositionManager,
16436
+ CompositionManagerRefContext,
16353
16437
  CompositionSetters,
16354
16438
  VisualModePropStatusesContext,
16355
16439
  VisualModePropStatusesRefContext,
@@ -16532,7 +16616,7 @@ var fontDataByUrl = new Map;
16532
16616
  // src/series/index.tsx
16533
16617
  import React55, {
16534
16618
  forwardRef as forwardRef15,
16535
- useMemo as useMemo47
16619
+ useMemo as useMemo48
16536
16620
  } from "react";
16537
16621
 
16538
16622
  // src/series/flatten-children.tsx
@@ -16604,7 +16688,7 @@ var validateSeriesSequenceProps = ({
16604
16688
  };
16605
16689
  var SeriesInner = (props) => {
16606
16690
  const pendingDeletions = usePendingSequenceDeletions();
16607
- const childrenValue = useMemo47(() => {
16691
+ const childrenValue = useMemo48(() => {
16608
16692
  const flattenedChildren = flattenChildren(props.children).filter((child) => !OptimisticSequenceDeletion.isElementDeleted(child, pendingDeletions));
16609
16693
  const renderChildren = (i, startFrame) => {
16610
16694
  if (i === flattenedChildren.length) {
@@ -16814,10 +16898,10 @@ import { forwardRef as forwardRef17, useCallback as useCallback30, useContext as
16814
16898
  import {
16815
16899
  forwardRef as forwardRef16,
16816
16900
  useContext as useContext52,
16817
- useEffect as useEffect23,
16901
+ useEffect as useEffect22,
16818
16902
  useImperativeHandle as useImperativeHandle11,
16819
16903
  useLayoutEffect as useLayoutEffect22,
16820
- useMemo as useMemo48,
16904
+ useMemo as useMemo49,
16821
16905
  useRef as useRef32
16822
16906
  } from "react";
16823
16907
 
@@ -16977,7 +17061,7 @@ var VideoForRenderingForwardFunction = ({
16977
17061
  const mountTime = useMountTime();
16978
17062
  const { delayRender, continueRender } = useDelayRender();
16979
17063
  const { registerRenderAsset, unregisterRenderAsset } = useContext52(RenderAssetManager);
16980
- const id = useMemo48(() => `video-${random(props.src ?? "")}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.relativeFrom}-${sequenceContext?.durationInFrames}`, [
17064
+ const id = useMemo49(() => `video-${random(props.src ?? "")}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.relativeFrom}-${sequenceContext?.durationInFrames}`, [
16981
17065
  props.src,
16982
17066
  sequenceContext?.cumulatedFrom,
16983
17067
  sequenceContext?.relativeFrom,
@@ -16998,7 +17082,7 @@ var VideoForRenderingForwardFunction = ({
16998
17082
  if (!videoConfig) {
16999
17083
  throw new Error("No video config found");
17000
17084
  }
17001
- useEffect23(() => {
17085
+ useEffect22(() => {
17002
17086
  if (!props.src) {
17003
17087
  throw new Error("No src passed");
17004
17088
  }
@@ -17037,7 +17121,7 @@ var VideoForRenderingForwardFunction = ({
17037
17121
  return videoRef.current;
17038
17122
  }, []);
17039
17123
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
17040
- useEffect23(() => {
17124
+ useEffect22(() => {
17041
17125
  if (!window.remotion_videoEnabled) {
17042
17126
  return;
17043
17127
  }