Skip to content

Commit 9c81006

Browse files
committed
Add native GPU static layout export path
1 parent 816116d commit 9c81006

62 files changed

Lines changed: 9901 additions & 410 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ vite.config.js
3434
vite.config.d.ts
3535

3636
# Native capture build artifacts
37-
electron/native/wgc-capture/build/
38-
electron/native/cursor-monitor/build/
39-
40-
# Local debug helpers
41-
tmp-*.ps1
42-
.tmp-*.ps1
37+
electron/native/wgc-capture/build/
38+
electron/native/cursor-monitor/build/
39+
electron/native/gpu-export-probe/build/
40+
electron/native/bin/*/whisper-*
41+
electron/native/bin/*/whisper-runtime.json
42+
43+
# Local debug helpers
44+
tmp-*.ps1
45+
.tmp-*.ps1
46+
gpu-export-probe.mp4

‎electron-builder.json5‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
"output": "release"
1818
},
1919
"files": [
20-
"dist",
21-
"dist-electron",
22-
"electron/native",
23-
"!*.png",
20+
"dist",
21+
"dist-electron",
22+
"electron/native",
23+
"!electron/native/**/build/**",
24+
"!*.png",
2425
"!preview*.png",
2526
"!*.md",
2627
"!README.md",

‎electron/electron-env.d.ts‎

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,110 @@ interface RendererFfmpegAudioMuxMetrics {
8282
muxedVideoBytes?: number;
8383
}
8484

85+
interface RendererWindowsGpuExportSummary {
86+
success?: boolean;
87+
width?: number;
88+
height?: number;
89+
fps?: number;
90+
seconds?: number;
91+
mediaMs?: number;
92+
frames?: number;
93+
gpuDecodeSurface?: boolean;
94+
webcamOverlay?: boolean;
95+
cursorOverlay?: boolean;
96+
zoomOverlay?: boolean;
97+
surfacePoolSize?: number;
98+
adapterIndex?: number;
99+
adapterVendorId?: number;
100+
adapterDeviceId?: number;
101+
adapterDedicatedVideoMemoryMB?: number;
102+
encoderBackend?: string;
103+
encoderTuningApplied?: boolean;
104+
nvencOutputBytes?: number;
105+
initializeMs?: number;
106+
initCoInitializeMs?: number;
107+
initMfStartupMs?: number;
108+
initD3DDeviceMs?: number;
109+
initSourceReaderMs?: number;
110+
initWebcamReaderMs?: number;
111+
initVideoProcessorMs?: number;
112+
initTexturesMs?: number;
113+
initShaderPipelineMs?: number;
114+
initSinkWriterMs?: number;
115+
totalMs?: number;
116+
readMs?: number;
117+
clearMs?: number;
118+
videoProcessMs?: number;
119+
writeSampleMs?: number;
120+
finalizeMs?: number;
121+
realtimeMultiplier?: number;
122+
}
123+
124+
interface RendererNativeStaticLayoutChunkMetric {
125+
index: number;
126+
startSec: number;
127+
durationSec: number;
128+
backend:
129+
| "cuda-overlay"
130+
| "cuda-scale-cpu-pad"
131+
| "cuda-static-composite"
132+
| "nvidia-cuda-compositor"
133+
| "windows-d3d11-compositor";
134+
elapsedMs: number;
135+
outputBytes: number;
136+
fallbackReason?: string;
137+
windowsGpuSummary?: RendererWindowsGpuExportSummary;
138+
}
139+
140+
interface RendererNativeStaticLayoutMetrics extends RendererFfmpegAudioMuxMetrics {
141+
chunkCount: number;
142+
chunkDurationSec: number;
143+
chunkExecMs: number;
144+
concatExecMs?: number;
145+
staticAssetExecMs?: number;
146+
fallbackChunkCount: number;
147+
videoOnlyBytes?: number;
148+
chunks: RendererNativeStaticLayoutChunkMetric[];
149+
}
150+
151+
interface RendererNativeStaticLayoutProgress {
152+
sessionId?: string;
153+
backend?: RendererNativeStaticLayoutChunkMetric["backend"];
154+
elapsedMs?: number;
155+
averageFps?: number;
156+
instantFps?: number;
157+
intervalMs?: number;
158+
intervalFrames?: number;
159+
intervalDecodeWallMs?: number;
160+
intervalEncodeMs?: number;
161+
intervalPipelineWaitMs?: number;
162+
intervalCompositeMs?: number;
163+
intervalNvencMs?: number;
164+
intervalPacketWriteMs?: number;
165+
intervalWebcamDecodeMs?: number;
166+
intervalWebcamCopyMs?: number;
167+
intervalRoiCompositeFrames?: number;
168+
intervalMonolithicCompositeFrames?: number;
169+
intervalCopyCompositeFrames?: number;
170+
currentFrame: number;
171+
totalFrames: number;
172+
percentage: number;
173+
}
174+
175+
interface RendererNativeVideoMetadataProbe {
176+
width: number;
177+
height: number;
178+
duration: number;
179+
mediaStartTime?: number;
180+
streamStartTime?: number;
181+
streamDuration?: number;
182+
frameRate: number;
183+
codec: string;
184+
hasAudio: boolean;
185+
audioCodec?: string;
186+
audioSampleRate?: number;
187+
}
188+
85189
interface Window {
86190
electronAPI: {
87191
hudOverlaySetIgnoreMouse: (ignore: boolean) => void;
@@ -193,6 +297,82 @@ interface Window {
193297
generateWallpaperThumbnail: (
194298
filePath: string,
195299
) => Promise<{ success: boolean; data?: Uint8Array; error?: string }>;
300+
probeNativeVideoMetadata: (filePath: string) => Promise<{
301+
success: boolean;
302+
metadata?: RendererNativeVideoMetadataProbe;
303+
error?: string;
304+
}>;
305+
nativeStaticLayoutExport: (options: {
306+
sessionId?: string;
307+
inputPath: string;
308+
width: number;
309+
height: number;
310+
frameRate: number;
311+
bitrate: number;
312+
encodingMode: "fast" | "balanced" | "quality";
313+
durationSec: number;
314+
contentWidth: number;
315+
contentHeight: number;
316+
offsetX: number;
317+
offsetY: number;
318+
backgroundColor: string;
319+
backgroundImagePath?: string | null;
320+
borderRadius?: number;
321+
shadowIntensity?: number;
322+
webcamInputPath?: string | null;
323+
webcamLeft?: number;
324+
webcamTop?: number;
325+
webcamSize?: number;
326+
webcamRadius?: number;
327+
webcamShadowIntensity?: number;
328+
webcamMirror?: boolean;
329+
webcamTimeOffsetMs?: number;
330+
cursorTelemetry?: Array<{
331+
timeMs: number;
332+
cx: number;
333+
cy: number;
334+
cursorTypeIndex?: number;
335+
bounceScale?: number;
336+
}>;
337+
cursorSize?: number;
338+
cursorAtlasPngDataUrl?: string | null;
339+
cursorAtlasEntries?: Array<{
340+
index: number;
341+
x: number;
342+
y: number;
343+
width: number;
344+
height: number;
345+
anchorX: number;
346+
anchorY: number;
347+
aspectRatio: number;
348+
}>;
349+
zoomTelemetry?: Array<{ timeMs: number; scale: number; x: number; y: number }>;
350+
chunkDurationSec?: number;
351+
experimentalWindowsGpuCompositor?: boolean;
352+
audioOptions?: {
353+
audioMode?: "none" | "copy-source" | "trim-source" | "edited-track";
354+
audioSourcePath?: string | null;
355+
audioSourceSampleRate?: number;
356+
outputDurationSec?: number;
357+
trimSegments?: Array<{ startMs: number; endMs: number }>;
358+
editedTrackStrategy?: "filtergraph-fast-path" | "offline-render-fallback";
359+
editedTrackSegments?: Array<{ startMs: number; endMs: number; speed: number }>;
360+
editedAudioData?: ArrayBuffer;
361+
editedAudioMimeType?: string | null;
362+
};
363+
}) => Promise<{
364+
success: boolean;
365+
tempPath?: string;
366+
encoderName?: string;
367+
error?: string;
368+
metrics?: RendererNativeStaticLayoutMetrics;
369+
}>;
370+
nativeStaticLayoutExportCancel: (sessionId: string) => Promise<{
371+
success: boolean;
372+
}>;
373+
onNativeStaticLayoutExportProgress: (
374+
callback: (progress: RendererNativeStaticLayoutProgress) => void,
375+
) => () => void;
196376
nativeVideoExportStart: (options: {
197377
width: number;
198378
height: number;
@@ -216,6 +396,7 @@ interface Window {
216396
audioMode?: "none" | "copy-source" | "trim-source" | "edited-track";
217397
audioSourcePath?: string | null;
218398
audioSourceSampleRate?: number;
399+
outputDurationSec?: number;
219400
trimSegments?: Array<{ startMs: number; endMs: number }>;
220401
editedTrackStrategy?: "filtergraph-fast-path" | "offline-render-fallback";
221402
editedTrackSegments?: Array<{ startMs: number; endMs: number; speed: number }>;

0 commit comments

Comments
 (0)