@hyperframes/engine 0.4.6 → 0.4.7

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.
Files changed (74) hide show
  1. package/dist/config.d.ts +6 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +9 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +8 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/services/browserManager.d.ts.map +1 -1
  10. package/dist/services/browserManager.js +6 -3
  11. package/dist/services/browserManager.js.map +1 -1
  12. package/dist/services/chunkEncoder.d.ts +14 -7
  13. package/dist/services/chunkEncoder.d.ts.map +1 -1
  14. package/dist/services/chunkEncoder.js +25 -9
  15. package/dist/services/chunkEncoder.js.map +1 -1
  16. package/dist/services/chunkEncoder.types.d.ts +4 -0
  17. package/dist/services/chunkEncoder.types.d.ts.map +1 -1
  18. package/dist/services/hdrCapture.d.ts +62 -0
  19. package/dist/services/hdrCapture.d.ts.map +1 -0
  20. package/dist/services/hdrCapture.js +259 -0
  21. package/dist/services/hdrCapture.js.map +1 -0
  22. package/dist/services/screenshotService.d.ts +34 -0
  23. package/dist/services/screenshotService.d.ts.map +1 -1
  24. package/dist/services/screenshotService.js +97 -19
  25. package/dist/services/screenshotService.js.map +1 -1
  26. package/dist/services/streamingEncoder.d.ts +18 -3
  27. package/dist/services/streamingEncoder.d.ts.map +1 -1
  28. package/dist/services/streamingEncoder.js +104 -50
  29. package/dist/services/streamingEncoder.js.map +1 -1
  30. package/dist/services/videoFrameExtractor.d.ts.map +1 -1
  31. package/dist/services/videoFrameExtractor.js +109 -18
  32. package/dist/services/videoFrameExtractor.js.map +1 -1
  33. package/dist/services/videoFrameInjector.d.ts +54 -0
  34. package/dist/services/videoFrameInjector.d.ts.map +1 -1
  35. package/dist/services/videoFrameInjector.js +159 -0
  36. package/dist/services/videoFrameInjector.js.map +1 -1
  37. package/dist/utils/alphaBlit.d.ts +105 -0
  38. package/dist/utils/alphaBlit.d.ts.map +1 -0
  39. package/dist/utils/alphaBlit.js +550 -0
  40. package/dist/utils/alphaBlit.js.map +1 -0
  41. package/dist/utils/ffprobe.d.ts +10 -0
  42. package/dist/utils/ffprobe.d.ts.map +1 -1
  43. package/dist/utils/ffprobe.js +7 -0
  44. package/dist/utils/ffprobe.js.map +1 -1
  45. package/dist/utils/hdr.d.ts +82 -0
  46. package/dist/utils/hdr.d.ts.map +1 -0
  47. package/dist/utils/hdr.js +87 -0
  48. package/dist/utils/hdr.js.map +1 -0
  49. package/dist/utils/layerCompositor.d.ts +36 -0
  50. package/dist/utils/layerCompositor.d.ts.map +1 -0
  51. package/dist/utils/layerCompositor.js +49 -0
  52. package/dist/utils/layerCompositor.js.map +1 -0
  53. package/package.json +3 -2
  54. package/src/config.ts +16 -0
  55. package/src/index.ts +42 -0
  56. package/src/services/browserManager.ts +6 -3
  57. package/src/services/chunkEncoder.test.ts +88 -0
  58. package/src/services/chunkEncoder.ts +35 -9
  59. package/src/services/chunkEncoder.types.ts +3 -0
  60. package/src/services/hdrCapture.test.ts +159 -0
  61. package/src/services/hdrCapture.ts +354 -0
  62. package/src/services/screenshotService.ts +102 -17
  63. package/src/services/streamingEncoder.test.ts +228 -0
  64. package/src/services/streamingEncoder.ts +153 -63
  65. package/src/services/videoFrameExtractor.ts +135 -31
  66. package/src/services/videoFrameInjector.ts +200 -0
  67. package/src/utils/alphaBlit.test.ts +993 -0
  68. package/src/utils/alphaBlit.ts +643 -0
  69. package/src/utils/ffprobe.ts +22 -0
  70. package/src/utils/hdr.test.ts +191 -0
  71. package/src/utils/hdr.ts +137 -0
  72. package/src/utils/layerCompositor.test.ts +141 -0
  73. package/src/utils/layerCompositor.ts +58 -0
  74. package/tsconfig.json +2 -1
