refactor(editor): extract mp4 export routing

This commit is contained in:
wiiiii123
2026-05-22 21:40:01 +07:00
parent b7449d544e
commit 87cd2510c4
3 changed files with 175 additions and 19 deletions
+19 -19
View File
@@ -88,6 +88,7 @@ import {
} from "@/utils/aspectRatioUtils";
import { ExtensionIcon } from "./ExtensionIcon";
import { calculateMp4ExportDimensions, calculateMp4SourceDimensions } from "./exportDimensions";
import { resolveMp4ExportRouting } from "./mp4ExportRouting";
import { useNvidiaCudaExportOptIn } from "./useNvidiaCudaExportOptIn";
const PhCursorFill = (props: { className?: string; weight?: "fill" | "regular" }) => (
@@ -4135,25 +4136,24 @@ export default function VideoEditor() {
const selectedMp4FrameRate = smokeExportConfig.enabled
? (smokeExportConfig.fps ?? settings.mp4FrameRate ?? mp4FrameRate)
: (settings.mp4FrameRate ?? mp4FrameRate);
const pipelineModel = smokeExportConfig.enabled
? (smokeExportConfig.pipelineModel ?? "modern")
: (settings.pipelineModel ?? exportPipelineModel);
const useExperimentalNativeExport =
pipelineModel === "modern" &&
(smokeExportConfig.enabled ? smokeExportConfig.useNativeExport : true);
const useExperimentalNvidiaCudaExport =
useExperimentalNativeExport &&
experimentalNvidiaCudaExport &&
nvidiaCudaExportAvailable;
const backendPreference =
pipelineModel === "legacy"
? "webcodecs"
: smokeExportConfig.enabled
? (smokeExportConfig.backendPreference ??
(smokeExportConfig.useNativeExport ? "breeze" : "webcodecs"))
: useExperimentalNativeExport
? "auto"
: (settings.backendPreference ?? exportBackendPreference);
const {
pipelineModel,
useExperimentalNativeExport,
useExperimentalNvidiaCudaExport,
backendPreference,
} = resolveMp4ExportRouting({
smokeExportConfig: {
enabled: smokeExportConfig.enabled,
pipelineModel: smokeExportConfig.pipelineModel,
useNativeExport: smokeExportConfig.useNativeExport,
backendPreference: smokeExportConfig.backendPreference,
},
settings,
exportPipelineModel,
exportBackendPreference,
experimentalNvidiaCudaExport,
nvidiaCudaExportAvailable,
});
const supportedSourceDimensions =
await ensureSupportedMp4SourceDimensions(selectedMp4FrameRate);
const { width: exportWidth, height: exportHeight } =
@@ -0,0 +1,99 @@
import { describe, expect, it } from "vitest";
import { resolveMp4ExportRouting } from "./mp4ExportRouting";
const baseOptions = {
smokeExportConfig: {
enabled: false,
useNativeExport: false,
},
settings: {},
exportPipelineModel: "modern" as const,
exportBackendPreference: "breeze" as const,
experimentalNvidiaCudaExport: false,
nvidiaCudaExportAvailable: false,
};
describe("resolveMp4ExportRouting", () => {
it("uses the modern native auto route for normal MP4 exports by default", () => {
expect(resolveMp4ExportRouting(baseOptions)).toEqual({
pipelineModel: "modern",
useExperimentalNativeExport: true,
useExperimentalNvidiaCudaExport: false,
backendPreference: "auto",
});
});
it("forces WebCodecs and disables native export for the legacy pipeline", () => {
expect(
resolveMp4ExportRouting({
...baseOptions,
settings: { pipelineModel: "legacy", backendPreference: "breeze" },
}),
).toEqual({
pipelineModel: "legacy",
useExperimentalNativeExport: false,
useExperimentalNvidiaCudaExport: false,
backendPreference: "webcodecs",
});
});
it("keeps smoke exports on WebCodecs unless smoke native export is requested", () => {
expect(
resolveMp4ExportRouting({
...baseOptions,
smokeExportConfig: {
enabled: true,
useNativeExport: false,
},
}),
).toEqual({
pipelineModel: "modern",
useExperimentalNativeExport: false,
useExperimentalNvidiaCudaExport: false,
backendPreference: "webcodecs",
});
expect(
resolveMp4ExportRouting({
...baseOptions,
smokeExportConfig: {
enabled: true,
useNativeExport: true,
},
}),
).toEqual({
pipelineModel: "modern",
useExperimentalNativeExport: true,
useExperimentalNvidiaCudaExport: false,
backendPreference: "breeze",
});
});
it("only enables NVIDIA CUDA when native export is active and the device is available", () => {
expect(
resolveMp4ExportRouting({
...baseOptions,
experimentalNvidiaCudaExport: true,
nvidiaCudaExportAvailable: true,
}).useExperimentalNvidiaCudaExport,
).toBe(true);
expect(
resolveMp4ExportRouting({
...baseOptions,
settings: { pipelineModel: "legacy" },
experimentalNvidiaCudaExport: true,
nvidiaCudaExportAvailable: true,
}).useExperimentalNvidiaCudaExport,
).toBe(false);
expect(
resolveMp4ExportRouting({
...baseOptions,
experimentalNvidiaCudaExport: true,
nvidiaCudaExportAvailable: false,
}).useExperimentalNvidiaCudaExport,
).toBe(false);
});
});
@@ -0,0 +1,57 @@
import type {
ExportBackendPreference,
ExportPipelineModel,
ExportSettings,
} from "@/lib/exporter";
import type { SmokeExportConfig } from "./smokeExportConfig";
export type Mp4ExportRouting = {
pipelineModel: ExportPipelineModel;
useExperimentalNativeExport: boolean;
useExperimentalNvidiaCudaExport: boolean;
backendPreference: ExportBackendPreference;
};
export function resolveMp4ExportRouting({
smokeExportConfig,
settings,
exportPipelineModel,
exportBackendPreference,
experimentalNvidiaCudaExport,
nvidiaCudaExportAvailable,
}: {
smokeExportConfig: Pick<
SmokeExportConfig,
"enabled" | "pipelineModel" | "useNativeExport" | "backendPreference"
>;
settings: Pick<ExportSettings, "pipelineModel" | "backendPreference">;
exportPipelineModel: ExportPipelineModel;
exportBackendPreference: ExportBackendPreference;
experimentalNvidiaCudaExport: boolean;
nvidiaCudaExportAvailable: boolean;
}): Mp4ExportRouting {
const pipelineModel = smokeExportConfig.enabled
? (smokeExportConfig.pipelineModel ?? "modern")
: (settings.pipelineModel ?? exportPipelineModel);
const useExperimentalNativeExport =
pipelineModel === "modern" &&
(smokeExportConfig.enabled ? smokeExportConfig.useNativeExport : true);
const useExperimentalNvidiaCudaExport =
useExperimentalNativeExport && experimentalNvidiaCudaExport && nvidiaCudaExportAvailable;
const backendPreference =
pipelineModel === "legacy"
? "webcodecs"
: smokeExportConfig.enabled
? (smokeExportConfig.backendPreference ??
(smokeExportConfig.useNativeExport ? "breeze" : "webcodecs"))
: useExperimentalNativeExport
? "auto"
: (settings.backendPreference ?? exportBackendPreference);
return {
pipelineModel,
useExperimentalNativeExport,
useExperimentalNvidiaCudaExport,
backendPreference,
};
}