From 4e0e1267de8fc4a7c453f1f2bc49317e8ab07bce Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Wed, 13 May 2026 03:11:14 +0700 Subject: [PATCH] fix(export): address native validation review --- electron/ipc/export/native-video.ts | 2 -- .../bin/win32-x64/helpers-manifest.json | 6 ++-- .../recordly-nvidia-cuda-compositor.exe | Bin 516608 -> 515072 bytes .../native/nvidia-cuda-compositor/src/main.cu | 34 +++++++++--------- src/lib/exporter/audioEncoder.test.ts | 1 + 5 files changed, 20 insertions(+), 23 deletions(-) diff --git a/electron/ipc/export/native-video.ts b/electron/ipc/export/native-video.ts index 847b491c..57d1ea93 100644 --- a/electron/ipc/export/native-video.ts +++ b/electron/ipc/export/native-video.ts @@ -3671,7 +3671,6 @@ export async function exportNativeStaticLayoutVideo( "Experimental NVIDIA CUDA compositor produced an empty output file", ); } - videoOutputValidated = true; console.info( "[native-static-layout-export] NVIDIA CUDA compositor completed", { @@ -3767,7 +3766,6 @@ export async function exportNativeStaticLayoutVideo( "Experimental Windows GPU compositor produced an empty output file", ); } - videoOutputValidated = true; const verifiedNvidiaAdapter = isNvidiaVendorId( gpuResult.summary.adapterVendorId, ); diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index ccea1d3a..46148e8c 100644 --- a/electron/native/bin/win32-x64/helpers-manifest.json +++ b/electron/native/bin/win32-x64/helpers-manifest.json @@ -26,10 +26,10 @@ }, "recordly-nvidia-cuda-compositor": { "binaryName": "recordly-nvidia-cuda-compositor.exe", - "binarySha256": "d974a16ddf45891e3aca19fbb79539c547968cc4dab89a2762bdd738a4dcc9f3", + "binarySha256": "3f087c65e054d748bb02d507d4925bbb0b495a9b0e0eae5a8ed118fa4637f34b", "sourceDir": "electron/native/nvidia-cuda-compositor", - "sourceFingerprint": "2782dae39e51f2dec6d64ca8307e0ec628d9b245b77beec31bb44103fa1323f4", - "updatedAt": "2026-05-12T19:26:46.482Z" + "sourceFingerprint": "fc3ae59b700c9c25c5228e074f8976b7aa9ef20bc18af0732eca74e2e34e3f80", + "updatedAt": "2026-05-12T20:05:02.218Z" } } } diff --git a/electron/native/bin/win32-x64/recordly-nvidia-cuda-compositor.exe b/electron/native/bin/win32-x64/recordly-nvidia-cuda-compositor.exe index 652713477ffbccb6cd0881cb8c45c176422510ea..3dca234ea75bfb62cb142d1fda8233657bd4bb6c 100644 GIT binary patch delta 23352 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 delta 26928 zcma*Q37C|{wLX5TzODDKyJzW{p6Tw{duEtndS3>R0g+*uVHp=7Oca*@#tl)_ET$Wm zK#U76*ce}f*OSXTlIA-a_{eX{{4ihuKiTi zsdLVIPPHj+i4>oXY;Iz~VC zf4cr4kFr;i7eG�(>YZe3PNo)-V*<6NF@?F4oNNM} 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, srcHeight, dstHeight); dst[y * dstPitch + x] = samplePlaneCubic(src, srcPitch, srcWidth, srcHeight, sx, sy); - if ((x % 2) == 0 && (y % 2) == 0) { - unsigned char* dstUv = dst + dstChromaOffset + (y / 2) * dstPitch + x; - const float suvX = mapScaledCoordinate(static_cast(x + 1), srcWidth, dstWidth); - const float suvY = mapScaledCoordinate(static_cast(y + 1), srcHeight, dstHeight); - sampleNv12UvBilinear( - src, - srcPitch, + if ((x % 2) == 0 && (y % 2) == 0) { + unsigned char* dstUv = dst + dstChromaOffset + (y / 2) * dstPitch + x; + const float suvX = mapScaledCoordinate(static_cast(x), srcWidth, dstWidth); + const float suvY = mapScaledCoordinate(static_cast(y), srcHeight, dstHeight); + sampleNv12UvBilinear( + src, + srcPitch, srcSurfaceHeight, srcWidth, srcHeight, @@ -1269,17 +1269,15 @@ __global__ void overlayContentRectNv12Kernel( mapScaledCoordinate(static_cast(localY), cropHeight, contentHeight); dst[y * dstPitch + x] = samplePlaneCubic(src, srcPitch, srcWidth, srcHeight, srcX, srcY); - if ((x % 2) == 0 && (y % 2) == 0) { - const int localUvX = max(0, min(contentWidth - 1, localX + 1)); - const int localUvY = max(0, min(contentHeight - 1, localY + 1)); - unsigned char* dstUv = dst + dstChromaOffset + (y / 2) * dstPitch + x; - const float srcUvLumaX = static_cast(cropX) + - mapScaledCoordinate(static_cast(localUvX), cropWidth, contentWidth); - const float srcUvLumaY = static_cast(cropY) + - mapScaledCoordinate(static_cast(localUvY), cropHeight, contentHeight); - sampleNv12UvBilinear( - src, - srcPitch, + if ((x % 2) == 0 && (y % 2) == 0) { + unsigned char* dstUv = dst + dstChromaOffset + (y / 2) * dstPitch + x; + const float srcUvLumaX = static_cast(cropX) + + mapScaledCoordinate(static_cast(localX), cropWidth, contentWidth); + const float srcUvLumaY = static_cast(cropY) + + mapScaledCoordinate(static_cast(localY), cropHeight, contentHeight); + sampleNv12UvBilinear( + src, + srcPitch, srcSurfaceHeight, srcWidth, srcHeight, diff --git a/src/lib/exporter/audioEncoder.test.ts b/src/lib/exporter/audioEncoder.test.ts index e762f63b..309ff8fe 100644 --- a/src/lib/exporter/audioEncoder.test.ts +++ b/src/lib/exporter/audioEncoder.test.ts @@ -59,6 +59,7 @@ describe("AudioProcessor offline render preparation", () => { expect(prepared.mainBufferEntry?.gain).toBe(1); expect(prepared.companionEntries).toHaveLength(1); expect(prepared.companionEntries[0]?.buffer).toBe(micBuffer); + expect(prepared.companionEntries[0]?.gain).toBe(1); expect(decodeAudioFromUrl).toHaveBeenCalledWith("file:///tmp/recording.mp4"); expect(decodeAudioFromUrl).toHaveBeenCalledWith("/tmp/recording.mic.wav"); expect(decodeAudioFromUrl).not.toHaveBeenCalledWith("/tmp/recording.mp4");