@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
|
@@ -11,6 +11,7 @@ import { join } from "path";
|
|
|
11
11
|
import { cpus } from "os";
|
|
12
12
|
import { createConcurrencyLimit } from "../utils/concurrencyLimit.js";
|
|
13
13
|
import { parseHTML } from "linkedom";
|
|
14
|
+
import { isPathInside } from "@hyperframes/parsers/asset-paths";
|
|
14
15
|
import { resolveProjectRelativeSrc } from "@hyperframes/parsers/asset-resolution";
|
|
15
16
|
import { MEDIA_RENDER_ID_ATTR, isAudibleVideoElement, fpsToFfmpegArg, fpsToNumber, MEDIA_DURATION_CLAMP_EPSILON_SECONDS, normalizeRateSpec, readElementRateSpec, shiftRateLane, sourceTimeAt, timeAtSourceTime, exportClipWindow, hasClipStarted, isInClipWindow, parseStrictFiniteTimingNumber, readMediaStart, toFps, firstFrameColourArgs, hdrToSdrToneMapFilter, parseFirstFrameColour, } from "@hyperframes/core";
|
|
16
17
|
import { resolveReferencedStart } from "./referenceResolver.js";
|
|
@@ -23,7 +24,7 @@ import { runFfmpeg, runFfmpegPipeline } from "../utils/runFfmpeg.js";
|
|
|
23
24
|
import { isFfmpegFilterAvailable } from "../utils/psnrFilterAvailability.js";
|
|
24
25
|
import { DEFAULT_CONFIG } from "../config.js";
|
|
25
26
|
import { unwrapTemplate } from "../utils/htmlTemplate.js";
|
|
26
|
-
import { FRAME_FILENAME_PREFIX, gcExtractionCache, gcSweepDue, lookupCacheEntry, partialCacheEntryDir, publishCacheEntry, readKeyStat, rehydrateCacheEntry, touchCacheEntry, } from "./extractionCache.js";
|
|
27
|
+
import { FRAME_FILENAME_PREFIX, gcExtractionCache, gcSweepDue, lookupCacheEntry, partialCacheEntryDir, publishCacheEntry, readContentSha256, readKeyStat, rehydrateCacheEntry, touchCacheEntry, } from "./extractionCache.js";
|
|
27
28
|
import { framePathsFromDirectory } from "./extractedFrameIndex.js";
|
|
28
29
|
export { resolveProjectRelativeSrc };
|
|
29
30
|
/**
|
|
@@ -106,6 +107,7 @@ export function extractionFrameCountForDuration(durationSeconds, fps, isVFR) {
|
|
|
106
107
|
const frames = Number(frameCount);
|
|
107
108
|
return Math.max(1, Number.isSafeInteger(frames) ? frames : Number.MAX_SAFE_INTEGER);
|
|
108
109
|
}
|
|
110
|
+
const DOWNLOAD_SUBDIR = "_downloads";
|
|
109
111
|
export const EXTRACT_CACHE_MIN_AGE_MS = 60 * 60 * 1000;
|
|
110
112
|
const GC_STALENESS_MS = 24 * 60 * 60 * 1000;
|
|
111
113
|
const SDR_TO_HDR_COLORSPACE_FILTER = "colorspace=all=bt2020:iall=bt709:range=tv";
|
|
@@ -805,6 +807,9 @@ function canHoldFinalFramePastEof(video) {
|
|
|
805
807
|
// deliberately below any supported output frame interval: coverage expects
|
|
806
808
|
// one frame, while FFmpeg seeks to the separately probed real frame timestamp.
|
|
807
809
|
const FINAL_FRAME_LOGICAL_DURATION_SECONDS = 1e-6;
|
|
810
|
+
export function isVideoPastTimelineEnd(video, timelineEnd) {
|
|
811
|
+
return video.start >= timelineEnd;
|
|
812
|
+
}
|
|
808
813
|
/** Move a clip to its extraction window; a rate lane is shifted so it keeps integrating from the new origin. */
|
|
809
814
|
export function rebaseVideoToWindow(video, window) {
|
|
810
815
|
if (window.preserveTimelinePhase)
|
|
@@ -1170,15 +1175,16 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1170
1175
|
for (const video of videos) {
|
|
1171
1176
|
if (signal?.aborted)
|
|
1172
1177
|
break;
|
|
1173
|
-
if (options.timelineEnd !== undefined && video
|
|
1178
|
+
if (options.timelineEnd !== undefined && isVideoPastTimelineEnd(video, options.timelineEnd)) {
|
|
1174
1179
|
continue;
|
|
1180
|
+
}
|
|
1175
1181
|
try {
|
|
1176
1182
|
let videoPath = video.src;
|
|
1177
1183
|
if (!isHttpUrl(videoPath)) {
|
|
1178
1184
|
videoPath = resolveProjectRelativeSrc(video.src, baseDir, compiledDir);
|
|
1179
1185
|
}
|
|
1180
1186
|
if (isHttpUrl(videoPath)) {
|
|
1181
|
-
const downloadDir = join(options.outputDir,
|
|
1187
|
+
const downloadDir = join(options.outputDir, DOWNLOAD_SUBDIR);
|
|
1182
1188
|
mkdirSync(downloadDir, { recursive: true });
|
|
1183
1189
|
videoPath = await downloadToTemp(videoPath, downloadDir, undefined, signal, () => recordTransientRetries(1), { onTelemetry: writeUrlDownloadTelemetry });
|
|
1184
1190
|
}
|
|
@@ -1222,6 +1228,11 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1222
1228
|
// HDR preflight. Without this, every render would write a new
|
|
1223
1229
|
// normalized file with a fresh mtime → fresh cache key → perpetual misses.
|
|
1224
1230
|
// Phase 3 updates mediaStart after trimming any invisible negative preroll.
|
|
1231
|
+
// Downloads land at a new path and mtime every render, so they are keyed by content instead.
|
|
1232
|
+
const contentKeyedDirs = [
|
|
1233
|
+
join(options.outputDir, DOWNLOAD_SUBDIR),
|
|
1234
|
+
...(options.contentKeyedDirs ?? []),
|
|
1235
|
+
];
|
|
1225
1236
|
const cacheKeyInputs = resolvedVideos.map(({ video, videoPath }) => {
|
|
1226
1237
|
const stat = readKeyStat(videoPath);
|
|
1227
1238
|
// Missing files return null — skip the cache path for that entry. The
|
|
@@ -1235,6 +1246,7 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1235
1246
|
mtimeMs: stat.mtimeMs,
|
|
1236
1247
|
size: stat.size,
|
|
1237
1248
|
mediaStart: video.mediaStart,
|
|
1249
|
+
contentKeyed: contentKeyedDirs.some((dir) => isPathInside(videoPath, dir)),
|
|
1238
1250
|
};
|
|
1239
1251
|
});
|
|
1240
1252
|
// Phase 2: Probe color spaces and normalize if mixed HDR/SDR
|
|
@@ -1414,12 +1426,30 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1414
1426
|
});
|
|
1415
1427
|
return { ...rehydrated, ownedByLookup: true };
|
|
1416
1428
|
}
|
|
1429
|
+
// Hashed only for works that reach a lookup (deferred ranges never do), once per file.
|
|
1430
|
+
const contentSha256ByPath = new Map();
|
|
1431
|
+
async function hashContentKeyedSources(works) {
|
|
1432
|
+
if (!cacheRootDir)
|
|
1433
|
+
return;
|
|
1434
|
+
const paths = new Set();
|
|
1435
|
+
for (const work of works) {
|
|
1436
|
+
const keyInput = cacheKeyInputs[work.index];
|
|
1437
|
+
if (keyInput?.contentKeyed)
|
|
1438
|
+
paths.add(keyInput.videoPath);
|
|
1439
|
+
}
|
|
1440
|
+
await Promise.all([...paths].map(async (path) => contentSha256ByPath.set(path, await readContentSha256(path, signal))));
|
|
1441
|
+
}
|
|
1417
1442
|
function lookupCacheFor(work) {
|
|
1418
1443
|
if (!cacheRootDir)
|
|
1419
1444
|
return { work };
|
|
1420
1445
|
const keyInput = cacheKeyInputs[work.index];
|
|
1421
1446
|
if (!keyInput)
|
|
1422
1447
|
return { work };
|
|
1448
|
+
const contentSha256 = keyInput.contentKeyed
|
|
1449
|
+
? (contentSha256ByPath.get(keyInput.videoPath) ?? null)
|
|
1450
|
+
: undefined;
|
|
1451
|
+
if (contentSha256 === null)
|
|
1452
|
+
return { work };
|
|
1423
1453
|
const transformParts = [
|
|
1424
1454
|
work.sdrToHdrTransfer ? sdrToHdrTransformKey(work.sdrToHdrTransfer) : undefined,
|
|
1425
1455
|
work.hdrToSdrTransformKey,
|
|
@@ -1431,6 +1461,7 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1431
1461
|
mtimeMs: keyInput.mtimeMs,
|
|
1432
1462
|
size: keyInput.size,
|
|
1433
1463
|
mediaStart: keyInput.mediaStart,
|
|
1464
|
+
contentSha256,
|
|
1434
1465
|
duration: work.videoDuration,
|
|
1435
1466
|
fps: fpsKey,
|
|
1436
1467
|
format: work.format,
|
|
@@ -1661,9 +1692,9 @@ export async function extractAllVideoFrames(videos, baseDir, options, signal, co
|
|
|
1661
1692
|
});
|
|
1662
1693
|
}
|
|
1663
1694
|
const cacheMisses = [];
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1695
|
+
const worksToLookUp = [...uniqueWorks.values()].filter((work) => !uniqueOutcomes.has(work.dedupeKey));
|
|
1696
|
+
await hashContentKeyedSources(worksToLookUp);
|
|
1697
|
+
for (const work of worksToLookUp) {
|
|
1667
1698
|
const lookup = lookupCacheFor(work);
|
|
1668
1699
|
if ("work" in lookup) {
|
|
1669
1700
|
cacheMisses.push(lookup);
|
|
@@ -1933,4 +1964,3 @@ export function createFrameLookupTable(videos, extracted, fps) {
|
|
|
1933
1964
|
}
|
|
1934
1965
|
return table;
|
|
1935
1966
|
}
|
|
1936
|
-
//# sourceMappingURL=videoFrameExtractor.js.map
|
|
@@ -3,4 +3,3 @@ export declare const MIN_VP9_CPU_USED = -8;
|
|
|
3
3
|
export declare const MAX_VP9_CPU_USED = 8;
|
|
4
4
|
export declare function normalizeVp9CpuUsed(value: number | undefined): number;
|
|
5
5
|
export declare function appendVp9CpuUsedArg(args: string[], value: number | undefined): void;
|
|
6
|
-
//# sourceMappingURL=vp9Options.d.ts.map
|
|
@@ -17,4 +17,3 @@ export interface RiffChunk {
|
|
|
17
17
|
export declare function riffChunks(buffer: Buffer): Generator<RiffChunk>;
|
|
18
18
|
/** Canonical codec tag, or null for a truncated or unsupported extensible header. */
|
|
19
19
|
export declare function wavFormatTag(buffer: Buffer, body: number, size: number): number | null;
|
|
20
|
-
//# sourceMappingURL=wavChunks.d.ts.map
|
package/dist/types.d.ts
CHANGED
package/dist/types.js
CHANGED
package/dist/utils/alphaBlit.js
CHANGED
|
@@ -6,4 +6,3 @@ export declare function sampledRgbaAlphaIsFullyOpaque(buf: Buffer): boolean | un
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function probeInputAlphaPlane(videoPath: string, decoder: string, signal?: AbortSignal): Promise<boolean | undefined>;
|
|
8
8
|
export declare function inputAlphaOpaqueWarning(src: string): string;
|
|
9
|
-
//# sourceMappingURL=alphaPlaneProbe.d.ts.map
|
|
@@ -103,4 +103,3 @@ export async function assertSwiftShader(page, readInfo = readWebGlVendorInfo) {
|
|
|
103
103
|
`Ensure Chrome was launched with --use-gl=swiftshader --use-angle=swiftshader and that the ` +
|
|
104
104
|
`SwiftShader libraries are present in the runtime image.`, vendor, renderer);
|
|
105
105
|
}
|
|
106
|
-
//# sourceMappingURL=assertSwiftShader.js.map
|
|
@@ -3,4 +3,3 @@
|
|
|
3
3
|
* `signal` aborts stops waiting and runs at once without a slot, so a cancel never queues behind others.
|
|
4
4
|
*/
|
|
5
5
|
export declare function createConcurrencyLimit(limit: number): <T>(task: () => Promise<T>, signal?: AbortSignal) => Promise<T>;
|
|
6
|
-
//# sourceMappingURL=concurrencyLimit.d.ts.map
|
package/dist/utils/crc32.d.ts
CHANGED
package/dist/utils/crc32.js
CHANGED
|
@@ -32,4 +32,3 @@ export declare function requiresEvenDimensions(pixelFormat: string): boolean;
|
|
|
32
32
|
* returns just the pad when there is no existing chain.
|
|
33
33
|
*/
|
|
34
34
|
export declare function withEvenDimensionPad(vfChain: string, pixelFormat: string, width?: number, height?: number): string;
|
|
35
|
-
//# sourceMappingURL=evenDimensions.d.ts.map
|
package/dist/utils/ffprobe.d.ts
CHANGED
|
@@ -154,4 +154,3 @@ export interface KeyframeAnalysis {
|
|
|
154
154
|
*/
|
|
155
155
|
export declare function analyzeKeyframeIntervals(filePath: string, metadata: Pick<VideoMetadata, "videoStreamDurationSeconds" | "videoStreamStartSeconds">): Promise<KeyframeAnalysis>;
|
|
156
156
|
export {};
|
|
157
|
-
//# sourceMappingURL=ffprobe.d.ts.map
|
package/dist/utils/ffprobe.js
CHANGED
|
@@ -31,4 +31,3 @@ export declare function getProbeArgs(encoder: ConcreteGpuEncoder): string[];
|
|
|
31
31
|
* `-preset` entirely or accept the libx264 vocabulary).
|
|
32
32
|
*/
|
|
33
33
|
export declare function mapPresetForGpuEncoder(encoder: GpuEncoder, preset: string): string;
|
|
34
|
-
//# sourceMappingURL=gpuEncoder.d.ts.map
|
package/dist/utils/gpuEncoder.js
CHANGED
|
@@ -139,4 +139,3 @@ export declare function diffGpuParityPngs(pngA: Buffer, pngB: Buffer, options?:
|
|
|
139
139
|
* metrics without a second pass.
|
|
140
140
|
*/
|
|
141
141
|
export declare function verifyGpuParity(a: RgbaFrame, b: RgbaFrame, options?: GpuParityDiffOptions): VerifyGpuParityResult;
|
|
142
|
-
//# sourceMappingURL=gpuParityDiff.d.ts.map
|
|
@@ -49,7 +49,7 @@ const DEFAULT_BLACK_ONLY_FRACTION_THRESHOLD = 0.001;
|
|
|
49
49
|
*/
|
|
50
50
|
export function diffGpuParityFrames(a, b, options = {}) {
|
|
51
51
|
if (a.width !== b.width || a.height !== b.height) {
|
|
52
|
-
throw new Error(`diffGpuParityFrames: frame size mismatch
|
|
52
|
+
throw new Error(`diffGpuParityFrames: frame size mismatch: A is ${a.width}x${a.height}, ` +
|
|
53
53
|
`B is ${b.width}x${b.height}`);
|
|
54
54
|
}
|
|
55
55
|
const expectedLen = a.width * a.height * 4;
|
|
@@ -66,7 +66,7 @@ export function diffGpuParityFrames(a, b, options = {}) {
|
|
|
66
66
|
const contentSum = options.contentSumThreshold ?? DEFAULT_CONTENT_SUM_THRESHOLD;
|
|
67
67
|
if (contentSum <= blackSum) {
|
|
68
68
|
throw new Error(`diffGpuParityFrames: contentSumThreshold (${contentSum}) must be strictly greater ` +
|
|
69
|
-
`than blackSumThreshold (${blackSum})
|
|
69
|
+
`than blackSumThreshold (${blackSum}): overlapping thresholds would double-classify ` +
|
|
70
70
|
`borderline pixels`);
|
|
71
71
|
}
|
|
72
72
|
const total = a.width * a.height;
|
|
@@ -183,7 +183,7 @@ export function verifyGpuParity(a, b, options = {}) {
|
|
|
183
183
|
ok: false,
|
|
184
184
|
reason: `hardware-GPU frame has ${diff.blackOnlyInA.pixels} pixel(s) ` +
|
|
185
185
|
`(${(diff.blackOnlyInA.fraction * 100).toFixed(3)}%) that are solid-black ` +
|
|
186
|
-
`while software-GPU frame has content there${region}
|
|
186
|
+
`while software-GPU frame has content there${region}, likely a shape-dependent ` +
|
|
187
187
|
`hardware-GPU capture bug`,
|
|
188
188
|
diff,
|
|
189
189
|
};
|
|
@@ -195,11 +195,10 @@ export function verifyGpuParity(a, b, options = {}) {
|
|
|
195
195
|
ok: false,
|
|
196
196
|
reason: `software-GPU frame has ${diff.blackOnlyInB.pixels} pixel(s) ` +
|
|
197
197
|
`(${(diff.blackOnlyInB.fraction * 100).toFixed(3)}%) that are solid-black ` +
|
|
198
|
-
`while hardware-GPU frame has content there${region}
|
|
198
|
+
`while hardware-GPU frame has content there${region}, an unexpected inverse ` +
|
|
199
199
|
`pattern, worth investigating`,
|
|
200
200
|
diff,
|
|
201
201
|
};
|
|
202
202
|
}
|
|
203
203
|
return { ok: true, reason: "", diff };
|
|
204
204
|
}
|
|
205
|
-
//# sourceMappingURL=gpuParityDiff.js.map
|
package/dist/utils/hdr.d.ts
CHANGED
|
@@ -93,4 +93,3 @@ export declare function formatHdrAutoPromotionWarning(promotion: HdrAutoPromotio
|
|
|
93
93
|
* contains HDR content and what the dominant transfer function is.
|
|
94
94
|
*/
|
|
95
95
|
export declare function analyzeCompositionHdr(colorSpaces: Array<VideoColorSpace | null>): CompositionHdrInfo;
|
|
96
|
-
//# sourceMappingURL=hdr.d.ts.map
|
package/dist/utils/hdr.js
CHANGED
|
@@ -81,7 +81,7 @@ export function findHdrAutoPromotion(sources) {
|
|
|
81
81
|
: null;
|
|
82
82
|
}
|
|
83
83
|
export function formatHdrAutoPromotionWarning(promotion) {
|
|
84
|
-
return `[Render] HDR auto-promotion triggered by "${promotion.triggeringAsset}"
|
|
84
|
+
return `[Render] HDR auto-promotion triggered by "${promotion.triggeringAsset}", output: ${promotion.output.colorSpace} / ${promotion.output.codec}`;
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
87
|
* Analyze a set of video color spaces to determine if the composition
|
|
@@ -103,4 +103,3 @@ export function analyzeCompositionHdr(colorSpaces) {
|
|
|
103
103
|
const dominantTransfer = hasPq ? "pq" : "hlg";
|
|
104
104
|
return { hasHdr: true, dominantTransfer };
|
|
105
105
|
}
|
|
106
|
-
//# sourceMappingURL=hdr.js.map
|
package/dist/utils/jpegInput.js
CHANGED
|
@@ -61,4 +61,3 @@ export declare function isNotMediaPayload(filePath: string): Promise<boolean>;
|
|
|
61
61
|
* through its `svg_pipe` demuxer, so image sources must not be sniffed.
|
|
62
62
|
*/
|
|
63
63
|
export declare function assertMediaPayload(filePath: string, elementId: string): Promise<void>;
|
|
64
|
-
//# sourceMappingURL=notMediaPayload.d.ts.map
|
|
@@ -20,4 +20,3 @@ export declare function parseProcStatusRss(pid: number, status: string): Process
|
|
|
20
20
|
* rejects; a pid that exited between discovery and sampling is simply absent.
|
|
21
21
|
*/
|
|
22
22
|
export declare function sampleProcessRss(pids: readonly number[], exec?: ExecFileLike, platform?: NodeJS.Platform, readStatus?: ReadFileLike): Promise<ProcessRssSample[]>;
|
|
23
|
-
//# sourceMappingURL=processRss.d.ts.map
|
package/dist/utils/processRss.js
CHANGED
package/dist/utils/psnr.d.ts
CHANGED
package/dist/utils/psnr.js
CHANGED
|
@@ -11,4 +11,3 @@ export declare function isPsnrFilterAvailable(): Promise<boolean>;
|
|
|
11
11
|
export declare function isFfmpegFilterAvailable(name: string): Promise<boolean>;
|
|
12
12
|
/** Test-only: drop the memoized probe result. */
|
|
13
13
|
export declare function resetPsnrFilterAvailabilityCache(): void;
|
|
14
|
-
//# sourceMappingURL=psnrFilterAvailability.d.ts.map
|
|
@@ -55,4 +55,3 @@ export interface RenderProvenance {
|
|
|
55
55
|
* case-insensitive — a case-sensitive read works on mp4 and misses every webm.
|
|
56
56
|
*/
|
|
57
57
|
export declare function readRenderProvenance(tags: Record<string, string | undefined> | undefined): RenderProvenance | null;
|
|
58
|
-
//# sourceMappingURL=renderProvenance.d.ts.map
|
|
@@ -55,4 +55,3 @@ export declare function runFfmpeg(args: string[], opts?: RunFfmpegOptions): Prom
|
|
|
55
55
|
* fails and reports the first failure, its stderr last so error tails show it.
|
|
56
56
|
*/
|
|
57
57
|
export declare function runFfmpegPipeline(producerArgs: string[], consumerArgs: string[], opts?: RunFfmpegOptions): Promise<RunFfmpegResult>;
|
|
58
|
-
//# sourceMappingURL=runFfmpeg.d.ts.map
|
package/dist/utils/runFfmpeg.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
export declare const SDR_RGB_TO_BT709_FILTER = "scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
2
2
|
export declare const SDR_CAPTURE_TO_BT709_FILTER = "scale=in_color_matrix=bt601:in_range=pc:flags=neighbor,format=gbrp,scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
3
|
-
//# sourceMappingURL=sdrCaptureColor.d.ts.map
|
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
export const SDR_RGB_TO_BT709_FILTER = "scale=out_color_matrix=bt709:out_range=tv:flags=neighbor";
|
|
2
2
|
export const SDR_CAPTURE_TO_BT709_FILTER = `scale=in_color_matrix=bt601:in_range=pc:flags=neighbor,format=gbrp,${SDR_RGB_TO_BT709_FILTER}`;
|
|
3
|
-
//# sourceMappingURL=sdrCaptureColor.js.map
|
|
@@ -58,4 +58,3 @@ export declare function assertPublicHttpsUrl(url: string): void;
|
|
|
58
58
|
export declare function fetchPublicHttpsText(url: string, options: PublicHttpsTextOptions): Promise<string>;
|
|
59
59
|
export declare function downloadToTemp(url: string, destDir: string, timeoutMs?: number, signal?: AbortSignal, onTransientRetry?: (error: UrlDownloadError) => void, options?: UrlDownloadOptions): Promise<string>;
|
|
60
60
|
export declare function isHttpUrl(path: string): boolean;
|
|
61
|
-
//# sourceMappingURL=urlDownloader.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.146",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"linkedom": "^0.18.12",
|
|
47
47
|
"puppeteer": "^25.8.0",
|
|
48
48
|
"puppeteer-core": "^25.8.0",
|
|
49
|
-
"@hyperframes/core": "^0.8.
|
|
50
|
-
"@hyperframes/parsers": "^0.8.
|
|
49
|
+
"@hyperframes/core": "^0.8.146",
|
|
50
|
+
"@hyperframes/parsers": "^0.8.146"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/node": "^25.0.10",
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|