@hyperframes/engine 0.8.145 → 0.8.146
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/config.d.ts +0 -1
- package/dist/config.js +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/services/__fixtures__/jpeg.d.ts +0 -1
- package/dist/services/__fixtures__/jpeg.js +0 -1
- package/dist/services/audioFxRender.d.ts +0 -1
- package/dist/services/audioFxRender.js +0 -1
- package/dist/services/audioMixer.d.ts +0 -1
- package/dist/services/audioMixer.js +0 -1
- package/dist/services/audioMixer.types.d.ts +0 -1
- package/dist/services/audioMixer.types.js +0 -1
- package/dist/services/audioVolumeEnvelope.d.ts +0 -1
- package/dist/services/audioVolumeEnvelope.js +0 -1
- package/dist/services/browserLeasePool.d.ts +0 -1
- package/dist/services/browserLeasePool.js +0 -1
- package/dist/services/browserManager.d.ts +0 -1
- package/dist/services/browserManager.js +2 -3
- package/dist/services/captureFailure.d.ts +0 -1
- package/dist/services/captureFailure.js +0 -1
- package/dist/services/captureWarning.d.ts +0 -1
- package/dist/services/captureWarning.js +0 -1
- package/dist/services/chromeHostCeiling.d.ts +0 -1
- package/dist/services/chromeHostCeiling.js +0 -1
- package/dist/services/chromeMemorySampler.d.ts +0 -1
- package/dist/services/chromeMemorySampler.js +0 -1
- package/dist/services/chunkEncoder.d.ts +0 -1
- package/dist/services/chunkEncoder.js +0 -1
- package/dist/services/chunkEncoder.types.d.ts +0 -1
- package/dist/services/chunkEncoder.types.js +0 -1
- package/dist/services/drawElementCaptureError.d.ts +0 -1
- package/dist/services/drawElementCaptureError.js +0 -1
- package/dist/services/drawElementService.d.ts +0 -1
- package/dist/services/drawElementService.js +1 -2
- package/dist/services/extractedFrameIndex.d.ts +0 -1
- package/dist/services/extractedFrameIndex.js +0 -1
- package/dist/services/extractionCache.d.ts +3 -1
- package/dist/services/extractionCache.js +17 -4
- package/dist/services/fileServer.d.ts +0 -1
- package/dist/services/fileServer.js +0 -1
- package/dist/services/frameCapture.d.ts +2 -2
- package/dist/services/frameCapture.js +33 -33
- package/dist/services/hdrCapture.d.ts +0 -1
- package/dist/services/hdrCapture.js +0 -1
- package/dist/services/mediaHidden.d.ts +0 -1
- package/dist/services/mediaHidden.js +0 -1
- package/dist/services/mediaRenderIdBridge.d.ts +0 -1
- package/dist/services/mediaRenderIdBridge.js +0 -1
- package/dist/services/mediaTimelineWindow.d.ts +0 -1
- package/dist/services/mediaTimelineWindow.js +0 -1
- package/dist/services/motionBlur.d.ts +0 -1
- package/dist/services/motionBlur.js +0 -1
- package/dist/services/pageNavigationTimeoutErrorHint.d.ts +0 -1
- package/dist/services/pageNavigationTimeoutErrorHint.js +0 -1
- package/dist/services/parallelCoordinator.d.ts +0 -1
- package/dist/services/parallelCoordinator.js +2 -3
- package/dist/services/protocolTimeoutErrorHint.d.ts +0 -1
- package/dist/services/protocolTimeoutErrorHint.js +0 -1
- package/dist/services/referenceResolver.d.ts +0 -1
- package/dist/services/referenceResolver.js +0 -1
- package/dist/services/screenshotService.d.ts +0 -1
- package/dist/services/screenshotService.js +19 -20
- package/dist/services/streamingEncoder.d.ts +0 -1
- package/dist/services/streamingEncoder.js +0 -1
- package/dist/services/systemMemory.d.ts +0 -1
- package/dist/services/systemMemory.js +2 -3
- package/dist/services/threeDProjection.d.ts +0 -1
- package/dist/services/threeDProjection.js +2 -3
- package/dist/services/videoFrameExtractor.d.ts +3 -1
- package/dist/services/videoFrameExtractor.js +37 -7
- package/dist/services/videoFrameInjector.d.ts +0 -1
- package/dist/services/videoFrameInjector.js +0 -1
- package/dist/services/vp9Options.d.ts +0 -1
- package/dist/services/vp9Options.js +0 -1
- package/dist/services/wavChunks.d.ts +0 -1
- package/dist/services/wavChunks.js +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.js +0 -1
- package/dist/utils/alphaBlit.d.ts +0 -1
- package/dist/utils/alphaBlit.js +0 -1
- package/dist/utils/alphaPlaneProbe.d.ts +0 -1
- package/dist/utils/alphaPlaneProbe.js +0 -1
- package/dist/utils/assertSwiftShader.d.ts +0 -1
- package/dist/utils/assertSwiftShader.js +0 -1
- package/dist/utils/concurrencyLimit.d.ts +0 -1
- package/dist/utils/concurrencyLimit.js +0 -1
- package/dist/utils/crc32.d.ts +0 -1
- package/dist/utils/crc32.js +0 -1
- package/dist/utils/evenDimensions.d.ts +0 -1
- package/dist/utils/evenDimensions.js +0 -1
- package/dist/utils/ffmpegBinaries.d.ts +0 -1
- package/dist/utils/ffmpegBinaries.js +0 -1
- package/dist/utils/ffprobe.d.ts +0 -1
- package/dist/utils/ffprobe.js +0 -1
- package/dist/utils/gpuEncoder.d.ts +0 -1
- package/dist/utils/gpuEncoder.js +0 -1
- package/dist/utils/gpuParityDiff.d.ts +0 -1
- package/dist/utils/gpuParityDiff.js +4 -5
- package/dist/utils/hdr.d.ts +0 -1
- package/dist/utils/hdr.js +1 -2
- package/dist/utils/htmlTemplate.d.ts +0 -1
- package/dist/utils/htmlTemplate.js +0 -1
- package/dist/utils/jpegInput.d.ts +0 -1
- package/dist/utils/jpegInput.js +0 -1
- package/dist/utils/layerCompositor.d.ts +0 -1
- package/dist/utils/layerCompositor.js +0 -1
- package/dist/utils/managedChildProcess.d.ts +0 -1
- package/dist/utils/managedChildProcess.js +0 -1
- package/dist/utils/notMediaPayload.d.ts +0 -1
- package/dist/utils/notMediaPayload.js +0 -1
- package/dist/utils/parityContract.d.ts +0 -1
- package/dist/utils/parityContract.js +0 -1
- package/dist/utils/processRss.d.ts +0 -1
- package/dist/utils/processRss.js +0 -1
- package/dist/utils/processTracker.d.ts +0 -1
- package/dist/utils/processTracker.js +0 -1
- package/dist/utils/psnr.d.ts +0 -1
- package/dist/utils/psnr.js +0 -1
- package/dist/utils/psnrFilterAvailability.d.ts +0 -1
- package/dist/utils/psnrFilterAvailability.js +0 -1
- package/dist/utils/readWebGlVendorInfoFromCanvas.d.ts +0 -1
- package/dist/utils/readWebGlVendorInfoFromCanvas.js +0 -1
- package/dist/utils/renderProvenance.d.ts +0 -1
- package/dist/utils/renderProvenance.js +0 -1
- package/dist/utils/runFfmpeg.d.ts +0 -1
- package/dist/utils/runFfmpeg.js +0 -1
- package/dist/utils/sdrCaptureColor.d.ts +0 -1
- package/dist/utils/sdrCaptureColor.js +0 -1
- package/dist/utils/shaderTransitions.d.ts +0 -1
- package/dist/utils/shaderTransitions.js +0 -1
- package/dist/utils/urlDownloader.d.ts +0 -1
- package/dist/utils/urlDownloader.js +0 -1
- package/package.json +3 -3
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/services/__fixtures__/jpeg.d.ts.map +0 -1
- package/dist/services/__fixtures__/jpeg.js.map +0 -1
- package/dist/services/audioFxRender.d.ts.map +0 -1
- package/dist/services/audioFxRender.js.map +0 -1
- package/dist/services/audioMixer.d.ts.map +0 -1
- package/dist/services/audioMixer.js.map +0 -1
- package/dist/services/audioMixer.types.d.ts.map +0 -1
- package/dist/services/audioMixer.types.js.map +0 -1
- package/dist/services/audioVolumeEnvelope.d.ts.map +0 -1
- package/dist/services/audioVolumeEnvelope.js.map +0 -1
- package/dist/services/browserLeasePool.d.ts.map +0 -1
- package/dist/services/browserLeasePool.js.map +0 -1
- package/dist/services/browserManager.d.ts.map +0 -1
- package/dist/services/browserManager.js.map +0 -1
- package/dist/services/captureFailure.d.ts.map +0 -1
- package/dist/services/captureFailure.js.map +0 -1
- package/dist/services/captureWarning.d.ts.map +0 -1
- package/dist/services/captureWarning.js.map +0 -1
- package/dist/services/chromeHostCeiling.d.ts.map +0 -1
- package/dist/services/chromeHostCeiling.js.map +0 -1
- package/dist/services/chromeMemorySampler.d.ts.map +0 -1
- package/dist/services/chromeMemorySampler.js.map +0 -1
- package/dist/services/chunkEncoder.d.ts.map +0 -1
- package/dist/services/chunkEncoder.js.map +0 -1
- package/dist/services/chunkEncoder.types.d.ts.map +0 -1
- package/dist/services/chunkEncoder.types.js.map +0 -1
- package/dist/services/drawElementCaptureError.d.ts.map +0 -1
- package/dist/services/drawElementCaptureError.js.map +0 -1
- package/dist/services/drawElementService.d.ts.map +0 -1
- package/dist/services/drawElementService.js.map +0 -1
- package/dist/services/extractedFrameIndex.d.ts.map +0 -1
- package/dist/services/extractedFrameIndex.js.map +0 -1
- package/dist/services/extractionCache.d.ts.map +0 -1
- package/dist/services/extractionCache.js.map +0 -1
- package/dist/services/fileServer.d.ts.map +0 -1
- package/dist/services/fileServer.js.map +0 -1
- package/dist/services/frameCapture.d.ts.map +0 -1
- package/dist/services/frameCapture.js.map +0 -1
- package/dist/services/hdrCapture.d.ts.map +0 -1
- package/dist/services/hdrCapture.js.map +0 -1
- package/dist/services/mediaHidden.d.ts.map +0 -1
- package/dist/services/mediaHidden.js.map +0 -1
- package/dist/services/mediaRenderIdBridge.d.ts.map +0 -1
- package/dist/services/mediaRenderIdBridge.js.map +0 -1
- package/dist/services/mediaTimelineWindow.d.ts.map +0 -1
- package/dist/services/mediaTimelineWindow.js.map +0 -1
- package/dist/services/motionBlur.d.ts.map +0 -1
- package/dist/services/motionBlur.js.map +0 -1
- package/dist/services/pageNavigationTimeoutErrorHint.d.ts.map +0 -1
- package/dist/services/pageNavigationTimeoutErrorHint.js.map +0 -1
- package/dist/services/parallelCoordinator.d.ts.map +0 -1
- package/dist/services/parallelCoordinator.js.map +0 -1
- package/dist/services/protocolTimeoutErrorHint.d.ts.map +0 -1
- package/dist/services/protocolTimeoutErrorHint.js.map +0 -1
- package/dist/services/referenceResolver.d.ts.map +0 -1
- package/dist/services/referenceResolver.js.map +0 -1
- package/dist/services/screenshotService.d.ts.map +0 -1
- package/dist/services/screenshotService.js.map +0 -1
- package/dist/services/streamingEncoder.d.ts.map +0 -1
- package/dist/services/streamingEncoder.js.map +0 -1
- package/dist/services/systemMemory.d.ts.map +0 -1
- package/dist/services/systemMemory.js.map +0 -1
- package/dist/services/threeDProjection.d.ts.map +0 -1
- package/dist/services/threeDProjection.js.map +0 -1
- package/dist/services/videoFrameExtractor.d.ts.map +0 -1
- package/dist/services/videoFrameExtractor.js.map +0 -1
- package/dist/services/videoFrameInjector.d.ts.map +0 -1
- package/dist/services/videoFrameInjector.js.map +0 -1
- package/dist/services/vp9Options.d.ts.map +0 -1
- package/dist/services/vp9Options.js.map +0 -1
- package/dist/services/wavChunks.d.ts.map +0 -1
- package/dist/services/wavChunks.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/alphaBlit.d.ts.map +0 -1
- package/dist/utils/alphaBlit.js.map +0 -1
- package/dist/utils/alphaPlaneProbe.d.ts.map +0 -1
- package/dist/utils/alphaPlaneProbe.js.map +0 -1
- package/dist/utils/assertSwiftShader.d.ts.map +0 -1
- package/dist/utils/assertSwiftShader.js.map +0 -1
- package/dist/utils/concurrencyLimit.d.ts.map +0 -1
- package/dist/utils/concurrencyLimit.js.map +0 -1
- package/dist/utils/crc32.d.ts.map +0 -1
- package/dist/utils/crc32.js.map +0 -1
- package/dist/utils/evenDimensions.d.ts.map +0 -1
- package/dist/utils/evenDimensions.js.map +0 -1
- package/dist/utils/ffmpegBinaries.d.ts.map +0 -1
- package/dist/utils/ffmpegBinaries.js.map +0 -1
- package/dist/utils/ffprobe.d.ts.map +0 -1
- package/dist/utils/ffprobe.js.map +0 -1
- package/dist/utils/gpuEncoder.d.ts.map +0 -1
- package/dist/utils/gpuEncoder.js.map +0 -1
- package/dist/utils/gpuParityDiff.d.ts.map +0 -1
- package/dist/utils/gpuParityDiff.js.map +0 -1
- package/dist/utils/hdr.d.ts.map +0 -1
- package/dist/utils/hdr.js.map +0 -1
- package/dist/utils/htmlTemplate.d.ts.map +0 -1
- package/dist/utils/htmlTemplate.js.map +0 -1
- package/dist/utils/jpegInput.d.ts.map +0 -1
- package/dist/utils/jpegInput.js.map +0 -1
- package/dist/utils/layerCompositor.d.ts.map +0 -1
- package/dist/utils/layerCompositor.js.map +0 -1
- package/dist/utils/managedChildProcess.d.ts.map +0 -1
- package/dist/utils/managedChildProcess.js.map +0 -1
- package/dist/utils/notMediaPayload.d.ts.map +0 -1
- package/dist/utils/notMediaPayload.js.map +0 -1
- package/dist/utils/parityContract.d.ts.map +0 -1
- package/dist/utils/parityContract.js.map +0 -1
- package/dist/utils/processRss.d.ts.map +0 -1
- package/dist/utils/processRss.js.map +0 -1
- package/dist/utils/processTracker.d.ts.map +0 -1
- package/dist/utils/processTracker.js.map +0 -1
- package/dist/utils/psnr.d.ts.map +0 -1
- package/dist/utils/psnr.js.map +0 -1
- package/dist/utils/psnrFilterAvailability.d.ts.map +0 -1
- package/dist/utils/psnrFilterAvailability.js.map +0 -1
- package/dist/utils/readWebGlVendorInfoFromCanvas.d.ts.map +0 -1
- package/dist/utils/readWebGlVendorInfoFromCanvas.js.map +0 -1
- package/dist/utils/renderProvenance.d.ts.map +0 -1
- package/dist/utils/renderProvenance.js.map +0 -1
- package/dist/utils/runFfmpeg.d.ts.map +0 -1
- package/dist/utils/runFfmpeg.js.map +0 -1
- package/dist/utils/sdrCaptureColor.d.ts.map +0 -1
- package/dist/utils/sdrCaptureColor.js.map +0 -1
- package/dist/utils/shaderTransitions.d.ts.map +0 -1
- package/dist/utils/shaderTransitions.js.map +0 -1
- package/dist/utils/urlDownloader.d.ts.map +0 -1
- package/dist/utils/urlDownloader.js.map +0 -1
|
@@ -473,7 +473,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
473
473
|
if ((session.config?.useDrawElement ?? false) && !supersampling && forceScreenshot) {
|
|
474
474
|
session.deGateReason = "render_mode_hint";
|
|
475
475
|
session.deFallbackTrigger = "render_mode_hint";
|
|
476
|
-
console.log("[engine] fast capture
|
|
476
|
+
console.log("[engine] fast capture falls back to screenshot: render-mode compatibility " +
|
|
477
477
|
"hint forced screenshot capture (e.g. raw requestAnimationFrame composition).");
|
|
478
478
|
}
|
|
479
479
|
if (useDrawElement) {
|
|
@@ -521,7 +521,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
521
521
|
if (!supportsDrawElement) {
|
|
522
522
|
session.deGateReason = "unsupported_chrome";
|
|
523
523
|
session.deFallbackTrigger = "unsupported_chrome";
|
|
524
|
-
console.log(`[engine] fast capture
|
|
524
|
+
console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
525
525
|
"this Chrome build does not implement canvas.drawElementImage (Dev/Canary-only " +
|
|
526
526
|
"feature); run `hyperframes browser ensure --force` to fetch a supported " +
|
|
527
527
|
"build, or set HYPERFRAMES_BROWSER_PATH to one.");
|
|
@@ -540,7 +540,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
540
540
|
if (!forceDE && !(await isPsnrFilterAvailable())) {
|
|
541
541
|
session.deGateReason = "ffmpeg_no_psnr_filter";
|
|
542
542
|
session.deFallbackTrigger = "ffmpeg_no_psnr_filter";
|
|
543
|
-
console.warn(`[engine] fast capture
|
|
543
|
+
console.warn(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
544
544
|
"host ffmpeg is missing or was built without the `psnr` filter " +
|
|
545
545
|
"(libpostproc), so drawElement self-verification cannot run. Install " +
|
|
546
546
|
"an ffmpeg build that includes libpostproc (or set HYPERFRAMES_FFMPEG_PATH " +
|
|
@@ -569,8 +569,8 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
569
569
|
// "screenshot": on a BeginFrame-launched browser (Linux fast capture)
|
|
570
570
|
// Page.captureScreenshot hangs for the full protocol timeout, while
|
|
571
571
|
// beginFrameCapture is the platform's normal baseline path.
|
|
572
|
-
console.log(`[engine] fast capture
|
|
573
|
-
"SwiftShader (software rasterizer
|
|
572
|
+
console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
573
|
+
"SwiftShader (software rasterizer, no GPU egress to skip, drawElement is " +
|
|
574
574
|
"parity-or-slower; see fast-capture-limitations.md)");
|
|
575
575
|
await routeToFallback();
|
|
576
576
|
}
|
|
@@ -584,12 +584,11 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
584
584
|
const cssFx = await detectCssEffectRisk(page);
|
|
585
585
|
if (cssFx) {
|
|
586
586
|
session.deGateReason = `css_effect:${(cssFx.split(":")[0] ?? "").replace(/[^a-z-]/gi, "")}`;
|
|
587
|
-
// Full specific effect ("filter:blur"
|
|
588
|
-
// "
|
|
589
|
-
//
|
|
590
|
-
// the fine-grained value for the diagnostic profile emission.
|
|
587
|
+
// Full specific effect from `detectCssEffectRisk` (e.g. "filter:blur",
|
|
588
|
+
// "mix-blend-mode", "webgl-context") — `deGateReason` keeps its
|
|
589
|
+
// low-cardinality prefix, `deFallbackTrigger` the full value.
|
|
591
590
|
session.deFallbackTrigger = cssFx;
|
|
592
|
-
console.log(`[engine] fast capture
|
|
591
|
+
console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
593
592
|
`${cssFx} detected (drawElementImage cannot reproduce it; see fast-capture-limitations.md)`);
|
|
594
593
|
await routeToFallback();
|
|
595
594
|
return;
|
|
@@ -620,7 +619,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
620
619
|
if (atRisk.size > 0 && atRiskFraction > fractionFloor) {
|
|
621
620
|
session.deGateReason = "at_risk_timeline";
|
|
622
621
|
session.deFallbackTrigger = "at_risk_timeline";
|
|
623
|
-
console.log(`[engine] fast capture
|
|
622
|
+
console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
624
623
|
`${atRisk.size}/${totalFrames} frames animate a compositor-incompatible prop ` +
|
|
625
624
|
`(blend/3D/clip/mask); drawElementImage drops these mid-animation ` +
|
|
626
625
|
`(deterministic timeline gate; see fast-capture-limitations.md Lim 7)`);
|
|
@@ -636,7 +635,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
|
|
|
636
635
|
if (!forceDE && !threeD.ok) {
|
|
637
636
|
session.deGateReason = "3d_init_failed";
|
|
638
637
|
session.deFallbackTrigger = "3d_init_failed";
|
|
639
|
-
console.log(`[engine] fast capture
|
|
638
|
+
console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
|
|
640
639
|
`3D projection init failed (${threeD.reason ?? "unknown"})`);
|
|
641
640
|
await routeToFallback();
|
|
642
641
|
return;
|
|
@@ -761,7 +760,7 @@ export async function createCaptureSession(serverUrl, outputDir, options, onBefo
|
|
|
761
760
|
// passed both flags — warn once and treat page-side as disabled.
|
|
762
761
|
if (useDrawElement &&
|
|
763
762
|
(config?.enablePageSideCompositing ?? DEFAULT_CONFIG.enablePageSideCompositing)) {
|
|
764
|
-
console.warn("[engine] useDrawElement is incompatible with page-side shader compositing
|
|
763
|
+
console.warn("[engine] useDrawElement is incompatible with page-side shader compositing, " +
|
|
765
764
|
"ignoring enablePageSideCompositing for this render. Prefer resolveConfig, " +
|
|
766
765
|
"which disables page-side compositing automatically for fast-capture renders.");
|
|
767
766
|
}
|
|
@@ -905,7 +904,7 @@ async function constructCaptureSession(input) {
|
|
|
905
904
|
// measured ~28 dB of damage on comps whose fades it touched. Warn instead
|
|
906
905
|
// of silently ignoring the old escape hatch.
|
|
907
906
|
if (process.env.HF_FAST_CAPTURE_AUTOALPHA !== undefined) {
|
|
908
|
-
console.warn("[engine] HF_FAST_CAPTURE_AUTOALPHA is retired and ignored
|
|
907
|
+
console.warn("[engine] HF_FAST_CAPTURE_AUTOALPHA is retired and ignored: the requestPaint " +
|
|
909
908
|
"paint contract captures animated opacity natively (see drawElementService.ts).");
|
|
910
909
|
}
|
|
911
910
|
// Re-apply the captured root's own compositor-applied props to the 2D
|
|
@@ -1061,7 +1060,7 @@ export const HF_READY_DIAGNOSTIC_EXPR = `(async function() {
|
|
|
1061
1060
|
await new Promise(function(r) { setTimeout(r, 0); });
|
|
1062
1061
|
}
|
|
1063
1062
|
// A thenable resolving via its own setTimeout(0) can still misreport as
|
|
1064
|
-
// pending here (macrotask registration order, not resolution order)
|
|
1063
|
+
// pending here (macrotask registration order, not resolution order), a
|
|
1065
1064
|
// narrow case that self-corrects on the next ~1s diagnostic tick.
|
|
1066
1065
|
var pendingBuildReadyKeys = keys.filter(function(key) { return !settled[key]; });
|
|
1067
1066
|
var rejectedBuildReadyKeys = keys.filter(function(key) { return settled[key] === "rejected"; });
|
|
@@ -1082,20 +1081,20 @@ export function buildZeroDurationDiagnostic(diag) {
|
|
|
1082
1081
|
const hints = [];
|
|
1083
1082
|
if (diag.pendingBuildReadyKeys.length > 0) {
|
|
1084
1083
|
hints.push(`window.__hf.buildReady never resolved for: ${diag.pendingBuildReadyKeys.join(", ")}. ` +
|
|
1085
|
-
"The runtime holds render-ready until every registered buildReady promise settles
|
|
1086
|
-
"
|
|
1084
|
+
"The runtime holds render-ready until every registered buildReady promise settles. " +
|
|
1085
|
+
"Find where the composition registers that key and confirm it actually resolves.");
|
|
1087
1086
|
}
|
|
1088
1087
|
if (diag.rejectedBuildReadyKeys.length > 0) {
|
|
1089
1088
|
hints.push(`window.__hf.buildReady rejected for: ${diag.rejectedBuildReadyKeys.join(", ")}. ` +
|
|
1090
|
-
"That key's build promise failed rather than hanging
|
|
1089
|
+
"That key's build promise failed rather than hanging. Find why it rejects.");
|
|
1091
1090
|
}
|
|
1092
1091
|
if (!diag.hasPlayer) {
|
|
1093
|
-
hints.push("window.__player was never set
|
|
1092
|
+
hints.push("window.__player was never set: the HyperFrames runtime did not initialize.");
|
|
1094
1093
|
}
|
|
1095
1094
|
if (!diag.hasTimeline) {
|
|
1096
1095
|
hints.push("No GSAP timeline registered (window.__timelines is empty). " +
|
|
1097
1096
|
"CSS/WAAPI/Lottie animations are usually auto-detected (the runtime infers " +
|
|
1098
|
-
"duration from the longest running animation)
|
|
1097
|
+
"duration from the longest running animation), but this composition's duration " +
|
|
1099
1098
|
"could not be inferred, which usually means an infinite/unbounded animation " +
|
|
1100
1099
|
"(e.g. animation-iteration-count: infinite, repeat: -1 WAAPI, or a looping Lottie " +
|
|
1101
1100
|
"clip) or a Three.js scene with no discoverable AnimationClip.");
|
|
@@ -1104,7 +1103,7 @@ export function buildZeroDurationDiagnostic(diag) {
|
|
|
1104
1103
|
hints.push('Fix: add data-duration="<seconds>" to your root <div data-composition-id="..."> element.');
|
|
1105
1104
|
}
|
|
1106
1105
|
if (diag.hasSeek && diag.duration === 0 && diag.renderReady) {
|
|
1107
|
-
hints.push("The runtime finished initializing but reported zero duration
|
|
1106
|
+
hints.push("The runtime finished initializing but reported zero duration. This is permanent.");
|
|
1108
1107
|
}
|
|
1109
1108
|
return (`[FrameCapture] Composition has zero duration.\n` +
|
|
1110
1109
|
` Runtime ready: ${diag.renderReady}, __player: ${diag.hasPlayer}, ` +
|
|
@@ -1115,7 +1114,7 @@ export function buildZeroDurationDiagnostic(diag) {
|
|
|
1115
1114
|
async function evaluateHfDiagnostic(page) {
|
|
1116
1115
|
return (await page.evaluate(HF_READY_DIAGNOSTIC_EXPR));
|
|
1117
1116
|
}
|
|
1118
|
-
async function pollHfReady(page, timeoutMs, intervalMs = 100) {
|
|
1117
|
+
export async function pollHfReady(page, timeoutMs, intervalMs = 100) {
|
|
1119
1118
|
const readyExpr = `!!(window.__hf && typeof window.__hf.seek === "function" && window.__hf.duration > 0)`;
|
|
1120
1119
|
const FAST_FAIL_AFTER_MS = 10_000;
|
|
1121
1120
|
// Throttle diagnostic CDP calls to ~1000ms — running evaluateHfDiagnostic on
|
|
@@ -1125,8 +1124,10 @@ async function pollHfReady(page, timeoutMs, intervalMs = 100) {
|
|
|
1125
1124
|
const deadline = Date.now() + timeoutMs;
|
|
1126
1125
|
let lastDiagnosticAt = 0;
|
|
1127
1126
|
while (Date.now() < deadline) {
|
|
1128
|
-
const
|
|
1129
|
-
if (
|
|
1127
|
+
const state = await page.evaluate(`typeof window.__hfStartupError === "string" ? window.__hfStartupError : ${readyExpr}`);
|
|
1128
|
+
if (typeof state === "string")
|
|
1129
|
+
throw new Error(state);
|
|
1130
|
+
if (state)
|
|
1130
1131
|
return;
|
|
1131
1132
|
const elapsed = timeoutMs - (deadline - Date.now());
|
|
1132
1133
|
if (elapsed >= FAST_FAIL_AFTER_MS) {
|
|
@@ -1237,7 +1238,7 @@ export async function pollSubCompositionTimelines(page, timeoutMs, { intervalMs
|
|
|
1237
1238
|
if (failures.length > 0 && now - start >= scriptFailureGraceMs) {
|
|
1238
1239
|
scriptFailureBail = true;
|
|
1239
1240
|
console.warn(`[FrameCapture] Sub-composition timeline wait cut short after ${now - start}ms: ` +
|
|
1240
|
-
`script resource(s) failed to load (${failures.join(", ")})
|
|
1241
|
+
`script resource(s) failed to load (${failures.join(", ")}), so ` +
|
|
1241
1242
|
`the timeline registration they carry can never arrive. ` +
|
|
1242
1243
|
`Fix the script reference; the render proceeds without those animations.`);
|
|
1243
1244
|
break;
|
|
@@ -1469,7 +1470,7 @@ export function buildLiveMapWarning(libraries) {
|
|
|
1469
1470
|
code: "live_map_detected",
|
|
1470
1471
|
message: `Live map viewport(s) detected in the composition (${libraries.join(", ")}). ` +
|
|
1471
1472
|
`Map tiles load over the network at render time, which the deterministic-render ` +
|
|
1472
|
-
`contract forbids
|
|
1473
|
+
`contract forbids: frames captured before tiles arrive ship a blank or partial map ` +
|
|
1473
1474
|
`with no error. Bake the map to a video first (see the motion-graphics maps skill / ` +
|
|
1474
1475
|
`bake-basemap.mjs) and use the baked file as the imagery layer.`,
|
|
1475
1476
|
details: { sources: [...libraries] },
|
|
@@ -1771,7 +1772,7 @@ export async function initializeSession(session) {
|
|
|
1771
1772
|
.join(", ");
|
|
1772
1773
|
});
|
|
1773
1774
|
console.warn(`[FrameCapture] Some image elements did not load within ${pageReadyTimeout}ms: ${failedImages}. ` +
|
|
1774
|
-
`Continuing render
|
|
1775
|
+
`Continuing render. Affected images may appear blank/missing in early frames.`);
|
|
1775
1776
|
}
|
|
1776
1777
|
await decodeAllImages(page);
|
|
1777
1778
|
return ready;
|
|
@@ -1790,7 +1791,7 @@ export async function initializeSession(session) {
|
|
|
1790
1791
|
.join(", ");
|
|
1791
1792
|
}, skipVideoIds);
|
|
1792
1793
|
console.warn(`[FrameCapture] Some video elements did not decode within ${pageReadyTimeout}ms: ${failedVideos}. ` +
|
|
1793
|
-
`Continuing render
|
|
1794
|
+
`Continuing render. Affected videos will appear as blank/black frames.`);
|
|
1794
1795
|
}
|
|
1795
1796
|
recordCaptureWarnings(session, await collectMediaReadinessWarnings(page, skipVideoIds, pageReadyTimeout));
|
|
1796
1797
|
await recordLiveMapWarning(session, page);
|
|
@@ -1901,7 +1902,7 @@ export async function initializeSession(session) {
|
|
|
1901
1902
|
.join(", ");
|
|
1902
1903
|
});
|
|
1903
1904
|
console.warn(`[FrameCapture] Some image elements did not load within ${pageReadyTimeout}ms: ${failedImages}. ` +
|
|
1904
|
-
`Continuing render
|
|
1905
|
+
`Continuing render. Affected images may appear blank/missing in early frames.`);
|
|
1905
1906
|
}
|
|
1906
1907
|
await decodeAllImages(page);
|
|
1907
1908
|
return ready;
|
|
@@ -1920,7 +1921,7 @@ export async function initializeSession(session) {
|
|
|
1920
1921
|
.join(", ");
|
|
1921
1922
|
}, bfSkipVideoIds);
|
|
1922
1923
|
console.warn(`[FrameCapture] Some video elements did not decode within ${pageReadyTimeout}ms: ${failedVideos}. ` +
|
|
1923
|
-
`Continuing render
|
|
1924
|
+
`Continuing render. Affected videos will appear as blank/black frames.`);
|
|
1924
1925
|
}
|
|
1925
1926
|
recordCaptureWarnings(session, await collectMediaReadinessWarnings(page, bfSkipVideoIds, pageReadyTimeout));
|
|
1926
1927
|
await recordLiveMapWarning(session, page);
|
|
@@ -2721,7 +2722,7 @@ async function armStaticDedup(session, page, logInitPhase) {
|
|
|
2721
2722
|
* compositor-incompatible properties (blend-mode, 3D transforms, clip-path, mask).
|
|
2722
2723
|
* drawElement cannot reproduce these effects mid-tween → capture those frames via
|
|
2723
2724
|
* screenshot instead. opacity/filter fades were dropped from the set once Chrome 151
|
|
2724
|
-
* fixed crbug 521861819.
|
|
2725
|
+
* fixed crbug 521861819.
|
|
2725
2726
|
*
|
|
2726
2727
|
* Returns the union of at-risk frame indices (±1 margin around each tween interval)
|
|
2727
2728
|
* and totalFrames (for fraction computation by the caller).
|
|
@@ -3235,7 +3236,7 @@ export async function captureFrameToBuffer(session, frameIndex, time) {
|
|
|
3235
3236
|
// works. Counted here rather than in captureFrameCore's catch: the
|
|
3236
3237
|
// deadline rejects from outside it, so that catch never runs.
|
|
3237
3238
|
session.deFrameTimeouts = (session.deFrameTimeouts ?? 0) + 1;
|
|
3238
|
-
console.log(`[engine] fast capture
|
|
3239
|
+
console.log(`[engine] fast capture frame ${frameIndex}: capture exceeded ` +
|
|
3239
3240
|
`${DE_FRAME_TIMEOUT_MS}ms; renderer stalled after drawElementImage ` +
|
|
3240
3241
|
`(PRINFRA-488). Failing the drawElement attempt so the whole render ` +
|
|
3241
3242
|
`retries via screenshot.`);
|
|
@@ -3809,4 +3810,3 @@ export function getCapturePerfSummary(session) {
|
|
|
3809
3810
|
deFrameTimeouts: session.deFrameTimeouts ?? 0,
|
|
3810
3811
|
};
|
|
3811
3812
|
}
|
|
3812
|
-
//# sourceMappingURL=frameCapture.js.map
|
|
@@ -14,4 +14,3 @@ export type AudioGroupsById = ReadonlyMap<string, {
|
|
|
14
14
|
export declare function audioGroupsById(document: Parameters<typeof resolveAudioGroups>[0]): AudioGroupsById;
|
|
15
15
|
export declare function isMemberGroupHidden(groupsById: AudioGroupsById, el: GroupKeyEl): boolean;
|
|
16
16
|
export {};
|
|
17
|
-
//# sourceMappingURL=mediaHidden.d.ts.map
|
|
@@ -4,4 +4,3 @@ interface TimelineAttributeReader {
|
|
|
4
4
|
/** True only when authored timing explicitly declares an inactive window. */
|
|
5
5
|
export declare function isKnownInactiveTimelineWindow(element: TimelineAttributeReader, resolvedStart: number): boolean;
|
|
6
6
|
export {};
|
|
7
|
-
//# sourceMappingURL=mediaTimelineWindow.d.ts.map
|
|
@@ -89,7 +89,7 @@ export function synthesizeSilentWorkerExitError(result, expectedFrames) {
|
|
|
89
89
|
return (`worker ${result.workerId} exited without terminal error string ` +
|
|
90
90
|
`(framesCaptured=${result.framesCaptured}, expected=${expectedFrames}, ` +
|
|
91
91
|
`range=[${result.startFrame}, ${result.endFrame})). ` +
|
|
92
|
-
`Field signal ts=1784042064
|
|
92
|
+
`Field signal ts=1784042064: this class of failure has been reported; ` +
|
|
93
93
|
`consider re-run with --workers=1 to isolate.`);
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
@@ -508,7 +508,7 @@ async function psnrForDiskSample(framePath, truth, workerId, idx) {
|
|
|
508
508
|
if (isFfmpegInfrastructureFailure(err)) {
|
|
509
509
|
const detail = err instanceof Error ? err.message : String(err);
|
|
510
510
|
throw new Error(`[Parallel] drawElement disk self-verify aborted (worker ${workerId}, frame ${idx}): ` +
|
|
511
|
-
`ffmpeg or the \`psnr\` filter is unavailable
|
|
511
|
+
`ffmpeg or the \`psnr\` filter is unavailable (${detail}). The preflight in ` +
|
|
512
512
|
"initDrawElementOrTransparentBackground normally catches this at bootstrap; if you " +
|
|
513
513
|
"hit this after a successful preflight, ffmpeg was replaced mid-render or " +
|
|
514
514
|
"HYPERFRAMES_FFMPEG_PATH now points at a different binary.", { cause: err });
|
|
@@ -821,4 +821,3 @@ export function getSystemResources() {
|
|
|
821
821
|
recommendedWorkers: calculateOptimalWorkers(1000),
|
|
822
822
|
};
|
|
823
823
|
}
|
|
824
|
-
//# sourceMappingURL=parallelCoordinator.js.map
|
|
@@ -25,4 +25,3 @@ export declare function augmentProtocolTimeoutError(err: unknown, effectiveTimeo
|
|
|
25
25
|
* the same matcher as the augmentation path so the two never drift.
|
|
26
26
|
*/
|
|
27
27
|
export declare function isProtocolTimeoutError(err: unknown): boolean;
|
|
28
|
-
//# sourceMappingURL=protocolTimeoutErrorHint.d.ts.map
|
|
@@ -36,4 +36,3 @@ export declare function resolveReferencedStart(doc: RefResolverDoc, el: RefResol
|
|
|
36
36
|
* at parse time) — the caller then treats the reference as duration-0.
|
|
37
37
|
*/
|
|
38
38
|
export declare function resolveReferencedDuration(doc: RefResolverDoc, el: RefResolverEl, startCache: Map<RefResolverEl, number>, visiting: Set<RefResolverEl>): number | null;
|
|
39
|
-
//# sourceMappingURL=referenceResolver.d.ts.map
|
|
@@ -193,4 +193,3 @@ export declare function injectVideoFramesBatch(page: Page, updates: Array<{
|
|
|
193
193
|
dataUri: string;
|
|
194
194
|
}>): Promise<string[]>;
|
|
195
195
|
export declare function syncVideoFrameVisibility(page: Page, activeVideoIds: string[]): Promise<void>;
|
|
196
|
-
//# sourceMappingURL=screenshotService.d.ts.map
|
|
@@ -99,7 +99,7 @@ async function sendBeginFrame(client, params) {
|
|
|
99
99
|
continue;
|
|
100
100
|
}
|
|
101
101
|
if (isPending) {
|
|
102
|
-
throw new Error(`[BeginFrame] Frame still pending after ${PENDING_FRAME_RETRIES} retries
|
|
102
|
+
throw new Error(`[BeginFrame] Frame still pending after ${PENDING_FRAME_RETRIES} retries: CPU overloaded by parallel renders. ` +
|
|
103
103
|
`Reduce concurrent renders or use --docker for isolation.`);
|
|
104
104
|
}
|
|
105
105
|
throw err;
|
|
@@ -632,6 +632,14 @@ export async function injectVideoFramesBatch(page, updates) {
|
|
|
632
632
|
: Number.isNaN(opacityParsed)
|
|
633
633
|
? 1
|
|
634
634
|
: opacityParsed;
|
|
635
|
+
// Measure first: an in-flow bordered <img> sibling would shrink the video's flex box.
|
|
636
|
+
const videoRect = video.getBoundingClientRect();
|
|
637
|
+
const videoBox = {
|
|
638
|
+
left: Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0,
|
|
639
|
+
top: Number.isFinite(video.offsetTop) ? video.offsetTop : 0,
|
|
640
|
+
width: video.offsetWidth > 0 ? video.offsetWidth : videoRect.width,
|
|
641
|
+
height: video.offsetHeight > 0 ? video.offsetHeight : videoRect.height,
|
|
642
|
+
};
|
|
635
643
|
if (isNewImage) {
|
|
636
644
|
img = document.createElement("img");
|
|
637
645
|
img.classList.add("__render_frame__");
|
|
@@ -667,24 +675,16 @@ export async function injectVideoFramesBatch(page, updates) {
|
|
|
667
675
|
// instead of flowing below it. With position:relative, both elements
|
|
668
676
|
// stack vertically — the <img> lands below the video and gets clipped
|
|
669
677
|
// by any overflow:hidden ancestor (e.g., border-radius wrappers).
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
{
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
img.style.inset = "auto";
|
|
681
|
-
img.style.left = `${offsetLeft}px`;
|
|
682
|
-
img.style.top = `${offsetTop}px`;
|
|
683
|
-
img.style.right = "auto";
|
|
684
|
-
img.style.bottom = "auto";
|
|
685
|
-
img.style.width = `${offsetWidth}px`;
|
|
686
|
-
img.style.height = `${offsetHeight}px`;
|
|
687
|
-
}
|
|
678
|
+
img.style.position = "absolute";
|
|
679
|
+
img.style.inset = "auto";
|
|
680
|
+
img.style.left = `${videoBox.left}px`;
|
|
681
|
+
img.style.top = `${videoBox.top}px`;
|
|
682
|
+
img.style.right = "auto";
|
|
683
|
+
img.style.bottom = "auto";
|
|
684
|
+
img.style.width = `${videoBox.width}px`;
|
|
685
|
+
img.style.height = `${videoBox.height}px`;
|
|
686
|
+
// `videoBox` is a border-box even when the video is content-box.
|
|
687
|
+
img.style.boxSizing = "border-box";
|
|
688
688
|
img.style.objectFit = computedStyle.objectFit;
|
|
689
689
|
img.style.objectPosition = computedStyle.objectPosition;
|
|
690
690
|
img.style.zIndex = computedStyle.zIndex;
|
|
@@ -782,4 +782,3 @@ export async function syncVideoFrameVisibility(page, activeVideoIds) {
|
|
|
782
782
|
}
|
|
783
783
|
}, activeVideoIds, COLOR_GRADING_SOURCE_HIDDEN_ATTR);
|
|
784
784
|
}
|
|
785
|
-
//# sourceMappingURL=screenshotService.js.map
|
|
@@ -102,4 +102,3 @@ export declare function buildStreamingArgs(options: StreamingEncoderOptions, out
|
|
|
102
102
|
* Spawn a streaming FFmpeg encoder that accepts frame buffers on stdin.
|
|
103
103
|
*/
|
|
104
104
|
export declare function spawnStreamingEncoder(outputPath: string, options: StreamingEncoderOptions, signal?: AbortSignal, config?: Partial<Pick<EngineConfig, "ffmpegStreamingTimeout">>): Promise<StreamingEncoder>;
|
|
105
|
-
//# sourceMappingURL=streamingEncoder.d.ts.map
|
|
@@ -80,8 +80,8 @@ export function getCgroupMemoryLimitMb() {
|
|
|
80
80
|
// stderr, not stdout: this is a diagnostic notice, and commands like `check --json`
|
|
81
81
|
// write their machine-readable payload to stdout. A banner on stdout corrupts that
|
|
82
82
|
// payload for any JSON consumer (it broke the Video Agent's hyperframes check parse).
|
|
83
|
-
console.warn(`[SystemMemory] cgroup memory limit detected: ${_cachedCgroupLimitMb} MiB
|
|
84
|
-
`
|
|
83
|
+
console.warn(`[SystemMemory] cgroup memory limit detected: ${_cachedCgroupLimitMb} MiB. ` +
|
|
84
|
+
`It governs memory-adaptive render behaviour instead of host RAM.`);
|
|
85
85
|
}
|
|
86
86
|
return _cachedCgroupLimitMb;
|
|
87
87
|
}
|
|
@@ -154,4 +154,3 @@ export const LOW_MEMORY_TOTAL_MB_THRESHOLD = 8192;
|
|
|
154
154
|
export function isLowMemorySystem(totalMb = getSystemTotalMb()) {
|
|
155
155
|
return totalMb <= LOW_MEMORY_TOTAL_MB_THRESHOLD;
|
|
156
156
|
}
|
|
157
|
-
//# sourceMappingURL=systemMemory.js.map
|
|
@@ -77,4 +77,3 @@ export declare function initThreeDProjection(page: Page): Promise<ThreeDProjecti
|
|
|
77
77
|
* Returns the first matched effect name (for logging) or null.
|
|
78
78
|
*/
|
|
79
79
|
export declare function detectCssEffectRisk(page: Page): Promise<string | null>;
|
|
80
|
-
//# sourceMappingURL=threeDProjection.d.ts.map
|
|
@@ -510,7 +510,7 @@ export async function initThreeDProjectionInPage() {
|
|
|
510
510
|
ok: false,
|
|
511
511
|
groups: 0,
|
|
512
512
|
quads: 0,
|
|
513
|
-
reason: "degenerate 3D geometry (zero-size or inline-box quad)
|
|
513
|
+
reason: "degenerate 3D geometry (zero-size or inline-box quad): " +
|
|
514
514
|
"quad projection cannot reproduce Blink's lenient rendering",
|
|
515
515
|
};
|
|
516
516
|
}
|
|
@@ -521,7 +521,7 @@ export async function initThreeDProjectionInPage() {
|
|
|
521
521
|
ok: false,
|
|
522
522
|
groups: 0,
|
|
523
523
|
quads: 0,
|
|
524
|
-
reason: "3D quad contains GSAP-animated descendants
|
|
524
|
+
reason: "3D quad contains GSAP-animated descendants, a static texture " +
|
|
525
525
|
"would freeze them at init state",
|
|
526
526
|
};
|
|
527
527
|
}
|
|
@@ -977,4 +977,3 @@ export async function detectCssEffectRisk(page) {
|
|
|
977
977
|
return null;
|
|
978
978
|
}
|
|
979
979
|
}
|
|
980
|
-
//# sourceMappingURL=threeDProjection.js.map
|
|
@@ -105,6 +105,8 @@ export interface ExtractionOptions {
|
|
|
105
105
|
* `totalFrames` so another process can extract just the frames it needs with `frameRanges`.
|
|
106
106
|
*/
|
|
107
107
|
deferRangeExtraction?: boolean;
|
|
108
|
+
/** Directories the caller rewrites on every render (downloaded media); their sources are cached by content. */
|
|
109
|
+
contentKeyedDirs?: readonly string[];
|
|
108
110
|
}
|
|
109
111
|
export declare const EXTRACT_CACHE_MIN_AGE_MS: number;
|
|
110
112
|
/**
|
|
@@ -280,6 +282,7 @@ export interface TimelineExtractionWindow {
|
|
|
280
282
|
finalFrameOnly?: boolean;
|
|
281
283
|
}
|
|
282
284
|
type TimelineWindowVideo = Pick<VideoElement, "start" | "end" | "mediaStart"> & Partial<Pick<VideoElement, "playbackRate">> & Partial<Pick<VideoElement, "loop">>;
|
|
285
|
+
export declare function isVideoPastTimelineEnd(video: Pick<VideoElement, "start">, timelineEnd: number): boolean;
|
|
283
286
|
/** Move a clip to its extraction window; a rate lane is shifted so it keeps integrating from the new origin. */
|
|
284
287
|
export declare function rebaseVideoToWindow(video: VideoElement, window: TimelineExtractionWindow): void;
|
|
285
288
|
/**
|
|
@@ -346,4 +349,3 @@ export declare class FrameLookupTable {
|
|
|
346
349
|
cleanup(): void;
|
|
347
350
|
}
|
|
348
351
|
export declare function createFrameLookupTable(videos: VideoElement[], extracted: ExtractedFrames[], fps?: number): FrameLookupTable;
|
|
349
|
-
//# sourceMappingURL=videoFrameExtractor.d.ts.map
|