@remotion/promo-pages 4.0.446 → 4.0.448

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Homepage.js CHANGED
@@ -1568,7 +1568,8 @@ var useResolvedVideoConfig = (preferredCompositionId) => {
1568
1568
  defaultOutName: null,
1569
1569
  defaultVideoImageFormat: null,
1570
1570
  defaultPixelFormat: null,
1571
- defaultProResProfile: null
1571
+ defaultProResProfile: null,
1572
+ defaultSampleRate: null
1572
1573
  }
1573
1574
  };
1574
1575
  }
@@ -2042,7 +2043,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
2042
2043
  var addSequenceStackTraces = (component) => {
2043
2044
  componentsToAddStacksTo.push(component);
2044
2045
  };
2045
- var VERSION = "4.0.446";
2046
+ var VERSION = "4.0.448";
2046
2047
  var checkMultipleRemotionVersions = () => {
2047
2048
  if (typeof globalThis === "undefined") {
2048
2049
  return;
@@ -2281,7 +2282,8 @@ var useUnsafeVideoConfig = () => {
2281
2282
  defaultOutName,
2282
2283
  defaultVideoImageFormat,
2283
2284
  defaultPixelFormat,
2284
- defaultProResProfile
2285
+ defaultProResProfile,
2286
+ defaultSampleRate
2285
2287
  } = video;
2286
2288
  return {
2287
2289
  id,
@@ -2295,7 +2297,8 @@ var useUnsafeVideoConfig = () => {
2295
2297
  defaultOutName,
2296
2298
  defaultVideoImageFormat,
2297
2299
  defaultPixelFormat,
2298
- defaultProResProfile
2300
+ defaultProResProfile,
2301
+ defaultSampleRate
2299
2302
  };
2300
2303
  }, [ctxDuration, ctxHeight, ctxWidth, video]);
2301
2304
  };