@@ -0,0 +1,259 @@
1
+ /// <reference types="@webgpu/types" />
2
+ /**
3
+ * HDR Capture Service
4
+ *
5
+ * Captures HDR video frames via WebGPU float16 readback.
6
+ *
7
+ * The pipeline:
8
+ * 1. FFmpeg extracts raw HDR pixels (rgba64le) from video sources
9
+ * 2. Node converts HLG/PQ signal → linear light → float16
10
+ * 3. writeTexture uploads float16 data to WebGPU rgba16float texture
11
+ * 4. (Optional) WebGPU shader applies GSAP CSS transform
12
+ * 5. readback extracts float16 RGBA via base64 transfer
13
+ * 6. Node converts linear float16 → PQ signal → pipe to FFmpeg H.265
14
+ *
15
+ * Requirements:
16
+ * - Headed Chrome (not headless) — WebGPU unavailable in headless mode
17
+ * - GPU access (Metal on macOS, Vulkan+NVIDIA on Linux)
18
+ *
19
+ * Performance: ~6 fps at 1080x1920 via base64 transfer.
20
+ */
21
+ import { existsSync, readdirSync } from "fs";
22
+ import { join } from "path";
23
+ import { homedir } from "os";
24
+ // ── PQ (SMPTE 2084) OETF ─────────────────────────────────────────────────────
25
+ const PQ_M1 = 0.1593017578125;
26
+ const PQ_M2 = 78.84375;
27
+ const PQ_C1 = 0.8359375;
28
+ const PQ_C2 = 18.8515625;
29
+ const PQ_C3 = 18.6875;
30
+ const PQ_MAX_NITS = 10000.0;
31
+ const SDR_NITS = 203.0;
32
+ function linearToPQ(L) {
33
+ const Lp = Math.max(0, (L * SDR_NITS) / PQ_MAX_NITS);
34
+ const Lm1 = Math.pow(Lp, PQ_M1);
35
+ return Math.pow((PQ_C1 + PQ_C2 * Lm1) / (1.0 + PQ_C3 * Lm1), PQ_M2);
36
+ }
37
+ function float16Decode(h) {
38
+ const sign = (h >> 15) & 1;
39
+ const exp = (h >> 10) & 0x1f;
40
+ const frac = h & 0x3ff;
41
+ if (exp === 0)
42
+ return (sign ? -1 : 1) * Math.pow(2, -14) * (frac / 1024);
43
+ if (exp === 31)
44
+ return frac ? NaN : sign ? -Infinity : Infinity;
45
+ return (sign ? -1 : 1) * Math.pow(2, exp - 15) * (1 + frac / 1024);
46
+ }
47
+ // ── Initialization ────────────────────────────────────────────────────────────
48
+ /**
49
+ * Inject the WebGPU HDR readback runtime into the page.
50
+ *
51
+ * Creates an rgba16float render texture that accepts writeTexture uploads
52
+ * and provides readback via base64 transfer.
53
+ */
54
+ export async function initHdrReadback(page, width, height) {
55
+ return page.evaluate(async (w, h) => {
56
+ if (!navigator.gpu)
57
+ return false;
58
+ const adapter = await navigator.gpu.requestAdapter();
59
+ if (!adapter)
60
+ return false;
61
+ const device = await adapter.requestDevice();
62
+ const bytesPerPixel = 8; // rgba16float = 4 channels × 2 bytes
63
+ const bytesPerRow = Math.ceil((w * bytesPerPixel) / 256) * 256;
64
+ // Render texture — includes COPY_DST for writeTexture uploads
65
+ const renderTexture = device.createTexture({
66
+ size: [w, h],
67
+ format: "rgba16float",
68
+ usage: GPUTextureUsage.RENDER_ATTACHMENT |
69
+ GPUTextureUsage.COPY_SRC |
70
+ GPUTextureUsage.COPY_DST |
71
+ GPUTextureUsage.TEXTURE_BINDING,
72
+ });
73
+ const readBuffer = device.createBuffer({
74
+ size: bytesPerRow * h,
75
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
76
+ });
77
+ const captureRuntime = {
78
+ device,
79
+ renderTexture,
80
+ readBuffer,
81
+ bytesPerRow,
82
+ width: w,
83
+ height: h,
84
+ /**
85
+ * Upload pre-converted float16 RGBA data and read it back.
86
+ * The float16 data must be row-aligned to bytesPerRow.
87
+ *
88
+ * Input: base64-encoded Uint16Array (float16 RGBA, row-padded)
89
+ * Output: base64-encoded readback of the same texture
90
+ */
91
+ async uploadAndReadback(float16Base64) {
92
+ // Decode base64 → Uint8Array
93
+ const binary = atob(float16Base64);
94
+ const bytes = new Uint8Array(binary.length);
95
+ for (let i = 0; i < binary.length; i++)
96
+ bytes[i] = binary.charCodeAt(i);
97
+ // Upload to texture
98
+ device.queue.writeTexture({ texture: renderTexture }, bytes.buffer, { bytesPerRow, rowsPerImage: h }, [w, h]);
99
+ // Readback
100
+ const encoder = device.createCommandEncoder();
101
+ encoder.copyTextureToBuffer({ texture: renderTexture }, { buffer: readBuffer, bytesPerRow }, [w, h]);
102
+ device.queue.submit([encoder.finish()]);
103
+ await readBuffer.mapAsync(GPUMapMode.READ);
104
+ const readBytes = new Uint8Array(readBuffer.getMappedRange().slice(0));
105
+ readBuffer.unmap();
106
+ // Base64 encode in chunks
107
+ let b64 = "";
108
+ const chunkSize = 32768;
109
+ for (let i = 0; i < readBytes.length; i += chunkSize) {
110
+ const slice = readBytes.subarray(i, Math.min(i + chunkSize, readBytes.length));
111
+ b64 += String.fromCharCode(...slice);
112
+ }
113
+ return { base64: btoa(b64), bytesPerRow };
114
+ },
115
+ };
116
+ window.__hfHdrCapture = captureRuntime;
117
+ return true;
118
+ }, width, height);
119
+ }
120
+ // ── HDR frame conversion ──────────────────────────────────────────────────────
121
+ /**
122
+ * Convert raw rgba64le pixels (from FFmpeg) to a base64 string for FFmpeg encoding.
123
+ *
124
+ * For HLG sources: the pixel values are already HLG-encoded. We pass them through
125
+ * as-is (normalized to 16-bit) and tag the output as HLG. No OETF conversion needed —
126
+ * the HLG signal values ARE the correct encoding. Converting to linear and back to
127
+ * PQ produces worse results because every viewer's PQ→display tone-mapping differs
128
+ * from its HLG→display tone-mapping.
129
+ *
130
+ * The WebGPU round-trip is skipped for pass-through — the pixels go directly from
131
+ * FFmpeg extraction to FFmpeg encoding. WebGPU is only needed when transforms
132
+ * (scale, rotate, opacity from GSAP) must be applied to the HDR pixels.
133
+ */
134
+ export function convertHdrFrameToRgb48le(rawRgba64le, width, height) {
135
+ const input = new Uint16Array(rawRgba64le.buffer, rawRgba64le.byteOffset, rawRgba64le.byteLength / 2);
136
+ // Convert RGBA → RGB (drop alpha) for rgb48le output
137
+ const output = Buffer.alloc(width * height * 6);
138
+ for (let y = 0; y < height; y++) {
139
+ for (let x = 0; x < width; x++) {
140
+ const srcIdx = (y * width + x) * 4;
141
+ const dstIdx = (y * width + x) * 6;
142
+ output.writeUInt16LE(input[srcIdx] ?? 0, dstIdx);
143
+ output.writeUInt16LE(input[srcIdx + 1] ?? 0, dstIdx + 2);
144
+ output.writeUInt16LE(input[srcIdx + 2] ?? 0, dstIdx + 4);
145
+ }
146
+ }
147
+ return output;
148
+ }
149
+ // ── Frame upload + readback ───────────────────────────────────────────────────
150
+ /**
151
+ * Upload a float16 frame to WebGPU and read it back.
152
+ * Call after converting with convertHdrFrameToFloat16Base64.
153
+ */
154
+ export async function uploadAndReadbackHdrFrame(page, float16Base64) {
155
+ const result = await page.evaluate(async (b64) => {
156
+ const hdr = window.__hfHdrCapture;
157
+ if (!hdr)
158
+ throw new Error("HDR capture not initialized");
159
+ return hdr.uploadAndReadback(b64);
160
+ }, float16Base64);
161
+ return {
162
+ rawBuffer: Buffer.from(result.base64, "base64"),
163
+ bytesPerRow: result.bytesPerRow,
164
+ };
165
+ }
166
+ // ── PQ conversion ─────────────────────────────────────────────────────────────
167
+ /**
168
+ * Convert float16 RGBA readback to PQ-encoded rgb48le for FFmpeg.
169
+ */
170
+ export function float16ToPqRgb(rawBuffer, bytesPerRow, width, height) {
171
+ const data = new Uint16Array(rawBuffer.buffer, rawBuffer.byteOffset, rawBuffer.byteLength / 2);
172
+ const channelsPerRow = bytesPerRow / 2;
173
+ const output = Buffer.alloc(width * height * 6);
174
+ for (let y = 0; y < height; y++) {
175
+ for (let x = 0; x < width; x++) {
176
+ const srcIdx = y * channelsPerRow + x * 4;
177
+ const r = float16Decode(data[srcIdx] ?? 0);
178
+ const g = float16Decode(data[srcIdx + 1] ?? 0);
179
+ const b = float16Decode(data[srcIdx + 2] ?? 0);
180
+ const dstIdx = (y * width + x) * 6;
181
+ output.writeUInt16LE(Math.round(Math.min(1.0, linearToPQ(r)) * 65535), dstIdx);
182
+ output.writeUInt16LE(Math.round(Math.min(1.0, linearToPQ(g)) * 65535), dstIdx + 2);
183
+ output.writeUInt16LE(Math.round(Math.min(1.0, linearToPQ(b)) * 65535), dstIdx + 4);
184
+ }
185
+ }
186
+ return output;
187
+ }
188
+ // ── Chrome launch ─────────────────────────────────────────────────────────────
189
+ function resolveHeadedChromePath() {
190
+ const baseDir = join(homedir(), ".cache", "puppeteer", "chrome");
191
+ if (!existsSync(baseDir))
192
+ return undefined;
193
+ const versions = readdirSync(baseDir).sort().reverse();
194
+ for (const version of versions) {
195
+ const candidates = [
196
+ join(baseDir, version, "chrome-mac-arm64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"),
197
+ join(baseDir, version, "chrome-mac-x64", "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing"),
198
+ join(baseDir, version, "chrome-linux64", "chrome"),
199
+ join(baseDir, version, "chrome-win64", "chrome.exe"),
200
+ ];
201
+ for (const binary of candidates) {
202
+ if (existsSync(binary))
203
+ return binary;
204
+ }
205
+ }
206
+ return undefined;
207
+ }
208
+ /**
209
+ * Launch a headed Chrome browser with WebGPU enabled.
210
+ */
211
+ export async function launchHdrBrowser(width, height) {
212
+ let ppt;
213
+ try {
214
+ const mod = await import("puppeteer");
215
+ ppt = mod.default;
216
+ }
217
+ catch (err) {
218
+ const code = err?.code;
219
+ if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND") {
220
+ throw err;
221
+ }
222
+ const mod = await import("puppeteer-core");
223
+ ppt = mod.default;
224
+ }
225
+ if (!ppt)
226
+ throw new Error("Neither puppeteer nor puppeteer-core found");
227
+ const chromePath = resolveHeadedChromePath();
228
+ if (!chromePath) {
229
+ throw new Error("[HDR] No Chrome binary found. Install: npx @puppeteer/browsers install chrome@stable");
230
+ }
231
+ const browser = await ppt.launch({
232
+ headless: false,
233
+ executablePath: chromePath,
234
+ args: buildHdrChromeArgs(width, height),
235
+ });
236
+ const page = await browser.newPage();
237
+ await page.setViewport({ width, height });
238
+ return { browser, page };
239
+ }
240
+ export function buildHdrChromeArgs(width, height) {
241
+ return [
242
+ "--enable-unsafe-webgpu",
243
+ "--no-sandbox",
244
+ "--disable-setuid-sandbox",
245
+ "--window-position=-10000,-10000",
246
+ `--window-size=${width},${height}`,
247
+ "--disable-background-timer-throttling",
248
+ "--disable-backgrounding-occluded-windows",
249
+ "--disable-renderer-backgrounding",
250
+ "--disable-background-media-suspend",
251
+ "--disable-extensions",
252
+ "--disable-component-update",
253
+ "--disable-default-apps",
254
+ "--disable-sync",
255
+ "--no-zygote",
256
+ "--force-gpu-mem-available-mb=4096",
257
+ ];
258
+ }
259
+ //# sourceMappingURL=hdrCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hdrCapture.js","sourceRoot":"","sources":["../../src/services/hdrCapture.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,40 @@ export declare function beginFrameCapture(page: Page, options: CaptureOptions, f
20
20
  * Fallback for environments where BeginFrame is unavailable (macOS, Windows).
