hyperframes 0.8.145 → 0.8.147
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/{add-B6OUH46W.js → add-5CNUY3EW.js} +15 -15
- package/dist/{animatedGifPrep-MIWRDJIO.js → animatedGifPrep-ZID2XJRQ.js} +10 -10
- package/dist/{asset-XJ2B2PU3.js → asset-TFEENZ7K.js} +2 -2
- package/dist/{assetCataloger-A5ZLSCMZ.js → assetCataloger-GX4B55VB.js} +4 -4
- package/dist/{auth-5HOVCZMV.js → auth-EJVZW6C3.js} +2 -2
- package/dist/{autoUpdate-WVNL5K3D.js → autoUpdate-MBNEZ2U4.js} +2 -2
- package/dist/{backgroundChecks-IGF54SFH.js → backgroundChecks-DNW5NPTY.js} +3 -3
- package/dist/backgroundChecksWorker.js +3 -3
- package/dist/{batchRender-T6JEGCQV.js → batchRender-T7S2CGJE.js} +5 -5
- package/dist/{beats-37T6Y6QP.js → beats-STXBGN6Z.js} +16 -16
- package/dist/{benchmark-ZVVLOWPP.js → benchmark-AC6IGEQP.js} +12 -12
- package/dist/{browser-4SSJOLH4.js → browser-FB5AK32T.js} +5 -5
- package/dist/{bundleWithLocalizedFonts-XWK423QP.js → bundleWithLocalizedFonts-HSCWGCFO.js} +2 -2
- package/dist/{capture-KZXOPBMO.js → capture-I24MXH3Y.js} +13 -13
- package/dist/{capture-2SF7YP57.js → capture-VEIVUHWB.js} +2 -2
- package/dist/{catalog-NLD4A2C6.js → catalog-JRC4VTTI.js} +15 -15
- package/dist/{catch-up-4BSRN6IR.js → catch-up-NTCK7Z3G.js} +6 -6
- package/dist/{check-IA44QQWM.js → check-7M7W4LPN.js} +38 -38
- package/dist/{checkBrowser-VM35KZMW.js → checkBrowser-2YRVCAYB.js} +118 -61
- package/dist/{chunk-OTHDVXOJ.js → chunk-2IDHEEAN.js} +3 -3
- package/dist/{chunk-VHFEMFYL.js → chunk-3BETQ4XI.js} +3 -3
- package/dist/{chunk-3KU3PFDW.js → chunk-3BYMCR4O.js} +85 -75
- package/dist/{chunk-FXJJCPPB.js → chunk-3HSWLZ6S.js} +1 -1
- package/dist/{chunk-ZF7SXQJ7.js → chunk-3PPO64IB.js} +2 -2
- package/dist/{chunk-PLR7Z6TC.js → chunk-3YUFN37G.js} +1 -1
- package/dist/{chunk-GRY3PN3K.js → chunk-4YVMMRHR.js} +2 -2
- package/dist/{chunk-ICKDMTLA.js → chunk-55RZG5SQ.js} +2 -2
- package/dist/{chunk-3IBMBNYY.js → chunk-5OKZLMQK.js} +10 -10
- package/dist/{chunk-DIRJ322I.js → chunk-66SAATRI.js} +3 -3
- package/dist/{chunk-GMAJB2P6.js → chunk-6BSIQJPW.js} +1 -1
- package/dist/{chunk-4QWD6JYN.js → chunk-6WD636E5.js} +3 -3
- package/dist/{chunk-5WVW7P23.js → chunk-A72OAGNB.js} +6 -6
- package/dist/{chunk-XBX4QJP7.js → chunk-AFIATIKS.js} +1 -1
- package/dist/{chunk-G75ENCEZ.js → chunk-AIJS74LG.js} +3 -3
- package/dist/{chunk-FBCULCAL.js → chunk-AL2YEVOT.js} +1 -1
- package/dist/{chunk-GEMJYBRU.js → chunk-B45OFFOQ.js} +2 -2
- package/dist/{chunk-VRW6EBHV.js → chunk-BAKPN2D2.js} +101 -94
- package/dist/{chunk-HB7FJOY4.js → chunk-BPUFVVSH.js} +1 -1
- package/dist/{chunk-BIAC7IJT.js → chunk-DDNS2674.js} +1 -1
- package/dist/{chunk-QFSCCQIR.js → chunk-DMKI64EZ.js} +1 -1
- package/dist/{chunk-EPE2HRJK.js → chunk-DYWSCPCR.js} +69 -64
- package/dist/{chunk-ZIYZ77MR.js → chunk-EGO6Z24R.js} +3 -3
- package/dist/{chunk-KC5XXX3X.js → chunk-EOOEC32M.js} +1 -1
- package/dist/{chunk-XIHCMVMG.js → chunk-FDL4HV44.js} +2 -2
- package/dist/{chunk-QZ3AZTXI.js → chunk-FJWEYVEM.js} +42 -16
- package/dist/{chunk-PUGIRFPX.js → chunk-FMNVTKX2.js} +4 -4
- package/dist/{chunk-IHTRYDFN.js → chunk-H7B6JSHI.js} +1 -1
- package/dist/{chunk-T42U2W2R.js → chunk-IXLUTE6N.js} +1 -1
- package/dist/{chunk-FDT6KQV4.js → chunk-JBQJKC23.js} +2 -2
- package/dist/{chunk-IEIJRMLZ.js → chunk-JDB65PPT.js} +62 -63
- package/dist/{chunk-UXO2L7HJ.js → chunk-JF5L5SQ6.js} +278 -65
- package/dist/{chunk-USDEMXXL.js → chunk-JYVGYKXG.js} +1 -1
- package/dist/{chunk-R42WWQVB.js → chunk-KPJMBC4K.js} +2 -2
- package/dist/{chunk-MAYCCGMQ.js → chunk-KVGDFUVO.js} +1 -1
- package/dist/{chunk-CFUXNBWH.js → chunk-LE7T4ML7.js} +1 -1
- package/dist/{chunk-MQZVBHEY.js → chunk-LFNQDTSH.js} +1 -1
- package/dist/{chunk-KIFHYXPB.js → chunk-MOL32UKR.js} +45 -11
- package/dist/{chunk-6LGNTUZN.js → chunk-N53FLAMZ.js} +7 -7
- package/dist/{chunk-ADF3X6GM.js → chunk-P6HELLPU.js} +2 -2
- package/dist/{chunk-5NRXZGKK.js → chunk-POKK6XXU.js} +9 -9
- package/dist/{chunk-GBGJ7A3D.js → chunk-QHRPB2JQ.js} +6 -6
- package/dist/{chunk-BFACGEII.js → chunk-QTTDKWSM.js} +2 -2
- package/dist/{chunk-U5QY7KTN.js → chunk-SEABQTBP.js} +11 -8
- package/dist/{chunk-ZEUONDQG.js → chunk-SYUGVPYH.js} +1 -1
- package/dist/{chunk-PJ3HDUCY.js → chunk-VAS6HQX3.js} +39 -9
- package/dist/{chunk-GQJZORQP.js → chunk-XBSPQ52S.js} +1 -1
- package/dist/{chunk-4ORLNTET.js → chunk-XOJDBRNF.js} +1 -1
- package/dist/{chunk-LAFJSYDL.js → chunk-XVIYZU3D.js} +1 -1
- package/dist/{chunk-OB5MJR4W.js → chunk-YCGU3UNU.js} +1 -1
- package/dist/{chunk-GXJEGZL2.js → chunk-Z5C4LEAD.js} +17 -18
- package/dist/chunk-Z6FLHIDV.js +3795 -0
- package/dist/{chunk-DDIVWXN7.js → chunk-ZFN6GQU4.js} +4 -4
- package/dist/{chunk-QLSM7K5S.js → chunk-ZLL72U3I.js} +2 -2
- package/dist/{chunk-ZSVUAVMT.js → chunk-ZQXNL5DL.js} +5 -5
- package/dist/{chunk-DWUKJQTO.js → chunk-ZVZSFDW3.js} +2 -2
- package/dist/{clean-RDKJB5FK.js → clean-3RY3Y2GX.js} +23 -23
- package/dist/cli.js +52 -52
- package/dist/{cloud-QVPVVNCW.js → cloud-MLPBFCVE.js} +4 -4
- package/dist/{cloudrun-3RE2UCQG.js → cloudrun-NQF5KFQI.js} +6 -6
- package/dist/{compare-LEDOY7MO.js → compare-6EZX2754.js} +32 -32
- package/dist/{compiler-F54OZZPM.js → compiler-ACCPOZMQ.js} +6 -6
- package/dist/{component-N42M67WY.js → component-F5PQHP6A.js} +3 -3
- package/dist/{compositions-VB2J2LZI.js → compositions-AUHWSI2H.js} +15 -15
- package/dist/{delete-Q6RWMJ4Z.js → delete-VUF4SHHJ.js} +2 -2
- package/dist/{deterministicFonts-U2BIMGPG.js → deterministicFonts-C5JQLCTS.js} +2 -2
- package/dist/{dist-Q4BI5A73.js → dist-GPDOV3IQ.js} +4 -4
- package/dist/{dist-KDJTFJHA.js → dist-HUMFCJ6T.js} +3 -3
- package/dist/{doctor-JMMUHDRV.js → doctor-3XHCA5JM.js} +15 -15
- package/dist/{events-RGUAHIBW.js → events-FKOIB3R3.js} +5 -5
- package/dist/{events-6ZBSIBE5.js → events-TIU72LZM.js} +4 -4
- package/dist/{feedback-FIID6MZW.js → feedback-V6VATYBE.js} +10 -10
- package/dist/{ffmpeg-T5SH2EFJ.js → ffmpeg-5V4FP3R6.js} +2 -2
- package/dist/{figma-BL3JJC36.js → figma-YBJM2VGE.js} +3 -3
- package/dist/fontLocalizeCli.js +14 -14
- package/dist/{get-P46GS7S6.js → get-3YVCGZBX.js} +2 -2
- package/dist/{gpuPolicy-AQ2BPLBK.js → gpuPolicy-ZOUG66M7.js} +10 -10
- package/dist/{grade-compare-GDCWU7ZZ.js → grade-compare-MYXIRKQI.js} +33 -33
- package/dist/{help-HJR3RWFG.js → help-WFZ2SUUR.js} +2 -2
- package/dist/{history-GGO5AWJB.js → history-HWPRJFR5.js} +49 -22
- package/dist/hyperframe-runtime.js +214 -68
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +214 -68
- package/dist/hyperframes-player.global.js +4 -5
- package/dist/hyperframes-slideshow.global.js +3 -4
- package/dist/{info-3GFWUBJC.js → info-WJDTQ4OZ.js} +11 -11
- package/dist/{init-36OPU2ZG.js → init-EXHDN7RO.js} +31 -31
- package/dist/{inspect-F2HEL5ON.js → inspect-EAOLZOMQ.js} +33 -33
- package/dist/{installer-NI6P6GC4.js → installer-LZ4X5TZZ.js} +6 -6
- package/dist/{keyframes-7OY3LMAZ.js → keyframes-FSZYNEDN.js} +8 -8
- package/dist/{lambda-6GJIWNJ3.js → lambda-3GAKHMC3.js} +7 -7
- package/dist/{layout-FTMLNL5A.js → layout-M2TQ2CIX.js} +33 -33
- package/dist/{lint-U6POHUON.js → lint-7C5UPTNQ.js} +11 -11
- package/dist/{lintProject-UBZ3TDHU.js → lintProject-SSEXWCH6.js} +3 -3
- package/dist/{list-IP5KI5Q2.js → list-GU5KBZ73.js} +2 -2
- package/dist/{login-4VWTVPHG.js → login-ZL2NYBIZ.js} +4 -4
- package/dist/{manager-YKMHR6LN.js → manager-5ORDVWJB.js} +3 -3
- package/dist/{media-treatment-XGV44AGV.js → media-treatment-QC3TAHVU.js} +82 -54
- package/dist/{models-UCXB6UR5.js → models-A54I4QR5.js} +14 -14
- package/dist/{motionShot-WPVNBXKA.js → motionShot-ZXPK562F.js} +35 -29
- package/dist/{normalize-audio-TYJ3UEHO.js → normalize-audio-CAP3DAE6.js} +10 -10
- package/dist/{open-HENOLVB2.js → open-GUSBNMDB.js} +6 -6
- package/dist/{parakeetRunner-VFQ6WFTD.js → parakeetRunner-GCCH72CO.js} +14 -14
- package/dist/{pipeline-6WPSC3H4.js → pipeline-SCJ2MWYH.js} +11 -11
- package/dist/{play-OI53WNUM.js → play-FP2QLMGM.js} +26 -26
- package/dist/{preflight-B4AFK3RG.js → preflight-ONF5AJNO.js} +5 -5
- package/dist/{present-NGMEQ4NO.js → present-H5SA4APW.js} +23 -23
- package/dist/{preview-VT2HWRWZ.js → preview-ATPVKA6K.js} +57 -26
- package/dist/{producer-7TYEAUF7.js → producer-VBYUC27R.js} +1 -1
- package/dist/{projectConfig-B2AF5DXY.js → projectConfig-SBRMQZGG.js} +8 -8
- package/dist/{publication-2PANQVC6.js → publication-5BQICRZO.js} +4 -4
- package/dist/{publish-O5OL42BG.js → publish-XDUZA3E3.js} +27 -26
- package/dist/{remove-background-T2JM6UVP.js → remove-background-GA6F7JZW.js} +12 -12
- package/dist/{render-Z253WHBK.js → render-KUVZFNQD.js} +27 -27
- package/dist/{render-W7OFXDOJ.js → render-PCFO45RK.js} +5 -5
- package/dist/{render-OLPKOJRU.js → render-XCYXFZTL.js} +12 -12
- package/dist/{render-batch-46IIBFKL.js → render-batch-7R2NRNVJ.js} +5 -5
- package/dist/{renderCancellation-QTZOCDJ2.js → renderCancellation-NIXEWRAO.js} +10 -10
- package/dist/renderSetupWorker.js +3 -3
- package/dist/{resolver-J2PL5FVJ.js → resolver-C4FPX72I.js} +6 -6
- package/dist/{sherpa-ZF42V3RN.js → sherpa-IQY52XU6.js} +14 -14
- package/dist/skills/media-use/references/media-treatments.md +5 -1
- package/dist/{skills-ACDOO3PX.js → skills-JSSAEKUW.js} +7 -7
- package/dist/{skillsUpdateCheck-L5OXVVPU.js → skillsUpdateCheck-XE5E2K2F.js} +3 -3
- package/dist/{slideshow-4OJEPWNZ.js → slideshow-YTWATJRT.js} +1 -1
- package/dist/{snapshot-UUVNZOW5.js → snapshot-QMQOE2DD.js} +34 -34
- package/dist/{src-BSLKXEGX.js → src-2GMPFYHL.js} +11 -9
- package/dist/{src-KS3AWFGT.js → src-R55QLGWI.js} +13 -13
- package/dist/{staticProjectServer-2TTVGPQH.js → staticProjectServer-YH2RHYKW.js} +20 -20
- package/dist/{status-LXPGSSKY.js → status-PTKNQD2E.js} +2 -2
- package/dist/studio/assets/{hyperframes-player-DZ5JrMDg.js → hyperframes-player-_eMxRXF_.js} +3 -3
- package/dist/studio/assets/{index-BqFRhNZa.js → index-6okhHdnH.js} +1 -1
- package/dist/studio/assets/{index-BOs6C0aZ.js → index-CEq9KmY2.js} +1 -1
- package/dist/studio/assets/{index-D8W0a0Z9.js → index-bXzd7tvF.js} +135 -135
- package/dist/studio/index.html +1 -1
- package/dist/{studio-api-WYWF7XRC.js → studio-api-T2TS2CHL.js} +16 -14
- package/dist/{studioServer-3FG4YTP7.js → studioServer-Q4MT44LT.js} +50 -50
- package/dist/{system-OQLOGGPJ.js → system-OXRG57F2.js} +2 -2
- package/dist/{telemetry-PAOOB4T4.js → telemetry-V5JYZDS4.js} +5 -5
- package/dist/{timeline-JIIJKKPC.js → timeline-KTCTOKF5.js} +34 -25
- package/dist/{tokens-3QRAM75Z.js → tokens-ZHREZPK6.js} +2 -2
- package/dist/{transcribe-QSBP5MUG.js → transcribe-4QDEWCE6.js} +12 -12
- package/dist/{transcribe-SZB6UMXE.js → transcribe-CRAV4FU3.js} +13 -13
- package/dist/{updateCheck-V3DSB26K.js → updateCheck-E7RMSK3E.js} +2 -2
- package/dist/{upgrade-L5GISOEV.js → upgrade-27PFTDCV.js} +2 -2
- package/dist/{urlDownloader-52FERT4X.js → urlDownloader-EAF6PLUP.js} +9 -9
- package/dist/{validate-HVVLX7KO.js → validate-OKNFDBMG.js} +27 -27
- package/dist/{video-MEOWRMFG.js → video-IEVS4FIH.js} +10 -10
- package/package.json +3 -2
- package/dist/chunk-AUWHD7RA.js +0 -3753
- package/dist/studio/chunk-6JY3MTIX.js +0 -1204
- package/dist/studio/chunk-EEXSYY5F.js +0 -190
- package/dist/studio/chunk-NZPJUZKT.js +0 -1538
- package/dist/studio/chunk-PZ5AY32C.js +0 -10
- package/dist/studio/chunk-TP6D3U37.js +0 -845
- package/dist/studio/chunk-Y2OHHNM2.js +0 -970
- package/dist/studio/domEditingLayers-PTP2ICGM.js +0 -47
- package/dist/studio/index.css +0 -165
- package/dist/studio/index.d.ts +0 -4318
- package/dist/studio/index.js +0 -100952
- package/dist/studio/player.d.ts +0 -30
- package/dist/studio/player.js +0 -10
- package/dist/studio/styles/tailwind-preset.d.ts +0 -39
- package/dist/studio/styles/tailwind-preset.js +0 -50
- package/dist/studio/styles.css +0 -1
- package/dist/studio/ui.d.ts +0 -297
- package/dist/studio/ui.js +0 -66
|
@@ -11,15 +11,15 @@ import {
|
|
|
11
11
|
iterateFontFamilyDeclarations,
|
|
12
12
|
normalizeSystemFontPrimaryFamilies,
|
|
13
13
|
resolveFontFamilyDeclarationFamilies
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-FMNVTKX2.js";
|
|
15
15
|
import {
|
|
16
16
|
EncoderInterruptedError,
|
|
17
17
|
encoderFailureError,
|
|
18
18
|
prepareAnimatedGifInputs
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-4YVMMRHR.js";
|
|
20
20
|
import {
|
|
21
21
|
createStudioPositionSeekReapplyScript
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-EOOEC32M.js";
|
|
23
23
|
import {
|
|
24
24
|
BROWSER_GPU_NOT_SOFTWARE,
|
|
25
25
|
CaptureFailure,
|
|
@@ -105,6 +105,7 @@ import {
|
|
|
105
105
|
isNotMediaPayload,
|
|
106
106
|
isTransientBrowserError,
|
|
107
107
|
isVideoFrameFormat,
|
|
108
|
+
isVideoPastTimelineEnd,
|
|
108
109
|
mergeWorkerFrames,
|
|
109
110
|
muxVideoWithAudio,
|
|
110
111
|
normalizeObjectFit,
|
|
@@ -144,7 +145,7 @@ import {
|
|
|
144
145
|
validateEngineConfigSnapshot,
|
|
145
146
|
verifyDiskDrawElementSamples,
|
|
146
147
|
writeCapturedFrame
|
|
147
|
-
} from "./chunk-
|
|
148
|
+
} from "./chunk-JF5L5SQ6.js";
|
|
148
149
|
import {
|
|
149
150
|
assignBundledRuntimeCompositionIds,
|
|
150
151
|
buildVariablesByCompScript,
|
|
@@ -157,12 +158,12 @@ import {
|
|
|
157
158
|
isTemplateEntry,
|
|
158
159
|
parsesAsScript,
|
|
159
160
|
prepareFlattenedInnerRoot
|
|
160
|
-
} from "./chunk-
|
|
161
|
+
} from "./chunk-JBQJKC23.js";
|
|
161
162
|
import {
|
|
162
163
|
LOW_MEMORY_TOTAL_MB_THRESHOLD,
|
|
163
164
|
getCgroupMemoryLimitMb,
|
|
164
165
|
getSystemTotalMb
|
|
165
|
-
} from "./chunk-
|
|
166
|
+
} from "./chunk-JYVGYKXG.js";
|
|
166
167
|
import {
|
|
167
168
|
HF_VFX_ATTR,
|
|
168
169
|
MEDIA_START_BASIS_ATTR,
|
|
@@ -178,7 +179,7 @@ import {
|
|
|
178
179
|
resolveAbsoluteMediaStartSeconds,
|
|
179
180
|
resolveAuthoredTimingWindow,
|
|
180
181
|
toFps
|
|
181
|
-
} from "./chunk-
|
|
182
|
+
} from "./chunk-BAKPN2D2.js";
|
|
182
183
|
import {
|
|
183
184
|
COMPOSITION_SOURCE_URL,
|
|
184
185
|
HF_COLOR_GRADING_ATTR,
|
|
@@ -205,7 +206,7 @@ import {
|
|
|
205
206
|
shouldClampResolvedMediaDuration,
|
|
206
207
|
sourceTimeAt,
|
|
207
208
|
styleElementsFor
|
|
208
|
-
} from "./chunk-
|
|
209
|
+
} from "./chunk-Z6FLHIDV.js";
|
|
209
210
|
import {
|
|
210
211
|
MAX_AUDIO_GAIN
|
|
211
212
|
} from "./chunk-YA62XGXS.js";
|
|
@@ -219,7 +220,7 @@ import {
|
|
|
219
220
|
isAspectAgnosticResolutionAlias,
|
|
220
221
|
normalizeResolutionFlag,
|
|
221
222
|
suggestMatchingPreset
|
|
222
|
-
} from "./chunk-
|
|
223
|
+
} from "./chunk-LFNQDTSH.js";
|
|
223
224
|
import {
|
|
224
225
|
redactKnownPaths,
|
|
225
226
|
redactTelemetryString
|
|
@@ -229,7 +230,7 @@ import {
|
|
|
229
230
|
} from "./chunk-TWWSYAKJ.js";
|
|
230
231
|
import {
|
|
231
232
|
lintHyperframeHtml
|
|
232
|
-
} from "./chunk-
|
|
233
|
+
} from "./chunk-JDB65PPT.js";
|
|
233
234
|
import {
|
|
234
235
|
isUnresolvedAssetPlaceholder,
|
|
235
236
|
readProjectFile,
|
|
@@ -486,7 +487,7 @@ function buildVirtualTimeShim(options) {
|
|
|
486
487
|
const seedRandomFromFrame = options.seedRandomFromFrame === true;
|
|
487
488
|
const seededRandomBlock = seedRandomFromFrame ? String.raw`
|
|
488
489
|
// Seeded Math.random / crypto.getRandomValues, keyed by virtual time.
|
|
489
|
-
// Mulberry32
|
|
490
|
+
// Mulberry32: single uint32 state, deterministic, fast.
|
|
490
491
|
var rngState = 0;
|
|
491
492
|
function mulberry32() {
|
|
492
493
|
rngState |= 0; rngState = (rngState + 0x6D2B79F5) | 0;
|
|
@@ -497,7 +498,7 @@ function buildVirtualTimeShim(options) {
|
|
|
497
498
|
}
|
|
498
499
|
function reseedRngFromTime(ms) {
|
|
499
500
|
var ms32 = Math.max(0, Math.floor(Number(ms) || 0)) | 0;
|
|
500
|
-
// Knuth's multiplicative hash + golden-ratio offset
|
|
501
|
+
// Knuth's multiplicative hash + golden-ratio offset gives a well-
|
|
501
502
|
// distributed seed even for frame 0 (otherwise rngState=0 degenerates
|
|
502
503
|
// the PRNG's first few outputs).
|
|
503
504
|
rngState = (Math.imul(ms32, -1640531527) + 0x9E3779B9) | 0;
|
|
@@ -739,7 +740,7 @@ function buildRenderModeScript(fps) {
|
|
|
739
740
|
};
|
|
740
741
|
window.__playerReady = true;
|
|
741
742
|
// Media-fallback player has no timeline to bind, so render-ready is immediate.
|
|
742
|
-
// init.ts defers __renderReady until the timeline is bound
|
|
743
|
+
// init.ts defers __renderReady until the timeline is bound (a different runtime).
|
|
743
744
|
window.__renderReady = true;
|
|
744
745
|
return true;
|
|
745
746
|
}
|
|
@@ -2266,7 +2267,7 @@ function blitHdrVideoLayer(canvas, el, time, fps, hdrVideoFrameSources, hdrStart
|
|
|
2266
2267
|
if (matrix && !isTranslationOnly) {
|
|
2267
2268
|
if (clipped && log) {
|
|
2268
2269
|
log.debug(
|
|
2269
|
-
`HDR clip rect on affine-transformed element ${el.id}
|
|
2270
|
+
`HDR clip rect on affine-transformed element ${el.id}: clip not applied (affine scissor not yet supported)`
|
|
2270
2271
|
);
|
|
2271
2272
|
}
|
|
2272
2273
|
blitRgb48leAffine(
|
|
@@ -2323,7 +2324,7 @@ function blitHdrImageLayer(canvas, el, hdrImageBuffers, hdrImageTransferCache, w
|
|
|
2323
2324
|
return;
|
|
2324
2325
|
}
|
|
2325
2326
|
if (el.clipRect && log) {
|
|
2326
|
-
log.debug(`HDR clip rect on image element ${el.id}
|
|
2327
|
+
log.debug(`HDR clip rect on image element ${el.id}: clip not yet supported for images`);
|
|
2327
2328
|
}
|
|
2328
2329
|
try {
|
|
2329
2330
|
if (hdrPerf) hdrPerf.hdrImageLayerBlits += 1;
|
|
@@ -3475,12 +3476,13 @@ function buildRenderPerfSummary(input) {
|
|
|
3475
3476
|
// ../producer/src/services/render/stages/captureStreamingStage.ts
|
|
3476
3477
|
var DEFAULT_CAPTURE_STALL_MS = 6e4;
|
|
3477
3478
|
var DE_STALL_POLL_MS = 5e3;
|
|
3479
|
+
var STALL_ADVICE = "Chrome stopped answering. If another app is keeping the GPU or CPU busy (a 3D render, a game, another export), let it finish or render one job at a time, then retry.";
|
|
3478
3480
|
var ParallelCaptureStallError = class extends Error {
|
|
3479
3481
|
variant;
|
|
3480
3482
|
constructor(args) {
|
|
3481
3483
|
const phases = args.phaseSummary ? ` Last worker phases: ${args.phaseSummary}.` : "";
|
|
3482
3484
|
super(
|
|
3483
|
-
args.variant === "drain" ? `[Render] Parallel ${args.captureLabel} capture stalled: no frame progress for ${args.stallTimeoutMs}ms (stuck at ${args.lastCapturedFrames}/${args.totalFrames}).${phases}` : `[Render] Parallel ${args.captureLabel} capture stalled after ${args.stallTimeoutMs}ms with no frame progress (last frame ${args.lastCapturedFrames}/${args.totalFrames}); retrying on a fresh screenshot session.${phases}`
|
|
3485
|
+
(args.variant === "drain" ? `[Render] Parallel ${args.captureLabel} capture stalled: no frame progress for ${args.stallTimeoutMs}ms (stuck at ${args.lastCapturedFrames}/${args.totalFrames}).${phases}` : `[Render] Parallel ${args.captureLabel} capture stalled after ${args.stallTimeoutMs}ms with no frame progress (last frame ${args.lastCapturedFrames}/${args.totalFrames}); retrying on a fresh screenshot session.${phases}`) + ` ${STALL_ADVICE}`
|
|
3484
3486
|
);
|
|
3485
3487
|
this.name = "ParallelCaptureStallError";
|
|
3486
3488
|
this.variant = args.variant;
|
|
@@ -3498,12 +3500,13 @@ function captureModeLabel(mode) {
|
|
|
3498
3500
|
}
|
|
3499
3501
|
var SequentialCaptureStallError = class extends Error {
|
|
3500
3502
|
captureMode;
|
|
3501
|
-
constructor(
|
|
3503
|
+
constructor(session, stallTimeoutMs, frameIndex, totalFrames) {
|
|
3504
|
+
const step = session.captureStep ? ` while ${session.captureStep}` : "";
|
|
3502
3505
|
super(
|
|
3503
|
-
`[Render] Sequential ${captureModeLabel(captureMode)} capture stalled: no frame progress for ${stallTimeoutMs}ms (stuck at frame ${frameIndex}/${totalFrames})
|
|
3506
|
+
`[Render] Sequential ${captureModeLabel(session.captureMode)} capture stalled: no frame progress for ${stallTimeoutMs}ms (stuck at frame ${frameIndex}/${totalFrames}${step}). ` + STALL_ADVICE
|
|
3504
3507
|
);
|
|
3505
3508
|
this.name = "SequentialCaptureStallError";
|
|
3506
|
-
this.captureMode = captureMode;
|
|
3509
|
+
this.captureMode = session.captureMode;
|
|
3507
3510
|
}
|
|
3508
3511
|
};
|
|
3509
3512
|
function raceAgainstStall(promise, deadlineMs, input, signal) {
|
|
@@ -3512,9 +3515,9 @@ function raceAgainstStall(promise, deadlineMs, input, signal) {
|
|
|
3512
3515
|
() => {
|
|
3513
3516
|
reject(
|
|
3514
3517
|
signal?.aborted ? new Error(
|
|
3515
|
-
`[Render] Sequential ${captureModeLabel(input.captureMode)} capture aborted while a capture call was in flight (frame ${input.frameIndex}/${input.totalFrames}).`
|
|
3518
|
+
`[Render] Sequential ${captureModeLabel(input.session.captureMode)} capture aborted while a capture call was in flight (frame ${input.frameIndex}/${input.totalFrames}).`
|
|
3516
3519
|
) : new SequentialCaptureStallError(
|
|
3517
|
-
input.
|
|
3520
|
+
input.session,
|
|
3518
3521
|
input.stallTimeoutMs,
|
|
3519
3522
|
input.frameIndex,
|
|
3520
3523
|
input.totalFrames
|
|
@@ -3642,7 +3645,7 @@ async function runWorkerEncodePipelineLoop(session, totalFrames, job, currentEnc
|
|
|
3642
3645
|
const captureWithStallGuard = (idx, promise) => raceAgainstStall(
|
|
3643
3646
|
promise,
|
|
3644
3647
|
stallTimeoutMs - (Date.now() - lastProgressAt),
|
|
3645
|
-
{
|
|
3648
|
+
{ session, frameIndex: idx, totalFrames, stallTimeoutMs },
|
|
3646
3649
|
abortSignal
|
|
3647
3650
|
);
|
|
3648
3651
|
const drainPrev = async () => {
|
|
@@ -3996,7 +3999,7 @@ async function runCaptureStreamingStage(input) {
|
|
|
3996
3999
|
const { buffer } = await raceAgainstStall(
|
|
3997
4000
|
captureFrameToBuffer(session, i, time),
|
|
3998
4001
|
stallTimeoutMs - (Date.now() - lastProgressAt),
|
|
3999
|
-
{
|
|
4002
|
+
{ session, frameIndex: i, totalFrames, stallTimeoutMs },
|
|
4000
4003
|
abortSignal
|
|
4001
4004
|
);
|
|
4002
4005
|
await reorderBuffer.waitForFrame(i);
|
|
@@ -4085,7 +4088,7 @@ async function captureSegmentFrames(ctx, segment, encoder) {
|
|
|
4085
4088
|
ctx.captureFrame(ctx.session, i, time),
|
|
4086
4089
|
ctx.stallTimeoutMs - (Date.now() - lastProgressAt),
|
|
4087
4090
|
{
|
|
4088
|
-
|
|
4091
|
+
session: ctx.session,
|
|
4089
4092
|
frameIndex: i,
|
|
4090
4093
|
totalFrames: ctx.totalFrames,
|
|
4091
4094
|
stallTimeoutMs: ctx.stallTimeoutMs
|
|
@@ -4474,7 +4477,7 @@ async function validateCompletedSegments(manifest, expectedHash, probeFrames) {
|
|
|
4474
4477
|
function formatDowngradeWarning(outputFormat, forcedHdrWithoutSources) {
|
|
4475
4478
|
const hdrSourceReason = forcedHdrWithoutSources ? "HDR was forced without detected HDR sources" : "HDR source detected";
|
|
4476
4479
|
const formatReason = outputFormat === "hls" ? "HLS output is SDR-only (H.264 in MPEG-TS)" : "HDR + alpha is not supported";
|
|
4477
|
-
return `[Render] ${hdrSourceReason}, but format is "${outputFormat}"
|
|
4480
|
+
return `[Render] ${hdrSourceReason}, but format is "${outputFormat}", so falling back to SDR. ${formatReason}. Use --format mp4 for HDR10 output.`;
|
|
4478
4481
|
}
|
|
4479
4482
|
function findRenderHdrAutoPromotionTrigger(input) {
|
|
4480
4483
|
for (const extracted of input.extractionResult?.extracted ?? []) {
|
|
@@ -4487,12 +4490,12 @@ function findRenderHdrAutoPromotionTrigger(input) {
|
|
|
4487
4490
|
function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources) {
|
|
4488
4491
|
if (forcedHdrWithoutSources) {
|
|
4489
4492
|
input.log.warn(
|
|
4490
|
-
"[Render] HDR forced by --hdr flag, but no HDR sources were detected
|
|
4493
|
+
"[Render] HDR forced by --hdr flag, but no HDR sources were detected, defaulting to HLG. SDR-only compositions may look perceptually wrong on HDR displays."
|
|
4491
4494
|
);
|
|
4492
4495
|
}
|
|
4493
4496
|
if (!effectiveHdr) {
|
|
4494
4497
|
input.log.info(
|
|
4495
|
-
hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected
|
|
4498
|
+
hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected, rendering SDR"
|
|
4496
4499
|
);
|
|
4497
4500
|
return;
|
|
4498
4501
|
}
|
|
@@ -4507,9 +4510,9 @@ function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources)
|
|
|
4507
4510
|
);
|
|
4508
4511
|
return;
|
|
4509
4512
|
}
|
|
4510
|
-
const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected
|
|
4513
|
+
const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected, defaulting to HLG)" : "forced by --hdr flag";
|
|
4511
4514
|
input.log.info(
|
|
4512
|
-
`[Render] HDR ${reason}
|
|
4515
|
+
`[Render] HDR ${reason}, output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
|
|
4513
4516
|
);
|
|
4514
4517
|
}
|
|
4515
4518
|
function resolveEffectiveHdrMode(input) {
|
|
@@ -4596,14 +4599,14 @@ function resolveRenderWorkerCount(totalFrames, requestedWorkers, cfg, compiled,
|
|
|
4596
4599
|
const reasonCodes = new Set(compiled.renderModeHints.reasons.map((r) => r.code));
|
|
4597
4600
|
if (reasonCodes.has("htmlInCanvas")) {
|
|
4598
4601
|
log.warn(
|
|
4599
|
-
"[Render] html-in-canvas (drawElementImage) detected
|
|
4602
|
+
"[Render] html-in-canvas (drawElementImage) detected, pinning to 1 worker (Chrome concurrency limitation).",
|
|
4600
4603
|
{ requestedWorkers }
|
|
4601
4604
|
);
|
|
4602
4605
|
return 1;
|
|
4603
4606
|
}
|
|
4604
4607
|
if (cfg.lowMemoryMode && requestedWorkers === void 0) {
|
|
4605
4608
|
log.info(
|
|
4606
|
-
"[Render] Low-memory profile
|
|
4609
|
+
"[Render] Low-memory profile, pinning to 1 capture worker (auto-worker calibration skipped)."
|
|
4607
4610
|
);
|
|
4608
4611
|
return 1;
|
|
4609
4612
|
}
|
|
@@ -5227,7 +5230,7 @@ function assertVideoFrameCoverage(reports, threshold) {
|
|
|
5227
5230
|
const thresholdPct = (threshold * 100).toFixed(1);
|
|
5228
5231
|
const suffix = sorted.length > 1 ? ` (+${sorted.length - 1} more clip(s) below threshold)` : "";
|
|
5229
5232
|
throw new VideoFrameCoverageError(
|
|
5230
|
-
`Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank
|
|
5233
|
+
`Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank, so the render is aborted to prevent shipping a wrong MP4.${suffix} Set HF_VIDEO_COVERAGE_THRESHOLD=0 to disable this gate.`,
|
|
5231
5234
|
{ threshold, worst, failedReports: sorted }
|
|
5232
5235
|
);
|
|
5233
5236
|
}
|
|
@@ -5334,7 +5337,7 @@ function collectRenderMedia(html) {
|
|
|
5334
5337
|
}
|
|
5335
5338
|
|
|
5336
5339
|
// ../core/dist/generated/position-edits-render-inline.js
|
|
5337
|
-
var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function
|
|
5340
|
+
var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function k(e){return N(e)&&(e.namespaceURI===W||e.namespaceURI==="http://www.w3.org/2000/svg")}var w="data-hf-edit-base-x",y="data-hf-edit-base-y",m="data-hf-edit-original-translate",_=e=>{let t=parseFloat(e??"");return Number.isFinite(t)?t:0},O=e=>{let t=[],o=0,r="";for(let s of e.trim())s==="("&&(o+=1),s===")"&&(o=Math.max(0,o-1)),/\\s/.test(s)&&o===0?(r&&t.push(r),r=""):r+=s;return r&&t.push(r),t},L=/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/,E=(e,t)=>L.test(e)&&L.test(t)?`${parseFloat(e)+parseFloat(t)}px`:`calc(${e} + ${t})`,V=(e,t,o)=>{if(!e||e==="none")return`${t} ${o}`;let[r,s,a]=O(e);if(r===void 0)return`${t} ${o}`;if(s===void 0)return`${E(r,t)} ${o}`;let i=a===void 0?"":` ${a}`;return`${E(r,t)} ${E(s,o)}${i}`},j=e=>{try{e.ownerDocument.defaultView?.gsap?.getProperty?.(e,"x")}catch{}},C=e=>{let t=e.style.getPropertyValue("translate").trim();if(t)return t==="none"?"":t;try{let o=e.ownerDocument.defaultView,r=o?o.getComputedStyle(e).getPropertyValue("translate").trim():"";return r==="none"?"":r}catch{return""}},b=new WeakMap;function G(e,t){let o=b.get(e);if(!t?.force&&o!==void 0&&e.style.getPropertyValue("translate")!==o){R("position_edit_fold_skipped",{hfId:e.getAttribute("data-hf-id")});return}let r=_(e.getAttribute("data-x"))-_(e.getAttribute(w)),s=_(e.getAttribute("data-y"))-_(e.getAttribute(y));e.hasAttribute(m)||e.setAttribute(m,C(e)),o===void 0&&j(e);let a=e.getAttribute(m)??"",i=V(a,`${r}px`,`${s}px`);e.style.setProperty("translate",i),b.set(e,e.style.getPropertyValue("translate"))}function S(e,t){let o=e.querySelectorAll(`[${m}]:not([${w}]):not([${y}])`);for(let a=0;a<o.length;a++){let i=o[a];if(i===void 0||!k(i))continue;let g=i.getAttribute(m)??"";g===""?i.style.removeProperty("translate"):i.style.setProperty("translate",g),i.removeAttribute(m),b.delete(i)}let r=e.querySelectorAll(`[${w}], [${y}]`),s=0;for(let a=0;a<r.length;a++){let i=r[a];i===void 0||!k(i)||(G(i,t),s+=1)}return s}var $="__hfPositionEditsSeekReapplyWrapped",D=new WeakSet,M=new WeakMap,H=new WeakMap;function F(e){let t=e,o=()=>{try{S(t.document)}catch{}},r=n=>typeof n=="function"&&(D.has(n)||!!n[$]),s=n=>{D.add(n);try{Object.defineProperty(n,$,{value:!0})}catch{}},a=n=>{if(typeof n!="function"||r(n))return n;let l=function(...u){let d=n.apply(this,u);return o(),d};return s(l),l},i=(n,l)=>{let u=M.get(n);if(u?.has(l))return!0;let d=Object.getOwnPropertyDescriptor(n,l);if(d?.configurable===!1){let c=n[l];return typeof c=="function"&&(n[l]=a(c),o()),!1}let p=n[l],f=d?.set;return Object.defineProperty(n,l,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>p,set:c=>{p=a(c),f?.call(n,c)}}),p=a(p),u??(u=new Set),u.add(l),M.set(n,u),o(),!0},g=(n,l)=>{let u=H.get(t),d=Object.getOwnPropertyDescriptor(t,n);if(!u?.has(n)){if(d?.configurable===!1){let c=t[n];return c?i(c,l):!1}let f=t[n];Object.defineProperty(t,n,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>f,set:c=>{f=c,f&&i(f,l)}}),u??(u=new Set),u.add(n),H.set(t,u)}let p=t[n];return p?i(p,l):!1},h=()=>{let n=g("__hf","seek"),l=g("__player","renderSeek");return n&&l};if(h())return;let v=120,A=t.setInterval(()=>{if(h()){t.clearInterval(A);return}v-=1,v<=0&&t.clearInterval(A)},50)}function I(){document.querySelector(`[${w}], [${y}]`)&&(S(document),F(window))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I,{once:!0}):I();})();\n';
|
|
5338
5341
|
function getPositionEditsRenderScript() {
|
|
5339
5342
|
return POSITION_EDITS_RENDER_IIFE;
|
|
5340
5343
|
}
|
|
@@ -5724,7 +5727,7 @@ async function resolveMediaDuration(src, mediaStart, playbackRate, baseDir, down
|
|
|
5724
5727
|
if (tagName !== "video") {
|
|
5725
5728
|
if (error instanceof NotMediaPayloadError) {
|
|
5726
5729
|
log?.warn(
|
|
5727
|
-
`[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file
|
|
5730
|
+
`[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file, so the element is dropped from the render. Point it at a rendered media file.`
|
|
5728
5731
|
);
|
|
5729
5732
|
}
|
|
5730
5733
|
return { duration: null, resolvedPath: filePath };
|
|
@@ -5813,7 +5816,7 @@ async function compileHtmlFile(html, baseDir, downloadDir, log) {
|
|
|
5813
5816
|
if (r.maxDuration != null && shouldClampResolvedMediaDuration(r.tagName, r.duration, r.maxDuration)) {
|
|
5814
5817
|
clampList.push({ id: r.id, duration: r.maxDuration });
|
|
5815
5818
|
log?.warn(
|
|
5816
|
-
`[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s
|
|
5819
|
+
`[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s, so the slot is shortened to the media length. Set data-duration to ~${r.maxDuration.toFixed(2)}s, trim data-media-start, or use a longer/looping source if that isn't intended.`
|
|
5817
5820
|
);
|
|
5818
5821
|
}
|
|
5819
5822
|
}
|
|
@@ -6202,7 +6205,7 @@ ${safeText}
|
|
|
6202
6205
|
} else {
|
|
6203
6206
|
if (download.reason instanceof ScriptIntegrityError) throw download.reason;
|
|
6204
6207
|
defaultLogger.warn(
|
|
6205
|
-
`[Compiler] WARNING: Failed to download CDN script: ${src}
|
|
6208
|
+
`[Compiler] WARNING: Failed to download CDN script: ${src} (${download.reason}). The render may fail if this script is required (e.g. GSAP). Consider bundling it locally in your project.`
|
|
6206
6209
|
);
|
|
6207
6210
|
}
|
|
6208
6211
|
}
|
|
@@ -6254,7 +6257,7 @@ function collectExternalAssets(html, projectDir) {
|
|
|
6254
6257
|
}
|
|
6255
6258
|
if (externalAssets.size > 0) {
|
|
6256
6259
|
defaultLogger.info(
|
|
6257
|
-
`[Compiler] Found ${externalAssets.size} asset(s) outside project directory
|
|
6260
|
+
`[Compiler] Found ${externalAssets.size} asset(s) outside project directory, will copy to render output`
|
|
6258
6261
|
);
|
|
6259
6262
|
}
|
|
6260
6263
|
return {
|
|
@@ -6279,7 +6282,7 @@ async function downloadAndRewriteUrls(urlSet, html, remoteDir, warnLabel, logLab
|
|
|
6279
6282
|
urlToLocal.set(url, localPath);
|
|
6280
6283
|
} catch (err) {
|
|
6281
6284
|
const identity = safeDownloadUrlIdentity(url);
|
|
6282
|
-
defaultLogger.warn(`[Compiler] ${warnLabel}
|
|
6285
|
+
defaultLogger.warn(`[Compiler] ${warnLabel}, using original URL as fallback.`, {
|
|
6283
6286
|
urlFingerprint: identity.urlFingerprint,
|
|
6284
6287
|
host: identity.host,
|
|
6285
6288
|
error: err instanceof Error ? err.message : String(err)
|
|
@@ -6372,7 +6375,7 @@ async function fetchExternalStylesheetCss(href) {
|
|
|
6372
6375
|
timeoutMs: 15e3
|
|
6373
6376
|
});
|
|
6374
6377
|
} catch (err) {
|
|
6375
|
-
defaultLogger.warn("[Compiler] External stylesheet fetch failed
|
|
6378
|
+
defaultLogger.warn("[Compiler] External stylesheet fetch failed, preserving link tag.", {
|
|
6376
6379
|
urlFingerprint: identity.urlFingerprint,
|
|
6377
6380
|
host: identity.host,
|
|
6378
6381
|
error: err instanceof Error ? err.message : String(err)
|
|
@@ -6507,7 +6510,7 @@ async function readLocalFont(absPath) {
|
|
|
6507
6510
|
return { kind: "inline", buffer: Buffer.concat(chunks, totalBytes) };
|
|
6508
6511
|
}
|
|
6509
6512
|
async function embedLocalFontFaces(html, projectDir) {
|
|
6510
|
-
const { fontToDataUri: toDataUri } = await import("./deterministicFonts-
|
|
6513
|
+
const { fontToDataUri: toDataUri } = await import("./deterministicFonts-C5JQLCTS.js");
|
|
6511
6514
|
const styleBlockRe = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
|
|
6512
6515
|
const fontFaceRe = /@font-face\s*\{([^}]*)\}/gi;
|
|
6513
6516
|
let result = html;
|
|
@@ -7016,12 +7019,15 @@ async function resolveCompositionDurations(page, unresolved) {
|
|
|
7016
7019
|
const resolved = [];
|
|
7017
7020
|
for (const id of compIds) {
|
|
7018
7021
|
const tl = timelines[id];
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7022
|
+
let dur = 0;
|
|
7023
|
+
try {
|
|
7024
|
+
dur = typeof tl?.duration === "function" ? Number(tl.duration()) : 0;
|
|
7025
|
+
} catch {
|
|
7026
|
+
dur = 0;
|
|
7027
|
+
}
|
|
7028
|
+
if (dur > 0) {
|
|
7029
|
+
resolved.push({ id, duration: dur, source: "__timelines" });
|
|
7030
|
+
continue;
|
|
7025
7031
|
}
|
|
7026
7032
|
const el = document.getElementById(id);
|
|
7027
7033
|
if (el) {
|
|
@@ -7117,28 +7123,28 @@ async function runCompileStage(input) {
|
|
|
7117
7123
|
cfg.useDrawElement = false;
|
|
7118
7124
|
deCompileGate = "3d";
|
|
7119
7125
|
log.info(
|
|
7120
|
-
"[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility)
|
|
7126
|
+
"[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility), so disabling drawElementImage for this render. Capture uses the platform's baseline route."
|
|
7121
7127
|
);
|
|
7122
7128
|
}
|
|
7123
7129
|
if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_BLEND !== "true" && compiled.usesMixBlendMode) {
|
|
7124
7130
|
cfg.useDrawElement = false;
|
|
7125
7131
|
deCompileGate = "mix_blend_mode";
|
|
7126
7132
|
log.info(
|
|
7127
|
-
"[Render] Fast capture: composition uses mix-blend-mode
|
|
7133
|
+
"[Render] Fast capture: composition uses mix-blend-mode, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
|
|
7128
7134
|
);
|
|
7129
7135
|
}
|
|
7130
7136
|
if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_ANCESTOR_BG !== "true" && compiled.hasAncestorBackgroundImage) {
|
|
7131
7137
|
cfg.useDrawElement = false;
|
|
7132
7138
|
deCompileGate = "ancestor_background_image";
|
|
7133
7139
|
log.info(
|
|
7134
|
-
"[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image
|
|
7140
|
+
"[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
|
|
7135
7141
|
);
|
|
7136
7142
|
}
|
|
7137
7143
|
if (cfg.useDrawElement && process.env.PRODUCER_EXPERIMENTAL_FAST_CAPTURE !== "true" && compiled.hasShaderTransitions) {
|
|
7138
7144
|
cfg.useDrawElement = false;
|
|
7139
7145
|
deCompileGate = "shader_transitions";
|
|
7140
7146
|
log.info(
|
|
7141
|
-
"[Render] Fast capture: composition uses shader transitions
|
|
7147
|
+
"[Render] Fast capture: composition uses shader transitions, so disabling drawElementImage so page-side compositing stays available."
|
|
7142
7148
|
);
|
|
7143
7149
|
}
|
|
7144
7150
|
if (!cfg.useDrawElement && cfg.pageSideCompositingAutoDisabled) {
|
|
@@ -7453,7 +7459,7 @@ async function runProbeStage(input) {
|
|
|
7453
7459
|
} else {
|
|
7454
7460
|
beginFrameStalled = true;
|
|
7455
7461
|
log.warn(
|
|
7456
|
-
"[Render] BeginFrame liveness probe timed out
|
|
7462
|
+
"[Render] BeginFrame liveness probe timed out: this composition stalls BeginFrame on this host (SwiftShader heavy-layer pattern). Relaunching the probe browser in screenshot capture mode; the render will use screenshot capture throughout.",
|
|
7457
7463
|
{ probeTimeoutMs }
|
|
7458
7464
|
);
|
|
7459
7465
|
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
@@ -7667,7 +7673,7 @@ async function runProbeStage(input) {
|
|
|
7667
7673
|
video.start = win.visibleStart;
|
|
7668
7674
|
video.end = win.visibleEnd;
|
|
7669
7675
|
log.info(
|
|
7670
|
-
`[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s
|
|
7676
|
+
`[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s to ${win.visibleEnd.toFixed(2)}s`
|
|
7671
7677
|
);
|
|
7672
7678
|
}
|
|
7673
7679
|
}
|
|
@@ -7715,7 +7721,7 @@ async function runProbeStage(input) {
|
|
|
7715
7721
|
});
|
|
7716
7722
|
if (!timelinesInfo.gsapLoaded) {
|
|
7717
7723
|
diagnostics.push(
|
|
7718
|
-
"GSAP is not loaded
|
|
7724
|
+
"GSAP is not loaded. The CDN script may have failed to download. Bundle GSAP locally in your project instead of using a CDN <script src>."
|
|
7719
7725
|
);
|
|
7720
7726
|
} else if (timelinesInfo.timelineKeys.length === 0) {
|
|
7721
7727
|
diagnostics.push(
|
|
@@ -7732,10 +7738,10 @@ async function runProbeStage(input) {
|
|
|
7732
7738
|
log.warn("Failed to gather browser diagnostics for zero-duration composition", {
|
|
7733
7739
|
error: err instanceof Error ? err.message : String(err)
|
|
7734
7740
|
});
|
|
7735
|
-
diagnostics.push("(Could not gather browser diagnostics
|
|
7741
|
+
diagnostics.push("(Could not gather browser diagnostics. The page may have crashed.)");
|
|
7736
7742
|
}
|
|
7737
7743
|
const hint = diagnostics.length > 0 ? "\n\nDiagnostics:\n - " + diagnostics.join("\n - ") : "\n\nCheck that GSAP timelines are registered on window.__timelines.";
|
|
7738
|
-
throw new Error("Composition duration is 0
|
|
7744
|
+
throw new Error("Composition duration is 0, so this would produce a black video." + hint);
|
|
7739
7745
|
}
|
|
7740
7746
|
if (probeSession) {
|
|
7741
7747
|
const failedRequests = probeSession.browserConsoleBuffer.filter(isActionableProbeFailure);
|
|
@@ -7791,7 +7797,7 @@ function validateNoGpuEncode(config) {
|
|
|
7791
7797
|
if (config.useGpu === true) {
|
|
7792
7798
|
throw new PlanValidationError(
|
|
7793
7799
|
BROWSER_GPU_NOT_SOFTWARE,
|
|
7794
|
-
"[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default)
|
|
7800
|
+
"[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default): software libx264/libx265 is the only supported encoder in distributed mode."
|
|
7795
7801
|
);
|
|
7796
7802
|
}
|
|
7797
7803
|
if (config.browserGpuMode !== void 0 && config.browserGpuMode !== "software") {
|
|
@@ -8050,6 +8056,9 @@ async function runExtractVideosStage(input) {
|
|
|
8050
8056
|
} = input;
|
|
8051
8057
|
const stage2Start = Date.now();
|
|
8052
8058
|
const extractionPolicy = resolveVideoExtractionPolicy();
|
|
8059
|
+
composition.videos = composition.videos.filter(
|
|
8060
|
+
(video) => !isVideoPastTimelineEnd(video, composition.duration)
|
|
8061
|
+
);
|
|
8053
8062
|
let frameLookup = null;
|
|
8054
8063
|
let extractionResult = null;
|
|
8055
8064
|
let failureToEnforce = null;
|
|
@@ -8136,7 +8145,8 @@ async function runExtractVideosStage(input) {
|
|
|
8136
8145
|
timelineEnd: composition.duration,
|
|
8137
8146
|
maxTransientRetries: extractionPolicy.maxTransientRetries,
|
|
8138
8147
|
collectProbeFailures: extractionPolicy.failureMode === "enforce",
|
|
8139
|
-
deferRangeExtraction
|
|
8148
|
+
deferRangeExtraction,
|
|
8149
|
+
contentKeyedDirs: [join15(compiledDir, REMOTE_MEDIA_SUBDIR)]
|
|
8140
8150
|
},
|
|
8141
8151
|
abortSignal,
|
|
8142
8152
|
cfg,
|
|
@@ -10698,7 +10708,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
|
|
|
10698
10708
|
const madeProgress = captureAttemptMadeProgress(frameCount, remainingCount);
|
|
10699
10709
|
if (!madeProgress) {
|
|
10700
10710
|
options.log.warn(
|
|
10701
|
-
"[Render] Capture attempt made no forward progress; composition is likely structurally broken
|
|
10711
|
+
"[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
|
|
10702
10712
|
{ attempt, frameCount, remainingCount, workers: currentWorkers }
|
|
10703
10713
|
);
|
|
10704
10714
|
}
|
|
@@ -10767,7 +10777,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
|
|
|
10767
10777
|
}
|
|
10768
10778
|
if (!madeProgress) {
|
|
10769
10779
|
options.log.warn(
|
|
10770
|
-
"[Render] Capture attempt made no forward progress; composition is likely structurally broken
|
|
10780
|
+
"[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
|
|
10771
10781
|
{ attempt, frameCount, remainingCount, workers: currentWorkers }
|
|
10772
10782
|
);
|
|
10773
10783
|
}
|
|
@@ -11230,7 +11240,7 @@ async function executeRenderJob(job, projectDir, outputPath, progressSink, abort
|
|
|
11230
11240
|
execution.defer("remove workDir", () => {
|
|
11231
11241
|
if (job.config.debug) return;
|
|
11232
11242
|
if (job.status === "complete" && process.env.KEEP_TEMP === "1") {
|
|
11233
|
-
log.info("KEEP_TEMP=1
|
|
11243
|
+
log.info("KEEP_TEMP=1, leaving workDir on disk for inspection", { workDir });
|
|
11234
11244
|
return;
|
|
11235
11245
|
}
|
|
11236
11246
|
rmSync8(workDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
|
|
@@ -11467,7 +11477,7 @@ async function executeRenderPipeline(input) {
|
|
|
11467
11477
|
captureForceScreenshot = true;
|
|
11468
11478
|
updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
|
|
11469
11479
|
log.info(
|
|
11470
|
-
"[Render] Low-memory render profile active
|
|
11480
|
+
"[Render] Low-memory render profile active: screenshot capture, auto-worker calibration skipped" + (job.config.workers === void 0 ? ", pinned to 1 worker" : "") + ". Override with --no-low-memory-mode or PRODUCER_LOW_MEMORY_MODE=false.",
|
|
11471
11481
|
{ totalMemMb: getSystemTotalMb(), thresholdMb: LOW_MEMORY_TOTAL_MB_THRESHOLD }
|
|
11472
11482
|
);
|
|
11473
11483
|
}
|
|
@@ -12035,7 +12045,7 @@ async function executeRenderPipeline(input) {
|
|
|
12035
12045
|
cfg.useDrawElement = false;
|
|
12036
12046
|
deClampReason = workerCount > 1 ? "parallel" : "disk_path";
|
|
12037
12047
|
log.info(
|
|
12038
|
-
"[Render] Fast capture: default-on drawElement disabled for this render
|
|
12048
|
+
"[Render] Fast capture: default-on drawElement disabled for this render: " + (workerCount > 1 ? "parallel capture" : "the disk capture path") + " has no runtime self-verification. Set PRODUCER_EXPERIMENTAL_FAST_CAPTURE=true to override."
|
|
12039
12049
|
);
|
|
12040
12050
|
if (probeSession && probeSession.captureMode === "drawelement") {
|
|
12041
12051
|
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
@@ -12131,7 +12141,7 @@ async function executeRenderPipeline(input) {
|
|
|
12131
12141
|
});
|
|
12132
12142
|
updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
|
|
12133
12143
|
log.info(
|
|
12134
|
-
`[Render] Page-side compositing enabled
|
|
12144
|
+
`[Render] Page-side compositing enabled, bypassing Node-side layered shader-blend path. Engine will capture one ${needsAlpha ? "RGBA PNG" : "opaque RGB"} screenshot per output frame.`
|
|
12135
12145
|
);
|
|
12136
12146
|
}
|
|
12137
12147
|
const useLayeredComposite = !usePageSideCompositingForTransitions && shouldUseLayeredComposite({
|
|
@@ -12628,7 +12638,7 @@ async function executeRenderPipeline(input) {
|
|
|
12628
12638
|
cfg.useDrawElement = false;
|
|
12629
12639
|
deClampReason = deClampReason ?? "disk_path";
|
|
12630
12640
|
log.info(
|
|
12631
|
-
"[Render] Fast capture: drawElement disabled for the disk fallback
|
|
12641
|
+
"[Render] Fast capture: drawElement disabled for the disk fallback: streaming encoder spawn failed and the disk path has no runtime self-verification."
|
|
12632
12642
|
);
|
|
12633
12643
|
if (probeSession && probeSession.captureMode === "drawelement") {
|
|
12634
12644
|
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
@@ -13167,10 +13177,10 @@ function validateJsonSafeValue(value, field) {
|
|
|
13167
13177
|
walkVariables(value, field, /* @__PURE__ */ new WeakSet());
|
|
13168
13178
|
}
|
|
13169
13179
|
var LEAF_REJECTIONS = {
|
|
13170
|
-
undefined: "undefined leaves are silently dropped by JSON.stringify
|
|
13180
|
+
undefined: "undefined leaves are silently dropped by JSON.stringify. Use null if you mean an absent value",
|
|
13171
13181
|
function: "functions are not JSON-serializable",
|
|
13172
13182
|
symbol: "Symbols are not JSON-serializable",
|
|
13173
|
-
bigint: "BigInt values throw at JSON.stringify
|
|
13183
|
+
bigint: "BigInt values throw at JSON.stringify. Encode as a string if you need 64-bit integers"
|
|
13174
13184
|
};
|
|
13175
13185
|
function walkVariables(value, path, seen) {
|
|
13176
13186
|
const t = typeof value;
|
|
@@ -13191,7 +13201,7 @@ function walkVariables(value, path, seen) {
|
|
|
13191
13201
|
if (seen.has(value)) {
|
|
13192
13202
|
throw new InvalidConfigError(
|
|
13193
13203
|
path,
|
|
13194
|
-
"circular reference detected
|
|
13204
|
+
"circular reference detected: JSON.stringify cannot serialize cycles"
|
|
13195
13205
|
);
|
|
13196
13206
|
}
|
|
13197
13207
|
seen.add(value);
|
|
@@ -13853,7 +13863,7 @@ function validateOutputResolutionOverride(body) {
|
|
|
13853
13863
|
return `Invalid outputResolution "${body.outputResolution}". Must be one of: landscape, portrait, landscape-4k, portrait-4k, square, square-4k (aliases: 1080p, 4k, \u2026).`;
|
|
13854
13864
|
}
|
|
13855
13865
|
if (normalized !== void 0 && (body.format === "webm" || body.format === "mov")) {
|
|
13856
|
-
return `outputResolution is not supported with format "${body.format}"
|
|
13866
|
+
return `outputResolution is not supported with format "${body.format}": the alpha (webm/mov) capture path can't supersample. Use format "mp4", or omit outputResolution to render at the composition's native dimensions.`;
|
|
13857
13867
|
}
|
|
13858
13868
|
return void 0;
|
|
13859
13869
|
}
|
|
@@ -14300,7 +14310,7 @@ function startServer(options = {}) {
|
|
|
14300
14310
|
});
|
|
14301
14311
|
async function shutdown(signal) {
|
|
14302
14312
|
log.info(`Received ${signal}, shutting down`);
|
|
14303
|
-
const { drainBrowserPool } = await import("./src-
|
|
14313
|
+
const { drainBrowserPool } = await import("./src-2GMPFYHL.js");
|
|
14304
14314
|
await drainBrowserPool().catch(() => {
|
|
14305
14315
|
});
|
|
14306
14316
|
const handle = await Promise.race([
|
|
@@ -14560,7 +14570,7 @@ function collectPlanAssetShas(planDir) {
|
|
|
14560
14570
|
}
|
|
14561
14571
|
if (compositionHtml === null) {
|
|
14562
14572
|
throw new Error(
|
|
14563
|
-
`[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH}
|
|
14573
|
+
`[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH} (upstream compile stage did not materialize the expected file).`
|
|
14564
14574
|
);
|
|
14565
14575
|
}
|
|
14566
14576
|
return { compositionHtml, assets };
|
|
@@ -15139,7 +15149,7 @@ var PlanTooLargeError = class extends Error {
|
|
|
15139
15149
|
const breakdownSuffix = breakdown ? ` Breakdown: video-frames=${formatBytes(breakdown.videoFramesBytes)}, compiled=${formatBytes(breakdown.compiledBytes)} (source-media=${formatBytes(breakdown.sourceMediaBytes)}), audio=${formatBytes(breakdown.audioBytes)}, metadata=${formatBytes(breakdown.metadataBytes)}, other=${formatBytes(breakdown.otherBytes)}, files=${breakdown.fileCount}.` : "";
|
|
15140
15150
|
const observationSuffix = observedAt ? ` Observed at ${observedAt}.` : "";
|
|
15141
15151
|
super(
|
|
15142
|
-
`[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`)
|
|
15152
|
+
`[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`), which has no planDir size cap.` + observationSuffix + breakdownSuffix
|
|
15143
15153
|
);
|
|
15144
15154
|
this.name = "PlanTooLargeError";
|
|
15145
15155
|
this.sizeBytes = sizeBytes;
|
|
@@ -15156,7 +15166,7 @@ var FormatNotSupportedInDistributedError = class extends Error {
|
|
|
15156
15166
|
reason;
|
|
15157
15167
|
constructor(format, reason) {
|
|
15158
15168
|
super(
|
|
15159
|
-
`[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`)
|
|
15169
|
+
`[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`), which has full format support, or pick a distributed-supported format: mp4 SDR, mov ProRes 4444, png-sequence, or webm VP9.`
|
|
15160
15170
|
);
|
|
15161
15171
|
this.name = "FormatNotSupportedInDistributedError";
|
|
15162
15172
|
this.format = format;
|
|
@@ -15245,7 +15255,7 @@ async function readFontSnapshotSha() {
|
|
|
15245
15255
|
const data = module.EMBEDDED_FONT_DATA;
|
|
15246
15256
|
if (!data || typeof data !== "object") {
|
|
15247
15257
|
throw new Error(
|
|
15248
|
-
"[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data
|
|
15258
|
+
"[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data. Was `bun run build:fonts` run?"
|
|
15249
15259
|
);
|
|
15250
15260
|
}
|
|
15251
15261
|
const dataObj = data;
|
|
@@ -15295,7 +15305,7 @@ function resolveEncoderTriple(config) {
|
|
|
15295
15305
|
}
|
|
15296
15306
|
if (config.codec !== void 0) {
|
|
15297
15307
|
throw new Error(
|
|
15298
|
-
`[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats
|
|
15308
|
+
`[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats: mov is always ProRes 4444, webm is always libvpx-vp9, and png-sequence has no encoder.`
|
|
15299
15309
|
);
|
|
15300
15310
|
}
|
|
15301
15311
|
return resolveNonMp4EncoderTriple(config.format, config.quality ?? "standard");
|
|
@@ -15485,7 +15495,7 @@ async function buildLocalExecutionPlan(projectDir, config, executionPlanDir, opt
|
|
|
15485
15495
|
if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
|
|
15486
15496
|
if (probeResult.probeSession) {
|
|
15487
15497
|
try {
|
|
15488
|
-
const { closeCaptureSession: closeCaptureSession2 } = await import("./src-
|
|
15498
|
+
const { closeCaptureSession: closeCaptureSession2 } = await import("./src-2GMPFYHL.js");
|
|
15489
15499
|
await closeCaptureSession2(probeResult.probeSession);
|
|
15490
15500
|
} catch (err) {
|
|
15491
15501
|
log.warn("[plan] probe session close failed", {
|