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

168 lines
3.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
type NativeStaticLayoutRouteSource,
type NvidiaCudaExportCapabilityProbe,
planNativeStaticLayoutRoutes,
type WindowsD3D11ExportCapabilityProbe,
} from "./nativeStaticLayoutRoutePlan";
const source: NativeStaticLayoutRouteSource = {
inputCodec: "h264",
proxyCodec: "h264",
proxyCreated: false,
};
const cudaProbe: NvidiaCudaExportCapabilityProbe = {
platform: "win32",
appPackaged: true,
explicitEnabled: false,
explicitDisabled: false,
packagedAutoCandidateEnabled: true,
packagedAutoCandidateActive: true,
windowsGpuCompositorEnabled: true,
wrapperPath: "C:\\Recordly\\run-mp4-pipeline.mjs",
hasNvidiaGpu: true,
audioMode: "copy-source",
audioSkipReason: null,
stallTimeoutMs: 120_000,
skipReason: null,
};
const d3d11Probe: WindowsD3D11ExportCapabilityProbe = {
platform: "win32",
windowsGpuCompositorEnabled: true,
helperPath: "C:\\Recordly\\recordly-gpu-export.exe",
adapterIndexOverride: null,
preferHighPerformanceAdapter: true,
nvencSdkRequested: false,
skipReason: null,
};
describe("planNativeStaticLayoutRoutes", () => {
it("selects CUDA first and records D3D11 plus FFmpeg fallbacks", () => {
expect(
planNativeStaticLayoutRoutes({
cuda: cudaProbe,
d3d11: d3d11Probe,
source,
}),
).toEqual({
selectedRoute: "nvidia-cuda-compositor",
decisions: [
{
route: "nvidia-cuda-compositor",
status: "selected",
reasons: ["cuda-wrapper-and-nvidia-gpu-available"],
},
{
route: "windows-d3d11-compositor",
status: "fallback",
reasons: ["documented-fallback-if-cuda-runtime-fails"],
},
{
route: "ffmpeg-static-layout",
status: "fallback",
reasons: ["native-gpu-runtime-fallback"],
},
],
cuda: cudaProbe,
d3d11: d3d11Probe,
source,
});
});
it("selects D3D11 when CUDA is unavailable", () => {
const cuda = {
...cudaProbe,
hasNvidiaGpu: false,
skipReason: "nvidia-gpu-unavailable",
} satisfies NvidiaCudaExportCapabilityProbe;
expect(
planNativeStaticLayoutRoutes({
cuda,
d3d11: d3d11Probe,
source,
}),
).toMatchObject({
selectedRoute: "windows-d3d11-compositor",
decisions: [
{
route: "nvidia-cuda-compositor",
status: "rejected",
reasons: ["nvidia-gpu-unavailable"],
},
{
route: "windows-d3d11-compositor",
status: "selected",
reasons: ["documented-fallback-after-cuda-skip:nvidia-gpu-unavailable"],
},
{
route: "ffmpeg-static-layout",
status: "fallback",
reasons: ["windows-d3d11-runtime-fallback"],
},
],
});
});
it("selects FFmpeg when both native GPU routes are unavailable", () => {
const cuda = {
...cudaProbe,
wrapperPath: null,
skipReason: "cuda-wrapper-unavailable",
} satisfies NvidiaCudaExportCapabilityProbe;
const d3d11 = {
...d3d11Probe,
helperPath: null,
skipReason: "windows-gpu-helper-unavailable",
} satisfies WindowsD3D11ExportCapabilityProbe;
expect(
planNativeStaticLayoutRoutes({
cuda,
d3d11,
source,
}),
).toEqual({
selectedRoute: "ffmpeg-static-layout",
decisions: [
{
route: "nvidia-cuda-compositor",
status: "rejected",
reasons: ["cuda-wrapper-unavailable"],
},
{
route: "windows-d3d11-compositor",
status: "rejected",
reasons: ["windows-gpu-helper-unavailable"],
},
{
route: "ffmpeg-static-layout",
status: "selected",
reasons: ["native-gpu-routes-unavailable"],
},
],
cuda,
d3d11,
source,
});
});
it("preserves proxy source metadata for route diagnostics", () => {
const proxiedSource = {
inputCodec: "vp9",
proxyCodec: "h264",
proxyCreated: true,
};
expect(
planNativeStaticLayoutRoutes({
cuda: cudaProbe,
d3d11: d3d11Probe,
source: proxiedSource,
}).source,
).toEqual(proxiedSource);
});
});