@hyperframes/engine 0.8.110 → 0.8.112
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/services/browserManager.d.ts.map +1 -1
- package/dist/services/browserManager.js +2 -0
- package/dist/services/browserManager.js.map +1 -1
- package/dist/services/frameCapture.js +1 -1
- package/dist/services/frameCapture.js.map +1 -1
- package/dist/services/screenshotService.d.ts +3 -1
- package/dist/services/screenshotService.d.ts.map +1 -1
- package/dist/services/screenshotService.js +14 -31
- package/dist/services/screenshotService.js.map +1 -1
- package/dist/services/videoFrameExtractor.d.ts.map +1 -1
- package/dist/services/videoFrameExtractor.js +19 -0
- package/dist/services/videoFrameExtractor.js.map +1 -1
- package/dist/utils/alphaPlaneProbe.d.ts +9 -0
- package/dist/utils/alphaPlaneProbe.d.ts.map +1 -0
- package/dist/utils/alphaPlaneProbe.js +65 -0
- package/dist/utils/alphaPlaneProbe.js.map +1 -0
- package/dist/utils/psnr.js +1 -1
- package/dist/utils/psnr.js.map +1 -1
- package/dist/utils/psnrFilterAvailability.js +1 -0
- package/dist/utils/psnrFilterAvailability.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { runFfmpeg } from "./runFfmpeg.js";
|
|
5
|
+
// Up to 3 frames at 8x8 rgba; a 1- or 2-frame clip is still a whole sample.
|
|
6
|
+
const BYTES_PER_SAMPLE_FRAME = 8 * 8 * 4;
|
|
7
|
+
const MAX_SAMPLE_BYTES = BYTES_PER_SAMPLE_FRAME * 3;
|
|
8
|
+
/** true: every sampled alpha byte is 255; false: some transparency; undefined: malformed sample. */
|
|
9
|
+
export function sampledRgbaAlphaIsFullyOpaque(buf) {
|
|
10
|
+
if (buf.length === 0 ||
|
|
11
|
+
buf.length > MAX_SAMPLE_BYTES ||
|
|
12
|
+
buf.length % BYTES_PER_SAMPLE_FRAME !== 0) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
for (let i = 3; i < buf.length; i += 4) {
|
|
16
|
+
if (buf[i] !== 255)
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether a video input that declares alpha decodes fully opaque (a remux can keep `alpha_mode=1`
|
|
23
|
+
* while dropping the alpha sidecar). `decoder` must keep alpha. Any failure returns undefined.
|
|
24
|
+
*/
|
|
25
|
+
export async function probeInputAlphaPlane(videoPath, decoder, signal) {
|
|
26
|
+
let probeDir;
|
|
27
|
+
try {
|
|
28
|
+
probeDir = mkdtempSync(join(tmpdir(), "hf-alpha-probe-"));
|
|
29
|
+
const samplePath = join(probeDir, "alpha.raw");
|
|
30
|
+
const result = await runFfmpeg([
|
|
31
|
+
"-v",
|
|
32
|
+
"error",
|
|
33
|
+
"-c:v",
|
|
34
|
+
decoder,
|
|
35
|
+
"-i",
|
|
36
|
+
videoPath,
|
|
37
|
+
"-frames:v",
|
|
38
|
+
"3",
|
|
39
|
+
"-vf",
|
|
40
|
+
"scale=8:8",
|
|
41
|
+
"-pix_fmt",
|
|
42
|
+
"rgba",
|
|
43
|
+
"-f",
|
|
44
|
+
"rawvideo",
|
|
45
|
+
samplePath,
|
|
46
|
+
], { timeout: 30_000, signal });
|
|
47
|
+
if (!result.success)
|
|
48
|
+
return undefined;
|
|
49
|
+
return sampledRgbaAlphaIsFullyOpaque(readFileSync(samplePath));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (probeDir)
|
|
56
|
+
rmSync(probeDir, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function inputAlphaOpaqueWarning(src) {
|
|
60
|
+
return (`[hyperframes:render] WARNING: video src="${src}" declares an alpha channel ` +
|
|
61
|
+
"but its first frames decode fully opaque. If it should be transparent, re-export " +
|
|
62
|
+
"it with an alpha pixel format and avoid remuxing afterward, which can drop the " +
|
|
63
|
+
"alpha while keeping the tag.\n");
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=alphaPlaneProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alphaPlaneProbe.js","sourceRoot":"","sources":["../../src/utils/alphaPlaneProbe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,sBAAsB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzC,MAAM,gBAAgB,GAAG,sBAAsB,GAAG,CAAC,CAAC;AAEpD,oGAAoG;AACpG,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACvD,IACE,GAAG,CAAC,MAAM,KAAK,CAAC;QAChB,GAAG,CAAC,MAAM,GAAG,gBAAgB;QAC7B,GAAG,CAAC,MAAM,GAAG,sBAAsB,KAAK,CAAC,EACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,OAAe,EACf,MAAoB;IAEpB,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B;YACE,IAAI;YACJ,OAAO;YACP,MAAM;YACN,OAAO;YACP,IAAI;YACJ,SAAS;YACT,WAAW;YACX,GAAG;YACH,KAAK;YACL,WAAW;YACX,UAAU;YACV,MAAM;YACN,IAAI;YACJ,UAAU;YACV,UAAU;SACX,EACD,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAC5B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACtC,OAAO,6BAA6B,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,OAAO,CACL,4CAA4C,GAAG,8BAA8B;QAC7E,mFAAmF;QACnF,iFAAiF;QACjF,gCAAgC,CACjC,CAAC;AACJ,CAAC"}
|
package/dist/utils/psnr.js
CHANGED
|
@@ -20,7 +20,7 @@ export async function psnrDb(a, b) {
|
|
|
20
20
|
const pa = join(dir, "a.jpg");
|
|
21
21
|
const pb = join(dir, "b.jpg");
|
|
22
22
|
await Promise.all([writeFile(pa, a), writeFile(pb, b)]);
|
|
23
|
-
const { stderr } = await execFileP(getFfmpegBinary(), ["-hide_banner", "-i", pa, "-i", pb, "-lavfi", "psnr", "-f", "null", "-"], { maxBuffer: 4 * 1024 * 1024 });
|
|
23
|
+
const { stderr } = await execFileP(getFfmpegBinary(), ["-hide_banner", "-i", pa, "-i", pb, "-lavfi", "psnr", "-f", "null", "-"], { maxBuffer: 4 * 1024 * 1024, windowsHide: true });
|
|
24
24
|
const m = /average:(inf|[\d.]+)/.exec(stderr);
|
|
25
25
|
if (!m)
|
|
26
26
|
throw new Error(`psnr parse failed: ${stderr.slice(-300)}`);
|
package/dist/utils/psnr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psnr.js","sourceRoot":"","sources":["../../src/utils/psnr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,CAAS,EAAE,CAAS;IAC/C,wEAAwE;IACxE,4EAA4E;IAC5E,sEAAsE;IACtE,wEAAwE;IACxE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,eAAe,EAAE,EACjB,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EACzE,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"psnr.js","sourceRoot":"","sources":["../../src/utils/psnr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,CAAS,EAAE,CAAS;IAC/C,wEAAwE;IACxE,4EAA4E;IAC5E,sEAAsE;IACtE,wEAAwE;IACxE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,eAAe,EAAE,EACjB,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EACzE,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAClD,CAAC;QACF,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psnrFilterAvailability.js","sourceRoot":"","sources":["../../src/utils/psnrFilterAvailability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,IAAI,gBAAgB,GAAkC,IAAI,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,IAAI,gBAAgB,KAAK,IAAI;QAAE,gBAAgB,GAAG,WAAW,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;IACtC,gFAAgF;IAChF,6CAA6C;IAC7C,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,UAAU,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gCAAgC;IAC9C,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,2EAA2E;IAC3E,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE;YAClF,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;YAC1B,OAAO,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"psnrFilterAvailability.js","sourceRoot":"","sources":["../../src/utils/psnrFilterAvailability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,IAAI,gBAAgB,GAAkC,IAAI,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,IAAI,gBAAgB,KAAK,IAAI;QAAE,gBAAgB,GAAG,WAAW,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;IACtC,gFAAgF;IAChF,6CAA6C;IAC7C,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,UAAU,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gCAAgC;IAC9C,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,2EAA2E;IAC3E,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE;YAClF,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;YAC1B,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.112",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"linkedom": "^0.18.12",
|
|
43
43
|
"puppeteer": "^25.8.0",
|
|
44
44
|
"puppeteer-core": "^25.8.0",
|
|
45
|
-
"@hyperframes/core": "^0.8.
|
|
46
|
-
"@hyperframes/parsers": "^0.8.
|
|
45
|
+
"@hyperframes/core": "^0.8.112",
|
|
46
|
+
"@hyperframes/parsers": "^0.8.112"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/node": "^25.0.10",
|