From ef90dc6a5cfbf36c9cc9dca495d397d4cc56d99e Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Thu, 14 May 2026 19:04:42 +0700 Subject: [PATCH] fix(export): require cuda inline audio output --- electron/ipc/export/native-video.test.ts | 41 ++++++++++++++++++++++++ electron/ipc/export/native-video.ts | 10 ++++++ 2 files changed, 51 insertions(+) diff --git a/electron/ipc/export/native-video.test.ts b/electron/ipc/export/native-video.test.ts index e8a6b24d..908f72f5 100644 --- a/electron/ipc/export/native-video.test.ts +++ b/electron/ipc/export/native-video.test.ts @@ -1174,6 +1174,47 @@ describe("validateNvidiaCudaExportSummary", () => { expect(issues).toEqual([]); }); + it("rejects inline-audio CUDA output when the helper does not produce audio", () => { + const issues = validateNvidiaCudaExportSummary( + { + success: true, + targetFrames: 300, + durationSec: 10, + nativeSummary: { + success: true, + frames: 300, + sourceTimestampMode: "pts", + selectionStage: "timestamp-mapped-callback", + }, + outputVideo: { duration: "9.999900", nb_frames: "300" }, + }, + { durationSec: 10, targetFrames: 300, requiresTimelineSync: true }, + ); + + expect(issues).toEqual(["missing output audio stream"]); + }); + + it("rejects inline-audio CUDA output when the probed audio stream is empty", () => { + const issues = validateNvidiaCudaExportSummary( + { + success: true, + targetFrames: 300, + durationSec: 10, + nativeSummary: { + success: true, + frames: 300, + sourceTimestampMode: "pts", + selectionStage: "timestamp-mapped-callback", + }, + outputVideo: { duration: "9.999900", nb_frames: "300" }, + outputAudio: { duration: "0.000000" }, + }, + { durationSec: 10, targetFrames: 300, requiresTimelineSync: true }, + ); + + expect(issues).toEqual(["output audio duration is not positive"]); + }); + it("accepts audio CUDA output when the helper reports PTS-aligned selection", () => { const issues = validateNvidiaCudaExportSummary( { diff --git a/electron/ipc/export/native-video.ts b/electron/ipc/export/native-video.ts index 25a0eca9..5a970a64 100644 --- a/electron/ipc/export/native-video.ts +++ b/electron/ipc/export/native-video.ts @@ -491,6 +491,15 @@ export function validateNvidiaCudaExportSummary( if (!summary.outputVideo) { issues.push("missing output video probe"); } + if (expected.requiresTimelineSync) { + if (!summary.outputAudio) { + issues.push("missing output audio stream"); + } else if (outputAudioDurationSec === null) { + issues.push("missing output audio duration"); + } else if (outputAudioDurationSec <= 0) { + issues.push("output audio duration is not positive"); + } + } if (expected.requiresTimelineSync && !isNvidiaCudaTimestampAlignedSummary(summary)) { issues.push("CUDA timeline mode is not timestamp-aligned for audio export"); } @@ -516,6 +525,7 @@ export function validateNvidiaCudaExportSummary( } if ( outputAudioDurationSec !== null && + outputAudioDurationSec > 0 && Math.abs(outputAudioDurationSec - expectedDurationSec) > durationToleranceSec ) { issues.push(