@@ -6629,6 +6632,7 @@ var validateCalculated = ({
6629
6632
  const defaultVideoImageFormat = calculated?.defaultVideoImageFormat;
6630
6633
  const defaultPixelFormat = calculated?.defaultPixelFormat;
6631
6634
  const defaultProResProfile = calculated?.defaultProResProfile;
6635
+ const defaultSampleRate = calculated?.defaultSampleRate;
6632
6636
  return {
6633
6637
  width,
6634
6638
  height,
@@ -6638,7 +6642,8 @@ var validateCalculated = ({
6638
6642
  defaultOutName,
6639
6643
  defaultVideoImageFormat,
6640
6644
  defaultPixelFormat,
6641
- defaultProResProfile
6645
+ defaultProResProfile,
6646
+ defaultSampleRate
6642
6647
  };
6643
6648
  };
6644
6649
  var resolveVideoConfig = ({
@@ -6670,7 +6675,8 @@ var resolveVideoConfig = ({
6670
6675
  defaultOutName,
6671
6676
  defaultVideoImageFormat,
6672
6677
  defaultPixelFormat,
6673
- defaultProResProfile
6678
+ defaultProResProfile,
6679
+ defaultSampleRate
6674
6680
  } = validateCalculated({
6675
6681
  calculated: c2,
6676
6682
  compositionDurationInFrames,
@@ -6691,7 +6697,8 @@ var resolveVideoConfig = ({
6691
6697
  defaultOutName: defaultOutName ?? null,
6692
6698
  defaultVideoImageFormat: defaultVideoImageFormat ?? null,
6693
6699
  defaultPixelFormat: defaultPixelFormat ?? null,
6694
- defaultProResProfile: defaultProResProfile ?? null
6700
+ defaultProResProfile: defaultProResProfile ?? null,
6701
+ defaultSampleRate: defaultSampleRate ?? null
6695
6702
  };
6696
6703
  });
6697
6704
  }
@@ -6713,7 +6720,8 @@ var resolveVideoConfig = ({
6713
6720
  defaultOutName: null,
6714
6721
  defaultVideoImageFormat: null,
6715
6722
  defaultPixelFormat: null,
6716
- defaultProResProfile: null
6723
+ defaultProResProfile: null,
6724
+ defaultSampleRate: null
6717
6725
  };
6718
6726
  }
6719
6727
  return {
@@ -6725,7 +6733,8 @@ var resolveVideoConfig = ({
6725
6733
  defaultOutName: calculatedProm.defaultOutName ?? null,
6726
6734
  defaultVideoImageFormat: calculatedProm.defaultVideoImageFormat ?? null,
6727
6735
  defaultPixelFormat: calculatedProm.defaultPixelFormat ?? null,
6728
- defaultProResProfile: calculatedProm.defaultProResProfile ?? null
6736
+ defaultProResProfile: calculatedProm.defaultProResProfile ?? null,
6737
+ defaultSampleRate: calculatedProm.defaultSampleRate ?? null
6729
6738
  };
6730
6739
  };
6731
6740
  var resolveVideoConfigOrCatch = (params) => {
@@ -23412,7 +23421,7 @@ var GitHubStars = () => {
23412
23421
  width: "45px"
23413
23422
  }),
23414
23423
  /* @__PURE__ */ jsx50(StatItemContent, {
23415
- content: "41k",
23424
+ content: "42k",
23416
23425
  width: "80px",
23417
23426
  fontSize: "2.5rem",
23418
23427
  fontWeight: "bold"
@@ -27223,6 +27232,7 @@ var SharedPlayerContexts = ({
27223
27232
  defaultOutName: null,
27224
27233
  defaultPixelFormat: null,
27225
27234
  defaultProResProfile: null,
27235
+ defaultSampleRate: null,
27226
27236
  defaultVideoImageFormat: null,
27227
27237
  durationInFrames,
27228
27238
  fps,
@@ -29037,7 +29047,7 @@ var isAlreadyQueued = (time, queuedPeriod) => {
29037
29047
  return time >= queuedPeriod.from && time < queuedPeriod.until;
29038
29048
  };
29039
29049
  var AUDIO_PRIMING_SECONDS = 0.5;
29040
- var PREDECODE_AHEAD_SECONDS = 8;
29050
+ var PREDECODE_AHEAD_SECONDS = 2;
29041
29051
  function makePredecodingIterator(inner2) {
29042
29052
  const buffer = [];
29043
29053
  let consumerEndTime = 0;
@@ -29216,7 +29226,7 @@ var makePrewarmedAudioIteratorCache = (audioSink) => {
29216
29226
  destroy
29217
29227
  };
29218
29228
  };
29219
- var MAX_BUFFER_AHEAD_SECONDS = 8;
29229
+ var MAX_BUFFER_AHEAD_SECONDS = 2;
29220
29230
  var audioIteratorManager = ({
29221
29231
  audioTrack,
29222
29232
  delayPlaybackHandleIfNotPremounting,
@@ -29731,8 +29741,10 @@ var videoIteratorManager = ({
29731
29741
  let framesRendered = 0;
29732
29742
  let currentDelayHandle = null;
29733
29743
  if (canvas) {
29734
- canvas.width = videoTrack.displayWidth;
29735
- canvas.height = videoTrack.displayHeight;
29744
+ if (canvas.width !== videoTrack.displayWidth || canvas.height !== videoTrack.displayHeight) {
29745
+ canvas.width = videoTrack.displayWidth;
29746
+ canvas.height = videoTrack.displayHeight;
29747
+ }
29736
29748
  }
29737
29749
  const canvasSink = new CanvasSink(videoTrack, {
29738
29750
  poolSize: 2,
@@ -31831,7 +31843,12 @@ var applyVolume = (array, volume) => {
31831
31843
  }
31832
31844
  };
31833
31845
  var TARGET_NUMBER_OF_CHANNELS = 2;
31834
- var TARGET_SAMPLE_RATE = 48000;
31846
+ var getTargetSampleRate = () => {
31847
+ if (typeof window !== "undefined" && window.remotion_sampleRate) {
31848
+ return window.remotion_sampleRate;
31849
+ }
31850
+ return 48000;
31851
+ };
31835
31852
  var fixFloatingPoint = (value) => {
31836
31853
  if (value % 1 < 0.0000001) {
31837
31854
  return Math.floor(value);
@@ -31960,7 +31977,7 @@ var convertAudioData = ({
31960
31977
  sampleRate: currentSampleRate,
31961
31978
  numberOfFrames
31962
31979
  } = audioData;
31963
- const ratio = currentSampleRate / TARGET_SAMPLE_RATE;
31980
+ const ratio = currentSampleRate / getTargetSampleRate();
31964
31981
  const frameOffset = Math.floor(fixFloatingPoint2(trimStartInSeconds * audioData.sampleRate));
31965
31982
  const unroundedFrameCount = numberOfFrames - trimEndInSeconds * audioData.sampleRate - frameOffset;
31966
31983
  const frameCount = isLast ? ceilButNotIfFloatingPointIssue(unroundedFrameCount) : Math.round(unroundedFrameCount);
@@ -32007,7 +32024,7 @@ var convertAudioData = ({
32007
32024
  data: srcChannels,
32008
32025
  numberOfFrames: newNumberOfFrames,
32009
32026
  timestamp: audioDataTimestamp * 1e6 + fixFloatingPoint2(timestampOffsetMicroseconds),
32010
- durationInMicroSeconds: fixFloatingPoint2(newNumberOfFrames / TARGET_SAMPLE_RATE * 1e6)
32027
+ durationInMicroSeconds: fixFloatingPoint2(newNumberOfFrames / getTargetSampleRate() * 1e6)
32011
32028
  };
32012
32029
  }
32013
32030
  resampleAudioData({
@@ -32021,7 +32038,7 @@ var convertAudioData = ({
32021
32038
  data,
32022
32039
  numberOfFrames: newNumberOfFrames,
32023
32040
  timestamp: audioDataTimestamp * 1e6 + fixFloatingPoint2(timestampOffsetMicroseconds),
32024
- durationInMicroSeconds: fixFloatingPoint2(newNumberOfFrames / TARGET_SAMPLE_RATE * 1e6)
32041
+ durationInMicroSeconds: fixFloatingPoint2(newNumberOfFrames / getTargetSampleRate() * 1e6)
32025
32042
  };
32026
32043
  return newAudioData;
32027
32044
  };
@@ -32266,12 +32283,12 @@ var extractAudioInternal = async ({
32266
32283
  if (isFirstSample) {
32267
32284
  trimStartInSeconds = fixFloatingPoint2(timeInSeconds - sample.timestamp);
32268
32285
  if (trimStartInSeconds < 0) {
32269
- const silenceFrames = Math.ceil(fixFloatingPoint2(-trimStartInSeconds * TARGET_SAMPLE_RATE));
32286
+ const silenceFrames = Math.ceil(fixFloatingPoint2(-trimStartInSeconds * getTargetSampleRate()));
32270
32287
  leadingSilence = {
32271
32288
  data: new Int16Array(silenceFrames * TARGET_NUMBER_OF_CHANNELS),
32272
32289
  numberOfFrames: silenceFrames,
32273
32290
  timestamp: timeInSeconds * 1e6,
32274
- durationInMicroSeconds: silenceFrames / TARGET_SAMPLE_RATE * 1e6
32291
+ durationInMicroSeconds: silenceFrames / getTargetSampleRate() * 1e6
32275
32292
  };
32276
32293
  trimStartInSeconds = 0;
32277
32294
  }
@@ -32908,7 +32925,7 @@ var AudioForRendering2 = ({
32908
32925
  audio: environment.isClientSideRendering ? audio.data : Array.from(audio.data),
32909
32926
  frame: absoluteFrame,
32910
32927
  timestamp: audio.timestamp,
32911
- duration: audio.numberOfFrames / TARGET_SAMPLE_RATE * 1e6,
32928
+ duration: audio.numberOfFrames / getTargetSampleRate() * 1e6,
32912
32929
  toneFrequency: toneFrequency ?? 1
32913
32930
  });
32914
32931
  }
@@ -33024,6 +33041,27 @@ var AudioInner = (props) => {
33024
33041
  };
33025
33042
  var Audio2 = Internals.wrapInSchema(AudioInner, audioSchema);
33026
33043
  Internals.addSequenceStackTraces(Audio2);
33044
+ var cache2 = new Map;
33045
+ var cacheVideoFrame = (src, sourceCanvas) => {
33046
+ const { width, height } = sourceCanvas;
33047
+ if (width === 0 || height === 0) {
33048
+ return;
33049
+ }
33050
+ let cached = cache2.get(src);
33051
+ if (!cached || cached.width !== width || cached.height !== height) {
33052
+ cached = new OffscreenCanvas(width, height);
33053
+ cache2.set(src, cached);
33054
+ }
33055
+ const ctx = cached.getContext("2d");
33056
+ if (!ctx) {
33057
+ return;
33058
+ }
33059
+ ctx.clearRect(0, 0, width, height);
33060
+ ctx.drawImage(sourceCanvas, 0, 0);
33061
+ };
33062
+ var getCachedVideoFrame = (src) => {
33063
+ return cache2.get(src) ?? null;
33064
+ };
33027
33065
  var OBJECT_FIT_CLASS_PATTERN = /\bobject-(contain|cover|fill|none|scale-down)\b/;
33028
33066
  var warnedStyle = false;
33029
33067
  var warnedClassName = false;
@@ -33079,7 +33117,8 @@ var VideoForPreviewAssertedShowing = ({
33079
33117
  onError,
33080
33118
  credentials,
33081
33119
  controls,
33082
- objectFit: objectFitProp
33120
+ objectFit: objectFitProp,
33121
+ _experimentalInitiallyDrawCachedFrame
33083
33122
  }) => {
33084
33123
  const src = usePreload22(unpreloadedSrc);
33085
33124
  const canvasRef = useRef212(null);
@@ -33156,6 +33195,44 @@ var VideoForPreviewAssertedShowing = ({
33156
33195
  const initialMuted = useRef212(effectiveMuted);
33157
33196
  const initialDurationInFrames = useRef212(videoConfig.durationInFrames);
33158
33197
  const initialSequenceOffset = useRef212(sequenceOffset);
33198
+ const hasDrawnRealFrameRef = useRef212(false);
33199
+ const isPremountingRef = useRef212(isPremounting);
33200
+ isPremountingRef.current = isPremounting;
33201
+ useLayoutEffect34(() => {
33202
+ if (!_experimentalInitiallyDrawCachedFrame) {
33203
+ return;
33204
+ }
33205
+ const canvas = canvasRef.current;
33206
+ if (!canvas) {
33207
+ return;
33208
+ }
33209
+ const cached = getCachedVideoFrame(src);
33210
+ if (!cached) {
33211
+ return;
33212
+ }
33213
+ canvas.width = cached.width;
33214
+ canvas.height = cached.height;
33215
+ const ctx = canvas.getContext("2d", {
33216
+ alpha: true,
33217
+ desynchronized: true
33218
+ });
33219
+ if (!ctx) {
33220
+ return;
33221
+ }
33222
+ ctx.drawImage(cached, 0, 0);
33223
+ }, [_experimentalInitiallyDrawCachedFrame, src]);
33224
+ useLayoutEffect34(() => {
33225
+ if (!_experimentalInitiallyDrawCachedFrame) {
33226
+ return;
33227
+ }
33228
+ const canvas = canvasRef.current;
33229
+ return () => {
33230
+ if (!canvas || !hasDrawnRealFrameRef.current || isPremountingRef.current) {
33231
+ return;
33232
+ }
33233
+ cacheVideoFrame(src, canvas);
33234
+ };
33235
+ }, [_experimentalInitiallyDrawCachedFrame, src]);
33159
33236
  useEffect312(() => {
33160
33237
  if (!sharedAudioContext)
33161
33238
  return;
@@ -33224,6 +33301,7 @@ var VideoForPreviewAssertedShowing = ({
33224
33301
  if (result.type === "success") {
33225
33302
  setMediaPlayerReady(true);
33226
33303
  setMediaDurationInSeconds(result.durationInSeconds);
33304
+ hasDrawnRealFrameRef.current = true;
33227
33305
  }
33228
33306
  }).catch((error2) => {
33229
33307
  const [action, errorToUse] = callOnErrorAndResolve({
@@ -33261,6 +33339,7 @@ var VideoForPreviewAssertedShowing = ({
33261
33339
  }
33262
33340
  setMediaPlayerReady(false);
33263
33341
  setShouldFallbackToNativeVideo(false);
33342
+ hasDrawnRealFrameRef.current = false;
33264
33343
  };
33265
33344
  }, [
33266
33345
  audioStreamIndex,
@@ -33566,7 +33645,7 @@ var VideoForRendering2 = ({
33566
33645
  audio: environment.isClientSideRendering ? audio.data : Array.from(audio.data),
33567
33646
  frame: absoluteFrame,
33568
33647
  timestamp: audio.timestamp,
33569
- duration: audio.numberOfFrames / TARGET_SAMPLE_RATE * 1e6,
33648
+ duration: audio.numberOfFrames / getTargetSampleRate() * 1e6,
33570
33649
  toneFrequency
33571
33650
  });
33572
33651
  }
@@ -33759,7 +33838,8 @@ var InnerVideo = ({
33759
33838
  onError,
33760
33839
  credentials,
33761
33840
  controls,
33762
- objectFit
33841
+ objectFit,
33842
+ _experimentalInitiallyDrawCachedFrame
33763
33843
  }) => {
33764
33844
  const environment = useRemotionEnvironment();
33765
33845
  if (typeof src !== "string") {
@@ -33831,7 +33911,8 @@ var InnerVideo = ({
33831
33911
  onError,
33832
33912
  credentials,
33833
33913
  controls,
33834
- objectFit
33914
+ objectFit,
33915
+ _experimentalInitiallyDrawCachedFrame
33835
33916
  });
33836
33917
  };
33837
33918
  var VideoInner = ({
@@ -33863,6 +33944,7 @@ var VideoInner = ({
33863
33944
  credentials,
33864
33945
  controls,
33865
33946
  objectFit,
33947
+ _experimentalInitiallyDrawCachedFrame,
33866
33948
  from,
33867
33949
  durationInFrames
33868
33950
  }) => {
@@ -33900,7 +33982,8 @@ var VideoInner = ({
33900
33982
  onError,
33901
33983
  credentials,
33902
33984
  controls,
33903
- objectFit: objectFit ?? "contain"
33985
+ objectFit: objectFit ?? "contain",
33986
+ _experimentalInitiallyDrawCachedFrame: _experimentalInitiallyDrawCachedFrame ?? false
33904
33987
  })
33905
33988
  });
33906
33989
  };
@@ -35208,7 +35291,7 @@ import {
35208
35291
  import { BufferTarget, StreamTarget } from "mediabunny";
35209
35292
 
35210
35293
  // ../core/dist/esm/version.mjs
35211
- var VERSION2 = "4.0.446";
35294
+ var VERSION2 = "4.0.448";
35212
35295
 
35213
35296
  // ../web-renderer/dist/esm/index.mjs
35214
35297
  import { AudioSample, VideoSample } from "mediabunny";
@@ -35624,7 +35707,6 @@ var handleArtifacts = () => {
35624
35707
  return { handle };
35625
35708
  };
35626
35709
  var TARGET_NUMBER_OF_CHANNELS2 = 2;
35627
- var TARGET_SAMPLE_RATE2 = 48000;
35628
35710
  function mixAudio(waves, length2) {
35629
35711
  if (waves.length === 1 && waves[0].length === length2) {
35630
35712
  return waves[0];
@@ -35645,13 +35727,14 @@ function mixAudio(waves, length2) {
35645
35727
  var onlyInlineAudio = ({
35646
35728
  assets,
35647
35729
  fps,
35648
- timestamp
35730
+ timestamp,
35731
+ sampleRate
35649
35732
  }) => {
35650
35733
  const inlineAudio = assets.filter((asset) => asset.type === "inline-audio");
35651
35734
  if (inlineAudio.length === 0) {
35652
35735
  return null;
35653
35736
  }
35654
- const expectedLength = Math.round(TARGET_NUMBER_OF_CHANNELS2 * TARGET_SAMPLE_RATE2 / fps);
35737
+ const expectedLength = Math.round(TARGET_NUMBER_OF_CHANNELS2 * sampleRate / fps);
35655
35738
  for (const asset of inlineAudio) {
35656
35739
  if (asset.toneFrequency !== 1) {
35657
35740
  throw new Error("Setting the toneFrequency is not supported yet in web rendering.");
@@ -35663,7 +35746,7 @@ var onlyInlineAudio = ({
35663
35746
  format: "s16",
35664
35747
  numberOfChannels: TARGET_NUMBER_OF_CHANNELS2,
35665
35748
  numberOfFrames: expectedLength / TARGET_NUMBER_OF_CHANNELS2,
35666
- sampleRate: TARGET_SAMPLE_RATE2,
35749
+ sampleRate,
35667
35750
  timestamp
35668
35751
  });
35669
35752
  };
@@ -35764,6 +35847,80 @@ var createAudioSampleSource = ({
35764
35847
  });
35765
35848
  return { audioSampleSource, [Symbol.dispose]: () => audioSampleSource.close() };
35766
35849
  };
35850
+ var supportsNativeHtmlInCanvas = () => {
35851
+ if (typeof document === "undefined") {
35852
+ return false;
35853
+ }
35854
+ const ctx = document.createElement("canvas").getContext("2d");
35855
+ return typeof ctx?.drawElementImage === "function";
35856
+ };
35857
+ var setupHtmlInCanvas = ({
35858
+ wrapper,
35859
+ div,
35860
+ width: width2,
35861
+ height: height2
35862
+ }) => {
35863
+ if (!supportsNativeHtmlInCanvas()) {
35864
+ return null;
35865
+ }
35866
+ const layoutCanvas = document.createElement("canvas");
35867
+ layoutCanvas.layoutSubtree = true;
35868
+ layoutCanvas.width = width2;
35869
+ layoutCanvas.height = height2;
35870
+ layoutCanvas.style.position = "absolute";
35871
+ layoutCanvas.style.top = "0";
35872
+ layoutCanvas.style.left = "0";
35873
+ layoutCanvas.style.width = `${width2}px`;
35874
+ layoutCanvas.style.height = `${height2}px`;
35875
+ layoutCanvas.style.visibility = "visible";
35876
+ const maybeCtx = layoutCanvas.getContext("2d");
35877
+ if (!maybeCtx || typeof maybeCtx.drawElementImage !== "function") {
35878
+ return null;
35879
+ }
35880
+ if (typeof layoutCanvas.requestPaint !== "function") {
35881
+ return null;
35882
+ }
35883
+ wrapper.removeChild(div);
35884
+ layoutCanvas.appendChild(div);
35885
+ wrapper.appendChild(layoutCanvas);
35886
+ return { layoutCanvas, ctx: maybeCtx };
35887
+ };
35888
+ var waitForPaint = (layoutCanvas) => {
35889
+ return new Promise((resolve) => {
35890
+ layoutCanvas.addEventListener("paint", () => resolve(), { once: true });
35891
+ layoutCanvas.requestPaint();
35892
+ });
35893
+ };
35894
+ var drawWithHtmlInCanvas = async ({
35895
+ htmlInCanvasContext,
35896
+ element,
35897
+ scaledWidth,
35898
+ scaledHeight
35899
+ }) => {
35900
+ const { ctx, layoutCanvas } = htmlInCanvasContext;
35901
+ await waitForPaint(layoutCanvas);
35902
+ layoutCanvas.width = scaledWidth;
35903
+ layoutCanvas.height = scaledHeight;
35904
+ ctx.reset();
35905
+ ctx.drawElementImage(element, 0, 0, scaledWidth, scaledHeight);
35906
+ const offscreen = new OffscreenCanvas(scaledWidth, scaledHeight);
35907
+ const offCtx = offscreen.getContext("2d");
35908
+ if (!offCtx) {
35909
+ throw new Error("Could not get offscreen context");
35910
+ }
35911
+ offCtx.drawImage(layoutCanvas, 0, 0);
35912
+ return offCtx;
35913
+ };
35914
+ var teardownHtmlInCanvas = ({
35915
+ htmlInCanvasContext,
35916
+ wrapper,
35917
+ div
35918
+ }) => {
35919
+ const { layoutCanvas } = htmlInCanvasContext;
35920
+ layoutCanvas.removeChild(div);
35921
+ wrapper.removeChild(layoutCanvas);
35922
+ wrapper.appendChild(div);
35923
+ };
35767
35924
  var UpdateTime = ({
35768
35925
  children,
35769
35926
  audioEnabled,
@@ -35876,7 +36033,8 @@ function createScaffold({
35876
36033
  audioEnabled,
35877
36034
  videoEnabled,
35878
36035
  defaultCodec,
35879
- defaultOutName
36036
+ defaultOutName,
36037
+ allowHtmlInCanvas
35880
36038
  }) {
35881
36039
  if (!ReactDOM6.createRoot) {
35882
36040
  throw new Error("@remotion/web-renderer requires React 18 or higher");
@@ -35902,6 +36060,7 @@ function createScaffold({
35902
36060
  const cleanupCSS = Internals.CSSUtils.injectCSS(Internals.CSSUtils.makeDefaultPreviewCSS(`.${scaffoldClassName}`, "white"));
35903
36061
  wrapper.appendChild(div);
35904
36062
  document.body.appendChild(wrapper);
36063
+ const htmlInCanvasContext = allowHtmlInCanvas ? setupHtmlInCanvas({ wrapper, div, width: width2, height: height2 }) : null;
35905
36064
  const errorHolder = { error: null };
35906
36065
  const root = ReactDOM6.createRoot(div, {
35907
36066
  onUncaughtError: (err, errorInfo) => {
@@ -35962,7 +36121,8 @@ function createScaffold({
35962
36121
  defaultOutName: defaultOutName ?? null,
35963
36122
  defaultVideoImageFormat: null,
35964
36123
  defaultPixelFormat: null,
35965
- defaultProResProfile: null
36124
+ defaultProResProfile: null,
36125
+ defaultSampleRate: null
35966
36126
  },
35967
36127
  folders: []
35968
36128
  },
@@ -35992,8 +36152,12 @@ function createScaffold({
35992
36152
  delayRenderScope,
35993
36153
  div,
35994
36154
  errorHolder,
36155
+ htmlInCanvasContext,
35995
36156
  [Symbol.dispose]: () => {
35996
36157
  root.unmount();
36158
+ if (htmlInCanvasContext) {
36159
+ teardownHtmlInCanvas({ htmlInCanvasContext, wrapper, div });
36160
+ }
35997
36161
  div.remove();
35998
36162
  wrapper.remove();
35999
36163
  cleanupCSS();
@@ -36867,6 +37031,7 @@ var calculateTransforms = ({
36867
37031
  let opacity = 1;
36868
37032
  let elementComputedStyle = null;
36869
37033
  let maskImageInfo = null;
37034
+ let filterValue = null;
36870
37035
  while (parent) {
36871
37036
  const computedStyle = getComputedStyle(parent);
36872
37037
  if (parent === element) {
@@ -36874,6 +37039,16 @@ var calculateTransforms = ({
36874
37039
  opacity = parseFloat(computedStyle.opacity);
36875
37040
  const maskImageValue = getMaskImageValue(computedStyle);
36876
37041
  maskImageInfo = maskImageValue ? parseMaskImage(maskImageValue) : null;
37042
+ const computedFilter = computedStyle.filter;
37043
+ if (computedFilter && computedFilter !== "none") {
37044
+ filterValue = computedFilter;
37045
+ const originalFilter = parent.style.filter;
37046
+ parent.style.filter = "none";
37047
+ const parentRefFilter = parent;
37048
+ toReset.push(() => {
37049
+ parentRefFilter.style.filter = originalFilter;
37050
+ });
37051
+ }
36877
37052
  const originalMaskImage = parent.style.maskImage;
36878
37053
  const originalWebkitMaskImage = parent.style.webkitMaskImage;
36879
37054
  parent.style.maskImage = "none";
@@ -36937,6 +37112,7 @@ var calculateTransforms = ({
36937
37112
  }
36938
37113
  const needs3DTransformViaWebGL = !totalMatrix.is2D;
36939
37114
  const needsMaskImage = maskImageInfo !== null;
37115
+ const needsFilter = filterValue !== null;
36940
37116
  return {
36941
37117
  dimensions,
36942
37118
  totalMatrix,
@@ -36952,7 +37128,8 @@ var calculateTransforms = ({
36952
37128
  precompositing: {
36953
37129
  needs3DTransformViaWebGL,
36954
37130
  needsMaskImage: maskImageInfo,
36955
- needsPrecompositing: Boolean(needs3DTransformViaWebGL || needsMaskImage)
37131
+ needsFilter: filterValue,
37132
+ needsPrecompositing: Boolean(needs3DTransformViaWebGL || needsMaskImage || needsFilter)
36956
37133
  }
36957
37134
  };
36958
37135
  };
@@ -38271,6 +38448,9 @@ var handle3dTransform = ({
38271
38448
  });
38272
38449
  return transformed;
38273
38450
  };
38451
+ var getPrecomposeRectForFilter = (element) => {
38452
+ return getBiggestBoundingClientRect(element);
38453
+ };
38274
38454
  var getPrecomposeRectForMask = (element) => {
38275
38455
  const boundingRect = getBiggestBoundingClientRect(element);
38276
38456
  return boundingRect;
@@ -38351,6 +38531,12 @@ var processNode = async ({
38351
38531
  if (precompositing.needsMaskImage) {
38352
38532
  precomposeRect = roundToExpandRect(getPrecomposeRectForMask(element));
38353
38533
  }
38534
+ if (precompositing.needsFilter) {
38535
+ precomposeRect = roundToExpandRect(getWiderRectAndExpand({
38536
+ firstRect: precomposeRect,
38537
+ secondRect: getPrecomposeRectForFilter(element)
38538
+ }));
38539
+ }
38354
38540
  if (precompositing.needs3DTransformViaWebGL) {
38355
38541
  const tentativePrecomposeRect = getPrecomposeRectFor3DTransform({
38356
38542
  element,
@@ -38413,8 +38599,13 @@ var processNode = async ({
38413
38599
  }
38414
38600
  }
38415
38601
  const previousTransform = context.getTransform();
38602
+ const previousFilter = context.filter;
38416
38603
  context.setTransform(new DOMMatrix);
38604
+ if (precompositing.needsFilter) {
38605
+ context.filter = precompositing.needsFilter;
38606
+ }
38417
38607
  context.drawImage(drawable, 0, drawable.height - rectAfterTransforms.height, rectAfterTransforms.width, rectAfterTransforms.height, rectAfterTransforms.left - parentRect.x, rectAfterTransforms.top - parentRect.y, rectAfterTransforms.width, rectAfterTransforms.height);
38608
+ context.filter = previousFilter;
38418
38609
  context.setTransform(previousTransform);
38419
38610
  Internals.Log.trace({
38420
38611
  logLevel,
@@ -38737,10 +38928,32 @@ var createLayer = async ({
38737
38928
  logLevel,
38738
38929
  internalState,
38739
38930
  onlyBackgroundClipText,
38740
- cutout
38931
+ cutout,
38932
+ htmlInCanvasContext,
38933
+ onHtmlInCanvasLayerOutcome
38741
38934
  }) => {
38742
38935
  const scaledWidth = Math.ceil(cutout.width * scale);
38743
38936
  const scaledHeight = Math.ceil(cutout.height * scale);
38937
+ if (!onlyBackgroundClipText && element instanceof HTMLElement && htmlInCanvasContext && onHtmlInCanvasLayerOutcome) {
38938
+ try {
38939
+ const offCtx = await drawWithHtmlInCanvas({
38940
+ htmlInCanvasContext,
38941
+ element,
38942
+ scaledWidth,
38943
+ scaledHeight
38944
+ });
38945
+ onHtmlInCanvasLayerOutcome({ native: true });
38946
+ return offCtx;
38947
+ } catch (err) {
38948
+ const detail = err instanceof Error ? err.message : JSON.stringify(err);
38949
+ onHtmlInCanvasLayerOutcome({
38950
+ native: false,
38951
+ reason: `drawElementImage failed (${detail}); falling back to the built-in DOM composer.`,
38952
+ shouldWarn: true
38953
+ });
38954
+ Internals.Log.verbose({ logLevel, tag: "@remotion/web-renderer" }, "HTML-in-canvas capture failed, falling back to software compose", err);
38955
+ }
38956
+ }
38744
38957
  const canvas = new OffscreenCanvas(scaledWidth, scaledHeight);
38745
38958
  const context = canvas.getContext("2d");
38746
38959
  if (!context) {
@@ -38971,11 +39184,25 @@ var internalRenderMediaOnWeb = async ({
38971
39184
  licenseKey,
38972
39185
  muted,
38973
39186
  scale,
38974
- isProduction
39187
+ isProduction,
39188
+ allowHtmlInCanvas,
39189
+ sampleRate
38975
39190
  }) => {
38976
39191
  let __stack2 = [];
38977
39192
  try {
38978
39193
  validateScale(scale);
39194
+ let htmlInCanvasLayerOutcomeReported = false;
39195
+ const onHtmlInCanvasLayerOutcome = (outcome) => {
39196
+ if (htmlInCanvasLayerOutcomeReported) {
39197
+ return;
39198
+ }
39199
+ htmlInCanvasLayerOutcomeReported = true;
39200
+ if (outcome.native) {
39201
+ Internals.Log.warn({ logLevel, tag: "@remotion/web-renderer" }, "Using Chromium experimental HTML-in-canvas (drawElementImage) for video frames. See https://github.com/WICG/html-in-canvas");
39202
+ } else if (outcome.shouldWarn) {
39203
+ Internals.Log.warn({ logLevel, tag: "@remotion/web-renderer" }, `Not using HTML-in-canvas: ${outcome.reason}`);
39204
+ }
39205
+ };
38979
39206
  const outputTarget = userDesiredOutputTarget === null ? await canUseWebFsWriter() ? "web-fs" : "arraybuffer" : userDesiredOutputTarget;
38980
39207
  if (outputTarget === "web-fs") {
38981
39208
  await cleanupStaleOpfsFiles();
@@ -39041,9 +39268,38 @@ var internalRenderMediaOnWeb = async ({
39041
39268
  videoEnabled,
39042
39269
  initialFrame: 0,
39043
39270
  defaultCodec: resolved.defaultCodec,
39044
- defaultOutName: resolved.defaultOutName
39271
+ defaultOutName: resolved.defaultOutName,
39272
+ allowHtmlInCanvas
39045
39273
  }), 0);
39046
- const { delayRenderScope, div, timeUpdater, collectAssets, errorHolder } = scaffold;
39274
+ const {
39275
+ delayRenderScope,
39276
+ div,
39277
+ timeUpdater,
39278
+ collectAssets,
39279
+ errorHolder,
39280
+ htmlInCanvasContext
39281
+ } = scaffold;
39282
+ if (allowHtmlInCanvas && !htmlInCanvasContext) {
39283
+ if (!supportsNativeHtmlInCanvas()) {
39284
+ onHtmlInCanvasLayerOutcome({
39285
+ native: false,
39286
+ reason: "This browser does not expose CanvasRenderingContext2D.prototype.drawElementImage. In Chromium, enable chrome://flags/#canvas-draw-element and use a version that ships the API.",
39287
+ shouldWarn: false
39288
+ });
39289
+ } else {
39290
+ onHtmlInCanvasLayerOutcome({
39291
+ native: false,
39292
+ reason: "drawElementImage is available but canvas.requestPaint() is missing. Use a Chromium version that ships requestPaint.",
39293
+ shouldWarn: true
39294
+ });
39295
+ }
39296
+ } else if (!allowHtmlInCanvas) {
39297
+ onHtmlInCanvasLayerOutcome({
39298
+ native: false,
39299
+ reason: "allowHtmlInCanvas is false; using the built-in DOM composer.",
39300
+ shouldWarn: false
39301
+ });
39302
+ }
39047
39303
  const internalState = __using2(__stack2, makeInternalState(), 0);
39048
39304
  const keepalive = __using2(__stack2, createBackgroundKeepalive({
39049
39305
  fps: resolved.fps,
@@ -39156,7 +39412,9 @@ var internalRenderMediaOnWeb = async ({
39156
39412
  logLevel,
39157
39413
  internalState,
39158
39414
  onlyBackgroundClipText: false,
39159
- cutout: new DOMRect(0, 0, resolved.width, resolved.height)
39415
+ cutout: new DOMRect(0, 0, resolved.width, resolved.height),
39416
+ htmlInCanvasContext,
39417
+ onHtmlInCanvasLayerOutcome: htmlInCanvasContext ? onHtmlInCanvasLayerOutcome : undefined
39160
39418
  });
39161
39419
  internalState.addCreateFrameTime(performance.now() - createFrameStart);
39162
39420
  layerCanvas = layer.canvas;
@@ -39207,7 +39465,7 @@ var internalRenderMediaOnWeb = async ({
39207
39465
  if (signal?.aborted) {
39208
39466
  throw new Error("renderMediaOnWeb() was cancelled");
39209
39467
  }
39210
- const audio = muted ? null : onlyInlineAudio({ assets, fps: resolved.fps, timestamp });
39468
+ const audio = muted ? null : onlyInlineAudio({ assets, fps: resolved.fps, timestamp, sampleRate });
39211
39469
  internalState.addAudioMixingTime(performance.now() - audioCombineStart);
39212
39470
  const addSampleStart = performance.now();
39213
39471
  const encodingPromises = [];
@@ -39320,7 +39578,9 @@ var renderMediaOnWeb = (options2) => {
39320
39578
  licenseKey: options2.licenseKey ?? null,
39321
39579
  muted: options2.muted ?? false,
39322
39580
  scale: options2.scale ?? 1,
39323
- isProduction: options2.isProduction ?? true
39581
+ isProduction: options2.isProduction ?? true,
39582
+ allowHtmlInCanvas: options2.allowHtmlInCanvas ?? false,
39583
+ sampleRate: options2.sampleRate ?? 48000
39324
39584
  }));
39325
39585
  return onlyOneRenderAtATimeQueue.ref;
39326
39586
  };
@@ -41624,6 +41884,7 @@ var listOfRemotionPackages = [
41624
41884
  "@remotion/bundler",
41625
41885
  "@remotion/cli",
41626
41886
  "@remotion/cloudrun",
41887
+ "@remotion/codex-plugin",
41627
41888
  "@remotion/compositor-darwin-arm64",
41628
41889
  "@remotion/compositor-darwin-x64",
41629
41890
  "@remotion/compositor-linux-arm64-gnu",
@@ -42957,7 +43218,7 @@ var GithubButton = () => {
42957
43218
  " ",
42958
43219
  /* @__PURE__ */ jsx164("div", {
42959
43220
  className: "text-xs inline-block ml-2 leading-none mt-[3px] self-center",
42960
- children: "41k"
43221
+ children: "42k"
42961
43222
  })
42962
43223
  ]
42963
43224
  });