21
21
  */
22
22
  export declare function pageScreenshotCapture(page: Page, options: CaptureOptions): Promise<Buffer>;
23
+ /**
24
+ * Capture a screenshot with transparent background (PNG + alpha channel).
25
+ *
26
+ * Used in the two-pass HDR compositing pipeline — captures DOM content
27
+ * (text, graphics, SDR overlays) with transparency where the background shows,
28
+ * so it can be overlaid on top of native HDR video frames in FFmpeg.
29
+ *
30
+ * Sets and restores the background color override on every call. For sessions
31
+ * that capture many frames, prefer calling initTransparentBackground() once
32
+ * at session init, then captureAlphaPng() per frame to avoid the 2× CDP
33
+ * round-trip overhead.
34
+ */
35
+ export declare function captureScreenshotWithAlpha(page: Page, width: number, height: number): Promise<Buffer>;
36
+ /**
37
+ * Set the page background to transparent once for a dedicated HDR DOM session.
38
+ *
39
+ * Call this once after session initialization. Then use captureAlphaPng() per
40
+ * frame instead of captureScreenshotWithAlpha() to skip the per-frame CDP
41
+ * background override round-trips.
42
+ *
43
+ * Only use on sessions that are exclusively dedicated to transparent capture
44
+ * (e.g., the HDR two-pass DOM layer session) — the background will stay
45
+ * transparent for the lifetime of the session.
46
+ */
47
+ export declare function initTransparentBackground(page: Page): Promise<void>;
48
+ /**
49
+ * Capture a transparent-background PNG screenshot without setting the
50
+ * background color override. Requires initTransparentBackground() to have
51
+ * been called once on this session.
52
+ *
53
+ * Faster than captureScreenshotWithAlpha() for per-frame use in the HDR
54
+ * two-pass compositing loop.
55
+ */
56
+ export declare function captureAlphaPng(page: Page, width: number, height: number): Promise<Buffer>;
23
57
  export declare function injectVideoFramesBatch(page: Page, updates: Array<{
24
58
  videoId: string;
25
59
  dataUri: string;
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotService.d.ts","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,eAAO,MAAM,eAAe,oDAA2D,CAAC;AAExF,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,gBAAgB,EAAE,UAAU,CAAC,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AA6CD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhG;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CAyFf;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"screenshotService.d.ts","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,eAAO,MAAM,eAAe,oDAA2D,CAAC;AAExF,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,gBAAgB,EAAE,UAAU,CAAC,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AA6CD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUhG;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CAoFf;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -104,6 +104,76 @@ export async function pageScreenshotCapture(page, options) {
104
104
  });
