mirror of
https://github.com/webadderallorg/Recordly.git
synced 2026-09-24 14:55:37 +00:00
refactor(editor): extract mp4 export routing
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user