Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions src/components/video-editor/VideoEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ import {
import { ExtensionIcon } from "./ExtensionIcon";
import { calculateMp4ExportDimensions, calculateMp4SourceDimensions } from "./exportDimensions";
import { resolveMp4ExportRouting } from "./mp4ExportRouting";
import { resolveMp4ExportSettings } from "./mp4ExportSettings";
import { useNvidiaCudaExportOptIn } from "./useNvidiaCudaExportOptIn";

const PhCursorFill = (props: { className?: string; weight?: "fill" | "regular" }) => (
Expand Down Expand Up @@ -4125,17 +4126,19 @@ export default function VideoEditor() {
}
} else {
// MP4 Export
const quality = smokeExportConfig.enabled
? (smokeExportConfig.quality ?? settings.quality ?? exportQuality)
: (settings.quality ?? exportQuality);
const encodingMode = smokeExportConfig.enabled
? (smokeExportConfig.encodingMode ??
settings.encodingMode ??
exportEncodingMode)
: (settings.encodingMode ?? exportEncodingMode);
const selectedMp4FrameRate = smokeExportConfig.enabled
? (smokeExportConfig.fps ?? settings.mp4FrameRate ?? mp4FrameRate)
: (settings.mp4FrameRate ?? mp4FrameRate);
const { quality, encodingMode, selectedMp4FrameRate } =
resolveMp4ExportSettings({
smokeExportConfig: {
enabled: smokeExportConfig.enabled,
quality: smokeExportConfig.quality,
encodingMode: smokeExportConfig.encodingMode,
fps: smokeExportConfig.fps,
},
settings,
exportQuality,
exportEncodingMode,
mp4FrameRate,
});
const {
pipelineModel,
useExperimentalNativeExport,
Expand Down
82 changes: 82 additions & 0 deletions src/components/video-editor/mp4ExportSettings.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { describe, expect, it } from "vitest";

import { resolveMp4ExportSettings } from "./mp4ExportSettings";

const baseOptions = {
smokeExportConfig: {
enabled: false,
},
settings: {},
exportQuality: "high" as const,
exportEncodingMode: "balanced" as const,
mp4FrameRate: 30 as const,
};

describe("resolveMp4ExportSettings", () => {
it("uses editor defaults when neither menu settings nor smoke settings override them", () => {
expect(resolveMp4ExportSettings(baseOptions)).toEqual({
quality: "high",
encodingMode: "balanced",
selectedMp4FrameRate: 30,
});
});

it("prefers explicit menu settings over editor defaults for normal exports", () => {
expect(
resolveMp4ExportSettings({
...baseOptions,
settings: {
quality: "source",
encodingMode: "quality",
mp4FrameRate: 60,
},
}),
).toEqual({
quality: "source",
encodingMode: "quality",
selectedMp4FrameRate: 60,
});
});

it("prefers smoke URL settings over menu settings when smoke export is enabled", () => {
expect(
resolveMp4ExportSettings({
...baseOptions,
smokeExportConfig: {
enabled: true,
quality: "medium",
encodingMode: "fast",
fps: 24,
},
settings: {
quality: "source",
encodingMode: "quality",
mp4FrameRate: 60,
},
}),
).toEqual({
quality: "medium",
encodingMode: "fast",
selectedMp4FrameRate: 24,
});
});

it("falls back from incomplete smoke settings to menu settings and editor defaults", () => {
expect(
resolveMp4ExportSettings({
...baseOptions,
smokeExportConfig: {
enabled: true,
quality: "good",
},
settings: {
encodingMode: "quality",
},
}),
).toEqual({
quality: "good",
encodingMode: "quality",
selectedMp4FrameRate: 30,
});
});
});
42 changes: 42 additions & 0 deletions src/components/video-editor/mp4ExportSettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import type {
ExportEncodingMode,
ExportMp4FrameRate,
ExportQuality,
ExportSettings,
} from "@/lib/exporter";
import type { SmokeExportConfig } from "./smokeExportConfig";

export type ResolvedMp4ExportSettings = {
quality: ExportQuality;
encodingMode: ExportEncodingMode;
selectedMp4FrameRate: ExportMp4FrameRate;
};

export function resolveMp4ExportSettings({
smokeExportConfig,
settings,
exportQuality,
exportEncodingMode,
mp4FrameRate,
}: {
smokeExportConfig: Pick<
SmokeExportConfig,
"enabled" | "quality" | "encodingMode" | "fps"
>;
settings: Pick<ExportSettings, "quality" | "encodingMode" | "mp4FrameRate">;
exportQuality: ExportQuality;
exportEncodingMode: ExportEncodingMode;
mp4FrameRate: ExportMp4FrameRate;
}): ResolvedMp4ExportSettings {
return {
quality: smokeExportConfig.enabled
? (smokeExportConfig.quality ?? settings.quality ?? exportQuality)
: (settings.quality ?? exportQuality),
encodingMode: smokeExportConfig.enabled
? (smokeExportConfig.encodingMode ?? settings.encodingMode ?? exportEncodingMode)
: (settings.encodingMode ?? exportEncodingMode),
selectedMp4FrameRate: smokeExportConfig.enabled
? (smokeExportConfig.fps ?? settings.mp4FrameRate ?? mp4FrameRate)
: (settings.mp4FrameRate ?? mp4FrameRate),
};
}