Files
Recordly/electron/ipc/export/nativeStaticLayoutRoutePlan.ts

133 lines
3.2 KiB
TypeScript

import type { NativeVideoExportAudioMode } from "../nativeVideoExport";
export type NativeStaticLayoutRoute =
| "nvidia-cuda-compositor"
| "windows-d3d11-compositor"
| "ffmpeg-static-layout";
export interface NativeStaticLayoutRouteDecision {
route: NativeStaticLayoutRoute;
status: "selected" | "fallback" | "rejected";
reasons: string[];
}
export interface NvidiaCudaExportCapabilityProbe {
platform: NodeJS.Platform;
appPackaged: boolean;
explicitEnabled: boolean;
explicitDisabled: boolean;
packagedAutoCandidateEnabled: boolean;
packagedAutoCandidateActive: boolean;
windowsGpuCompositorEnabled: boolean;
wrapperPath: string | null;
hasNvidiaGpu: boolean | null;
audioMode: NativeVideoExportAudioMode;
audioSkipReason: string | null;
stallTimeoutMs: number | null;
skipReason: string | null;
}
export interface WindowsD3D11ExportCapabilityProbe {
platform: NodeJS.Platform;
windowsGpuCompositorEnabled: boolean;
helperPath: string | null;
adapterIndexOverride: number | null;
preferHighPerformanceAdapter: boolean;
nvencSdkRequested: boolean;
skipReason: string | null;
}
export interface NativeStaticLayoutRouteSource {
inputCodec: string;
proxyCodec?: string;
proxyCreated: boolean;
}
export interface NativeStaticLayoutRoutePlan {
selectedRoute: NativeStaticLayoutRoute;
decisions: NativeStaticLayoutRouteDecision[];
cuda: NvidiaCudaExportCapabilityProbe;
d3d11: WindowsD3D11ExportCapabilityProbe;
source: NativeStaticLayoutRouteSource;
}
export function planNativeStaticLayoutRoutes(options: {
cuda: NvidiaCudaExportCapabilityProbe;
d3d11: WindowsD3D11ExportCapabilityProbe;
source: NativeStaticLayoutRouteSource;
}): NativeStaticLayoutRoutePlan {
const { cuda, d3d11, source } = options;
const decisions: NativeStaticLayoutRouteDecision[] = [];
if (!cuda.skipReason) {
decisions.push({
route: "nvidia-cuda-compositor",
status: "selected",
reasons: ["cuda-wrapper-and-nvidia-gpu-available"],
});
decisions.push({
route: "windows-d3d11-compositor",
status: d3d11.skipReason ? "rejected" : "fallback",
reasons: d3d11.skipReason
? [d3d11.skipReason]
: ["documented-fallback-if-cuda-runtime-fails"],
});
decisions.push({
route: "ffmpeg-static-layout",
status: "fallback",
reasons: ["native-gpu-runtime-fallback"],
});
return {
selectedRoute: "nvidia-cuda-compositor",
decisions,
cuda,
d3d11,
source,
};
}
decisions.push({
route: "nvidia-cuda-compositor",
status: "rejected",
reasons: [cuda.skipReason],
});
if (!d3d11.skipReason) {
decisions.push({
route: "windows-d3d11-compositor",
status: "selected",
reasons: [`documented-fallback-after-cuda-skip:${cuda.skipReason}`],
});
decisions.push({
route: "ffmpeg-static-layout",
status: "fallback",
reasons: ["windows-d3d11-runtime-fallback"],
});
return {
selectedRoute: "windows-d3d11-compositor",
decisions,
cuda,
d3d11,
source,
};
}
decisions.push({
route: "windows-d3d11-compositor",
status: "rejected",
reasons: [d3d11.skipReason],
});
decisions.push({
route: "ffmpeg-static-layout",
status: "selected",
reasons: ["native-gpu-routes-unavailable"],
});
return {
selectedRoute: "ffmpeg-static-layout",
decisions,
cuda,
d3d11,
source,
};
}