105
105
  return Buffer.from(result.data, "base64");
106
106
  }
107
+ /**
108
+ * Capture a screenshot with transparent background (PNG + alpha channel).
109
+ *
110
+ * Used in the two-pass HDR compositing pipeline — captures DOM content
111
+ * (text, graphics, SDR overlays) with transparency where the background shows,
112
+ * so it can be overlaid on top of native HDR video frames in FFmpeg.
113
+ *
114
+ * Sets and restores the background color override on every call. For sessions
115
+ * that capture many frames, prefer calling initTransparentBackground() once
116
+ * at session init, then captureAlphaPng() per frame to avoid the 2× CDP
117
+ * round-trip overhead.
118
+ */
119
+ export async function captureScreenshotWithAlpha(page, width, height) {
120
+ const client = await getCdpSession(page);
121
+ // Force transparent background so the screenshot has a real alpha channel
122
+ await client.send("Emulation.setDefaultBackgroundColorOverride", {
123
+ color: { r: 0, g: 0, b: 0, a: 0 },
124
+ });
125
+ try {
126
+ const result = await client.send("Page.captureScreenshot", {
127
+ format: "png",
128
+ fromSurface: true,
129
+ captureBeyondViewport: false,
130
+ optimizeForSpeed: false, // `true` uses a zero-alpha-aware fast path that crushes real alpha values — observed empirically, CDP docs don't spell it out
131
+ clip: { x: 0, y: 0, width, height, scale: 1 },
132
+ });
133
+ return Buffer.from(result.data, "base64");
134
+ }
135
+ finally {
136
+ // Restore opaque background even if captureScreenshot throws, otherwise
137
+ // subsequent opaque captures keep a transparent background.
138
+ await client.send("Emulation.setDefaultBackgroundColorOverride", {}).catch(() => { });
139
+ }
140
+ }
141
+ /**
142
+ * Set the page background to transparent once for a dedicated HDR DOM session.
143
+ *
144
+ * Call this once after session initialization. Then use captureAlphaPng() per
145
+ * frame instead of captureScreenshotWithAlpha() to skip the per-frame CDP
146
+ * background override round-trips.
147
+ *
148
+ * Only use on sessions that are exclusively dedicated to transparent capture
149
+ * (e.g., the HDR two-pass DOM layer session) — the background will stay
150
+ * transparent for the lifetime of the session.
151
+ */
152
+ export async function initTransparentBackground(page) {
153
+ const client = await getCdpSession(page);
154
+ await client.send("Emulation.setDefaultBackgroundColorOverride", {
155
+ color: { r: 0, g: 0, b: 0, a: 0 },
156
+ });
157
+ }
158
+ /**
159
+ * Capture a transparent-background PNG screenshot without setting the
160
+ * background color override. Requires initTransparentBackground() to have
161
+ * been called once on this session.
162
+ *
163
+ * Faster than captureScreenshotWithAlpha() for per-frame use in the HDR
164
+ * two-pass compositing loop.
165
+ */
166
+ export async function captureAlphaPng(page, width, height) {
167
+ const client = await getCdpSession(page);
168
+ const result = await client.send("Page.captureScreenshot", {
169
+ format: "png",
170
+ fromSurface: true,
171
+ captureBeyondViewport: false,
172
+ optimizeForSpeed: false, // must be false to preserve alpha
173
+ clip: { x: 0, y: 0, width, height, scale: 1 },
174
+ });
175
+ return Buffer.from(result.data, "base64");
176
+ }
107
177
  export async function injectVideoFramesBatch(page, updates) {
108
178
  if (updates.length === 0)
109
179
  return;
@@ -127,17 +197,11 @@ export async function injectVideoFramesBatch(page, updates) {
127
197
  }
128
198
  if (!img)
129
199
  continue;
130
- if (!sourceIsStatic) {
131
- img.style.position = computedStyle.position;
132
- img.style.width = computedStyle.width;
133
- img.style.height = computedStyle.height;
134
- img.style.top = computedStyle.top;
135
- img.style.left = computedStyle.left;
136
- img.style.right = computedStyle.right;
137
- img.style.bottom = computedStyle.bottom;
138
- img.style.inset = computedStyle.inset;
139
- }
140
- else {
200
+ // Always use absolute positioning so the <img> overlays the <video>
201
+ // instead of flowing below it. With position:relative, both elements
202
+ // stack vertically — the <img> lands below the video and gets clipped
203
+ // by any overflow:hidden ancestor (e.g., border-radius wrappers).
204
+ {
141
205
  const videoRect = video.getBoundingClientRect();
142
206
  const offsetLeft = Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0;
143
207
  const offsetTop = Number.isFinite(video.offsetTop) ? video.offsetTop : 0;
@@ -191,15 +255,29 @@ export async function syncVideoFrameVisibility(page, activeVideoIds) {
191
255
  const active = new Set(ids);
192
256
  const videos = Array.from(document.querySelectorAll("video[data-start]"));
193
257
  for (const video of videos) {
194
- if (active.has(video.id))
195
- continue;
196
- video.style.removeProperty("display");
197
- video.style.setProperty("visibility", "hidden", "important");
198
- video.style.setProperty("opacity", "0", "important");
199
- video.style.setProperty("pointer-events", "none", "important");
200
258
  const img = video.nextElementSibling;
201
- if (img && img.classList.contains("__render_frame__")) {
202
- img.style.visibility = "hidden";
259
+ const hasImg = img && img.classList.contains("__render_frame__");
260
+ if (active.has(video.id)) {
261
+ // Active video: show injected <img>, hide native <video>.
262
+ // Do NOT clobber inline opacity here — GSAP-controlled opacity must
263
+ // survive until injectVideoFramesBatch reads it via getComputedStyle.
264
+ // visibility:hidden alone hides the native element without affecting
265
+ // its computed opacity.
266
+ video.style.setProperty("visibility", "hidden", "important");
267
+ video.style.setProperty("pointer-events", "none", "important");
268
+ if (hasImg) {
269
+ img.style.visibility = "visible";
270
+ }
271
+ }
272
+ else {
273
+ // Inactive video: hide both
274
+ video.style.removeProperty("display");
275
+ video.style.setProperty("visibility", "hidden", "important");
276
+ video.style.setProperty("opacity", "0", "important");
277
+ video.style.setProperty("pointer-events", "none", "important");
278
+ if (hasImg) {
279
+ img.style.visibility = "hidden";
280
+ }
203
281
  }
204
282
  }
205
283
  }, activeVideoIds);
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotService.js","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshotService.js","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,EAA6C,CAAC;AAExF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD;;;;;;;;;GASG;AACH,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,6BAA6B;AAC7B,MAAM,cAAc,GAAG,IAAI,OAAO,EAAgB,CAAC;AAEnD,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,KAAK,UAAU,cAAc,CAC3B,MAA2C,EAC3C,MAA4E;IAE5E,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YAC3D,IAAI,SAAS,IAAI,OAAO,GAAG,qBAAqB,EAAE,CAAC;gBACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;gBAC3D,SAAS;YACX,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,0CAA0C,qBAAqB,iDAAiD;oBAC9G,0DAA0D,CAC7D,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,OAAuB,EACvB,cAAsB,EACtB,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;IACvC,MAAM,UAAU,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QAC9B,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACpD,gBAAgB,EAAE,IAAI;KACd,CAAC;IAEX,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtF,IAAI,MAAc,CAAC;IACnB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtD,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,+DAA+D;YAC/D,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE;gBAC5C,cAAc,EAAE,cAAc,GAAG,KAAK;gBACtC,QAAQ;gBACR,UAAU;aACX,CAAC,CAAC;YACH,MAAM,GAAG,QAAQ,CAAC,cAAc;gBAC9B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;gBAChD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAU,EAAE,OAAuB;IAC7E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;QACzD,MAAM;QACN,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAChE,WAAW,EAAE,IAAI;QACjB,qBAAqB,EAAE,KAAK;QAC5B,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAU,EACV,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,0EAA0E;IAC1E,MAAM,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE;QAC/D,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;KAClC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACzD,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI;YACjB,qBAAqB,EAAE,KAAK;YAC5B,gBAAgB,EAAE,KAAK,EAAE,8HAA8H;YACvJ,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9C,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,wEAAwE;QACxE,4DAA4D;QAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAU;IACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE;QAC/D,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,KAAa,EAAE,MAAc;IAC7E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;QACzD,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,IAAI;QACjB,qBAAqB,EAAE,KAAK;QAC5B,gBAAgB,EAAE,KAAK,EAAE,kCAAkC;QAC3D,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,OAAoD;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,IAAI,CAAC,QAAQ,CACjB,KAAK,EAAE,KAAkD,EAAE,gBAA0B,EAAE,EAAE;QACvF,MAAM,cAAc,GAAyB,EAAE,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAA4B,CAAC;YAC/E,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,IAAI,GAAG,GAAG,KAAK,CAAC,kBAA6C,CAAC;YAC9D,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,CAAC,aAAa,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAEtF,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACpC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBACtC,GAAG,CAAC,EAAE,GAAG,kBAAkB,IAAI,CAAC,OAAO,IAAI,CAAC;gBAC5C,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;gBACjC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,GAAG;gBAAE,SAAS;YAEnB,oEAAoE;YACpE,qEAAqE;YACrE,sEAAsE;YACtE,kEAAkE;YAClE,CAAC;gBACC,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;gBAChD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzE,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;gBAChF,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACpF,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBACzB,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC;gBACnC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,IAAI,CAAC;gBACjC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBACzB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC1B,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,WAAW,IAAI,CAAC;gBACrC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,YAAY,IAAI,CAAC;YACzC,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC;YACxD,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YAExC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;gBACxC,IACE,cAAc;oBACd,CAAC,QAAQ,KAAK,KAAK;wBACjB,QAAQ,KAAK,MAAM;wBACnB,QAAQ,KAAK,OAAO;wBACpB,QAAQ,KAAK,QAAQ;wBACrB,QAAQ,KAAK,OAAO,CAAC,EACvB,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC;YACtB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,cAAc,CAAC,IAAI,CACjB,GAAG;iBACA,MAAM,EAAE;iBACR,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;iBACtB,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CACzB,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;YAC5C,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;YACjC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC7D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACrD,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EACD,OAAO,EACP,CAAC,GAAG,6BAA6B,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAU,EACV,cAAwB;IAExB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAa,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAuB,CAAC;QAChG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,kBAAwC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,0DAA0D;gBAC1D,oEAAoE;gBACpE,sEAAsE;gBACtE,qEAAqE;gBACrE,wBAAwB;gBACxB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAC7D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC/D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACtC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAC7D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;gBACrD,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC/D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,EAAE,cAAc,CAAC,CAAC;AACrB,CAAC"}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Streaming Encoder Service
3
3
  *
4
- * Pipes frame screenshot buffers directly to FFmpeg's stdin instead of writing
5
- * them to disk and reading them back in a separate encode stage. Follows the
6
- * Remotion pattern of image2pipe FFmpeg.
4
+ * Pipes frame screenshot buffers directly to FFmpeg's stdin via `-f image2pipe`
5
+ * instead of writing them to disk and reading them back in a separate encode
6
+ * stage. Inspired by Remotion's approach to browser-based video rendering.
7
7
  *
8
8
  * Two building blocks:
9
9
  * 1. Frame reorder buffer – ensures out-of-order parallel workers feed
@@ -11,6 +11,7 @@
11
11
  * 2. Streaming FFmpeg encoder – spawns FFmpeg with `-f image2pipe` and
12
12
  * exposes a `writeFrame(buffer)` + `close()` API.
13
13
  */
14
+ import { type GpuEncoder } from "../utils/gpuEncoder.js";
14
15
  import { type EngineConfig } from "../config.js";
15
16
  export type { EncoderOptions } from "./chunkEncoder.types.js";
16
17
  export interface FrameReorderBuffer {
@@ -30,6 +31,11 @@ export interface StreamingEncoderOptions {
30
31
  pixelFormat?: string;
31
32
  useGpu?: boolean;
32
33
  imageFormat?: "jpeg" | "png";
34
+ hdr?: {
35
+ transfer: import("../utils/hdr.js").HdrTransfer;
36
+ };
37
+ /** When set, use rawvideo input instead of image2pipe. For HDR PQ-encoded frames. */
38
+ rawInputFormat?: "rgb48le";
33
39
  }
34
40
  export interface StreamingEncoderResult {
35
41
  success: boolean;
@@ -42,6 +48,15 @@ export interface StreamingEncoder {
42
48
  close: () => Promise<StreamingEncoderResult>;
43
49
  getExitStatus: () => "running" | "success" | "error";
44
50
  }
51
+ /**
52
+ * Build FFmpeg args for streaming (image2pipe) input.
53
+ * Reuses the same codec/quality/GPU logic as chunkEncoder's buildEncoderArgs
54
+ * but with `-f image2pipe` instead of `-i <pattern>`.
55
+ *
56
+ * Exported so unit tests can assert on the constructed CLI without spawning
57
+ * FFmpeg — see streamingEncoder.test.ts.
58
+ */
59
+ export declare function buildStreamingArgs(options: StreamingEncoderOptions, outputPath: string, gpuEncoder?: GpuEncoder): string[];
45
60
  /**
46
61
  * Spawn a streaming FFmpeg encoder that accepts frame buffers on stdin.
47
62
  */
@@ -1 +1 @@
1
- {"version":3,"file":"streamingEncoder.d.ts","sourceRoot":"","sources":["../../src/services/streamingEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM9D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA6BjG;AAMD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,KAAK,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACtD;AA0ID;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,uBAAuB,EAChC,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,GAC7D,OAAO,CAAC,gBAAgB,CAAC,CAgH3B"}
1
+ {"version":3,"file":"streamingEncoder.d.ts","sourceRoot":"","sources":["../../src/services/streamingEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAAE,KAAK,UAAU,EAA0C,MAAM,wBAAwB,CAAC;AAGjG,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAc9D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA4CjG;AAMD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,iBAAiB,EAAE,WAAW,CAAA;KAAE,CAAC;IAC1D,qFAAqF;IACrF,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,KAAK,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACtD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAAiB,GAC5B,MAAM,EAAE,CAgLV;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,uBAAuB,EAChC,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,GAC7D,OAAO,CAAC,gBAAgB,CAAC,CAyH3B"}